You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:13:18