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
相关产品推荐
相关产品推荐

