系列文:
- 背景:Android App優化, 要怎么做?
- Android App優化之性能分析工具
- Android App優化之提升你的App啟動速度之理論基礎
- Android App優化之提升你的App啟動速度之實例挑戰
- Android App優化之Layout怎么擺
- Android App優化之ANR詳解
- Android App優化之消除卡頓
- Android App優化之內存優化
- Android App優化之持久電量
- Android App優化之如何高效網絡請求
1, 欲善其事, 先利其器
論語有云: 工欲善其事,必先利其器. 要想提升App的啟動速度, 我們需要先找到拖后腿的點, 要想找到這些點, 我們就需要借助我們的工具了.
前文提到了很多工具, 今天我們使用Traceview來分析我們的啟動過程.
1.1 Traceview介紹
Traceview是一個性能分析工具, 主要是分析當前線程情況, 各個方法執行時間等. 如下:
指標說明:
- Incl(Inclusive) Cpu Time
方法本身和其調用的所有子方法占用CPU時間. - Excl(Exclusive) Cpu Time
方法本身占用CPU時間. - Incl Real Time
方法(包含子方法)開始到結束用時. - Excl Real Time
方法本身開始到結束用時. - Call + Recursion Calls/Total
方法被調用次數 + 方法被遞歸調用次數. - Cpu Time/Call
方法調用一次占用CPU時間. - Real Time/Call
方法調用一次實際執行時間.
一般來說, 我們使用Real Time/Call排序來找出耗時多的方法
有必要解釋下CPU Time和Real Time:
CPU Time 方法實際執行時間(不包括io等待時間)
Real Time 方法開始結束時間差(包括等待時間)
參考:http://stackoverflow.com/questions/15760447/what-is-the-meaning-of-incl-cpu-time-excl-cpu-time-incl-real-cpu-time-excl-re/17902682#17902682
1.2 Traceview使用
有兩種方式來使用Traceview:
1, 通過DDMS:
點擊開始時會彈出一個選擇trace模式的框, 默認選中"Sample based profiling"即可:
Sample based profiling(基于樣本分析)
根據采樣時間間隔來規律的打斷VM來記錄方法調用棧(Call Stack), 開銷和采樣頻率成比例.Trace based profiling(基于完整trace數據分析)
記錄每個方法的出入口, 每個方法執行時都開啟記錄, 無論多小的方法, 因此開銷很大.
2, 使用代碼:
// 在自己想要開始調試的地方start
Debug.startMethodTracing("GithubApp");
// 在合適的地方stop
Debug.stopMethodTracing();
注: 以上方法開啟trace的方式相當于"Trace based profiling", 會記錄每個方法的執行. Android 4.4及以上可以調用startMethodTracingSampling()來用代碼開啟"Sample based profiling"的trace方式.
2, App啟動流程分析
要想優化App啟動流程, 必先了解其啟動過程.
具體過程請參看這篇譯文: Android Application啟動流程分析.
3, App啟動方式
通常來說, 一個App啟動也會分如下三中不同的狀態:
-
冷啟動
App沒有啟動過或App進程被killed, 系統中不存在該App進程, 此時啟動App即為冷啟動.
冷啟動的流程即為第2節所描述的App啟動流程的全過程, 需要創建App進程, 加載相關資源, 啟動Main Thread, 初始化首屏Activity等.在這個過程中, 屏幕會顯示一個空白的窗口(顏色基于主題), 直至首屏Activity完全啟動.
下圖展示了冷啟動的時間線:
code start -
熱啟動
熱啟動意味著你的App進程只是處于后臺, 系統只是將其從后臺帶到前臺, 展示給用戶.類同與冷啟動, 在這個過程中, 屏幕會顯示一個空白的窗口(顏色基于主題), 直至activity渲染完畢.
-
溫啟動
介于冷啟動和熱啟動之間, 一般來說在以下兩種情況下發生:- 用戶back退出了App, 然后又啟動. App進程可能還在運行, 但是activity需要重建.
- 用戶退出App后, 系統可能由于內存原因將App殺死, 進程和activity都需要重啟, 但是可以在onCreate中將被動殺死鎖保存的狀態(saved instance state)恢復.
通過三種啟動狀態的相關描述, 可以看出我們要做的啟動優化其實就是針對冷啟動. 熱啟動和溫啟動都相對較快.
4, 哪些地方是App快速啟動的敵人
根據冷啟動的時間圖, 可以看出, 對于App來說, 我們可以控制的啟動時間線的點無外乎:
- Application的onCreate
- 首屏Activity的渲染
而我們現在的App動不動集成了很多第三方服務, 啟動時需要檢查廣告, 注冊狀態等等一系列接口都是在Application的onCreate或是首屏的onCreate中做的.
很多第三方平臺的SDK文檔也都是這么建議的.
5, 結語
明白了App的啟動原理, 也知道了App啟動過程中哪些地方容易阻塞, 還知道了用什么工具來分析每個方法的執行時間, 那么接下來就很容易做了.
下一篇將完全以實例的方式來說明App啟動優化該怎么分析, 怎么做.
請關注系列文~