“坑”描述:

在对我们自己研发的一款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相关推荐

  1. 诺基亚6 android one,诺基亚安卓手机采用的是Android One原生系统:更纯净,更新快...

    1月28日消息 在为安卓手机提供系统更新这一点上,诺基亚的动作是比较快的.如今诺基亚安卓手机已有多款升级到了最新的安卓9 Pie系统,对此HMD CPO Juho Sarvikas在接受Android ...

  2. Android Google原生系统刷机

    备份工具 钛备份 下载ROM的网站: 魔趣 androidfilehost lineage Google原生系统 androidsage 第三方 REC orangefox TWRP 原生跳过谷歌向导 ...

  3. 华为v8原生态android,安卓原生系统的手机有哪些_2019安卓原生系统手机推荐_飞翔教程...

    安卓原生系统的手机有哪些?现时代智能机已经代替了以前的功能机了,伴随着各种智能机系统的崛起,比如华为的EMUI,小米手机的MIUI系统等等,接下来52z飞翔小编给大家带来2019安卓原生系统手机推荐, ...

  4. Android 生成原生系统签名jks 与 keystore

    在漫长的Android开发生涯中难免需要实现某个系统应用的系统功能,比如,appstore的静默安装,静默卸载 这两个功能对app的权限是有要求的,app必须是系统级别的应用才行,每个厂商的定制不同, ...

  5. 开发一个Android志愿填报系统(后台管理+前台app)毕业设计

    [下载源码] 开发工具: AndroidStudio  Idea  Mysql 技术栈: Web端 后台前端:Layui.js.jQuery.css.html 后台框架:Java.Spring boo ...

  6. android开机默认动画,求一个 android 开机动画的代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 @_噢噢 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedIn ...

  7. 推荐一个快速定位深度学习代码bug的炼丹神器!

    文 | McGL 源 | 知乎 写深度学习网络代码,最大的挑战之一,尤其对新手来说,就是把所有的张量维度正确对齐.如果以前就有TensorSensor这个工具,相信我的头发一定比现在更浓密茂盛! Te ...

  8. 如何调试Android Framework?

    Linus有一句名言广为人知:Read the fucking source code. 但其实,要深入理解某个软件.框架或者系统的工作原理,仅仅「看」代码是远远不够的.就拿Android Frame ...

  9. 历时四年,给Google提交的Android Framework Bug终于被Fixed了

    历时四年,Google终于修复了一个我发现的Android Framework Bug 2014年在做一个Android终端设备开发过程中,发现了一个Android Framework层的Bug,给G ...

最新文章

  1. linux中sed深入,Linux中的sed
  2. ActFramework 小贴士 - 获得应用版本
  3. 致新手——OpenStack云倒底是什么?
  4. C语言将向量中的所有0移至末尾(附完整源码)
  5. Docker最全教程——从理论到实战(七)
  6. c语言fun函数yx,C语言解24点游戏程序
  7. java zip 压缩文件夹_java zip 实现压缩文件和文件夹类Compressor.java
  8. 谷歌浏览器json工具安装
  9. 12v电量显示制作方法_12V电池电量指示电路
  10. 编码:decode()/encode()、quote()/unquote()
  11. VUE-waterfall瀑布流组件使用
  12. 图片怎么做雕刻路径_精雕图怎么做路径
  13. GFocalV2解读
  14. 25-30K ☀️|网络工程师职业技巧与经典面试题✨
  15. 12C OEM 升级13C
  16. 一台计算机只能注册一台sql,局域网中的一台电脑为啥连接不到另一台电脑中的SQL远程数据库...
  17. 是川银藏--------令巴菲特推崇的人物
  18. CC00015.kylin——|HadoopOLAP_Kylin.V15|——|Kylin.v15|Cube优化|Cuboid剪枝优化|
  19. Source Insight 4.0使用介绍
  20. 中学学校计算机已装备清单,中学教育技术装备自查报告

热门文章

  1. STL源码剖析 queue队列概述
  2. linux查看内核版本信息
  3. 广州交警发布路考秘籍 科目三扣分点近80项
  4. 面试风云录(01) - 怎样回答这两个问题?
  5. 详细说明 SourceTree 免登录,跳过初始设置的方法(Windows 版 )
  6. idea 快捷键 小结
  7. FreeSql (三)实体特性
  8. ADOQuery 查询 删除 修改 插入
  9. day8-异常处理与网络编程
  10. 详解HashMap数据结构实现