Sending non-protected broadcast

问题描述

android:sharedUserId="android.uid.system"的应用发送广播会出现Sending non-protected broadcast异常:

08-03 14:27:53.744   533   988 E ActivityManager: Sending non-protected broadcast com.xxx.xxx.xxx from system 3010:com.xxx.xxx/1000 pkg com.xxx.xxx
08-03 14:27:53.744   533   988 E ActivityManager: java.lang.Throwable
08-03 14:27:53.744   533   988 E ActivityManager:       at com.android.server.am.ActivityManagerService.checkBroadcastFromSystem(ActivityManagerService.java:15935)
08-03 14:27:53.744   533   988 E ActivityManager:       at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:16519)
08-03 14:27:53.744   533   988 E ActivityManager:       at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:15952)
08-03 14:27:53.744   533   988 E ActivityManager:       at com.android.server.am.ActivityManagerService.broadcastIntentWithFeature(ActivityManagerService.java:16769)
08-03 14:27:53.744   533   988 E ActivityManager:       at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2283)
08-03 14:27:53.744   533   988 E ActivityManager:       at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2880)
08-03 14:27:53.744   533   988 E ActivityManager:       at android.os.Binder.execTransactInternal(Binder.java:1154)
08-03 14:27:53.744   533   988 E ActivityManager:       at android.os.Binder.execTransact(Binder.java:1123)
08-03 14:27:53.746   533   988 E ActivityManager: Sending non-protected broadcast com.xxx.xxx.xxx from system 3010:com.xxx.xxx/1000 pkg com.xxx.xxx
08-03 14:27:53.746   533   988 E ActivityManager: java.lang.Throwable
08-03 14:27:53.746   533   988 E ActivityManager:       at com.android.server.am.ActivityManagerService.checkBroadcastFromSystem(ActivityManagerService.java:15935)
08-03 14:27:53.746   533   988 E ActivityManager:       at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:16613)
08-03 14:27:53.746   533   988 E ActivityManager:       at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:15952)
08-03 14:27:53.746   533   988 E ActivityManager:       at com.android.server.am.ActivityManagerService.broadcastIntentWithFeature(ActivityManagerService.java:16769)
08-03 14:27:53.746   533   988 E ActivityManager:       at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2283)
08-03 14:27:53.746   533   988 E ActivityManager:       at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2880)
08-03 14:27:53.746   533   988 E ActivityManager:       at android.os.Binder.execTransactInternal(Binder.java:1154)
08-03 14:27:53.746   533   988 E ActivityManager:       at android.os.Binder.execTransact(Binder.java:1123)

问题分析

protected广播存在目的可能是让系统应用只能发送protected广播,然后三方应用不能发protected广播,防止三方应用捣乱/乱发系统广播
但谷歌又给系统应用发送non-protected广播留了一个后门(发送/接收者指定广播权限)
谷歌的解释原因是
// This broadcast may be a problem...  but there are often system components that
// want to send an internal broadcast to themselves, which is annoying to have to
// explicitly list each action as a protected broadcast, so we will check for that
// one safe case and allow it: an explicit broadcast, only being received by something
// that has protected itself.

解决方案1

在自己AndroidManifest.xml中声明一个广播为protected广播(一个模块声明后,其他模块不需要再声明该广播)
<protected-broadcast android:name="com.my.action" />

解决方案2

2.1 AndroidManifest.xml添加权限
	<permission android:name="com.my.permission" .../>
	<uses-permission android:name="com.my.permission" />
2.2 发送接收广播地方使用2.1中权限
	sendBroadcast(intent, "com.my.permission")
	registerReceiver(receiver, filter,"com.my.permission", null)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值