Android-KMP ライブラリ プラグインに移行する

Kotlin マルチプラットフォームには、ライブラリ モジュールを構成するための Gradle プラグインがあります。

com.android.kotlin.multiplatform.library プラグインは、通常の Android ライブラリ Gradle プラグイン(com.android.library)を使用して KMP ライブラリに Android ターゲットを追加する以前の方法の公式な代替手段です。

以前のアプローチは非推奨となり、プラグイン(Android-KMP プラグインとも呼ばれます)が推奨されるようになりました。KMP 用の com.android.library プラグインを引き続き使用しても、JetBrains によるサポートは終了し、今後のアップデートや改善のメリットは得られなくなります。

このプラグインに移行するには、Android-KMP プラグインを適用するをご覧ください。

主な機能と違い

Android-KMP プラグインは KMP プロジェクト専用に調整されており、標準の com.android.library プラグインとはいくつかの重要な点で異なります。

  • 単一バリアント アーキテクチャ: プラグインは単一バリアントを使用し、プロダクト フレーバーとビルドタイプのサポートを削除します。これにより、構成が簡素化され、ビルド パフォーマンスが向上します。

  • KMP 向けに最適化: このプラグインは KMP ライブラリ向けに設計されており、共有 Kotlin コードと相互運用性に重点を置いています。Android 固有のネイティブ ビルド、AIDL、RenderScript のサポートは省略されています。

  • デフォルトで無効になっているテスト: ビルド速度を向上させるため、ユニットテストとデバイス(インストルメンテーション)テストの両方がデフォルトで無効になっています。必要に応じて有効にできます。

  • 最上位の Android 拡張機能がない: 構成は Gradle KMP DSL 内の androidLibrary ブロックで処理され、一貫した KMP プロジェクト構造が維持されます。トップレベルの android 拡張機能ブロックがない。

  • オプトイン Java コンパイル: Java コンパイルはデフォルトで無効になっています。有効にするには、androidLibrary ブロックで withJava() を使用します。これにより、Java コンパイルが不要な場合のビルド時間が短縮されます。

Android-KMP ライブラリ プラグインのメリット

Android-KMP プラグインには、KMP プロジェクトに次のようなメリットがあります。

  • ビルドのパフォーマンスと安定性の向上: KMP プロジェクト内でビルド速度を最適化し、安定性を高めるように設計されています。KMP ワークフローに重点を置くことで、より効率的で信頼性の高いビルドプロセスに貢献します。

  • IDE 統合の強化: KMP Android ライブラリを使用する際のコード補完、ナビゲーション、デバッグ、全体的なデベロッパー エクスペリエンスが向上します。

  • プロジェクト構成の簡素化: このプラグインは、ビルド バリアントなどの Android 固有の複雑さを排除することで、KMP プロジェクトの構成を簡素化します。これにより、よりクリーンで保守しやすいビルドファイルが作成されます。以前は、KMP プロジェクトで com.android.library プラグインを使用すると、androidAndroidTest などのわかりにくいソースセット名が作成されることがありました。この命名規則は、標準の KMP プロジェクト構造に精通しているデベロッパーにとっては直感的ではありませんでした。

既存のモジュールに Android-KMP プラグインを適用する

既存の KMP ライブラリ モジュールに Android-KMP プラグインを適用する手順は次のとおりです。

  1. バージョン カタログでプラグインを宣言します。バージョン カタログの TOML ファイル(通常は gradle/libs.versions.toml)を開き、プラグイン定義セクションを追加します。

    # To check the version number of the latest Kotlin release, go to
    # https://kotlinlang.org/docs/releases.html
    
    [versions]
    androidGradlePlugin = "8.12.0"
    kotlin = "KOTLIN_VERSION"
    
    [plugins]
    kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
    android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "androidGradlePlugin" }
    
  2. ルートのビルドファイルでプラグイン宣言を適用します。プロジェクトのルート ディレクトリにある build.gradle.kts ファイルを開きます。apply false を使用して、プラグイン エイリアスを plugins ブロックに追加します。これにより、プラグイン ロジックをルート プロジェクト自体に適用することなく、すべてのサブプロジェクトでプラグイン エイリアスを使用できるようになります。

    Kotlin

    // Root build.gradle.kts file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform) apply false
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library) apply false
    }

    Groovy

    // Root build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform) apply false
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library) apply false
    }
  3. KMP ライブラリ モジュールのビルドファイルでプラグインを適用します。KMP ライブラリ モジュールの build.gradle.kts ファイルを開き、plugins ブロック内のファイルの先頭にプラグインを適用します。

    Kotlin

    // Module-specific build.gradle.kts file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }

    Groovy

    // Module-specific build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }
  4. Android KMP ターゲットを構成します。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.) ...
    }
  5. 変更を適用します。プラグインを適用して kotlin ブロックを構成したら、Gradle プロジェクトを同期して変更を適用します。