本文档解释了 React Native 的 Android 库是如何构建的。它涵盖了构建基础设施、依赖管理、原生代码编译以及用于创建 React Native Android 构件的各种构建工具。本页面专注于构建过程本身,而不是如何在 Android 应用程序中使用 React Native(有关该内容,请参阅实例管理)。
React Native 的 Android 构建系统是一个复杂的底层架构,结合了多种构建工具来创建 Android 应用程序所需的构件。主要组件是:
来源
React Native 的 Android 构建配置分布在几个关键文件中:
主要的 Gradle 配置文件定义了 Android 库、依赖项和构建任务。
ReactAndroid 的 build.gradle.kts 文件包含几个重要部分:
版本目录中版本管理示例
[versions]
# Android versions
minSdk = "24"
targetSdk = "35"
compileSdk = "35"
buildTools = "35.0.0"
ndkVersion = "27.1.12297006"
# Native Dependencies
boost="1_83_0"
doubleconversion="1.1.6"
fastFloat="8.0.0"
fmt="11.0.2"
folly="2024.11.18.00"
glog="0.3.5"
gtest="1.12.1"
C++ 构建通过 CMakeLists.txt 文件的层级结构定义。
主 CMakeLists.txt 设置了
来源
React Native 的 Android 构建依赖于各种原生 C++ 库,这些库需要在构建过程中下载和准备。
主要的第三方 C++ 依赖项包括:
| 依赖项 | 版本 | 目的 |
|---|---|---|
| Boost | 1.83.0 | C++ 工具库 |
| Double Conversion | 1.1.6 | 字符串到 double 的转换 |
| Fast Float | 8.0.0 | 快速浮点解析 |
| FMT | 11.0.2 | 字符串格式化库 |
| Folly | 2024.11.18.00 | Facebook 的 C++ 工具库 |
| Glog | 0.3.5 | Google 日志库 |
| GTest | 1.12.1 | Google 测试框架 |
构建系统包含专门的任务来下载和准备每个依赖项。
对于每个依赖项,Gradle 构建脚本定义了:
通过 REACT_NATIVE_DOWNLOADS_DIR 和 REACT_NATIVE_BOOST_PATH 等变量支持对依赖项的环境覆盖。
来源
React Native 使用 CMake 来构建其原生 C++ 组件,然后将这些组件合并到一个共享库中。
主要的 CMake 配置设置了一个复杂的目标层级结构,代表了 React Native 的不同组件。
主要的 libreactnative.so 共享库包含了许多合并在一起的对象目标。每个组件都通过以下方式定义:
位于 packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt 中的 reactnative 目标是打包到 React Native AAR 中的主共享库。该目标结合了来自各种 React Native 组件的众多对象文件。
原生编译的关键方面:
来源
React Native 实现了一个自定义系统,将多个原生库合并为一个共享对象文件。这对于减小 APK 体积和避免符号冲突非常重要。
合并系统通过在每个库中重新定义 JNI_OnLoad 函数来工作。
合并过程包括:
每个库都包含 jni_lib_merge.h 头文件,它:
JNI_OnLoad 重命名为 pre_merge_original_JNI_OnLoad。JNI_OnLoad_Weak,它调用原始函数。target_merge_so CMake 函数将合并应用于目标。
.so 名称。最终合并的库有一个主 JNI_OnLoad,它调用所有单独的库初始化程序。
这种方法允许 React Native 避免暴露多个 .so 文件,同时仍然保持模块化的代码组织。
来源
React Native 的 Android 构建过程涉及多个 Gradle 任务,这些任务协调整个构建工作流程。
构建过程中的关键 Gradle 任务包括:
| 任务 | 目的 |
|---|---|
preBuild | 在主要构建之前准备依赖项 |
build | 库的主要构建任务 |
buildCodegenCLI | 构建构建所需的 codegen 工具 |
preparePrefab | 准备 Prefab 打包的头文件 |
publishAllToMavenTempLocal | 将构件发布到临时 Maven 仓库 |
publishAndroidToSonatype | 将构件发布到 Maven Central |
preBuild 任务尤其重要,因为它设置了构建的所有先决条件。
来源
React Native 的 Android 构建系统支持通过 ABI(应用程序二进制接口)过滤器支持多种 CPU 架构。
默认情况下,React Native 为以下架构构建:
此配置应用于 Android 构建设置。
应用程序可以通过在其 gradle.properties 文件中设置 reactNativeArchitectures 属性来定制要包含的架构。
这对于通过仅定位特定架构来减小 APK 体积或处理 Apple Silicon 开发机器等特殊情况很有用。
来源
Android 构建系统通过特定的配置和构建组件支持 React Native 的新架构。
DefaultNewArchitectureEntryPoint 类作为新架构初始化的主入口点。
这会配置功能标志并加载新架构组件所需的原生库。
DefaultSoLoader 确保加载所需的原生库。
这会加载 react_newarchdefaults 库,它提供了新架构组件的原生实现,以及可选的应用特定 appmodules 原生模块。
来源