網站首頁 編程語言 正文
1,背景
最近開發了一個新的App,前期工期緊,做的比較粗放,上線以后發現App啟動時間比較長,達到3秒,
啟動有白屏,體驗也不好,這個只能后期優化了,最好是前期開發就考慮的
2,調研
2.1,Android中啟動的方式
1,冷啟動:如果App啟動時,后臺沒有該應用進程,那么系統會重新創建一個進程分配給該應用,這種啟動方式就是冷啟動
2,熱啟動:如果App啟動時,后臺有該應用進程,那么系統就是直接使用已有進程
從兩種啟動方式的含義就可以看出,冷啟動比較耗時,熱啟動一般比較快,我們要做的啟動優化一般做的就是冷啟動優化
2.2,冷啟動流程
系統創建應用進程時間我們一般無法優化,這個是系統創建簡單的流程
我們可以優化的地方就是
1,Application
2,SplashActivity
3,MainActivity
2.3,啟動時間
1,通過命令
adb shell am start -W [packageName]/[packageName.MainActivity]
這個時候,如果啟動的activity在Manifest中沒有設置export:true,可能無法通過命令打開,需要設置這個
2,自己埋點
從上面的啟動過程就可以知道,Android冷啟動,系統要先創建一個進程,然后創建Application,系統創建進程的過程,我們可以在Application的attachBaseContext方法中開始埋點
/** * 統計冷啟動各個時間點的耗時 */ public class StartLogHelper { private static final String TAG = "StartLogHelper"; private static long startTime; /** * 設置開始時間,暫時放到啟動的時間,放到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日志中輸入應用的包名
然后就可以看到各個階段的時間了
3,方案
從調研冷啟動的原理就可以得出,我們要優化的地方
1,冷啟動白屏現象
冷啟動的時候,我們發現會有白屏現象,會先出現一個白屏,然后在出現歡迎頁的UI,這個跟系統的設置的背景windowBackground有關系
解決方案:
在歡迎頁設置一個自定義的theme屬性
SplashActivity的清單文件設置 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的圖片和歡迎頁的初始圖片一樣,這樣就可以實現啟動白屏的樣式 和歡迎頁樣式一樣,給人沒有白屏的感覺
2,啟動時間優化
我們從上面的啟動時間就可以知道
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中同步執行的放到一起
可以異步執行的放到一起
2,首頁耗時方法
到首頁的時候,我們埋點的時間,小于用戶看到數據的時間 這個是因為首頁加載的數據比較多 我們首頁同時加載了7個Fragment,同時請求10個以上接口
1,首頁做懶加載,保證App啟動接口只請求3個左右
2,首頁UI優化,同時顯示出ui以后在執行后面邏輯處理
3,首頁部分不重要邏輯做延時加載,比如請求升級彈窗等
總結
原文鏈接:https://blog.csdn.net/dongrimaomaoyu/article/details/122482161
相關推薦
- 2022-08-30 C語言深入詳解四大內存函數的使用_C 語言
- 2021-10-24 Linux多線程中fork與互斥鎖過程示例_Linux
- 2022-08-11 C#中using關鍵字的使用方法示例_C#教程
- 2022-06-14 C#實現FTP上傳文件的方法_C#教程
- 2023-01-26 Python?asyncore?socket客戶端實現方法詳解_python
- 2023-10-11 MyBatis-plus wrapper.and用法 | apply
- 2023-07-27 express 請求方式(常用) / 不完整請求路徑
- 2022-02-16 Uncaught RangeError: Maximum call stack size excee
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支