-
对于单个App
官方文档:https://android.googlesource.com/platform/bionic/+/master/libc/malloc_debug/README.md
执行前:确定一下手机版本和对应的symbols文件,在corgi上下载symbols文件,用于解析heap文件
步骤:(现miui lite也可,L19手机上发现可以使用)
adb root
adb shell setprop dalvik.vm.force-java-zygote-fork-loop true
adb shell stop
adb shell start
#等出现开机后的界面,继续执行
#以com.android.bluetooth进程为例,等待开机后执行下列命令
adb shell setenforce 0
adb shell setprop wrap.com.android.bluetooth '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"'
adb shell am force-stop com.android.bluetooth
#特殊进程执行 adb shell kill -9 <pid>,如屏锁、桌面之类的应用,且该类应用执行后需要等待1-2分钟
#打开应用,此时adb shell ps |grep logwrapper,可看到出现该进程
adb shell dumpsys meminfo com.android.bluetooth #用于查看com.android.bluetooth的pid
>>按照步骤复现问题
adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt
adb pull /data/local/tmp/heap.txt .
#再用native_heapdump_viewer.py解析即可,native_heapdump文件在任意源码的development目录中,格式如下:
python ~/ssd/K9E_origin/development/scripts/native_heapdump_viewer.py --html --symbols /home/mi/下载/线刷包/k9e/out/target/product/zijin/symbols (symbols路径) heap.txt > heap.html
-
执行实例
以L3A dump小米笔记app数据为例,这里需要跟踪的进程是com.miui.notes
让进程已被杀掉 或是使用 adb shell am force-stop com.miui.notes
-
依次执行 adb root 、 adb shell setprop dalvik.vm.force-java-zygote-fork-loop true 、adb shell stop、adb shell start,之后等待手机亮屏;
-
依次执行adb root && adb shell setenforce 0、adb shell getprop dalvik.vm.force-java-zygote-fork-loop,确认变量是否设置成功,返回值为true则设置成功
-
此时执行一下:
-
adb shell kill -9 <pidof com.miui.notes >
-
打开需要检测的app,这个过程可能会出现卡顿,或是进程起不来的情况,若等待2分钟后app依然起不来,退到后台,清理一下后台,从 d 步骤开始重新执行
-
app启动后,执行 adb shell ps |grep logwrapper,若出现该进程说明已经wrap成功
-
此时看一下进程对应的pid,使用adb shell dumpsys meminfo <进程名> 进行查看
-
操作App,按照步骤复现问题场景;
-
执行下面命令dump出数据,pid为 g 步骤中得到的pid
-
执行下面命令将heap.txt放到本地问题
-
根据命令使用symbols解析,格式如上面的格式,这里本地执行的命令如下(symbols 要和 手机版本对应,比如你的手机版本是 22.5.30 ,symbols也要下22.5.30版本的,如果还不行就在文件夹里多试几次symbols路径)
-
adb pull /data/local/tmp/heap.txt .
-
一般得到的结果为,完成: