Android Native代码(C/C++)内存泄露分析
- Hook内存申请本地函数,在替换函数中获取堆栈,在内存中记录申请的内存大小以及堆栈信息
- 提供API导出动态库泄露(申请了但是未释放)的内存大小
- 提供API导出动态库泄露堆栈到文件
- 提供python脚本解析导出的泄露堆栈信息,并生成火焰图,python脚本
implementation 'com.liang.qiu:nativeleakprof:1.0.1'
在Application的attachBaseContext方法里调用
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
NativeLeakProf.init(this);
}
NativeLeakProf.dumpLeakInfo();
通过dumpLeakInfo
方法,可以导出如下的字符串信息
libGLESv2_adreno.so leak: 2.258709MB
libhwui.so leak: 439.270508KB
libc.so leak: 26.500000KB
total leak: 2.713563MB
调用dumpLeakStack
方法导出堆栈,位置在/data/data/xxx.xxx.xxx/files/NativeLeakProf_Stack_xxxxx.txt
NativeLeakProf.dumpLeakStack();
调用nl_stack_parser.py
这个python脚本来解析堆栈数据
(自行通过adb pull导出到电脑),举个栗子
/usr/bin/python ~/Documents/AndroidProject/NativeLeakProf/nlp_stack_parser.py ~/android/android-sdk-macosx/ndk-bundle/ ~/Documents/AndroidProject/NativeLeakProf/sample/NativeLeakProf_Stack_c39243bb-4132-4da2-88d9-1e0cfec38627.txt arm64-v8a ~/Documents/AndroidProject/NativeLeakProf/app/build/intermediates/cmake/debug/obj/arm64-v8a/
参数如下
/usr/bin/python ~/Documents/AndroidProject/NativeLeakProf/nlp_stack_parser.py "android ndk路径" "stack文件路径" "arm架构(armeabi/armeabi-v7a/arm64-v8a)" "带符号表so所在目录"