求助:将React Native项目转为.AAR/SDK并集成到Android项目
React Native转AAR集成Android项目:实操步骤与避坑指南
一、先改造RN Android工程为Library模块
- 进入RN项目的
android目录,修改根目录下的build.gradle:- 将
apply plugin: "com.android.application"替换为apply plugin: "com.android.library" - 删除
defaultConfig里的applicationId配置(Library不需要这个) - 把
minSdkVersion、compileSdkVersion、targetSdkVersion和你要集成的宿主Android项目完全对齐,这是避免版本冲突的基础
- 将
二、解决依赖冲突(核心避坑点)
- 强制统一依赖版本:在Library的
build.gradle里添加resolutionStrategy,把所有冲突的依赖版本和宿主项目保持一致,比如:configurations.all { resolutionStrategy { force 'com.google.guava:guava:30.1.1-jre' force 'com.facebook.fresco:fresco:2.6.0' force 'androidx.appcompat:appcompat:1.6.1' // 把报错提示里的冲突依赖都加到这里 } } - 排除重复依赖:如果宿主项目已经包含某些RN依赖(比如
androidx库),在Library的依赖声明里排除这些组,比如:implementation('com.facebook.react:react-native:0.72.0') { exclude group: 'com.google.android.material' exclude group: 'androidx.appcompat' } - 确保RN第三方库的正确引入:所有RN原生插件(比如
react-native-webview)必须在settings.gradle里添加include ':react-native-webview',并在build.gradle里用implementation project(':react-native-webview')引入,不要手动复制jar包
三、打包AAR的正确流程
- 清理缓存:先执行
npx react-native clean,再进入android目录执行./gradlew clean,避免旧缓存干扰 - 打包RN资源和bundle:执行以下命令把RN的JS bundle和静态资源打包到Library的assets/res目录:
npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/ - 构建Release版AAR:在
android目录执行./gradlew assembleRelease,生成的AAR文件在android/build/outputs/aar/目录下(找带release后缀的文件)
四、宿主项目集成AAR的注意事项
- 把AAR放到宿主项目的
libs目录,然后在宿主的build.gradle里配置:repositories { flatDir { dirs 'libs' } // 必须添加RN的maven仓库,否则可能找不到RN依赖 maven { url "../node_modules/react-native/android" } maven { url "../node_modules/jsc-android/dist" } } dependencies { implementation(name: 'your-library-release', ext: 'aar') // 如果AAR里没有打包RN核心库,需要手动添加对应版本的依赖 // implementation 'com.facebook.react:react-native:0.72.0' } - 初始化RN环境:在宿主项目的Application或启动Activity里调用AAR提供的初始化方法,示例:
// 这是你在AAR里写的初始化类 public class RNBridgeManager { private static ReactInstanceManager sReactInstanceManager; public static void init(Application app) { sReactInstanceManager = ReactInstanceManager.builder() .setApplication(app) .setBundleAssetName("index.android.bundle") .setJSMainModulePath("index") .addPackage(new MainReactPackage()) // 添加你的自定义RN Package .setUseDeveloperSupport(BuildConfig.DEBUG) .setInitialLifecycleState(LifecycleState.RESUMED) .build(); } public static ReactInstanceManager getReactInstanceManager() { return sReactInstanceManager; } }
五、常见报错快速修复
- Duplicate class XXX found:用
resolutionStrategy.force统一对应依赖的版本,或者排除重复的依赖组 - Could not resolve com.facebook.react:react-native:x.x.x:检查Library和宿主的
build.gradle是否添加了RN的maven仓库,确保node_modules里的RN版本正确 - RN bundle not found:打包AAR前必须执行
react-native bundle命令,确保index.android.bundle已经生成在assets目录 - 资源冲突(比如同名drawable/string):给RN项目的资源加前缀,或者在Library的
AndroidManifest.xml里添加tools:replace="android:name"处理冲突资源
内容的提问来源于stack exchange,提问作者MaroonDre
相关产品推荐
相关产品推荐

