如何读取“adb shell dumpsys Alarm”输出

2023-11-22

我正在努力正确设置闹钟,并理解取消和重新安排闹钟的机制。

我发现有一个 adb 命令可以检索设备上安排的所有警报,但我没有找到解释输出格式的文档。

我确实理解,我在这里要求很多解释,所以如果有人会抛出一个包含有关“adb shell dumpsys Alarm”详细解释的链接,我将非常感激。

所以,有以下问题:

  1. 待处理警报批次:23

    A。 “23”是当前活动的预定警报的数量吗?

  2. 批次{4293d3a8 num=1 start=1369361 end=1407261}:
    RTC #0:闹钟{4293d358 类型 1 com.android.chrome}
    类型=1 当Elapsed=1369361 当=+19s304ms 窗口=-1 重复间隔=0 计数=0
    操作=PendingIntent{429e4500:PendingIntentRecord{429dbbc8 com.android.chromebroadcastIntent}}

    A。什么是“num=1”、“start=1369361”和“end=1407261”?
    b.我认为“RTC”代表 RTC 闹钟。
    C。 “#0”代表什么?
    d. “类型=1”是什么意思?
    e. “when=+19s304ms”是否意味着19秒后将触发警报?
    F。 “窗口=-1”是什么意思?
    G。 “repeatInterval=0”是否意味着这是非重复警报?
    H。 “count=0”是否意味着由于手机睡眠状态,此警报未推迟?
    我。 'operation=PendingIntent{...}' 代表待处理的意图,我认为它将由警报触发。

  3. 广播引用计数:0

    A。这是什么?

  4. 主要警报:

    A。这是什么?

  5. +47s271ms 运行,0 次唤醒,2 次闹钟:com.username.weatherinfo
    act=com.username.receivers.CyclicWeatherUpdater.WEATHER_UPDATE_ACTION
    cmp={com.username.weatherinfo/com.username.receivers.CyclicWeatherUpdater}

    A。 “+47s271ms”是否意味着该警报将在 47 秒内触发?
    b.什么是“0 次唤醒”——警报从未被触发?
    C。什么是“2个警报”?
    d. “com.username.weatherinfo”是否代表包的名称,它被赋予上下文字段中的待处理意图?
    e. “行为”是指为了意图而发送的行动吗?
    F。什么是“cmp”?我发现它是由包名和类名组成的 - 但它们是从哪里获取的?来自意图构造函数? G。为什么部分警报只有“act”或只有“cmp”?我假设,没有“cmp”字段的警报用于隐式广播意图。但是,为什么有警报没有“act”字段呢?

  6. 警报统计:

    A。这是什么?


我意识到这个线程很旧,但答案不容易找到,而且可能有用。我花了很多时间来弄清楚这些消息的含义。

Q1: 批次

Pending alarm batches: 23

警报被组织成批次。如文档中所述:

从 API 19 开始,传递给此方法的触发时间被视为不精确:警报不会在此时间之前传递,但可能会推迟并稍后传递。操作系统将使用此策略以便"batch"整个系统的警报一起发出,最大限度地减少设备需要“唤醒”的次数并最大限度地减少电池的使用。一般来说,安排在不久的将来的警报不会被推迟,只要安排在很远的将来的警报。

每批次可能有多个警报。在这种情况下有 23 个batches警报,这意味着安排的警报可能远多于 23 个。在里面dumpsys alarm输出,描述每个批次的行如下所示:

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

