protected-broadcast广播

文章描述了一个Android应用开发中遇到的问题,即非系统应用尝试发送在protected-broadcast中的广播会导致SecurityException,因为权限不足。开发者需要确保正确处理广播发送,尤其是涉及到系统级别的权限控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、系统应用发送不在protected-broadcast中的广播,会提示“Sending non-protected broadcast ”
2、非系统应用发送在protected-broadcast中的广播,会抛出异常

--------- beginning of crash
02-29 14:31:43.940  6695  6695 E AndroidRuntime: FATAL EXCEPTION: main
02-29 14:31:43.940  6695  6695 E AndroidRuntime: Process: com.fw.mytest01, PID: 6695
02-29 14:31:43.940  6695  6695 E AndroidRuntime: java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.net.wifi.STATE_CHANGE from pid=6695, uid=10125
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.os.Parcel.createExceptionOrNull(Parcel.java:2373)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.os.Parcel.createException(Parcel.java:2357)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.os.Parcel.readException(Parcel.java:2340)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.os.Parcel.readException(Parcel.java:2282)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.app.IActivityManager$Stub$Proxy.broadcastIntentWithFeature(IActivityManager.java:5557)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.app.ContextImpl.sendBroadcast(ContextImpl.java:1115)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:468)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at com.fw.mytest01.MainActivity.sendBroadcastCore(MainActivity.java:53)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at com.fw.mytest01.MainActivity.onClick(MainActivity.java:43)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.view.View.performClick(View.java:7448)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.view.View.performClickInternal(View.java:7425)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.view.View.access$3600(View.java:810)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.view.View$PerformClick.run(View.java:28305)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:938)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:99)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:223)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:7664)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
02-29 14:31:43.940  6695  6695 E AndroidRuntime: Caused by: android.os.RemoteException: Remote stack trace:
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:16071)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:15929)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at com.android.server.am.ActivityManagerService.broadcastIntentWithFeature(ActivityManagerService.java:16743)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2283)
02-29 14:31:43.940  6695  6695 E AndroidRuntime:        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2875)

代码在frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java 中,2中所说的异常对应的代码如下

         if (!isCallerSystem) {
              if (isProtectedBroadcast) {
                  String msg = "Permission Denial: not allowed to send broadcast "
                          + action + " from pid="
                          + callingPid + ", uid=" + callingUid;
                  Slog.w(TAG, msg);
                  throw new SecurityException(msg);

对于isCallerSystem的判断如下

          final boolean isCallerSystem;
          switch (UserHandle.getAppId(callingUid)) {
              case ROOT_UID:
              case SYSTEM_UID:
              case PHONE_UID:
              case BLUETOOTH_UID:
              case NFC_UID:
              case SE_UID:
              case NETWORK_STACK_UID:
                  isCallerSystem = true;
                  break;
              default:
                  isCallerSystem = (callerApp != null) && callerApp.isPersistent();
                  break;
          }

如果isCallerSystem为true,则会调用如下代码,方法checkBroadcastFromSystem检查是否为protected-broadcast,如果不是,则打印“Sending non-protected broadcast”

             if (isCallerSystem) {
                 checkBroadcastFromSystem(intent, callerApp, callerPackage, callingUid,
                          isProtectedBroadcast, registeredReceivers);
              }

protected-broadcast在frameworks/base/core/res/AndroidManifest.xml中添加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值