各位戰士,歡迎來到第一週偵查任務的最後一天。我們已經成功地監控了 CPU 的運算、記憶體的佔用和網路的傳輸。今天,我們將完成最後一項情蒐任務:電量 (Energy)。這是一場無聲的消耗戰,使用者雖然看不見,卻能透過手機右上角的電池百分比,清楚地感受到戰況的慘烈。
我們的目標是確保 App 在提供服務的同時,不會成為一個讓使用者產生「電量焦慮」的負擔。為此,我們需要了解並使用 Energy Profiler。
Energy Profiler 透過分析系統事件,估算你 App 的電量消耗情況。它不像其他 Profiler 那樣提供精確到毫秒或位元組的數據,而是更宏觀地向你展示哪些行為模式可能導致了高額的電量消耗。
打開 Profiler,你會在 CPU 時間線上方看到一條 Energy 時間線,它以「輕度」、「中度」、「重度」來標示 App 的預估電量使用強度。
Energy Profiler 的精髓在於下方的系統事件時間線 (System Event Timeline)。它會標示出三種最主要的耗電行為,我們必須學會識別它們:
Wakelocks (喚醒鎖)
wakelock.release()
),設備將永遠無法進入休眠狀態,電量會被迅速耗盡。Alarms (鬧鐘)
AlarmManager
在未來的特定時間點喚醒設備來執行任務的機制,即使你的 App 當時並未運行。Jobs (任務)
JobScheduler
或更現代的 WorkManager
來調度後台任務的機制。假設我們的 App 為了即時更新天氣,使用了一個非常古老且糟糕的設計:每分鐘設定一個精確鬧鐘 (AlarmManager.setExact
) 來喚醒設備並請求一次天氣 API。
作戰場景模擬:
分析情報:
你會在時間線上看到一排密度極高的 Alarm 事件標記。如果你放大時間軸,會發現它們幾乎是每分鐘出現一次。每一個 Alarm 事件之後,可能還會緊跟著一個短暫的 Wakelock 事件(因為 App 被喚醒後需要 CPU 執行網路請求)。
![Energy Profiler 中密集的 Alarm 事件示意圖]
這張圖就是鐵證!它告訴你,你的 App 正在像一個不守紀律的士兵,每分鐘都在把睡夢中的將軍(系統)叫醒一次,只是為了一件無關緊要的小事。這種行為對整個軍營(手機電池)的消耗是毀滅性的。
解決方案:立即停用 AlarmManager
,改用 WorkManager
來實現週期性的後台同步。你可以設定一個 PeriodicWorkRequest
,並為它加上 NetworkType.CONNECTED
等約束,讓系統在最適當的時機以最高效的方式完成任務。
恭喜你,戰士!你已經成功完成了為期一週的偵查與情蒐任務。
在這七天裡,我們學會了如何使用 Android Studio Profiler 的全套武器:
我們的偵查階段已經結束,我們對敵人的作戰方式有了清晰的了解。從明天開始,我們將進入第二階段:閃電戰。我們的第一個目標,將是使用者最有感、也最能體現優化成果的戰役——應用啟動速度優化戰役!
養精蓄銳,我們下週一開戰!