系统开发干货技能:系统广播broadcast调试命令汇总

系统广播调试命令全解析

背景:

经常在做系统开发或者app开发时候都会有接触到广播发送和广播接收相关的业务,广播属于一种非常高频的系统跨进程通信方式,比如近期在做audio音量调节,耳机插拔相关的开发就经常与广播打交道。
在这里插入图片描述

但是经常也需要检查系统中一些广播发送的相关情况,比如当前广播ACTION有哪些接收者,广播是否有发送出去,广播是否为粘性广播等,那么如果需要这些广播信息又如何进行确认呢?
那么本文就来带大家使用dumpsys相关命令查看广播相关的详细信息。

调试命令详解:

在使用命令前,回顾一点广播相关知识:
前台队列(Foreground Queue):

优先级最高,超时时间较短(约10秒)。例如,ACTION_TIME_TICK 系统广播就在此队列。

后台队列(Background Queue):

优先级较低,超时时间较长(约60秒)。大部分应用自定义广播在此队列。

粘性广播队列(Sticky Broadcasts):

存储通过 sendStickyBroadcast 发送的广播,这些广播会被缓存,后续注册的Receiver也能立即收到。

命令使用:
因为广播属于四大组件,当然属于ams部分,所以可以通过dumpsys activity来看看是否有广播相关的输出。
先使用dumpsys activity -h看看相关使用帮助,看看广播相关的命令

test@test:~/disk_2T/aosp15_xiaomi$ adb shell dumpsys activity  -h
Activity manager dump options:
  [-a] [-c] [-p PACKAGE] [-h] [WHAT] ...
  WHAT may be one of:
    a[ctivities]: activity stack state
    r[recents]: recent activities state
    b[roadcasts] [PACKAGE_NAME] [history [-s]]: broadcast state 
    broadcast-stats [PACKAGE_NAME]: aggregated broadcast statistics
    i[ntents] [PACKAGE_NAME]: pending intent state
    p[rocesses] [PACKAGE_NAME]: process state
    o[om]: out of memory management
    perm[issions]: URI permission grant state
    prov[iders] [COMP_SPEC ...]: content provider state
    provider [COMP_SPEC]: provider client-side state
    s[ervices] [COMP_SPEC ...]: service state
    allowed-associations: current package association restrictions
    as[sociations]: tracked app associations
    start-info [PACKAGE_NAME]: historical process start information
    exit-info [PACKAGE_NAME]: historical process exit information
    lmk: stats on low memory killer
    lru: raw LRU process list
    binder-proxies: stats on binder objects and IPCs
    settings: currently applied config settings
    timers: the current ANR timer state
    service [COMP_SPEC]: service client-side state
    package [PACKAGE_NAME]: all state related to given package
    all: dump all activities
    top: dump the top activity
    users: user state
  WHAT may also be a COMP_SPEC to dump activities.
  COMP_SPEC may be a component name (com.foo/.myApp),
    a partial substring in a component name, a
    hex object identifier.
  -a: include all available server state.
  -c: include client state.
  -p: limit output to given package.
  -d: limit output to given display.
  --checkin: output checkin format, resetting data.
  --C: output checkin format, not resetting data.
  --proto: output dump in protocol buffer format.
  --dump-dumpable: dump just the DUMPABLE-related state of an activity. Use the --list-dumpables option to list the supported DUMPABLEs
  --list-dumpables: show the available dumpables in an activity

上面帮助信息可以看出,完全可以使用

  dumpsys activity  b[roadcasts] [PACKAGE_NAME] [history [-s]]: broadcast state 

注意中括号[]部分其实是属于可选不是必写的部分,所以给大家一个最偷懒的命令:

dumpsys activity b

就可以输出广播相关的所有信息,使用该命令后输出的信息太多,大家最好输出到txt文本中进行查看

dumpsys activity b  > ~/1.txt

