ADB命令与Dumpsys alarm查看应用程序唤醒命令

背景

在研究设备的低功耗突然唤醒时,看到了对应的唤醒源:

[   75.813476] suspend ns:      75813465022\x09suspend cycles:       1548322670
[ 75.813465] resume cycles: 2105086036 ## 注意到这一行,唤醒源。
[ 75.813658] pm_system_irq_wakeup: 197 triggered pm8xxx_rtc_alarm [ 75.814549] Enabling non-boot CPUs ...
[ 75.816121] Detected VIPT I-cache on CPU1
[ 75.816267] arch_timer: CPU1: Trapping CNTVCT access
[ 75.816333] CPU1: Booted secondary processor 0x0000000001 [0x51af8014]
[ 75.822557] CPU1 is up
[ 75.825359] Detected VIPT I-cache on CPU2
[ 75.825524] arch_timer: CPU2: Trapping CNTVCT access
[ 75.825598] CPU2: Booted secondary processor 0x0000000002 [0x51af8014]
[ 75.832122] CPU2 is up
[ 75.834884] Detected VIPT I-cache on CPU3
[ 75.835055] arch_timer: CPU3: Trapping CNTVCT access
[ 75.835129] CPU3: Booted secondary processor 0x0000000003 [0x51af8014]
[ 75.842262] CPU3 is up
[ 75.844905] Detected VIPT I-cache on CPU4
[ 75.845065] arch_timer: CPU4: Trapping CNTVCT access
[ 75.845142] CPU4: Booted secondary processor 0x0000000100 [0x51af8002]
[ 75.851134] CPU4 is up
[ 75.852917] Detected VIPT I-cache on CPU5
[ 75.853039] arch_timer: CPU5: Trapping CNTVCT access
[ 75.853095] CPU5: Booted secondary processor 0x0000000101 [0x51af8002]
[ 75.858917] CPU5 is up
[ 75.860717] Detected VIPT I-cache on CPU6
[ 75.860846] arch_timer: CPU6: Trapping CNTVCT access
[ 75.860903] CPU6: Booted secondary processor 0x0000000102 [0x51af8002]
[ 75.867485] CPU6 is up
[ 75.869900] Detected VIPT I-cache on CPU7
[ 75.870034] arch_timer: CPU7: Trapping CNTVCT access
[ 75.870094] CPU7: Booted secondary processor 0x0000000103 [0x51af8002]
[ 75.877657] CPU7 is up
[ 76.035199] enter resume
[ 76.035227] enter disable wake up

因此,需要排查alarm有关的问题。

dumpsys alarm

在安卓adb root进如命令行后(没有root或者root群组的权限执行不了该命令),执行方法:

  • adb shell "dumpsys alarm"
  • adb dumpsys alarm

结果解析

Pending alarm batches

当应用设置ALARM的时候,系统不会将这些ALARM在设置的准确时间内触发,而将用一种批量触发(batches mode)的策略,这样可以最小化地使系统从休眠状态醒来,最低程度地减少电池的消耗,即将一批触发时间接近的闹钟,压缩到某一个时间段内一起触发,而不是一个个触发,这样系统会很难休眠。

Pending alarm batches: 16表示,有16个ALARM将被触发,dumpsys alarm 输出后,就是现实每一个闹钟的触发详情,如:

  Pending alarm batches: 16
Batch{45002a6 num=2 start=1850496 end=2152767 flgs=0x8}:
ELAPSED #1: Alarm{9da07d9 type 3 when 1850496 android}
tag=*alarm*:com.android.server.action.NETWORK_STATS_POLL
type=3 expectedWhenElapsed=+9m18s608ms expectedMaxWhenElapsed=+31m48s608ms whenElapsed=+9m18s608ms maxWhenElapsed=+31m48s608ms when=+9m18s608ms
window=+22m30s0ms repeatInterval=1800000 count=0 flags=0x8
operation=PendingIntent{b0fa59e: PendingIntentRecord{53d87f android broadcastIntent}}
ELAPSED_WAKEUP #0: Alarm{e4104c type 2 when 1252767 android}
tag=*walarm*:WifiConnectivityManager Schedule Watchdog Timer
type=2 expectedWhenElapsed=-39s121ms expectedMaxWhenElapsed=+14m20s879ms whenElapsed=-39s121ms maxWhenElapsed=+14m20s879ms when=-39s121ms
window=+15m0s0ms repeatInterval=0 count=0 flags=0x8
operation=null
listener=android.app.AlarmManager$ListenerWrapper@4da4895
...

Batch

Batch{45002a6 num=2 start=1850496 end=2152767 flgs=0x8}:

45002a6:批处理模式下的内部ID号

num = 2:表示在该batch中,有2个闹钟

    ELAPSED #1: Alarm{9da07d9 type 3 when 1850496 android}
