獲取啟動時間
要想提升APP啟動時的性能,加快啟動速度,首先我們應該正確的獲取和分析應用的啟動時間和性能,
為了正確診斷應用的啟動時間和性能,我們可以跟蹤一些顯示應用啟動所需時間的指標,
使用命令列方式獲取
我們可以通過adb命令,使用am服務來獲取冷啟動時間:
adb shell am start -S -R 10 -W com.example.app/.MainActivity
或
adb [-d|-e|-s <serialNumber>] shell am start -S -W
com.example.app/.MainActivity
-c android.intent.category.LAUNCHER
-a android.intent.action.MAIN
- -S表示每次啟動前先強行停止;
- -R表示重復測驗次數,
- -c 和 -a 為可選引數,可以為 intent 指定 和 ,
執行結果如下:
Starting: Intent
Activity: com.example.app/.MainActivity
ThisTime: 2044
TotalTime: 2044
WaitTime: 2054
Complete
通過logcat獲取
在 Android 4.4(API 級別 19)及更高版本中,logcat 包含一個輸出行,其中包含名為 Displayed 的值,此值代表從啟動行程到在螢屏上完成對應 Activity 的繪制所用的時間,這個方法比較適合測量程式的啟動時間,
報告的日志行類似于以下示例:
ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms
以上時間包含以下事件序列:
- 啟動行程,
- 初始化物件,
- 創建并初始化 Activity,
- 擴充布局,
- 首次繪制應用,
注意:要在 Android Studio 中查找經過的時間,必須在 logcat 視圖中停用過濾器,停用過濾器是必要的,因為提供此日志的是系統服務器,不是應用本身,
這個資訊在 Activity 視窗完成所有的啟動事件之后,第一次繪制的時候輸出,這個時間包括了從啟動行程到第一次布局與繪制的所有時間,這基本上是你需要知道的主要時間,它不包含用戶點擊app圖示然后系統開始準備啟動activity的時間,這是ok的,因為作為一個開發者你無法影響這個時間,所以沒有必要去測量它,
在 logcat 中停用過濾器并查找 Displayed 值:

有時,logcat 輸出中的 Displayed 行中會包含一個總時間的附加欄位,
例如:
ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms (total +1m22s643ms)
括號內的時間只有在特殊情況下才會有,例如,A->B(在onCreate立刻finish掉自己,直接跳轉到C)->C(TestActivity),它包含了B頁面onCreate處理以及finish的時間,這個時間如果過長,會導致用戶點擊跳轉后,頁面還停留在原來界面,延遲一段時間再跳轉,
在這種情況下,第一個時間測量值僅針對第一個繪制的 Activity,total 時間測量值是從應用行程啟動時開始計算,并且可以包含首次啟動但未在螢屏上顯示任何內容的另一個 Activity,total 時間測量值僅在單個 Activity 的時間和總啟動時間之間存在差異時才會顯示,
獲取”完全顯示所用時間“
我們通常來說會使用異步懶加載的方式來提升程式畫面的顯示速度,這通常會導致的一個問題是,程式畫面已經顯示,可是內容卻還在加載中,為了衡量這些異步加載資源所耗費的時間,我們可以在異步加載完畢之后呼叫 activity.reportFullyDrawn() 方法來告訴系統此時的狀態,以便獲取整個加載的耗時,在應用執行延遲加載時,此資料會很有用,
如果由于延遲加載,應用的初步顯示不包括所有資源,我們可能需要將完全加載和顯示所有資源及視圖視為單獨的指標:例如,你的界面可能已完全加載,并繪制了一些文本,但尚未顯示應用必須從網路中獲取的圖片,
要解決此問題,你可以手動呼叫 reportFullyDrawn(),讓系統知道你的 Activity 已完成延遲加載,
當你使用此方法時,logcat 顯示的值為從創建應用物件到呼叫 reportFullyDrawn() 時所用的時間,

logcat 輸出的示例:
system_process I/ActivityManager: Fully drawn {package}/.MainActivity: +1s54ms
logcat 輸出有時包含 total 時間,如上文中所述,
注意:在4.4上呼叫 reportFullyDrawn() 方法會崩潰(但是 log 還是能正常列印),提示需要 UPDATE_DEVICE_STATS 權限 ,但是這個權限只有系統 app 才能授權,解決的辦法是添加 try…catch 塊保護,
使用 CPU profiler 工具分析耗時
前面的方法提供了啟動耗時的總時間,可是卻無法提供具體的耗時細節,為了獲取具體的耗時分布情況,我們可以使用 CPU profiler 工具來進行詳細的測量,
詳情請見:《Android Studio CPU profiler性能分析工具介紹和使用詳解》
使用 Systrace 工具分析耗時
我們也可以使用Systrace工具來分析啟動耗時,
詳情請見:《性能分析工具Systrace的使用詳解》
總結
要想提升APP啟動時的性能,加快啟動速度,首先我們應該正確的獲取和分析應用的啟動時間和性能,
本文介紹了獲取和分析啟動時間性能的幾種方式:
- 使用命令列方式獲取,
- 通過 logcat 獲取,
- 呼叫 reportFullyDrawn() 方法獲取”完全顯示所用時間“,
- 使用 CPU profiler 工具分析耗時,
- 使用 Systrace 工具分析耗時,
使用這幾種方式可以很方便和全面的分析和追蹤我們的 APP 啟動耗時,以解決我們的 APP 啟動相關的性能問題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/226894.html
標籤:其他
