學習鏈接:https://juejin.im/post/5e0b06ab5188253a82107b32
一、啓動耗時檢測
二、啓動速度分析工具 — TraceView
三、啓動速度分析工具 — Systrace
啓動耗時檢測
- 查看Logcat
- adb shell
- AOP(Aspect Oriented Programming)打點
查看Logcat
在Android Studio Logcat中過濾關鍵字“Displayed”,可以看到對應的冷啓動耗時日誌。
adb shell
cmd命令使用adb shell獲取應用的啓動時間
adb shell am start -W packageName/AppstartActivity全路徑
如:adb shell am start -W com.wpf.test/com.wpf.test.AppLaunchActivity
執行後會得到三個時間:ThisTime、TotalTime和WaitTime,詳情如下:
ThisTime 最後一個Activity啓動耗時。
TotalTime 所有Activity啓動耗時。
WaitTime AMS啓動Activity的總耗時。
一般查看得到的TotalTime,即應用的啓動時間,包括創建進程 + Application初始化 + Activity初始化到界面顯示的過程。
特點:
- 線下使用方便,不能帶到線上。
- 非嚴謹、精確時間。
啓動速度分析工具 — TraceView
學習鏈接:https://www.jianshu.com/p/0770cde09ede
使用方式
- 方式1
- 方式2
方式1
檢測開始代碼處添加:
Debug.startMethodTracing();
檢測結束代碼處添加:
Debug.stopMethodTracing();
使用adb pull將生成的**.trace文件導出到電腦,然後使用Android Studio的Profiler加載
方式2
打開Profiler -> CPU -> 點擊 Record -> 點擊 Stop -> 查看Profiler下方Top Down/Bottom Up 區域找出耗時的熱點方法。
Profile CPU
1、Trace types
Trace Java Methods
會記錄每個方法的時間、CPU信息。對運行時性能影響較大。
Sample Java Methods
相比於Trace Java Methods會記錄每個方法的時間、CPU信息,它會在應用的Java代碼執行期間頻繁捕獲應用的調用堆棧,對運行時性能的影響比較小,能夠記錄更大的數據區域。
Sample C/C++ Functions
需部署到Android 8.0及以上設備,內部使用simpleperf跟蹤應用的native代碼,也可以命令行使用simpleperf。
Trace System Calls
檢查應用與系統資源的交互情況。
查看所有核心的CPU瓶。
內部採用systrace,也可以使用systrace命令。
2、Event timeline
顯示應用程序中在其生命週期中轉換不同狀態的活動,如用戶交互、屏幕旋轉事件等。
3、CPU timeline
顯示應用程序實時CPU使用率、其它進程實時CPU使用率、應用程序使用的線程總數。
4、Thread activity timeline
列出應用程序進程中的每個線程,並使用了不同的顏色在其時間軸上指示其活動。
綠色:線程處於活動狀態或準備好使用CPU。
黃色:線程正等待IO操作。(重要)
灰色:線程正在睡眠,不消耗CPU時間。
Profile提供的檢查跟蹤數據窗口有四種
1、Call Chart
提供函數跟蹤數據的圖形表示形式。
水平軸:表示調用的時間段和時間。
垂直軸:顯示被調用方。
橙色:系統API。
綠色:應用自有方法
藍色:第三方API(包括Java API)
提示:右鍵點擊Jump to source跳轉至指定函數。
2、Flame Chart
將具有相同調用方順序的完全相同的方法收集起來。
水平軸:執行每個方法的相對時間量。
垂直軸:顯示被調用方。
注意:看頂層的哪個函數佔據的寬度最大(平頂),可能存在性能問題。
3、Top Down
遞歸調用列表,提供self、children、total時間和比率來表示被調用的函數信息。
Flame Chart是Top Down列表數據的圖形化。
4、Bottom Up
展開函數會顯示其調用方。
按照消耗CPU時間由多到少的順序對函數排序。
注意點:
Wall Clock Time:程序執行時間。
Thread Time:CPU執行的時間。
TraceView小結
特點
圖形的形式展示執行時間、調用棧等。
信息全面,包含所有線程。
運行時開銷嚴重,整體都會變慢,得出的結果並不真實。
找到最耗費時間的路徑:Flame Chart、Top Down。
找到最耗費時間的節點:Bottom Up。
作用
主要做熱點分析,得到兩種數據:
單次執行最耗時的方法。(Flame Chart )
執行次數最多的方法。(Bottom Up)
啓動速度分析工具 — Systrace
使用方式:代碼插樁
定義Trace靜態工廠類,將
Trace.begainSection(),Trace.endSection()
封裝成i、o方法,然後再在想要分析的方法前後進行插樁即可。
在命令行下執行systrace.py腳本:
python /Users/quchao/Library/Android/sdk/platform-tools/systrace/systrace.py -t 20 sched gfx view wm am app webview -a "com.wanandroid.json.chao" -o ~/Documents/open-project/systrace_data/wanandroid_start_1.html
複製代碼具體參數含義如下:
-t:指定統計時間爲20s。
shced:cpu調度信息。
gfx:圖形信息。
view:視圖。
wm:窗口管理。
am:活動管理。
app:應用信息。
webview:webview信息。
-a:指定目標應用程序的包名。
-o:生成的systrace.html文件。
如何查看數據?
在UIThread一欄可以看到核心的系統方法時間區域和我們自己使用代碼插樁捕獲的方法時間區域。
Systrace原理
在系統的一些關鍵鏈路(如SystemServcie、虛擬機、Binder驅動)插入一些信息(Label);
通過Label的開始和結束來確定某個核心過程的執行時間;
把這些Label信息收集起來得到系統關鍵路徑的運行時間信息,最後得到整個系統的運行性能信息;
Android Framework裏面一些重要的模塊都插入了label信息,用戶App中可以添加自定義的Lable。
Systrace小結
特性
結合Android內核的數據,生成Html報告。
系統版本越高,Android Framework中添加的系統可用Label就越多,能夠支持和分析的系統模塊也就越多。
必須手動縮小範圍,會幫助你加速收斂問題的分析過程,進而快速地定位和解決問題。
作用
主要用於分析繪製性能方面的問題。
分析系統關鍵方法和應用方法耗時。
結合AOP,可以在方法的前後,非常方便地批量插入以下代碼。最後從運行生成Html報告後,可以快速查找出耗時的方法。
Trace.begainSection();
Trace.endSection();