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

React Native安卓应用打包AAR及依赖缺失等问题排查

React Native 0.63.5 打包AAR集成到原生安卓的解决方案

问题背景

需要将RN安卓应用打包为AAR,集成到独立原生安卓应用中,让其他开发者无需搭建RN环境即可开发。已完成的操作:

  • 将安卓模块Gradle插件从com.android.application改为com.android.library
  • 移除applicationId配置
  • 清理清单文件中的应用类、图标等内容

但遇到以下问题:

  1. 构建AAR时出现Gradle报错:
    FAILURE: Build failed with an exception.
    
    * Where:
    Script 'C:\proj\react-native\node_modules\react-native\react.gradle' line: 353
    
    * What went wrong:
    A problem occurred configuring project ':app'.
    > Cannot invoke method doFirst() on null object
    
    原因是library插件没有packageDebug/packageRelease任务,而react.gradle脚本依赖这些任务。
  2. 成功构建AAR后,缺失com.facebook.react.ReactActivity等RN依赖类,且未包含打包后的JS资源(构建APK时这些内容正常存在)。

使用版本:

  • react-native: 0.63.5
  • com.android.tools.build:gradle:4.1.3 (Gradle版本: 6.9)

核心原因分析

  1. react.gradle适配问题:该脚本为application插件编写,默认绑定package任务触发JS打包,而library插件无此类任务,导致JS资源无法自动打包进AAR。
  2. 依赖传递问题:默认RN依赖使用implementation声明,不会被打包进AAR,导致宿主应用找不到RN相关类。
  3. 资源打包流程缺失:Library构建流程不会自动执行RN的JS bundle打包,也不会将资源复制到AAR的assets目录。

分步解决方案

1. 修复Gradle任务报错

在模块级build.gradle中添加以下代码,屏蔽react.gradle中对不存在任务的绑定:

afterEvaluate {
    project.tasks.whenTaskAdded { task ->
        // 屏蔽package开头的任务,避免触发空对象报错
        if (task.name.startsWith("package")) {
            task.enabled = false
        }
    }
}

2. 手动配置JS资源打包

添加任务手动执行RN bundle打包,并将资源复制到Library的资源目录,确保AAR包含JS bundle和静态资源:

// 打包Debug环境JS资源
task bundleDebugJsAndAssets(type: Exec) {
    // 路径指向RN项目根目录,根据你的项目结构调整
    def rnRootDir = file("../../")
    commandLine "node", rnRootDir.file("node_modules/react-native/cli.js").absolutePath,
            "bundle",
            "--platform", "android",
            "--dev", "true",
            "--entry-file", "index.js",
            "--bundle-output", file("src/main/assets/index.android.bundle").absolutePath,
            "--assets-dest", file("src/main/res").absolutePath
}

// 打包Release环境JS资源
task bundleReleaseJsAndAssets(type: Exec) {
    def rnRootDir = file("../../")
    commandLine "node", rnRootDir.file("node_modules/react-native/cli.js").absolutePath,
            "bundle",
            "--platform", "android",
            "--dev", "false",
            "--entry-file", "index.js",
            "--bundle-output", file("src/main/assets/index.android.bundle").absolutePath,
            "--assets-dest", file("src/main/res").absolutePath
}

// 让构建任务自动触发JS打包
preBuild.dependsOn bundleDebugJsAndAssets, bundleReleaseJsAndAssets

提示:如果执行时找不到node命令,可替换为node的绝对路径,比如"C:\\Program Files\\nodejs\\node.exe"。

3. 调整依赖声明,确保RN类被打包进AAR

将RN相关依赖从implementation改为api,让依赖可以被传递到AAR中:

dependencies {
    // RN核心依赖
    api "com.facebook.react:react-native:0.63.5"
    // RN依赖的soloader,版本对应RN 0.63.5的默认版本
    api "com.facebook.soloader:soloader:0.10.3"
    // 其他RN第三方库依赖也改为api
    // api "com.xxx:xxx:1.0.0"
}

4. 封装RN Activity到Library中

创建自定义Activity继承ReactActivity,方便宿主应用直接调用:

package com.your.rn.library;

import com.facebook.react.ReactActivity;

public class RNAppActivity extends ReactActivity {
    @Override
    protected String getMainComponentName() {
        // 返回你的RN应用注册的组件名称(index.js中AppRegistry.registerComponent的第一个参数)
        return "YourRNAppName";
    }
}

在Library的AndroidManifest.xml中注册该Activity(添加tools:node="merge"避免宿主清单冲突):

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="com.your.rn.library">

    <application>
        <activity
            android:name=".RNAppActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:windowSoftInputMode="adjustResize"
            tools:node="merge"/>
    </application>
</manifest>

5. 构建AAR

执行以下命令构建Release版本的AAR:

gradlew assembleRelease

生成的AAR文件位于模块目录/build/outputs/aar/下,比如your-rn-library-release.aar。

宿主应用集成

  1. 将AAR复制到宿主应用的libs目录
  2. 在宿主应用的模块级build.gradle中添加依赖:
    dependencies {
        implementation files('libs/your-rn-library-release.aar')
    }
    
  3. 宿主应用中启动RNActivity:
    // 比如在宿主的某个Activity中跳转
    startActivity(new Intent(this, RNAppActivity.class));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:15:39