Android端應用秒開優化體驗
前言
最近部門內丟擲了一個問題,應用啟動很慢、卡圖示?主要表現在中低端機型中。究其這個問題,由於對效能優化比較感興趣,借了個低端機和一箇中端機來一看究竟,對同一應用分別測了下它在中低端機的啟動時間,下面為啟動耗時情況:
啟動了三次,基本都在4s左右。
原因
究其原因,主要因素是任務在介面繪製前過於集中化。
應用啟動過程從使用者點選launcher圖示到看到第一幀這個過程中,主要會經過以下這些過程:
main()->Application:attachBaseContext()->onCreate()->Activity:onCreate()->onStart()->onPostCreate()->onResume()->onPostResume()
而一般我們的初始化任務主要都會集中化在Application:onCreate()方法中,這就使得初始化任務在第一幀繪製之前得完成,這就造成了卡圖示、應用啟動慢。那麼把任務打散呢?分散在LaunchActivity中去分段初始化?還是不行的,因為介面開始繪製是在onResume()方法開始後才開始繪製,所以,得從Activity的建立過程找辦法。
main->Activity建立的這個過程會經過一系列framework層的操作,這些操作都是系統自動執行的,不易進行優化,不過可以在Activity建立這個過程前後來找一些蛛絲馬跡,因為Activity的建立都會輾轉到ActivityThread:performLaunchActivity()這個方法中,在這個方法中可以知道這麼幾件事:
1、先通過Instrumentation:newActivity()來建立一個Activity例項
2、再判斷Application例項是否已建立,已建立則直接返回,否則呼叫
Instrumentation:newApplication()來建立Application例項,在這個過程中會依次執行attachBaseContext()和onCreate()方法
3、之後Activity:attach()方法會建立一個PhoneWindow物件,它就是介面,它有一個DecorView,呼叫setContentView()時會給配置DecorView,其中就會設定一個背景:
我們的View也是add進DecorView中顯示,它作為RootView肯定是最先顯示,所以可以給它設定個預設背景
4、最後依次呼叫Activity的onCreate、onStart等方法
措施
1、任務分級
2、任務並行
3、介面預顯示
對於任務集中初始化化、耗時初始化原因導致應用在中低端機啟動過慢,而Activity介面繪製的時機導致簡單的將任務分給Activity初始化也不起作用,我們必須找一個切入點
介面的建立和介面的繪製,這兩個過程第一個是Application的attachBaseConte和onCreate這兩個方法影響的,第二個則是Application建立一直到介面繪製
所以,可以對任務進行分級的臨界點可以這樣分:
1、CoreSDK——Application的建立
2、HighPrioritySDK——Activity的建立
3、LowPrioritySDK——Activity介面完成繪製
4、AsyncSDK——Activity的建立
如圖:
對任務這樣分級後,測了一下,應用的啟動即使在低端機上,也能秒開:
分級帶來的問題
正常啟動過程那肯定是沒問題的,不過有這麼幾種場景:
1、App切回後臺,記憶體不足導致Application被回收,從最近任務列表中恢復介面時Application需重新建立
2、應用沒掛起時,Push推送需從Notification跳入應用內某介面
3、應用沒掛起時,瀏覽器外鏈需跳入應用內某介面
這些Case可能導致的問題是被跳入的介面使用到了未初始化的SDK,可能導致Crash或者資料異常,所以目標頁面啟動前必須確保SDK已經初始化,這個過程的原因是沒有喚起啟動頁來初始化SDK,可以通過hook newActivity解決。
public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException { if (InitializeOptimizer.isApplicationCreated() && (InitializeUtil.isOuterChainIntent(intent) || InitializeUtil.isNotificationIntent(intent)) && (!InitializeOptimizer.isHighSDKInitialized() || !InitializeOptimizer.isLowSDKInitialized() || !InitializeOptimizer.isAsyncSDKInitialized())) { InitializeOptimizer.setApplicationCreated(false); intent.addCategory(InitializeUtil.INITIALIZE_CATEGORY); return (Activity) cl.loadClass(InitializeOptimizer.getLaunchClassName()).newInstance(); } InitializeOptimizer.setApplicationCreated(false); return super.newActivity(cl, className, intent); }
相關文章
- 【效能優化】秒殺系統效能優化初體驗優化
- Android應用記憶體優化方式Android記憶體優化
- Android應用優化之記憶體概念Android優化記憶體
- Android開發者峰會:Android應用效能優化經驗分享Android優化
- 分析並優化 Android 應用記憶體佔用優化Android記憶體
- Android應用優化方案Android優化
- 教你嚐鮮「快應用」!體驗秒開,如絲般順滑!
- Android應用開發效能優化系列總篇Android優化
- Android應用優化之冷啟動優化Android優化
- Android應用優化之流暢度Android優化
- 《Android應用效能優化》 書評Android優化
- android 應用記憶體優化之OnLowMemory&OnTrimMemoryAndroid記憶體優化
- 6s到1s: 雙端應用的秒開最佳化之路
- 視訊直播秒開背後的技術與優化經驗優化
- Android效能優化之App應用啟動分析與優化Android優化APP
- Android開發優化之——對Bitmap的記憶體優化Android優化記憶體
- Android應用優化之流暢度實操Android優化
- Android App應用啟動分析與優化AndroidAPP優化
- 《Android應用效能優化》編輯手記Android優化
- 向OTA看齊酒店應如何優化數字化體驗?優化
- Android學習之 記憶體管理機制與應用記憶體優化Android記憶體優化
- Android效能優化 - 記憶體優化Android優化記憶體
- 安卓應用效能除錯和優化經驗分享安卓除錯優化
- Webpack按需載入秒開應用Web
- [譯] 如何優化您的 Android 應用(Go 版)優化AndroidGo
- Android效能優化之加快應用啟動速度Android優化
- MySQL應用優化MySql優化
- HiveQL應用體驗Hive
- 有道詞典Android客戶端包體積優化之路Android客戶端優化
- Android 效能優化之記憶體優化Android優化記憶體
- .NET MAUI 安卓應用開發初體驗UI安卓
- App Annie :應用商店優化 (ASO) – 優化應用商店頁面APP優化
- Android記憶體優化Android記憶體優化
- Android 記憶體優化Android記憶體優化
- android開發實現記憶體優化功能Android記憶體優化
- 互動體驗優化:4步讓移動網站看起來像本地應用優化網站
- [原]Android開發優化-Adapter優化Android優化APT
- Android 應用構建速度提升Gradle配置優化AndroidGradle優化