在android测试过程中,我们通常需要监控内存使用情况,有时候还需要我们去dump Hprof文件,在dump hprof文件之前需要做cause GC。这些我们都是通过android sdk的monitor(ddms)来完成的。
我们肯定会碰到这种情况,在CI中,我们需要监控手机的内存使用情况,如果有问题自动cause GC和dump hprof文件,今天我就介绍一下,由于不能把全部代码贴出来,这里仅仅是个思路,因为不难做,所以应该做过框架的同学们应该很熟系,这里就不贴代码了。
1. 安装gnuplot
sudo apt-get install gnuplot-x11
2. 适用dump meminfo来dump 内存适用状况
adb shell dumpsys meminfo <package name>
比如:
adb shell dumpsys meminfo com.android.settings
Applications Memory Usage (kB):
Uptime: 59463187 Realtime: 144534268
** MEMINFO in pid 25956 [com.android.settings] **
Shared Private Heap Heap Heap
Pss Dirty Dirty Size Alloc Free
------ ------ ------ ------ ------ ------
Native 16 16 16 10716 7275 2832
Dalvik 11046 5740 10876 11448 8590 2858
Stack 84 0 84
Cursor 0 0 0
Ashmem 0 0 0
Other dev 5076 60 5072
.so mmap 1664 2576 1308
.jar mmap 0 0 0
.apk mmap 27 0 0
.ttf mmap 0 0 0
.dex mmap 89 0 0
Other mmap 10 12 8
Unknown 6025 432 6016
TOTAL 24037 8836 23380 22164 15865 5690
Objects
Views: 226 ViewRootImpl: 1
AppContexts: 4 Activities: 2
Assets: 8 AssetManagers: 8
Local Binders: 23 Proxy Binders: 34
Death Recipients: 12
OpenSSL Sockets: 0
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
Asset Allocations
: 1K
zip:/data/app-skin/com.sonyericsson.blackthemeblueaccent/com.sonyericsson.uxp.zip:/resources.arsc: 1K
3. 解析Dalvik,Native 和 Total等
比如dalvik 的Heap Allocated很重要,我们就可移这样
adb shell dumpsys meminfo com.android.settings | grep Dalvik | awk -F " " '{print $6} >> dalvik_allocted.txt
当然要做个循环,比如3秒钟一个循环,不停的写直到被停止为,在捕获停止CTRL+C之后(trap my_exit_handle SIGQUIT SIGKILL),自动调用gnuplot来绘图
4. 画内存使用图
这里给出一个实例:
gnuplot_script
set term png small size 800,600
set output "mem-dalvik_allocated-graph.png"
set title "Memory monitor"
set ylabel "KB"
plot "dalvik_allocated.txt" s c
然后用gnuplot gnuplot_script就可移画出来这个内存状况图
5. Cause GC(内存垃圾强制回收)
适用ddmlib里面的Client接口executeGarbageCollector就可以,用com.android.ddmlib.IDevice#getClients()得到当前进程的client实例,然后再用Client的这个executeGarbageCollector接口即可cause GC
需要写一个jar来做。
6. 自动dump hprof文件,这个有现成的命令
adb shell am dumpheap <package name> <path to save>
例如:
adb shell am dumpheap com.android.settings /sdcard/settings.hprof
7. 决定什么时候dump hprof,一般我们会判断我们的total private dirty / Growth Limited Davik size
可以通过adb shell getprop dalvik.vm.heapgrowthlimit获得
这样我们就完成了监控抓取的整个过程。
:)