diff options
author | Marc Rousavy <me@mrousavy.com> | 2025-02-17 07:31:40 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-17 07:31:40 -0800 |
commit | 326445d3af894080a5487b403e094000cda1f765 (patch) | |
tree | f761a9939aeb037b46036c01a35a001dfeb33a76 /plugins | |
parent | 40d05ac866a4783889f465458ffb5a02a169795a (diff) | |
download | voidsky-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.js | 70 |
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 + }) +} |