6 月 3 日の「#Android11: The Beta Launch Show」にぜひご参加ください。

過度の wakeup

wakeup は AlarmManager API のメカニズムです。これにより、デベロッパーは指定された時刻にデバイスを起動するアラームを設定できます。RTC_WAKEUP フラグまたは ELAPSED_REALTIME_WAKEUP フラグを指定して AlarmManagerset() メソッドのいずれかを呼び出すことで、アプリで wakeup アラームを設定します。wakeup アラームがトリガーされると、デバイスの省電力モードが解除され、アラームの onReceive() メソッドまたは onAlarm() メソッドの実行中に部分的な wake lock が保持されます。wakeup アラームが過度にトリガーされると、デバイスの電池が消耗する可能性があります。

アプリの品質向上に役立つように、Android ではアプリの過度の wakeup アラームについて自動的にモニターし、情報を Android Vitals に表示します。データの収集方法については、Play Console のドキュメントをご覧ください。

アプリがデバイスに過度の wakeup を行っている場合、このページのガイダンスが問題の診断と解決に役立ちます。

問題を解決する

AlarmManager は Android プラットフォームの初期のバージョンで導入されましたが、時間の経過とともに、以前は AlarmManager が必要だった多くのユースケースでも、WorkManager のような新しい機能を使用する方が適切になっています。このセクションでは wakeup アラームを減らすためのヒントを紹介しますが、長期的には、おすすめの方法セクションにある推奨事項に沿ってアプリを移行することを検討してください。

wakeup アラームをスケジュール設定するアプリ内の場所を特定し、アラームがトリガーされる頻度を減らします。ヒントをいくつかご紹介します。

  • RTC_WAKEUP フラグまたは ELAPSED_REALTIME_WAKEUP フラグのいずれかを含む、AlarmManager のさまざまな set() メソッドの呼び出しを探します。

  • アラームが設定されているソース内の場所を特定しやすくするために、アラームのタグ名にパッケージ名、クラス名、またはメソッド名を含めることをおすすめします。その他のヒントは次のとおりです。

    • 名前にメールアドレスなどの個人を特定できる情報(PII)を含めないようにします。そうしないと、デバイスはアラーム名ではなく _UNKNOWN をログに記録します。
    • getName() の呼び出しなどによって、クラス名またはメソッド名をプログラムで取得しないでください。ProGuard で難読化される可能性があります。代わりに、ハードコードされた文字列を使用します。
    • アラームタグにカウンタたまは一意の識別子を追加しないでください。そのようにして設定されたアラームはすべて一意の識別子を持っているため、システムで集計できません。

問題を解決したら、次の ADB コマンドを実行して、wakeup アラームが適切に機能していることを確認します。

adb shell dumpsys alarm
    

このコマンドで、デバイスのアラーム システム サービスのステータスに関する情報が得られます。詳細については、dumpsys をご覧ください。

おすすめの方法

wakeup アラームは、アプリがユーザー向けの動作(通知の送信、ユーザーに対するアラートなど)を行う必要がある場合にのみ使用します。AlarmManager のおすすめの方法の一覧については、反復アラームのスケジュールを設定するをご覧ください。

バックグラウンド タスク(特に繰り返すバックグラウンド タスクやネットワークのバックグラウンド タスク)のスケジュール設定に AlarmManager を使用しないでください。WorkManager を使用してバックグラウンド タスクをスケジュール設定します。これは、次の利点があるためです。

  • バッチ処理 - ジョブが結合されることで、電池の消費量が削減されます
  • 永続性 - デバイスが再起動されると、再起動が完了した後にスケジュール設定された WorkManager ジョブが実行されます
  • 条件 - デバイスが充電中かどうか、Wi-Fi が利用可能かどうかなどの条件に基づいてジョブを実行できます

詳細については、バックグラウンド処理ガイドをご覧ください。

アプリの実行中にのみ有効なタイミング処理のスケジュール設定に AlarmManager を使用しないでください(つまり、タイミング処理はユーザーがアプリを終了した時点でキャンセルされる必要があります)。そのような状況では、Handler クラスを使用する方が簡単で効率的です。