如何手动为旧版Flutter包添加android:exported以解决Play商店上传问题
解决Google Play上传时android:exported属性缺失问题(Flutter OneSignal包相关)
核心原因
Android 12(API 31)及以上要求所有带有android:exported属性onesignal_flutter包未在其组件中添加该属性,导致合并后的AndroidManifest.xml中存在不符合要求的组件。
解决方案(优先级从高到低)
1. 优先升级onesignal_flutter包(最稳妥)
官方已经在新版本中修复了Android 12+的兼容性问题,直接升级是最优解:
- 打开项目根目录的
pubspec.yaml,将onesignal_flutter的依赖版本改为最新稳定版:dependencies: onesignal_flutter: ^5.0.0 # 替换为当前最新稳定版本 - 执行命令更新依赖:
flutter pub upgrade onesignal_flutter - 清理并重新构建项目:
flutter clean flutter pub get - 重新生成APK/AAB后上传Google Play。
2. 在项目Manifest中覆盖组件属性(无需修改包文件)
如果暂时无法升级包,可以在你项目的android/app/src/main/AndroidManifest.xml中重新声明OneSignal相关组件,强制添加android:exported属性:
- 先通过Android Studio的Analyze APK功能,打开你生成的APK/AAB,查看
merged AndroidManifest.xml,找到所有属于com.onesignal且未声明android:exported的组件(带的)。 - 在项目的Manifest中添加这些组件的声明,例如:
<!-- 示例:覆盖OneSignal的广播接收器 --> <receiver android:name="com.onesignal.GcmBroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </receiver> <!-- 示例:覆盖OneSignal的服务 --> <service android:name="com.onesignal.OneSignalService" android:exported="false" />注意:
android:exported的值根据组件功能设置:如果组件需要接收外部应用的Intent则设为true,否则设为false。 - 重新构建项目并上传。
3. 手动修改本地包的Manifest(不推荐)
此方法修改后,下次执行flutter pub get会被还原,仅临时应急使用:
- 找到本地缓存的
onesignal_flutter包路径:项目根目录/.pub-cache/hosted/pub.dartlang.org/onesignal_flutter-<你的版本号>/android/src/main/AndroidManifest.xml - 打开该文件,添加需要的组件并声明
android:exported属性,修改后的内容示例:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.onesignal.flutter"> <receiver android:name="com.onesignal.GcmBroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </receiver> <service android:name="com.onesignal.OneSignalService" android:exported="false" /> </manifest> - 执行
flutter clean && flutter pub get后重新构建。
内容的提问来源于stack exchange,提问作者Mee Mihoyo
相关产品推荐
相关产品推荐