然后去1.txt中查看相关的信息。
查看广播相关信息时候,因为信息过大过多,所以大家也需要过滤重点的进行查看,这里给大家过滤一共3个大块作为查看主要目标。

在这里插入图片描述
这里主要就针对下面3个部分:
1、所有注册过的广播接受者信息 Registered Receivers

2、历史发送的广播相关记录 Historical broadcasts

3、粘性广播相关 Sticky broadcasts

Registered Receivers

系统中所有的注册的广播接受者列表


  * ReceiverList{dedb181 4252 system/1000/u0 local:1691968}
    app=4252:system/1000 pid=4252 uid=1000 user=0 #receivers=316
    Filter #0: BroadcastFilter{5101226}
      Action: "android.media.action.MICROPHONE_MUTE_CHANGED"
      mPriority=1000, mOrder=0, mHasStaticPartialTypes=false, mHasDynamicPartialTypes=false
    Filter #1: BroadcastFilter{cc37e67}
      Action: "android.media.STREAM_MUTE_CHANGED_ACTION"
      mPriority=1000, mOrder=0, mHasStaticPartialTypes=false, mHasDynamicPartialTypes=false
  * ReceiverList{7374606 4539 com.android.systemui/10144/u0 remote:e3c8e1}
    app=4539:com.android.systemui/u0a144 pid=4539 uid=10144 user=0 #receivers=123
    Filter #0: BroadcastFilter{882d4c7}
      Action: "android.app.action.CONSOLIDATED_NOTIFICATION_POLICY_CHANGED"
      Action: "android.app.action.NOTIFICATION_POLICY_CHANGED"
      Action: "android.app.action.INTERRUPTION_FILTER_CHANGED"
  * ReceiverList{97f2387 4539 com.android.systemui/10144/u0 remote:fcc97c6}
    app=4539:com.android.systemui/u0a144 pid=4539 uid=10144 user=0 #receivers=123
    Filter #0: BroadcastFilter{95f72b4}
      Action: "android.intent.action.PACKAGE_REPLACED"
      Action: "android.intent.action.PACKAGE_CHANGED"
      Action: "android.intent.action.PACKAGE_REMOVED"
      Action: "android.intent.action.PACKAGE_ADDED"
      Scheme: "package"
    Filter #1: BroadcastFilter{dcededd}
      Action: "com.android.systemui.action.PLUGIN_CHANGED"
      Action: "android.intent.action.PACKAGE_REPLACED"
      Action: "android.intent.action.PACKAGE_CHANGED"
      Action: "com.android.systemui.action.DISABLE_PLUGIN"
      Action: "android.intent.action.PACKAGE_REMOVED"
      Action: "android.intent.action.PACKAGE_ADDED"
      Scheme: "package"
      requiredPermission=com.android.systemui.permission.PLUGIN
    Filter #2: BroadcastFilter{4ea6a52}
      Action: "android.intent.action.USER_UNLOCKED"
  * ReceiverList{a976061 4818 com.android.phone/1001/u0 remote:3c2b7c8}
    app=4818:com.android.phone/1001 pid=4818 uid=1001 user=0 #receivers=89
    Filter #0: BroadcastFilter{dd7c786}
      Action: "android.telephony.action.SIM_APPLICATION_STATE_CHANGED"
      Action: "android.telephony.action.SIM_CARD_STATE_CHANGED"

核心信息剖析

ReceiverList{a976061 4818 com.android.phone/1001/u0 remote:3c2b7c8}  

—直接代表具体的接受者

app=4818:com.android.phone/1001 pid=4818 uid=1001 user=0 #receivers=89

—代表播接收者具体app相关信息,比如pid,uid,包名等

    Filter #0: BroadcastFilter{5101226}
      Action: "android.media.action.MICROPHONE_MUTE_CHANGED"
      mPriority=1000, mOrder=0, mHasStaticPartialTypes=false, mHasDynamicPartialTypes=false
    Filter #1: BroadcastFilter{cc37e67}
      Action: "android.media.STREAM_MUTE_CHANGED_ACTION"
      mPriority=1000, mOrder=0, mHasStaticPartialTypes=false, 

