背景:
经常在做系统开发或者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实战干货,请关注下面“千里马学框架”
系统广播调试命令全解析

679

被折叠的 条评论
为什么被折叠?



