天天看點

APP性能優化之啟動速度

簡述:

APP的啟動流程:

  1. 加載啟動App
  2. App啟動之後立即展示出一個空白的Window
  3. 建立App的程序
  4. 建立App對象啟
  5. 動Main Thread創
  6. 建啟動的Activity對象
  7. 加載View
  8. 布置螢幕
  9. 進行第一次繪制

作為普通應用,App程序的建立等環節我們是無法主動控制的,可以優化的也就是Application、Activity建立以及回調等過程

Google給出的啟動加速的方向:

  1. 利用提前展示出來的Window,快速展示出來一個界面,給使用者快速回報的體驗;
  2. 避免在啟動時做密集沉重的初始化(Heavy app initialization);
  3. 定位問題:避免I/O操作、反序列化、網絡操作、布局嵌套等。

    備注:方向1屬于治标不治本,隻是表面上快;方向2、3可以真實的加快啟動速度。

綜上所述,應用的啟動性能主要問題在以下兩方面:

1)Application 初始化開銷大

Application 的建立過程中,如果執行複雜的邏輯或者初始化大量的對象,将會影響應用的啟動體驗。比如:

  • 初始化 MainActivity 的狀态資訊;
  • 建立了大量臨時變量導緻 GC(GC 在 ART 下影響很小);
  • 執行磁盤 I/O操作(這甚至就會直接阻塞應用的執行);
  • 反序列化操作;
  • 多重循環等等。

2)Activity 初始化開銷大

Activity 的建立中除了要避免 Application 建立中提到的問題,還需要注意以下問題:

  • 加載極其複雜的布局主線
  • 程中出現磁盤或網絡 I/O
  • 加載和解碼 Bitmap
  • 渲染多個 VectorDrawable 對象

常用解決方法:

  1. 層次過深:

    減少備援、嵌套的布局層次。

    不繪制不可見的 UI,而是使用 ViewStub 對象在适當的時間布局繪制。

  2. 大量的資源初始化:

    調整資源初始化的位置,可以在不同的線程執行懶加載。

    延遲初始化元件、操作;

    加載部分視圖,然後再加載大的位圖和其他資源。

    使用網絡資料緩存,對于多個接口的同時通路,可以合并

  3. 啟動界面:

    使用 Activity 的 windowBackground 屬性

    使用閃屏頁

  4. 去掉無用代碼、重複邏輯等
  5. 巧用線程:ThreadPoolExecutor比Thread更加高效、優勢明顯,但是特定場景下單個時間點的表現Thread會比ThreadPoolExecutor好:同樣的建立對象,ThreadPoolExecutor的開銷明顯比Thread大;

其他優化,請參考文章:

android性能優化之布局優化

android性能優化之記憶體優化