應用啓動速度優化一般可以有以下幾種方式:
- 啓動頁優化
- 第三方庫懶加載
- MultiDex優化: 介紹了兩種方式,一種是直接在閃屏頁開個子線程去加載dex,難維護,不推薦;一種是今日頭條的方案,在單獨一個進程加載dex,加載完主進程再繼續。
- webview優化
- 線程優化
- 快速啓動Activity的方式:預創建Activity,預加載數據。
1.啓動頁優化
消除啓動時的白屏/黑屏,市面上大部分App都採用了這種方法,非常簡單,是一個障眼法,不會縮短實際冷啓動時間,簡單貼下實現方式吧。
<application
android:name=".MainApplication"
...
android:theme="@style/AppThemeWelcome>
styles.xml 增加一個主題叫AppThemeWelcome
<style name="AppThemeWelcome" parent="Theme.AppCompat.NoActionBar">
...
<item name="android:windowBackground">@drawable/logo</item> <!-- 默認背景-->
</style>
啓動頁設置這個主題,或者全局給Application設置
<activity android:name=".ui.activity.SplashActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:theme="@style/AppThemeWelcome"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
這樣的話啓動Activity之後背景會一直在,所以在Activity的onCreate方法中切換成正常主題
protected void onCreate(@Nullable Bundle savedInstanceState) {
setTheme(R.style.AppTheme); //切換正常主題
super.onCreate(savedInstanceState);
}
這樣打開桌面圖標會馬上顯示logo,不會出現黑/白屏,直到Activity啓動完成,替換主題,logo消失,但是總的啓動時間並沒有改變。
2.第三方庫懶加載
很多第三方開源庫都說在Application中進行初始化,十幾個開源庫都放在Application中,肯定對冷啓動會有影響,所以可以考慮按需初始化,例如Glide,可以放在自己封裝的圖片加載類中,調用到再初始化,其它庫也是同理,讓Application變得更輕。
3.MultiDex優化
方案1:直接在閃屏頁開個子線程去執行MultiDex邏輯,MultiDex不影響冷啓動速度,但是難維護。
方案2:今日頭條的MultiDex優化方案:
- 在Application 的attachBaseContext 方法裏,啓動另一個進程的LoadDexActivity去異步執行MultiDex邏輯,顯示Loading。
- 然後主進程Application進入while循環,不斷檢測MultiDex操作是否完成
- MultiDex執行完之後主進程Application繼續走,ContentProvider初始化和Application onCreate方法,也就是執行主進程正常的邏輯。
4.webview優化
- WebView第一次創建比較耗時,首次創建WebView耗時大約需要500ms左右,第二次創建耗時大約需要20ms左右,可以預先創建WebView,提前將其內核初始化。
- 使用WebView緩存池,用到WebView的地方都從緩存池取,緩存池中沒有緩存再創建,注意內存泄漏問題。
- 本地預置html和css,WebView創建的時候先預加載本地html,之後通過js腳本填充內容部分。
5.線程優化
線程是程序運行的基本單位,線程的頻繁創建是耗性能的,所以大家應該都會用線程池。單個cpu情況下,即使是開多個線程,同時也只有一個線程可以工作,所以線程池的大小要根據cpu個數來確定。