React Native Expo用withDangerousMod修改MainApplication.java的示例求询
实现示例
以下是使用withDangerousMod修改MainApplication.java的完整可复用示例:
首先创建plugins/withCustomMainApplication.js自定义插件文件:
const { withDangerousMod, AndroidConfig } = require('@expo/config-plugins'); const fs = require('fs/promises'); const path = require('path'); module.exports = function withCustomMainApplication(config) { return withDangerousMod(config, { platform: 'android', mod: async (config) => { // 获取MainApplication.java的绝对路径 const mainAppPath = AndroidConfig.Paths.getMainApplicationFilePath( config.modRequest.platformProjectRoot ); // 读取原文件内容 let content = await fs.readFile(mainAppPath, 'utf-8'); // 示例修改逻辑1:在onCreate方法中添加自定义初始化代码 // 可根据自身需求调整替换规则 const onCreateMatch = content.match(/@Override\s+public void onCreate\(\)\s+\{/); if (onCreateMatch) { const insertCode = ` // 自定义初始化逻辑 CustomFeature.init(this); `; content = content.replace( onCreateMatch[0], `${onCreateMatch[0]}${insertCode}` ); } // 示例修改逻辑2:添加自定义导入语句 const packageMatch = content.match(/package [a-z0-9.]+;/); if (packageMatch) { const importCode = ` import com.example.custom.CustomFeature; `; content = content.replace( packageMatch[0], `${packageMatch[0]}${importCode}` ); } // 将修改后的内容写回文件 await fs.writeFile(mainAppPath, content, 'utf-8'); return config; }, }); };
插件使用方法
- 在
app.config.js的plugins数组中引入上述自定义插件:
module.exports = { expo: { // 其他项目配置 plugins: [ './plugins/withCustomMainApplication.js', // 其他插件配置 ], }, };
- 完成配置后执行
npx expo prebuild --clean触发原生文件修改逻辑 - 编译安卓项目验证修改是否生效
注意事项
- 替换规则尽量使用通用的正则或字符串匹配,不要依赖固定行号,避免Expo SDK版本升级后原生文件结构变化导致修改失效
- 修改前建议先打印原
MainApplication.java的内容,确认匹配规则的准确性 - 每次升级Expo SDK后需要重新测试修改逻辑,避免原生文件结构变动导致替换失败
- 该操作属于原生文件高危修改,建议提前做好配置备份
内容的提问来源于stack exchange,提问作者UDAIF M C
相关产品推荐
相关产品推荐

