應用啓動速度優化

應用啓動速度優化一般可以有以下幾種方式:

  • 啓動頁優化
  • 第三方庫懶加載
  • 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優化方案:

  1. 在Application 的attachBaseContext 方法裏,啓動另一個進程的LoadDexActivity去異步執行MultiDex邏輯,顯示Loading。
  2. 然後主進程Application進入while循環,不斷檢測MultiDex操作是否完成
  3. MultiDex執行完之後主進程Application繼續走,ContentProvider初始化和Application onCreate方法,也就是執行主進程正常的邏輯。

4.webview優化

  • WebView第一次創建比較耗時,首次創建WebView耗時大約需要500ms左右,第二次創建耗時大約需要20ms左右,可以預先創建WebView,提前將其內核初始化。
  • 使用WebView緩存池,用到WebView的地方都從緩存池取,緩存池中沒有緩存再創建,注意內存泄漏問題。
  • 本地預置html和css,WebView創建的時候先預加載本地html,之後通過js腳本填充內容部分。

5.線程優化

            線程是程序運行的基本單位,線程的頻繁創建是耗性能的,所以大家應該都會用線程池。單個cpu情況下,即使是開多個線程,同時也只有一個線程可以工作,所以線程池的大小要根據cpu個數來確定。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章