Android-KMP 플러그인으로 이전

이전에는 Android를 KMP 프로젝트에 통합하는 유일한 방법은 일반 Android 라이브러리 Gradle 플러그인 com.android.library을 사용하는 것이었습니다. 그러나 이제 이 접근 방식은 Android-KMP 플러그인이라고도 하는 전용 com.android.kotlin.multiplatform.library 플러그인으로 대체되어 지원 중단되었습니다. 이 가이드에서는 새로운 플러그인으로 이전하는 방법을 설명합니다.

주요 기능 및 차이점

Android-KMP 플러그인 (com.android.kotlin.multiplatform.library)은 KMP 프로젝트용으로 특별히 조정되었으며 다음과 같은 몇 가지 주요 측면에서 기존 com.android.library 플러그인과 다릅니다.

  • 단일 변형 아키텍처: 플러그인은 단일 변형으로 작동하여 표준 Android 라이브러리 프로젝트에서 일반적으로 발견되는 제품 버전 및 빌드 유형에 대한 지원을 삭제하여 빌드 프로세스를 간소화합니다. 이렇게 하면 KMP Android 라이브러리의 구성이 간소화되고 빌드 성능이 향상됩니다.
  • KMP에 최적화됨: 이 플러그인은 공유 Kotlin 코드 및 상호 운용성에 중점을 두고 Kotlin 멀티플랫폼 라이브러리를 위해 특별히 설계되었습니다. 따라서 일반적으로 KMP 공유 코드 컨텍스트와 관련이 없는 Android용 네이티브 빌드, AIDL(Android 인터페이스 정의 언어), RenderScript에 대한 지원은 생략됩니다.
  • 기본적으로 테스트 사용 중지: 멀티플랫폼 환경에서 빌드 속도를 더욱 개선하기 위해 테스트가 기본적으로 사용 중지됩니다. 프로젝트에 필요한 경우 테스트를 명시적으로 사용 설정할 수 있습니다. 이는 호스트 테스트(단위 테스트)와 기기 테스트 (계측 테스트) 모두에 적용됩니다.
  • 최상위 Android 확장자가 없음: 플러그인이 Gradle 빌드 파일에 최상위 android 확장자를 만들지 않습니다. 구성은 일관된 KMP 프로젝트 구조를 유지하면서 Kotlin 멀티플랫폼 DSL 내의 androidLibrary 블록으로 처리됩니다.
  • Java 컴파일 선택: Java 컴파일은 기본적으로 사용 설정되지 않습니다. KMP 라이브러리에서 Java 기반 코드를 컴파일해야 하는 경우 kotlin 블록의 androidLibrary 구성 블록 내에 withJava() API를 사용하여 명시적으로 선택해야 합니다. 이렇게 하면 컴파일 프로세스를 더 세부적으로 제어할 수 있으며 Java 기반 코드의 컴파일이 필요하지 않은 경우 빌드 시간을 개선할 수 있습니다.

이전의 이점

Android-KMP 플러그인은 KMP 프로젝트에 다음과 같은 이점을 제공합니다.

  • 빌드 성능 및 안정성 개선: Android-KMP 플러그인은 KMP 프로젝트 내에서 최적화된 빌드 속도와 향상된 안정성을 위해 설계되었습니다. 간소화된 아키텍처와 KMP 워크플로에 중점을 두어 보다 효율적이고 안정적인 빌드 프로세스를 제공합니다.
  • IDE 통합 개선: 이 플러그인은 Android 스튜디오 및 기타 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 플러그인을 사용하여 KMP 라이브러리에 Android 타겟을 추가하는 이전 방법을 대체하는 공식 솔루션입니다. KMP용 com.android.library 플러그인을 계속 사용하면 더 이상 JetBrains에서 지원하지 않으며 향후 업데이트 및 개선사항의 혜택을 누릴 수 없습니다.

프로젝트에 Android-KMP 플러그인 적용

Android-KMP 플러그인을 프로젝트에 적용하는 기본 방법에는 두 가지가 있습니다. * 기존 KMP 라이브러리 모듈의 경우 Gradle 파일을 수동으로 수정합니다. * 새 KMP 라이브러리 모듈의 경우 Android 스튜디오 UI에서 새 모듈을 직접 만듭니다.

기존 모듈에 플러그인 적용

Android-KMP 플러그인을 기존 KMP 라이브러리 모듈에 적용하려면 다음 단계를 따르세요.

  1. 버전 카탈로그 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_VERSIONANDROID_KMP_PLUGIN_VERSION를 사용 중인 실제 버전으로 바꿉니다.

  2. KMP 라이브러리 모듈의 루트에서 build.gradle.kts (Kotlin) 또는 build.gradle (Groovy) 파일을 엽니다.

  3. 파일 상단의 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
    }
  4. 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 프로젝트를 동기화하여 변경사항을 적용합니다.

플러그인으로 새 모듈 만들기

Android 스튜디오 내에서 직접 새 Kotlin 멀티플랫폼 라이브러리 모듈을 만들 수도 있습니다. 이렇게 하면 Android-KMP 플러그인을 비롯한 필요한 플러그인이 자동으로 적용됩니다. Android 스튜디오로 새 KMP 라이브러리 모듈을 만드는 방법에 관한 자세한 내용은 기존 프로젝트에 Kotlin 멀티플랫폼 추가를 참고하세요.

전체 멀티플랫폼 생태계 및 고급 구성에 관한 자세한 내용은 공식 Kotlin 멀티플랫폼 문서를 참고하세요.