Как читать "АБР оболочки иметь инструмент тревога" выход


Я борюсь с установкой сигнализации правильно, и понимание механизма отмены и перепланировки сигналов тревоги.

Я обнаружил, что есть команда adb для извлечения всех тревог, запланированных на устройстве, но я не нашел документацию, объясняющую формат вывода.

Я понимаю, что я прошу здесь много объяснений, поэтому, если кто-нибудь бросит ссылку с подробным объяснением о "adb shell dumpsys alarm", я действительно буду ценить это.

Итак, вот вопросы:

  1. ожидание пакетов тревоги: 23

    a. является ли '23' числом активных в настоящее время запланированных сигналов тревоги?

  2. Batch{4293d3a8 num=1 start=1369361 end=1407261}:
    RTC #0: Alarm{4293d358 type 1 com.андроид.хром}
    type=1 whenElapsed=1369361 when= + 19s304ms window=-1 repeatInterval=0 count=0
    operation=PendingIntent{429e4500: PendingIntentRecord{429dbbc8 com.андроид.chrome broadcastIntent}}

    a. Что такое 'num=1', 'start=1369361'и' end=1407261'?
    b. " RTC " означает сигнал тревоги RTC, я полагаю.
    С. Что стенд#0' для?
    d. что означает 'type=1'?
    e. is' when=+19s304ms ' означает, что сигнал тревоги будет вызван через 19 секунд?
    f. что означает 'window=-1'?
    g. Is 'repeatInterval=0' означает, что это не повторяющийся сигнал тревоги?
    h. is' count=0 ' означает, что этот сигнал тревоги не был отложен из-за состояния сна телефона?
    я. операция=PendingIntent{...} 'означает ожидающее намерение, которое будет вызвано сигналом тревоги, я полагаю.

  3. отсчет ref передачи: 0

    а. Что это?

  4. Лучшие Сигналы Тревоги:

    а. Что это?

  5. +47s271ms работает, 0 пробуждений, 2 тревоги: com.имя пользователя:.погода информация о
    act=com.имя пользователя:.электроприемники.CyclicWeatherUpdater.WEATHER_UPDATE_ACTION
    cmp={com.имя пользователя:.погода информация о/ком.имя пользователя:.электроприемники.CyclicWeatherUpdater}

    a. Is '+47s271ms ' означает, что этот сигнал тревоги будет вызван через 47 секунд?
    b. Что такое "0 пробуждений" - тревога никогда не срабатывала?
    c. что такое "2 тревоги"?
    д. Это ком.имя пользователя:.погода информация о стоящую за именем из пакета, который был дан ожидающему намерению в поле контекста?
    e. означает ли "действие" действие, которое было послано для намерения?
    f. Что такое 'cmp'? Я вижу, что она состоит из имени пакета и имени класса, но откуда они взяты? Из конструктора намерений? g. почему часть сигналов тревоги имеют только " акт "или только "cmp"? Я предположил, что сигналы тревоги без полей 'cmp' предназначены для неявных широковещательных намерений. Тем не менее, почему есть сигналы тревоги без "действия" поле?

  6. Аварийная Статистика:

    а. Что это?

3 55

3 ответа:

я понимаю, что эта тема старая, но ответы не так легко найти, и может быть полезным. Я потратил много времени на то, чтобы понять, что означают эти сообщения.

Q1: Партии

Pending alarm batches: 23

сигналы сгруппированы в пакеты. как описано в документации:

начиная с API 19, Время запуска, переданное этому методу, рассматривается как неточное: сигнал тревоги не будет доставлен до этого времени, но может быть отложено и доставлено некоторое время спустя. ОС будет использовать эту политику для "серии" сигналы тревоги совместно через всю систему, уменьшая число времен прибору нужно "разбудить" и уменьшая пользу батареи. В целом, тревоги, запланированные на ближайшее будущее, не будут отложены до тех пор, пока тревоги, запланированные в далеком будущем.

может быть больше чем один сигнал тревоги в серию. В этом случае есть 23 партии тревог, которые значит, вероятно, запланировано гораздо больше, чем 23 тревоги. В dumpsys alarm вывод, строка, описывающая каждую партию выглядит так:

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

в:

  • 4293d3a8 - внутренний идентификатор, связанный с партией.
  • num=1 - количество аварийных сигналов в этом пакете. В этом случае есть только один сигнал тревоги в партии.
  • the start и end числа представляют собой количество миллисекунд, прошедших с момента запуска системы последняя перезагрузка как описал в этом посте, а также примерно представляют собой окно времени, в котором сигналы тревоги в пакете должны быть вызваны.

Q2: Сигналы Тревоги

каждый сигнал тревоги описывается тремя линиями, которые выглядят так:

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}}

