Android应用性能测试通常包括:启动时间、内存、CPU、耗电量、流量、流畅度等。
整理自:Android性能测试白皮书 感谢
top命令使用
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
显示条数
-m num Maximum number of processes to display.
在退出前刷新几次
-n num Updates to show before exiting.
刷新间隔
-d num Seconds to wait between updates.
排序的字段名
-s col Column to sort by (cpu,vss,rss,thr).
显示线程名
-t Show threads instead of processes.
-h Display this help screen.
启动adbshell后
输入 top -m 10 -s cpu -t
下面是显示结果
User 39%, System 23%, IOW 1%, IRQ 1%
User 712 + Nice 67 + Sys 470 + Idle 677 + IOW 39 + IRQ 0 + SIRQ 27 = 1992
PID TID PR CPU% S VSS RSS PCY UID Thread Proc
26669 27204 4 8% R 1243380K 182012K fg u0_a258 pool-2-thread-1 com.sina.weibo
26669 26770 4 3% S 1249156K 184420K fg u0_a258 RenderThread com.sina.weibo
4735 4739 2 3% S 8676K 1372K fg media_rw sdcard /system/bin/sdcard
26669 26669 4 2% D 1249276K 184464K fg u0_a258 com.sina.weibo com.sina.weibo
26669 26924 5 2% S 1246660K 182848K bg u0_a258 AsyncTask #1 com.sina.weibo
4726 4726 2 2% S 0K 0K fg root VosRXThread
25147 25147 5 2% R 5116K 2560K fg shell top top
26669 26742 4 1% S 1249216K 184452K fg u0_a258 HIGH_IO#4 com.sina.weibo
462 462 1 1% S 3872K 764K fg system servicemanager /system/bin/servicemanager
606 3188 0 1% S 134928K 7100K fg media AudioOut_6 /system/bin/mediaserver
PID:progressidentification,应用程序ID
S: 进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。
THR:程序当前所用的线程数
VSS:VirtualSet Size虚拟耗用内存(包含共享库占用的内存)
RSS: ResidentSet Size实际使用物理内存(包含共享库占用的内存)
UID:UserIdentification,用户身份ID
Name:应用程序名称
以微博为例进行分析
输入如下命令, grep用来过滤包名
top -d 3 | grep com.sina.weibo
输出如下
4477 0 0% R 107 1160052K 99504K bg u0_a258 com.sina.weibo
4571 0 0% S 22 1005140K 41424K bg u0_a258 com.sina.weibo:remote
5030 0 0% S 12 987008K 30704K bg u0_a258 com.sina.weibo.imageservant
4477 0 0% S 107 1160052K 99504K bg u0_a258 com.sina.weibo
4571 0 0% S 22 1005140K 41424K bg u0_a258 com.sina.weibo:remote
5030 0 0% S 12 987008K 30704K bg u0_a258 com.sina.weibo.imageservant
4477 5 8% D 115 1198396K 117628K fg u0_a258 com.sina.weibo
4571 0 0% S 22 1005140K 41544K bg u0_a258 com.sina.weibo:remote
5030 0 0% S 12 987008K 30704K fg u0_a258 com.sina.weibo.imageservant
4477 1 30% S 135 1237432K 149208K fg u0_a258 com.sina.weibo
4571 0 0% S 22 1005140K 40688K bg u0_a258 com.sina.weibo:remote
5030 0 0% S 12 987008K 30276K fg u0_a258 com.sina.weibo.imageservant
4477 2 28% S 138 1246236K 151044K fg u0_a258 com.sina.weibo
4571 0 0% S 22 1005140K 40812K bg u0_a258 com.sina.weibo:remote
5030 0 0% S 12 987008K 30276K fg u0_a258 com.sina.weibo.imageservant
4477 2 26% D 144 1256148K 164484K fg u0_a258 com.sina.weibo
4571 0 0% S 22 1005140K 40472K bg u0_a258 com.sina.weibo:remote
5030 0 0% S 12 987008K 30276K fg u0_a258 com.sina.weibo.imageservant
4477 4 20% D 157 1277156K 172164K fg u0_a258 com.sina.weibo
4571 0 0% S 22 1005360K 40816K bg u0_a258 com.sina.weibo:remote
5030 3 0% S 12 987008K 30156K fg u0_a258 com.sina.weibo.imageservant
4477 3 10% D 160 1279080K 170384K fg u0_a258 com.sina.weibo
4571 0 0% S 22 997092K 34564K bg u0_a258 com.sina.weibo:remote
5030 3 0% S 12 987008K 30224K fg u0_a258 com.sina.weibo.imageservant
可以看间,系统中同时存在三个weibo进程, PCY字段中的fg和bg表示是否是前后台的意思,其他字段同上面介绍
可以重点关注下cpu和内存占用,cpu占用过高且一直无法释放,此时可能存在风险
使用格式
dumpsysmeminfo <package_name>或dumpsys meminfo <package_id>
以微博为例,分析下内存占用
shell@kenzo:/ $ dumpsys meminfo com.sina.weibo
Applications Memory Usage (kB):
Uptime: 85359978 Realtime: 140524777
** MEMINFO in pid 4477 [com.sina.weibo] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 38527 38480 0 7388 51760 49418 2341
Dalvik Heap 47883 47856 0 11536 67648 59744 7904
Dalvik Other 4263 4260 0 0
Stack 1340 1340 0 192
Ashmem 272 236 0 0
Gfx dev 13852 13808 0 0
Other dev 21 0 20 0
.so mmap 4659 716 2172 2760
.apk mmap 3544 100 840 0
.ttf mmap 2462 0 2312 0
.dex mmap 17481 68 13600 4
.oat mmap 4050 0 1064 4
.art mmap 2391 1884 28 60
Other mmap 419 12 60 0
Unknown 645 644 0 312
TOTAL 141809 109404 20096 22256 119408 109162 10245
App Summary
Pss(KB)
------
Java Heap: 49768
Native Heap: 38480
Code: 20872
Stack: 1340
Graphics: 13808
Private Other: 5232
System: 12309
TOTAL: 141809 TOTAL SWAP (KB): 22256
Objects
Views: 1344 ViewRootImpl: 1
AppContexts: 7 Activities: 3
Assets: 8 AssetManagers: 4
Local Binders: 120 Proxy Binders: 39
Parcel memory: 33 Parcel count: 134
Death Recipients: 3 OpenSSL Sockets: 3
SQL
MEMORY_USED: 4712
PAGECACHE_OVERFLOW: 3743 MALLOC_SIZE: 62
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 20 27 4/19/5 /data/user/0/com.sina.weibo/databases/db_default_job_manager
4 20 14 0/15/1 /data/user/0/com.sina.weibo/databases/weibo_popup_ad.db
4 560 125 181/52/25 /storage/emulated/0/sina/weibo/.database/weibolog
4 428 439 669/68/25 /data/user/0/com.sina.weibo/databases/sinamobilead.db
4 2060 445 844/867/25 /data/user/0/com.sina.weibo/databases/message_5503950735.db
4 1276 430 1025/228/25 /data/user/0/com.sina.weibo/databases/sina_weibo
4 16 20 26/17/3 /data/user/0/com.sina.weibo/databases/sinamobileadparams.db
Naitve Heap Size: 从mallinfo usmblks获得,代表最大总共分配空间
Native Heap Alloc: 从mallinfo uorblks获得,总共分配空间
Native Heap Free: 从mallinfo fordblks获得,代表总共剩余空间
Native Heap Size 约等于Native Heap Alloc + Native Heap Free
mallinfo是一个C库, mallinfo 函数提供了各种各样的通过C的malloc()函数分配的内存的统计信息。
Dalvik Heap Size:从Runtime totalMemory()获得,Dalvik Heap总共的内存大小。
Dalvik Heap Alloc: Runtime totalMemory()-freeMemory() ,Dalvik Heap分配的内存大小。
Dalvik Heap Free:从Runtime freeMemory()获得,Dalvik Heap剩余的内存大小。
Dalvik Heap Size 约等于Dalvik HeapAlloc + Dalvik Heap Free
可以看出功能非常强大,最后对对象个数, 数据库 都有所统计
Native/Dalvik 的 Heap 信息中的alloc
具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。
Total 的 PSS 信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
退出某个页面后,内存是否回落。如果没有及时回落,也不一定就是问题,可能程序还没有自动GC,故一般情况下,需要手动GC,如果手动GC后,仍无法回落,此时可以确定有问题。
进行某个操作后,内存增长的过快,也可能存在风险,此时可反复操作进行确认。
通过该方法获取某应用的内存信息。目前网易的Emmagee工具就是通过该方法实现某应用内存和cpu数据的获取,测试简单方便,安装app以后选中被测应用即可开始测试,界面会展示内存、CPU和流量等数据。完成测试后,可在本地SD卡种保存一份性能测试数据,可以从里面获取内存信息。
MemoryInfo memInfo = new MemoryInfo();//存放内存信息的对象
activityManager.getMemoryInfo(memInfo);//传入参数,将获得数据保存在memInfo对象中
long availMem = memInfo.availMem/1000000;//可用内存
boolean isLowMem = memInfo.lowMemory;//是否达到最低内存
long threshold = memInfo.threshold/1000000;//临界值,达到这个值,进程就要被杀死
long totalMem = memInfo.totalMem/1000000;//总内存
Log.i(TAG, "avail:" + availMem + ",isLowMem:" + isLowMem + ",threshold:" + threshold + ",totalMem:" + totalMem);