簡述:
APP的啟動流程:
- 加載啟動App
- App啟動之後立即展示出一個空白的Window
- 建立App的程序
- 建立App對象啟
- 動Main Thread創
- 建啟動的Activity對象
- 加載View
- 布置螢幕
- 進行第一次繪制
作為普通應用,App程序的建立等環節我們是無法主動控制的,可以優化的也就是Application、Activity建立以及回調等過程
Google給出的啟動加速的方向:
- 利用提前展示出來的Window,快速展示出來一個界面,給使用者快速回報的體驗;
- 避免在啟動時做密集沉重的初始化(Heavy app initialization);
-
定位問題:避免I/O操作、反序列化、網絡操作、布局嵌套等。
備注:方向1屬于治标不治本,隻是表面上快;方向2、3可以真實的加快啟動速度。
綜上所述,應用的啟動性能主要問題在以下兩方面:
1)Application 初始化開銷大
Application 的建立過程中,如果執行複雜的邏輯或者初始化大量的對象,将會影響應用的啟動體驗。比如:
- 初始化 MainActivity 的狀态資訊;
- 建立了大量臨時變量導緻 GC(GC 在 ART 下影響很小);
- 執行磁盤 I/O操作(這甚至就會直接阻塞應用的執行);
- 反序列化操作;
- 多重循環等等。
2)Activity 初始化開銷大
Activity 的建立中除了要避免 Application 建立中提到的問題,還需要注意以下問題:
- 加載極其複雜的布局主線
- 程中出現磁盤或網絡 I/O
- 加載和解碼 Bitmap
- 渲染多個 VectorDrawable 對象
常用解決方法:
-
層次過深:
減少備援、嵌套的布局層次。
不繪制不可見的 UI,而是使用 ViewStub 對象在适當的時間布局繪制。
-
大量的資源初始化:
調整資源初始化的位置,可以在不同的線程執行懶加載。
延遲初始化元件、操作;
加載部分視圖,然後再加載大的位圖和其他資源。
使用網絡資料緩存,對于多個接口的同時通路,可以合并
-
啟動界面:
使用 Activity 的 windowBackground 屬性
使用閃屏頁
- 去掉無用代碼、重複邏輯等
- 巧用線程:ThreadPoolExecutor比Thread更加高效、優勢明顯,但是特定場景下單個時間點的表現Thread會比ThreadPoolExecutor好:同樣的建立對象,ThreadPoolExecutor的開銷明顯比Thread大;
其他優化,請參考文章:
android性能優化之布局優化
android性能優化之記憶體優化