修过的一个android framework原生系统代码bug
“坑”描述:
在对我们自己研发的一款android终端进行camera拍照压力测试时,发现当拍照张数达到几万张时,查看内存占用情况,发现内存泄露。
填“坑”:
frameworks/base/core/jni/android/graphics/YuvToJpegEncoder.cpp
bool YuvToJpegEncoder::encode(SkWStream* stream, void* inYuv, int width,int height, int* offsets, int jpegQuality) {jpeg_compress_struct cinfo;skjpeg_error_mgr sk_err;skjpeg_destination_mgr sk_wstream(stream);cinfo.err = jpeg_std_error(&sk_err);sk_err.error_exit = skjpeg_error_exit;if (setjmp(sk_err.fJmpBuf)) {return false;}jpeg_create_compress(&cinfo);cinfo.dest = &sk_wstream;setJpegCompressStruct(&cinfo, width, height, jpegQuality);jpeg_start_compress(&cinfo, TRUE);compress(&cinfo, (uint8_t*) inYuv, offsets);jpeg_finish_compress(&cinfo);return true;
}
坑就在上面这个接口函数中:
熟悉libjpeg的同学会注意到,上面的接口在调用完jpeg_finish_compress()后,没有调用jpeg_destroy_compress(),这个接口是释放压缩工作过程中所申请的资源,主要就是jpeg压缩对象。
由于android原生接口中,没有调用jpeg_destroy_compress()导致每次泄露几十个字节,当拍照数量达到万级时,才会有所察觉。
怎么找到这个坑的:
这个过程后面有时间会详细写下,目前心得就是模块的架构十分重要,对这种数据流的控制,pipeline方式是比较好的方案,因为可以明确输入输出,然后通过伪造输入输出对各个模块进行单独的压力测试。最难控制的就是“洋葱”式的包裹调用,要像“剥洋葱”一样一层层的剥离十分麻烦。
你的android机上有这个问题吗:
9成的概率下你的手机应该不会有这个问题,因为上面我讲到是在我们做的一款终端上发现的问题,我们的终端芯片方案比较挫,没有硬编码模块,导致使用了android的软编码方案,也就用到libjpeg这个模块,也就触发了上面问题函数接口的调用。
牢骚:
做底层系统开发就是这样,一个bug耗费了很久的时间去测试,查找,验证。一层层剥离模块,逐步定位问题的大概位置,到最后精确定位问题,并解决,bug的解决可能就是一行代码的事(上面就加上destroy接口即可),但着实耗费了不少时间,如果按照代码行数计算kpi,这个performance应该是差的可以了。
修过的一个android framework原生系统代码bug相关推荐
- 诺基亚6 android one,诺基亚安卓手机采用的是Android One原生系统:更纯净,更新快...
1月28日消息 在为安卓手机提供系统更新这一点上,诺基亚的动作是比较快的.如今诺基亚安卓手机已有多款升级到了最新的安卓9 Pie系统,对此HMD CPO Juho Sarvikas在接受Android ...
- Android Google原生系统刷机
备份工具 钛备份 下载ROM的网站: 魔趣 androidfilehost lineage Google原生系统 androidsage 第三方 REC orangefox TWRP 原生跳过谷歌向导 ...
- 华为v8原生态android,安卓原生系统的手机有哪些_2019安卓原生系统手机推荐_飞翔教程...
安卓原生系统的手机有哪些?现时代智能机已经代替了以前的功能机了,伴随着各种智能机系统的崛起,比如华为的EMUI,小米手机的MIUI系统等等,接下来52z飞翔小编给大家带来2019安卓原生系统手机推荐, ...
- Android 生成原生系统签名jks 与 keystore
在漫长的Android开发生涯中难免需要实现某个系统应用的系统功能,比如,appstore的静默安装,静默卸载 这两个功能对app的权限是有要求的,app必须是系统级别的应用才行,每个厂商的定制不同, ...
- 开发一个Android志愿填报系统(后台管理+前台app)毕业设计
[下载源码] 开发工具: AndroidStudio Idea Mysql 技术栈: Web端 后台前端:Layui.js.jQuery.css.html 后台框架:Java.Spring boo ...
- android开机默认动画,求一个 android 开机动画的代码
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 @_噢噢 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedIn ...
- 推荐一个快速定位深度学习代码bug的炼丹神器!
文 | McGL 源 | 知乎 写深度学习网络代码,最大的挑战之一,尤其对新手来说,就是把所有的张量维度正确对齐.如果以前就有TensorSensor这个工具,相信我的头发一定比现在更浓密茂盛! Te ...
- 如何调试Android Framework?
Linus有一句名言广为人知:Read the fucking source code. 但其实,要深入理解某个软件.框架或者系统的工作原理,仅仅「看」代码是远远不够的.就拿Android Frame ...
- 历时四年,给Google提交的Android Framework Bug终于被Fixed了
历时四年,Google终于修复了一个我发现的Android Framework Bug 2014年在做一个Android终端设备开发过程中,发现了一个Android Framework层的Bug,给G ...
最新文章
- linux中sed深入,Linux中的sed
- ActFramework 小贴士 - 获得应用版本
- 致新手——OpenStack云倒底是什么?
- C语言将向量中的所有0移至末尾(附完整源码)
- Docker最全教程——从理论到实战(七)
- c语言fun函数yx,C语言解24点游戏程序
- java zip 压缩文件夹_java zip 实现压缩文件和文件夹类Compressor.java
- 谷歌浏览器json工具安装
- 12v电量显示制作方法_12V电池电量指示电路
- 编码:decode()/encode()、quote()/unquote()
- VUE-waterfall瀑布流组件使用
- 图片怎么做雕刻路径_精雕图怎么做路径
- GFocalV2解读
- 25-30K ☀️|网络工程师职业技巧与经典面试题✨
- 12C OEM 升级13C
- 一台计算机只能注册一台sql,局域网中的一台电脑为啥连接不到另一台电脑中的SQL远程数据库...
- 是川银藏--------令巴菲特推崇的人物
- CC00015.kylin——|HadoopOLAP_Kylin.V15|——|Kylin.v15|Cube优化|Cuboid剪枝优化|
- Source Insight 4.0使用介绍
- 中学学校计算机已装备清单,中学教育技术装备自查报告