...
ELAPSED_WAKEUP #0: Alarm{e4104c type 2 when 1252767 android}
...

start、end:表示自系统启动后,流逝的时间,该段时间粗略的表示,该闹钟会在start和end之间的时间触发

每一个alrm

对于每一个alrm,都是由这样子的块构成:

    ELAPSED_WAKEUP #1: Alarm{61bf54d type 2 when 21600000 com.android.providers.calendar}
tag=*walarm*:com.android.providers.calendar.intent.CalendarProvider2
type=2 expectedWhenElapsed=+5h38m28s112ms expectedMaxWhenElapsed=+10h8m28s112ms whenElapsed=+5h38m28s112ms maxWhenElapsed=+10h8m28s112ms when=+5h38m28s112ms
window=+4h30m0s0ms repeatInterval=21600000 count=0 flags=0x0
operation=PendingIntent{5331802: PendingIntentRecord{b9e0513 com.android.providers.calendar broadcastIntent}} ELAPSED #0: Alarm{7862350 type 3 when 14535465 android}
tag=*alarm*:LockSettingsPrimaryAuth.nonStrongBiometricIdleTimeoutForUser
type=3 expectedWhenElapsed=+3h40m43s577ms expectedMaxWhenElapsed=+6h40m43s576ms whenElapsed=+3h40m43s577ms maxWhenElapsed=+6h40m43s576ms when=+3h40m43s577ms
window=+2h59m59s999ms repeatInterval=0 count=0 flags=0x8
operation=null
listener=android.app.AlarmManager$ListenerWrapper@2bf9949

ELAPSED_WAKEUP:表示ALARM的类型type,一般有:RTC_WAKEUPRTC ELAPSED_WAKEUPELAPSED

详见:https://developer.android.com/reference/android/app/AlarmManager.html#RTC_WAKEUP

#1:表示在该批量模式中,该ALARM的标号,取值0~n-1,n为该batch中alarm个数

61bf54d:闹钟的内部编号

type=1:闹钟的类型,即第一条中提到的几个闹钟类型,相当于type对应的整数值

com.android.providers.calendar:设置该闹钟的应用包名

whenElapsed=+5h38m28s112ms:该闹钟会在系统开机后,大概5小时后触发。

when = 21600000:该闹钟时间戳为21600000以后触发

window=:根据该alarm被调度的不同方法,设置不同的值:

  • 如果该alarm是 setExact()或setAlarmClock()方法调用的,该值为 AlarmManager.WINDOW_EXACT(=0),
  • 如果是 setInexactRepeating(),则赋值为AlarmManager.WINDOW_HEURISTIC(=- 1),
  • 然而A PI的level不同该值也不同,API小于19(KITKAT)的是WINDOW_EXACT,大于19的是WINDOW_HEURISTIC

repeatInterval=21600000:闹钟的重复频率,900000ms后重复,0表示不重复

count=:表示该alarm因为某些原因而被忽略了的次数,0表示没有被忽略过

operation=PendingIntent{...}:与pendingIntent相关,该intent被实例化后,可以发送广播,启动服务,或者启动Activity, 说白了就是唤醒应用的操作。

Broadcast Ref Count

Broadcast Ref Count: 0

为了使得系统在醒来后,发送必要的广播帧,并且保证在所有的广播帧没有发送出去之前,系统不要进入睡眠状态,内部定义了一个变量:mBroadcastRefCount ,它的初始值是0,

并且当需要发送的广播在队列配对的时候,该变量的值就会递增,发送一个广播后则递减,当减到0的时候,就会释放它持有的wakelock,而让系统进入休眠状态。

所以,Broadcast Ref Count: 0 表示此时此刻,该时刻并没有广播要发送。

Top alarms

根据应用的唤醒系统的时间排行,取最长时间的前十名,然后按照降序列出,有助于找出第三方app因为编程不规范,而导致极度耗电

  Top Alarms:
+10s913ms running, 1 wakeups, 1 alarms: u0a113:com.qti.ltebc
*walarm*:wake_up_from_boot
+10s156ms running, 1 wakeups, 1 alarms: u0a56:com.android.providers.calendar
*walarm*:com.android.providers.calendar.intent.CalendarProvider2
+1s333ms running, 0 wakeups, 1 alarms: 1000:android
*alarm*:com.android.server.action.NETWORK_STATS_POLL
+755ms running, 0 wakeups, 8 alarms: 1000:android
*alarm*:TIME_TICK
+220ms running, 1 wakeups, 1 alarms: 1000:android
*walarm*:EventConditionProvider.EVALUATE
+219ms running, 1 wakeups, 1 alarms: 1000:android
*walarm*:ScheduleConditionProvider.EVALUATE
+202ms running, 0 wakeups, 1 alarms: 1000:android
*alarm*:GraphicsStatsService
+56ms running, 3 wakeups, 3 alarms: 1000:android
*walarm*:WifiConnectivityManager Schedule Periodic Scan Timer
+45ms running, 1 wakeups, 1 alarms: 1000:android
*walarm*:*job.deadline*
+39ms running, 0 wakeups, 1 alarms: 1000:android
*alarm*:*CountQuotaTracker.cleanup*

