Ответ 1
Я понимаю, что эта ветка устарела, но ответы нелегко найти и могут быть полезны. Я потратил много времени на то, что означают эти сообщения.
Q1: партии
Pending alarm batches: 23
Тревоги организованы в партии. Как описано в документации:
Начиная с API 19, время запуска, переданное этому методу, рассматривается как неточное: сигнал тревоги не доставляется до этого времени, но может быть отложен и доставлен через некоторое время. ОС будет использовать эту политику для "пакетных" аварийных сигналов вместе во всей системе, минимизируя количество раз, когда устройство должно "просыпаться" и минимизировать использование батареи. В общем случае аварийные сигналы, запланированные в ближайшем будущем, не будут отложены до тех пор, пока тревога запланирована далеко в будущем.
В партии может быть более одного сигнала тревоги. В этом случае имеется 23 пакета сигналов тревоги, что означает, что, вероятно, запланировано гораздо больше 23 аварийных сигналов. На выходе dumpsys alarm
строка, описывающая каждую партию, выглядит следующим образом:
Batch{4293d3a8 num=1 start=1369361 end=1407261}:
В котором:
-
4293d3a8
- внутренний идентификатор, связанный с пакетом. -
num=1
- количество тревог в этой партии. В этом случае в пакете есть только один сигнал. - числа
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 < 19 (KitKat),WINDOW_EXACT
и для API >= 19 используетсяWINDOW_HEURISTIC
. (Я должен был найти исходный кодAlarmManager.java
, чтобы понять это.) -
repeatInterval=900000
заключается в том, как часто повторяется сигнал тревоги, например. каждые 900000мс или 15 минут. Значение 0 означает, что будильник не повторяется. -
count=
относится к числу раз, когда срабатывал сигнал , но по какой-либо причине не был. 0 - хорошее число здесь. > 0 означает, что по какой-то причине сигнал пропущен. -
operation=PendingIntent{...}
- это ссылка наPendingIntent
, которая срабатывает по сигналу тревоги. В зависимости от того, был ли экземплярPendingIntent
создан с использованиемgetService
,getBroadcast
,getActivity
илиgetActivities
, будильник запустит службу, отправит трансляцию или начнет одно или несколько действий.
Q3: количество трансляций Ref
Чтобы узнать об этом и других выходных элементах после этого, я должен был найти исходный код AlarmManagerService.java
.
Для того, чтобы некоторые сигналы тревоги работали, устройство должно быть разбужено и не должно возвращаться спать, пока не будут отправлены все необходимые передачи. Внутренняя переменная mBroadcastRefCount
инициализируется в 0 и увеличивается при передаче в очереди. По мере того, как посылается каждая передача, она уменьшается и когда она возвращается к 0, выдается wakeLock
, и устройство нормально возвращается в режим сна.
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=...
, что означает, что сигнал тревоги передавал намерение и запускал службу.
Резюме
Отладка андроид-сигналов с использованием вывода adb shell dumpsys alarm
может быть сложной, и нет центрального местоположения, где сообщения dumpsys
полностью объясняются. Не всегда очевидно, как сбрасываются сигналы тревоги, и иногда бывает трудно получить услугу или активность, которые будут срабатывать именно по желанию. Надеюсь, это будет полезной ссылкой для людей, пытающихся отладить свои тревоги.