Как читать "АБР оболочки иметь инструмент тревога" выход
Я борюсь с установкой сигнализации правильно, и понимание механизма отмены и перепланировки сигналов тревоги.
Я обнаружил, что есть команда adb для извлечения всех тревог, запланированных на устройстве, но я не нашел документацию, объясняющую формат вывода.
Я понимаю, что я прошу здесь много объяснений, поэтому, если кто-нибудь бросит ссылку с подробным объяснением о "adb shell dumpsys alarm", я действительно буду ценить это.
Итак, вот вопросы:
-
ожидание пакетов тревоги: 23
a. является ли '23' числом активных в настоящее время запланированных сигналов тревоги?
-
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{...} 'означает ожидающее намерение, которое будет вызвано сигналом тревоги, я полагаю. -
отсчет ref передачи: 0
а. Что это?
-
Лучшие Сигналы Тревоги:
а. Что это?
-
+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' предназначены для неявных широковещательных намерений. Тем не менее, почему есть сигналы тревоги без "действия" поле? -
Аварийная Статистика:
а. Что это?
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()