這篇文章內容來源主要是官方文檔,在此記錄一下,做爲一個讀後感來看。android
冷啓動 指的是應用完全從頭開始啓動,遵循下面的步驟shell
當應用進程建立完畢後,系統將任務交給應用進程自己,應用進程將負責下面操做數據庫
main thread
Activity
View
View
的繪製過程 measure -> layout -> draw若是你重載了 Application.oncreate()
,應用將經過調用這個方法去啓動。在這以後,應用將會產生主線程,也就是UI線程,而且主線程將會建立你的主Activity。bash
也就是說,在調用 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]
複製代碼
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
複製代碼
由於App應用進程的建立過程是由手機的軟硬件決定的,因此咱們只能在這個建立過程當中進行視覺優化
給閃屏頁設置一個默認的啓動圖片以免白屏
<item name="android:windowBackground">@drawable/launch</item>
複製代碼
使用 IntentService 下載啓屏廣告
在入口 Acitivity 中開啓 IntentService 或者是其它異步下載操做來下載啓屏廣告。在廣告頁圖片文件流徹底寫入後記錄圖片大小,或者記錄一個標識。在下次的廣告頁加載中能夠判斷是否已經下載好了廣告頁圖片以及圖片是否完整,不然刪除而且再次下載圖片。
在 Application 中完成繁重的初始化操做和複雜的邏輯就會影響到應用的啓動性能。並且有不少第三方組件(包括App應用自己)都在 Application 中搶佔先機,完成初始化操做。
常見問題
解決方案
參考資料 啓動流程簡析 App startup time