From 787b3bbb16b861b6f5e02b5e5ea26841c568789b Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Fri, 19 Jun 2026 15:06:11 +0100 Subject: [PATCH] fix(android): pin react-android aarMetadata.minCompileSdk to 34 AGP 9 changed the default so a library propagates a minCompileSdk equal to its own compileSdk. Since react-android compiles against compileSdk 36, this now forces every consuming library/app to compileSdk >= 36 (e.g. it breaks libraries still on compileSdk 35 at checkAarMetadata). RN does not actually require API 36: its public ABI exposes no android type newer than ~API 23, the highest framework constant referenced in code is UPSIDE_DOWN_CAKE (34), and the source is deliberately written to compile against SDK 34 (see util/AndroidVersion.kt, which abstracts the 35/36 version codes and the API-35 windowOptOutEdgeToEdgeEnforcement attribute). compileSdk is 36 only to build against the latest platform. Set minCompileSdk = 34 explicitly to restore the pre-AGP-9 behavior and avoid needlessly forcing the library ecosystem onto compileSdk 36. The binary-compatibility-validator dump (ReactAndroid.api) guards against future regressions: adding an API 35/36 type to the public ABI would change that file and signal that this floor must rise. --- packages/react-native/ReactAndroid/build.gradle.kts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index 45b852e10c88..af16973dbc40 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -553,6 +553,15 @@ android { defaultConfig { minSdk = libs.versions.minSdk.get().toInt() + aarMetadata { + // RN's public ABI exposes no android API newer than 34, and the source is written to + // compile against SDK 34 (see util/AndroidVersion.kt). compileSdk is 36 only to build + // against the latest platform — it is not an API requirement. Without this, AGP 9 + // defaults minCompileSdk to compileSdk (36), needlessly forcing every consuming + // library/app to compileSdk 36. + minCompileSdk = 34 + } + consumerProguardFiles("proguard-rules.pro") buildConfigField("boolean", "IS_INTERNAL_BUILD", "false")