iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
Mobile Development

Android 性能戰爭:從 Profiler 開始的 30 天優化實錄系列 第 8

# Day 8:【啟動戰役】定義與測量:冷啟動、熱啟動與溫啟動

  • 分享至 

  • xImage
  •  

各位戰士,休整結束!歡迎回到「Android 性能戰爭」的第二週。我們將發起一場為期七天的閃電戰,目標直指使用者體驗的核心——應用啟動速度

為什麼啟動速度如此重要?因為它是使用者與你 App 的第一次親密接觸。如果這個過程耗時過長,使用者可能在還沒看到你精心設計的功能前,就已經失去了所有耐心。我們的目標是:快,還要更快!

在發起攻擊前,我們必須先精準地定義我們的敵人。應用的啟動並非只有一種情況,它分為三種類型,其耗時程度有天壤之別。

識別敵軍的三種形態

1. 冷啟動 (Cold Start)

  • 戰況描述:這是最慢、最耗資源,也是我們最需要優化的場景。它發生在 App 從零開始啟動時,例如:設備開機後首次啟動、或 App 進程被系統或使用者殺死後重啟。
  • 系統任務
    1. 載入 App 的 APK。
    2. 創建一個新的應用程式進程。
    3. 創建 Application 物件。
    4. 啟動主執行緒 (UI Thread)。
    5. 創建 MainActivity
    6. 渲染 (Inflate) 佈局。
    7. 執行繪製,顯示第一幀畫面。
      所有工作都必須從頭開始,因此耗時最長。

2. 溫啟動 (Warm Start)

  • 戰況描述:這比冷啟動快一些。它發生在 App 進程仍在背景運行,但 Activity 已經被銷毀(例如使用者按了返回鍵退出),然後使用者又重新啟動了 App。
  • 系統任務
    1. 重用現有的應用程式進程和 Application 物件。
    2. 創建 MainActivity
    3. 渲染佈局。
    4. 執行繪製。
      由於省去了創建進程和 Application 的步驟,溫啟動的耗時會明顯減少。

3. 熱啟動 (Hot Start)

  • 戰況描述:這是最快的場景。App 的進程和 Activity 實例都還在記憶體中(例如使用者按了 Home 鍵將 App 切到背景)。
  • 系統任務
    1. 直接將 Activity 從背景帶到前台。
      所有主要物件都已在記憶體中,系統只需處理視窗的顯示即可,因此幾乎是瞬時完成。

我們的測量儀器:Logcat 與 ADB

要優化,先測量。憑感覺是打不贏戰爭的,我們需要精確的數據。

方法一:Logcat (最簡單直觀)

Android 系統會在 App 完成第一幀繪製時,自動在 Logcat 中打印一條日誌。這是評估啟動性能最簡單的方法。

  1. 在 Android Studio 中打開 Logcat 視窗。
  2. 在右上角的搜尋框中,輸入 Displayed 並篩選你的應用程式套件名稱。
  3. 完全殺死你的 App 進程(可以透過 adb shell am force-stop com.your.package 或在系統設定中強制停止)。
  4. 點擊桌面圖示重新啟動 App。
  5. 觀察 Logcat,你會看到類似下面這樣的日誌:
ActivityManager: Displayed com.your.package/.MainActivity: +385ms

這個 +385ms 就是本次冷啟動的初始顯示時間 (Time to initial display)。它測量的是從啟動進程到完成繪製 Activity 第一幀的時間。

方法二:ADB Shell Command (最精確可重複)

如果你需要進行更嚴謹、可腳本化的測試,使用 ADB 指令是最佳選擇。

  1. 首先,確保 App 進程被完全殺死:
    adb shell am force-stop com.your.package
    
  2. 然後,執行以下指令來啟動 App 並測量時間:
    adb shell am start -W com.your.package/com.your.package.MainActivity
    
  3. 終端機會返回一些時間數據:
    Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.your.package/.MainActivity }
    Status: ok
    Activity: com.your.package.MainActivity
    ThisTime: 298
    TotalTime: 298
    WaitTime: 307
    Complete
    
  • ThisTime: 最後一個 Activity 的啟動耗時。
  • TotalTime: 啟動所有 Activity 的總耗時(對於單一啟動,通常與 ThisTime 相同)。
  • WaitTime: 從啟動到完成所有繪製的總時間,通常比 TotalTime 稍長,這是我們最關心的冷啟動指標

今日總結

今天的任務是偵查與測量。我們學會了:

  • 區分冷啟動溫啟動熱啟動這三種不同的啟動模式。
  • 使用 LogcatDisplayed 日誌快速查看啟動時間。
  • 使用 ADB 指令進行更精確、可重複的冷啟動性能測試。

現在我們已經掌握了測量敵人實力的方法。從明天開始,我們將正式發起攻擊,深入程式碼,找出並消滅那些拖慢 App 啟動速度的瓶頸。我們的第一個目標:Application.onCreate() 的瘦身計畫

準備好你的手術刀,我們明天見!


上一篇
# Day 7:【Energy Profiler】電量消耗的來源
系列文
Android 性能戰爭:從 Profiler 開始的 30 天優化實錄8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言