移动端跨平台开发:从原生 iOS/Android 到 React Native / Flutter 与原生桥
0. 元信息
- 主题路径:
docs/topics/mobile-cross-platform/README.md - 主分类:前端与客户端
- 辅助分类:工程技术
- 适合对象:会写 React 或 Python、想做移动端 App 并理解 RN/Flutter 与原生层交互的开发者
- 建议周期:6~10 周(每周 8~12 小时,至少一半时间用于真机/模拟器实验与原生桥调试)
- 前置知识:
lang-python、react-app;会 npm/pnpm、命令行、TypeScript 与 React Hooks - 最终目标:拿到一个移动端产品需求,能在 React Native 与 Flutter 之间做出技术选型,独立完成一个跨平台 App,并理解 JSI / Hermes / 原生模块 / 离线同步 / 平台发布的全部边界
1. 学习路线
原生 iOS / Android 基础(Swift / Kotlin、Activity / ViewController、生命周期)
→ React Native 架构(JS 引擎、Bridge / JSI / Hermes、Fabric / TurboModules)
→ Flutter 与 Dart(Widget / Element / RenderObject、Skia、isolate、Platform Channel)
→ 跨端性能、启动、JSI / 原生模块、离线同步、测试、App Store / Play 发布
按「先懂原生层 → 再学跨端框架 → 最后回到原生桥与发布」的顺序。先用 Xcode / Android Studio 真机调试一遍,再用同一份业务需求分别用 RN 和 Flutter 实现,对比启动时间、内存、JS / Dart 隔离模型与原生调用边界。
2. 阶段周数分配
| 阶段 | 6 周方案 | 10 周方案 | 备注 |
|---|---|---|---|
| 1. 原生 iOS / Android 基础 | 1 | 1.5 | Swift / Kotlin 语法、生命周期、ConstraintLayout / AutoLayout |
| 2. React Native 架构与生态 | 1.5 | 2 | Bridge → JSI → Hermes、Fabric、TurboModules |
| 3. Flutter 与 Dart | 1.5 | 2.5 | Widget 三棵树、Skia、isolate、Platform Channel |
| 4. 性能、启动、原生桥、平台发布 | 1 | 3 | 启动时间、JS/Native 桥、Detox / Maestro、签名、商店审核 |
| 5. 综合项目与发布演练 | 1 | 1 | 用 RN 或 Flutter 实现并跑一次完整 CI → 签名 → 上架 |
6 周方案只跑通 RN 路线;10 周方案多出时间分别用 RN 和 Flutter 同一份业务实现一份做对比。综合项目占最后一周。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. 原生 iOS | Swift 语法、UIKit、ViewController 生命周期、AutoLayout、Xcode Debugger | 一个最小 SwiftUI / UIKit App,能真机跑起来 | 能讲清 viewDidLoad / viewWillAppear / viewDidDisappear 与 ARC |
| 2. 原生 Android | Kotlin 语法、Activity / Fragment / Compose、Gradle、Logcat | 一个最小 Jetpack Compose App,能真机跑起来 | 能讲清 onCreate / onResume / onPause 与配置变更 |
| 3. React Native 架构 | Metro / Hermes / Fabric / TurboModules / JSI / 桥模型 | 一个 RN 0.74+ 工程,跑通 Hermes 与 New Architecture | 能解释为什么 New Architecture 把 Bridge 换成 JSI + Codegen |
| 4. RN 状态与导航 | React Navigation / Zustand / Reanimated / FlashList | 一个含多页、列表、动效的 RN Demo | 能用 Reanimated 3 + worklet 写 60fps 动画 |
| 5. Flutter 与 Dart | Dart isolate / event loop、Widget / Element / RenderObject、Skia、Platform Channel | 一个 Flutter 3 工程,含 5 个自定义 Widget | 能解释为什么 Flutter 不需要 Bridge |
| 6. Flutter 状态与异步 | Riverpod / Bloc、Future / Stream、isolate compute | 一个含网络 + 缓存 + 状态管理的 Flutter Demo | 能用 isolate 把 CPU 密集任务挪出 UI 线程 |
| 7. 原生模块与桥 | RN TurboModule + Codegen、Flutter Platform Channel、Swift / Kotlin 实现 | 一个调用原生 Camera / Biometric 的跨端模块 | 能解释 JSI Promise resolve、Platform Channel MethodChannel |
| 8. 性能、启动、离线 | 启动时间拆解、JS bundle 拆分、Realm / SQLite / Drift / MMKV、Detox / Maestro | 一份性能报告 + 一份端到端测试 | 冷启动 < 1.5s、P99 帧时间 < 16ms |
| 9. 平台发布与签名 | Provisioning / Keystore、App Store Connect / Play Console、审核常见驳回、Crashlytics / Sentry | 一次 TestFlight + 一次内部测试轨道发布 | 能解释签名、Capabilities、隐私清单、审核 2.3.1 / 4.0 |
关键陷阱:把 RN / Flutter 当浏览器;忽略原生层是「最终真相来源」;忽略启动时间;用单一存储方案;忽略签名与权限;把 e2e 测试当可选。
4. 第一周任务
Day 1 约定:本计划以 macOS + Xcode 15+ / Android Studio Hedgehog+ + 真机为最小实验环境。Windows / Linux 用户用 Android 模拟器 + 远端 Mac 跑 iOS。Node ≥ 20、Dart ≥ 3.4、Java 17、Kotlin 1.9+、Swift 5.9+。所有命令记录版本、设备型号、操作系统版本和日期。
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 装 Xcode / Android Studio / Node / Dart / Flutter;用 xcodebuild -version、flutter doctor、adb devices 自检 | 环境清单、设备列表、运行约定 |
| Day 2 | 用 SwiftUI 写一个最小 iOS App:Text + Button + NavigationStack,真机跑 | iOS 工程 + 真机截图 |
| Day 3 | 用 Jetpack Compose 写一个最小 Android App:Text + Button + NavHost,真机跑 | Android 工程 + 真机截图 |
| Day 4 | 用 Swift 写一个 UITableView / UICollectionView 列表,加 viewDidLoad / viewDidAppear 生命周期日志 | iOS 列表 Demo + 生命周期时序图 |
| Day 5 | 用 Kotlin 写一个 RecyclerView + ViewModel,加 onCreate / onResume / onPause 日志 | Android 列表 Demo + 生命周期时序图 |
| Day 6 | 用 Flipper / Charles 抓 iOS / Android 真机 HTTP 请求;理解代理与 SSL Pinning | 抓包 pcap + 字段标注 |
| Day 7 | 步骤 A:跑通「最小可用原生 App」(iOS + Android 各一,含列表 + 网络 + 详情页);步骤 B:补齐 4 类边界(iOS ATS / Android cleartext、生命周期泄露、空数据列表、权限拒绝) | 双端 Demo + 边界测试记录 |
Day 7 步骤 A 只求业务完整:列表 → 详情 → 网络。步骤 B 每次只改变一个条件(关闭 ATS、旋转屏幕、空数组、拒绝定位)。
5. 阶段通用验收
- 不看答案独立重写原生 / RN / Flutter 的最小工程;
- 用自己的话解释 Bridge / JSI / Hermes / Skia / Platform Channel 各自解决什么问题;
- 画一张图:JS 线程 / Native 线程 / UI 线程的调用时序;
- 测试正常路径、生命周期异常、空数据、权限拒绝、网络 5xx 四类边界;
- 至少准备 3 组自定义数据集(用户、商品、订单任选其一)并贴出实际渲染结果;
- 记录冷启动时间、JS bundle 大小、内存峰值、P99 帧时间 4 个核心指标;
- 能修改既有 App 加原生模块、加离线缓存、加 e2e 测试,并验证差异。
6. 最终验收
- 独立画出原生 / RN / Flutter 的渲染模型对比图,能讲清 Bridge → JSI → Hermes 的演进;
- 完成至少 30 个实验:原生两端各 5 个、RN 10 个、Flutter 8 个、发布 2 个;
- 在 RN 与 Flutter 之间做出有证据的选型判断(启动 / 内存 / 团队技能 / 生态);
- 完成 1 个综合项目:跨端 Todo / 电商 Demo / IM 客户端,含原生模块、离线存储、e2e 测试与一次 TestFlight 发布;
- 能用 15 分钟讲清「为什么这个 App 选 RN / Flutter、为什么这块逻辑必须走原生桥、签名怎么管理、审核驳回怎么应对」。
7. 综合项目
首选:用 React Native(New Architecture)实现一个支持离线 Todo + 原生相机扫一扫 + Sentry 接入的 App,并跑通 TestFlight / Play 内部测试发布。
- 必输出:(1)完整工程 + New Architecture 配置证据;(2)JSI / TurboModule 调用原生相机的代码;(3)Realm / SQLite 离线同步实现;(4)Detox / Maestro e2e 测试用例 ≥ 10 条;(5)一次真机冷启动 + P99 帧时间性能报告;(6)TestFlight 邀请链接 + Play 内部测试轨道截图;
- 关键指标:冷启动 < 1.5s、列表 P99 帧时间 < 16ms、JS bundle < 5MB(拆包后)、离线写入冲突可解释;
- 进阶可选:接入 Reanimated 3 worklet、对接 Codegen 自定义 TurboModule、对接 OpenTelemetry Mobile SDK。
备选:用 Flutter 3 实现同一份需求。
备选:用 RN + Flutter 各自实现一个电商商品列表,对比启动时间、滚动帧时间、内存峰值。
备选:把一个既有原生 App 拆成 RN/Flutter 跨端壳 + 原生业务模块。
任何综合项目都必须包含:
- 需求与成功标准(启动 / 帧时间 / 包大小 / 离线可用性);
- 技术选型对比表(RN vs Flutter vs 原生);
- 跨端架构图(JS / Dart 线程、Native 线程、UI 线程);
- 关键代码(原生模块 / Platform Channel / JSI / TurboModule);
- 离线存储方案与冲突解决(Realm / SQLite / Drift / MMKV);
- e2e 测试用例 + Detox / Maestro 报告;
- 真机性能报告(启动、帧时间、内存、流量);
- 发布与签名记录 + 复盘
notes/retrospective.md。
8. 推荐开源资料
| 阶段 | 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|---|
| 1, 2 | 原生官方 | Apple Developer Documentation | https://developer.apple.com/documentation/ | UIKit / SwiftUI / Xcode 官方 |
| 1, 2 | 原生官方 | Android Developers | https://developer.apple.com/documentation/ | Jetpack Compose / Gradle / 生命周期 |
| 3, 4 | RN 官方 | React Native Documentation | https://reactnative.dev/docs/getting-started | New Architecture 主线 |
| 3, 4 | RN 进阶 | React Native New Architecture | https://github.com/reactwg/react-native-new-architecture/discussions | 架构演进讨论 |
| 5, 6 | Flutter 官方 | Flutter Documentation | https://docs.flutter.dev/ | Widget / Skia / isolate |
| 5, 6 | Flutter 进阶 | Flutter Engine source | https://github.com/flutter/engine | 渲染与引擎原理 |
| 7 | 桥与原生 | React Native TurboModules | https://reactnative.dev/docs/the-new-architecture/pure-cxx-modules | Codegen + JSI |
| 7 | 桥与原生 | Flutter Platform Channels | https://docs.flutter.dev/platform-integration/platform-channels | MethodChannel / EventChannel |
| 8 | 性能 | FlashList / RecyclerListView | Shopify / Flipkart | 大列表虚拟化 |
| 8 | 性能 | Reanimated 3 | https://docs.swmansion.com/react-native-reanimated/ | worklet 60fps 动画 |
| 8 | 测试 | Detox / Maestro | wix / mobile-dev-inc | E2E 测试 |
| 9 | 发布 | App Store Review Guidelines | https://developer.apple.com/app-store/review/gui/ | 审核红线 |
| 9 | 发布 | Play Console Launch Checklist | https://support.google.com/googleplay/android-developer/ | 上架与签名 |
默认使用顺序:先用 Apple / Android 官方文档把原生层跑一遍 → 用 RN / Flutter 官方文档建工程 → 看 New Architecture / Flutter Engine 原理 → 用 Detox / Maestro 写 e2e → 用 TestFlight / Play 内部测试跑一次真实发布 → 写复盘到
notes/retrospective.md。
9. 学习资料汇聚(v0.3 自包含)
本节由本计划生成。链接指向原始材料或作者公开内容。SDK 与框架会演进,实验记录必须写明版本与日期。
9.1 背景与动机
移动端开发在 2008 年 App Store 与 Android Market 上线后进入「原生时代」。iOS 用 Objective-C 与 Cocoa Touch,Android 用 Java 与 Dalvik/ART。两端代码无法共享,团队必须双倍投入。
2015 年 Facebook 开源 React Native,把 JavaScript 与 React 渲染模型搬上移动端,桥(Bridge)让 JS 与 Native 互调。2017 年 Google 发布 Flutter 1.0,用 Dart 与自绘 Skia 直接画像素,绕开 OEM Widget。2022 年 RN 团队把 Bridge 替换为 JSI + Hermes + Fabric + TurboModules,开启 New Architecture。2024 年 Flutter 3 把 Impeller 推到 iOS,2025 年推到 Android,绘图引擎从 Skia 转向 Impeller。
今天移动端跨平台的核心问题不再是「能不能用」,而是「如何平衡启动时间、内存、JS / Dart 与 Native 的隔离模型、团队技能与生态成熟度」。RN 偏「用 JS 调原生能力」,Flutter 偏「完全自绘、最少原生依赖」。选择哪个,决定了未来三年的工程结构。
9.2 概念地图
flowchart LR
Native[原生 iOS / Android] --> Swift[Swift / Kotlin]
Swift --> Lifecycle[生命周期 / ARC / Compose]
RN[React Native] --> Bridge[Bridge 历史]
Bridge --> JSI[JSI + Hermes]
JSI --> Fabric[Fabric 渲染]
JSI --> Turbo[TurboModules]
Turbo --> Native
Flutter --> Dart[Dart isolate]
Dart --> Widget[Widget / Element / RenderObject]
Widget --> Skia[Skia 渲染]
Skia --> Impeller[Impeller iOS / Android]
Dart --> Channel[Platform Channel]
Channel --> Native
Perf[性能 / 启动] --> Native
Perf --> RN
Perf --> Flutter
Store[离线存储] --> Realm
Store --> SQLite
Store --> Drift[Drift / sqflite]
Store --> MMKV
Test[E2E 测试] --> Detox
Test --> Maestro
Publish[平台发布] --> iOS[App Store Connect]
Publish --> Android[Play Console]
核心关系:原生层是最终真相来源;RN 通过 JSI 直接调 C++ 与原生模块;Flutter 通过 Platform Channel 调原生能力但渲染完全自绘;性能 / 启动 / 存储 / 测试 / 发布是横向兜底层,跨前 3 阶段。
9.3 基础知识讲解
9.3.1 经典论文 / 规范
| 资料 | 影响 | 建议读法 |
|---|---|---|
| Apple, The Swift Programming Language(5.9) | Swift 语法与所有权 | 与官方 SwiftUI Essentials 对照 |
| Google, Kotlin Docs(1.9+) | Kotlin 语法与协程 | 与 Jetpack Compose 文档对照 |
| Meta, React Native: A new architecture(2022) | New Architecture 设计 | 与 Hermes / Fabric 文档对照 |
| Google, Flutter Architectural Overview | Widget / Element / RenderObject 三棵树 | 与 Engine 源码对照 |
| W3C, Trace Context Level 1 | 跨进程 trace | Mobile SDK 接入时参照 |
| IETF RFC 8446, TLS 1.3 | 网络层安全 | 与 Apple ATS 对照 |
9.3.2 经典书籍
| 书 | 影响 | 用法 |
|---|---|---|
| Matt Neuburg, iOS 16 Programming Fundamentals with Swift | UIKit / Swift 主线 | 与 Apple 官方文档对照 |
| Jonathan Levin, Android Internals: A Confectioner’s Cookbook(选读) | Android 系统原理 | 进阶选读 |
| Emin Toprak, React Native in Action | RN 入门 | 与官方文档对照 |
| Jonathan Fries, Flutter in Action | Flutter 入门 | 与官方文档对照 |
| Marco Massenzio, Architecting Mobile Applications | 跨端架构 | 选读 |
| Roy Stanfield, Mobile App Engineering | 工程化视角 | 选读 |
9.3.3 优秀博客
| 资料 | 特点 | 用法 |
|---|---|---|
| SwiftUI Lab | SwiftUI 实战 | 选 5 篇对照 Apple 文档 |
| Android Developers Blog | Android 新特性 | 选 5 篇 Compose / Privacy 主题 |
| React Native Blog | RN 版本与新架构进展 | 配合 release notes 读 |
| Callstack: React Native | RN 工程实践 | 选 3 篇 New Architecture 案例 |
| Flutter Blog | Flutter 官方与社区 | 选 3 篇 Impeller / Performance 主题 |
| Sentry Blog | Mobile 错误监控 | 配合 §9.6 OpenTelemetry |
| Brendan Gregg Blog | iOS Instruments / Android Profiler 方法 | 选 2 篇 mobile 相关 |
9.3.4 核心人物
| 人物 | 主要影响 | 建议追踪的材料 |
|---|---|---|
| Jordan Walke | React Native 起源(React.js) | 2015 RN 发布演讲 |
| Bartłomiej Plewnia / Nicolas Cote | RN New Architecture 推进 | reactwg 讨论 |
| Eric Seidel | Flutter 起源与 Dart 选型 | Dart 2 公告 |
| Adam Barth | WebKit / Blink / Flutter Impeller | Chromium 历史 |
| Salman Naseer | Android Jetpack / Compose | Android Dev Summit |
| Paul Hudson | Hacking with Swift | 教程与时事 |
| Chet Haase | Android Graphics / Jetpack Compose | Chet Haase 博客与视频 |
9.3.5 开发方法
| 方法 | 具体动作 | 何时用 |
|---|---|---|
| Native-first prototype | 先用原生实现最小 Demo,再决定是否迁移 RN/Flutter | 新项目起点 |
| Same-benchmark compare | 同一份业务在 RN / Flutter 各实现一份,跑同一份测试 | 选型决策 |
| JSI for hot paths | 高频调用、序列化敏感逻辑走 JSI,UI 走 React / Widget | RN 性能调优 |
| Codegen first | TurboModule 用 TypeScript / Kotlin / Swift Spec 自动生成 | RN 原生模块接入 |
| Isolate for CPU | Dart compute / Isolate.run 把 CPU 密集挪出 UI 线程 | Flutter 计算密集任务 |
| Repository pattern for offline | 单一数据源 + Repository + Conflict Resolver | 离线同步 |
| Page Object for E2E | 用 Page Object 写 Detox / Maestro 步骤 | 端到端测试 |
| Build matrix per device | iPhone 13/15/16、Pixel 6/8、低端 Android 各跑一遍 | 性能测试 |
| Crashlytics / Sentry day-1 | 第一版就接,不等上线 | 任何 App |
9.3.6 重点训练材料
- Apple Human Interface Guidelines:理解 iOS 设计语言与 Navigation 范式。
- Material Design 3:理解 Android 设计语言与 Compose 范式。
- React Native New Architecture 仓库讨论:理解 Bridge → JSI 演进。
- Flutter Engine 源码:理解 Widget / Element / RenderObject 三棵树与 Skia / Impeller。
- App Store Review Guidelines + Play Console Policies:理解审核红线(2.3.1、4.0、隐私清单)。
- Detox 文档 + Maestro 文档:端到端测试框架对比。
9.4 经典问题与经典案例
| # | 问题 | 为什么会重要 | 最简答案或图示 |
|---|---|---|---|
| 1 | RN Bridge 为什么慢 | 异步 JSON 序列化导致掉帧 | 用 JSI + Hermes + Codegen + Fabric 替换 |
| 2 | Hermes 与 JSC 区别 | Hermes 启动更快、字节码预编译 | 0.70+ 默认 Hermes |
| 3 | Flutter 为什么不需要 Bridge | 自绘不调 OEM Widget | Skia / Impeller 直接画像素 |
| 4 | Dart isolate 与线程的区别 | isolate 不共享内存,靠消息传递 | 用 Isolate.run 跑 CPU 密集 |
| 5 | 冷启动时间怎么拆 | 决定首页白屏时长 | Native init + JS bundle 加载 + 首帧渲染 |
| 6 | 离线冲突怎么解 | 多端写入同一记录 | 时间戳 + 设备 ID + Last-Write-Wins |
| 7 | Detox vs Maestro 区别 | Detox 强 iOS、Android;Maestro 跨 UI 框架 | 看团队 iOS/Android 工程师配比 |
| 8 | ATS / cleartext 怎么开 | iOS 默认禁明文 HTTP | NSAppTransportSecurity 例外或启用 HTTPS |
| 9 | Android Keystore 怎么管 | 签名丢失 = App 无法升级 | 用 Google Play App Signing + 远端 keystore |
| 10 | App Store 审核 2.3.1 是什么 | 「App 必须自足」红线 | 不能塞隐藏开关 / 动态加载代码 |
| 11 | Privacy Manifest 是什么 | iOS 17+ 必填 | 声明 Required Reason API 使用原因 |
| 12 | Crashlytics 与 Sentry 区别 | 崩溃监控选型 | Crashlytics 集成 Firebase;Sentry 跨端 + Source Map |
| 13 | RN Reanimated worklet 怎么跑 | 把 JS 动画挪到 UI 线程 | useAnimatedStyle + 'worklet' 指令 |
| 14 | Flutter 启动页与 Splash | 首帧前后体验 | FlutterNativeSplash + Impeller warmup |
| 15 | 跨端 vs 原生团队配比 | 决定人力成本 | 双端维护:1 RN ≈ 0.6 iOS + 0.6 Android |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| RN Bridge vs JSI | 旧文档仍讲 Bridge | 用 0.74+ 工程跑 New Architecture,看 Hermes 字节码 |
| Flutter 三棵树 | Widget ≠ UI | 跑 flutter run --profile,用 DevTools 看 Element / RenderObject |
| Dart isolate 消息传递 | 习惯共享内存 | 显式传值,跨 isolate 用 SendPort |
| iOS / Android 生命周期差异 | iOS viewDidLoad vs Android onCreate | 写最小 Demo 对比日志 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 选 RN 还是 Flutter | 看团队技能与生态 | 用同一份业务做 mini Demo 对比启动 / 帧时间 |
| 把 RN / Flutter 当浏览器 | JS / Dart 线程 ≠ UI 线程 | 用 Reanimated / Impeller 把高频 UI 移出 JS / Dart |
| 离线同步模型 | Last-Write-Wins 会丢数据 | 用 CRDT 或 OT;记录冲突日志 |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| JS bundle 过大 | 冷启动慢 | 用 Hermes 字节码 + Codegen + Metro 拆包 |
| 原生模块调试 | 桥调用栈乱 | Xcode + Android Studio 双向 attach,启用 JSI Inspector |
| 真机抓包 | HTTPS 拦截复杂 | 用 Charles + SSL Proxying + ATS 例外 |
| App Store 审核驳回 | 政策更新频繁 | 关注 Apple News + 提前自查隐私清单 |
| Android 多设备碎片 | 不同 OEM 行为不一 | 用 Pixel / 三星 / 小米真机矩阵测试 |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 版本 / 文档 | 发布组织 | 状态 | 许可证 / 可访问性 |
|---|---|---|---|---|
| Swift | 5.9+ | Apple | 持续演进 | Apache-2.0(部分) |
| Kotlin | 1.9+ | JetBrains | 持续演进 | Apache-2.0 |
| React Native | 0.74+(New Architecture) | Meta + 社区 | 活跃 | MIT |
| Hermes | 0.12+ | Meta | 活跃 | MIT |
| Flutter | 3.x | 活跃 | BSD-3-Clause | |
| Dart | 3.x | 活跃 | BSD-3-Clause | |
| Skia / Impeller | 与 Flutter 同版本 | 活跃 | BSD-3-Clause | |
| Reanimated | 3.x | Software Mansion | 活跃 | MIT |
| TurboModules | RN 0.74+ | Meta | 活跃 | MIT |
| Detox | 20.x | Wix | 活跃 | MIT |
| Maestro | 1.x | mobile.dev | 活跃 | Apache-2.0 |
| Realm | 12.x | MongoDB | 活跃 | Apache-2.0 |
| SQLite / sqflite / Drift | 持续 | 社区 | 活跃 | Public Domain / MIT |
| MMKV | 2.x | Tencent | 活跃 | BSD-3-Clause |
9.6.2 Scope
- Swift / Kotlin:原生层语言,承担系统调用、生命周期、性能关键路径。
- React Native:JS 渲染 + JSI 调原生能力;UI 由 Fabric 接管。
- Flutter:自绘渲染 + Dart isolate;只通过 Platform Channel 调原生能力。
- TurboModules / Platform Channel:跨端与原生的桥,规范调用与序列化。
- Detox / Maestro:E2E 测试框架,规范 UI 自动化步骤。
- App Store Connect / Play Console:发布与审核入口,签名与隐私清单集中地。
9.6.3 Structure
- RN 工程结构:
android/+ios/+src/(JS / TS)+metro.config.js。 - Flutter 工程结构:
lib/+android/+ios/+pubspec.yaml。 - 必会接口:TurboModule Codegen Spec(TS / Swift / Kotlin)、MethodChannel / EventChannel、Reanimated worklet、Flutter
compute/Isolate.run、Detoxby.id/ MaestrotapOn。 - 必会命令:
xcodebuild、gradlew assembleDebug、adb install、fastlane match、eas build、flutter build。
9.6.4 Ecosystem
- 原生工具:Xcode、Android Studio、Instruments、Android Profiler、Layout Inspector。
- RN 生态:Expo、React Navigation、Reanimated、FlashList、Zustand、MMKV、Sentry、CodePush。
- Flutter 生态:FlutterFire、Flutter Packages、Riverpod / Bloc、Drift、go_router、Flutter Hooks、Sentry。
- 跨端 CI:Fastlane、EAS Build、Bitrise、Codemagic。
- 监控:Sentry、Firebase Crashlytics、Datadog Mobile RUM、OpenTelemetry Mobile SDK。
- 测试:Detox、Maestro、XCTest、Espresso、JUnit、Flutter test、Patrol。
9.6.5 Depth Tiers
| 层级 | 能力 | 移动端跨平台主题的可观察标准 |
|---|---|---|
| L0 | 知道存在 | 知道 RN / Flutter / 原生各自解决什么问题 |
| L1 | 看得懂示例 | 能读懂工程结构、TurboModule Spec、Platform Channel |
| L2 | 能正确调用 | 能用 RN 或 Flutter 实现 App 并调原生模块 |
| L3 | 能解释与排错 | 能从 JSI / isolate / 渲染时序解释卡顿,能用 e2e 定位回归 |
| L4 | 能设计与扩展 | 能为业务做技术选型、设计 TurboModule Spec、设计离线同步协议、设计发布流水线 |
本计划目标:L3。综合项目可触及局部 L4,但不作为 6~10 周的硬门槛。
9.6.6 Source
- Apple Developer Documentation
- Android Developers
- React Native Documentation
- Flutter Documentation
- React Native New Architecture discussions
- Flutter Engine source
- App Store Review Gui
- Play Console Policies
- 引用版本快照日期:2026-07-30。规范与 SDK 会演进,使用前再核对当前版本。
10. 常见误区
- 把 RN / Flutter 当浏览器,忽略原生层线程模型;
- 在 RN 旧文档上花时间学 Bridge,忽略 New Architecture;
- 在 Flutter 上习惯共享内存,忽略 isolate 消息传递;
- 启动时间只看 JS bundle 大小,忽略 Native init + 首帧渲染;
- 离线存储只考虑写入,不考虑冲突解决;
- Detox / Maestro 写完不接 CI;
- 用 long-lived Keystore 提交 Play,丢失后无法升级;
- iOS Privacy Manifest 不填,审核被驳回;
- 用 Crashlytics / Sentry 当监控就够了,不接 APM;
- 把 React Native Reanimated 当普通 JS 动画;
- 把 Flutter 当「Java 写 UI」思维,写同步阻塞代码;
- 综合项目只跑模拟器,不上真机;
- 学完不复盘,下次跨端选型依然拍脑袋。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
- 安全与可靠性
本计划归属:前端与客户端 主 + 工程技术 辅。