Codegen 与 Autolinking 机制
1. 为什么 RN 必须重度依赖 Codegen
RN 是多语言系统(JS/TS + Kotlin/Java + ObjC/Swift + C++)。
没有 codegen,就需要手写:
- 模块接口桥接
- 平台注册代码
- 组件描述与类型映射
这在生态规模上不可维护,且容易出现平台语义漂移。
2. Codegen 主流程(源码)
入口链路:
scripts/generate-codegen-artifacts.jsscripts/codegen/generate-artifacts-executor/index.js.../generateNativeCode.js- Android 插件任务
GenerateCodegenSchemaTask/GenerateCodegenArtifactsTask
关键流程:
- 扫描应用与依赖中的
codegenConfig - 生成 schema 与 native artifacts
- 区分平台输出目录(android / ios)
- 根据
includesGeneratedCode决定是否跳过再生成
3. Autolinking 主流程(源码)
Settings 插件:
settings-plugin/.../ReactSettingsExtension.kt
任务逻辑:
- 运行
npx @react-native-community/cli config生成autolinking.json - 使用 lockfile + SHA 缓存,避免每次全量扫描
- 读取 model 自动
includeAndroid 子项目
New Architecture C++ 接线:
GenerateAutolinkingNewArchitecturesFileTask.kt- 输出
Android-autolinking.cmake+autolinking.cpp/h
4. 设计原因与收益
- 单一真相源:
package.json的 codegenConfig + CLI config - 自动化注册:减少模板代码、降低升级成本
- 增量缓存:加速本地与 CI
- 生态友好:库作者只需声明配置,不必深度入侵 app 构建文件
5. 可落地回答
“RN 的 codegen + autolinking 本质是把‘手工跨语言 glue code’产品化。你声明配置,工具生成 schema、Java/C++/ObjC 产物并接入构建图;它同时用 lockfile hash 做缓存,控制工程成本和增量效率。”