Alarm Stats

列出所有系统中应用设置alarm的情况,可以排查设置的闹钟是否起作用了。

  Alarm Stats:
1000:android +2s413ms running, 7 wakeups:
+1s333ms 0 wakes 1 alarms, last -20m41s388ms:
*alarm*:com.android.server.action.NETWORK_STATS_POLL
+755ms 0 wakes 8 alarms, last -3m8s638ms:
*alarm*:TIME_TICK
+220ms 1 wakes 1 alarms, last -20m25s368ms:
*walarm*:EventConditionProvider.EVALUATE
+219ms 1 wakes 1 alarms, last -20m25s368ms:
*walarm*:ScheduleConditionProvider.EVALUATE
+202ms 0 wakes 1 alarms, last -20m25s368ms:
*alarm*:GraphicsStatsService
+56ms 3 wakes 3 alarms, last -19m35s130ms:
*walarm*:WifiConnectivityManager Schedule Periodic Scan Timer
+45ms 1 wakes 1 alarms, last -19m35s130ms:
*walarm*:*job.deadline*
+39ms 0 wakes 1 alarms, last -9m32s957ms:
*alarm*:*CountQuotaTracker.cleanup*
+26ms 1 wakes 1 alarms, last -19m55s159ms:
*walarm*:WifiHealthMonitor Schedule Post-Boot Detection Timer
+23ms 0 wakes 1 alarms, last -19m35s130ms:
*alarm*:*job.delay*
1073:com.android.networkstack +8ms running, 2 wakeups:
+5ms 1 wakes 1 alarms, last -20m26s669ms:
*walarm*:DhcpClient.wlan0.TIMEOUT
+3ms 1 wakes 1 alarms, last -20m30s704ms:
*walarm*:DhcpClient.wlan0.KICK
u0a56:com.android.providers.calendar +10s156ms running, 1 wakeups:
+10s156ms 1 wakes 1 alarms, last -20m18s689ms:
*walarm*:com.android.providers.calendar.intent.CalendarProvider2
u0a113:com.qti.ltebc +10s913ms running, 1 wakeups:
+10s913ms 1 wakes 1 alarms, last -20m19s759ms:
*walarm*:wake_up_from_boot

格式如下

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}

例如:

  1073:com.android.networkstack +8ms running, 2 wakeups:
+5ms 1 wakes 1 alarms, last -20m26s669ms:
*walarm*:DhcpClient.wlan0.TIMEOUT
+3ms 1 wakes 1 alarms, last -20m30s704ms:
*walarm*:DhcpClient.wlan0.KICK

com.android.networkstack:设置alarm的应用包名

+8ms running:系统总体被该应用所有的alarm消耗的时间

2 wakeups:设备被闹钟唤醒的次数,包含了每一次alarm的情况

每个alarm

  1073:com.android.networkstack +8ms running, 2 wakeups:
+5ms 1 wakes 1 alarms, last -20m26s669ms:
*walarm*:DhcpClient.wlan0.TIMEOUT

+5ms:该alarm消耗的时间

1 wakes:设备被唤醒的次数

1 alarms:alarm被触发的次数,重复闹钟,该值大于1

如果触发的是广播,则格式如:

  1000:android +2s413ms running, 7 wakeups:
+1s333ms 0 wakes 1 alarms, last -20m41s388ms:
*alarm*:com.android.server.action.NETWORK_STATS_POLL
+755ms 0 wakes 8 alarms, last -3m8s638ms:
*alarm*:TIME_TICK
+220ms 1 wakes 1 alarms, last -20m25s368ms:
*walarm*:EventConditionProvider.EVALUATE
+219ms 1 wakes 1 alarms, last -20m25s368ms:
*walarm*:ScheduleConditionProvider.EVALUATE
+202ms 0 wakes 1 alarms, last -20m25s368ms:
*alarm*:GraphicsStatsService
+56ms 3 wakes 3 alarms, last -19m35s130ms:
*walarm*:WifiConnectivityManager Schedule Periodic Scan Timer
+45ms 1 wakes 1 alarms, last -19m35s130ms:
*walarm*:*job.deadline*
+39ms 0 wakes 1 alarms, last -9m32s957ms:
*alarm*:*CountQuotaTracker.cleanup*
+26ms 1 wakes 1 alarms, last -19m55s159ms:
*walarm*:WifiHealthMonitor Schedule Post-Boot Detection Timer
+23ms 0 wakes 1 alarms, last -19m35s130ms:
*alarm*:*job.delay* action. 代表:发送广播的名称

