CalcGuide · 技术博客主页 / 一页纸学习计划
🟠

移动端跨平台开发:从原生 iOS/Android 到 React Native / Flutter 与原生桥

分类:前端与客户端 · 路径:docs/topics/mobile-cross-platform/README.md

#mobile#react-native#flutter#ios#android#cross-platform

用 6~10 周从原生 iOS/Android 入门到能独立构建跨平台 RN/Flutter 应用并理解原生桥

父主题

顶层主题

子主题(4)

移动端跨平台开发:从原生 iOS/Android 到 React Native / Flutter 与原生桥

0. 元信息

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 基础11.5Swift / Kotlin 语法、生命周期、ConstraintLayout / AutoLayout
2. React Native 架构与生态1.52Bridge → JSI → Hermes、Fabric、TurboModules
3. Flutter 与 Dart1.52.5Widget 三棵树、Skia、isolate、Platform Channel
4. 性能、启动、原生桥、平台发布13启动时间、JS/Native 桥、Detox / Maestro、签名、商店审核
5. 综合项目与发布演练11用 RN 或 Flutter 实现并跑一次完整 CI → 签名 → 上架

6 周方案只跑通 RN 路线;10 周方案多出时间分别用 RN 和 Flutter 同一份业务实现一份做对比。综合项目占最后一周。

3. 九阶段表

阶段核心知识实践产出可观察学会标准
1. 原生 iOSSwift 语法、UIKit、ViewController 生命周期、AutoLayout、Xcode Debugger一个最小 SwiftUI / UIKit App,能真机跑起来能讲清 viewDidLoad / viewWillAppear / viewDidDisappear 与 ARC
2. 原生 AndroidKotlin 语法、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 与 DartDart 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 -versionflutter doctoradb 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. 阶段通用验收

  1. 不看答案独立重写原生 / RN / Flutter 的最小工程;
  2. 用自己的话解释 Bridge / JSI / Hermes / Skia / Platform Channel 各自解决什么问题;
  3. 画一张图:JS 线程 / Native 线程 / UI 线程的调用时序;
  4. 测试正常路径、生命周期异常、空数据、权限拒绝、网络 5xx 四类边界;
  5. 至少准备 3 组自定义数据集(用户、商品、订单任选其一)并贴出实际渲染结果;
  6. 记录冷启动时间、JS bundle 大小、内存峰值、P99 帧时间 4 个核心指标;
  7. 能修改既有 App 加原生模块、加离线缓存、加 e2e 测试,并验证差异。

6. 最终验收

7. 综合项目

首选:用 React Native(New Architecture)实现一个支持离线 Todo + 原生相机扫一扫 + Sentry 接入的 App,并跑通 TestFlight / Play 内部测试发布。

备选:用 Flutter 3 实现同一份需求。
备选:用 RN + Flutter 各自实现一个电商商品列表,对比启动时间、滚动帧时间、内存峰值。
备选:把一个既有原生 App 拆成 RN/Flutter 跨端壳 + 原生业务模块。

任何综合项目都必须包含:

  1. 需求与成功标准(启动 / 帧时间 / 包大小 / 离线可用性);
  2. 技术选型对比表(RN vs Flutter vs 原生);
  3. 跨端架构图(JS / Dart 线程、Native 线程、UI 线程);
  4. 关键代码(原生模块 / Platform Channel / JSI / TurboModule);
  5. 离线存储方案与冲突解决(Realm / SQLite / Drift / MMKV);
  6. e2e 测试用例 + Detox / Maestro 报告;
  7. 真机性能报告(启动、帧时间、内存、流量);
  8. 发布与签名记录 + 复盘 notes/retrospective.md

8. 推荐开源资料

阶段角色资料链接用法
1, 2原生官方Apple Developer Documentationhttps://developer.apple.com/documentation/UIKit / SwiftUI / Xcode 官方
1, 2原生官方Android Developershttps://developer.apple.com/documentation/Jetpack Compose / Gradle / 生命周期
3, 4RN 官方React Native Documentationhttps://reactnative.dev/docs/getting-startedNew Architecture 主线
3, 4RN 进阶React Native New Architecturehttps://github.com/reactwg/react-native-new-architecture/discussions架构演进讨论
5, 6Flutter 官方Flutter Documentationhttps://docs.flutter.dev/Widget / Skia / isolate
5, 6Flutter 进阶Flutter Engine sourcehttps://github.com/flutter/engine渲染与引擎原理
7桥与原生React Native TurboModuleshttps://reactnative.dev/docs/the-new-architecture/pure-cxx-modulesCodegen + JSI
7桥与原生Flutter Platform Channelshttps://docs.flutter.dev/platform-integration/platform-channelsMethodChannel / EventChannel
8性能FlashList / RecyclerListViewShopify / Flipkart大列表虚拟化
8性能Reanimated 3https://docs.swmansion.com/react-native-reanimated/worklet 60fps 动画
8测试Detox / Maestrowix / mobile-dev-incE2E 测试
9发布App Store Review Guidelineshttps://developer.apple.com/app-store/review/gui/审核红线
9发布Play Console Launch Checklisthttps://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 OverviewWidget / Element / RenderObject 三棵树与 Engine 源码对照
W3C, Trace Context Level 1跨进程 traceMobile SDK 接入时参照
IETF RFC 8446, TLS 1.3网络层安全与 Apple ATS 对照

9.3.2 经典书籍

