App優化之提升你的App啓動速度之理論基礎

1, 欲善其事, 先利其器

論語有云: 工欲善其事,必先利其器. 要想提升App的啓動速度, 我們需要先找到拖後腿的點, 要想找到這些點, 我們就需要藉助我們的 工具 了.

前文 提到了很多工具, 今天我們使用Traceview來分析我們的啓動過程.

1.1 Traceview介紹

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: 


start traceview

點擊開始時會彈出一個選擇trace模式的框, 默認選中"Sample based profiling"即可:


traceview option
  • 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啓動過程中哪些地方容易阻塞, 還知道了用什麼工具來分析每個方法的執行時間, 那麼接下來就很容易做了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章