Android 12+应用因android:exported声明问题致构建失败
问题原因
Android 12(API 31)及以上版本强制要求:所有包含<intent-filter>的组件(Activity、Service、BroadcastReceiver)必须显式声明android:exported属性,值需设为true或false。若应用自身或依赖的第三方库中存在未声明该属性的这类组件,就会触发Manifest合并失败,导致构建报错。
解决方案
1. 确认自有组件的android:exported配置
检查你编写的Manifest组件,所有带<intent-filter>的项都已正确设置android:exported:
你的MainActivity、RebootBroadcastReceiver、StartupActivity、BootBroadcastReceiver均已配置该属性,这部分无需调整。
2. 升级适配Android 12的Flutter插件版本
报错大概率来自你使用的第三方Flutter插件(如android_alarm_manager_plus、background_locator)旧版本,这些版本未适配Android 12的exported要求:
- 打开
pubspec.yaml,将android_alarm_manager_plus升级至最新稳定版(至少1.1.0以上) - 将
background_locator升级至支持Android 12的最新版本(如2.0.0及以上) - 执行
flutter pub get更新依赖
3. 无法升级插件时,手动覆盖第三方组件属性
若暂时无法升级插件,可在你的AndroidManifest.xml中,针对第三方库中缺失exported的组件,显式声明并设置该属性,同时用tools:replace强制覆盖:
例如,针对某缺失配置的第三方服务,在<application>标签内添加:
<service android:name="第三方组件的完整类名" android:exported="false" <!-- 根据组件功能需求设为true或false --> tools:replace="android:exported" />
你可以通过构建日志的具体报错信息,定位到缺失exported的第三方组件类名。
4. 验证构建
完成上述操作后,重新执行flutter build apk --debug或点击IDE构建按钮,确认报错是否消除。
内容的提问来源于stack exchange,提问作者Mohammad Faizan