其中:

  • 4293d3a8是与批次关联的内部 ID。
  • num=1是该批次中的警报数量。在这种情况下,该批次中只有一个警报。
  • the start and 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, or ELAPSED,代表type报警值,分别对应整数值0-3
  • #0是批次内警报的编号,其中数字从 0 到n-1 where n是批次中的警报数量。如果您的闹钟与其他闹钟一起批处理,则最远的未来时间“when=”定义时间all将触发该批次的警报。
  • 4293d358是与警报关联的内部 ID 号
  • com.android.chrome是设置闹钟的类的包名
  • type=1,警报类型,请参见上面的第一个项目符号
  • whenElapsed=1369361指系统启动后多少毫秒将触发此警报(大约)
  • when=+19s304ms表示警报将在 19 秒(304 毫秒)后触发dumpsys alarm被称为。同样,像这样的值+2d13h29m03s882ms指的是未来2天、13小时、29分钟……的相对时间
  • window=指与警报批量处理方法有关的两个内部常量之一。AlarmManager.WINDOW_EXACT=0并在闹钟被安排时设置setExact() or setAlarmClock(). AlarmManager.WINDOW_HEURISTIC=-1并在闹钟被安排时设置setInexactRepeating()。否则,该值由 API 版本确定。对于 API WINDOW_EXACT用于 API >= 19,WINDOW_HEURISTIC用来。 (我不得不深入挖掘AlarmManager.java源代码来弄清楚这一点。)
  • repeatInterval=900000是闹钟重复的频率,例如每 900000 毫秒或 15 分钟一次。值 0 表示警报不重复。
  • count=指的是报警的次数should已被触发,但是wasn't因为某些原因。 0 在这里是一个很好的数字。 >0 表示由于某种原因跳过了警报。
  • operation=PendingIntent{...}是对PendingIntent由警报触发。取决于是否PendingIntent被实例化使用getService, getBroadcast, getActivity, or getActivities,闹钟将启动一项服务、发送广播或启动一项或多项活动。

Q3:广播引用计数

要了解此内容以及此后的其他输出项目,我必须深入挖掘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
    ...

with:

  • act=...是广播意图的名称

警报可能同时具有cmp={...} and a act=...条目,意味着警报既广播意图又启动服务。

Summary

