通过Provider对com.android.camera2进行memory监控仅仅相当于对某一进程的memory info信息监控,当真正发生内存泄漏的情况下,单独check camera.android.camera2单独的包肯定是不能完全的check问题点的,可以通过sysinfo所对应的/proc/meminfo信息里面的MemAvailable 显示的大小进行宏观的使用情况查看,进而对怀疑的进程通过dumpsys meminfo的方式去check具体的怀疑进程,现在以Camera模块为例进行问题说明。

一、sysinfo信息确定问题时间节点

        每2min打印系统meminfo 的sysinfo log,在相关问题发生的时间节点前后可以通过sysinfo的大致时间点初步确定一下meminfo的状态是否有问题。

具体追踪log如下: 

        先看是否有crash等造成camera崩溃的log产生

android 拍照预览删除 android 相机预览内存观测_android

        分析sysinfo相关的memAvailable,每2min之内有200M左右的memory信息波动,在一个2min的波段之内发生了800M的内存波动,这边的异常发生会导致camera crash等相关信息进而释放掉占用的内存导致大的内存变化波动。

android 拍照预览删除 android 相机预览内存观测_android_02

        22:52:25-22:54:26之间分析其他的main log对应的节点发现 com.android.camera OOM异常(类似报错:lowmemory)的报错信息。

android 拍照预览删除 android 相机预览内存观测_压测_03

二、通过dumpsys meminfo 压测定位相关进程的内存占用

        对camera相关的各个进程的memory使用情况进行监控以及处理。                  1.

        1.通过命令dump camera应用层相关的memory

        adb shell "dumpsys meminfo com.android.camera2 | awk '/Graphics|Java Heap:|Native Heap:|TOTAL PSS/' " >>meminfo.txt

android 拍照预览删除 android 相机预览内存观测_压测_04

        2.通过命令dump camera HAL/FrameWork层相关的memory信息

        adb shell ps -A | grep camera

android 拍照预览删除 android 相机预览内存观测_ide_05

        查看camera HAL相关的内存信息

        adb shell "dumpsys meminfo 504" >> meminfo_cameraprovider.txt 

android 拍照预览删除 android 相机预览内存观测_android 拍照预览删除_06

 

android 拍照预览删除 android 相机预览内存观测_压测_07

 

        查看camera FrameWork层相关的内存信息
        adb shell "dumpsys meminfo 726" >> meminfo_cameraserver.txt

android 拍照预览删除 android 相机预览内存观测_ide_08

 

android 拍照预览删除 android 相机预览内存观测_android 拍照预览删除_09

 

        最后对每次测试所拿到的memory Total Pss信息进行统计,绘制成相关进程连连续拍照占用memory相关的图表即可直观的观察到相关的内存消耗情况,视图如下:

        

android 拍照预览删除 android 相机预览内存观测_android 拍照预览删除_10

      

android 拍照预览删除 android 相机预览内存观测_android_11

 

展讯平台 Camera相关进程

android 拍照预览删除 android 相机预览内存观测_android 拍照预览删除_12

MTK平台 Camera相关进程

android 拍照预览删除 android 相机预览内存观测_压测_13

总结 

        内存相关的异常处理起来肯定不像其他问题一样简单,需要反复的压测,确定具体的异常点,甚至需要借用addr2line -e -f 解析动态链接库,定位异常发生时的堆栈地址对应的函数接口;objdump -S -D反汇编相关的lib,确定具体的问题点; 最后如果能定位到具体的某一个内存申请的点,解决起来就会好很多。