/var/log/jsoizo

メモ帳 技術とか趣味とか

自作のKotlin/JVM用ライブラリをKMP対応した記録

自作したライブラリがJVM用のビルドしかできなかったのと、昨今のKMP化していきましょうの流れを汲み取ってやってみたので、わすれないためにその記録をメモっておく。

コミットは↓の通り。
少し余計なものが入ってるけど settings.gradle.ktsbuild.gradle.kts の内容が主な変更点。

github.com

少しずつおさらいしていく。

まずは settings.gradle.kts から。
Android Gradle pluginがgoogleリポジトリにて配布されているので追加する必要がある。

+pluginManagement {
+    repositories {
+        gradlePluginPortal()
+        google()
+        mavenCentral()
+    }
+}
+
 plugins {
     id("org.gradle.toolchains.foojay-resolver-convention") version "0.4.0"
 }

つづいて build.gradle.kts

まずはプラグインの追加&削除。
Kotlin/JVM用のプラグインを外してKMP用のプラグインを追加する。
また、Android用のビルドのためにAndroid Gralde Pluginを追加する。

-    id("org.jetbrains.kotlin.jvm") version "1.9.20"
+    val kotlinVersion = "1.9.20"
+    kotlin("multiplatform") version kotlinVersion
+    id("com.android.library") version "8.2.0"

リポジトリの追加。これもAndroid対応のために必要。

 repositories {
     mavenCentral()
+    google()
 }

本丸のkotlin用設定。丸ごと載せておく。
最小構成に近いものだとこんな感じと思われる。
ソースの置き場とビルド対象のプラットフォームごとの設定を追記していく。

kotlin {
    applyDefaultHierarchyTemplate()

    sourceSets {
        val commonMain by getting {
            dependencies {
                // common dependencies
            }
        }
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test"))
            }
        }
    }

    jvm {
        withSourcesJar(true)
    }
    androidTarget {
        publishLibraryVariants("release", "debug")
        compilations.all {
            kotlinOptions {
                jvmTarget = "1.8"
            }
        }
    }
    iosArm64()
    iosSimulatorArm64()
    linuxX64()
    macosArm64()
}

AndroidiOSが厄介で、前者はAndroid SDK, 後者はXCodeが必要となる。
Android SDKAndroid Studioをインストールすることで併せてインストールするというという手もあるが、IntelliJを利用しているものとしては2つの類似アプリケーションを入れるのはディスクももったいないので避けたい。そこで、IntelliJAndroidプラグインを追加し、設定から Languages & Frameworks -> Android SDK のところで任意のSDKをインストールしておくのが良い。あとは $HOME/Library/Android/sdk をPATHに通してあげればビルドにコケることは無いはず。

iOSXCodeApp Storeからインストールすればよいだけのはず。
もしかしたらiOS用のSDKの追加とかも必要 だったかも。 なので以下コマンドを実行してダウンロードしておく。

xcodebuild -downloadPlatform iOS

Android設定。
正直あまり詳しくないが、 namespacecompileSdk だけは書いとかないとだめだったはず。あとはバージョン系の互換性のための記述をいくつか書いておくと良いかもということでこのようにした。

android {
    namespace = "com.jsoizo.paritialfunction"
    compileSdk = 34
    defaultConfig {
        minSdk = 28
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

最後に、ソースコードを移動させる。
JVM用だけだったときは src/main/kotlin にコードを配置していたが、

  • プラットフォーム共通コード: src/commonMain/kotlin 配下
  • プラットフォーム別コード: src/プラットフォーム名/kotlin 配下

に置かなければならない。テストも同じルールで移動が必要。
僕のコードは全部Pure Kotlinで実装されておりJavaへの依存などもなかったのですべて commonMain 以下に移動させた。

これでおおよそKMP用にビルドができるはずである。

テストの実行などはプラットフォーム毎のテスト呼び出しタスクがある。
例えばAndroidの場合だとこんな感じになる。 :cleanTestDebugUnitTest :testDebugUnitTest --tests "com.jsoizo.paritialfunction.*"

テスト用のタスクがわからないとき、IntelliJ上でテストクラスを指定して実行しようとするとプラットフォーム選択の画面が表示されるのでそれに従って実行し、 Run/Debug configuration の画面からタスクを確認するとよい。

だいたいこんな感じ!!!

ちなみに、Maven Centralで配布することにしたので、この記事を参考にやった。
ほぼこれをトレースすればうまくいくはずである。

www.droidcon.com

おわりっ!!!!