const { withDangerousMod } = require('@expo/config-plugins'); const fs = require('fs'); const path = require('path'); function withSizeOptimization(config) { // 1. 在 prebuild 时修改 gradle.properties config = withDangerousMod(config, [ 'android', async (modConfig) => { const projectRoot = modConfig.modRequest.platformProjectRoot; const propertiesPath = path.join(projectRoot, 'gradle.properties'); if (fs.existsSync(propertiesPath)) { let content = fs.readFileSync(propertiesPath, 'utf8'); if (content.includes('reactNativeArchitectures=')) { content = content.replace(/reactNativeArchitectures=.*/, 'reactNativeArchitectures=arm64-v8a'); } else { content += '\nreactNativeArchitectures=arm64-v8a\n'; } fs.writeFileSync(propertiesPath, content, 'utf8'); } return modConfig; } ]); // 2. 在 prebuild 时修改 app/build.gradle 启用 ABI Splits 分包 config = withDangerousMod(config, [ 'android', async (modConfig) => { const projectRoot = modConfig.modRequest.platformProjectRoot; const buildGradlePath = path.join(projectRoot, 'app/build.gradle'); if (fs.existsSync(buildGradlePath)) { let content = fs.readFileSync(buildGradlePath, 'utf8'); if (!content.includes('splits {')) { content = content.replace( /android\s*\{/, `android {\n splits {\n abi {\n enable true\n reset()\n include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"\n universalApk true\n }\n }` ); fs.writeFileSync(buildGradlePath, content, 'utf8'); } } return modConfig; } ]); // 3. 在 prebuild 时修改 root build.gradle 强制指定所有模块的 NDK 版本以匹配 27.1.12297006 config = withDangerousMod(config, [ 'android', async (modConfig) => { const projectRoot = modConfig.modRequest.platformProjectRoot; const rootBuildGradlePath = path.join(projectRoot, 'build.gradle'); if (fs.existsSync(rootBuildGradlePath)) { let content = fs.readFileSync(rootBuildGradlePath, 'utf8'); if (!content.includes('ndkVersion = "27.1.12297006"')) { content += ` subprojects { project -> def configureProject = { proj -> if (proj.hasProperty("android")) { proj.android { ndkVersion = "27.1.12297006" } } } if (project.state.executed) { configureProject(project) } else { project.afterEvaluate { configureProject(project) } } } `; fs.writeFileSync(rootBuildGradlePath, content, 'utf8'); } } return modConfig; } ]); return config; } module.exports = withSizeOptimization;