Android Note - 啟動優化
冷啟動指的是應用徹底從頭開始啟動,遵循下面的步驟
- 載入和啟動應用
- 在啟動應用後立即為應用生成並展示一個空白的啟動視窗
- 建立應用程序
當應用程序建立完畢後,系統將任務交給應用程序本身,應用程序將負責下面操作
main thread Activity View View
如果你過載了 Application.oncreate()
,應用將通過呼叫這個方法去啟動。在這之後,應用將會產生主執行緒,也就是UI執行緒,並且主執行緒將會建立你的主Activity。
也就是說,在呼叫 Application.oncreate()
的時候並沒有產生主執行緒。
Activity.onCreate()
方法對載入時間有 最大的影響,因為它執行了最高開銷的工作:載入和填充view ,並且初始化了供Activity執行的物件。

熱啟動熱啟動比冷啟動的開銷更低。在熱啟動裡,系統所做的就是把你的應用帶到前臺,可以避免重複的物件初始化,佈局載入和填充。
溫啟動可以理解成包含了一些冷啟動操作的熱啟動,比冷啟動開銷小。
使用工具評估啟動時間
Displayed是 Logcat 自帶的引數輸出,其結果表示了應用 從啟動程序到完成初次螢幕繪製經過的時間 。注意,這個時間並不是應用實際的總耗時。
Time/? I/ActivityManager: Displayed com.xxx.xxx/.launch.SplashActivity: +553ms (total +4s89ms) Time/? I/ActivityManager: Displayed com.xxx.xxx/.launch.MenuIrrActivity: +1s241ms 複製程式碼
ADB Shell Activity Manager使用 adb 命令來測量啟動時長,命令如下
adb shell am start -W -S [packageName]/[ActivityPath] 複製程式碼
- -W 列出啟動過程中統計到的具體資料
- -S 強制停止當前的 Activity ,重新啟動
D:\SDK\Android\platform-tools>adb shell am start -W -S com.xxx.xxx/.launch.MainActivity 複製程式碼
執行結果如下
Stopping: com.xxx.xxx Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.datayes.irr/.launch.MainActivity } Status: ok Activity: com.datayes.irr/.launch.SplashActivity ThisTime: 1276 TotalTime: 5244 WaitTime: 5334 Complete 複製程式碼
- ThisTime 最後一個啟動的 Activity 的啟動耗時
- TotalTime 啟動流程裡所有的 Activity 的啟動耗時
- WaitTime ActivityManagerService 啟動 App 的 Activity 的總耗時
具體優化方案
因為App應用程序的建立過程是由手機的軟硬體決定的,所以我們只能在這個建立過程中進行視覺優化
主題啟動優化
給閃屏頁設定一個預設的啟動圖片以避免白屏
<item name="android:windowBackground">@drawable/launch</item> 複製程式碼
廣告頁優化
使用 IntentService 下載啟屏廣告
在入口 Acitivity 中開啟 IntentService 或者是其它非同步下載操作來下載啟屏廣告。在廣告頁圖片檔案流完全寫入後記錄圖片大小,或者記錄一個標識。在下次的廣告頁載入中可以判斷是否已經下載好了廣告頁圖片以及圖片是否完整,否則刪除並且再次下載圖片。