KMM Shared Moduleの追加[備忘録]
初期アプリからKMM導入は過去記事参考
今回は現在進行形で運用されているAndroid/iOSのネイティブアプリに部分的にKMMを導入したい事例の為にSharedModuleを使用したパターンの手順です。
1. AndroidAppでSharedModule導入
File → New → New Module...を選択後にKMM Shared Moduleを選択します。
iOS Distribution ManagerでCocoapods dependency managerも選択できるようでしたが、対応したいiOS Appの方ではCocoapodsは剥がしてSPMに移行してしまったのでひとまず Regular frameworkにしました。
追加が成功するとapp/に追加した名前のShardModuleが作成されます。
Shard Module内のminSdkVersionと本体AppのminSdkVersionを揃える必要があります。
また本体App側のbuild.gradleにimplementation project(':{SharedModule名}')
の追加が必要です。
Android側のBuildが通ったらSharedModule内のサンプルコード(中身はKMM Appを作成した前回記事と同様)のGreeting().greeting()
でOSバージョンが表示されるなりしたら完了です。
iOS AppにSharedModule導入
以下のようにShared Module内のbuild.gradle.ktsを書き換えます。
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget plugins { kotlin("multiplatform") id("com.android.library") } kotlin { android() ios() { binaries { framework { baseName = "{Shared Module名}" } } sourceSets { val commonMain by getting val commonTest by getting { dependencies { implementation(kotlin("test-common")) implementation(kotlin("test-annotations-common")) } } val androidMain by getting val androidTest by getting { dependencies { implementation(kotlin("test-junit")) implementation("junit:junit:4.13.2") } } val iosMain by getting val iosTest by getting } } android { compileSdkVersion(31) sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") defaultConfig { minSdkVersion(24) targetSdkVersion(31) } } //create iOS framework for real device (arm64 only) val packForXcodeArm by tasks.creating(Sync::class) { group = "build" val mode = System.getenv("CONFIGURATION") ?: "DEBUG" val framework = kotlin.targets.getByName<KotlinNativeTarget>("iosArm64").binaries.getFramework(mode) inputs.property("mode", mode) dependsOn(framework.linkTask) val targetDir = File(buildDir, "xcode-framework-arm") from({ framework.outputDirectory }) into(targetDir) } //create iOS framework for simulators val packForXcodeX64 by tasks.creating(Sync::class) { group = "build" val mode = System.getenv("CONFIGURATION") ?: "DEBUG" val framework = kotlin.targets.getByName<KotlinNativeTarget>("iosX64").binaries.getFramework(mode) inputs.property("mode", mode) dependsOn(framework.linkTask) val targetDir = File(buildDir, "xcode-framework-X64") from({ framework.outputDirectory }) into(targetDir) } tasks.getByName("build").dependsOn(packForXcodeArm) tasks.getByName("build").dependsOn(packForXcodeX64)
実機buildをかける場合
$ ./gradlew packForXCodeArm -PXCODE_CONFIGURATION=Release
シミュレータの場合
$ ./gradlew packForXCodeX64 -PXCODE_CONFIGURATION=Release
xcode-framework-arm/xcode-framework-X64のディレクトリ内に作成されるSharedModule名.frameworkをiOS Appのrootにひとまず配置します。
XcodeGenの場合以下を追加するのみです。
dependencies: - framework: {SharedModule名}.framework
そしてimport FractalSharedModule
をした上でAndroid側と同様にGreeting().greeting()
でOSバージョンが出力されたら完了です。
参考