Flutter(Android)中java.lang.SecurityException报错的解决方法咨询
解决Flutter Gallery启动时的
java.lang.SecurityException报错 问题重现
在Android设备上启动Flutter Gallery示例应用时触发致命异常,报错信息如下:
E/AndroidRuntime(20352): FATAL EXCEPTION: SplitCompatBackgroundThread E/AndroidRuntime(20352): Process: io.flutter.demo.gallery, PID: 20352 E/AndroidRuntime(20352): java.lang.SecurityException: io.flutter.demo.gallery: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts E/AndroidRuntime(20352): at android.os.Parcel.createExceptionOrNull(Parcel.java:3069) E/AndroidRuntime(20352): at android.os.Parcel.createException(Parcel.java:3053) E/AndroidRuntime(20352): at android.os.Parcel.readException(Parcel.java:3036) E/AndroidRuntime(20352): at android.os.Parcel.readException(Parcel.java:2978) E/AndroidRuntime(20352): at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:6157) E/AndroidRuntime(20352): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1913) E/AndroidRuntime(20352): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1853) E/AndroidRuntime(20352): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1841) E/AndroidRuntime(20352): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:772) E/AndroidRuntime(20352): at com.google.android.play.core.listener.b.b(Unknown Source:27) E/AndroidRuntime(20352): at com.google.android.play.core.listener.b.e(Unknown Source:3) E/AndroidRuntime(20352): at com.google.android.play.core.splitcompat.m.run(Unknown Source:7) (More stacktrace here)
预期应用能像Windows平台一样正常启动,但实际启动失败。
问题原因
这个报错是Android 12(API 31)及以上系统的安全限制导致的:系统要求所有动态注册的广播接收器必须显式指定RECEIVER_EXPORTED(允许其他应用触发)或RECEIVER_NOT_EXPORTED(仅自身触发)标记。而Flutter Gallery依赖的旧版本Google Play Core库未适配该要求,动态注册接收器时未添加对应标记,触发了SecurityException。
解决方案
方案1:升级Flutter SDK到最新稳定版
新版本Flutter已同步升级依赖的Play Core库,默认适配Android 12+的广播接收器要求。执行以下命令升级:
flutter upgrade
升级完成后,执行flutter clean清理缓存,再重新运行项目即可。
方案2:手动指定Play Core库的最新版本
若不想升级整个Flutter SDK,可在项目的android/app/build.gradle文件中强制指定Play Core的最新兼容版本:
dependencies { // 保留原有依赖,添加或替换Play Core版本 implementation 'com.google.android.play:core:1.10.3' // 可使用更高稳定版本 }
修改后执行flutter clean,再重新构建运行应用。
方案3:临时适配(不推荐)
若上述方案暂时无法生效,可尝试在AndroidManifest.xml中添加SplitCompat版本配置作为临时 workaround,长期仍推荐升级依赖:
<application ...> <!-- 添加以下配置 --> <meta-data android:name="com.google.android.play.core.splitcompat.VERSION" android:value="1.10.3" /> </application>
内容的提问来源于stack exchange,提问作者Squiddy
相关产品推荐
相关产品推荐

