找出其他 API 建立的喚醒鎖定

多個程式庫和系統 API 都能取得與應用程式相關的喚醒鎖定。因此,您可能很難找出應用程式中可能造成問題的喚醒鎖定。如果您誤用 API,即使您並未直接呼叫喚醒鎖定 API,應用程式仍可能會保留喚醒鎖定太久。

本文列出您在使用喚醒鎖偵錯工具時,可能會看到的常見喚醒鎖名稱。您也可能會在 Android Vitals 的報表中看到這些名稱。在某些情況下,喚醒鎖定可能是由程式庫或系統 API 建立。在其他情況下,工具會將您在應用程式中使用的喚醒鎖名稱模糊處理,這有其原因。您可以使用偵錯工具找出異常的喚醒鎖,然後在本文件中查詢喚醒鎖名稱,找出可能導致問題的 API,並瞭解如何解決問題。

本文件涵蓋下列喚醒鎖定名稱。在每個情況中,雖然喚醒鎖定可能由其他程式庫或 API 建立,但鎖定會歸因於呼叫該 API 的應用程式。

*alarm*

這個喚醒鎖定會由 AlarmManager 取得,並歸因於呼叫的應用程式。AlarmManager 會在鬧鐘響起時取得喚醒鎖定,並在鬧鐘廣播的 onReceive() 方法執行完畢時釋放鎖定。

建議

我們建議您採取下列做法,以便最佳化鬧鐘行為:

  • 使用 AlarmManager 最佳化鬧鐘排程頻率。
  • 只在必要時使用 RTC_WAKEUP 鬧鐘 (可喚醒裝置)。
  • 盡量減少使用鬧鐘,並避免在 onReceive() 方法中執行耗時的工作。

AudioInAudioMix

媒體 API 在錄製或播放音訊時,會取得名稱以 Audio 開頭的各種喚醒鎖定。Wake Lock 會歸因於呼叫應用程式。

AudioIn 是在AudioRecord 以攝影機模式擷取時取得,且麥克風處於啟用狀態。AudioMix 是在 AudioTrack 播放至裝置時取得。其他媒體 API 可能會取得開頭為 Audio 的其他名稱喚醒鎖定。

建議

我們建議您採取下列做法:

  • 請勿使用開頭為 Audio 的 Wake Lock 名稱。
  • 如果您使用媒體 API,則不必直接取得喚醒鎖定;您可以依賴 API 取得必要的喚醒鎖定。
  • 使用媒體 API 時,請在不再需要時結束媒體工作階段。

GOOGLE_C2DM

在向應用程式傳送 Firebase 雲端通訊 (FCM) 廣播時,GCM 會取得這個喚醒鎖定。一旦 FCM 廣播 onMessageReceived() 方法執行完畢,系統就會釋放喚醒鎖定。

建議

我們建議您採取下列做法,以便最佳化 FCM 行為:

  • 調整 FCM 傳送頻率。
  • 除非訊息確實需要立即傳送,否則請勿使用 高優先順序 FCM
  • 盡快完成 onMessageReceived() 方法。詳情請參閱 Firebase 指南

*job*/<package_name>/<package_and_job_name>

在背景執行工作時,JobScheduler 工作會使用這些喚醒鎖定。喚醒鎖定會歸因於建立 worker 的應用程式。

「<package_name>」是應用程式套件的名稱,而非文字 <package name>。同樣地,「<package_and_job_name>"」是套件名稱,後面接著工作名稱。*job* 是字元序列 *job*,其中含有星號;星號並未用於做為萬用字元。以下是這類 Wake Lock 名稱的範例:

*job*/com.example.app/com.example.app.example.path.ExampleJobService

建議

檢查您使用 JobScheduler 工作的方式。具體來說,請按照最佳化任務排程 API 的電池用量的指南操作。

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

這些喚醒鎖會在 WorkManager worker 執行背景工作時使用。喚醒鎖定會歸因於建立 worker 的應用程式。

「<package_name>」是應用程式套件的名稱,而非文字 <package name>*job* 是字元序列 *job*,其中包含星號;星號並未用於做為萬用字元。

建議

稽核您對 WorkManager worker 的使用情形。具體來說,請按照最佳化任務排程 API 的電池用量的指南操作。

NetworkLocationLocatorFusedLocation*location*

這些喚醒鎖定名稱會由 LocationManagerFusedLocationProviderClient 用於取得及提供裝置位置。喚醒鎖定會歸因於呼叫這些 API 的應用程式。

建議

最佳化位置資訊使用方式。例如設定逾時、批次位置要求或使用被動位置資訊更新。

_UNKNOWN

如果偵錯工具認為 Wake Lock 名稱含有個人識別資訊 (PII),就不會顯示實際的 Wake Lock 名稱。而是將 Wake Lock 標示為 _UNKNOWN。舉例來說,如果喚醒鎖定名稱包含電子郵件地址,工具可能會這樣做。

建議

遵循 Wake Lock 命名最佳做法,並避免在 Wake Lock 名稱中使用個人識別資訊。如果您發現應用程式有名為 _UNKNOWN 的喚醒鎖定,請嘗試找出該喚醒鎖定,並為其指定其他名稱。