From 326445d3af894080a5487b403e094000cda1f765 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Mon, 17 Feb 2025 07:31:40 -0800 Subject: 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 --- plugins/withNoBundleCompression.js | 70 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 plugins/withNoBundleCompression.js (limited to 'plugins') 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 + }) +} -- cgit 1.4.1