Android 性能優化系列二 : App啓動優化

前言

本篇文章主要針對 Android性能優化 中App的啓動優化java

App啓動,相信你們都是很是熟悉了,那爲什麼咱們須要對App啓動作優化呢,這裏就要先對咱們Android 從開機到啓動咱們的App進入主頁面這一流程作一個簡單的闡述了.android

1、Android啓動流程

咱們先來看一張流程圖數據庫

Android啓動流程.png

首先呢,咱們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主頁面).網絡

2、App啓動時黑白屏問題

基於以上的啓動流程 ,那麼App啓動優化的第一步就是從系統標識入手,咱們手機開機時通常最早出現的是手機廠商的logo標識,而App啓動時會先調用一個預顯示窗口,這個窗口的樣式通常是黑色或者白色,因此也就出現了App啓動時出現短暫的黑白屏問題,app

流程以下:異步

Application > onCreate > MainActivity > onCreate > windows > setContentView> layout

在咱們點擊桌面App啓動圖標時,系統首先會給咱們App分配一個進程,而後在調用咱們的application入口,最後調用咱們的mainActivity的setContentView方法加載佈局文件,最後咱們就能看到咱們的主界面了。ide

而後在application 到MainActivity 之間,還會有一個預顯示窗口,就是出現的黑白屏。

那咱們怎麼優化去除這個惹人厭的黑白屏呢?

咱們先看一下這個黑白屏從哪蹦出來的。

AppTheme.png

image.png

image.png

看到了吧,最初咱們可沒有設置這麼個東西,這是系統默認給咱們App設置的,並且是白色的。

知道源頭了,那就開始處理吧

1.能夠將背景設置爲透明

<item name="android:windowBackground">@null</item>

So easy ,就是這麼簡單,你在運行下App,果真黑白屏沒有了,But 是否是有哪不對勁了.
對的,被你發現了,雖然黑白屏沒了,可是咱們的App彷佛是變遲鈍了

你在仔細觀察一下,點擊App啓動圖標後,App彷佛是頓了一下,而後加載了咱們的歡迎頁面,有點像ANR,只不過很短暫 ,可是用戶仍是可以發現的,因此用戶體驗只是比起黑白屏好了那麼一點點而已.

那就,繼續優化唄

2.給背景設置一張圖片或者xml佈局文件

<item name="android:windowBackground">@layout/activity_main</item>
    
   或者

  <item name="android:windowBackground">@drawable/splash_bg</item>

So easy,又是這麼簡單.對的,就是這麼簡單,這也是目前最認同的方案,稍微有點規模的公司都是採用這種方案來優化的.

But,這裏須要注意的是,放一張圖片的話,須要注意圖片的大小,若是有虛擬導航鍵的話可能會出線底部閃爍問題,解決辦法就是壓縮圖片大小,將圖片轉化成.9.png格式,讓其自適應拉伸.

3、onCreate()優化

通常咱們都會重寫本身的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也能夠用這種方式來進行優化.

以上這種優化也稱爲真優化,對代碼層的優化咱們叫作真優化,而不對代碼層直接操做的咱們稱爲僞優化,通常咱們的優化方案都是兩種混合使用.

4、僞優化

在咱們作完上述的優化後,成功進入到主界面後,還沒完.

你可能會發現進入主界面也會出現部分顯示加載問題,具體就須要看你佈局層級的複雜度和界面業務的需求了.若是是複雜頁面,能夠先看看佈局文件層級是否還能夠進行優化,而後在看是否時請求網絡數據太大,例如加載了大圖等. 這時就能夠進去必定的僞優化了.

例如和產品協商在進入頁面時加載一個dialog進行緩衝一下,不少App也是進去這樣的優化,

看看咱們的簡書App就是這樣,我基本每次進去都會彈一個dialog

image.png

至此,App啓動優化方案就介紹完了.固然還有更多優化方案,具體的就要根據業務需求而定了

歡迎關注做者darryrzhong,更多幹貨等你來拿喲.

請賞個小紅心!由於你的鼓勵是我寫做的最大動力!

更多精彩文章請關注
相關文章
相關標籤/搜索