Nombre excessif de wakeups

Les wakeups sont un mécanisme de l'API AlarmManager qui permet aux développeurs de définir une alarme pour réactiver un appareil à un moment précis. Votre application définit une alarme wakeup en appelant l'une des méthodes set() d'AlarmManager avec l'indicateur RTC_WAKEUP ou ELAPSED_REALTIME_WAKEUP. Lorsqu'une alarme wakeup est déclenchée, l'appareil sort du mode d'économie d'énergie et reste dans un état de wakelock partiel tout en exécutant la méthode onReceive() ou onAlarm() de l'alarme. Un déclenchement excessif des alarmes wakeup peut entraîner le déchargement de la batterie.

Pour vous aider à améliorer la qualité des applications, Android surveille automatiquement les applications pour détecter un nombre excessif d'alarmes wakeup et affiche les informations dans Android Vitals. Pour en savoir plus sur la collecte des données, consultez la documentation de la Play Console.

Si votre application réactive l'appareil de manière excessive, vous pouvez suivre les instructions de cette page pour diagnostiquer et résoudre le problème.

Résoudre le problème

AlarmManager a été introduit dans les premières versions de la plate-forme Android, mais au fil du temps, de nombreux cas d'utilisation nécessitant auparavant AlarmManager sont désormais mieux gérés par des fonctionnalités plus récentes telles que WorkManager. Cette section contient des conseils pour réduire les alarmes wakeup, mais à long terme, envisagez de migrer votre application pour suivre les recommandations de la section Bonnes pratiques.

Identifiez les aspects de votre application où vous programmez des alarmes wakeup et réduisez leur fréquence. Voici quelques conseils :

  • Recherchez les appels émis vers les différentes méthodes set() d'AlarmManager qui incluent l'indicateur RTC_WAKEUP ou ELAPSED_REALTIME_WAKEUP.

  • Nous vous recommandons d'inclure le nom du package, de la classe ou de la méthode dans le nom de l'indicateur de l'alarme, afin de pouvoir identifier facilement l'emplacement de la source où l'alarme a été définie. Voici quelques conseils supplémentaires :

    • N'indiquez aucune information permettant d'identifier personnellement l'utilisateur dans le nom, comme une adresse e-mail. Sinon, l'appareil enregistre _UNKNOWN au lieu du nom de l'alarme.
    • N'obtenez pas le nom de la classe ou de la méthode par programmation, par exemple en appelant getName(), car il pourrait être obscurci par ProGuard. Utilisez plutôt une chaîne codée en dur.
    • N'ajoutez pas de compteur ni d'identifiants uniques aux identificateurs d'alarme. Le système ne peut pas regrouper les alarmes définies de cette manière, car elles ont toutes des identifiants uniques.

Après avoir résolu le problème, vérifiez que vos alarmes wakeup fonctionnent comme prévu en exécutant la commande ADB suivante :

adb shell dumpsys alarm

Cette commande fournit des informations sur l'état du service du système d'alarme sur l'appareil. Pour plus d'informations, consultez la page consacrée à dumpsys.

Bonnes pratiques

N'utilisez les alarmes wakeup que si votre application doit effectuer une opération visible par l'utilisateur (par exemple, publier une notification ou avertir l'utilisateur). Pour obtenir la liste des bonnes pratiques liées à AlarmManager, consultez la page Programmer des alarmes.

N'utilisez pas AlarmManager pour planifier des tâches en arrière-plan, en particulier les tâches récurrentes ou en arrière-plan du réseau. Utilisez WorkManager pour planifier des tâches en arrière-plan, et ainsi bénéficier des avantages suivants :

  • Traitement par lot : les tâches sont regroupées pour réduire l'utilisation de la batterie.
  • Persistance : si l'appareil est redémarré, les tâches WorkManager planifiées s'exécutent après le redémarrage.
  • Critères : les tâches peuvent s'exécuter sous certaines conditions, par exemple si l'appareil est en charge ou si le Wi-Fi est disponible.

Pour en savoir plus, consultez le Guide relatif au traitement en arrière-plan.

N'utilisez pas AlarmManager pour planifier des opérations temporelles qui ne sont valides que lorsque l'application est en cours d'exécution. En d'autres termes, cette opération doit être annulée lorsque l'utilisateur quitte l'application. Dans ce cas, utilisez la classe Handler, car elle est plus facile à utiliser et beaucoup plus efficace.