Manifest merger failed: android:exported needs to be explicitly specified
The full message usually reads:
Manifest merger failed : Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined.
What it means. From Android 12 (target SDK 31), every activity, service or broadcast receiver that has an <intent-filter> must say whether other apps may start it. Without android:exported, the build fails, and an app built anyway cannot be installed on Android 12 or newer.
Why React Native apps hit it now. Google Play requires new apps and updates to target API level 36, so apps that stayed on target 30 or lower meet this the moment they raise the target. In our scan of 653 open-source React Native apps, 107 would.
How to fix it. In android/app/src/main/AndroidManifest.xml, add the attribute to each component with an intent filter: "true" for the launcher activity and anything another app must reach (deep links, share targets), "false" for the rest.
<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>
If the merger names a component from a library, update that library: current releases declare it themselves. As a stopgap you can override it in your own manifest with tools:node="merge" and the attribute.
Find every one before you raise the target. npx nativekeel lists each component that is missing the attribute, and its upgrade plan fixes them before the target SDK step.
npx nativekeel