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

系列文:

  1. 背景:Android App優化, 要怎么做?
  2. Android App優化之性能分析工具
  3. Android App優化之提升你的App啟動速度之理論基礎
  4. Android App優化之提升你的App啟動速度之實例挑戰
  5. Android App優化之Layout怎么擺
  6. Android App優化之ANR詳解
  7. Android App優化之消除卡頓
  8. Android App優化之內存優化
  9. Android App優化之持久電量
  10. Android 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啟動過程中哪些地方容易阻塞, 還知道了用什么工具來分析每個方法的執行時間, 那么接下來就很容易做了.

下一篇將完全以實例的方式來說明App啟動優化該怎么分析, 怎么做.
請關注系列文~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容