web-dev-qa-db-fra.com

Comment lire la sortie "adb Shell dumpsys alarm"

J'ai du mal à régler correctement une alarme et à comprendre le mécanisme d'annulation et de replanification des alarmes.

J'ai constaté qu'il existe une commande adb pour récupérer toutes les alarmes planifiées sur l'appareil, mais je n'ai pas trouvé de documentation expliquant le format de la sortie.

Je comprends que je demande beaucoup d'explications ici, donc si quelqu'un jette un lien avec des explications détaillées sur "adb Shell dumpsys alarm", je l'apprécierai vraiment.

Voici donc les questions:

  1. Lots d'alarmes en attente: 23

    une. '23' est-il un nombre d'alarmes programmées actuellement actives?

  2. Lot {4293d3a8 num = 1 start = 1369361 end = 1407261}:
    RTC # 0: Alarme {4293d358 type 1 com.Android.chrome}
    Type = 1 whenElapsed = 1369361 when = + 19s304ms window = -1 repeatInterval = 0 count = 0
    Operation = PendingIntent {429e4500: PendingIntentRecord {429dbbc8 com.Android.chrome broadcastIntent}}

    une. Qu'est-ce que 'num = 1', 'start = 1369361' et 'end = 1407261'?
    b. 'RTC' signifie RTC alarm, je suppose.
    c. Que signifie "# 0"?
    ré. Que signifie "type = 1"?
    e. Est-ce que "quand = + 19s304ms" signifie que l'alarme sera déclenchée dans 19 secondes?
    F. Que signifie "fenêtre = -1"?
    g. Est-ce que 'repeatInterval = 0' signifie qu'il s'agit d'une alarme non répétitive?
    h. Est-ce que 'count = 0' signifie que cette alarme n'a pas été reportée, en raison de l'état de veille du téléphone?
    je. 'operation = PendingIntent {...}' représente l'intention en attente, qui sera déclenchée par une alarme, je suppose.

  3. Nombre de références de diffusion: 0

    une. Qu'est-ce que c'est?

  4. Alarmes principales:

    une. Qu'est-ce que c'est?

  5. + 47s271ms en cours, 0 réveils, 2 alarmes: com.username.weatherinfo
    Act = com.username.receivers.CyclicWeatherUpdater.WEATHER_UPDATE_ACTION
    Cmp = {com.username.weatherinfo/com.username.receivers.CyclicWeatherUpdater}

    une. Est-ce que '+ 47s271ms' signifie que cette alarme se déclenchera dans 47 secondes?
    b. Qu'est-ce que '0 réveil' - l'alarme n'a jamais été déclenchée?
    c. Qu'est-ce que "2 alarmes"?
    ré. 'Com.username.weatherinfo' signifie-t-il le nom du package, qui a été attribué à l'intention en attente dans le champ contextuel?
    e. Est-ce que "agir" signifie l'action qui a été envoyée pour intention?
    F. Qu'est-ce que "cmp"? Je vois, qu'il est composé du nom du package et du nom de la classe - mais d'où viennent-ils? De constructeur intentionnel? g. Pourquoi une partie des alarmes n'a que 'act' ou seulement 'cmp'? J'ai supposé que les alarmes sans champs "cmp" sont pour des intentions de diffusion implicites. Pourtant, pourquoi y a-t-il des alarmes sans champ "agir"?

  6. Statistiques d'alarme:

    une. Qu'est-ce que c'est?

61
user3261128

Je me rends compte que ce fil est ancien, mais les réponses ne sont pas faciles à trouver et pourraient être utiles. J'ai passé beaucoup de temps à comprendre ce que ces messages signifient.

Q1: lots

Pending alarm batches: 23

Les alarmes sont organisées en lots. Comme décrit dans la documentation :

À partir de l'API 19, le temps de déclenchement passé à cette méthode est traité comme inexact: l'alarme ne sera pas délivrée avant cette heure, mais peut être différée et délivrée un peu plus tard. Le système d'exploitation utilisera cette stratégie afin de "batch" alarmes ensemble sur l'ensemble du système, minimisant le nombre de fois où l'appareil a besoin de "se réveiller" et minimiser l'utilisation de la batterie. En général, les alarmes programmées dans un avenir proche ne seront pas différées tant que les alarmes programmées dans le futur.

