多個程式庫和系統 API 都能取得與應用程式相關的喚醒鎖定。因此,您可能很難找出應用程式中可能造成問題的喚醒鎖定。如果您誤用 API,即使您並未直接呼叫喚醒鎖定 API,應用程式仍可能會保留喚醒鎖定太久。
本文列出您在使用喚醒鎖偵錯工具時,可能會看到的常見喚醒鎖名稱。您也可能會在 Android Vitals 的報表中看到這些名稱。在某些情況下,喚醒鎖定可能是由程式庫或系統 API 建立。在其他情況下,工具會將您在應用程式中使用的喚醒鎖名稱模糊處理,這有其原因。您可以使用偵錯工具找出異常的喚醒鎖,然後在本文件中查詢喚醒鎖名稱,找出可能導致問題的 API,並瞭解如何解決問題。
本文件涵蓋下列喚醒鎖定名稱。在每個情況中,雖然喚醒鎖定可能由其他程式庫或 API 建立,但鎖定會歸因於呼叫該 API 的應用程式。
*alarm*
:由AlarmManager
建立。AudioIn
、AudioMix
:由媒體 API 建立。GOOGLE_C2DM
:在向應用程式傳送 Firebase 雲端訊息 (FCM) 廣播時取得。*job*/<package_name>/<package_and_job_name>
:由 JobScheduler 工作建立。*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
:由 WorkManager 工作者建立。NetworkLocationLocator
、FusedLocation
、*location*
:由位置 API 建立。_UNKNOWN
:如果 Wake Lock 名稱似乎使用個人識別資訊 (PII),偵錯工具就會顯示這項資訊。
*alarm*
這個喚醒鎖定會由 AlarmManager
取得,並歸因於呼叫的應用程式。AlarmManager
會在鬧鐘響起時取得喚醒鎖定,並在鬧鐘廣播的 onReceive()
方法執行完畢時釋放鎖定。
建議
我們建議您採取下列做法,以便最佳化鬧鐘行為:
- 使用
AlarmManager
最佳化鬧鐘排程頻率。 - 只在必要時使用
RTC_WAKEUP
鬧鐘 (可喚醒裝置)。 - 盡量減少使用鬧鐘,並避免在
onReceive()
方法中執行耗時的工作。
AudioIn
、AudioMix
等
媒體 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 的電池用量的指南操作。
NetworkLocationLocator
、FusedLocation
、*location*
這些喚醒鎖定名稱會由 LocationManager
和 FusedLocationProviderClient
用於取得及提供裝置位置。喚醒鎖定會歸因於呼叫這些 API 的應用程式。
建議
最佳化位置資訊使用方式。例如設定逾時、批次位置要求或使用被動位置資訊更新。
_UNKNOWN
如果偵錯工具認為 Wake Lock 名稱含有個人識別資訊 (PII),就不會顯示實際的 Wake Lock 名稱。而是將 Wake Lock 標示為 _UNKNOWN
。舉例來說,如果喚醒鎖定名稱包含電子郵件地址,工具可能會這樣做。
建議
遵循 Wake Lock 命名最佳做法,並避免在 Wake Lock 名稱中使用個人識別資訊。如果您發現應用程式有名為 _UNKNOWN
的喚醒鎖定,請嘗試找出該喚醒鎖定,並為其指定其他名稱。