Flutter配置compileSdkVersion为31时Android12设备安装App失败
Android 12(API 31)下Flutter项目Firebase Messaging导致安装失败解决方案
问题根因
Android 12(API 级别31)新增强制规则:所有配置了intent-filter的应用组件(Activity、Service、广播接收器)必须显式声明android:exported属性,未声明的应用会直接触发INSTALL_PARSE_FAILED_MANIFEST_MALFORMED错误,安装失败。
当前使用的Flutter 1.22.4版本配套的旧版firebase-messaging插件未适配该规则,插件内置清单中FlutterFirebaseMessagingService组件配置了intent-filter但缺失android:exported属性,因此仅在compile/target SDK设为31时触发问题,降到30时系统不做该强制校验所以可正常运行。
方案1:主清单覆盖配置(零依赖升级,最快生效)
不需要修改Flutter版本、不需要升级插件,直接在项目主清单中重写对应服务的配置,覆盖插件的默认清单即可:
- 打开项目路径下的
android/app/src/main/AndroidManifest.xml文件 - 在
<application>标签内部添加如下服务声明:
<service android:name="io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
该服务仅用于接收应用内的Firebase推送消息,不需要对外暴露,设置
android:exported="false"完全符合功能逻辑,不会影响推送接收能力。
- 配置完成后执行
flutter clean清理旧构建缓存,重新编译运行即可正常安装。
补充:如果后续其他第三方插件报同类exported属性缺失错误,都可以用同样方式在主清单中重写对应组件、补全属性,不需要修改插件源码。
方案2:升级依赖适配(正式发版长期维护推荐)
如果需要长期适配Android 12+版本要求,建议做依赖升级适配:
- 优先将Flutter升级到2.10及以上稳定版本,同步将所有Firebase系列插件升级到适配API 31的版本,新版插件已默认在清单中补全
android:exported属性,无需手动配置。 - 如果暂时不想升级Flutter大版本,可单独将
firebase-messaging插件升级到11.4.4及以上兼容版本,同时检查项目内其他第三方插件是否有适配API 31的更新,同步升级即可。
临时降级方案说明
将compileSdkVersion、targetSdkVersion降到30仅可作为本地临时调试的绕过手段,应用商店从2022年起已要求新上架、更新的应用必须targetSdkVersion 31及以上,该方案无法用于正式发版场景。
内容的提问来源于stack exchange,提问作者mvasco
相关产品推荐
相关产品推荐

