以前は、Android を KMP プロジェクトに統合する唯一の方法は、通常の Android ライブラリ Gradle プラグイン com.android.library
を使用する方法でした。ただし、このアプローチは非推奨になりました。代わりに、専用の com.android.kotlin.multiplatform.library
プラグイン(Android-KMP プラグイン)を使用することをおすすめします。このガイドでは、新しいプラグインに移行する方法について説明します。
主な機能と違い
Android-KMP プラグイン(com.android.kotlin.multiplatform.library
)は KMP プロジェクト用に特別に調整されており、従来の com.android.library
プラグインとはいくつかの重要な点で異なります。
- 単一バリアント アーキテクチャ: このプラグインは単一のバリアントで動作し、標準の Android ライブラリ プロジェクトで一般的に使用されるプロダクト フレーバーとビルドタイプのサポートを削除することで、ビルドプロセスを効率化します。これにより、KMP Android ライブラリの構成が簡素化され、ビルド パフォーマンスが向上します。
- KMP 用に最適化: このプラグインは、Kotlin マルチプラットフォーム ライブラリ用に特別に設計されており、共有 Kotlin コードと相互運用性に重点を置いています。そのため、Android 固有のネイティブ ビルド、AIDL(Android インターフェース定義言語)、RenderScript のサポートは省略されています。これらの機能は通常、KMP 共有コードのコンテキストでは関連しません。
- テストはデフォルトで無効: マルチプラットフォーム環境でのビルド速度をさらに向上させるため、テストはデフォルトで無効になっています。プロジェクトで必要に応じて、テストを明示的に有効にできます。これは、ホスト上のテスト(単体テスト)とデバイス上のテスト(インストルメンテーション テスト)の両方に適用されます。
- 最上位の Android 拡張機能がない: このプラグインは、Gradle ビルドファイルに最上位の
android
拡張機能を作成しません。構成は Kotlin マルチプラットフォーム DSL 内のandroidLibrary
ブロックで処理され、KMP プロジェクト構造の一貫性が維持されます。 - Java コンパイルのオプトイン: Java コンパイルはデフォルトで有効になっていません。KMP ライブラリで Java ベースのコードをコンパイルする必要がある場合は、
kotlin
ブロックのandroidLibrary
構成ブロック内でwithJava()
API を使用して、明示的にオプトインする必要があります。これにより、コンパイル プロセスをより細かく制御でき、Java ベースのコードのコンパイルが不要な場合はビルド時間を短縮できます。
移行のメリット
Android-KMP プラグインを使用すると、KMP プロジェクトで次のようなメリットが得られます。
- ビルド パフォーマンスと安定性の向上: Android-KMP プラグインは、KMP プロジェクト内のビルド速度の最適化と安定性の向上を目的として設計されています。合理化されたアーキテクチャと KMP ワークフローに重点を置くことで、より効率的で信頼性の高いビルドプロセスが実現します。
- IDE 統合の強化: このプラグインは、Android Studio や他の Kotlin IDE との優れた統合を提供します。これにより、KMP Android ライブラリを操作する際のコード補完、ナビゲーション、デバッグ、全体的なデベロッパー エクスペリエンスが向上します。
- プロジェクト構成の簡素化: Android 固有の複雑さ(バリアントなど)を排除することで、Android-KMP プラグインは KMP プロジェクトの構成を簡素化します。これにより、よりクリーンかつメンテナンスしやすいビルドファイルが生成され、KMP Android 開発を初めて行うデベロッパーの学習曲線が短縮されます。以前は、
com.android.library
プラグインを使用して Android を KMP プロジェクトに統合すると、マルチプラットフォーム構造内の Android Gradle プラグインと Kotlin Gradle プラグインの相互作用により、ソースセット名が誤解を招く結果になることがあります。たとえば、Android インストルメンテーション テストの構成専用のソースセットの名前はandroidAndroidTest
でした。この命名規則は、標準の KMP プロジェクト構造に精通しているデベロッパーにとって直感的ではありませんでした。 - 公式で推奨されるソリューション:
com.android.kotlin.multiplatform.library
プラグインは、com.android.library
プラグインを使用して Android ターゲットを KMP ライブラリに追加する以前の方法に代わる公式の方法です。KMP 用のcom.android.library
プラグインの使用を続けると、JetBrains によるサポートが終了し、今後のアップデートや改善の恩恵を受けられなくなります。
Android-KMP プラグインをプロジェクトに適用する
Android-KMP プラグインをプロジェクトに適用する主な方法は 2 つあります。 * 既存の KMP ライブラリ モジュールの場合は、Gradle ファイルを手動で編集します。* 新しい KMP ライブラリ モジュールの場合は、Android Studio UI から新しいモジュールを直接作成します。
既存のモジュールにプラグインを適用する
既存の KMP ライブラリ モジュールに Android-KMP プラグインを適用する手順は次のとおりです。
バージョン カタログの TOML ファイルを開き、
plugins
セクションに次のコードを追加します。[plugins] kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "KOTLIN_PLUGIN_VERSION" } android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "ANDROID_KMP_PLUGIN_VERSION" }
KOTLIN_PLUGIN_VERSION と ANDROID_KMP_PLUGIN_VERSION は、使用している実際のバージョンに置き換えます。
KMP ライブラリ モジュールのルートで
build.gradle.kts
(Kotlin)またはbuild.gradle
(Groovy)ファイルを開きます。ファイルの上部にある
plugins
ブロック内にプラグインを適用します。Kotlin
plugins { alias(libs.plugins.kotlin.multiplatform) apply false // Add the following alias(libs.plugins.android.kotlin.multiplatform.library) apply false }
Groovy
plugins { alias(libs.plugins.kotlin.multiplatform) apply false // Add the following alias(libs.plugins.android.kotlin.multiplatform.library) apply false }
Kotlin マルチプラットフォーム ブロック(
kotlin
)を構成して、Android ターゲットを定義します。kotlin
ブロック内で、androidLibrary
を使用して Android ターゲットを指定します。Kotlin
kotlin { androidLibrary { namespace = "com.example.kmpfirstlib" compileSdk = 33 minSdk = 24 withJava() // enable java compilation support withHostTestBuilder {}.configure {} withDeviceTestBuilder { sourceSetTreeName = "test" } compilations.configureEach { compilerOptions.configure { jvmTarget.set( org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8 ) } } } sourceSets { androidMain { dependencies { // Add Android-specific dependencies here } } getByName("androidHostTest") { dependencies { } } getByName("androidDeviceTest") { dependencies { } } } // ... other targets (JVM, iOS, etc.) ... }
Groovy
kotlin { androidLibrary { namespace = "com.example.kmpfirstlib" compileSdk = 33 minSdk = 24 withJava() // enable java compilation support withHostTestBuilder {}.configure {} withDeviceTestBuilder { it.sourceSetTreeName = "test" } compilations.configureEach { compilerOptions.options.jvmTarget.set( org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8 ) } } sourceSets { androidMain { dependencies { } } androidHostTest { dependencies { } } androidDeviceTest { dependencies { } } } // ... other targets (JVM, iOS, etc.) ... }
プラグインを適用して
kotlin
ブロックを構成したら、Gradle プロジェクトを同期して変更を適用します。
プラグインを使用して新しいモジュールを作成する
Android Studio 内で直接新しい Kotlin マルチプラットフォーム ライブラリ モジュールを作成することもできます。これにより、Android-KMP プラグインなど、必要なプラグインが自動的に適用されます。Android Studio で新しい KMP ライブラリ モジュールを作成する方法について詳しくは、既存のプロジェクトに Kotlin マルチプラットフォームを追加するをご覧ください。
マルチプラットフォーム エコシステム全体と高度な構成の詳細については、公式の Kotlin マルチプラットフォームのドキュメントをご覧ください。