我们可以使用android studio profiler导入hprof文件分析android应用的内存问题。那么如何从手机上面导出这份文件呢?

把应用的heap 区的数据取出来保存在一个hprof文件上,然后把hprof文件导入到可以查看这个文件的工具上(如android studio profiler),分析里面的数据,为解决我们的应用存在的内存问题而去找出根本问题所在。

在使用adb命令生成hprof文件之前,先运行应用并进行一些操作,尤其是一些能够触发问题的操作。

ADB的全称是Andriod Debug Bridge,安卓调试桥。我们可以用这个工具对手机设备进行一些操作,如安装、卸载和在设备上运行shell命令。我们接下来就是要在手机上运行shell命令。

第一步,查询应用的进程ID

adb shell ps | grep <VALUE>

上面这条命令是先用​​adb shell ps​​列出所有的进程,然后把结果集合通过管道“|”,传递给grep命令进行过滤,grep把带有VALUE的行都列出来,那么我们等一下就筛选出有我们应用包名的行出来就OK,就能找到应用的进程ID。

platform-tools % ./adb shell ps | grep com.example.myleakcanary
u0_a153 2434 1306 14676824 127904 0 0 S com.example.myleakcanary

2434就是我们的应用com.example.myleakcanary的进程ID(PID)。

第二步,生成应用heap dump的hprof文件

这一步的目的就是把我们安卓应用的heap(堆)区里的数据都导出来。

adb shell am dumpheap <PID> <HEAP-DUMP-FILE-PATH>

注意:HEAP-DUMP-FILE-PATH是指在手机上的文件路径,千万不要把它写成是你PC上的路径。

platform-tools % ./adb shell am dumpheap 2434 /data/local/tmp/myleakcanaryheapdump.hprof
File: /data/local/tmp/myleakcanaryheapdump.hprof
Waiting for dump to finish...
platform-tools %

第三步,把hprof文件从手机上拉到PC上

adb pull <HEAP-DUMP-FILE-PATH> <DESTINATION>

HEAP-DUMP-FILE-PATH是hprof文件在手机的文件路径,DESTINATION是PC上的目录,就是我们要把文件放到这个目录,如果不指定就是放在当前目录。

platform-tools % ./adb pull /data/local/tmp/myleakcanaryheapdump.hprof ~/Desktop
/data/local/tmp/myleakcanaryheapdump.hprof: 1 file pulled, 0 skipped. 237.8 MB/s (34774720 bytes in 0.139s)
platform-tools %

第四步,使用android studio profiler打开hprof文件进行分析

打开android studio, View > Tool Windows > Profiler,点击“+”> Load from file…

使用adb命令导出hprof文件_android studio


选择导出的文件就可以了。如下图:

使用adb命令导出hprof文件_数据_02

小贴士:
adb命令在sdk/platform-tools这个目录里。其次hprof文件通常都会很大,你的应用运行越久就越大。所以尽量通过android studio profiler分析问题,有必要时再考虑应用的heap dump。

在分享这些内容时,是参考了https://ayusch.com/how-to-capture-heap-dump-from-android/这篇文章的。大家有兴趣可以看看。