You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何手动为旧版Flutter包添加android:exported以解决Play商店上传问题

解决Google Play上传时android:exported属性缺失问题(Flutter OneSignal包相关)

核心原因

Android 12(API 31)及以上要求所有带有的组件(Activity、Service、BroadcastReceiver等)必须显式声明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属性:

  1. 先通过Android Studio的Analyze APK功能,打开你生成的APK/AAB,查看merged AndroidManifest.xml,找到所有属于com.onesignal且未声明android:exported的组件(带的)。
  2. 在项目的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. 重新构建项目并上传。

3. 手动修改本地包的Manifest(不推荐)

此方法修改后,下次执行flutter pub get会被还原,仅临时应急使用:

  1. 找到本地缓存的onesignal_flutter包路径:
    项目根目录/.pub-cache/hosted/pub.dartlang.org/onesignal_flutter-<你的版本号>/android/src/main/AndroidManifest.xml
    
  2. 打开该文件,添加需要的组件并声明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>
    
  3. 执行flutter clean && flutter pub get后重新构建。

内容的提问来源于stack exchange,提问作者Mee Mihoyo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:55:18