
Kotlin Multiplatform(KMP)プロジェクトにおいて、Gradleのdependencies定義に混乱したことはありませんか?
特に、「トップレベルのdependenciesとsourceSets内のdependenciesって何が違うの?」「依存関係どっちのdependenciesに追加したらいいの?」と感じた方も多いはずです。
本記事では、Android Gradle Plugin(AGP)とKMPプラグインがそれぞれ管理するdependenciesの違いをわかりやすく整理します。
Gradleプラグインの役割整理
🔧 Android Gradle Plugin(AGP)
公式ドキュメント によれば、AGPは Android特有のビルド処理 を行うGradle拡張プラグインです。
plugins {
alias(libs.plugins.androidApplication)
// → "com.android.application"
}
これにより、Androidアプリ向けのビルド設定が自動化されます。
🌐 Kotlin Multiplatform Plugin(KMP)
KMP公式ガイド によれば、KMPプラグインは 共通のKotlinコードを複数プラットフォームにコンパイル する仕組みを提供します。
plugins {
alias(libs.plugins.kotlinMultiplatform)
// → "org.jetbrains.kotlin.multiplatform"
}
Q. AGPとKMP、どちらかだけでOK?
A. NO!
KMPプロジェクトにおいても、AndroidビルドにはAGPが必須です。
AGPとKMPは以下のような住み分けで動作します:
| プラグイン | 主な責任 |
|---|---|
| AGP | Android向けビルドタスクの処理 |
| KMP | 共通コード・マルチプラットフォーム出力の管理 |
dependencies の違い:定義場所で作用範囲が異なる!
1. トップレベルの dependencies
dependencies {
implementation("androidx.core:core-ktx:1.10.1")
}
- 管理者:AGP
- 対象範囲:Androidモジュール全体
- Androidアプリ単体でビルドしているときと同様の扱い
2. sourceSets 内の dependencies
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}
}
}
}
Q. なぜ commonMain の依存関係が androidMain や iosMain からも参照できるの?
A. commonMain は各プラットフォームのベースになるからです。
KMPでは、commonMainが基底ソースセットとして機能し、各プラットフォームのソースセット(androidMain、iosMainなど)がこれを「継承」する構造になっています。
これはGradleのマルチプラットフォームプラグインが持つ 暗黙的な継承機構 に基づいています。
参考:The basics of Kotlin Multiplatform project structure – SourceSets
まとめ
- AGPとKMPは別々の目的で動作している
-
dependenciesの定義場所で作用範囲が変わる -
commonMainの依存関係は、プラットフォーム側でも使えるように設計されている
おわりに
KMP導入初期にぶつかりがちなこの依存関係の違い、理解が進めば柔軟なアーキテクチャ設計が可能になります。
似たような悩みを持っている方は多いと思うので、本記事がその一助となれば幸いです 🙌
Views: 0
