關(guān)于Android冷啟動耗時優(yōu)化詳解
1,背景
最近開發(fā)了一個新的App,前期工期緊,做的比較粗放,上線以后發(fā)現(xiàn)App啟動時間比較長,達(dá)到3秒,
啟動有白屏,體驗也不好,這個只能后期優(yōu)化了,最好是前期開發(fā)就考慮的
2,調(diào)研
2.1,Android中啟動的方式
1,冷啟動:如果App啟動時,后臺沒有該應(yīng)用進程,那么系統(tǒng)會重新創(chuàng)建一個進程分配給該應(yīng)用,這種啟動方式就是冷啟動
2,熱啟動:如果App啟動時,后臺有該應(yīng)用進程,那么系統(tǒng)就是直接使用已有進程
從兩種啟動方式的含義就可以看出,冷啟動比較耗時,熱啟動一般比較快,我們要做的啟動優(yōu)化一般做的就是冷啟動優(yōu)化
2.2,冷啟動流程

系統(tǒng)創(chuàng)建應(yīng)用進程時間我們一般無法優(yōu)化,這個是系統(tǒng)創(chuàng)建簡單的流程

我們可以優(yōu)化的地方就是
1,Application
2,SplashActivity
3,MainActivity
2.3,啟動時間
1,通過命令
adb shell am start -W [packageName]/[packageName.MainActivity]
這個時候,如果啟動的activity在Manifest中沒有設(shè)置export:true,可能無法通過命令打開,需要設(shè)置這個
2,自己埋點
從上面的啟動過程就可以知道,Android冷啟動,系統(tǒng)要先創(chuàng)建一個進程,然后創(chuàng)建Application,系統(tǒng)創(chuàng)建進程的過程,我們可以在Application的attachBaseContext方法中開始埋點
/**
* 統(tǒng)計冷啟動各個時間點的耗時
*/
public class StartLogHelper {
private static final String TAG = "StartLogHelper";
private static long startTime;
/**
* 設(shè)置開始時間,暫時放到啟動的時間,放到Application的attachBaseContext方法中
* @param start
*/
public static void setStart(long start){
startTime = start;
}
/**
* application初始化的時間,放到Application的onCreate方法最后
*/
public static void getApplicationTime(){
long end = System.currentTimeMillis();
DebugLog.e(TAG,"==================getApplicationTime==" + (end - startTime));
}
/**
* 歡迎頁初始化的時間
*/
public static void getWelcomeTime(){
long end = System.currentTimeMillis();
DebugLog.e(TAG,"==================getWelcomeTime==" + (end - startTime));
}
/**
* Main頁面初始化的時間
*/
public static void getMainTime(){
long end = System.currentTimeMillis();
DebugLog.e(TAG,"==================getMainTime==" + (end - startTime));
}
3,在studio的logcat日志中
在logcat日志中輸入應(yīng)用的包名

然后就可以看到各個階段的時間了
3,方案
從調(diào)研冷啟動的原理就可以得出,我們要優(yōu)化的地方
1,冷啟動白屏現(xiàn)象
冷啟動的時候,我們發(fā)現(xiàn)會有白屏現(xiàn)象,會先出現(xiàn)一個白屏,然后在出現(xiàn)歡迎頁的UI,這個跟系統(tǒng)的設(shè)置的背景windowBackground有關(guān)系
解決方案:
在歡迎頁設(shè)置一個自定義的theme屬性
SplashActivity的清單文件設(shè)置
android:theme="@style/SplashScreenTheme”
SplashScreenTheme屬性定義
<style name="SplashScreenTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/bg_splash</item>
</style>
bg_splash定義
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<bitmap
android:antialias="true"
android:gravity="center"
android:src="@drawable/bg_show" />
</item>
</layer-list>
其中bg_show的圖片和歡迎頁的初始圖片一樣,這樣就可以實現(xiàn)啟動白屏的樣式 和歡迎頁樣式一樣,給人沒有白屏的感覺
2,啟動時間優(yōu)化
我們從上面的啟動時間就可以知道
1,Application onCreate中初始化三方sdk耗時
public class AppConfigHelper {
public void setAppConfig(Application application){
addSyncTask(application);
addAsyncTask(application);
TaskConfigManager.getInstance().startInit();
}
private void addSyncTask(Application application) {
TaskConfigManager.getInstance().addTask(new ZMLTask("oneLogin") {
@Override
public void run() {
JVerifyHelper.init(application);
}
});
}
}
把需要在Application中同步執(zhí)行的放到一起
可以異步執(zhí)行的放到一起
2,首頁耗時方法
到首頁的時候,我們埋點的時間,小于用戶看到數(shù)據(jù)的時間 這個是因為首頁加載的數(shù)據(jù)比較多 我們首頁同時加載了7個Fragment,同時請求10個以上接口
1,首頁做懶加載,保證App啟動接口只請求3個左右
2,首頁UI優(yōu)化,同時顯示出ui以后在執(zhí)行后面邏輯處理
3,首頁部分不重要邏輯做延時加載,比如請求升級彈窗等
總結(jié)
到此這篇關(guān)于關(guān)于Android冷啟動耗時優(yōu)化詳解的文章就介紹到這了,更多相關(guān)Android冷啟動優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android仿蘋果關(guān)機界面實現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android仿蘋果關(guān)機界面的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09
Android中控件GridView實現(xiàn)設(shè)置行列分割線的方法示例
這篇文章主要介紹了利用Android中控件GridView實現(xiàn)設(shè)置行列分割線的方法,文中給出了詳細(xì)的介紹與示例代碼,相信對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。2017-01-01
Android應(yīng)用中使用Fragment組件的一些問題及解決方案總結(jié)
這里我們講的Fragment主要探討的是support庫中的Fragment,包括Fragment常遇到的crash崩潰問題,嵌套Fragment收不到onActivityResult()回調(diào)以及一些常用tips等,需要的朋友可以參考下2016-05-05