ADB命令与Dumpsys alarm查看应用程序唤醒命令的更多相关文章

  1. Dumpsys Alarm查看应用程序唤醒命令

    Dumpsys alarm查看应用程序唤醒命令: 在安卓adb root进如命令行后(没有root或者root群组的权限执行不了该命令), 1. <span style="font-s ...

  2. windows下使用adb工具查看android程序cpu和内存消耗情况

    在实际的开发当中,尤其软件运行在一个硬件设备比较差的环境下,对软件占用资源大的问题是开发者们必须要解决的问题,系统比较卡.觉得应该看看程序的cpu和内存消耗 一直以来都在windows下编程,已经习惯 ...

  3. linux常用查看硬件设备信息命令

    转载:http://blog.chinaunix.net/uid-26782198-id-3242120.html # uname -a               # 查看内核/操作系统/CPU信息 ...

  4. Linux查看系统信息的一些命令及查看已安装软件包的命令

    转自:http://cheneyph.iteye.com/blog/824746 系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看 ...

  5. C# 控制台程序(命令行程序)设置字体颜色,窗口宽高,光标行数

    控制台程序(命令行程序)设置窗口宽度高度,如下代码: Console.WriteLine(Console.WindowHeight); Console.WriteLine(Console.Buffer ...

  6. linux 查看服务器性能常用命令

    一.top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器   下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来 ...

  7. Linux查看和结束进程命令详解

    在ubuntu中,终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ----------------------------------- ...

  8. 不同linux系统添加开机启动程序的命令

    see http://phpcj.org/blog/%E4%B8%8D%E5%90%8Clinux%E7%B3%BB%E7%BB%9F%E6%B7%BB%E5%8A%A0%E5%BC%80%E6%9C ...

  9. [转] 查看CPU使用率 top命令详解

    一 top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前 台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示 ...

  10. linux常用查看硬件设备信息命令(转载)

    系统 # uname -a                                       # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue         ...

随机推荐

  1. LVGL scroll超出父界面不隐藏

    问题 超出父界面不隐藏问题,即时使用了lv_obj_set_style_clip_corner()函数,也不起作用,如下图所示: 即使使用lv_obj_set_style_clip_corner(vi ...

  2. 基于权电阻网络的VGA色条显示#DE10-lite#verilog#qp

  3. SAP集成技术(三)接口管理的挑战

    接口管理不是一个新概念,在云应用出现之前,就有接口管理问题,和混合场景相比,不同应用间的集成更为常见.经典的问题包括:哪个工具是我的使用场景中的正确选择?如何操作我的集成平台?如何设计组织?以及如何保 ...

  4. 【GUI界面软件】快手评论区采集:自动采集10000多条,含二级评论、展开评论!

    目录 一.背景说明 1.1 效果演示 1.2 演示视频 1.3 软件说明 二.代码讲解 2.1 爬虫采集模块 2.2 软件界面模块 2.3 日志模块 三.获取源码及软件 一.背景说明 1.1 效果演示 ...

  5. 【GUI软件】小红书搜索结果批量采集,支持多个关键词同时抓取!

    目录 一.背景介绍 1.1 爬取目标 1.2 演示视频 1.3 软件说明 二.代码讲解 2.1 爬虫采集模块 2.2 软件界面模块 2.3 日志模块 三.获取源码及软件 一.背景介绍 1.1 爬取目标 ...

  6. neo4j的安装部署

    Linux下载neo4j 直接在服务器上使用命令下载: curl -O http://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz 安装Neo4j ...

  7. Python 潮流周刊#50:我最喜欢的 Python 3.13 新特性!

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  8. 计算机组成原理—中央处理器CPU

    文章目录 CPU的功能与架构 CPU的组成 运算器 控制器 指令执行过程 指令流程 指令执行方案 数据通路 单总线结构 专用通路结构 硬布线控制器设计 硬布线执行流程 硬布线CU内部 怎么设计微操作的 ...

  9. 通过 OpenAPI 部署 Npcf_PolicyAuthorization-PostAppSessions API Service

    目录 文章目录 目录 OpenAPI 部署步骤 OpenAPI 官方网站:https://github.com/OAI/OpenAPI-Specification 支持通过标准的 yaml 文件来生成 ...

  10. Kubernetes Pod调度:从基础到高级实战技巧

    本文深入探讨了Kubernetes中的Pod调度机制,包括基础概念.高级调度技术和实际案例分析.文章详细介绍了Pod调度策略.Taints和Tolerations.节点亲和性,以及如何在高流量情况下优 ...