内存日志抓取
smaps
adb root
拿到systemui的进程号,后续需要用到,每个手机不一样
adb shell ps -A | grep com.android.systemui

比如这里的32301,后面命令中对应位置替换
adb shell cat /proc/32301/smaps > systemui_smaps.txt
注意:抓完需要修改一下systemui_smaps.txt文件名,不然会覆盖
smaps分析
通过 https://github.com/Gracker/Android-App-Memory-Analysis 提供的脚本拆分 smaps文件:
python3 smaps_parser.py -f smaps >smaps_parser.txt
python3 smaps_parser.py -f ./data/smaps3 > ./data/smaps_parser3.txt
Hprof—会导致内存增加,所以要在数据出来之后再抓
在测试前抓取一次hprof文件,之后杀死进程(抓取hprof文件会使内存变高),再测试所有的case之后抓取hrpof文件;通过两次的内存情况和hprof文件对比来判定是否存在内存泄露和未释放内存情况;
adb shell am dumpheap 32301
会输出如下信息

使用命令pull出结果
adb pull /data/local/tmp/heapdump-20241227-151329.prof
Native Heap Insight的使用:堆内存检视方案(Native Heap Insight)
-
需要userroot或者userdebug的包;
-
通过如下命令,之后便可使用Native Heap Insight:
- adb root
adb remount
adb shell setprop persist.track.malloc.enable track-heap
adb shell setprop persist.track.malloc.program com.android.systemui
adb shell stop
adb shell start
- adb root
-
对需要测试的场景进行操作,操作一段时间结束后通过如下命令获取相关日志:
- adb shell ps -A | grep systemui //获取systemui的pid
adb shell kill -51//pid为上一步中获取到的systemui的pid,如上文提到的32301
adb logcat | grep track-heap >native_heap_insight.txt //后面txt文件为输出的日志
- adb shell ps -A | grep systemui //获取systemui的pid
-
查看日志,该日志将Native排名前十的堆栈进行打印,通过查看堆栈发现Native异常分配内存的情况;
heap_profile 抓取
使用下面命令开始抓取trace文件
heap_profile -c 间隔时间 -n 包名
例如没100ms抓取一次桌面的内存: ./heap_profile -c 100 -n com.android.systemui

可以进一步拆解定位