2026 年の KMP: Kotlin マルチプラットフォームのアーキテクチャ、確立、エコシステム
何年もの間、Kotlin マルチプラットフォーム (KMP) は「興味深いが、まだ準備ができていない」というレッテルを貼られてきました。 制作」。 2026 年、この物語は決定的に変わりました。KMP は成熟に達しました。 安定した iOS API を備えたエンタープライズ、すべての主要プラットフォームで安定した Compose Multiplatform、 e 迅速なエクスポート これにより、最終的に Objective-C ブリッジングが不要になります。 ネイティブ Swift コードとの相互運用性。
このガイドでは、2026 年の KMP エコシステムの包括的な概要を説明します。それ以降、何が変わったのかを説明します。 過去数年との比較、Flutter や React Native との比較、正しいアーキテクチャは何か クロスプラットフォーム プロジェクトの場合と、KMP がユースケースにとって正しい選択かどうかを評価する方法について説明します。
何を学ぶか
- KMP アーキテクチャ: 共有モジュール、ソース セット、プラットフォーム固有のコード
- KMP vs Flutter vs React Native: 技術比較を 2026 年に更新
- Swift エクスポートと iOS とのネイティブ相互運用性
- Compose Multiplatform: 現状と制限事項
- KMP 2026 ライブラリ エコシステム: Ktor、SQLDelight、Koin
- KMP を選択する場合と選択しない場合
2025 ~ 2026 年の品質の飛躍的向上
KMP 1.0 はビジネス ロジックの共有に関してはすでに安定していましたが、次のような重要な制限がありました。 iOS 統合には、自動的に生成された Objective-C ヘッダーが必要でした (あまり慣用的ではありません) Swift 開発者)、Compose Multiplatform にはまだ iOS とデスクトップ上でアルファ版の API が多数ありました。
2024 年から 2026 年の間に起こった主な変化:
- Swift エクスポート (KMP 1.9 以降で安定): ネーミングを付けてネイティブ Swift API を生成する 慣用的、プロトコル、デフォルト引数、そして中間の Objective-C はありません。開発者 iOS は、純粋な Swift であるかのように Kotlin コードを使用するようになりました。
- Compose マルチプラットフォーム 1.7 以降 (iOS では安定): 完全に共有された UI Android、iOS、デスクトップ (JVM)、Web (Wasm) 上の Kotlin/Compose。プラットフォーム固有のレンダリング エンジン 現在では成熟しており、複雑なアプリでもパフォーマンスが許容できるレベルになっています。
- Amper ビルド システム (ベータ版): KMP プロジェクト用の Gradle の簡素化された代替手段、 複雑な Kotlin DSL の代わりに YAML セットアップを使用します。
- 改善されたツール: Android Studio Ladybug 以降では KMP がサポートされています クロスプラットフォームのリファクタリング、組み込み iOS シミュレータでのデバッグ、プロファイリングを備えた世界クラスの機能。
KMP プロジェクトのアーキテクチャ
KMP の基本的なアーキテクチャは、共有コード (commonMain) の分離に基づいています。 そしてプラットフォーム固有のコード。 React Native が約束した「すべてを一度書く」というものではありません。 しかし、ロジックを共有するためには、何があるかを共有し、プラットフォームに委任するのが合理的です。 本質的にネイティブ。
// Struttura tipica di un progetto KMP nel 2026
shared/
├── src/
│ ├── commonMain/kotlin/
│ │ ├── data/
│ │ │ ├── repository/ # Repository patterns condivisi
│ │ │ ├── network/ # Ktor client (HTTP multiplatform)
│ │ │ └── local/ # SQLDelight (DB multiplatform)
│ │ ├── domain/
│ │ │ ├── model/ # Data classes pure Kotlin
│ │ │ ├── usecase/ # Logica business
│ │ │ └── repository/ # Interfacce repository
│ │ └── presentation/ # ViewModels (Compose o altri)
│ │
│ ├── androidMain/kotlin/
│ │ └── actual/ # Implementazioni Android-specific
│ │ ├── DatabaseDriver.kt
│ │ └── HttpEngine.kt
│ │
│ ├── iosMain/kotlin/
│ │ └── actual/ # Implementazioni iOS-specific
│ │ ├── DatabaseDriver.kt
│ │ └── HttpEngine.kt
│ │
│ └── desktopMain/kotlin/ # (opzionale, per desktop JVM)
│
androidApp/ # App Android con UI nativa
iosApp/ # App iOS con UI nativa (Swift/SwiftUI)
desktopApp/ # App desktop (opzionale)
composeApp/ # (alternativa: UI condivisa con Compose MP)
指針となる原則: 可能な限り共有し、必要に応じてネイティブ API を使用する。 通常、成熟した KMP アプリケーションは以下を共有します。
- ビジネス ロジックの 90 ~ 95% (ドメイン層)
- データ層の 80 ~ 85% (ネットワーク、永続性、キャッシュ)
- プレゼンテーション層の 40 ~ 80% (Compose Multiplatform が使用されているかどうかによって異なります)
- UI レイヤーの 0 ~ 20% (プラットフォーム固有のネイティブ UI を使用している場合)
KMP vs Flutter vs React Native: 2026 年の比較
「どのクロスプラットフォーム フレームワークを使用するか?」という質問の答えは 2026 年と 2022 年では異なります。 正直な比較は次のとおりです。
// Matrice decisionale semplificata
| KMP | Flutter | React Native
--------------------|--------------|-------------|-------------
Linguaggio | Kotlin | Dart | TypeScript/JS
UI Engine | Nativa o CMP | Custom (Skia)| Nativa (bridge)
Performance | Ottima | Buona | Buona
Look nativo | Perfetto | Non nativo | Parziale
Team Android-first | Eccellente | Buono | Buono
Condivisione codice | ~70-80% | ~95% | ~80-90%
Ecosistema librerie | Crescente | Maturo | Maturo
Enterprise adoption | Alta (2026) | Alta | Diminuzione
主な違い: Flutter はカスタム レンダリング エンジン (Impeller) を使用して描画します UI 全体で、クロスプラットフォームの視覚的な一貫性を確保しますが、その「ネイティブ」な外観は犠牲になります。 プラットフォーム。ネイティブ UI を備えた KMP は、ネイティブ アプリとまったく同じように見えます。 アメリカ合衆国 コンポーネント プラットフォームにネイティブ。
KMP を選択する場合
KMP は次の場合に最適な選択肢です。
- チームは Android/Kotlin に関する強力な専門知識を持っており、そのロジックを iOS に導入したいと考えています。
- UI の「ネイティブ」側面は交渉の余地のない要件です (銀行アプリ、エンタープライズ)
- プラットフォーム固有の UI に対する完全な制御を維持しながら、ビジネス ロジックを共有したい
- アプリケーションに複雑なビジネス ロジックがある (UI の問題から分離することが望ましい)
- すべてを書き換えることなく、既存の Android アプリに iOS を追加している
次のような場合には、Flutter または React Native が適している可能性があります。
- チームは Web/React スキルを持っており、それらを再利用したいと考えています
- (ロジックだけでなく) UI 共有を最大化したい
- 市場投入までの時間が非常に重要だが、チームは Kotlin を知らない
Swift Export: 2026 年の iOS 相互運用性
Swift Export の前は、共有 Kotlin コードがヘッダーを通じて iOS に公開されていました。 自動生成された Objective-C。結果は次のような API になりました。
// PRIMA (Objective-C headers generati da KMP):
// Swift deve usare classi con nomi generati automaticamente
let viewModel = SharedUserViewModel()
let users = viewModel.users as! [SharedUser]
viewModel.loadUsers(completionHandler: { users, error in
// Gestione callback non-idiomatica
})
// DOPO (Swift Export in KMP 1.9+):
// Swift idiomatico, direttamente da codice Kotlin
let viewModel = UserViewModel()
let users: [User] = viewModel.users
await viewModel.loadUsers() // async/await nativo Swift
Swift Export は、Kotlin コルーチンを自動的に変換します。 async/await スウィフト、
Swift struct のデータ クラス (自動 equatable 付き)、Swift enum のシールされたクラス、
および AsyncSequence のフロー。その結果、iOS 開発者は Kotlin API を使用することになります。
あたかもSwiftで書かれたかのように。
マルチプラットフォームの構成: 現在のステータス
Compose Multiplatform (CMP) を使用すると、Compose Kotlin で記述された UI 全体を共有できます Android、iOS、デスクトップ JVM、Web (Kotlin/Wasm 経由)。 2026 年には iOS 上で確立され、 初期ベータ版と比べて大幅に改善されました。
// commonMain: UI condivisa con Compose Multiplatform
@Composable
fun UserListScreen(
users: List<User>,
onUserClick: (User) -> Unit
) {
LazyColumn {
items(users) { user ->
UserCard(user = user, onClick = { onUserClick(user) })
}
}
}
@Composable
fun UserCard(user: User, onClick: () -> Unit) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp)
.clickable(onClick = onClick)
) {
Column(modifier = Modifier.padding(16.dp)) {
Text(user.name, style = MaterialTheme.typography.titleMedium)
Text(user.email, style = MaterialTheme.typography.bodySmall)
}
}
}
Compose UI は Android と iOS で同じです。レンダリングには Skiko (Skia の Kotlin バインディング) を使用します iOS ではネイティブ UIKit コンポーネントではなく、アプリの外観が一貫しています。 クロスプラットフォームですが、ネイティブ SwiftUI アプリと同一ではありません。
2026 年の KMP 図書館エコシステム
成熟したライブラリのエコシステムは生産性にとって不可欠です。 2026 年には、これらは KMP プロジェクトの基本ライブラリ:
// build.gradle.kts (shared module)
kotlin {
sourceSets {
commonMain.dependencies {
// Network: client HTTP multiplatform
implementation("io.ktor:ktor-client-core:2.3.10")
implementation("io.ktor:ktor-client-content-negotiation:2.3.10")
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.10")
// Database: SQL multiplatform
implementation("app.cash.sqldelight:runtime:2.0.2")
// Serialization
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.0")
// Coroutines multiplatform
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
// Dependency Injection
implementation("io.insert-koin:koin-core:3.5.6")
// DateTime multiplatform
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.0")
// Logging multiplatform
implementation("co.touchlab:kermit:2.0.3")
}
androidMain.dependencies {
implementation("io.ktor:ktor-client-okhttp:2.3.10")
implementation("app.cash.sqldelight:android-driver:2.0.2")
}
iosMain.dependencies {
implementation("io.ktor:ktor-client-darwin:2.3.10")
implementation("app.cash.sqldelight:native-driver:2.0.2")
}
}
}
完全な例: KMP のパターン リポジトリ
KMP でユーザー管理用の単純なリポジトリを実装する方法を見てみましょう。 共通コードとプラットフォーム固有のコードの分離を示しています。
// commonMain: Interfaccia repository e modello
data class User(
val id: Long,
val name: String,
val email: String,
val createdAt: Instant
)
interface UserRepository {
suspend fun getUsers(): List<User>
suspend fun getUserById(id: Long): User?
suspend fun saveUser(user: User): User
}
// commonMain: Implementazione con Ktor + SQLDelight
class UserRepositoryImpl(
private val httpClient: HttpClient,
private val database: AppDatabase
) : UserRepository {
override suspend fun getUsers(): List<User> {
return try {
// Prima controlla il database locale
val cached = database.userQueries.selectAll().executeAsList()
if (cached.isNotEmpty()) {
cached.map { it.toDomain() }
} else {
// Poi scarica dalla rete e salva
val remote = httpClient.get("$BASE_URL/users").body<List<UserDto>>()
remote.forEach { database.userQueries.insert(it.toEntity()) }
remote.map { it.toDomain() }
}
} catch (e: Exception) {
// Fallback al cache anche se la rete fallisce
database.userQueries.selectAll().executeAsList().map { it.toDomain() }
}
}
}
企業導入統計 (2026 年)
2026 年第 1 四半期に更新された Kotlin エコシステム データによると、次のようになります。
- Fortune 500 企業における KMP の採用: 18% (2023 年は 7%)、 フィンテック、電子商取引、B2B エンタープライズ アプリが大部分を占めます。
- 主な使用例: Android と iOS の間でビジネス ロジックを共有 (82%)、 JVM/Android バックエンド同期 (45%)、デスクトップ アプリ (12%)。
- 注目すべき企業: Cash App (ブロック)、VMware、Philips、Touchlab、および多くの中小企業 ヨーロッパのテクノロジー企業は、本番環境で KMP を使用しています。
- 価値を生み出すまでの時間: チームは時間の 30 ~ 40% の短縮を報告しています 導入後最初の 3 か月後に機能を実装します。
チームへの導入に関する考慮事項
KMP を採用する前に、次の実際的な要素を考慮してください。
- チームスキル: KMP には、Kotlin を理解している開発者が必要です。 理想的には、Android チームが KMP を iOS に導入するのではなく、その逆ではありません。
- Gradle の学習曲線: Kotlin マルチプラットフォームを使用した KMP ビルド システム Gradle Plugin は学習曲線が急峻です。理解するために時間を投資する 開始する前にソースセットを作成します。
- ライブラリの互換性: すべての Java/Android ライブラリに互換性があるわけではありません Kotlin/ネイティブ (iOS) を使用します。依存関係を追加する前に、必ず KMP の互換性を確認してください。
- ビルド時間: KMP プロジェクトはアプリよりもビルド時間が長い 単一プラットフォーム、特に iOS 用 (Kotlin/ネイティブ コンパイル)。適切に構成された CI/CD キャッシングと必須。
結論と次のステップ
2026 年の Kotlin マルチプラットフォームは、ライブラリのエコシステムを備えた成熟した安定したプラットフォームです エンタープライズ品質。これはすべての人にとって適切なソリューションではありません。チームが React ファーストの場合、 React Native または Expo の方が合理的ですが、コードを移植したい Android ファーストのチーム向けです iOS では慣用的に、KMP はプロフェッショナルの頼りになる選択肢になりました。
次の記事ではその方法を示します 最初の KMP プロジェクトを最初からセットアップする: ソースセット構造、Gradle バージョンカタログ、最初の期待/実際の関数、および統合 Android Studio を使用して生産的な開発ワークフローを実現します。
シリーズ: Kotlin マルチプラットフォーム — 1 つのコードベース、すべてのプラットフォーム
- 第 1 条 (本): 2026 年の KMP — アーキテクチャ、確立、エコシステム
- 記事 2: 初めての KMP プロジェクトを構成する — Android、iOS、およびデスクトップ
- 第 3 条: 共有モジュール アーキテクチャ — 期待/実際、インターフェイスおよび DI
- 第 4 条: Ktor クライアントを使用したマルチプラットフォーム ネットワーキング
- 記事 5: SQLDelight によるマルチプラットフォームの永続性
- 第 6 条: マルチプラットフォームの構成 — Android と iOS での共有 UI
- 記事 7: 状態管理 KMP — ViewModel と Kotlin フロー
- 第 8 条: KMP テスト — 単体テスト、統合テスト、UI テスト
- 第 9 条: 迅速なエクスポート — iOS との慣用的な相互運用性
- 第 10 条: KMP プロジェクトの CI/CD — GitHub Actions と Fastlane
- 第 11 条: ケーススタディ — KMP を使用したフィンテック アプリの運用中







