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

可以看出功能非常强大,最后对对象个数, 数据库 都有所统计

重点关注如下参数

  1. Native/Dalvik 的 Heap 信息中的alloc
    具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。

  2. Total 的 PSS 信息
    这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。

Android Studio自带的Android Monitors检测内存变化

打开Android Studio,选择要调试的进程
Android 性能监控与分析方法_第1张图片

需要注意的地方

  • 退出某个页面后,内存是否回落。如果没有及时回落,也不一定就是问题,可能程序还没有自动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);  

更多相关文章

  1. android应用程序fps meter[帧数显示]的分析 —— 浅谈root的风险
  2. Android应用程序获取系统权限
  3. 收藏Android下bitmap内存限制OUT OF MEMORY的方法
  4. 让android应用程序获得system权限
  5. Android使用ADB启动应用程序
  6. 修改Android自带的JAVA应用程序
  7. android studio 程序员有福了—从layout自动生成viewholder类

随机推荐

  1. Android实现导航菜单左右滑动效果
  2. Android(安卓)蓝牙模块
  3. Android(安卓)socket 开发中遇到的问题.
  4. 用CSS3生成的一个漂亮的android客户端页
  5. Android下Affinities和Task
  6. Android(安卓)Push Notification实现信息
  7. Android(安卓)AES加密算法及事实上现
  8. 《第一行代码Android》学习总结第十三章
  9. [转]Android(安卓)开发中的日常积累
  10. Android(安卓)Layout XML属性