You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter升级Target SDK至34后编译触发SecurityException问题求助

问题分析与解决方案

异常信息

java.lang.SecurityException: me.way_in.proffer: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts

1. 问题成因

Android 14(API 34)强制要求:所有非仅接收系统广播的接收器,必须显式声明RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED属性——无论该接收器是静态在AndroidManifest.xml注册还是代码中动态注册。
你的问题是存在未声明该属性的广播接收器:哪怕你已给Manifest中的接收器添加了android:exported,仍可能遗漏了动态注册的接收器,或者第三方依赖/Flutter插件中的接收器未适配该规则。

2. 仅升级Target SDK后出现的原因

在Target SDK 34之前,Android系统仅对该规则发出警告,不会强制校验;而从API 34开始,系统将该要求设为强制约束,未声明属性的接收器会直接抛出SecurityException,阻止应用启动。

3. 解决方法

  • 检查静态注册的接收器:确保AndroidManifest.xml中所有<receiver>标签都添加android:exported="true"或"false"。若接收器需要接收外部应用广播则设为true,仅内部使用设为false。
  • 修复动态注册的接收器:代码中调用registerReceiver()时,必须传入RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED标记,示例代码:
    // 若接收器需接收外部广播
    registerReceiver(myReceiver, intentFilter, Context.RECEIVER_EXPORTED);
    // 若仅内部使用
    registerReceiver(myReceiver, intentFilter, Context.RECEIVER_NOT_EXPORTED);
    
  • 处理第三方依赖/插件:
    • 优先升级依赖库或Flutter插件到适配API 34的版本;
    • 若无法升级,可在主项目的AndroidManifest.xml中用tools:replace覆盖依赖中的接收器属性,示例:
      <receiver
          android:name="com.example.DependencyReceiver"
          android:exported="false"
          tools:replace="android:exported" />
      
  • Flutter项目额外检查:排查项目中使用的插件,部分旧版插件的Android端代码可能未适配API 34的广播规则,需针对性更新或修改插件代码。

内容的提问来源于stack exchange,提问作者Mohamad suhieb ajaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:57:06