多平台编译与兼容机制(Android / iOS / C++ / JS)
1. Android:Gradle Plugin 统一编排
核心文件:
packages/gradle-plugin/.../ReactPlugin.kt.../TaskConfiguration.kt.../tasks/BundleHermesCTask.kt.../tasks/GenerateAutolinkingNewArchitecturesFileTask.kt
关键机制:
- 插件统一注入依赖、仓库、NDK、BuildConfig、代码生成任务
- 按 variant 生成 JS bundle / assets / sourcemap
- 非 debug variant 执行 Hermes bundle 编译任务
- preBuild 绑定 codegen 与 autolinking 任务,确保 native 编译前产物齐备
兼容点:
windowsAwareCommandLine处理跨平台命令执行差异- Hermes 按 variant 可控,且支持 engine packaging 选项
关键代码(节选):
kotlin
if (!isDebuggableVariant) {
val bundleTask =
tasks.register("createBundle${targetName}JsAndAssets", BundleHermesCTask::class.java) { task ->
task.hermesEnabled.set(isHermesEnabledInThisVariant)
task.minifyEnabled.set(!isHermesEnabledInThisVariant)
}
}2. iOS:CocoaPods + 脚本化装配(并逐步走向替代方案)
核心文件:
packages/react-native/scripts/react_native_pods.rbscripts/cocoapods/new_architecture.rbscripts/cocoapods/jsengine.rbscripts/react-native-xcode.sh
关键机制:
use_react_native!汇总安装 Core/Fabric/Turbo/Runtime pods- 默认 Hermes,JSC 迁移至社区包(third-party)
- post_install 注入 C++ 标准、编译 flags、路径与隐私清单聚合
- Xcode 构建阶段脚本统一负责 bundle + assets + Hermes bytecode + sourcemap 合成
兼容点:
- Debug/Release、Simulator/Device 的 bundling 行为分支
BUNDLE_PLATFORM处理 iOS / macOS / catalyst 目标差异
关键脚本(节选):
bash
case "$PLATFORM_NAME" in
"macosx")
BUNDLE_PLATFORM="macos"
;;
*)
BUNDLE_PLATFORM="ios"
;;
esac3. C++ 层:跨端共享与自动接线
通过 autolinking 任务生成:
Android-autolinking.cmakeautolinking.cppautolinking.h
它把三方库 TurboModule / C++ module / ComponentDescriptor 自动接入 Native 编译图,减少手工 CMake 与注册代码。
4. 预编译产物与二进制兼容(iOS)
scripts/ios-prebuild/__docs__/README.md 显示:
- RN 支持构建 XCFramework(iOS / simulator / catalyst)
- 使用
BUILD_LIBRARY_FOR_DISTRIBUTION=YES保证模块稳定性 - 用 VFS Overlay 映射头文件路径,解决预编译框架 header 结构兼容问题
这是典型“工程兼容优先”的方案:通过编译器层虚拟文件系统补齐历史头文件布局。
5. 可讲的“兼容策略三板斧”
- 任务前置:codegen/autolinking/preBuild 强绑定,避免运行时缺依赖
- 编译抽象:Gradle/CocoaPods 封装引擎、架构、产物路径差异
- 产物中立:源码构建与预编译二进制双路径并存(含 VFS/符号处理)