關(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)用進(jìn)程,那么系統(tǒng)會重新創(chuàng)建一個進(jìn)程分配給該應(yīng)用,這種啟動方式就是冷啟動
2,熱啟動:如果App啟動時,后臺有該應(yīng)用進(jìn)程,那么系統(tǒng)就是直接使用已有進(jìn)程
從兩種啟動方式的含義就可以看出,冷啟動比較耗時,熱啟動一般比較快,我們要做的啟動優(yōu)化一般做的就是冷啟動優(yōu)化
2.2,冷啟動流程
系統(tǒng)創(chuàng)建應(yīng)用進(jìn)程時間我們一般無法優(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)建一個進(jìn)程,然后創(chuàng)建Application,系統(tǒng)創(chuàng)建進(jìn)程的過程,我們可以在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)機(jī)界面實現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android仿蘋果關(guān)機(jī)界面的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09android實現(xiàn)動態(tài)顯示隱藏進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了android實現(xiàn)動態(tài)顯示隱藏進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08Android中控件GridView實現(xiàn)設(shè)置行列分割線的方法示例
這篇文章主要介紹了利用Android中控件GridView實現(xiàn)設(shè)置行列分割線的方法,文中給出了詳細(xì)的介紹與示例代碼,相信對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。2017-01-01Android應(yīng)用中使用Fragment組件的一些問題及解決方案總結(jié)
這里我們講的Fragment主要探討的是support庫中的Fragment,包括Fragment常遇到的crash崩潰問題,嵌套Fragment收不到onActivityResult()回調(diào)以及一些常用tips等,需要的朋友可以參考下2016-05-05