移动应用中的跨平台开发:定义、框架及工作原理

作者: IT Sectr 发布日期: 2026-06-06 阅读时间: 9 分钟

跨平台开发是移动工程中发展最活跃的领域之一。根据Statista(2025)的数据,42%的移动开发者在项目中使用Flutter或React Native。平台通道、桥接和原生模块是跨平台架构的基础。

要点

  • Flutter使用Platform Channel(MethodChannel)与原生代码通信。消息被序列化为二进制格式并异步传输。
  • React Native使用Bridge(旧架构)和Fabric(新架构)。Fabric使用JSI进行同步原生函数调用。
  • Kotlin Multiplatform使用expect/actual——声明和平台实现。Kotlin/Native将代码直接编译为iOS二进制文件。
  • 构建工具用于跨平台开发:Gradle KTS(适用于Gradle的Kotlin DSL)、CocoaPods Plugin(iOS依赖管理)、XCFramework(原生库分发)。
  • Skia(Flutter)和Impeller——渲染引擎。Impeller更新、更快,解决了旧设备上的jank问题。

跨平台开发:Flutter Platform Channel和Method Channel

Flutter是Google的框架,用于从单一Dart代码库创建原生应用程序。为了与平台代码(Kotlin、Swift)交互,Flutter使用Platform Channel。这是一个桥接,Dart代码通过它调用原生函数并获取结果。使用Flutter进行跨平台移动应用开发是2025-2026年移动开发中增长最快的领域。

Platform Channel(Method Channel)

Method Channel是Flutter与原生之间的主要通信通道。在Dart端:MethodChannel('com.example/channel').invokeMethod('getBatteryLevel')。消息使用StandardMethodCodec(二进制)编码。在原生端,注册MethodChannel并处理调用。MethodChannel是异步的——结果通过Future返回。替代方案:EventChannel用于事件流。

BasicMessageChannel是较低级别的通道,用于在没有"方法-参数"结构的情况下发送字符串/字节。用于自定义协议。所有Platform Channel API都通过Flutter Engine,它对消息进行序列化/反序列化。

FFI、Skia和Impeller

dart:ffi(外部函数接口)——无需平台通道即可从Dart直接调用C函数。FFI比Method Channel更快(零序列化开销)。用于性能密集型操作:音频处理、加密、图形引擎。Skia是Flutter的渲染引擎(2D图形)。Impeller是Flutter的新渲染引擎,取代Skia。Impeller提前编译着色器(Ahead-of-Time),消除了首次启动时的jank(帧卡顿)。在IT Sectr,我们于2025年切换到Impeller——动画流畅度的差异立竿见影。

使用React Native进行跨平台开发:Bridge、Fabric、Hermes、JSI

React Native是Meta的框架,用于使用JavaScript/TypeScript进行跨平台移动应用开发。React Native将组件渲染为原生UI元素。架构经历了演进:旧版Bridge→带有JSI的新版Fabric。

Fabric vs Bridge

Bridge是旧的React Native架构。JS线程将消息序列化为JSON,并通过异步队列发送到原生线程。这会产生延迟(桥往返约1毫秒)。Fabric是新架构,JS和原生UI线程通过JSI(JavaScript接口)同步通信。Fabric直接注入原生视图,无需桥接。Fabric是跨平台开发中的重要里程碑,可将渲染速度提升2倍。

JSI(JavaScript接口)是一个C++ API,允许JavaScript直接调用原生函数并共享内存。JSI取代了Bridge的JSON序列化。基于JSI的新架构是跨平台开发的关键成就,决定了移动应用的性能。Turbo Module是为React Native编写原生模块的新方式。与旧的Native Modules不同,Turbo Module延迟加载并使用JSI。

Hermes和Codegen

Hermes是Meta的JavaScript引擎,针对React Native进行了优化。Hermes在构建时将JS代码编译为字节码,加速移动应用启动,并减少跨平台开发中的内存消耗。Codegen是基于TypeScript类型的原生代码生成器。Codegen自动创建原生模块和JSI绑定,减少手工工作。

参数 Flutter React Native KMP
语言DartJavaScript/TypeScriptKotlin
架构Skia/Impeller(自定义渲染)Fabric + JSI(原生UI)原生SDK(每个模块)
原生桥MethodChannel(Dart ↔ 原生)JSI(JS ↔ C++ ↔ 原生)expect/actual(Kotlin ↔ 原生)
UI自定义(Skia/Impeller)原生组件(UIKit/Android Views)原生UI(Jetpack Compose、SwiftUI)
渲染引擎Skia或Impeller原生(UIView/View)原生

