Android 性能监控与分析方法
Android应用性能测试通常包括:启动时间、内存、CPU、耗电量、流量、流畅度等。
整理自:Android性能测试白皮书 感谢
top 命令查看CPU占用率
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 Proc26669 27204 4 8% R 1243380K 182012K fg u0_a258 pool-2-thread-1 com.sina.weibo26669 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/sdcard26669 26669 4 2% D 1249276K 184464K fg u0_a258 com.sina.weibo com.sina.weibo26669 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 top26669 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查看内存使用情况
使用格式
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 信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
Android Studio自带的Android Monitors检测内存变化
打开Android Studio,选择要调试的进程
需要注意的地方
退出某个页面后,内存是否回落。如果没有及时回落,也不一定就是问题,可能程序还没有自动GC,故一般情况下,需要手动GC,如果手动GC后,仍无法回落,此时可以确定有问题。
进行某个操作后,内存增长的过快,也可能存在风险,此时可反复操作进行确认。
使用Android自身提供的getMemoryInfo()方法获得
通过该方法获取某应用的内存信息。目前网易的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);
更多相关文章
- android应用程序fps meter[帧数显示]的分析 —— 浅谈root的风险
- Android应用程序获取系统权限
- 收藏Android下bitmap内存限制OUT OF MEMORY的方法
- 让android应用程序获得system权限
- Android使用ADB启动应用程序
- 修改Android自带的JAVA应用程序
- android studio 程序员有福了—从layout自动生成viewholder类