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

系統(tǒng)創(chuàng)建應(yīng)用進(jìn)程時(shí)間我們一般無(wú)法優(yōu)化,這個(gè)是系統(tǒng)創(chuàng)建簡(jiǎn)單的流程

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

然后就可以看到各個(gè)階段的時(shí)間了
3,方案
從調(diào)研冷啟動(dòng)的原理就可以得出,我們要優(yōu)化的地方
1,冷啟動(dòng)白屏現(xiàn)象
冷啟動(dòng)的時(shí)候,我們發(fā)現(xiàn)會(huì)有白屏現(xiàn)象,會(huì)先出現(xiàn)一個(gè)白屏,然后在出現(xiàn)歡迎頁(yè)的UI,這個(gè)跟系統(tǒng)的設(shè)置的背景windowBackground有關(guān)系
解決方案:
在歡迎頁(yè)設(shè)置一個(gè)自定義的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的圖片和歡迎頁(yè)的初始圖片一樣,這樣就可以實(shí)現(xiàn)啟動(dòng)白屏的樣式 和歡迎頁(yè)樣式一樣,給人沒(méi)有白屏的感覺(jué)
2,啟動(dòng)時(shí)間優(yōu)化
我們從上面的啟動(dòng)時(shí)間就可以知道
1,Application onCreate中初始化三方sdk耗時(shí)
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,首頁(yè)耗時(shí)方法
到首頁(yè)的時(shí)候,我們埋點(diǎn)的時(shí)間,小于用戶看到數(shù)據(jù)的時(shí)間 這個(gè)是因?yàn)槭醉?yè)加載的數(shù)據(jù)比較多 我們首頁(yè)同時(shí)加載了7個(gè)Fragment,同時(shí)請(qǐng)求10個(gè)以上接口
1,首頁(yè)做懶加載,保證App啟動(dòng)接口只請(qǐng)求3個(gè)左右
2,首頁(yè)UI優(yōu)化,同時(shí)顯示出ui以后在執(zhí)行后面邏輯處理
3,首頁(yè)部分不重要邏輯做延時(shí)加載,比如請(qǐng)求升級(jí)彈窗等
總結(jié)
到此這篇關(guān)于關(guān)于Android冷啟動(dòng)耗時(shí)優(yōu)化詳解的文章就介紹到這了,更多相關(guān)Android冷啟動(dòng)優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Android 全局彈出對(duì)話框SYSTEM_ALERT_WINDOW權(quán)限
本篇文章主要介紹了詳解Android 全局彈出對(duì)話框SYSTEM_ALERT_WINDOW權(quán)限,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Android Studio 實(shí)現(xiàn)文檔注釋的快捷鍵
這篇文章主要介紹了Android Studio 實(shí)現(xiàn)文檔注釋的快捷鍵,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Android實(shí)現(xiàn)仿網(wǎng)易新聞的頂部導(dǎo)航指示器
這篇文章主要介紹了Android實(shí)現(xiàn)仿網(wǎng)易新聞的頂部導(dǎo)航指示器的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
Android實(shí)現(xiàn)控件的縮放移動(dòng)功能
這篇文章主要介紹了android控件的縮放,移動(dòng)功能,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2018-01-01
淺談Android Studio 4.1 更新內(nèi)容
這篇文章主要介紹了淺談Android Studio 4.1 更新內(nèi)容,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Android仿QQ長(zhǎng)按彈出刪除復(fù)制框
這篇文章主要為大家詳細(xì)介紹了Android仿QQ長(zhǎng)按彈出刪除、復(fù)制、轉(zhuǎn)發(fā)框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android中毛玻璃效果的兩種實(shí)現(xiàn)代碼
這篇文章主要介紹了Android中毛玻璃效果的兩種實(shí)現(xiàn)代碼,第一種是使用JAVA算法FastBlur實(shí)現(xiàn),第二種是使用Android自帶類RenderScript 實(shí)現(xiàn),本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧2024-08-08

