about summary refs log tree commit diff
path: root/plugins
diff options
context:
space:
mode:
authorMarc Rousavy <me@mrousavy.com>2025-02-17 07:31:40 -0800
committerGitHub <noreply@github.com>2025-02-17 07:31:40 -0800
commit326445d3af894080a5487b403e094000cda1f765 (patch)
treef761a9939aeb037b46036c01a35a001dfeb33a76 /plugins
parent40d05ac866a4783889f465458ffb5a02a169795a (diff)
downloadvoidsky-326445d3af894080a5487b403e094000cda1f765.tar.zst
Make Android app start faster by disabling JS bundle compression (#7751)
* perf: Disable Android  compression to speed up app startup

* fix: Fix the gradle plugin
Diffstat (limited to 'plugins')
-rw-r--r--plugins/withNoBundleCompression.js70
1 files changed, 70 insertions, 0 deletions
diff --git a/plugins/withNoBundleCompression.js b/plugins/withNoBundleCompression.js
new file mode 100644
index 000000000..73e571633
--- /dev/null
+++ b/plugins/withNoBundleCompression.js
@@ -0,0 +1,70 @@
+const {withAppBuildGradle} = require('@expo/config-plugins')
+
+/**
+ * A Config Plugin to disable bundle compression in Android build.gradle.
+ * @param {import('@expo/config-plugins').ConfigPlugin} config
+ * @returns {import('@expo/config-plugins').ConfigPlugin}
+ */
+module.exports = function withNoBundleCompression(config) {
+  return withAppBuildGradle(config, androidConfig => {
+    let buildGradle = androidConfig.modResults.contents
+
+    const hasAndroidResources = buildGradle.includes('androidResources {')
+    const hasNoCompress = buildGradle.includes('noCompress')
+
+    if (hasAndroidResources) {
+      if (hasNoCompress) {
+        if (
+          buildGradle.includes('noCompress += ["bundle"]') ||
+          buildGradle.includes("noCompress += 'bundle'") ||
+          buildGradle.includes('noCompress += "bundle"')
+        ) {
+          return androidConfig
+        }
+
+        const lines = buildGradle.split('\n')
+        const modifiedLines = lines.map(line => {
+          if (line.trim().startsWith('noCompress')) {
+            if (line.includes('+=')) {
+              return line.replace(/\]/, ', "bundle"]')
+            } else if (line.includes('=')) {
+              return line.replace('=', '+= ["bundle",') + ']'
+            }
+          }
+          return line
+        })
+        androidConfig.modResults.contents = modifiedLines.join('\n')
+      } else {
+        const androidResources = buildGradle.indexOf('androidResources {')
+        if (androidResources === -1) {
+          throw new Error(
+            `Cannot find androidResources { block in build.gradle!`,
+          )
+        }
+        const insertPosition = buildGradle.indexOf('\n', androidResources) + 1
+        const newContent =
+          buildGradle.slice(0, insertPosition) +
+          '        noCompress += ["bundle"]\n' +
+          buildGradle.slice(insertPosition)
+
+        androidConfig.modResults.contents = newContent
+      }
+    } else {
+      const androidBlock = buildGradle.indexOf('android {')
+      if (androidBlock === -1) {
+        throw new Error(`Cannot find android { block in build.gradle!`)
+      }
+      const insertPosition = buildGradle.indexOf('\n', androidBlock) + 1
+      const newContent =
+        buildGradle.slice(0, insertPosition) +
+        '    androidResources {\n' +
+        '        noCompress += ["bundle"]\n' +
+        '    }\n' +
+        buildGradle.slice(insertPosition)
+
+      androidConfig.modResults.contents = newContent
+    }
+
+    return androidConfig
+  })
+}