菜单

Android 构建系统

相关源文件

本文档解释了 React Native 的 Android 库是如何构建的。它涵盖了构建基础设施、依赖管理、原生代码编译以及用于创建 React Native Android 构件的各种构建工具。本页面专注于构建过程本身,而不是如何在 Android 应用程序中使用 React Native(有关该内容,请参阅实例管理)。

目录

构建系统概述

React Native 的 Android 构建系统是一个复杂的底层架构,结合了多种构建工具来创建 Android 应用程序所需的构件。主要组件是:

  1. Gradle - Android 项目的主要构建系统
  2. CMake - 用于构建原生 C++ 代码
  3. 依赖下载器 - 用于获取和准备 C++ 依赖项的脚本
  4. 库合并器 - 用于合并多个原生库的工具

来源

构建配置文件

React Native 的 Android 构建配置分布在几个关键文件中:

Gradle 配置

主要的 Gradle 配置文件定义了 Android 库、依赖项和构建任务。

  1. 根 build.gradle.kts:设置项目结构并应用插件
  2. ReactAndroid/build.gradle.kts:React Native Android 库的主要构建脚本
  3. gradle/libs.versions.toml:依赖项的集中版本目录

ReactAndroid 的 build.gradle.kts 文件包含几个重要部分:

  • 库元数据(组、版本)
  • 原生依赖配置(下载目录、第三方 NDK 目录)
  • 用于准备第三方库的自定义任务
  • Android 配置(SDK 版本、NDK 版本、ABI 过滤器)
  • Gradle 发布配置

版本目录中版本管理示例

[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"

CMake 配置

C++ 构建通过 CMakeLists.txt 文件的层级结构定义。

  1. 主 CMakeLists.txtpackages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt
  2. 特定模块的 CMakeLists.txt 文件:针对每个原生模块或组件

主 CMakeLists.txt 设置了

  • 库目标
  • 包含路径
  • 第三方依赖项
  • 编译器标志

来源

依赖管理

React Native 的 Android 构建依赖于各种原生 C++ 库,这些库需要在构建过程中下载和准备。

原生依赖项

主要的第三方 C++ 依赖项包括:

依赖项版本目的
Boost1.83.0C++ 工具库
Double Conversion1.1.6字符串到 double 的转换
Fast Float8.0.0快速浮点解析
FMT11.0.2字符串格式化库
Folly2024.11.18.00Facebook 的 C++ 工具库
Glog0.3.5Google 日志库
GTest1.12.1Google 测试框架

下载和准备过程

构建系统包含专门的任务来下载和准备每个依赖项。

对于每个依赖项,Gradle 构建脚本定义了:

  1. 一个下载任务,用于获取源代码。
  2. 一个准备任务,用于提取和配置源文件。
  3. 存储文件的目录路径。

通过 REACT_NATIVE_DOWNLOADS_DIRREACT_NATIVE_BOOST_PATH 等变量支持对依赖项的环境覆盖。

来源

原生代码编译

React Native 使用 CMake 来构建其原生 C++ 组件,然后将这些组件合并到一个共享库中。

CMake 目标结构

主要的 CMake 配置设置了一个复杂的目标层级结构,代表了 React Native 的不同组件。

主要的 libreactnative.so 共享库包含了许多合并在一起的对象目标。每个组件都通过以下方式定义:

  • 要编译的源文件
  • 包含目录
  • 链接依赖项
  • 编译标志

构建 React Native 库

位于 packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt 中的 reactnative 目标是打包到 React Native AAR 中的主共享库。该目标结合了来自各种 React Native 组件的众多对象文件。

原生编译的关键方面:

  • 使用 C++20 标准
  • 在支持的情况下实现 LTO(链接时优化)
  • 通过编译定义配置各种功能标志
  • 将多个小型库合并为一个大型共享库

来源

库合并系统

React Native 实现了一个自定义系统,将多个原生库合并为一个共享对象文件。这对于减小 APK 体积和避免符号冲突非常重要。

SO 合并机制

合并系统通过在每个库中重新定义 JNI_OnLoad 函数来工作。

合并过程包括:

  1. 每个库都包含 jni_lib_merge.h 头文件,它:

    • 将原始的 JNI_OnLoad 重命名为 pre_merge_original_JNI_OnLoad
    • 创建一个弱符号 JNI_OnLoad_Weak,它调用原始函数。
    • 在特殊部分注册库以供发现。
  2. target_merge_so CMake 函数将合并应用于目标。

    • 设置必需的编译定义,包括原始 .so 名称。
    • 使用特殊选项链接以支持弱符号。
  3. 最终合并的库有一个主 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 原生模块。

来源