Flutter通过Skia/Impeller自行渲染所有内容——这为两个平台提供了统一的UI。React Native使用原生UI组件——看起来像原生应用。KMP不处理UI——它只共享业务逻辑,UI保持原生。选择取决于优先级:统一UI(Flutter)还是最大原生性(React Native/KMP)。

使用Kotlin Multiplatform进行跨平台开发:expect/actual、Kotlin/Native

Kotlin Multiplatform(KMP)是JetBrains的技术,用于在Android和iOS之间共享代码。与Flutter和React Native不同,KMP是跨平台开发的替代方法:它不替换UI,而是共享业务逻辑、网络请求、数据模型和存储库。UI保持原生:Android使用Jetpack Compose,iOS使用SwiftUI。

expect/actual

expect——在公共模块(commonMain)中声明具有平台实现的函数或类。使用KMP进行跨平台开发使用expect/actual:actual是每个平台(androidMain、iosMain)的具体实现。例如:expect fun getDeviceId(): String——在Android上,actual使用Settings.Secure,在iOS上——UIDevice.current.identifierForVendor。

Kotlin/Native

Kotlin/Native——将Kotlin编译为原生二进制文件(iOS框架)的编译器。它允许在没有JVM的情况下在iOS上运行Kotlin代码。Kotlin/Native使用LLVM进行编译,提供接近Swift的性能。Kotlin/JS——将Kotlin编译为JavaScript,用于Web和React Native项目。

构建工具:Gradle KTS、CocoaPods Plugin、XCFramework

跨平台移动应用开发的构建工具——代码与最终二进制文件之间的桥梁。Gradle KTS管理Android部分,CocoaPods Plugin管理KMP iOS依赖项,XCFramework管理原生库分发。

Gradle KTS

Gradle KTS——使用Kotlin DSL代替Groovy的Gradle配置。KTS支持Android Studio中的自动完成、类型检查和重构安全性。示例:plugins { id("com.android.application") }代替apply plugin: 'com.android.application'。建议用于所有新项目。

CocoaPods Plugin和XCFramework

CocoaPods Plugin——用于KMP的Gradle插件,将共享模块发布为CocoaPods pod。iOS开发者通过Podfile添加它。XCFramework——Apple的二进制库分发格式。XCFramework包含多个架构(arm64、x86_64)和平台(iOS、macOS、watchOS)的二进制文件。在KMP中,共享模块作为XCFramework导出到iOS。

常见问题

2026年选择Flutter还是React Native?

Flutter提供更好的性能(Skia/Impeller)、统一的UI代码库和跨平台开发中的高稳定性。React Native——庞大的社区,从Web开发轻松过渡,以及通过JSI实现的灵活性。IT Sectr建议以UI为中心的项目使用Flutter,如果项目需要频繁的原生代码,则使用React Native。

Flutter如何通过Platform Channel与原生代码通信?

Flutter在Dart端通过MethodChannel发送消息。消息被编码为二进制格式并传输到原生端(Kotlin/Swift),在那里进行处理并返回结果。移动应用开发中的所有通信都是异步的。

Kotlin Multiplatform中的expect/actual是什么?

expect是公共代码中具有平台实现的函数或类的声明。actual是每个平台(Android/iOS)的具体实现。这是KMP用于条件编译(无需预处理器)的机制。

React Native中Fabric和Bridge有什么区别?

Bridge是旧架构,消息被序列化为JSON并通过队列异步传输。Fabric是新架构,通过JSI进行同步原生函数调用,消除了延迟并提高了移动应用性能。

什么是Hermes?为什么React Native需要它?

Hermes是Meta的JavaScript引擎,针对React Native进行了优化。它在构建时将JS编译为字节码,使应用启动速度提高2-3倍,并减少内存消耗。

总结

  • Flutter使用Platform Channel(MethodChannel)与原生代码通信。FFI——用于无开销地直接调用C函数。
  • React Native已从Bridge过渡到Fabric + JSI。JSI允许同步原生函数调用,消除桥接延迟。
  • Kotlin Multiplatform对平台代码使用expect/actual。Kotlin/Native将公共代码编译为原生iOS框架。
  • 跨平台移动应用开发:Flutter使用Skia/Impeller,React Native使用JSI/Fabric,KMP使用expect/actual处理原生代码。
  • Hermes——React Native的JS引擎。加快启动速度并减少内存消耗。
  • Gradle KTS——适用于Gradle的Kotlin DSL。CocoaPods Plugin和XCFramework——用于在跨平台开发中分发iOS二进制文件。
  • 框架选择:Flutter用于统一UI,React Native用于带JS的原生UI,KMP用于与原生UI共享业务逻辑。
  • 选择跨平台移动应用开发技术时,请考虑性能要求和团队规模。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目