性能測試平臺
百度MTC、騰訊GT、bita、Bugly、阿里雲效、科大訊飛iTest、網易Emmagee、華爲DevEco、Testin
網易Emmagee
地址:https://github.com/NetEase/Emmagee
App的整體性能分析
騰訊隨身調
地址:https://github.com/TencentOpen/GT
官網:https://gt.qq.com/
GT(隨身調)是APP的隨身調測平臺,它是直接運行在手機上的“集成調測環境”(IDTE, Integrated Debug Environment)。利用GT,僅憑一部手機,無需連接電腦,您即可對APP進行快速的性能測試(CPU、內存、流量、電量、幀率/流暢度等等)、開發日誌的查看、Crash日誌查看、網絡數據包的抓取、APP內部參數的調試、真機代碼耗時統計等
Monkey 和 Monkey Demons
常規壓力測試、大數據/操作的峯值壓力測試、長時間運行的穩定性測試等
//隨機操作49000次
adb shell monkey 490000
//啓動包名爲com.tencent.mobileqq的應用並隨機操作49000次
adb shell monkey -p com.tencent.mobileqq 49000
Monkey Demons : 針對性的Monekey https://m.aliyun.com/yunqi/articles/73859
Android SysTrace 性能數據採樣和分析工具
針對:發現性能瓶頸
功能:跟蹤系統的I/O操作、內核工作隊列、CPU負載以及Android各個子系統(如Surfaceflinger、WindowManagerService等Framework關鍵模塊)的運行狀況。
Tip:主要用於發現性能瓶頸,可展示每個Frame的情況(Frame),查看有性能問題的點(Alert),不適合做針對性的問題定位和分析。
用法:
方法一:代碼跟蹤
//Java層 成對出現,並將這段時間內的數據收集到/sdcard/systrace.txt中
Trace.beginSection("systrace.txt");
Trace.endSection();
//framework中Java層
Trace.traceBegin(Trace.TRACE_TAG_VIEW,"systrace.txt");
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
//framework中Naitve層
ATRACE_INIT();
ATRACE_CALL();
方法二:python命令 \sdk\platform-tools\systrace
python systrace.py --time=10 -o mynewtrace.html sched gfx view wm
方法三:Android Device Monitor工具 【sdk\tools\lib\monitor-x86_64】
Android Device Monitor -> Device -> Capture System Wide Trace ;收集一段時間內某進程的信息
數據分析:使用瀏覽器打開生成html文件
Alerts:標記性能有問題的點,點擊可查看詳情,右邊側邊欄可以查看每個類型的Alerts數量
Frame:顯示爲黃色或紅色則表示渲染時間超過16.6ms,使用W鍵放大查看該幀做了什麼
Traceview
針對:卡頓、OOM、ANR
功能:展示每個方法的用時,調用次數及調用棧
用法:
方法一:代碼
//生成/mnt/sdcard/traceview.trace文件
Debug.startMethodTracing("traceview");
Debug.stopMethodTracing();
方法二:Android Device Monitor 工具【sdk\tools\lib\monitor-x86_64】
點擊【start method profile】開始 ==> 點擊【stop method profile】結束
獲取這段時間的trace文件
方法三:Android Studio 【3.1.2】 Profiler
點擊【Record a method trace】開始 ==> 點擊【stop Recording】結束
Call Chart:水平方向表示方法的執行時間,垂直方向表示方法的調用
Flame Chart:反向的Call Chart ???
Top Down:顯示方法調用的列表,擴展方法節點顯示其callees
Bottom Up:顯示一個方法調用列表,擴展方法的節點顯示其調用者
HierarchyViewer
針對:佈局優化
功能:查看UI佈局信息,優化佈局
用法:Android Device Monitor -> Device -> Dump View HierachyViewer for UI automator
PS:工具欄中點擊【Obtain layout times for tree rooted at selected node】按鈕可查看某View的耗時
MAT
針對:內存泄露
功能:內存泄露分析
Tip:個人經驗,內存泄露就是無用的對象無法被GC回收,很粗淺的一個判斷就是,假設你懷疑一個Activity有內存泄露情況,可以在AndroidStudio中觀察內存變化,然後進入Activity做操作,退出再進入再操作如此重複N次,如果內存不斷地增加則很有可能發生內存泄露了。而MAT可以幫我們找出泄露的是哪個對象。MAT的用法這裏引用大神的一個系列
用法:
方法一:下載eclipse插件工具 Eclipse Memory Analyzer
下載地址:https://eclipse.org/mat/downloads.php
1、獲取HPROF文件,點擊【Update Heap】按鈕,操作應用,點擊【Dump HPROF File】按鈕,生成HPROF文件
2、文件轉換 ./hprof-conv in.hprof out.hprof 然後用MAT打開這個hprof文件
方法二:Android Device Monitor
點擊【Update Heap】開始 ==> 點擊【Dump HPROF file】結束並獲取.hprof文件
方法三:Android Studio
數據分析:有Histogram、Dominator Tree、Top Consumers、Leak Suspects幾個分析緯度
Histogram:列出內存中的所有實例對象,對象的個數及大小,並支持正則表達式查找
Dominator Tree:列出最大的對象及其依賴存活的Object,分析流程和Histogram大同小異,但Dominator Tree可更方便的看出引用關係
右鍵選擇要跟蹤的Java類型,【Merge Shortest Paths to GC Root】-【exclude all phantom/weak/soft etc referrence】顯示GC Root並排除虛引用、弱引用、軟引用;可以看到該對象被那個對象持有,若是該問題在適當地方置爲null即可
Top Consumers:通過圖形列出最大的Object,瞭解應用內存都被哪些類型佔用了
但這部分信息包含了系統框架層的信息,用以下方式可以將系統框架的信息隔離,只顯示應用層的信息
方法一:轉換的時候加入-z參數
hprof-conv [-z] <infile><outfile>
-z: exclude non-app heaps, such as Zygote
方法二:針對轉換後的hprof,使用OQL查詢來提取信息。
在數據中尋找應用的Application類對象,將對象地址轉換爲十
進制後輸入以下查詢語句
select * from instanceof java.lang.Object s where s.@objectAddress > 1107296256
提取後結果如下
Leak Suspects通過MAT自動分析泄露的原因和泄露的一份總體報告,Leak Suspects列出了內存泄漏點和泄露大小。
Shallow Heap對象自身佔用的內存大小
Retained Heap對象自身佔用內存大小+其所引用的對象佔用內存大小的總和
PS:也可通過製造相同場景下的兩個不同的hprof(一個正常無泄漏,一個異常有泄漏)進行對比,查看異常hprof哪個地方持有引用明顯多於正常hprof從而定位問題
- Android最佳性能實踐(一)——合理管理內存
- Android最佳性能實踐(二)——分析內存的使用情況
- Android最佳性能實踐(三)——高性能編碼優化
- Android最佳性能實踐(四)——佈局優化技巧
手機自帶功能
- Debug GPU Overdraw:用來檢測UI的重繪次數
- Profile GPU Rendering:用來檢測UI繪製幀的速率和耗時,測出繪製每一幀在屏幕上用了多少時間
- 窗口動畫縮放/過渡動畫縮放/動畫程序時長縮放:動效出問題的時候用得上,能幫你看到許多東西
- 嚴格模式:報告與線程及虛擬機相關的策略違例,監視那些本不應該在主線程中完成的工作或者其他的一些不規範和不好的代碼(包括:主線程裏:disk讀、disk寫、網絡訪問)
- adb shell dumpsys gfxinfo com.letv.android.supermanager 查看掉幀率
- adb shell am start -W 包名/Activity路徑 查看Activity啓動時間,調用後會自動啓動Activity。eg:adb shell am start -W com.android.demo/.activity.DemoActivity
- adb shell dumpsys meminfo com.letv.android.supermanager 查看當前的內存分佈
** MEMINFO in pid 15548 [com.paisheng.pp] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 13573 13508 12 0 29184 20268 8915
Dalvik Heap 29066 29020 12 0 56681 40297 16384
Dalvik Other 3333 3332 0 4
Stack 48 48 0 20
Ashmem 2 0 0 0
Gfx dev 18808 18808 0 0
Other dev 13 0 12 0
.so mmap 1507 212 228 263
.jar mmap 0 0 0 0
.apk mmap 235 20 0 80
.dex mmap 2820 0 2412 8
.oat mmap 2140 0 792 0
.art mmap 2511 2180 0 72
Other mmap 1207 4 1180 0
EGL mtrack 36992 36992 0 0
GL mtrack 4504 4504 0 0
Unknown 2390 2376 8 21633
TOTAL 141229 111004 4656 22080 85865 60565 25299
內存分爲Natvie和Dalvik,兩者相加超過一定限制就會OOM,Dalvik即Java堆內存,而Bitmap則是在Native上直接分配的。
Native Heap Native代碼分配的內存,虛擬機和Android框架本身也會分配
Dalvik Heap Java代碼分配的對象
Dalvik Other 類的數據結構和索引
so mmap Native代碼和常量
dex mmap Java代碼和常量(dex mmap在Android應用中的作用是映射classes.dex文件。Dalvik虛
擬機需要從dex文件中加載類信息、字符串常量等,還需要在調用函數的時候直接從mmap內存中讀取函數代碼來執行)
Pss:進程實際使用的物理內存
Shared Dirty:zygote加載的Android框架部分
Private Dirty:應用new出來的對象
Heap Size:最大分配空間
Heap Alloc:統計的是由虛擬機分配的所有應用實例的內存,zygote部分也會計算進去,通常比Pss略大。反映Java代碼分配的內存
Heap Free:剩餘空間
am、pm命令
一、am
1.am啓動一個activity,可以輸出activity啓動時間
adb shell am start -W -n com.android.gallery3d/.MainActivity
-n使用包名加類名,還有a動作,c CATEGORY等
2.am發送一個廣播,使用action
adb shell am broadcast -a magcomm.action.TOUCH_LETTER
3.am發送一個帶參數的廣播,使用action
adb shell am broadcast -a magcomm.action.TOUCH_LETTER –es letter “e”
4.am啓動一個服務,不帶參數時默認使用包名加類名啓動,參數時n,a,c
adb shell am startservice com.android.music/.MediaPlaybackService
5.關閉一個activity或者服務之類,使用包名就行,只是強制退出,相當於Home按鍵,應用處於後臺
adb shell am force-stop com.android.gallery3d
二、pm
1、可以列出手機上安裝的apk與對應的軟件包,由於使用命令刪除apk時,需要知道包名,通過這條命令加上grep或者find就能找到需要的軟件的包名
adb shell pm list packages -f
2、找出對應包的安裝目錄路徑,兩條指令結合,可以知道要拷貝給別人的軟件位於手機什麼地方
adb shell pm path com.android.gallery3d
2.可以列了使用的權限
adb shell pm list permission-groups
adb shell pm list permissions
cpu命令查看
命令:cat /proc/stat
其他
- Battery Historian:耗電分析工具
- Bugly:定位各種閃退的BUG http://bugly.qq.com/
- GT:各種測 http://gt.tencent.com/index.html
- BlockCanary(阿里)ANR檢測
- LeakCanary 內存泄露自動探測,一個Android和Java的內存泄露檢測庫,可以大幅度減少了開發中遇到的OOM問題
- 弱網絡環境工具:Fiddler http://blog.csdn.net/kittyboy0001/article/details/38492567
- 動手自己做卡頓監控方案:利用MainLooper每次調用dispatchMessage前後都會利用Printer打印日誌,如果dispatchMessage執行超時則卡頓出現,只需記錄dispatchMessage執行時間超過一定時間則記錄相關信息。代碼示例