天天看點

Android性能優化-啟動優化思想

文章目錄

      • 啟動的分類
        • 冷啟動
        • 熱啟動
        • 溫啟動
      • 啟動相關任務和優化方向
      • 啟動時間測量方式
        • 通過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代碼不能直接用僅供學習)

繼續閱讀