Il peut y avoir plus d'une alarme par lot. Dans ce cas, il y a 23 lots d'alarmes, ce qui signifie qu'il y a probablement beaucoup plus de 23 alarmes programmées. Dans la sortie dumpsys alarm, La ligne décrivant chaque lot ressemble à:

Batch{4293d3a8 num=1 start=1369361 end=1407261}:

Dans lequel:

  • 4293d3a8 Est un identifiant interne associé au lot.
  • num=1 Est le nombre d'alarmes de ce lot. Dans ce cas, il n'y a qu'une seule alarme dans le lot.
  • les nombres start et end représentent le nombre de millisecondes qui se sont écoulées depuis le dernier redémarrage du système comme décrit dans cet article , et aussi approximativement représentent la fenêtre de temps dans laquelle les alarmes du lot doivent être déclenchées.

Q2: alarmes

Chaque alarme est décrite par trois lignes qui ressemblent à:

RTC #0: Alarm{4293d358 type 1 com.Android.chrome} 
    type=1 whenElapsed=1369361 when=+19s304ms window=-1 repeatInterval=0 count=0
    operation=PendingIntent{429e4500: PendingIntentRecord{429dbbc8 com.Android.chrome broadcastIntent}}

Dans lequel:

  • La première partie, qui est une parmi RTC_WAKEUP, RTC, ELAPSED_WAKEUP Ou ELAPSED, représente le type de l'alarme et correspond à une valeur entière 0-3, respectivement
  • #0 Est le numéro de l'alarme dans le lot, où les nombres vont de 0 à n-1n est le nombre d'alarmes dans le lot. Si votre alarme est mise en lot avec d'autres, la plus éloignée à l'avenir "quand =" définit l'heure toutes les alarmes du lot seront déclenchées.
  • 4293d358 Est un numéro d'identification interne associé à l'alarme
  • com.Android.chrome Est le nom du package de la classe qui a déclenché l'alarme
  • type=1, Le type d'alarme, voir la première puce ci-dessus
  • whenElapsed=1369361 Fait référence au nombre de millisecondes depuis le démarrage du système à partir duquel cette alarme se déclenchera (environ)
  • when=+19s304ms Signifie que l'alarme se déclenchera dans 19 secondes, 304 millisecondes à partir du moment où dumpsys alarm A été appelé. De même, une valeur comme +2d13h29m03s882ms Fait référence à une durée relative de 2 jours, 13 heures, 29 minutes ... dans le futur
  • window= Fait référence à l'une des deux constantes internes liées à la méthode de traitement de l'alarme. AlarmManager.WINDOW_EXACT=0 Et est défini lorsque l'alarme est programmée avec setExact() ou setAlarmClock(). AlarmManager.WINDOW_HEURISTIC=-1 Et est réglé lorsque l'alarme est programmée avec setInexactRepeating(). Sinon, la valeur est déterminée par la version de l'API. Pour l'API <19 (KitKat), WINDOW_EXACT Est utilisé et pour l'API> = 19, WINDOW_HEURISTIC Est utilisé. (J'ai dû creuser dans le code source AlarmManager.Java pour comprendre cela.)
  • repeatInterval=900000 Est la fréquence de répétition de l'alarme, par ex. toutes les 900000ms ou 15 minutes. Une valeur de 0 signifie que l'alarme ne se répète pas.
  • count= Fait référence au nombre de fois où une alarme devrait a été déclenchée, mais ne l'était pas pour une raison quelconque. 0 est un bon nombre ici. > 0 signifie que l'alarme a été ignorée pour une raison quelconque.
  • operation=PendingIntent{...} Est une référence au PendingIntent qui est déclenché par l'alarme. Selon que PendingIntent a été instanciée à l'aide de getService, getBroadcast, getActivity ou getActivities, l'alarme démarre un service, envoie une émission ou démarrer une ou plusieurs activités.

Q3: Nombre de références de diffusion

Pour en savoir plus sur cela et les autres éléments de sortie après cela, j'ai dû fouiller dans le code source AlarmManagerService.Java .

Pour que certaines alarmes fonctionnent, l'appareil doit être réveillé et ne doit pas se rendormir tant que toutes les émissions nécessaires n'ont pas été envoyées. La variable interne mBroadcastRefCount est initialisée à 0 et incrémentée lorsque les émissions à envoyer sont mises en file d'attente. Au fur et à mesure que chaque diffusion est envoyée, elle est décrémentée et lorsqu'elle revient à 0, le wakeLock est libéré et il est normal que l'appareil se rende en veille.

