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

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

他の API によってウェイクロックが取得されるシナリオでは、手動でウェイクロックを取得することは避けるべきです。

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

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

AlarmManager

AlarmManager は wake lock を取得し、呼び出し元のアプリに割り当てます。AlarmManager は、アラームが鳴ると wake lock を取得し、アラーム ブロードキャストの onReceive() メソッドの実行が完了するとロックを解除します。

wake lock 名

AlarmManager*alarm* という名前のウェイクロックを作成します。(アスタリスクはウェイクロック名の一部であり、ワイルドカードを表すものではありません)。

推奨事項

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

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

音声とメディア

メディア API は、音声の録音または再生時にウェイクロックを取得できます。ウェイクロックは呼び出し元のアプリに帰属します。

wake lock 名

メディア API は、Audio で始まるさまざまな名前のウェイクロックを取得します。

  • AudioBitPerfect: ロスレス USB オーディオ再生に使用されます。
  • AudioDirectOut: テレビや特殊なデバイスでのロスレス音声再生に使用されます。
  • AudioDup: Bluetooth または USB で接続しているときに通知を再生するために使用されます。
  • AudioIn: マイクが有効な状態でビデオカメラ モードの場合に、音声キャプチャに使用されます。
  • AudioMix: 共通デバイスへの音声再生に使用されます。
  • AudioOffload: このモードをサポートするアプリで、音楽のみの再生を長時間行う場合に使用します。
  • AudioSpatial: 空間音声をサポートするデバイスで、マルチチャンネルの映画や音楽の音声を再生するために使用されます。
  • AudioUnknown: 他の状況に当てはまらない場合に使用します。
  • MmapCapture: 低レイテンシの音声キャプチャに使用されます。
  • MmapPlayback: ゲーミングやプロフェッショナル オーディオ アプリケーションなど、低遅延再生に使用されます。

推奨事項

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

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

Bluetooth

プラットフォームの Bluetooth API は、Bluetooth アクションの発生中に、アプリケーションに起因するウェイクロックを保持しません。Bluetooth 転送がバックグラウンドで行われることを確認するには、WorkManager を使用してタスクをスケジュールします。

推奨事項

  • コンパニオン デバイスのペア設定を使用して Bluetooth デバイスをペア設定し、Bluetooth のペア設定中に手動ウェイクロックを取得しないようにします。
  • バックグラウンドで Bluetooth 通信を行う方法については、バックグラウンドで通信するのガイダンスをご覧ください。
  • 手動ウェイクロックが必要と判断された場合は、Bluetooth アクションの期間のみウェイクロックを保持します。

デバイスのセンサー

歩数、加速度計、ジャイロスコープのデータなど、デバイスのセンサーデータをトラッキングする方法はいくつかあります。

Wear OS では、Wear ヘルスサービスを使用して、標高、心拍数、移動距離などのデバイスデータを取得します。

データが他のアプリによって収集される場合は、WorkManager と組み合わせて ヘルスコネクトを使用してデータを取得できます。

歩数や移動距離の差分をトラッキングするなどのシナリオでは、モバイルの Recording API と WorkManager を組み合わせてデータ取得できます。

状況によっては、SensorManager を使用してカスタム デバイス センサー トラッキングが必要になることがあります。SensorManager は、センサーがウェイクアップ センサーでない限り、アプリに代わってウェイクロックを取得しません。ウェイクアップ センサーは isWakeUpSensor API を使用して識別できます。

推奨事項

センサーを使用して高いサンプリング レートで記録すると、バッテリーが大幅に消耗する可能性があります。バッテリーの消耗とウェイクロックの使用を減らすための推奨事項は次のとおりです。

  • 歩数や移動距離をトラッキングする場合は、Recording API を使用して、バッテリー効率の良い方法でデータを記録します。
  • Wear OS でパッシブ センサー トラッキングを行う場合は、Wear ヘルスサービスを使用してバッテリー使用量を最適化します。
  • センサーの周波数を 200 Hz 未満に減らします。
  • SensorManager でセンサーを登録する際は、センサー バッチ処理ロジックを使用してアプリが受け取る割り込みの数を減らすため、30 秒を超える maxReportLatencyUs を定義します。
  • センサー トラッキングの全期間にわたって長いウェイクロックを保持することは避け、代わりに AlarmManager を使用してアラームをスケジュールし、30 秒ごとにセンサーデータをポーリングします。