в:

  • первая часть, которая является одним из RTC_WAKEUP,RTC,ELAPSED_WAKEUP или ELAPSED, представляет собой type тревоги и соответствует целое число 0-3, соответственно
  • #0 - это номер будильника в пакете, где номера идут от 0 до n-1 здесь n - количество аварийных сигналов в пакете. Если ваш сигнал тревоги получает пакет с другими, то дальше всего в будущем "когда=" определяет время все сигналы тревоги в пакете будут вызваны.
  • 4293d358 - это внутренний идентификационный номер, связанный с сигнализацией
  • com.android.chrome - это имя пакета класса, который устанавливает тревога
  • type=1, тип сигнала тревоги, см. первую пулю выше
  • whenElapsed=1369361 относится к числу миллисекунд с момента запуска системы, при котором этот сигнал тревоги будет вызван (приблизительно)
  • when=+19s304ms означает, что сигнал тревоги будет вызван через 19 секунд, 304 миллисекунды с момента, когда dumpsys alarm называлась. Аналогично, значение типа +2d13h29m03s882ms относится к относительному времени 2 дня, 13 часов, 29 минут... в будущем
  • window= относится к одной из двух внутренних констант, имеющих отношение к методу, в котором сигнал тревоги дозируется. AlarmManager.WINDOW_EXACT=0 и устанавливается, когда сигнал тревоги запланирован с setExact() или setAlarmClock(). AlarmManager.WINDOW_HEURISTIC=-1 и устанавливается, когда будильник запланирован с setInexactRepeating(). В противном случае значение определяется версией API. Для API WINDOW_EXACT используется и для API >= 19, это. (Я должен был копать в AlarmManager.java исходный код чтобы выяснить это.)
  • repeatInterval=900000 как часто сигнал тревоги повторяется, например, каждые 900000 МС или 15 минут. Значение 0 означает, что сигнал тревоги не повторяются.
  • count= относится к числу раз, что сигнал тревоги должны были вызваны, но не почему-то. 0 является хорошим числом. >0 означает, что сигнал был пропущен по какой-то причине.
  • operation=PendingIntent{...} ссылка на PendingIntent это срабатывает по сигналу тревоги. В зависимости от того, является ли PendingIntent был создан с помощью getService,getBroadcast,getActivity или getActivities, сигнал тревоги запустит службу, отправит трансляцию или начнет одно или несколько действий.

Q3: Вещание Ref Count

чтобы узнать об этом и других предметов, вывод после этого мне пришлось копать в AlarmManagerService.java исходный код.

для того чтобы некоторые сигналы для работы устройство должно быть проснулся, и не спи пока не будут отправлены все необходимые радиопередачи. Внутренняя переменная mBroadcastRefCount инициализируется в 0 и увеличивается в эфир передачи, в очередь. По мере отправки каждой трансляции она уменьшается, и когда она возвращается к 0, и это нормально для устройства, чтобы вернуться в сон.

Broadcast Ref Count: 0 просто означает, что в то время, что dumpsys alarm был запущен, он не был в середине отправки каких-либо передач.

Q4: Верхние Сигналы Тревоги

этот является ли первая десятка тревог ранжирована в порядке убывания по общему суммарному времени выполнения кода тревоги. Это может быть использовано для поиска сигналов тревоги, которые потребляют наибольшее количество системных ресурсов, например, для поиска процессов, которые могут быть виноваты в истощении времени автономной работы.

Q5: Статистика Тревоги

в этом разделе показана статистика для всех аварийных сигналов, запущенных с момента последнего перезапуска системы. Здесь вы можете посмотреть, были ли установлены сигналы тревоги в прошлом срабатывает, если они разбудил телефон, и т. д. Формат этих записей рассматривается далее.

Q6: Записи Статистики Тревоги

записи статистики тревоги выглядят так:

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}

где в первой строке:

  • com.example.someapp это имя пакета процесса, который вызвал тревогу
  • +1s857ms running - это общее системное время, затраченное процессами
  • 0 wakeups это количество раз, когда устройство было разбужено одним из эти сигналы тревоги

и затем каждая строка после этого ссылается на один из сигналов тревоги, который был установлен, с:

  • +1s817ms общее системное время потребляется
  • 0 wakes это количество раз, когда устройство должно было быть разбужено
  • 83 alarms - это число срабатываний сигнала тревоги; это будет только >1 для повторных сигналов тревоги
  • cmp={...} служба, которая была запущена, когда сигнал тревоги был срабатывает

в качестве альтернативы, если сигнал тревоги вызвал трансляцию, запись может выглядеть так:

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
    ...

С:

  • act=... будучи именем намерения, которое было передано

возможно для сигнала тревоги иметь оба cmp={...} и act=... запись, означающая, что сигнал тревоги одновременно транслирует намерение и запускает службу.

резюме

отладка Android сигнализации с помощью выход adb shell dumpsys alarm может быть сложно, и нет центрального местоположения, где dumpsys сообщения полностью объяснил. Не всегда очевидно, как сигналы тревоги собираются вместе, и иногда трудно получить услугу или действие, которое будет вызвано именно тогда, когда это необходимо. Надеюсь, это будет полезным справочником для людей, пытающихся отладить свои сигналы тревоги.

как кто-то, кто также боролся с тревогами, вот два совета:

отладку консоли вывода:

  • видя негативные или огромные времена (например. -2hr57m20s311ms, 14d5hr23m07s500ms), потому что я перепутал тип часов (например. RTC с истекшим). Это ясно из документации:"RTC_WAKEUP: Alarm time in System.currentTimeMillis()" https://developer.android.com/reference/android/app/AlarmManager.html#RTC_WAKEUP

  • отмена сигнализации в режиме реального времени (после создание) их. Используйте отмену, которая, если вы запланировали ожидающее намерение, нуждается в обоих: alarmManager.cancel(pendingIntent) и pendingIntent.cancel()

несмотря на то, что ответ morphatic-это все, что вам нужно знать, я создал проект с открытым исходным кодом для графического интерфейса, чтобы показать ту же информацию визуальным способом. Я думаю, что это может быть полезно для других, так как это было для меня в первую очередь.

https://github.com/Dottorhouse/DumpsysAlarm