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          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查看内存使用情况

使用格式

 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);  

你可能感兴趣的:(android,QA,android,性能)