Firebase Cloud Message(FCM)

Firebase Cloud Message(FCM)ブロードキャストをアプリに配信している間、ウェイクロックが取得されます。FCM ブロードキャストの onMessageReceived() メソッドの実行が終了すると、ウェイクロックは解放されます。

wake lock 名

GOOGLE_C2DM という名前でウェイクロックが取得されます。

推奨事項

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

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

JobScheduler

JobScheduler ジョブは、バックグラウンドでタスクを実行している間、wake lock を取得します。ウェイクロックは、ワーカーを作成したアプリに帰属します。

wake lock 名

JobScheduler が取得するウェイクロックの名前は、実行されている Android システムのバージョンとジョブの目的によって異なります。

不等号記号で囲まれた項目は変数です。たとえば、"<package_name>" は、リテラル テキスト <package name> ではなく、アプリのパッケージの名前です。ただし、*job* はアスタリスクを含む文字シーケンス *job* であり、アスタリスクはワイルドカードとして使用されていません。

Android 15 以前

ユーザーが開始したジョブは、次のパターンに従った名前のウェイクロックを作成します。

*job*u/@<name_space>@/<package_name>/<classname>

他のジョブでは、このパターンが使用されています。

*job*/@<name_space>@/<package_name>/<classname>
Android 16 以降

ユーザーが開始したジョブは、次のパターンに従った名前のウェイクロックを作成します。

*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

優先ジョブでは次のパターンが使用されます。

*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

通常のジョブでは、次のパターンを使用します。

*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

Namespace backup とトレースタグ started を持つ優先ジョブがあるとします。パッケージ名は com.example.app で、ジョブを作成したクラスは com.backup.BackupFileService です。

Android 15 以下を搭載するデバイスでは、ウェイクロックの名前は次のようになります。

*job*/@backup@/com.example.app/com.backup.BackupFileService

Android 16 以降を搭載するデバイスでは、ウェイクロックの名前は次のようになります。

*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService

推奨事項

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

場所

LocationManagerFusedLocationProviderClient は、ウェイクロックを使用してデバイスの位置情報を取得し、配信します。ウェイクロックは、これらの API を呼び出したアプリに帰属します。

wake lock 名

位置情報サービスでは次の名前が使用されます。

  • CollectionLib-SigCollector
  • NetworkLocationLocator
  • NetworkLocationScanner
  • NlpCollectorWakeLock
  • NlpWakeLock
  • *location*

推奨事項

  • 位置情報の使用を最適化する。たとえば、タイムアウトを設定したり、位置情報リクエストをバッチ処理したり、パッシブな位置情報の更新を使用したりします。
  • 位置情報 API を使用している場合は、ウェイクロックを直接取得する必要はありません。API が必要なウェイクロックを自動的に取得します。

WorkManager

WorkManager ワーカーは、バックグラウンドでタスクを実行している間、ウェイクロックを取得します。ウェイクロックは、ワーカーを作成したアプリに帰属します。

wake lock 名

WorkManager が取得するウェイクロックの名前は、実行されている Android システムのバージョンによって異なります。

Android 15 以前

WorkManager タスクは、次のパターンに従った名前のウェイクロックを作成します。

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16 以降

優先タスクは、次のパターンに従った名前のウェイクロックを作成します。

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

通常のタスクは次のパターンに従います。

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

デフォルトでは、<trace_tag> がワーカー名です。

BackupFileWorker という名前の迅速なワーカーがあるとします。パッケージ名は com.example.app です。

Android 15 以下を搭載するデバイスでは、ウェイクロックの名前は次のようになります。

*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

Android 16 以降を搭載し、WorkManager 2.10.0+ を使用するデバイスでは、ウェイクロックの名前は次のようになります。

*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

推奨事項

_UNKNOWN

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

推奨事項

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