如何通过Expo插件Mod在MainApplication.java的onCreate中添加代码?
解决方案:在Expo托管应用中通过ConfigPlugin修改MainApplication的onCreate方法
要在Expo托管应用的MainApplication.java的onCreate方法中添加Embrace SDK初始化代码,你可以借助Expo官方的withMainApplication工具和Java AST解析能力实现,无需直接修改原生文件。以下是具体步骤和代码:
1. 导入必要的依赖工具
确保插件中导入@expo/config-plugins提供的相关工具:
import { ConfigPlugin, withMainApplication } from '@expo/config-plugins'; import { Java } from '@expo/config-plugins/build/utils/Java';
2. 修改你的ConfigPlugin代码
更新现有withEmbrace插件,加入对MainApplication.java的逻辑处理:
import { ConfigPlugin, withMainApplication } from '@expo/config-plugins'; import { Java } from '@expo/config-plugins/build/utils/Java'; import { ConfigBuilder } from './configBuilder'; const pkg = require('../../package.json'); const withEmbrace: ConfigPlugin = expoConfig => { // 原有配置:添加导入语句和配置文件 const configBuilder = new ConfigBuilder(expoConfig); const contents = JSON.stringify({ app_id: '######', api_token: '############################', }); configBuilder.addImportEntry('import io.embrace.android.embracesdk.Embrace;'); configBuilder.addFile('android', 'android/app/src/main/embrace-config.json', contents); // 新增:修改MainApplication.java的onCreate方法 expoConfig = withMainApplication(expoConfig, config => { const ast = Java.parse(config.modResults.contents); const mainClass = Java.findClass(ast); if (!mainClass) return config; // 查找已存在的onCreate方法 let onCreateMethod = Java.findMethod(ast, { name: 'onCreate', returnType: 'void', parameters: [], }); if (onCreateMethod) { // 在super.onCreate()之后插入初始化代码 const superCall = Java.findSuperCall(onCreateMethod.body); if (superCall) { superCall.insertAfter(` Embrace.getInstance().start(this, false, Embrace.AppFramework.REACT_NATIVE);\n`); } else { // 若没有super调用,先添加再插入初始化代码 onCreateMethod.body.unshift(Java.statement('super.onCreate();')); onCreateMethod.body.push(Java.statement(' Embrace.getInstance().start(this, false, Embrace.AppFramework.REACT_NATIVE);')); } } else { // 若没有onCreate方法,创建新的重写方法 mainClass.body.push(Java.method(` @Override public void onCreate() { super.onCreate(); Embrace.getInstance().start(this, false, Embrace.AppFramework.REACT_NATIVE); } `)); } // 将修改后的AST转换回Java代码 config.modResults.contents = Java.print(ast); return config; }); return configBuilder.build(); }; export default withEmbrace;
3. 代码说明
withMainApplication:Expo官方提供的ConfigPlugin工具,专门用于修改Android的MainApplication.java文件,确保在构建流程中正确注入修改。- Java AST解析:通过
Java工具类将代码解析为抽象语法树,避免直接字符串替换带来的格式错误或逻辑冲突,保证修改的安全性。 - 兼容处理:同时支持两种场景——已有
onCreate方法时插入代码,无onCreate方法时创建完整的重写方法,覆盖所有可能的原生代码结构。
内容的提问来源于stack exchange,提问作者kjanderson2
相关产品推荐
相关产品推荐

