AndroidとiOSをターゲットとしたKotlin Multiplatform (KMP)ライブラリです。Clean Architectureの原則に従い、レイヤー化されたフィーチャーベースのモジュール構造を採用しています。
各プラットフォームでの使用方法については、ANDROID_USAGE.md、IOS_USAGE.mdを参照してください。
このライブラリは、Mars Real Estate APIを使用した実装例を含んでいます。Clean Architectureに基づいた以下のレイヤー構成で、APIデータ取得から状態管理までを実装しています。
UI Layer (feature:home)
↓ HomeViewModel - StatefulBaseViewModelで状態管理
Domain Layer (core:domain)
↓ MarsRepository - データ取得のインターフェース
Data Layer (core:data)
↓ MarsRepositoryImpl - リポジトリの実装
Network Layer (core:network)
↓ MarsApiServiceImpl - Ktorを使用したHTTPクライアント
- MarsProperty (
core:model): 火星不動産データモデル(kotlinx.serialization使用) - MarsApiService (
core:network): Ktorを使ったAPI通信 - MarsRepository (
core:data): データ取得ロジックの実装 - HomeViewModel (
feature:home): StatefulBaseViewModelを継承した状態管理
この実装により、レイヤー間の依存関係が明確に分離され、テスタビリティと保守性の高いコードを実現しています。
kmp-sample-library/
├── shared/ # Koinエントリポイントモジュール
├── core/ # 基盤レイヤー
│ ├── model/ # データモデル(kotlinx.serialization使用)
│ ├── domain/ # ビジネスロジックのインターフェースと契約
│ ├── data/ # リポジトリの実装
│ ├── network/ # HTTPクライアント(Ktor)の抽象化
│ └── featurebase/ # フィーチャーモジュール用のベースViewModel
└── feature/ # フィーチャー固有のモジュール
└── home/ # フィーチャーモジュールの例
| カテゴリ | 技術 | バージョン |
|---|---|---|
| 言語 | Kotlin Multiplatform | 2.2.0 |
| ビルドツール | Gradle | 8.10 |
| HTTP Client | Ktor | 3.2.0 |
| 依存性注入 | Koin | 4.1.0 |
| シリアライゼーション | kotlinx.serialization | - |
| ViewModel | AndroidX Lifecycle | 2.9.1 |
- JDK 17以上
- Android Studio Ladybug以降
- Xcode 15以上(iOS開発の場合)
# 全モジュールをビルド
./gradlew build
# 特定のモジュールをビルド
./gradlew :core:network:build
./gradlew :feature:home:build
# クリーンビルド
./gradlew clean build# 全モジュールのテストを実行
./gradlew test
# 特定のモジュールのテストを実行
./gradlew :core:network:testプロジェクトはbuild-logic内にカスタムGradle convention pluginsを定義しています:
- Android SDKバージョンを設定(compileSdk=35, minSdk=30)
- Java/JVM互換性をバージョン17に設定
- 全ライブラリモジュールのベースプラグイン
- マルチプラットフォームターゲット: Android, iOS (x64, arm64, simulator arm64)
- coreモジュール、sharedモジュールで使用
- フィーチャーモジュール用プラグイン
- core依存関係とKoin依存関係を自動追加
- featureモジュールで使用
- GitHub PackagesへのMaven公開を設定
// build.gradle.kts
plugins {
alias(libs.plugins.kmp.sample.library.kmp.library)
}
kotlin {
sourceSets {
commonMain.dependencies {
// モジュール固有の依存関係
}
}
}
android {
namespace = "io.github.kei_1111.kmp_sample_library.core.yourmodule"
}// build.gradle.kts
plugins {
alias(libs.plugins.kmp.sample.library.kmp.feature)
}
kotlin {
sourceSets {
commonMain.dependencies {
// フィーチャー固有の追加依存関係のみ
}
}
}
android {
namespace = "io.github.kei_1111.kmp_sample_library.feature.yourfeature"
}- テストは
commonTestソースセット内に配置 - 利用可能なテスト依存関係:
kotlin-testkotlinx-coroutines-testktor-client-mock(HTTPモック用)
# 全テストを実行
./gradlew test
# 特定のモジュールのテストを実行
./gradlew :core:network:test- 各モジュールは
di/${MODULE_NAME}Module.kt内で依存関係を定義 - フィーチャーモジュールはKoin依存関係を自動取得
- すべてのKoinモジュールは
sharedモジュールで集約
// di/YourModule.kt
val yourModule = module {
single<YourRepository> { YourRepositoryImpl(get(), ...) }
}GitHub Actionsワークフローがmainブランチへのpush時に自動実行されます:
./gradlew buildでプロジェクトをビルド./gradlew publishでGitHub Packagesに公開
ワークフローファイル: .github/workflows/publish.yml
- Android使用方法 - Android側での使用方法
- iOS使用方法 - iOS側での使用方法
- CLAUDE.md - AI開発支援ツール用のプロジェクトガイド