文章目錄
-
-
- 啟動的分類
-
- 冷啟動
- 熱啟動
- 溫啟動
- 啟動相關任務和優化方向
- 啟動時間測量方式
-
- 通過adb指令
- 代碼打點的方式
- 優化思路(重點)
- 提供一個java項目學習優化思想( IEDA項目)
-
啟動的分類
冷啟動
- 冷啟動的耗時最多,基本啟動流程如下:
熱啟動
- 熱啟動最快;因為沒有 application的建立,也沒有那麼多的生命周期的調用。
- 流程如下:
溫啟動
- 較快。介于冷啟動和熱啟動之間的速度。它隻會重新走Activity建立的過程,不會走程序建立和application的建立過程。
啟動相關任務和優化方向
- 冷啟動之前的相關任務
這幾項都是系統的任務,我們很難幹預
- 啟動app
- 加載空白window
- 建立程序
- 随後任務
這幾項都是系統的任務,我們很難幹預
- 建立application
- 啟動主線程
- 建立MainActivity
- 加載布局
- 布置螢幕
- 首幀繪制
- 優化方向
Application 和 Activity 生命周期相關方向
啟動時間測量方式
通過adb指令
adb shell am start -W [PackageName]/com.[packageName].SplashActivity
注意:前面部分時你的 applicationId 在 gradle中配置的 ,測試的就是debug的id,release的就是release的。後面是你對應啟動activity的package+activity具體路徑(必須是在AndroidManifest.xml中配置了如下配置)
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
代碼打點的方式
- 代碼打點可以考慮的點
- Application 的 attachBaseContext 作為開始點
- 第一個展示頁面 onResume 使用者可以互動為止
- 或者首個頁面view開始繪制為止可以通過 View.OnPreDrawListener 或 addOnDrawListener 監聽
優化思路(重點)
- 網上找了一張圖 基本上就是這個思想來優化啟動速度
Android性能優化-啟動優化思想 - 代碼檢測耗時可以考慮的點
- 盡量減少代碼侵入;可以通過 AOP 思想設計架構(通過AspectJ注解方式 或者 動态代理等思想)
- 線下可以通過工具來分析 TraceView;Systrace;AS的Profile等工具檢測耗時的點;
- 通過adb直接擷取代碼執行時間的方式也可以粗略檢測時間;但是實際意義不大,不太靠譜。
- 總結優化部分:
- 充分CPU并發性能,現在的裝置基本都是多核的。可以根據CPU核數設計線程池。
- 為了代碼簡潔耦合度低,封裝任務啟動方式;
- 異步執行前需要考慮任務和任務之間是否有依賴關系
- 考慮可以切換線程池(切換IO密集型線程池還是計算密集型,還是必須new Thread)
- 是否必須主線程執行任務
- 可以在啟動CPU使用率比較低的地方初始化SharedPreferences
- 可以通過 IdleHandler 在使用者無操作時執行一些不重要任務,避免和主要任務搶占資源
- 可以通過Theme主題,讓項目啟動跳轉沒有空白頁的感覺,從視覺效果讓使用者體驗更好
提供一個java項目學習優化思想( IEDA項目)
點選跳轉(java代碼不能直接用僅供學習)