複数のライブラリとシステム API が、アプリに起因するウェイクロックを取得できます。そのため、問題の原因となっている可能性のあるアプリのウェイクロックを特定することが困難になる場合があります。API を誤用すると、ウェイクロック API を直接呼び出していないにもかかわらず、アプリがウェイクロックを長時間保持する可能性があります。
このドキュメントでは、ウェイクロック デバッグツールを使用する際に表示される可能性のある一般的なウェイクロック名をいくつか紹介します。これらの名前は、Android Vitals のレポートにも表示されることがあります。ライブラリまたはシステム API によってウェイクロックが作成されている場合もあります。それ以外の場合は、アプリで使用している wake lock 名をツールが難読化する理由があります。デバッグツールを使用して不正な動作をしている wake lock を特定し、このドキュメントで wake lock 名を検索して、どの API が問題の原因となっている可能性があるか、またその解決方法を特定できます。
このドキュメントでは、ウェイクロックが作成される可能性のあるシナリオについて説明します。いずれの場合も、ウェイクロックは他のライブラリや API によって作成される可能性がありますが、その API を呼び出したアプリにロックが割り当てられます。
AlarmManager
- 音声とメディア
- Firebase Cloud Message(FCM)
- JobScheduler
- 位置情報
- WorkManager
_UNKNOWN
: ウェイクロック名が個人を特定できる情報(PII)を使用していると思われる場合に、デバッグツールによって表示されます。
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 を使用する場合は、不要になったらメディア セッションを終了します。
Firebase Cloud Message(FCM)
GCM は、Firebase Cloud Message(FCM)ブロードキャストをアプリに配信する際に、ウェイクロックを取得します。ウェイクロックは、FCM ブロードキャストの onMessageReceived()
メソッドの実行が完了すると解放されます。
wake lock 名
GCM は GOOGLE_C2DM
という名前の wake lock を取得します。
推奨事項
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 のバッテリー使用量を最適化するためのガイダンスに従ってください。
場所
LocationManager
と FusedLocationProviderClient
は、ウェイクロックを使用してデバイスの位置情報を取得し、配信します。ウェイクロックは、これらの API を呼び出したアプリに帰属します。
wake lock 名
位置情報サービスでは、次の名前が使用されます。
CollectionLib-SigCollector
NetworkLocationLocator
NetworkLocationScanner
NlpCollectorWakeLock
NlpWakeLock
*location*
推奨事項
位置情報の使用を最適化する。たとえば、タイムアウトを設定したり、位置情報リクエストをバッチ処理したり、パッシブな位置情報の更新を使用したりします。
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 以降を搭載するデバイスでは、ウェイクロックの名前は次のようになります。
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
推奨事項
WorkManager ワーカーの使用状況を監査します。特に、タスク スケジューリング API のバッテリー使用量を最適化するためのガイダンスに従ってください。
_UNKNOWN
デバッグツールが wake lock 名に個人情報(PII)が含まれていると判断した場合、実際の wake lock 名は表示されません。代わりに、ウェイクロックに _UNKNOWN
というラベルを付けます。たとえば、ウェイクロック名にメールアドレスが含まれている場合、ツールはこれを行う可能性があります。
推奨事項
ウェイクロックの命名に関するベスト プラクティスに従い、ウェイクロック名に PII を使用しないでください。アプリに起因する _UNKNOWN
という名前のウェイクロックが見つかった場合は、そのウェイクロックを特定して別の名前を付けてください。