Broadcast Ref Count: 0 Signifie simplement qu'au moment où dumpsys alarm A été exécuté, il n'était pas en train d'envoyer des émissions.

Q4: principales alarmes

Il s'agit des dix premières alarmes classées par ordre décroissant en fonction du temps total cumulé pendant lequel le code d'alarme s'est exécuté. Cela peut être utilisé pour trouver des alarmes qui consomment le plus de ressources système, par ex. pour trouver les processus qui peuvent être en cause pour épuiser la durée de vie de la batterie.

Q5: Statistiques d'alarme

Cette section affiche les statistiques de toutes les alarmes qui se sont déclenchées depuis le dernier redémarrage du système. C'est là que vous pouvez regarder pour voir si les alarmes que vous avez définies dans le passé ont été déclenchées, si elles ont réveillé le téléphone, etc. Le format de ces entrées est couvert ensuite.

Q6: Entrées des statistiques d'alarme

Les entrées des statistiques d'alarme ressemblent à ceci:

com.example.someapp +1s857ms running, 0 wakeups:
    +1s817ms 0 wakes 83 alarms: cmp={com.example.someapp/com.example.someapp.someservice}
    +40ms 0 wakes 1 alarms: cmp={com.example.someapp/com.example.someapp.someotherservice}

où dans la première ligne:

  • com.example.someapp Est le nom du package du processus qui a déclenché l'alarme
  • +1s857ms running Est le temps système total consommé par les processus
  • 0 wakeups Est le nombre de fois où l'appareil a été réveillé par l'une de ces alarmes

puis chaque ligne après cela se réfère à l'une des alarmes qui a été définie, avec:

  • +1s817ms Est le temps système total consommé
  • 0 wakes Est le nombre de fois que l'appareil a dû être réveillé
  • 83 alarms Est le nombre de fois que l'alarme a été déclenchée; ce sera seulement> 1 pour les alarmes répétées
  • cmp={...} Le service démarré lors du déclenchement de l'alarme

Alternativement, si l'alarme a déclenché une diffusion, l'entrée peut ressembler à:

Android +4m51s566ms running, 281 wakeups:
    +2m46s583ms 0 wakes 1224 alarms: act=Android.intent.action.TIME_TICK
    +1m25s624ms 89 wakes 89 alarms: act=Android.content.syncmanager.SYNC_ALARM
    +52s898ms 0 wakes 41 alarms: act=com.Android.server.action.NETWORK_STATS_POLL
    ...

avec:

  • act=... Étant le nom de l'intention qui a été diffusée

Il est possible pour une alarme d'avoir à la fois une entrée cmp={...} Et act=..., Ce qui signifie que l'alarme a diffusé une intention et démarré un service.

Sommaire

Le débogage Android les alarmes utilisant la sortie de adb Shell dumpsys alarm Peut être délicat, et il n'y a pas d'emplacement central où les messages dumpsys sont entièrement expliqués. Ce n'est pas toujours apparent la façon dont les alarmes sont regroupées, et il est parfois difficile de déclencher un service ou une activité exactement au moment souhaité. Espérons que ce sera une référence utile pour les personnes qui essaient de déboguer leurs alarmes.

150
morphatic

En tant que personne aux prises avec des alarmes, voici deux conseils:

Débogage de la sortie Shell:

  • voir des temps négatifs ou énormes (par exemple -2hr57m20s311ms, 14d5hr23m07s500ms), c'est parce que j'ai confondu le type d'horloge (par exemple. RTC avec ELAPSED). Cela est clair dans la documentation, "RTC_WAKEUP: Alarm time in System.currentTimeMillis() " https://developer.Android.com/reference/Android/app/AlarmManager.html#RTC_WAKEUP

  • annulation des alarmes en temps réel (après leur création). Utilisez l'annulation qui, si vous avez planifié une intention en attente, nécessite à la fois: alarmManager.cancel(pendingIntent) et pendingIntent.cancel()

5
Jason

Même si la réponse de morphatic est tout ce que vous devez savoir, j'ai créé un projet open source pour une interface graphique pour afficher les mêmes informations de manière visuelle. Je pense que cela pourrait être utile pour d'autres, car cela a été pour moi en premier lieu.

https://github.com/Dottorhouse/DumpsysAlarm

1
Dario R.