From 13453aaa2b1f1f17dc3a10f0e9882286040b3d19 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Tue, 2 Jun 2026 13:05:39 +0500 Subject: [PATCH 1/6] 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 530194fdd8fe59a9b99529e5564df53b7296a1ac Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Tue, 2 Jun 2026 13:06:03 +0500 Subject: [PATCH 2/6] chore: bump gradle version to 9.4.1 --- packages/gradle-plugin/gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/gradle-plugin/gradle/wrapper/gradle-wrapper.properties b/packages/gradle-plugin/gradle/wrapper/gradle-wrapper.properties index 37f78a6af837..c61a118f7ddb 100644 --- a/packages/gradle-plugin/gradle/wrapper/gradle-wrapper.properties +++ b/packages/gradle-plugin/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 806b199745a9abd5b5426144f615206993f8adca Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Tue, 2 Jun 2026 17:21:21 +0500 Subject: [PATCH 3/6] feat: use agp9 for core --- gradle.properties | 6 ---- gradle/wrapper/gradle-wrapper.properties | 2 +- .../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 +- 8 files changed, 27 insertions(+), 29 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/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f78a6af837..c61a118f7ddb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME 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 211af1814fa97d1e6556b90bbc14e98d1e7c1753 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Tue, 2 Jun 2026 17:41:32 +0500 Subject: [PATCH 4/6] 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 5191a63e4383f5a2c356254db5b860629ce63983 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Tue, 2 Jun 2026 17:42:03 +0500 Subject: [PATCH 5/6] 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 312a317743fa7f2c75a619a620e52146f3de9c44 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Wed, 3 Jun 2026 13:27:31 +0500 Subject: [PATCH 6/6] 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 } } + } } - } } }