From 8735f7dc7140362db0e7a4c89b869a58d1d9d35c Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Sat, 15 Feb 2025 04:01:29 +0100 Subject: [PATCH 01/13] perf: Add `bundle` to the `noCompress` list --- .../main/kotlin/com/facebook/react/ReactPlugin.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 9cf504539e2e..3216b1fd25a6 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 @@ -81,6 +81,7 @@ class ReactPlugin : Plugin { } configureAutolinking(project, extension) configureCodegen(project, extension, rootExtension, isLibrary = false) + configureResources(project) } // Library Only Configuration @@ -110,6 +111,18 @@ class ReactPlugin : Plugin { } } + /** This function configures Android resources - in this case just the bundle */ + private fun configureResources(project: Project) { + val android = project.extensions.getByType(ApplicationExtension::class.java) + android.buildTypes.all { buildType -> + // This makes sure the JS bundle is NOT compressed in the .apk. + // If it were compressed, `mmap` would not work causing it to be fully loaded into RAM. + val currentNoCompress = buildType.androidResources.noCompress ?: mutableSetOf() + currentNoCompress.add("bundle") + buildType.androidResources.noCompress = currentNoCompress + } + } + /** This function sets up `react-native-codegen` in our Gradle plugin. */ @Suppress("UnstableApiUsage") private fun configureCodegen( From 22ff7fe142d58294e509fbdd0e6745d8a1596da3 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Sat, 15 Feb 2025 04:11:07 +0100 Subject: [PATCH 02/13] Update ReactPlugin.kt --- .../main/kotlin/com/facebook/react/ReactPlugin.kt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 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 3216b1fd25a6..17d8da0fe0dc 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 @@ -36,6 +36,7 @@ import org.gradle.api.Task import org.gradle.api.file.Directory import org.gradle.api.provider.Provider import org.gradle.internal.jvm.Jvm +import com.android.build.api.dsl.ApplicationExtension class ReactPlugin : Plugin { override fun apply(project: Project) { @@ -114,12 +115,14 @@ class ReactPlugin : Plugin { /** This function configures Android resources - in this case just the bundle */ private fun configureResources(project: Project) { val android = project.extensions.getByType(ApplicationExtension::class.java) - android.buildTypes.all { buildType -> - // This makes sure the JS bundle is NOT compressed in the .apk. - // If it were compressed, `mmap` would not work causing it to be fully loaded into RAM. - val currentNoCompress = buildType.androidResources.noCompress ?: mutableSetOf() - currentNoCompress.add("bundle") - buildType.androidResources.noCompress = currentNoCompress + android.aaptOptions.apply { + // This makes sure the JS bundle is NOT compressed in the .apk. + // If it were compressed, `mmap` would not work causing it to be fully loaded into RAM. + val currentNoCompress = noCompress?.toMutableSet() ?: mutableSetOf() + currentNoCompress.add("bundle") + noCompress(*currentNoCompress.toTypedArray()) + } + } } } From 3faf9fdb1887f267bd438c2e8f6db7c4429b4166 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Sat, 15 Feb 2025 04:23:43 +0100 Subject: [PATCH 03/13] whoops I messed up the merge. --- .../src/main/kotlin/com/facebook/react/ReactPlugin.kt | 2 -- 1 file changed, 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 17d8da0fe0dc..b1b3d62abeaf 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 @@ -123,8 +123,6 @@ class ReactPlugin : Plugin { noCompress(*currentNoCompress.toTypedArray()) } } - } - } /** This function sets up `react-native-codegen` in our Gradle plugin. */ @Suppress("UnstableApiUsage") From e0d5e2d017130933943a6b1a582e66e20990c7c7 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Sat, 15 Feb 2025 04:24:07 +0100 Subject: [PATCH 04/13] format --- .../src/main/kotlin/com/facebook/react/ReactPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b1b3d62abeaf..fd60f5798c52 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 @@ -7,6 +7,7 @@ package com.facebook.react +import com.android.build.api.dsl.ApplicationExtension import com.android.build.api.variant.AndroidComponentsExtension import com.android.build.gradle.internal.tasks.factory.dependsOn import com.facebook.react.internal.PrivateReactExtension @@ -36,7 +37,6 @@ import org.gradle.api.Task import org.gradle.api.file.Directory import org.gradle.api.provider.Provider import org.gradle.internal.jvm.Jvm -import com.android.build.api.dsl.ApplicationExtension class ReactPlugin : Plugin { override fun apply(project: Project) { From 0fab49a54cf542b5c968a513f7c63bff45798be1 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Sat, 15 Feb 2025 04:33:11 +0100 Subject: [PATCH 05/13] fix: Fix warnings --- .../src/main/kotlin/com/facebook/react/ReactPlugin.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 fd60f5798c52..a00285c0baf9 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 @@ -113,12 +113,13 @@ class ReactPlugin : Plugin { } /** This function configures Android resources - in this case just the bundle */ + @Suppress("DEPRECATION") private fun configureResources(project: Project) { val android = project.extensions.getByType(ApplicationExtension::class.java) android.aaptOptions.apply { // This makes sure the JS bundle is NOT compressed in the .apk. // If it were compressed, `mmap` would not work causing it to be fully loaded into RAM. - val currentNoCompress = noCompress?.toMutableSet() ?: mutableSetOf() + val currentNoCompress = noCompress.toMutableSet() currentNoCompress.add("bundle") noCompress(*currentNoCompress.toTypedArray()) } From 0ecda1a8a3f3f51cd47bf10248e2dce54c5b278c Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Sat, 15 Feb 2025 04:36:06 +0100 Subject: [PATCH 06/13] fix: Use new `androidResources` API --- .../src/main/kotlin/com/facebook/react/ReactPlugin.kt | 9 +-------- 1 file changed, 1 insertion(+), 8 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 a00285c0baf9..0dcec9771724 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 @@ -113,16 +113,9 @@ class ReactPlugin : Plugin { } /** This function configures Android resources - in this case just the bundle */ - @Suppress("DEPRECATION") private fun configureResources(project: Project) { val android = project.extensions.getByType(ApplicationExtension::class.java) - android.aaptOptions.apply { - // This makes sure the JS bundle is NOT compressed in the .apk. - // If it were compressed, `mmap` would not work causing it to be fully loaded into RAM. - val currentNoCompress = noCompress.toMutableSet() - currentNoCompress.add("bundle") - noCompress(*currentNoCompress.toTypedArray()) - } + android.androidResources.noCompress.add("bundle") } /** This function sets up `react-native-codegen` in our Gradle plugin. */ From 2f4f85fa1cf24fb537bd097d2f71ff136ad58bc3 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Sun, 16 Feb 2025 19:57:54 +0100 Subject: [PATCH 07/13] feat: Make it configurable --- .../main/kotlin/com/facebook/react/ReactExtension.kt | 7 +++++++ .../main/kotlin/com/facebook/react/ReactPlugin.kt | 12 +++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt index b67e8826b339..324c8b0eb00e 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt @@ -76,6 +76,13 @@ abstract class ReactExtension @Inject constructor(val project: Project) { val bundleAssetName: Property = objects.property(String::class.java).convention("index.android.bundle") + /** + * Whether the Bundle Asset should be compressed when packaged into a `.apk`, or not. + * Disabling compression for the `.bundle` allows it to be directly memory-mapped to RAM, + * hence improving startup time - at the cost of a larger resulting `.apk` size. + */ + val enableBundleCompression: Boolean = false + /** * Toggles the .so Cleanup step. If enabled, we will clean up all the unnecessary files before the * bundle task. If disabled, the developers will have to manually cleanup the files. Default: true 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 0dcec9771724..1505aa9b1b88 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 @@ -113,9 +113,15 @@ class ReactPlugin : Plugin { } /** This function configures Android resources - in this case just the bundle */ - private fun configureResources(project: Project) { - val android = project.extensions.getByType(ApplicationExtension::class.java) - android.androidResources.noCompress.add("bundle") + private fun configureResources( + project: Project, + reactExtension: ReactExtension + ) { + if (!reactExtension.enableBundleCompression) { + // Bundle should not be compressed; add it to noCompress blacklist. + val android = project.extensions.getByType(ApplicationExtension::class.java) + android.androidResources.noCompress.add("bundle") + } } /** This function sets up `react-native-codegen` in our Gradle plugin. */ From 9c3e441e5e5b03382fa23c2918ca2b0d5ca942f6 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Sun, 16 Feb 2025 20:01:28 +0100 Subject: [PATCH 08/13] whoops flag --- .../src/main/kotlin/com/facebook/react/ReactPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1505aa9b1b88..b3f8eacd0933 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 @@ -82,7 +82,7 @@ class ReactPlugin : Plugin { } configureAutolinking(project, extension) configureCodegen(project, extension, rootExtension, isLibrary = false) - configureResources(project) + configureResources(project, extension) } // Library Only Configuration From bba4d063d65028746b33d5957a1eeb54585e9f60 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Sun, 16 Feb 2025 20:05:36 +0100 Subject: [PATCH 09/13] feat: Also make it work if using a different `bundleAssetName` --- .../src/main/kotlin/com/facebook/react/ReactPlugin.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 b3f8eacd0933..5d6019bd81f5 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 @@ -119,8 +119,9 @@ class ReactPlugin : Plugin { ) { if (!reactExtension.enableBundleCompression) { // Bundle should not be compressed; add it to noCompress blacklist. + val bundleFileExtension = reactExtension.bundleAssetName.substringAfterLast('.', "") val android = project.extensions.getByType(ApplicationExtension::class.java) - android.androidResources.noCompress.add("bundle") + android.androidResources.noCompress.add(bundleFileExtension) } } From 69f6679ebb55e01dcd49bbfd2f1248fc1bdc753a Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Sun, 16 Feb 2025 20:09:28 +0100 Subject: [PATCH 10/13] fix: Fix type `Property` --- .../src/main/kotlin/com/facebook/react/ReactExtension.kt | 3 ++- .../src/main/kotlin/com/facebook/react/ReactPlugin.kt | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt index 324c8b0eb00e..dafce2dbd68c 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt @@ -81,7 +81,8 @@ abstract class ReactExtension @Inject constructor(val project: Project) { * Disabling compression for the `.bundle` allows it to be directly memory-mapped to RAM, * hence improving startup time - at the cost of a larger resulting `.apk` size. */ - val enableBundleCompression: Boolean = false + val enableBundleCompression: Property = + objects.property(Boolean::class.java).convention(false) /** * Toggles the .so Cleanup step. If enabled, we will clean up all the unnecessary files before the 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 5d6019bd81f5..e07a854966e3 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 @@ -117,9 +117,10 @@ class ReactPlugin : Plugin { project: Project, reactExtension: ReactExtension ) { - if (!reactExtension.enableBundleCompression) { + if (!reactExtension.enableBundleCompression.get()) { // Bundle should not be compressed; add it to noCompress blacklist. - val bundleFileExtension = reactExtension.bundleAssetName.substringAfterLast('.', "") + val bundleFileName = reactExtension.bundleAssetName.get() + val bundleFileExtension = bundleFileName.substringAfterLast('.', "") val android = project.extensions.getByType(ApplicationExtension::class.java) android.androidResources.noCompress.add(bundleFileExtension) } From 799139f8d4c303336709aa02b9be208aa16920e4 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Tue, 18 Feb 2025 09:22:03 +0100 Subject: [PATCH 11/13] fix: Run `configureResources` in `afterEvaluate` - otherwise it's `false` forever --- .../src/main/kotlin/com/facebook/react/ReactPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e07a854966e3..fcd09a26b612 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 @@ -67,6 +67,7 @@ class ReactPlugin : Plugin { val groupString = versionAndGroupStrings.second configureDependencies(project, versionString, groupString) configureRepositories(project) + configureResources(project, extension) } configureReactNativeNdk(project, extension) @@ -82,7 +83,6 @@ class ReactPlugin : Plugin { } configureAutolinking(project, extension) configureCodegen(project, extension, rootExtension, isLibrary = false) - configureResources(project, extension) } // Library Only Configuration From 26a6cc4a8625ddd80934884b795bec7cf69088c7 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 19 Feb 2025 19:30:31 +0000 Subject: [PATCH 12/13] Properly use `finalizeDsl` --- .../kotlin/com/facebook/react/ReactPlugin.kt | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 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 fcd09a26b612..ffcf76ad163d 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 @@ -7,7 +7,6 @@ package com.facebook.react -import com.android.build.api.dsl.ApplicationExtension import com.android.build.api.variant.AndroidComponentsExtension import com.android.build.gradle.internal.tasks.factory.dependsOn import com.facebook.react.internal.PrivateReactExtension @@ -67,7 +66,6 @@ class ReactPlugin : Plugin { val groupString = versionAndGroupStrings.second configureDependencies(project, versionString, groupString) configureRepositories(project) - configureResources(project, extension) } configureReactNativeNdk(project, extension) @@ -83,6 +81,7 @@ class ReactPlugin : Plugin { } configureAutolinking(project, extension) configureCodegen(project, extension, rootExtension, isLibrary = false) + configureResources(project, extension) } // Library Only Configuration @@ -113,16 +112,12 @@ class ReactPlugin : Plugin { } /** This function configures Android resources - in this case just the bundle */ - private fun configureResources( - project: Project, - reactExtension: ReactExtension - ) { - if (!reactExtension.enableBundleCompression.get()) { - // Bundle should not be compressed; add it to noCompress blacklist. - val bundleFileName = reactExtension.bundleAssetName.get() - val bundleFileExtension = bundleFileName.substringAfterLast('.', "") - val android = project.extensions.getByType(ApplicationExtension::class.java) - android.androidResources.noCompress.add(bundleFileExtension) + private fun configureResources(project: Project, reactExtension: ReactExtension) { + project.extensions.getByType(AndroidComponentsExtension::class.java).finalizeDsl { ext -> + val bundleFileExtension = reactExtension.bundleAssetName.get().substringAfterLast('.', "") + if (!reactExtension.enableBundleCompression.get() && bundleFileExtension.isNotBlank()) { + ext.androidResources.noCompress.add(bundleFileExtension) + } } } From 2c9b85a9f8a1c9133de3c4ca6b717b77fb25bfcd Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 19 Feb 2025 19:31:28 +0000 Subject: [PATCH 13/13] Update packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt --- .../src/main/kotlin/com/facebook/react/ReactExtension.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt index dafce2dbd68c..ba5ffca34b97 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt @@ -80,6 +80,8 @@ abstract class ReactExtension @Inject constructor(val project: Project) { * Whether the Bundle Asset should be compressed when packaged into a `.apk`, or not. * Disabling compression for the `.bundle` allows it to be directly memory-mapped to RAM, * hence improving startup time - at the cost of a larger resulting `.apk` size. + * + * Default: false */ val enableBundleCompression: Property = objects.property(Boolean::class.java).convention(false)