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

Expo托管工作流中自定义Android库自动链接失败求助

解决Expo托管工作流中自定义Android库的核心问题

一、修复PackageList.java找不到com.example.MyPackage的问题

Expo托管工作流不会自动识别裸项目中手动配置的Native Package,必须通过Expo插件完成注册,具体操作:

  1. 在自定义库根目录创建插件文件(比如withMyLibrary.js),写入Package注册逻辑:
const { withAppBuildGradle } = require('@expo/config-plugins');
const fs = require('fs');

module.exports = function withMyLibrary(config) {
  // 关联自定义库到项目build.gradle
  config = withAppBuildGradle(config, async (config) => {
    if (config.modResults.language === 'groovy') {
      config.modResults.contents = config.modResults.contents.replace(
        /dependencies\s*{([\s\S]*?)}/,
        (match) => `${match}\n    implementation project(':my-library')`
      );
    }
    return config;
  });

  // 修改PackageList.java,添加自定义Package
  const packageListPath = `${config.modRequest.platformProjectRoot}/src/main/java/com/yourAppId/PackageList.java`;
  let content = fs.readFileSync(packageListPath, 'utf8');

  // 添加入口import
  if (!content.includes('import com.example.MyPackage;')) {
    content = content.replace(
      /import com.facebook.react.ReactPackage;/,
      '$&\nimport com.example.MyPackage;'
    );
  }

  // 添加入Package实例列表
  if (!content.includes('new MyPackage()')) {
    content = content.replace(
      /return Arrays\.asList\(([\s\S]*?)\);/,
      (match, inner) => `return Arrays.asList(${inner},\n            new MyPackage());`
    );
  }

  fs.writeFileSync(packageListPath, content);
  return config;
};
  1. 在自定义库的package.json中配置插件入口:
{
  "name": "my-custom-library",
  "expo": {
    "plugins": ["./withMyLibrary.js"]
  }
}
  1. 在宿主Expo项目的app.json/app.config.js中引入插件:
{
  "expo": {
    "plugins": ["my-custom-library"]
  }
}

二、排查插件解析失败的问题

按以下优先级逐一排查:

  • 检查插件路径:确保库package.json中expo.plugins指向的路径是相对库根目录的正确路径(比如插件文件叫plugin.js,则写"./plugin.js")
  • 补全插件依赖:在自定义库的package.json中添加@expo/config-plugins依赖:
{
  "devDependencies": {
    "@expo/config-plugins": "^6.0.0"
  }
}
  • 修正插件语法:Expo插件必须用CommonJS规范,用module.exports = ...导出,不能用ES6的export default
  • 本地依赖关联:如果是本地开发库,确保通过yarn link/npm link关联,或者直接在宿主项目package.json中用本地路径依赖:
{
  "dependencies": {
    "my-custom-library": "../path/to/your/library"
  }
}
  • 清理构建缓存:执行npx expo prebuild --clean清除旧缓存后重新构建

额外注意事项

  • 自定义库的build.gradle中,compileSdkVersion、minSdkVersion必须与Expo项目保持一致
  • 如果需要修改AndroidManifest.xml,必须在插件中用withAndroidManifest方法处理,示例:
const { withAndroidManifest } = require('@expo/config-plugins');

config = withAndroidManifest(config, async (config) => {
  const manifest = config.modResults.manifest;
  // 示例:添加权限
  manifest['uses-permission'].push({
    $: {
      'android:name': 'android.permission.ACCESS_FINE_LOCATION'
    }
  });
  return config;
});

内容的提问来源于stack exchange,提问作者Hunt3R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:40:05