1、說明
其實這篇部落格本來想将題目命名為:“我的 Android 性能優化總結”,隻是想簡單總結一下一路走來經曆的性能優化,并從啟動、繪制、記憶體、穩定性和 Hybrid 優化幾個方面簡單做一個概括總結,但是發現越寫越多。想了想還是分開幾篇來寫吧,這是優化系列的第1篇,對啟動化做一些分析。
2、冷啟動 & 熱啟動
App 的啟動一般分為冷啟動和熱啟動:
- 冷啟動:App 在背景被殺死,該狀态下打開 App 即為冷啟動。
- 熱啟動:與冷啟動相反,App 未被殺死程序,仍在背景運作,該狀态下再啟動即為熱啟動(注意:我們按傳回鍵退出所有頁面後關閉 App,這個時候程序還在背景運作着,并未完全殺死,隻是系統會在一段時間後殺死程序并回收記憶體)。
3、耗時原因
- 啟動頁面布局複雜,延遲初始化。
- Application 啟動時有耗時操作。
- 啟動頁面啟動時有耗時操作。
4、優化
1、精簡布局
布局太複雜或層級太深會加大頁面計算繪制時間,啟動頁面最好不要直接放太多東西,這樣可以在一定程度上減少啟動時間。
2、異步/延遲初始化
在應用開發過程中往往需要添加很多的第三方插件依賴,而這些依賴往往需要在 Application 初始化或頁面初始化時進行初始化操作,當依賴的庫很多的時候就會造成比較大的耗時,我們可以對其做一些異步化,這樣可以避免占用主線程,可以有效減少啟動時間。
這裡着重說一下 IntentService,它是繼承自 Service 并處理異步請求的一個類,在其内部有一個工作線程來處理耗時任務。啟動 IntentService 和啟動傳統的 Service 一樣,同時,當任務完後,IntentService 會自動停止,而不需要去手動控制。對于異步初始化處理,這個類很好用。
工具方面,我們可以通過 TraceView、Systrace、Android Profiler 等工具分析耗時方法,進而做出有針對性的處理。
3、設定 Theme
當系統加載 Activity時,onCreate 其實是一個比較耗時的操作,系統為了讓使用者能有一個比較好的體驗,實際上會繪制一些初始化界面來做占位。具體的過程是系統會首先讀取 Activity 的 Theme 屬性,當 Activity 加載完畢後替換真正的頁面。
我們在開發中肯定或多或少也會遇到過:如果不設定 Theme 屬性,啟動應用時會有白屏的現象,這種情況可能在 Release 包情況下不太明顯,因為它做了很多優化,但在 Debug 包情況下會比較明顯。當然,這是建立在有一定初始化耗時情況下,如果你是一個新建立的項目,根本沒有什麼初始化的東西這個效果就不太明顯了。
使用該方法設定後,雖然不能減少應用的啟動時間,但可以在一定程度上減少白屏,也可以提升使用者體驗。
5、檢測 - 是否需要優化
了解了造成啟動慢的原因和怎樣優化後,我們肯定想知道怎樣檢測這個應用是否需要優化呢 ?
基本通過2種方案:
- 人體檢測:我去,怎麼還有這種檢測方法呢 ? 其實就是肉眼感覺是否啟動等待時間是否很長,是否有白屏或黑屏現象。
- adb 指令計算啟動時間:一般啟動時間最好不要超過3s,否則會有較長的等待感。
adb 計算啟動時間指令:
// 指令輸入
adb shell am start -W com.haoyd.sample/.IndexActivity
// 自動輸出
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.haoyd.sample/.IndexActivity }
Status: ok
Activity: com.haoyd.sample/.IndexActivity
ThisTime: 1054
TotalTime: 1054
WaitTime: 1097
Complete
com.haoyd.sample 是包名,後面的 /.IndexActivity 是你需要啟動的頁面路徑,如果是放在檔案夾下,需要把包名下的檔案夾路徑寫全了。
解釋一下輸出的幾個參數:
- ThisTime:一般和TotalTime時間一樣,除非在應用啟動時開了一個透明的Activity預先處理一些事再顯示出主Activity,這樣将比TotalTime小。一般看這個就可以。
- TotalTime:應用的啟動時間,包括:建立程序 + Application 初始化 + Activity 初始化到界面顯示。
- WaitTime:一般比TotalTime大點,包括系統影響的耗時。
6、總結
在該篇文章中對冷熱啟動做了部分簡介,并介紹了啟動耗時原因、優化方法和檢測方法,算是對自己的一個總結,也希望能對想了解啟動優化的同學有一些幫助。
7、推薦
- Android 性能優化1 - 啟動優化
- Android 性能優化2 - 繪制優化
- Android 性能優化3 - 解決記憶體洩露
- Android 記憶體優化4 - 圖檔優化
- Android 性能優化5 - 記憶體優化
- Android 性能優化6 - Hybrid 應用啟動優化