React Native目标API31已配置android:exported="true"仍遇清单合并错误
解决React Native Android 12清单合并exported错误
你遇到的问题是Android 12(API 31+)强制要求所有带有<intent-filter>的组件必须明确声明android:exported属性,即便你自己的主清单加了该属性,也可能是以下原因导致报错:
1. 自身清单中存在遗漏的组件
检查你的AndroidManifest.xml里所有包含<intent-filter>的Activity、Service、BroadcastReceiver,确保每个都显式设置了android:exported="true"或android:exported="false"。比如:
<!-- 主入口Activity必须设为true --> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 带intent-filter的广播接收器,根据需求设为true或false --> <receiver android:name=".MyCustomReceiver" android:exported="false"> <intent-filter> <action android:name="com.example.MY_ACTION" /> </intent-filter> </receiver>
2. 第三方依赖的清单未适配Android 12
很多旧版本的React Native第三方库(如推送、登录、分享类库)的内置清单没有添加android:exported属性,合并时会触发错误。
- 先执行Gradle命令查看合并后的完整清单:
然后去路径./gradlew app:mergeDebugAndroidManifestapp/build/intermediates/merged_manifests/debug/AndroidManifest.xml中搜索所有带有<intent-filter>但未声明android:exported的组件,定位到对应的依赖库。 - 解决方式:
- 优先升级该依赖库到适配Android 12的最新版本;
- 若无法升级,在你的
AndroidManifest.xml中覆盖该组件的配置,添加android:exported,同时要在manifest根节点声明tools命名空间:<!-- 根节点添加tools命名空间 --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.your.app"> <!-- 覆盖第三方库的接收器配置 --> <receiver android:name="com.thirdparty.library.SomeReceiver" android:exported="false" tools:node="merge"> <intent-filter> <action android:name="android.intent.action.SOME_ACTION" /> </intent-filter> </receiver> </manifest>
3. 确认编译和目标SDK版本配置
检查android/build.gradle中的compileSdkVersion,以及app/build.gradle中的targetSdkVersion,确保两者都设置为31或更高版本,仅设置targetSdkVersion是不够的。
4. 清理缓存后重新构建
执行以下命令清理Gradle缓存,再重新运行项目:
./gradlew clean npx react-native run-android
内容的提问来源于stack exchange,提问作者Sajib saha
相关产品推荐
相关产品推荐

