天天看點

Android 性能優化1 - 啟動優化1、說明2、冷啟動 & 熱啟動3、耗時原因4、優化5、檢測 - 是否需要優化6、總結7、推薦

1、說明

其實這篇部落格本來想将題目命名為:“我的 Android 性能優化總結”,隻是想簡單總結一下一路走來經曆的性能優化,并從啟動、繪制、記憶體、穩定性和 Hybrid 優化幾個方面簡單做一個概括總結,但是發現越寫越多。想了想還是分開幾篇來寫吧,這是優化系列的第1篇,對啟動化做一些分析。

2、冷啟動 & 熱啟動

App 的啟動一般分為冷啟動和熱啟動:

  • 冷啟動:App 在背景被殺死,該狀态下打開 App 即為冷啟動。
  • 熱啟動:與冷啟動相反,App 未被殺死程序,仍在背景運作,該狀态下再啟動即為熱啟動(注意:我們按傳回鍵退出所有頁面後關閉 App,這個時候程序還在背景運作着,并未完全殺死,隻是系統會在一段時間後殺死程序并回收記憶體)。

3、耗時原因

  1. 啟動頁面布局複雜,延遲初始化。
  2. Application 啟動時有耗時操作。
  3. 啟動頁面啟動時有耗時操作。

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種方案:

  1. 人體檢測:我去,怎麼還有這種檢測方法呢 ? 其實就是肉眼感覺是否啟動等待時間是否很長,是否有白屏或黑屏現象。
  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、推薦

  1. Android 性能優化1 - 啟動優化
  2. Android 性能優化2 - 繪制優化
  3. Android 性能優化3 - 解決記憶體洩露
  4. Android 記憶體優化4 - 圖檔優化
  5. Android 性能優化5 - 記憶體優化
  6. Android 性能優化6 - Hybrid 應用啟動優化