From 87d49e28f42dd032f25850d1df9b61ee77f3d0e5 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Tue, 2 Jun 2026 13:05:39 +0500 Subject: [PATCH 1/8] chore: bump agp to 9.2.1 --- packages/gradle-plugin/gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/gradle-plugin/gradle/libs.versions.toml b/packages/gradle-plugin/gradle/libs.versions.toml index 7f788db1e2f3..65dd0b10f53f 100644 --- a/packages/gradle-plugin/gradle/libs.versions.toml +++ b/packages/gradle-plugin/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.12.0" +agp = "9.2.1" gson = "2.8.9" guava = "31.0.1-jre" javapoet = "1.13.0" From 74bfd7fc2501b3339a8131e6d790223f1fbb909e Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Tue, 2 Jun 2026 17:21:21 +0500 Subject: [PATCH 2/8] feat: use agp9 for core --- gradle.properties | 6 ---- .../android/build.gradle.kts | 1 - .../ReactAndroid/build.gradle.kts | 31 ++++++++++--------- .../hermes-engine/build.gradle.kts | 8 +++-- .../react-native/gradle/libs.versions.toml | 4 ++- .../android/app/benchmark/build.gradle.kts | 1 - .../rn-tester/android/app/build.gradle.kts | 3 +- 7 files changed, 26 insertions(+), 28 deletions(-) diff --git a/gradle.properties b/gradle.properties index 4c1f11da8041..1028b5c5238e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,12 +4,6 @@ org.gradle.caching=true android.useAndroidX=true -# Those 2 properties are needed to make our project compatible with -# AGP 9.0.0 for the time being. Ideally we should not opt-out of -# builtInKotlin and newDsl once AGP 9.0.0 hits stable. -# More on this: https://developer.android.com/build/releases/agp-preview#android-gradle-plugin-built-in-kotlin -android.builtInKotlin=false -android.newDsl=false # Use this property to specify which architecture you want to build. # You can also override it from the CLI using diff --git a/packages/react-native-popup-menu-android/android/build.gradle.kts b/packages/react-native-popup-menu-android/android/build.gradle.kts index 707faa22bee2..52b353d89fc1 100644 --- a/packages/react-native-popup-menu-android/android/build.gradle.kts +++ b/packages/react-native-popup-menu-android/android/build.gradle.kts @@ -8,7 +8,6 @@ plugins { id("com.facebook.react") id("com.android.library") - id("org.jetbrains.kotlin.android") } android { diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index b0136db3c8f5..9b22c38f5937 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -18,7 +18,6 @@ plugins { id("com.facebook.react") alias(libs.plugins.android.library) alias(libs.plugins.download) - alias(libs.plugins.kotlin.android) alias(libs.plugins.ktfmt) } @@ -611,19 +610,17 @@ android { ":packages:react-native:ReactAndroid:hermes-engine:preBuild" ) - sourceSets.getByName("main") { - res.setSrcDirs( - listOf( - "src/main/res/devsupport", - "src/main/res/shell", - "src/main/res/views/alert", - "src/main/res/views/modal", - "src/main/res/views/uimanager", - "src/main/res/views/view", - ) - ) - java.exclude("com/facebook/react/processing") - java.exclude("com/facebook/react/module/processing") + sourceSets { + named("main") { + res.srcDirs( + "src/main/res/devsupport", + "src/main/res/shell", + "src/main/res/views/alert", + "src/main/res/views/modal", + "src/main/res/views/uimanager", + "src/main/res/views/view", + ) + } } lint { @@ -676,6 +673,11 @@ android { } } +tasks.withType().configureEach { + exclude("com/facebook/react/processing/**") + exclude("com/facebook/react/module/processing/**") +} + tasks.withType().configureEach { exclude("com/facebook/annotationprocessors/**") exclude("com/facebook/react/processing/**") @@ -690,6 +692,7 @@ dependencies { api(libs.androidx.appcompat) api(libs.androidx.appcompat.resources) api(libs.androidx.autofill) + api(libs.androidx.collection) api(libs.androidx.swiperefreshlayout) api(libs.androidx.tracing) api(libs.androidx.window) diff --git a/packages/react-native/ReactAndroid/hermes-engine/build.gradle.kts b/packages/react-native/ReactAndroid/hermes-engine/build.gradle.kts index 02430442d93a..486f41d35a00 100644 --- a/packages/react-native/ReactAndroid/hermes-engine/build.gradle.kts +++ b/packages/react-native/ReactAndroid/hermes-engine/build.gradle.kts @@ -408,9 +408,11 @@ android { } } - sourceSets.getByName("main") { - manifest.srcFile("$hermesDir/android/hermes/src/main/AndroidManifest.xml") - java.srcDirs("$hermesDir/lib/Platform/Intl/java", "$hermesDir/lib/Platform/Unicode/java") + sourceSets { + named("main") { + manifest.srcFile("$hermesDir/android/hermes/src/main/AndroidManifest.xml") + java.srcDirs("$hermesDir/lib/Platform/Intl/java", "$hermesDir/lib/Platform/Unicode/java") + } } buildFeatures { diff --git a/packages/react-native/gradle/libs.versions.toml b/packages/react-native/gradle/libs.versions.toml index 776fa60c1aa1..996f25b3d3ab 100644 --- a/packages/react-native/gradle/libs.versions.toml +++ b/packages/react-native/gradle/libs.versions.toml @@ -6,10 +6,11 @@ compileSdk = "36" buildTools = "36.0.0" ndkVersion = "27.1.12297006" # Dependencies versions -agp = "8.12.0" +agp = "9.2.1" androidx-annotation = "1.6.0" androidx-appcompat = "1.7.0" androidx-autofill = "1.3.0" +androidx-collection = "1.4.0" androidx-benchmark-macro-junit4 = "1.3.3" androidx-profileinstaller = "1.4.1" androidx-swiperefreshlayout = "1.1.0" @@ -56,6 +57,7 @@ androidx-annotation = { module = "androidx.annotation:annotation", version.ref = androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appcompat" } androidx-appcompat-resources = { module = "androidx.appcompat:appcompat-resources", version.ref = "androidx-appcompat" } androidx-autofill = { module = "androidx.autofill:autofill", version.ref = "androidx-autofill" } +androidx-collection = { module = "androidx.collection:collection", version.ref = "androidx-collection" } androidx-benchmark-macro-junit4 = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "androidx-benchmark-macro-junit4" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-junit" } diff --git a/packages/rn-tester/android/app/benchmark/build.gradle.kts b/packages/rn-tester/android/app/benchmark/build.gradle.kts index 6f116cb818ad..cb04bececdc7 100644 --- a/packages/rn-tester/android/app/benchmark/build.gradle.kts +++ b/packages/rn-tester/android/app/benchmark/build.gradle.kts @@ -7,7 +7,6 @@ plugins { alias(libs.plugins.android.test) - alias(libs.plugins.kotlin.android) } android { diff --git a/packages/rn-tester/android/app/build.gradle.kts b/packages/rn-tester/android/app/build.gradle.kts index fc1770cbd068..c5d77397c8ab 100644 --- a/packages/rn-tester/android/app/build.gradle.kts +++ b/packages/rn-tester/android/app/build.gradle.kts @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("com.facebook.react") alias(libs.plugins.android.application) - alias(libs.plugins.kotlin.android) } val reactNativeDirPath = "$rootDir/packages/react-native" @@ -135,7 +134,7 @@ android { } sourceSets.named("main") { // SampleTurboModule. - java.srcDirs( + kotlin.srcDirs( "$reactNativeDirPath/ReactCommon/react/nativemodule/samples/platform/android", ) res.setSrcDirs( From 2367bc6aa48ec2c64fa63c1b9eff00bb88da4259 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Tue, 2 Jun 2026 17:41:32 +0500 Subject: [PATCH 3/8] feat: replace deprecated APIs --- .../ReactAndroid/build.gradle.kts | 16 +++++++++------- .../hermes-engine/build.gradle.kts | 7 ++++++- .../rn-tester/android/app/build.gradle.kts | 19 +++++++++++-------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index 9b22c38f5937..ebae0132145e 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -612,13 +612,15 @@ android { sourceSets { named("main") { - res.srcDirs( - "src/main/res/devsupport", - "src/main/res/shell", - "src/main/res/views/alert", - "src/main/res/views/modal", - "src/main/res/views/uimanager", - "src/main/res/views/view", + res.directories.addAll( + listOf( + "src/main/res/devsupport", + "src/main/res/shell", + "src/main/res/views/alert", + "src/main/res/views/modal", + "src/main/res/views/uimanager", + "src/main/res/views/view", + ) ) } } diff --git a/packages/react-native/ReactAndroid/hermes-engine/build.gradle.kts b/packages/react-native/ReactAndroid/hermes-engine/build.gradle.kts index 486f41d35a00..ffcec5a9e4c2 100644 --- a/packages/react-native/ReactAndroid/hermes-engine/build.gradle.kts +++ b/packages/react-native/ReactAndroid/hermes-engine/build.gradle.kts @@ -411,7 +411,12 @@ android { sourceSets { named("main") { manifest.srcFile("$hermesDir/android/hermes/src/main/AndroidManifest.xml") - java.srcDirs("$hermesDir/lib/Platform/Intl/java", "$hermesDir/lib/Platform/Unicode/java") + java.directories.addAll( + listOf( + "$hermesDir/lib/Platform/Intl/java", + "$hermesDir/lib/Platform/Unicode/java", + ) + ) } } diff --git a/packages/rn-tester/android/app/build.gradle.kts b/packages/rn-tester/android/app/build.gradle.kts index c5d77397c8ab..eb08b4874e96 100644 --- a/packages/rn-tester/android/app/build.gradle.kts +++ b/packages/rn-tester/android/app/build.gradle.kts @@ -134,15 +134,18 @@ android { } sourceSets.named("main") { // SampleTurboModule. - kotlin.srcDirs( - "$reactNativeDirPath/ReactCommon/react/nativemodule/samples/platform/android", - ) - res.setSrcDirs( - listOf( - "src/main/res", - "src/main/public_res", - ) + kotlin.directories.add( + "$reactNativeDirPath/ReactCommon/react/nativemodule/samples/platform/android" ) + res.directories.apply { + clear() // Mimics setSrcDirs by wiping out the defaults + addAll( + listOf( + "src/main/res", + "src/main/public_res" + ) + ) + } } } From 24e305f5d772ddf19a833c16aacfe735922fa569 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Tue, 2 Jun 2026 17:42:03 +0500 Subject: [PATCH 4/8] fix: comment out the fallbacks --- .../src/main/kotlin/com/facebook/react/ReactPlugin.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt index 389322e713ce..20691f7bd7e3 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt @@ -116,8 +116,8 @@ class ReactPlugin : Plugin { } // Library Only Configuration - configureBuildConfigFieldsForLibraries(project) - configureNamespaceForLibraries(project) + // configureBuildConfigFieldsForLibraries(project) + // configureNamespaceForLibraries(project) project.pluginManager.withPlugin("com.android.library") { configureCodegen(project, extension, rootExtension, isLibrary = true) } From 3b3e2a3428284810c0a7d60f2b931e856f53515b Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Wed, 3 Jun 2026 13:27:31 +0500 Subject: [PATCH 5/8] fix: deprecated APIs --- .../kotlin/com/facebook/react/ReactPlugin.kt | 8 ++-- .../react/utils/AgpConfiguratorUtils.kt | 45 ++++++++----------- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt index 20691f7bd7e3..9b868e9e7688 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt @@ -116,9 +116,9 @@ class ReactPlugin : Plugin { } // Library Only Configuration - // configureBuildConfigFieldsForLibraries(project) - // configureNamespaceForLibraries(project) project.pluginManager.withPlugin("com.android.library") { + configureBuildConfigFieldsForLibraries(project) + configureNamespaceForLibraries(project) configureCodegen(project, extension, rootExtension, isLibrary = true) } } @@ -222,12 +222,12 @@ class ReactPlugin : Plugin { if (isLibrary) { project.extensions.getByType(LibraryAndroidComponentsExtension::class.java).finalizeDsl { ext -> - ext.sourceSets.getByName("main").java.srcDir(generatedSrcDir.get().dir("java").asFile) + ext.sourceSets.getByName("main").java.directories.add(generatedSrcDir.get().dir("java").asFile.path) } } else { project.extensions.getByType(ApplicationAndroidComponentsExtension::class.java).finalizeDsl { ext -> - ext.sourceSets.getByName("main").java.srcDir(generatedSrcDir.get().dir("java").asFile) + ext.sourceSets.getByName("main").java.directories.add(generatedSrcDir.get().dir("java").asFile.path) } } diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt index c4a7b359d542..d5b743e4f1a5 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt @@ -9,7 +9,6 @@ package com.facebook.react.utils import com.android.build.api.variant.ApplicationAndroidComponentsExtension import com.android.build.api.variant.LibraryAndroidComponentsExtension -import com.android.build.gradle.LibraryExtension import com.facebook.react.ReactExtension import com.facebook.react.utils.ProjectUtils.isEdgeToEdgeEnabled import com.facebook.react.utils.ProjectUtils.isHermesEnabled @@ -18,7 +17,6 @@ import java.net.Inet4Address import java.net.NetworkInterface import javax.xml.parsers.DocumentBuilder import javax.xml.parsers.DocumentBuilderFactory -import kotlin.plus import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.plugins.AppliedPlugin @@ -77,14 +75,12 @@ internal object AgpConfiguratorUtils { project.pluginManager.withPlugin("com.android.library", action) } - fun configureBuildConfigFieldsForLibraries(appProject: Project) { - appProject.rootProject.allprojects { subproject -> - subproject.pluginManager.withPlugin("com.android.library") { - subproject.extensions - .getByType(LibraryAndroidComponentsExtension::class.java) - .finalizeDsl { ext -> ext.buildFeatures.buildConfig = true } + fun configureBuildConfigFieldsForLibraries(project: Project) { + project.extensions + .getByType(LibraryAndroidComponentsExtension::class.java) + .finalizeDsl { ext -> + ext.buildFeatures.buildConfig = true } - } } fun configureDevServerLocation(project: Project) { @@ -111,27 +107,22 @@ internal object AgpConfiguratorUtils { project.pluginManager.withPlugin("com.android.library", action) } - fun configureNamespaceForLibraries(appProject: Project) { - appProject.rootProject.allprojects { subproject -> - subproject.pluginManager.withPlugin("com.android.library") { - subproject.extensions - .getByType(LibraryAndroidComponentsExtension::class.java) - .finalizeDsl { ext -> - if (ext.namespace == null) { - val android = subproject.extensions.getByType(LibraryExtension::class.java) - val manifestFile = android.sourceSets.getByName("main").manifest.srcFile - - manifestFile - .takeIf { it.exists() } - ?.let { file -> - getPackageNameFromManifest(file)?.let { packageName -> - ext.namespace = packageName - } - } + fun configureNamespaceForLibraries(project: Project) { + project.extensions + .getByType(LibraryAndroidComponentsExtension::class.java) + .finalizeDsl { ext -> + if (ext.namespace == null) { + val manifestFile = + project.layout.projectDirectory.file("src/main/AndroidManifest.xml").asFile + manifestFile + .takeIf { it.exists() } + ?.let { file -> + getPackageNameFromManifest(file)?.let { packageName -> + ext.namespace = packageName } } + } } - } } } From 305b41a2d31840c3a11fb36ecd21c71065afdccd Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Fri, 5 Jun 2026 11:49:05 +0500 Subject: [PATCH 6/8] fix: use androidx.collection with implementation --- packages/react-native/ReactAndroid/build.gradle.kts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index ebae0132145e..2e2ea0a94d0c 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -694,7 +694,6 @@ dependencies { api(libs.androidx.appcompat) api(libs.androidx.appcompat.resources) api(libs.androidx.autofill) - api(libs.androidx.collection) api(libs.androidx.swiperefreshlayout) api(libs.androidx.tracing) api(libs.androidx.window) @@ -719,6 +718,8 @@ dependencies { // Therefore hermes-engine is a compileOnly dependencies. compileOnly(project(":packages:react-native:ReactAndroid:hermes-engine")) + implementation(libs.androidx.collection) + testImplementation(libs.junit) testImplementation(libs.assertj) testImplementation(libs.mockito) From e895962c8b653b635c317fb94e82d65e206bc705 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Fri, 5 Jun 2026 15:44:19 +0500 Subject: [PATCH 7/8] refactor: unnecessary pattern filter --- packages/react-native/ReactAndroid/build.gradle.kts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index 2e2ea0a94d0c..8bb14c69cd81 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -675,11 +675,6 @@ android { } } -tasks.withType().configureEach { - exclude("com/facebook/react/processing/**") - exclude("com/facebook/react/module/processing/**") -} - tasks.withType().configureEach { exclude("com/facebook/annotationprocessors/**") exclude("com/facebook/react/processing/**") From 440e25dfec86e8d5774534f97533636b49be0b0e Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Fri, 5 Jun 2026 15:46:50 +0500 Subject: [PATCH 8/8] feat: enable opt outs in helloworld template --- private/helloworld/android/gradle.properties | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/private/helloworld/android/gradle.properties b/private/helloworld/android/gradle.properties index 0f939574cb16..d98cf95c0271 100644 --- a/private/helloworld/android/gradle.properties +++ b/private/helloworld/android/gradle.properties @@ -11,3 +11,8 @@ reactNativeArchitectures=arm64-v8a newArchEnabled=true hermesEnabled=true edgeToEdgeEnabled=false + +# Opt out of built-in kotlin and new DSL behavior that ships with AGP 9. +# Starting from AGP 10.x these opt outs will be removed. +android.builtInKotlin=false +android.newDsl=false \ No newline at end of file