保護されていないブロードキャストの送信

問題の説明

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)

おすすめ

転載: blog.csdn.net/yfbdxz/article/details/126140413