App啓動時間優化
一、首先我們需要清楚App的主題加載
你的App的主題位於
res/values/styles
<style name = "AppTheme" parent = "Theme.AppCompat.Light">
我們點擊Light
主題進去,會發現此主題位於
app/build/intermediates/exploded-oar/com.android.support/appcompat-v7/25.1.0/res/values/values.xml
<style name = "Theme.AppCompat.Light" parent = "Base.Theme.AppCompat.light">
點擊此Light
又會跳到
<style name = "Base.Theme.AppCompat.Light" parent = "Base.v7.Theme.AppCompat.light">
我們點擊後面這個Light
進去又會跳到
<style name = "Base.v7.Theme.AppCompat.Light" parent = "Platform.Theme.AppCompat.light">
在這裏他定義了一個
<item name ="windowNoTitle"> false </item>
這裏有一個非常重要的選項
在他的父類
<style name = "Platform.AppCompat.Light" parent = "android.Theme.light">
中有一個
<item name ="android.windowBackground">@color/background_material_light</item>
而這個color就是白色
在v7包中的color中定義此色
<color name = "background_material_light">@color/material_grey_50 </color>
所以我們可根據windowBackground
去優化App啓動的視覺感官
二、如何解決呢
1> 我們可以在原來的AppTheme
主題下去加一行
<item name = "android : windowIsTransluncent>true</item>
這樣我們在啓動App時回去加載一個透明的背景,當然在用戶層面看到的就是Launcher
桌面,過一會應用纔會加載出來,強行甩鍋給手機系統。
我們在應用啓動後需要還原主題,我們需要在系統主Activity中去加載最開始的主題。
可以在主Activity
的onCreat
方法中去
setTheme(R.style.AppTheme)
這樣在應用加載出來時又恢復了正常,只是手機System
需要背鍋了
2> 如果想要徹底的優化根治app的啓動時間,我們需要更加深入的瞭解app的啓動以及一些測量app啓動的方法
三、如何測啓動一個App的時間
我們如和獲知一個APP的啓動時間呢
1> 我們在用logcat
抓取手機app啓動的日誌中去搜索 “dispaly” 關鍵字可獲取該app的啓動時間
2>可以使用adb命令去啓動主Activity
去獲取該app的啓動時間
adb shell am start -W 包名/+全類名
比如
adb shell am start -W com.lqr.wechat/com.lqr.wechat.activity.SplashActivity
在控制檯打印出日誌中的 ThisTime
就是啓動時間
四、Launcher啓動App的過程
在Launcher
上點擊某個app的圖標會直接調用到am
的startActivity
方法,該方法會將app分爲方法區
,堆區
,java棧
三個部分
ActivityThread
的attach
方法會開啓app,Application
再開啓activity
,在調用attach
後會調用attach Application
遠端進程調用handleBindApplication
去創建App,調用Application
的onCreat
方法也就是ActivityThread
中的mInstrumenttation.callApplicationOnCreat(app)
去啓動
五、找到最耗時的方法
通過檢查trace的方法在主線程中找到最耗時的方法看能否放在子線程中,放在子線程中的方法要複合以下幾個特徵:
1、沒有創建handler
2、沒有繪製UI
3、異步要求不是很高
除此以外如果是單例模式的話可以嘗試用懶漢模式創建,這樣在使用該對象的時候再去創建,節省資源
如果是對啓動頁要求不是很大的情況下可以加入
<item name = "android : windowDisablePreview">true</item>
意思爲設置禁止啓動項