他の API によって作成されたウェイクロックを特定する

複数のライブラリとシステム API が、アプリに起因するウェイクロックを取得することがあります。このため、問題の原因となっているアプリ内のウェイクロックを特定することが困難になる可能性があります。API を誤用すると、ウェイクロック API を直接呼び出していないにもかかわらず、アプリがウェイクロックを長時間保持する結果になる可能性があります。

このドキュメントでは、ウェイクロックのデバッグツールを使用する際に表示される一般的なウェイクロック名をいくつか示します。これらの名前は、Android Vitals のレポートにも表示されます。ライブラリまたはシステム API によってウェイクロックが作成されている場合もあります。一方、ツールがアプリで使用している wake lock 名を難読化している理由もあります。デバッグツールを使用して動作が不正な wake lock を特定し、このドキュメントで wake lock 名を検索して、問題の原因となっている API とその解決方法を特定できます。

このドキュメントでは、次のウェイクロック名について説明します。いずれの場合も、ウェイクロックは他のライブラリや API によって作成される可能性がありますが、ロックは、その API を呼び出したアプリに関連付けられます。

*alarm*

この wake lock は AlarmManager によって取得され、呼び出し元のアプリに関連付けられます。AlarmManager は、アラームが鳴ったときに wake lock を取得し、アラーム ブロードキャストの onReceive() メソッドの実行が完了するとロックを解除します。

推奨事項

アラームの動作を最適化するには、次の方法をおすすめします。

  • AlarmManager を使用して、アラートのスケジュール設定頻度を最適化します。
  • RTC_WAKEUP アラーム(デバイスを起動するアラーム)は、必要な場合にのみ使用します。
  • アラームの使用を最小限に抑え、onReceive() メソッドで長時間の処理を行わないでください。

AudioInAudioMix など

音声の録音または再生時に、メディア API によって Audio で始まるさまざまなウェイクロックが取得されます。ウェイクロックは呼び出し元のアプリに関連付けられます。

AudioIn は、カムコーダー モードでAudioRecord をキャプチャするときに、マイクがアクティブな状態で取得されます。AudioMix は、デバイスへの AudioTrack 再生中に取得されます。他のメディア API は、Audio で始まる他の名前のウェイクロックを取得する場合があります。

推奨事項

次の方法をおすすめします。

  • Audio で始まる wake lock 名は使用しないでください。
  • メディア API を使用している場合は、ウェイクロックを直接取得する必要はありません。API を使用して必要なウェイクロックを取得できます。
  • メディア API を使用する場合は、不要になったメディア セッションを終了してください。

GOOGLE_C2DM

このウェイクロックは、Firebase Cloud Messaging(FCM)ブロードキャストをアプリに配信する際に GCM によって取得されます。ウェイクロックは、FCM ブロードキャスト onMessageReceived() メソッドの実行が完了すると解除されます。

推奨事項

FCM の動作を最適化するには、次の方法をおすすめします。

  • FCM 配信の頻度を最適化する。
  • メッセージが実際にすぐに配信される必要がある場合を除き、優先度の高い FCM を使用しないでください。
  • onMessageReceived() メソッドをできるだけ早く完了させる。詳しくは、Firebase のガイダンスをご覧ください。

*job*/<package_name>/<package_and_job_name>

これらの wake lock は、バックグラウンドでタスクを実行する際に JobScheduler ジョブによって使用されます。ウェイクロックは、ワーカーを作成したアプリに帰属します。

「<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 ワーカーによって使用されます。ウェイクロックは、ワーカーを作成したアプリに帰属します。

「<package_name>」は、アプリのパッケージ名であり、リテラル テキストの <package name> ではありません。*job* は、アスタリスクを含む文字列 *job* です。アスタリスクはワイルドカードとして使用されていません。

推奨事項

WorkManager ワーカーの使用状況を監査します。特に、タスク スケジューリング API のバッテリー使用量を最適化するためのガイダンスに沿って対応してください。

NetworkLocationLocatorFusedLocation*location*

これらのウェイクロック名は、LocationManagerFusedLocationProviderClient によってデバイスの位置情報を取得して提供するために使用されます。ウェイクロックは、これらの API を呼び出したアプリに関連付けられます。

推奨事項

位置情報の使用を最適化する。たとえば、タイムアウトを設定する、位置情報リクエストをバッチ処理する、パッシブな位置情報の更新を使用するなどです。

_UNKNOWN

デバッグツールが、wake lock 名に個人情報(PII)が含まれていると判断した場合、実際の wake lock 名は表示されません。代わりに、ウェイクロックに _UNKNOWN というラベルを付けます。たとえば、ウェイクロック名にメールアドレスが含まれている場合、ツールはこれを実行することがあります。

推奨事項

wake lock の命名に関するベスト プラクティスに従い、wake lock 名に PII を使用しないでください。アプリに関連付けられている _UNKNOWN という名前のウェイクロックが見つかった場合は、どのウェイクロックであるかを特定して、別の名前を付けます。