Android性能相關--工具篇

性能測試平臺

百度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從而定位問題


手機自帶功能

  • 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執行時間超過一定時間則記錄相關信息。代碼示例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章