影响用法
Matt Neuburg, iOS 16 Programming Fundamentals with SwiftUIKit / Swift 主线与 Apple 官方文档对照
Jonathan Levin, Android Internals: A Confectioner’s Cookbook(选读)Android 系统原理进阶选读
Emin Toprak, React Native in ActionRN 入门与官方文档对照
Jonathan Fries, Flutter in ActionFlutter 入门与官方文档对照
Marco Massenzio, Architecting Mobile Applications跨端架构选读
Roy Stanfield, Mobile App Engineering工程化视角选读

9.3.3 优秀博客

资料特点用法
SwiftUI LabSwiftUI 实战选 5 篇对照 Apple 文档
Android Developers BlogAndroid 新特性选 5 篇 Compose / Privacy 主题
React Native BlogRN 版本与新架构进展配合 release notes 读
Callstack: React NativeRN 工程实践选 3 篇 New Architecture 案例
Flutter BlogFlutter 官方与社区选 3 篇 Impeller / Performance 主题
Sentry BlogMobile 错误监控配合 §9.6 OpenTelemetry
Brendan Gregg BlogiOS Instruments / Android Profiler 方法选 2 篇 mobile 相关

9.3.4 核心人物

人物主要影响建议追踪的材料
Jordan WalkeReact Native 起源(React.js)2015 RN 发布演讲
Bartłomiej Plewnia / Nicolas CoteRN New Architecture 推进reactwg 讨论
Eric SeidelFlutter 起源与 Dart 选型Dart 2 公告
Adam BarthWebKit / Blink / Flutter ImpellerChromium 历史
Salman NaseerAndroid Jetpack / ComposeAndroid Dev Summit
Paul HudsonHacking with Swift教程与时事
Chet HaaseAndroid Graphics / Jetpack ComposeChet Haase 博客与视频

9.3.5 开发方法

方法具体动作何时用
Native-first prototype先用原生实现最小 Demo,再决定是否迁移 RN/Flutter新项目起点
Same-benchmark compare同一份业务在 RN / Flutter 各实现一份,跑同一份测试选型决策
JSI for hot paths高频调用、序列化敏感逻辑走 JSI,UI 走 React / WidgetRN 性能调优
Codegen firstTurboModule 用 TypeScript / Kotlin / Swift Spec 自动生成RN 原生模块接入
Isolate for CPUDart compute / Isolate.run 把 CPU 密集挪出 UI 线程Flutter 计算密集任务
Repository pattern for offline单一数据源 + Repository + Conflict Resolver离线同步
Page Object for E2E用 Page Object 写 Detox / Maestro 步骤端到端测试
Build matrix per deviceiPhone 13/15/16、Pixel 6/8、低端 Android 各跑一遍性能测试
Crashlytics / Sentry day-1第一版就接,不等上线任何 App

9.3.6 重点训练材料

9.4 经典问题与经典案例

#问题为什么会重要最简答案或图示
1RN Bridge 为什么慢异步 JSON 序列化导致掉帧用 JSI + Hermes + Codegen + Fabric 替换
2Hermes 与 JSC 区别Hermes 启动更快、字节码预编译0.70+ 默认 Hermes
3Flutter 为什么不需要 Bridge自绘不调 OEM WidgetSkia / Impeller 直接画像素
4Dart isolate 与线程的区别isolate 不共享内存,靠消息传递Isolate.run 跑 CPU 密集
5冷启动时间怎么拆决定首页白屏时长Native init + JS bundle 加载 + 首帧渲染
6离线冲突怎么解多端写入同一记录时间戳 + 设备 ID + Last-Write-Wins
7Detox vs Maestro 区别Detox 强 iOS、Android;Maestro 跨 UI 框架看团队 iOS/Android 工程师配比
8ATS / cleartext 怎么开iOS 默认禁明文 HTTPNSAppTransportSecurity 例外或启用 HTTPS
9Android Keystore 怎么管签名丢失 = App 无法升级用 Google Play App Signing + 远端 keystore
10App Store 审核 2.3.1 是什么「App 必须自足」红线不能塞隐藏开关 / 动态加载代码
11Privacy Manifest 是什么iOS 17+ 必填声明 Required Reason API 使用原因
12Crashlytics 与 Sentry 区别崩溃监控选型Crashlytics 集成 Firebase;Sentry 跨端 + Source Map
13RN Reanimated worklet 怎么跑把 JS 动画挪到 UI 线程useAnimatedStyle + 'worklet' 指令
14Flutter 启动页与 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 ≠ UIflutter 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

名称版本 / 文档发布组织状态许可证 / 可访问性
Swift5.9+Apple持续演进Apache-2.0(部分)
Kotlin1.9+JetBrains持续演进Apache-2.0
React Native0.74+(New Architecture)Meta + 社区活跃MIT
Hermes0.12+Meta活跃MIT
Flutter3.xGoogle活跃BSD-3-Clause
Dart3.xGoogle活跃BSD-3-Clause
Skia / Impeller与 Flutter 同版本Google活跃BSD-3-Clause
Reanimated3.xSoftware Mansion活跃MIT
TurboModulesRN 0.74+Meta活跃MIT
Detox20.xWix活跃MIT
Maestro1.xmobile.dev活跃Apache-2.0
Realm12.xMongoDB活跃Apache-2.0
SQLite / sqflite / Drift持续社区活跃Public Domain / MIT
MMKV2.xTencent活跃BSD-3-Clause

9.6.2 Scope

9.6.3 Structure

9.6.4 Ecosystem

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

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础
  4. 工程技术
  5. Web 与后端
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力
  9. 安全与可靠性

本计划归属:前端与客户端 主 + 工程技术 辅。


直接依赖(2)

查看知识图谱