使用输出调试 android 警报adb shell dumpsys alarm可能很棘手,并且没有中心位置dumpsys消息已得到充分解释。警报如何批量组合在一起并不总是显而易见,有时很难在需要时准确触发服务或活动。希望这将为尝试调试警报的人们提供有用的参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何读取“adb shell dumpsys Alarm”输出 的相关文章

  • 位图背景图像应支持哪些屏幕尺寸/密度组合?

    我正在编写一个应用程序 我需要一些全屏位图背景 基于我天真的阅读支持多屏 http developer android com guide practices screens support html在 Android 文档中 为了涵盖我的
  • 有没有一种方法可以在不使用意图的情况下在活动之间发送数据?

    我有一个对于每个用户来说都是唯一的用户名 我想将其发送到某个活动 但我不想使用意图 create an intent and sends username Intent intent new Intent RegisterOwner thi
  • Facebook4j API:搜索

    我正在使用 Facebook4j 通过关键字获取状态 facebook4j conf ConfigurationBuilder fac new facebook4j conf ConfigurationBuilder fac setDebu
  • 如何在android中批量插入sqlite

    我正在使用 SQLiteOpenHelper 进行数据插入 我需要插入2500个id和2500个名字 所以花费了太多时间 请任何人帮助我如何减少插入时间 我们可以一次插入多条记录吗 任何人都可以帮助我 先感谢您 代码 public clas
  • 如何在 Picasso 中使用磁盘缓存?

    我正在使用 Picasso 在我的 Android 应用程序中显示图像 load image This is within a activity so this context is activity public void loadIma
  • 如何在 Jetpack compose 中制作 FlipCard 动画

    我有一个现有的应用程序 我在其中使用 XML 中的 Objectanimator 实现了 FlipCard 动画 如下所示 如果我点击一张卡片 它会水平翻转 但现在我想将其迁移到 jetpack compose 那么jetpack comp
  • Firebase Messaging FCM 在可配置的时间间隔内分发

    当您使用 FCM 向给定应用程序的所有设备发送推送时 这可能会导致许多用户同时打开他们的应用程序 从而导致大量服务器轮询 从而导致负载峰值 有没有一种方便的方法可以在给定的时间间隔内分发消息以进行计划推送 最后 我们找到了一种可能的方法 通
  • 地理编码 API 与地理编码器

    在我的应用程序中 我需要使用地理编码 但我不太清楚该使用哪种方法 直到昨天我在URL中添加了参数maps googleapis com maps api geocode json address myparameter sensor fal
  • 我如何从android中的复选框获取值

    我想获取复选框中所选项目的名称 但我只得到一些字母数字 如何从复选框中获取所选项目的名称 public View getView int position View convertView ViewGroup parent View vie
  • 如何将现有的 SQLite3 数据库导入 Room?

    好吧 我在桌面上使用 SQLite3 创建了一个只需要读取的某些信息的数据库 我正在制作的应用程序不需要在此表中插入或删除信息 我在 Room 数据库层上做了相当多的谷歌搜索 所有文档都需要在构建应用程序时在 Room 中创建一个新的数据库
  • Android Studio 安装失败,APK 未签名

    最近从 Eclipse 更改为 Android Studio 我还更改了 JDKjava open jdk to jdk1 7 0 45 现在我尝试运行我的第一个应用程序 并收到以下消息 Installation failed since
  • org.apache.http.conn.HttpHostConnectException:在 android 中连接到 http://localhost 被拒绝

    我正在制作一个应用程序 在执行它时将图像上传到服务器并将其数据库更新到android中的服务器 它显示错误 Connection to http localhost refused 还有更多错误 我研究了这个问题 发现不是提供 URL 连接
  • 如何使用共享首选项在两个 Android 应用程序之间共享数据?

    我有两个应用程序 App1 和 App2 我想使用共享首选项在 App1 中保存数据并在 App2 中访问 反之亦然 我可以在 App1 中保存数据并在 App2 中访问数据 但反之则不行 这就是我现在正在做的 在清单中 android s
  • phonegap html5 android 同步文件系统 IO

    如何使用 PhoneGaps 文件系统 API 同步读写文件 有可用的同步包装器吗 无法通过提供的 api 同步访问文件 从phonegap的实现方式猜测 我怀疑您是否可以编写一个插件来同步执行此操作
  • 调整 SwipeRefreshLayout 高度,将 View 置于其底部

    I have SwipeRefreshLayout里面一个RelativeLayout 问题是SwipeRefreshLayout占据了屏幕上的所有位置 我需要放置一个视图after这个观点 看图片 https i stack imgur
  • 运行 Android 应用程序时出现错误

    我已经使用 Eclipse 创建了一个 Android 应用程序 但应用程序未在 AVD 上运行 它显示 不幸的是已停止工作 日志猫消息如下 07 29 04 59 50 789 W dalvikvm 784 threadid 1 thre
  • Android OptionsMenu问题,背景始终透明

    我的选项菜单总是不显示背景 背景是透明的 有谁知道如何摆脱这个 我的失败起源活动是从另一个自定义活动扩展的 我在 eclipse 上有这个项目 选项菜单工作正常 但自从我迁移到 AndroidStudio 后 选项菜单始终是透明的 我尝试更
  • 分离 Fragment 和删除 Fragment 有什么区别?

    在 Android 文档中碎片交易 http developer android com reference android app FragmentTransaction html我注意到两种非常相似的方法 detach and remo
  • 如何从一个活动检索 Double 值到另一活动?

    我制作了一个包含 2 个活动的应用程序 其中第一个活动包含一些 EditText 十进制数字 另一个活动也包含一些 EditText 十进制 现在我想将一个 EditText 的值传递给另一个 但作为 双 而不是作为一个字符串 因为该值将用
  • 如何解决android程序中的警告“从不本地读取”

    为什么我收到警告说 The field testscreen ScaleAnimToShow mVanishAfter is never read locally testscreen java testscreen src com tes

随机推荐