本篇文章主要針對 Android性能優化 中App的啓動優化java
App啓動,相信你們都是很是熟悉了,那爲什麼咱們須要對App啓動作優化呢,這裏就要先對咱們Android 從開機到啓動咱們的App進入主頁面這一流程作一個簡單的闡述了.android
咱們先來看一張流程圖數據庫
首先呢,咱們Android手機開機時是先加載一個Boot程序,有點相似Windows開機時的開機引導程序,而後經過Boot程序加載Lux內核,隨後是調用Native的init()方法作一些初始化加載操做(加載一些系統須要的驅動程序),而後就進入咱們的java Framework層,也就是建立咱們的java虛擬機,而後經過java虛擬機建立咱們的系統程序,最後纔是調用咱們App的application啓動咱們的App.segmentfault
流程以下:windows
Loader > Kernel > Native > Framework > Application
Android啓動流程大體就是這樣,咱們不須要去深刻,只須要大概知道是這麼個流程就好了.性能優化
因此說,其實咱們手機的操做系統就是一個App,開機啓動時先加載各類驅動程序(相似App初始化各類第三方SDK),而後加載系統標識(黑白屏問題),而後啓動開機歡迎動畫(App歡迎頁動畫),最後進入到桌面(App主頁面).網絡
基於以上的啓動流程 ,那麼App啓動優化的第一步就是從系統標識入手,咱們手機開機時通常最早出現的是手機廠商的logo標識,而App啓動時會先調用一個預顯示窗口,這個窗口的樣式通常是黑色或者白色,因此也就出現了App啓動時出現短暫的黑白屏問題,app
流程以下:異步
Application > onCreate > MainActivity > onCreate > windows > setContentView> layout
在咱們點擊桌面App啓動圖標時,系統首先會給咱們App分配一個進程,而後在調用咱們的application入口,最後調用咱們的mainActivity的setContentView方法加載佈局文件,最後咱們就能看到咱們的主界面了。ide
而後在application 到MainActivity 之間,還會有一個預顯示窗口,就是出現的黑白屏。
那咱們怎麼優化去除這個惹人厭的黑白屏呢?
咱們先看一下這個黑白屏從哪蹦出來的。
看到了吧,最初咱們可沒有設置這麼個東西,這是系統默認給咱們App設置的,並且是白色的。
知道源頭了,那就開始處理吧
<item name="android:windowBackground">@null</item>
So easy ,就是這麼簡單,你在運行下App,果真黑白屏沒有了,But 是否是有哪不對勁了.
對的,被你發現了,雖然黑白屏沒了,可是咱們的App彷佛是變遲鈍了
你在仔細觀察一下,點擊App啓動圖標後,App彷佛是頓了一下,而後加載了咱們的歡迎頁面,有點像ANR,只不過很短暫 ,可是用戶仍是可以發現的,因此用戶體驗只是比起黑白屏好了那麼一點點而已.
那就,繼續優化唄
<item name="android:windowBackground">@layout/activity_main</item> 或者 <item name="android:windowBackground">@drawable/splash_bg</item>
So easy,又是這麼簡單.對的,就是這麼簡單,這也是目前最認同的方案,稍微有點規模的公司都是採用這種方案來優化的.
But,這裏須要注意的是,放一張圖片的話,須要注意圖片的大小,若是有虛擬導航鍵的話可能會出線底部閃爍問題,解決辦法就是壓縮圖片大小,將圖片轉化成.9.png格式,讓其自適應拉伸.
通常咱們都會重寫本身的Application,而後在onCreate()方法內作一些初始化操做,
通常都是一些第三方SDK配置.
public class App extends Application { @Override public void onCreate() { super.onCreate(); //......初始化第三方SDK } }
在這裏咱們能夠將一些較大的第三方庫放在異步線程中進行初始化
@Override public void onCreate() { super.onCreate(); //懶加載 new Thread(){ @Override public void run() { super.run(); //初始化數據庫 //初始化數據庫 網絡等操做 //......初始化第三方SDK } }.start(); }
須要注意的是,若是涉及到UI操做的話,就不要放在異步線程中去執行,不然可能出Null
那咱們怎麼判斷哪些初始化可以放在異步線程中呢,這個就須要你本身去分辨了,實在不知道就直接丟異步裏,報錯了就再丟出來就好了.
不止是Application中,咱們的activity也能夠用這種方式來進行優化.
以上這種優化也稱爲真優化,對代碼層的優化咱們叫作真優化,而不對代碼層直接操做的咱們稱爲僞優化,通常咱們的優化方案都是兩種混合使用.
在咱們作完上述的優化後,成功進入到主界面後,還沒完.
你可能會發現進入主界面也會出現部分顯示加載問題,具體就須要看你佈局層級的複雜度和界面業務的需求了.若是是複雜頁面,能夠先看看佈局文件層級是否還能夠進行優化,而後在看是否時請求網絡數據太大,例如加載了大圖等. 這時就能夠進去必定的僞優化了.
例如和產品協商在進入頁面時加載一個dialog進行緩衝一下,不少App也是進去這樣的優化,
看看咱們的簡書App就是這樣,我基本每次進去都會彈一個dialog
至此,App啓動優化方案就介紹完了.固然還有更多優化方案,具體的就要根據業務需求而定了
歡迎關注做者darryrzhong,更多幹貨等你來拿喲.
更多精彩文章請關注