안녕하세요, 오늘은 기존에 존재하는 어플에 KMM Library를 붙여볼겁니다.
KMM Library는 다음과 같은 방법들로 기존의 어플에 붙일 수 있습니다.
이 방법들 중 저는 Composite Build
를 통해 기존 앱에 붙여보겠습니다.
프로젝트를 sdk 형태로 배포하는데, KMM Library를 프로젝트에 모듈로 붙이고 배포를 하니 KMM에서 gradle script에서 target 설정하는 쪽에 에러가 발생해서 Composite Build를 통해 독립적인 빌드를 구성하는 방향으로 틀어서 해결했습니다.
이 과정을 공유해보겠습니다.
음 우선 독립적인 프로젝트를 생성하고 이 프로젝트를 레포에 올린 후 앱 프로젝트에서는 깃 서브모듈로 관리해주는 방향으로 하겠습니다.
AGP 버전이 맞지 않을 경우 빌드는 정상적으로 뜨지만 failed to resolve 프로젝트
라는 워닝이 계속 뜹니다.
이를 해결하기
똑같이 gradle을 작성해주시면 됩니다. ios target을 직접 설정해줘야 하는 이슈가 있긴한 것 같은데 최신 릴리즈에서는 해결된 것 같고, 이슈가 생기시는 분은 링크를 확인하시면 될 것 같습니다.
plugins {
kotlin("multiplatform") version "1.7.10"
id("com.android.library")
}
repositories {
google()
mavenCentral()
}
kotlin {
android()
ios()
sourceSets {
val commonMain by getting
val androidMain by getting
val iosMain by getting {
dependsOn(commonMain)
}
}
}
android {
compileSdk = 32
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig {
minSdk = 21
targetSdk = 32
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
groovy script 버전과 kotlin script 버전을 나누어 보여드리겠습니다.
공통적인 부분은 kmm library의 경우 dependency substitution을 정의해줘야 합니다.
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
include ":app"
includeBuild("sample-composite-library") {
dependencySubstitution {
substitue module("com.example.composite:library") using project(":")
}
}
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
include(":app")
includeBuild("sample-composite-library") {
dependencySubstitution {
substitute(module("com.example.composite:library")).using(project(":"))
}
}
그런 다음 해당 프로젝트를 사용하고 싶은 모듈에 가서 dependency에 추가해주시면 됩니다.
implementation "com.example.composite:library" // kotlin script
implementation("com.example.composite:library") // groovy script
전체 코드 : https://github.com/TaehoonLeee/sample-composite-application