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
可以看出功能非常強大,最後對物件個數, 資料庫 都有所統計
重點關注如下引數
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);