モバイルアプリケーションにおけるクロスプラットフォーム開発:概要、フレームワーク、仕組み

著者: IT Sectr 公開日: 2026-06-06 読了時間: 9 分

クロスプラットフォーム開発は、モバイルエンジニアリングの中で最もダイナミックに進化している分野の1つです。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はより新しく、高速で、古いデバイスでのジャンク問題を解決します。

クロスプラットフォーム開発:Flutter Platform ChannelとMethod Channel

Flutterは、単一のDartコードベースからネイティブアプリケーションを作成するためのGoogleのフレームワークです。プラットフォームコード(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(Foreign Function Interface) — プラットフォームチャネルなしでDartからC関数を直接呼び出します。FFIはMethod Channelよりも高速です(シリアル化オーバーヘッド0)。パフォーマンス重視の操作(オーディオ処理、暗号化、グラフィックスエンジン)に使用されます。SkiaはFlutterのレンダリングエンジン(2Dグラフィックス)です。ImpellerはSkiaに代わるFlutterの新しいレンダリングエンジンです。Impellerはシェーダーを事前にコンパイルし、最初の起動時のジャンク(フレームの停止)を解消します。IT Sectrでは2025年にImpellerに移行しました — アニメーションの滑らかさの違いはすぐにわかります。

React Nativeを使用したクロスプラットフォーム開発:Bridge、Fabric、Hermes、JSI

React Nativeは、JavaScript/TypeScriptでクロスプラットフォームモバイルアプリ開発を行うためのMetaのフレームワークです。React NativeはコンポーネントをネイティブUI要素にレンダリングします。アーキテクチャは進化してきました:古いBridge → JSIを備えた新しいFabric。

FabricとBridgeの比較

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とCodegen

Hermesは、React Native用に最適化されたMetaのJavaScriptエンジンです。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)は、AndroidとiOS間でコードを共有するためのJetBrainsのテクノロジーです。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 — WebおよびReact Nativeプロジェクト向けにKotlinをJavaScriptにコンパイルします。

ビルドツール:Gradle KTS、CocoaPods Plugin、XCFramework

クロスプラットフォームモバイルアプリ開発のビルドツール — コードと最終バイナリの間のブリッジ。Gradle KTSはAndroid部分を管理し、CocoaPods PluginはKMPのiOS依存関係を管理し、XCFrameworkはネイティブライブラリの配布を管理します。

Gradle KTS

Gradle KTS — Groovyの代わりにKotlin DSLを使用したGradle構成。KTSはAndroid Studioでの自動補完、型チェック、リファクタリングの安全性をサポートします。例:apply plugin: 'com.android.application'の代わりにplugins { id("com.android.application") }。すべての新規プロジェクトに推奨されます。

CocoaPods PluginとXCFramework

CocoaPods Plugin — 共有モジュールをCocoaPods podとして公開するKMP用のGradleプラグイン。iOS開発者はPodfileを介して追加します。XCFramework — Appleのバイナリライブラリ配布形式。XCFrameworkには、複数のアーキテクチャ(arm64、x86_64)とプラットフォーム(iOS、macOS、watchOS)のバイナリが含まれています。KMPでは、共有モジュールがiOS用のXCFrameworkとしてエクスポートされます。

よくある質問

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は、React Native用に最適化されたMetaのJavaScriptエンジンです。ビルド時に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バイナリを配布するため。
  • フレームワークの選択:統一されたUIにはFlutter、JSを使用したネイティブUIにはReact Native、ネイティブUIとビジネスロジックを共有するにはKMP。
  • クロスプラットフォームモバイルアプリ開発技術を選択する際は、パフォーマンス要件とチームサイズを考慮してください。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談