1. 程式人生 > >Android 效能監控與分析方法

Android 效能監控與分析方法

Android應用效能測試通常包括:啟動時間、記憶體、CPU、耗電量、流量、流暢度等。

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 8676
K 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>

以微博為例,分析下記憶體佔用

[email protected]:/ $ 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,選擇要除錯的程序
這裡寫圖片描述

需要注意的地方

  • 退出某個頁面後,記憶體是否回落。如果沒有及時回落,也不一定就是問題,可能程式還沒有自動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);