—代表广播接收者具体接受哪些action,过滤哪些action等信息,广播优先级等

总结:
从这个信息可以查找自己app当前注册了哪些广播,或者查看某个广播action被哪些app进行了注册接收。

Historical broadcasts

会记录所有系统的广播发送派发相关信息,也是dumpsys中最重要的广播信息。

 Historical Broadcast modern #4:
      BroadcastRecord{4f7a458 android.media.VOLUME_CHANGED_ACTION/u-1} to user -1
      Intent { act=android.media.VOLUME_CHANGED_ACTION flg=0x14000010 (has extras) }
        extras: Bundle[{android.media.EXTRA_VOLUME_STREAM_TYPE_ALIAS=3, android.media.EXTRA_VOLUME_STREAM_TYPE=3, android.media.EXTRA_VOLUME_STREAM_VALUE=11, android.media.EXTRA_PREV_VOLUME_STREAM_VALUE=10}]
      caller=android 4252:system/1000 pid=4252 uid=1000
      options=Bundle[{android:broadcast.deferralPolicy=2, android:broadcast.deliveryGroupMatchingKey=3, android:broadcast.deliveryGroupMatchingNamespace=android.media.VOLUME_CHANGED_ACTION, android:broadcast.deliveryGroupPolicy=1}]
      enqueueClockTime=2025-03-10 23:57:08.619 dispatchClockTime=2025-03-10 23:57:08.622
      dispatchTime=-6s850ms (+2ms since enq) finishTime=-6s824ms (+26ms since disp)
      nextReceiver=11
      terminalCount=11
      DELIVERED scheduled +2ms terminal +1ms (-1) #0: BroadcastFilter{548e280 1000/u0 ReceiverList{8a48303 4252 system/1000/u0 local:ce17b2}}
        reason: assuming delivered
      DELIVERED scheduled +4ms terminal +2ms (-1) #1: BroadcastFilter{7e0fb07 10144/u0 ReceiverList{8b91d46 4539 com.android.systemui/10144/u0 remote:6f57521}}
        reason: assuming delivered
      DELIVERED scheduled +3ms terminal 0 (-1) #2: BroadcastFilter{4ab1039 1000/u0 ReceiverList{30a6000 4252 system/1000/u0 local:5af8683}}
        reason: assuming delivered
      DELIVERED scheduled +7ms terminal +1ms (-1) #3: BroadcastFilter{77e5524 10144/u0 ReceiverList{87b49b7 4539 com.android.systemui/10144/u0 remote:905b8b6}}
        reason: assuming delivered
      DELIVERED scheduled +10ms terminal 0 (-1) #4: BroadcastFilter{2c6b38d 1000/u0 ReceiverList{293ec24 4836 com.android.settings/1000/u0 remote:89cdcb7}}
        reason: assuming delivered
      DELIVERED scheduled +10ms terminal +2ms (-1) #5: BroadcastFilter{240bdaa 1000/u0 ReceiverList{9f78895 4836 com.android.settings/1000/u0 remote:f2e504c}}
        reason: assuming delivered
      DELIVERED scheduled +16ms terminal 0 (-1) #6: BroadcastFilter{db28afe 1000/u0 ReceiverList{f0da6b9 4836 com.android.settings/1000/u0 remote:e974080}}
        reason: assuming delivered
      DELIVERED scheduled +20ms terminal +1ms (-1) #7: BroadcastFilter{e4c9f98 1000/u0 ReceiverList{c0b257b 4836 com.android.settings/1000/u0 remote:828590a}}
        reason: assuming delivered
      DELIVERED scheduled +21ms terminal +1ms (-1) #8: BroadcastFilter{62c8f3 1000/u0 ReceiverList{382ff62 4836 com.android.settings/1000/u0 remote:9675e2d}}
        reason: assuming delivered
      DELIVERED scheduled +22ms terminal +1ms (-1) #9: BroadcastFilter{6280686 1000/u0 ReceiverList{3153b61 4836 com.android.settings/1000/u0 remote:8731ec8}}
        reason: assuming delivered
      DELIVERED scheduled +26ms terminal 0 (-1) #10: BroadcastFilter{1a3605e 1000/u0 ReceiverList{350f599 4836 com.android.settings/1000/u0 remote:66cfee0}}
        reason: assuming delivered

