android 的ddms 下有一个隐藏的功能 “native heap” ,可以用来帮助你发现android 程序 的native code所产生的memory leaks. google Android的工程师建议,寻找memory leak的方式是重复执行app的某一些步骤,观察内存的使用量,只能使用量异常或者显著地增长的时候,利用分析工具分析所产生的 memory allocation information,寻找可能产生 memory leaks的地方. memory allocation information 会记录 此app 所有的call stack所产生的相关的内存信息,比如大小,被条用次数等.因为这个功能需要libc_malloc_debug_leak 模块的支持,一般的rom是不带这个so 。
二.环境搭建
有两种方法:
1.通过编译 自己的rom 来生产 所需要的.so文件
模拟器中的/system/lib/libc_debug.so做个拷贝,重命名为libc.so,覆盖原来的libc.so,
先替换out目录下的libc.so,再重新生成system.img,
通过搜索发现,libc.so和libc_debug.so在out/目录下有多个版本,obj/目录下的肯定不会用来打包,就看是用../symbols/system/lib下的还是../system/lib下的了,
通过和之前从模拟器上pull下来的libc.so,libc_debug.so的size作比较,可以确定用的是../system/lib下的
把libc.so删了(我们已经从模拟器pull了一个libc.so备份,所以不用再备份了),拷贝一个libc_debug.so,重命名为libc.so
重新打包
system.img, $~/mydroid/out/host/linux-x86/bin/mkyaffs2image -f ~/mydroid/out/target/product/generic/system ~/mydroid/out/target/product/generic/system.img
为了在ddms中显示File和Line信息,还要设置两个环境变量
把/home/peipei/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin加到PATH,让ddms找到arm-eabi-addr2line,
设置export ANDROID_PRODUCT_OUT=~/mydroid/out/target/product/generic,让ddms找到调试信息
2. root 后直接挂载 已有的 debug so文件
可以根据不同的android版本去网上找 相应的源码,
这个是xoom的so文件, http://code.google.com/p/honeycomb-sdk-united-base/source/browse/trunk/system/lib/?r=8、
找到libc_malloc_debug_leak.so
如果你装的是小米的rom,可以省略这一步,因为我发现小米的/system/lib 里已经有可用的libc_malloc_debug_leak.so文件,估计是他们在定制 rom的时候已经编译好的。这个现成的so文件经验证可以在其他手机里用.
现在需要做的就是把这个so文件挂载上去.没有越狱的手机没有权限,所以这步过不了.
adb remount
adb push libc_malloc_debug_leak.so /system/lib/libc_malloc_debug_leak.so
第二种方法投机取巧,但是最省力。
三.查看内存
adb shell setprop libc.debug.malloc 1
adb shell stop
adb shell start
手机会注销当前的session ,执行完之后就好了。 为了把DDMS这个隐藏的功能显示出来,你还需要改一个配置. 找到~/.android/ddms.cfg 一般windows用户这个目录 在C:\Documents and Settings\user 下. 在ddms.cfg 结尾新增一行 "native=true" 保存后重启 ddms就可以看到新加的一个'native heap'的tab了 建议把sdk took 升级到 16 ,platform-tool升级 到 10 ,native heap的功能有更新 native heap 的功能就像它的名字一样间的,snpshot Current Native Heap Usage 就是给当前的app生成一个 native heap的快照,你可以通过Display 对比多个 不同时间段的 native heap,分析程序的内存变化。
下图是主客户端 图片资源的使用统计排行(skia 是google 05 年收购的一家图像处理引擎公司 http://blog.linux.org.tw/~jserv/archives/002095.html) 可以观察到分配的对象的次数,占用的内存量。还是很实用的
二.环境搭建
有两种方法:
1.通过编译 自己的rom 来生产 所需要的.so文件
模拟器中的/system/lib/libc_debug.so做个拷贝,重命名为libc.so,覆盖原来的libc.so,
先替换out目录下的libc.so,再重新生成system.img,
通过搜索发现,libc.so和libc_debug.so在out/目录下有多个版本,obj/目录下的肯定不会用来打包,就看是用../symbols/system/lib下的还是../system/lib下的了,
通过和之前从模拟器上pull下来的libc.so,libc_debug.so的size作比较,可以确定用的是../system/lib下的
把libc.so删了(我们已经从模拟器pull了一个libc.so备份,所以不用再备份了),拷贝一个libc_debug.so,重命名为libc.so
重新打包
system.img, $~/mydroid/out/host/linux-x86/bin/mkyaffs2image -f ~/mydroid/out/target/product/generic/system ~/mydroid/out/target/product/generic/system.img
为了在ddms中显示File和Line信息,还要设置两个环境变量
把/home/peipei/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin加到PATH,让ddms找到arm-eabi-addr2line,
设置export ANDROID_PRODUCT_OUT=~/mydroid/out/target/product/generic,让ddms找到调试信息
2. root 后直接挂载 已有的 debug so文件
可以根据不同的android版本去网上找 相应的源码,
这个是xoom的so文件, http://code.google.com/p/honeycomb-sdk-united-base/source/browse/trunk/system/lib/?r=8、
找到libc_malloc_debug_leak.so
如果你装的是小米的rom,可以省略这一步,因为我发现小米的/system/lib 里已经有可用的libc_malloc_debug_leak.so文件,估计是他们在定制 rom的时候已经编译好的。这个现成的so文件经验证可以在其他手机里用.
现在需要做的就是把这个so文件挂载上去.没有越狱的手机没有权限,所以这步过不了.
adb remount
adb push libc_malloc_debug_leak.so /system/lib/libc_malloc_debug_leak.so
第二种方法投机取巧,但是最省力。
三.查看内存
adb shell setprop libc.debug.malloc 1
adb shell stop
adb shell start
手机会注销当前的session ,执行完之后就好了。 为了把DDMS这个隐藏的功能显示出来,你还需要改一个配置. 找到~/.android/ddms.cfg 一般windows用户这个目录 在C:\Documents and Settings\user 下. 在ddms.cfg 结尾新增一行 "native=true" 保存后重启 ddms就可以看到新加的一个'native heap'的tab了 建议把sdk took 升级到 16 ,platform-tool升级 到 10 ,native heap的功能有更新 native heap 的功能就像它的名字一样间的,snpshot Current Native Heap Usage 就是给当前的app生成一个 native heap的快照,你可以通过Display 对比多个 不同时间段的 native heap,分析程序的内存变化。
下图是主客户端 图片资源的使用统计排行(skia 是google 05 年收购的一家图像处理引擎公司 http://blog.linux.org.tw/~jserv/archives/002095.html) 可以观察到分配的对象的次数,占用的内存量。还是很实用的
![]() |