各位戰士,休整結束!歡迎回到「Android 性能戰爭」的第二週。我們將發起一場為期七天的閃電戰,目標直指使用者體驗的核心——應用啟動速度。
為什麼啟動速度如此重要?因為它是使用者與你 App 的第一次親密接觸。如果這個過程耗時過長,使用者可能在還沒看到你精心設計的功能前,就已經失去了所有耐心。我們的目標是:快,還要更快!
在發起攻擊前,我們必須先精準地定義我們的敵人。應用的啟動並非只有一種情況,它分為三種類型,其耗時程度有天壤之別。
MainActivity
。Activity
已經被銷毀(例如使用者按了返回鍵退出),然後使用者又重新啟動了 App。MainActivity
。Activity
實例都還在記憶體中(例如使用者按了 Home 鍵將 App 切到背景)。Activity
從背景帶到前台。要優化,先測量。憑感覺是打不贏戰爭的,我們需要精確的數據。
Android 系統會在 App 完成第一幀繪製時,自動在 Logcat 中打印一條日誌。這是評估啟動性能最簡單的方法。
Displayed
並篩選你的應用程式套件名稱。adb shell am force-stop com.your.package
或在系統設定中強制停止)。ActivityManager: Displayed com.your.package/.MainActivity: +385ms
這個 +385ms
就是本次冷啟動的初始顯示時間 (Time to initial display)。它測量的是從啟動進程到完成繪製 Activity
第一幀的時間。
如果你需要進行更嚴謹、可腳本化的測試,使用 ADB 指令是最佳選擇。
adb shell am force-stop com.your.package
adb shell am start -W com.your.package/com.your.package.MainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.your.package/.MainActivity }
Status: ok
Activity: com.your.package.MainActivity
ThisTime: 298
TotalTime: 298
WaitTime: 307
Complete
ThisTime
: 最後一個 Activity
的啟動耗時。TotalTime
: 啟動所有 Activity
的總耗時(對於單一啟動,通常與 ThisTime
相同)。WaitTime
: 從啟動到完成所有繪製的總時間,通常比 TotalTime
稍長,這是我們最關心的冷啟動指標。今天的任務是偵查與測量。我們學會了:
Displayed
日誌快速查看啟動時間。現在我們已經掌握了測量敵人實力的方法。從明天開始,我們將正式發起攻擊,深入程式碼,找出並消滅那些拖慢 App 啟動速度的瓶頸。我們的第一個目標:Application.onCreate()
的瘦身計畫!
準備好你的手術刀,我們明天見!