信息解读:

BroadcastRecord{4f7a458 android.media.VOLUME_CHANGED_ACTION/u-1}

----代表发送的广播信息对象,一般会还有核心的action信息,比如上面代表VOLUME_CHANGED_ACTION类型的广播发送的记录。

Intent { act=android.media.VOLUME_CHANGED_ACTION flg=0x14000010 (has extras) }
        extras: Bundle[{android.media.EXTRA_VOLUME_STREAM_TYPE_ALIAS=3, android.media.EXTRA_VOLUME_STREAM_TYPE=3, android.media.EXTRA_VOLUME_STREAM_VALUE=11, android.media.EXTRA_PREV_VOLUME_STREAM_VALUE=10}]

—广播发送时候一般会有Intent,上面就展示详细的Intent信息,可以看到上面有详细的intent中携带的相关参数

caller=android 4252:system/1000 pid=4252 uid=1000

—代表谁发送的,这里派发报名,uid,pid等

 enqueueClockTime=2025-03-10 23:57:08.619 dispatchClockTime=2025-03-10 23:57:08.622

—代表广播这个时候入队是开始派发时间

 dispatchTime=-6s850ms (+2ms since enq) finishTime=-6s824ms (+26ms since disp)
      nextReceiver=11
      terminalCount=11
      DELIVERED scheduled +2ms terminal +1ms (-1) #0: BroadcastFilter{548e280 1000/u0 ReceiverList{8a48303 4252 system/1000/u0 local:ce17b2}}
        reason: assuming delivered

这里代表一个个广播接收者相关信息即啥时候派发过去的耗时。

注意从dumpsys看BroadcastRecord信息列表一般只保留256个记录,满了256后新的记录刷掉旧的。

Sticky broadcasts

粘性广播相关信息的汇总

  Sticky broadcasts for user 0:
  * Sticky action android.intent.action.HEADSET_PLUG: //代表粘性广播的action
    Intent: act=android.intent.action.HEADSET_PLUG flg=0x40000010 [D] //代表粘性广播Intent
      originalCallingUid: 1000//代表粘性广播调用的uid

      extras: Bundle[{address=, state=1, portName=h2w, microphone=1}]//代表粘性广播发送的具体信息
 

这块信息其实没啥特别的,主要就是Intent相关的详细信息,比如上面就是具体耳机插拔的粘性广播,发送了的核心数据为

Bundle[{address=, state=1, portName=h2w, microphone=1}

粘性广播发送时候需要调用方法:

mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);

正常广播发送方法:

mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
                    null /* receiverPermission */, options);

广播模拟发送命令

上面主要介绍了广播相关信息的dumpsys,那么接下来介绍一下广播的模拟发送相关命令

发送开机完成广播
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

这对于测试需要在开机后自启动的应用功能非常有用

发送自定义广播(含额外数据)
adb shell am broadcast -a com.example.myaction --es test_string "hello" --ei test_int 123 --ez enable true

这个命令模拟了一个应用内定义的动作,并传递了多种类型的参数。

向特定应用发送广播
adb shell am broadcast -a com.example.myaction -p com.example.targetapp

使用 -p 参数可以限制只有指定的包名才能接收此广播

更多framework实战干货,请关注下面“千里马学框架”

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值