クロスプラットフォーム開発は、モバイルエンジニアリングの中で最もダイナミックに進化している分野の1つです。Statista(2025年)によると、モバイル開発者の42%がFlutterまたはReact Nativeをプロジェクトで使用しています。プラットフォームチャネル、ブリッジ、ネイティブモジュールがクロスプラットフォームアーキテクチャの基盤です。
重要なポイント
Flutterは、単一のDartコードベースからネイティブアプリケーションを作成するためのGoogleのフレームワークです。プラットフォームコード(Kotlin、Swift)と相互作用するために、FlutterはPlatform Channelを使用します。これは、Dartコードがネイティブ関数を呼び出して結果を取得するためのブリッジです。Flutterを使用したクロスプラットフォームモバイルアプリ開発は、2025〜2026年のモバイル開発で最も急速に成長しているセグメントです。
Method Channelは、Flutterとネイティブ間の主要な通信チャネルです。Dart側:MethodChannel('com.example/channel').invokeMethod('getBatteryLevel')。メッセージはStandardMethodCodec(バイナリ)でエンコードされます。ネイティブ側ではMethodChannelが登録され、呼び出しを処理します。MethodChannelは非同期で、結果はFutureを介して返されます。代替:EventChannel(イベントストリーム用)。
BasicMessageChannelは、「メソッド-引数」構造なしで文字列/バイトを送信するための低レベルチャネルです。カスタムプロトコルに使用されます。すべてのPlatform Channel APIはFlutter Engineを通過し、メッセージをシリアル化/デシリアル化します。
dart:ffi(Foreign Function Interface) — プラットフォームチャネルなしでDartからC関数を直接呼び出します。FFIはMethod Channelよりも高速です(シリアル化オーバーヘッド0)。パフォーマンス重視の操作(オーディオ処理、暗号化、グラフィックスエンジン)に使用されます。SkiaはFlutterのレンダリングエンジン(2Dグラフィックス)です。ImpellerはSkiaに代わるFlutterの新しいレンダリングエンジンです。Impellerはシェーダーを事前にコンパイルし、最初の起動時のジャンク(フレームの停止)を解消します。IT Sectrでは2025年にImpellerに移行しました — アニメーションの滑らかさの違いはすぐにわかります。
React Nativeは、JavaScript/TypeScriptでクロスプラットフォームモバイルアプリ開発を行うためのMetaのフレームワークです。React NativeはコンポーネントをネイティブUI要素にレンダリングします。アーキテクチャは進化してきました:古いBridge → JSIを備えた新しいFabric。
Bridgeは古いReact Nativeアーキテクチャです。JSスレッドはメッセージをJSONにシリアル化し、非同期キューを介してネイティブスレッドに送信します。これにより遅延が発生します(ブリッジのラウンドトリップ約1ms)。Fabricは、JSスレッドとネイティブUIスレッドがJSI(JavaScript Interface)を介して同期的に通信する新しいアーキテクチャです。Fabricはブリッジなしでネイティブビューを直接注入します。Fabricはクロスプラットフォーム開発における重要なマイルストーンであり、レンダリングを最大2倍高速化します。
JSI(JavaScript Interface)は、JavaScriptがネイティブ関数を直接呼び出し、メモリを共有できるようにするC++ APIです。JSIはBridgeのJSONシリアル化を置き換えました。JSIベースの新しいアーキテクチャは、クロスプラットフォーム開発における重要な成果であり、モバイルアプリのパフォーマンスを決定します。Turbo Moduleは、React Native用のネイティブモジュールを作成する新しい方法です。古いNative Modulesとは異なり、Turbo Moduleは遅延ロードされ、JSIを使用します。
Hermesは、React Native用に最適化されたMetaのJavaScriptエンジンです。Hermesはビルド時にJSコードをバイトコードにコンパイルし、モバイルアプリの起動を高速化し、クロスプラットフォーム開発におけるメモリ消費を削減します。Codegenは、TypeScriptタイプに基づくネイティブコードジェネレーターです。CodegenはネイティブモジュールとJSIバインディングを自動的に作成し、手作業を削減します。
| パラメータ | Flutter | React Native | KMP |
|---|---|---|---|
| 言語 | Dart | JavaScript/TypeScript | Kotlin |
| アーキテクチャ | 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(KMP)は、AndroidとiOS間でコードを共有するためのJetBrainsのテクノロジーです。FlutterやReact Nativeとは異なり、KMPはクロスプラットフォーム開発への代替アプローチです:UIを置き換えるのではなく、ビジネスロジック、ネットワークリクエスト、データモデル、リポジトリを共有します。UIはネイティブのままです:AndroidにはJetpack Compose、iOSにはSwiftUI。
expect — プラットフォーム実装を持つ共通モジュール(commonMain)内の関数またはクラスの宣言。KMPを使用したクロスプラットフォーム開発ではexpect/actualを使用します:actualは各プラットフォーム(androidMain、iosMain)の具体的な実装です。例:expect fun getDeviceId(): String — AndroidのactualはSettings.Secureを使用し、iOSではUIDevice.current.identifierForVendorを使用します。
Kotlin/Native — Kotlinをネイティブバイナリ(iOSフレームワーク)にコンパイルするコンパイラ。JVMなしでiOS上でKotlinコードを実行できます。Kotlin/NativeはコンパイルにLLVMを使用し、Swiftに近いパフォーマンスを提供します。Kotlin/JS — WebおよびReact Nativeプロジェクト向けにKotlinをJavaScriptにコンパイルします。
クロスプラットフォームモバイルアプリ開発のビルドツール — コードと最終バイナリの間のブリッジ。Gradle KTSはAndroid部分を管理し、CocoaPods PluginはKMPのiOS依存関係を管理し、XCFrameworkはネイティブライブラリの配布を管理します。
Gradle KTS — Groovyの代わりにKotlin DSLを使用したGradle構成。KTSはAndroid Studioでの自動補完、型チェック、リファクタリングの安全性をサポートします。例:apply plugin: 'com.android.application'の代わりにplugins { id("com.android.application") }。すべての新規プロジェクトに推奨されます。
CocoaPods Plugin — 共有モジュールをCocoaPods podとして公開するKMP用のGradleプラグイン。iOS開発者はPodfileを介して追加します。XCFramework — Appleのバイナリライブラリ配布形式。XCFrameworkには、複数のアーキテクチャ(arm64、x86_64)とプラットフォーム(iOS、macOS、watchOS)のバイナリが含まれています。KMPでは、共有モジュールがiOS用のXCFrameworkとしてエクスポートされます。
よくある質問
Flutterは優れたパフォーマンス(Skia/Impeller)、単一のUIコードベース、クロスプラットフォーム開発における高い安定性を提供します。React Native — 巨大なコミュニティ、Web開発からの容易な移行、JSIによる柔軟性。IT SectrはUI中心のプロジェクトにはFlutter、頻繁なネイティブコードが必要なプロジェクトにはReact Nativeを推奨します。
FlutterはDart側でMethodChannelを介してメッセージを送信します。メッセージはバイナリ形式にエンコードされ、ネイティブ側(Kotlin/Swift)に送信され、そこで処理されて結果が返されます。モバイルアプリ開発におけるすべての通信は非同期です。
expectは、プラットフォーム実装を持つ共通コード内の関数またはクラスの宣言です。actualは各プラットフォーム(Android/iOS)の具体的な実装です。これは、プリプロセッサなしで条件付きコンパイルを行うKMPのメカニズムです。
Bridgeは、メッセージがJSONにシリアル化され、キューを介して非同期的に送信される古いアーキテクチャです。FabricはJSIを介した同期的なネイティブ関数呼び出しを備えた新しいアーキテクチャであり、遅延を排除し、モバイルアプリのパフォーマンスを向上させます。
Hermesは、React Native用に最適化されたMetaのJavaScriptエンジンです。ビルド時にJSをバイトコードにコンパイルし、アプリの起動を2〜3倍高速化し、メモリ消費を削減します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。