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.