内存日志抓取

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)

  1. 需要userroot或者userdebug的包;

  2. 通过如下命令,之后便可使用Native Heap Insight:

    1. 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
  3. 对需要测试的场景进行操作,操作一段时间结束后通过如下命令获取相关日志:

    1. 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文件为输出的日志
  4. 查看日志,该日志将Native排名前十的堆栈进行打印,通过查看堆栈发现Native异常分配内存的情况;

heap_profile 抓取

使用下面命令开始抓取trace文件

heap_profile -c 间隔时间 -n 包名

例如没100ms抓取一次桌面的内存: ./heap_profile -c 100 -n com.android.systemui

可以进一步拆解定位