功耗問題之過多喚醒源 wakeups

功耗問題之過多喚醒源 wakeups

和你一起終身學習,這裡是程式設計師 Android

本篇文章主要介紹 Android 開發中的

效能

部分知識點,透過閱讀本篇文章,您將收穫以下內容:

過多的喚醒源wakeups

如何fix 過多喚醒源問題

最佳實踐

1.過多的喚醒源wakeups

Wakeups

是 AlarmManager API 中的一種機制 ,它可讓開發人員在指定時間設定警報,進而達到喚醒裝置的目的。您的應用透過使用 RTC_WAKEUP 或ELAPSED_REALTIME_WAKEUP 標誌呼叫AlarmManager中的種set()方法來設定喚醒警報。當觸發喚醒警報後,裝置將退出低功耗模式,並在執行警報 onReceive()或 onAlarm() 方法的同時

holds

partial wake lock 。如果喚醒警報觸發過多,它們可能會耗盡裝置的電池電量。

為了幫助您提高應用程式質量,Android會自動監視應用程式是否存在過多的喚醒警報,並以Android vitals的形式顯示資訊。有關如何收集資料的資訊,請參閱Play控制檯文件。

如果您的應用過度喚醒裝置,則可以使用此頁面中的指導來診斷和解決問題。

2. 如何fix 過多喚醒源問題

AlarmManager 是在Android平臺的早期版本中推出的,但隨著時間的推移,以前需要很多 AlarmManager 的用例現在更好新功能提供服務(比如: WorkManager)。本部分包含有關減少喚醒警報的提示,但從長遠來看,請考慮遷移您的應用以遵循第三節最佳實踐部分中的建議。

確定您在應用中安排喚醒警報的位置,並減少觸發這些警報的頻率。這裡有一些提示:

查詢對包含RTC_WAKEUP 或 ELAPSED_REALTIME_WAKEUP 標誌的各種 AlarmManager set() 方法的呼叫 。

我們建議您將包,類或方法的名稱包括在警報的標記名稱中,以便您可以輕鬆地在源中識別設定警報的位置。以下是一些其他提示:

忽略名稱中的任何個人身份資訊(PII),例如電子郵件地址。否則,裝置將記錄日誌_UNKNOWN而不是警報名稱。

不要以程式設計方式獲取類或方法的名稱,例如透過呼叫 getName() ,因為Proguard可能會混淆它們。而是使用硬編碼的字串。

不要在警報標籤中新增計數器或唯一識別符號。系統將無法聚合以這種方式設定的警報,因為它們都具有唯一的識別符號。

解決問題後,透過執行以下ADB 命令來驗證喚醒警報是否按預期工作:

adb shell dumpsys alarm

該命令提供有關裝置上警報系統服務狀態的資訊。有關更多資訊,請參見 dumpsys。

3. 最佳實踐

僅當您的應用需要執行面向用戶的操作(例如釋出通知或提醒使用者)時,才使用喚醒警報。有關AlarmManager最佳做法的列表,請參閱Scheduing Repeating Alarms。

不要 AlarmManager

用於安排後臺任務,尤其是重複的或網路後臺任務。建議使用 WorkManager 執行後臺任務,因為它具有以下優點:

批處理-合併作業,以減少電池消耗

永續性-如果重新啟動裝置,則在重新啟動完成後執行計劃的WorkManager作業

條件-作業可以根據條件執行,例如裝置是否正在充電或WiFi是否可用

有關更多資訊,請參閱《後臺處理指南》。

不要 AlarmManager 用於安排僅在應用程式執行時才有效的計時操作(換句話說,當用戶退出應用程式時應取消計時操作)。在這種情況下,請使用 Handler 該類,因為它更易於使用且效率更高。