過剰なウェイクアップ

wakeup は AlarmManager API のメカニズムであり、デベロッパーはこれを使用して、指定された時刻にデバイスを起動するアラームを設定できます。アプリで wakeup アラームを設定するには、RTC_WAKEUP フラグまたは ELAPSED_REALTIME_WAKEUP フラグを指定して AlarmManager のいずれかの set() メソッドを呼び出します。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 クラスを使用する方が簡単で効率的です。