ตั้งค่าปลั๊กอินไลบรารี Android Gradle สำหรับ KMP

ปลั๊กอิน com.android.kotlin.multiplatform.library Gradle เป็นเครื่องมือที่ได้รับการสนับสนุนอย่างเป็นทางการ สำหรับการเพิ่มเป้าหมาย Android ลงใน Kotlin Multiplatform (KMP) โมดูลไลบรารี ซึ่งช่วยลดความซับซ้อนในการกำหนดค่าโปรเจ็กต์ ปรับปรุง ประสิทธิภาพการบิลด์ และผสานรวมกับ Android Studio ได้ดียิ่งขึ้น

การใช้ปลั๊กอิน com.android.library สำหรับการพัฒนา KMP ขึ้นอยู่กับ API ของปลั๊กอิน Android Gradle ที่เลิกใช้งานแล้วและต้องเลือกใช้ในปลั๊กอิน Android Gradle 9.0 ขึ้นไป (ไตรมาสที่ 4 ปี 2025) เราคาดว่าจะนำ API เหล่านี้ออกในปลั๊กอิน Android Gradle 10.0 (ครึ่งหลังของปี 2026)

หากต้องการใช้ปลั๊กอินนี้ โปรดดูส่วนใช้ปลั๊กอิน Android-KMP หากต้องการย้ายข้อมูลจาก API เดิม โปรดดูคำแนะนำ ในการย้ายข้อมูล

หากต้องการความช่วยเหลือเกี่ยวกับการย้ายข้อมูล AGP 9.0 ขึ้นไป คุณสามารถใช้ทักษะของเอเจนต์ ที่ JetBrains สร้างขึ้นสำหรับแอป KMP ได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ทักษะใน Android Studio ได้ที่ขยายโหมดตัวแทนด้วยทักษะ โปรดทราบ ว่าผลลัพธ์ของ AI ไม่สามารถคาดการณ์ได้อย่างสมบูรณ์

ฟีเจอร์และความแตกต่างที่สำคัญ

ปลั๊กอิน Android-KMP ออกแบบมาสำหรับโปรเจ็กต์ KMP โดยเฉพาะและแตกต่าง จากปลั๊กอิน com.android.library มาตรฐานในหลายๆ ด้านที่สำคัญ ดังนี้

  • สถาปัตยกรรมแบบตัวแปรเดียว: ปลั๊กอินใช้ตัวแปรเดียว ซึ่งจะนำการรองรับ Product Flavors และประเภทบิลด์ออก ซึ่งจะช่วยลดความซับซ้อนในการกำหนดค่าและเพิ่มประสิทธิภาพการบิลด์

  • เพิ่มประสิทธิภาพสำหรับ KMP: ปลั๊กอินได้รับการออกแบบมาสำหรับไลบรารี KMP โดยมุ่งเน้นที่โค้ด Kotlin ที่แชร์และความสามารถในการทำงานร่วมกัน โดยไม่รองรับบิลด์แบบเนทีฟเฉพาะ Android, AIDL และ RenderScript

  • การทดสอบที่ปิดใช้โดยค่าเริ่มต้น: การทดสอบหน่วยและการทดสอบอุปกรณ์ (การวัด) ทั้ง 2 อย่างจะปิดใช้โดยค่าเริ่มต้นเพื่อเพิ่มความเร็วในการสร้าง คุณสามารถเปิดใช้ได้หากจำเป็น

  • ไม่มีส่วนขยาย Android ระดับบนสุด: การกำหนดค่าจะได้รับการจัดการด้วยบล็อก android ภายใน KMP DSL ของ Gradle ซึ่งจะรักษาโครงสร้างโปรเจ็กต์ KMP ที่สอดคล้องกัน ไม่มีการบล็อกส่วนขยาย android ระดับบนสุด

  • เลือกใช้การคอมไพล์ Java: ระบบจะปิดใช้การคอมไพล์ Java โดยค่าเริ่มต้น ใช้ withJava() ในบล็อก android เพื่อเปิดใช้ ซึ่งจะช่วยปรับปรุงเวลาบิลด์ เมื่อไม่จำเป็นต้องคอมไพล์ Java

ประโยชน์ของปลั๊กอินไลบรารี Android-KMP

ปลั๊กอิน Android-KMP มีประโยชน์ดังต่อไปนี้สำหรับโปรเจ็กต์ KMP

  • ปรับปรุงประสิทธิภาพและความเสถียรในการบิลด์: ออกแบบมาเพื่อเพิ่มความเร็วในการบิลด์ที่เพิ่มประสิทธิภาพและความเสถียรที่เพิ่มขึ้นภายในโปรเจ็กต์ KMP โดยมุ่งเน้นที่เวิร์กโฟลว์ KMP เพื่อให้กระบวนการบิลด์มีประสิทธิภาพและเชื่อถือได้มากขึ้น

  • การผสานรวม IDE ที่ดียิ่งขึ้น: ช่วยให้การเติมโค้ด การนำทาง การแก้ไขข้อบกพร่อง และประสบการณ์โดยรวมของนักพัฒนาซอฟต์แวร์ดีขึ้นเมื่อทำงานกับไลบรารี KMP Android

  • การกำหนดค่าโปรเจ็กต์ที่ง่ายขึ้น: ปลั๊กอินช่วยลดความซับซ้อนในการกำหนดค่า สำหรับโปรเจ็กต์ KMP โดยการนำความซับซ้อนเฉพาะของ Android เช่น ตัวแปรบิลด์ ออก ซึ่งจะทำให้ไฟล์บิลด์สะอาดและบำรุงรักษาได้ง่ายขึ้น ก่อนหน้านี้ การใช้ปลั๊กอิน com.android.library ในโปรเจ็กต์ KMP อาจทำให้เกิดชื่อชุดซอร์สที่สับสน เช่น androidAndroidTest การตั้งชื่อ ตามธรรมเนียมนี้ไม่ค่อยเป็นที่เข้าใจสำหรับนักพัฒนาซอฟต์แวร์ที่คุ้นเคยกับโครงสร้างโปรเจ็กต์ KMP มาตรฐาน

วิธีแก้ปัญหาสำหรับฟีเจอร์ที่ไม่รองรับ

เมื่อเทียบกับการผสานรวม KMP กับปลั๊กอิน com.android.library ปลั๊กอิน com.android.kotlin.multiplatform.library จะไม่มีฟีเจอร์บางอย่าง วิธีแก้ปัญหาสำหรับฟีเจอร์ที่ไม่รองรับมีดังนี้

  • สร้างตัวแปร

    ไม่รองรับประเภทบิลด์และ Product Flavor เนื่องจากปลั๊กอินใหม่ใช้สถาปัตยกรรมตัวแปรเดียว ซึ่งช่วยลดความซับซ้อนของการกำหนดค่าและปรับปรุงประสิทธิภาพการสร้าง

    หากต้องการตัวแปรบิลด์ เราขอแนะนำให้สร้างโมดูลไลบรารี Android แบบสแตนด์อโลนแยกต่างหากโดยใช้ปลั๊กอิน com.android.library กำหนดค่าประเภทบิลด์และเวอร์ชันผลิตภัณฑ์ภายในโมดูลนั้น แล้วใช้เป็นทรัพยากร Dependency ของโปรเจ็กต์มาตรฐานจากชุดซอร์ส androidMain ของไลบรารี Kotlin Multiplatform ดูรายละเอียดเพิ่มเติมได้ที่สร้างไลบรารี Android และกำหนดค่าตัวแปรบิลด์

  • การเชื่อมโยงข้อมูลและการเชื่อมโยงมุมมอง

    ฟีเจอร์เหล่านี้เป็นฟีเจอร์เฟรมเวิร์ก UI เฉพาะ Android ที่เชื่อมโยงอย่างใกล้ชิดกับ ระบบ View ของ Android และเลย์เอาต์ XML ด้วยปลั๊กอินไลบรารี Android-KMP ใหม่ เรา ขอแนะนำให้คุณจัดการ UI โดยใช้เฟรมเวิร์กแบบหลายแพลตฟอร์ม เช่น Compose Multiplatform การเชื่อมโยงข้อมูลและการเชื่อมโยง View ถือเป็นรายละเอียดการติดตั้งใช้งานของแอป Android ขั้นสุดท้าย ไม่ใช่ไลบรารีที่แชร์ได้

  • การรองรับบิลด์เนทีฟ

    ปลั๊กอินใหม่นี้มุ่งเน้นการสร้าง AAR มาตรฐานสำหรับเป้าหมาย Android การผสานรวมโค้ดแบบเนทีฟใน Kotlin Multiplatform จะได้รับการจัดการโดยเป้าหมายเนทีฟของ KMP เอง (เช่น androidNativeArm64 และ androidNativeX86) และความสามารถในการทำงานร่วมกันกับ C หากต้องการรวมโค้ด C/C++ แบบเนทีฟ คุณควร กำหนดโค้ดดังกล่าวเป็นส่วนหนึ่งของชุดซอร์สทั่วไปหรือชุดซอร์สแบบเนทีฟ และกำหนดค่า C-interop ภายในบล็อก kotlin แทนที่จะใช้กลไก externalNativeBuild เฉพาะของ Android

    หรือหากต้องการการสนับสนุนการบิลด์แบบเนทีฟผ่าน externalNativeBuild เราขอแนะนำให้สร้างโมดูล com.android.library แบบสแตนด์อโลนแยกต่างหาก ซึ่งคุณสามารถผสานรวมโค้ดแบบเนทีฟ และใช้ไลบรารีแบบสแตนด์อโลนนั้นจากชุดซอร์ส androidMain ของโปรเจ็กต์ไลบรารี Kotlin หลายแพลตฟอร์ม ดูรายละเอียดเพิ่มเติมได้ที่สร้างไลบรารี Android และ เพิ่มโค้ด C และ C++ ลงในโปรเจ็กต์

  • BuildConfig ชั้นเรียน

    ฟีเจอร์ BuildConfig มีประโยชน์มากที่สุดในสภาพแวดล้อมที่มีหลายตัวแปร เนื่องจากปลั๊กอินไลบรารี Kotlin Multiplatform ใหม่ไม่ขึ้นอยู่กับตัวแปร และไม่รองรับประเภทบิลด์และ Product Flavor เราจึงไม่ได้ใช้ฟีเจอร์นี้ เราขอแนะนำให้ใช้BuildKonfigปลั๊กอิน หรือโซลูชันชุมชนที่คล้ายกันเพื่อสร้างข้อมูลเมตาสำหรับเป้าหมายทั้งหมดแทน

สิ่งที่ต้องมีก่อน

หากต้องการใช้ปลั๊กอิน com.android.kotlin.multiplatform.library คุณต้องกำหนดค่าโปรเจ็กต์ให้มีเวอร์ชันขั้นต่ำต่อไปนี้หรือสูงกว่า

  • ปลั๊กอิน Android Gradle (AGP): 8.10.0
  • ปลั๊กอิน Gradle ของ Kotlin (KGP): 2.0.0

ใช้ปลั๊กอิน Android-KMP กับโมดูลที่มีอยู่

หากต้องการใช้ปลั๊กอิน Android-KMP กับโมดูลไลบรารี 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 = "9.2.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 ที่อยู่ในไดเรกทอรีรากของโปรเจ็กต์ เพิ่มอีเมลแทนของปลั๊กอินลงในบล็อก plugins โดยใช้ apply false ซึ่งจะทำให้ นามแฝงของปลั๊กอินพร้อมใช้งานในโปรเจ็กต์ย่อยทั้งหมดโดยไม่ต้องใช้ตรรกะของปลั๊กอิน กับโปรเจ็กต์รูทเอง

    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
    }

    ดึงดูด

    // 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 เปิดไฟล์ build.gradle.kts ในโมดูลไลบรารี KMP แล้วใช้ปลั๊กอินที่ด้านบนของไฟล์ภายในบล็อก plugins

    Kotlin

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

    ดึงดูด

    // Module-specific build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }
  4. กำหนดค่าเป้าหมาย KMP ของ Android กำหนดค่าบล็อก Kotlin Multiplatform (kotlin) เพื่อกำหนดเป้าหมาย Android ภายในkotlinบล็อก ให้ระบุ เป้าหมาย Android โดยใช้android:

    Kotlin

    kotlin {
       android {
           namespace = "com.example.kmpfirstlib"
           compileSdk = 33
           minSdk = 24
    
           withJava() // enable java compilation support
           withHostTestBuilder {}.configure {}
           withDeviceTestBuilder {
               sourceSetTreeName = "test"
           }
    
           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.) ...
    }

    ดึงดูด

    kotlin {
       android {
           namespace = "com.example.kmpfirstlib"
           compileSdk = 33
           minSdk = 24
    
           withJava() // enable java compilation support
           withHostTestBuilder {}.configure {}
           withDeviceTestBuilder {
               it.sourceSetTreeName = "test"
           }
    
           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 เพื่อใช้การเปลี่ยนแปลง

ย้ายข้อมูลจากปลั๊กอินเดิม

คู่มือนี้จะช่วยคุณย้ายข้อมูลจากปลั๊กอิน com.android.library เดิมไปยังปลั๊กอิน com.android.kotlin.multiplatform.library

1. ย้ายแหล่งข้อมูล

ปลั๊กอินเดิมอนุญาตให้คุณใช้ src/main, src/test และ src/androidTest sourcesets นอกเหนือจาก src/androidMain, src/androidHostTest และ src/androidDeviceTest ปลั๊กอินใหม่จะใช้เฉพาะไดเรกทอรีแหล่งที่มาหลังเท่านั้น ดังนั้นคุณจะต้องย้ายแหล่งที่มาจาก src/main ไปยัง src/androidMain จาก src/test ไปยัง src/androidHostTest และจาก src/androidTest ไปยัง src/androidDeviceTest

2. กำหนดค่าไดเรกทอรีแหล่งที่มาและทรัพยากรที่กำหนดเอง

หากมีแหล่งที่มาหรือทรัพยากรในไดเรกทอรีที่ไม่เป็นไปตามมาตรฐาน คุณจะต้องกำหนดค่าโดยใช้บล็อก sourceSets ก่อนหน้านี้ ปลั๊กอินใหม่นี้ช่วยให้คุณใช้ส่วนขยาย androidComponents เพื่อเพิ่มไดเรกทอรีแหล่งที่มาแบบคงที่ไปยังตัวแปรได้

โปรดทราบว่าเมื่อใช้ปลั๊กอินใหม่ addStaticSourceDirectory วิธีการจะเพิ่ม ไดเรกทอรีลงในรายการไดเรกทอรีแหล่งที่มาที่มีอยู่ เมื่อใช้ปลั๊กอินเวอร์ชันเดิม เมธอด setSrcDirs จะแทนที่รายการ ส่วนเมธอด srcDir จะเพิ่มรายการ

Android-KMP

เมื่อใช้ปลั๊กอินใหม่ ให้ใช้บล็อก onVariants เพื่อโต้ตอบกับแหล่งที่มาของ ตัวแปร

// build.gradle.kts

androidComponents {
    onVariants { variant ->
        // Add a directory for Kotlin sources
        variant.sources.kotlin?.addStaticSourceDirectory("other/kotlin")

        // Add a directory for Android assets
        variant.sources.assets?.addStaticSourceDirectory("other/assets")
    }
}

ปลั๊กอินเดิม

เมื่อใช้ปลั๊กอิน com.android.library บล็อก sourceSets จะใช้เพื่อ ตั้งค่าหรือเพิ่มไดเรกทอรีแหล่งที่มา

// build.gradle.kts

android {
    sourceSets {
        getByName("main") {
            // Replaces the directory for Kotlin sources.
            kotlin.setSrcDirs(listOf("other/kotlin"))

            // Appends a directory for assets.
            assets.srcDir("other/assets")
        }
    }
}

3. ประกาศทรัพยากร Dependency

งานที่พบบ่อยคือการประกาศการขึ้นต่อกันสำหรับชุดแหล่งข้อมูลที่เฉพาะเจาะจงของ Android ปลั๊กอินใหม่กำหนดให้ต้องวางการประกาศเหล่านี้ไว้ภายในบล็อก sourceSets อย่างชัดเจน ซึ่งแตกต่างจากบล็อก dependencies ทั่วไปที่ใช้ก่อนหน้านี้

Android-KMP

ปลั๊กอินใหม่นี้ช่วยให้โครงสร้างสะอาดขึ้นด้วยการจัดกลุ่มทรัพยากร Dependency ของ Android ภายในชุดซอร์ส androidMain นอกจากชุดซอร์สหลักแล้ว ยังมีชุดซอร์สการทดสอบ 2 ชุดซึ่งสร้างขึ้นตามความต้องการ ได้แก่ androidDeviceTest และ androidHostTest (ดูข้อมูลเพิ่มเติมได้ที่การกำหนดค่าการทดสอบโฮสต์และอุปกรณ์)

// build.gradle.kts

kotlin {
    android {}
    //... other targets

    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
        }

        // Dependencies are now scoped to the specific Android source set
        androidMain.dependencies {
            implementation("androidx.appcompat:appcompat:1.7.0")
            implementation("com.google.android.material:material:1.11.0")
        }
    }
}

ชุดแหล่งที่มามีการคอมไพเลชัน Kotlin ที่เกี่ยวข้องซึ่งมีชื่อว่า main, deviceTest และ hostTest คุณกำหนดค่าชุดแหล่งที่มาและการคอมไพล์ได้ใน สคริปต์บิลด์ดังนี้

// build.gradle.kts

kotlin {
    android {
        compilations.getByName("deviceTest") {
            kotlinOptions.languageVersion = "2.0"
        }
    }
}

ปลั๊กอินเดิม

ปลั๊กอินเดิมช่วยให้คุณประกาศการอ้างอิงเฉพาะ Android ใน บล็อกการอ้างอิงระดับบนสุดได้ ซึ่งบางครั้งอาจทำให้เกิดความสับสนใน โมดูลหลายแพลตฟอร์ม

// build.gradle.kts

kotlin {
  androidTarget()
  //... other targets
}

// Dependencies for all source sets were often mixed in one block
dependencies {
  // Common dependencies
  commonMainImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")

  // Android-specific dependencies
  implementation("androidx.appcompat:appcompat:1.7.0")
  implementation("com.google.android.material:material:1.11.0")
}

4. เปิดใช้ทรัพยากร Android

ระบบไม่ได้เปิดใช้การรองรับทรัพยากร Android (โฟลเดอร์ res) โดยค่าเริ่มต้นในปลั๊กอินใหม่เพื่อเพิ่มประสิทธิภาพการสร้าง คุณต้องเลือกใช้เพื่อใช้ทรัพยากรเหล่านั้น การเปลี่ยนแปลงนี้ช่วยให้มั่นใจได้ว่าโปรเจ็กต์ที่ไม่ต้องใช้ทรัพยากรเฉพาะของ Android จะไม่ได้รับภาระจากค่าใช้จ่ายในการสร้างที่เกี่ยวข้อง

Android-KMP

คุณต้องเปิดใช้การประมวลผลทรัพยากร Android อย่างชัดเจน ควรวางทรัพยากรไว้ใน src/androidMain/res

// build.gradle.kts

kotlin {
  android {
    // ...
    // Enable Android resource processing
    androidResources {
      enable = true
    }
  }
}

// Project Structure
// └── src
//     └── androidMain
//         └── res
//             ├── values
//             │   └── strings.xml
//             └── drawable
//                 └── icon.xml

ปลั๊กอินเดิม

ระบบเปิดใช้การประมวลผลทรัพยากรโดยค่าเริ่มต้น คุณสามารถเพิ่มไดเรกทอรี res ใน src/main และเริ่มเพิ่ม Drawable, ค่า XML ฯลฯ ได้ทันที

// build.gradle.kts

android {
    namespace = "com.example.library"
    compileSdk = 34
    // No extra configuration was needed to enable resources.
}

// Project Structure
// └── src
//     └── main
//         └── res
//             ├── values
//             │   └── strings.xml
//             └── drawable
//                 └── icon.xml

5. กำหนดค่าการทดสอบโฮสต์และอุปกรณ์

โดยค่าเริ่มต้น ปลั๊กอินใหม่จะปิดใช้การทดสอบฝั่งโฮสต์ (หน่วย) และฝั่งอุปกรณ์ (ทดสอบเครื่องมือ) ของ Android คุณต้องเลือกใช้โดยชัดแจ้งเพื่อสร้างชุดแหล่งที่มาและการกำหนดค่าการทดสอบ ในขณะที่ปลั๊กอินเดิมจะสร้างโดยอัตโนมัติ

โมเดลการเลือกใช้นี้ช่วยยืนยันว่าโปรเจ็กต์ของคุณยังคงมีขนาดเล็กและมีเฉพาะตรรกะการสร้างและชุดแหล่งที่มาที่คุณใช้งานอยู่

Android-KMP

ปลั๊กอินใหม่ช่วยให้คุณเปิดใช้และกำหนดค่าการทดสอบภายในบล็อก kotlin.android ได้ ซึ่งจะทำให้การตั้งค่าชัดเจนยิ่งขึ้นและหลีกเลี่ยง การสร้างคอมโพเนนต์การทดสอบที่ไม่ได้ใช้ ชุดซอร์ส androidUnitTest จะกลายเป็น androidHostTest (ไดเรกทอรีการทดสอบเปลี่ยนจาก src/androidUnitTest เป็น src/androidHostTest) และ androidInstrumentedTest จะกลายเป็น androidDeviceTest (ไดเรกทอรีการทดสอบเปลี่ยนจาก src/androidInstrumentedTest เป็น src/androidDeviceTest)

// build.gradle.kts

kotlin {
  android {
    // ...

    // Opt-in to enable and configure host-side (unit) tests
    withHostTest {
      isIncludeAndroidResources = true
    }

    // Opt-in to enable and configure device-side (instrumented) tests
    withDeviceTest {
      instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
      execution = "HOST"
    }
  }
}

// Project Structure (After Opt-in)
// └── src
//     ├── androidHostTest
//     └── androidDeviceTest

ปลั๊กอินเดิม

com.android.libraryปลั๊กอินจะสร้างชุดแหล่งที่มา androidUnitTest และ androidInstrumentedTest โดยค่าเริ่มต้น คุณ กำหนดค่าลักษณะการทำงานของชุดแหล่งที่มาภายในบล็อก android โดยปกติจะใช้ testOptions DSL

// build.gradle.kts

android {
  defaultConfig {
    // Runner was configured in defaultConfig
    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
  }

  testOptions {
    // Configure unit tests (for the 'test' source set)
    unitTests.isIncludeAndroidResources = true

    // Configure device tests (for the 'androidTest' source set)
    execution = "HOST"
  }
}

// Project Structure (Defaults)
// └── src
//     ├── test
//     └── androidTest

6. เปิดใช้การคอมไพล์แหล่งที่มาของ Java

หากไลบรารี KMP ต้องคอมไพล์แหล่งที่มาของ Java สำหรับเป้าหมาย Android คุณ ต้องเปิดใช้ฟังก์ชันนี้อย่างชัดเจนด้วยปลั๊กอินใหม่ โปรดทราบว่าการดำเนินการนี้จะ เปิดใช้การคอมไพล์สำหรับไฟล์ Java ที่อยู่ในโปรเจ็กต์โดยตรง ไม่ใช่สำหรับ การอ้างอิงของไฟล์ นอกจากนี้ วิธีตั้งค่า JVM เวอร์ชันเป้าหมายของคอมไพเลอร์ Java และ Kotlin ก็จะเปลี่ยนไปด้วย

Android-KMP

คุณต้องเลือกใช้การคอมไพล์ Java โดยโทรหา withJava() ตอนนี้คุณกำหนดค่าเป้าหมาย JVM ได้โดยตรงภายในบล็อก kotlin { android {} } เพื่อให้การตั้งค่าเป็นไปในทิศทางเดียวกันมากขึ้น การตั้งค่า jvmTarget ที่นี่จะมีผลกับการคอมไพล์ทั้ง Kotlin และ Java สำหรับเป้าหมาย Android

// build.gradle.kts

kotlin {
  android {
    //  Opt-in to enable Java source compilation
    withJava()
    // Configure the JVM target for both Kotlin and Java sources
    compilerOptions {
      jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8)
    }
  }
  // ...
}

// Project Structure:
// └── src
//     └── androidMain
//         ├── kotlin
//         │   └── com/example/MyKotlinClass.kt
//         └── java
//             └── com.example/MyJavaClass.java

ปลั๊กอินเดิม

ระบบจะเปิดใช้การคอมไพล์ Java โดยค่าเริ่มต้น ตั้งค่าเป้าหมาย JVM สำหรับทั้งแหล่งที่มาของ Java และ Kotlin ในบล็อก android โดยใช้ compileOptions

// build.gradle.kts

android {
  // ...
  compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
  }
}

kotlin {
  androidTarget {
    compilations.all {
      kotlinOptions.jvmTarget = "1.8"
    }
  }
}

7. โต้ตอบกับตัวแปรบิลด์โดยใช้ androidComponents

androidComponents ยังคงพร้อมให้ใช้งานสำหรับการโต้ตอบกับอาร์ติแฟกต์บิลด์ โดยใช้โปรแกรม แม้ว่า Variant API จะยังคงเหมือนเดิม แต่AndroidKotlinMultiplatformVariant อินเทอร์เฟซใหม่จะจำกัดมากขึ้นเนื่องจาก ปลั๊กอินจะสร้างได้เพียงตัวแปรเดียว

ดังนั้น พร็อพเพอร์ตี้ที่เกี่ยวข้องกับประเภทบิลด์และผลิตภัณฑ์จึงไม่ พร้อมใช้งานในออบเจ็กต์ตัวแปรอีกต่อไป

Android-KMP

ตอนนี้onVariants บล็อกจะวนซ้ำในตัวแปรเดียว คุณยังคงเข้าถึงพร็อพเพอร์ตี้ทั่วไป เช่น name และ artifacts ได้ แต่จะเข้าถึงพร็อพเพอร์ตี้ที่เฉพาะเจาะจงประเภทบิลด์ไม่ได้

// build.gradle.kts

androidComponents {
  onVariants { variant ->
      val artifacts = variant.artifacts
  }
}

ปลั๊กอินเดิม

ตัวแปรหลายรายการช่วยให้คุณเข้าถึงพร็อพเพอร์ตี้เฉพาะประเภทบิลด์เพื่อ กำหนดค่าทาสก์ได้

// build.gradle.kts

androidComponents {
  onVariants(selector().withBuildType("release")) { variant ->
    // ...
  }
}

8. เลือกตัวแปรของทรัพยากร Dependency ของไลบรารี Android

ไลบรารี KMP จะสร้างตัวแปรเดียวสำหรับ Android อย่างไรก็ตาม คุณอาจ ต้องใช้ไลบรารี Android มาตรฐาน (com.android.library) ที่มีหลาย รูปแบบ (เช่น free/paid รสชาติของผลิตภัณฑ์) การควบคุมวิธีที่โปรเจ็กต์เลือกตัวแปรจากทรัพยากร Dependency นั้นเป็นข้อกำหนดทั่วไป

Android-KMP

ปลั๊กอินใหม่จะรวมและอธิบายตรรกะนี้ไว้ภายในบล็อก kotlin.android.localDependencySelection ซึ่งจะช่วยให้เห็นได้ชัดเจนยิ่งขึ้นว่าระบบจะเลือกการขึ้นต่อกันภายนอกเวอร์ชันใดสำหรับไลบรารี KMP แบบเวอร์ชันเดียว

// build.gradle.kts
kotlin {
  android {
    localDependencySelection {
      // For dependencies with multiple build types, select 'debug' first, and 'release' in case 'debug' is missing
      selectBuildTypeFrom.set(listOf("debug", "release"))

      // For dependencies with a 'type' flavor dimension...
      productFlavorDimension("type") {
        // ...select the 'typeone' flavor.
        selectFrom.set(listOf("typeone"))
      }
    }
  }
}

ปลั๊กอินเดิม

คุณกำหนดค่ากลยุทธ์การเลือกการขึ้นต่อกันภายในบล็อก buildTypes and productFlavors ซึ่งมักเกี่ยวข้องกับการใช้ missingDimensionStrategy เพื่อระบุรสชาติเริ่มต้นสำหรับมิติข้อมูลที่ไม่มีในคลัง หรือ matchingFallbacks ภายในรสชาติที่เฉพาะเจาะจงเพื่อกำหนดลำดับการค้นหา

โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้งาน API ที่หัวข้อแก้ไขข้อผิดพลาดในการจับคู่

9. เพิ่มการอ้างอิงตัวอย่าง Compose

โดยปกติแล้ว เราต้องการให้ไลบรารีที่เฉพาะเจาะจงอยู่ในขอบเขตของสภาพแวดล้อมการพัฒนาในเครื่องเพื่อป้องกันไม่ให้เครื่องมือภายในรั่วไหลไปยังอาร์ติแฟกต์ที่เผยแพร่ขั้นสุดท้าย ซึ่งเป็นความท้าทายของปลั๊กอิน Android KMP ใหม่เนื่องจากปลั๊กอินนี้จะนำสถาปัตยกรรมประเภทบิลด์ที่ใช้เพื่อแยกทรัพยากร Dependency ในการพัฒนาออกจากโค้ดที่เผยแพร่ออกไป

Android-KMP

หากต้องการเพิ่มทรัพยากร Dependency สำหรับการพัฒนาซอฟต์แวร์และการทดสอบในเครื่องเท่านั้น ให้เพิ่มทรัพยากร Dependency โดยตรงไปยังการกำหนดค่า classpath ของรันไทม์ (ในบล็อก dependenciesระดับบนสุด) ของการคอมไพล์ Android หลัก ซึ่งจะช่วยให้มั่นใจได้ว่าทรัพยากร Dependency จะพร้อมใช้งานในรันไทม์ (เช่น สำหรับเครื่องมืออย่าง Compose Preview) แต่ไม่ได้เป็นส่วนหนึ่งของ classpath ของการคอมไพล์หรือ API ที่เผยแพร่ของไลบรารี

// build.gradle.kts
dependencies {
  "androidRuntimeClasspath"(libs.androidx.compose.ui.tooling)
}

ปลั๊กอินเดิม

โปรเจ็กต์ Kotlin Multiplatform ที่ใช้ปลั๊กอิน com.android.library สำหรับเป้าหมาย Android ควรใช้การกำหนดค่า debugImplementation ซึ่งกำหนดขอบเขตทรัพยากร Dependency ไปยังประเภทบิลด์การแก้ไขข้อบกพร่องและป้องกันไม่ให้รวมไว้ในตัวแปรการเผยแพร่ของไลบรารีที่ผู้บริโภคใช้

// build.gradle.kts
dependencies {
  debugImplementation(libs.androidx.compose.ui.tooling)
}

10. กำหนดค่าเป้าหมาย JVM สำหรับเป้าหมาย KMP Android

ปลั๊กอิน Android KMP จะตั้งค่าเป้าหมาย JVM โดยใช้ android.compilerOptions.jvmTarget ซึ่งใช้ได้กับทั้ง Java และ Kotlin ทำให้การกำหนดค่าง่ายขึ้นเมื่อเทียบกับบล็อก compileOptions และ kotlinOptions แยกกันในโปรเจ็กต์ Android ล้วน

Android-KMP

เมื่อทำงานกับโปรเจ็กต์ Kotlin Multiplatform (KMP) ที่มีเป้าหมาย Android คุณจะมีหลายวิธีในการกำหนดค่าเวอร์ชันเป้าหมาย JVM สำหรับทั้งคอมไพเลอร์ Kotlin และ Java การทําความเข้าใจขอบเขตและลําดับชั้นของการกําหนดค่าเหล่านี้เป็นกุญแจสําคัญในการจัดการความเข้ากันได้ของไบต์โค้ดของโปรเจ็กต์

ต่อไปนี้คือ 3 วิธีหลักในการตั้งค่าเป้าหมาย JVM โดยเรียงจากลำดับความสำคัญต่ำสุดไปสูงสุด ค่าเป้าหมาย JVM ที่มีลำดับความสำคัญสูงกว่าจะใช้กับชุดย่อยที่เล็กกว่าของเป้าหมายที่กำหนดค่าไว้ และจะลบล้างค่าที่มีลำดับความสำคัญต่ำกว่า ซึ่งหมายความว่าคุณสามารถตั้งค่า JVM เวอร์ชันต่างๆ สำหรับเป้าหมายและการคอมไพล์ต่างๆ ภายในเป้าหมายในโปรเจ็กต์ได้

การใช้ Toolchain ของ Kotlin (ลำดับความสำคัญต่ำสุด)

วิธีที่ทั่วไปที่สุดในการตั้งค่าเป้าหมาย JVM คือการระบุ Toolchain ในบล็อก kotlin ของไฟล์ build.gradle.kts วิธีนี้จะกำหนดเป้าหมายสำหรับทั้งงานการคอมไพล์ Kotlin และ Java ในเป้าหมายที่อิงตาม JVM ทั้งหมดในโปรเจ็กต์ รวมถึง Android

// build.gradle.kts
kotlin {
    jvmToolchain(21)
}

การกำหนดค่านี้ทำให้ทั้ง kotlinc และ javac กำหนดเป้าหมายเป็น JVM 21 ซึ่งเป็นวิธีที่ยอดเยี่ยมในการสร้างพื้นฐานที่สอดคล้องกันสำหรับทั้งโปรเจ็กต์

การใช้ตัวเลือกคอมไพเลอร์ระดับเป้าหมายของ Android (ลำดับความสำคัญปานกลาง)

คุณระบุเป้าหมาย JVM สำหรับเป้าหมาย KMP ของ Android โดยเฉพาะได้ ภายในบล็อก android การตั้งค่านี้จะลบล้างการกำหนดค่า jvmToolchain ทั่วทั้งโปรเจ็กต์และมีผลกับการคอมไพล์ Android ทั้งหมด

// build.gradle.kts
kotlin {
    android {
        compilerOptions {
            jvmTarget.set(JvmTarget.JVM_11)
        }
    }
}

ในกรณีนี้ แม้ว่าจะตั้งค่า jvmToolchain เป็นเวอร์ชันอื่น แต่ระบบจะคอมไพล์โค้ด Kotlin และ Java ของเป้าหมาย Android เพื่อกำหนดเป้าหมาย JVM 11

การใช้ตัวเลือกคอมไพเลอร์ระดับการคอมไพล์ (ลำดับความสำคัญสูงสุด)

หากต้องการควบคุมแบบละเอียดที่สุด คุณสามารถกำหนดค่าตัวเลือกคอมไพเลอร์ในแต่ละการคอมไพล์ (เช่น ใน androidMain หรือ androidHostTest เท่านั้น) ซึ่งจะเป็นประโยชน์หากการคอมไพล์ที่เฉพาะเจาะจงต้องกำหนดเป้าหมายเป็น JVM เวอร์ชันอื่น การตั้งค่านี้จะลบล้างทั้ง Toolchain ของ Kotlin และ ตัวเลือกที่ระดับเป้าหมายของ Android

// build.gradle.kts
kotlin {
    android {
        compilations.all {
            compileTaskProvider.configure {
                compilerOptions.jvmTarget.set(JvmTarget.JVM_11)
            }
        }
    }
}

การกำหนดค่านี้ช่วยให้มั่นใจได้ว่าการคอมไพล์ทั้งหมดภายในเป้าหมาย Android จะใช้ JVM 11 ซึ่งช่วยให้ควบคุมได้อย่างละเอียด

ปลั๊กอินเดิม

ในโปรเจ็กต์ KMP ที่ใช้ปลั๊กอินไลบรารี Android มาตรฐาน (com.android.library) การกำหนดค่าจะแตกต่างเล็กน้อยจากเมื่อ คุณใช้ปลั๊กอิน Android KMP (แต่ในเชิงแนวคิดจะคล้ายกัน)

การใช้ชุดเครื่องมือ Kotlin

เมธอด kotlin.jvmToolchain() จะทำงานในลักษณะเดียวกัน โดยตั้งค่า sourceCompatibility และ targetCompatibility สำหรับ Java และ jvmTarget สำหรับ Kotlin เราขอแนะนำให้ใช้วิธีนี้

// build.gradle.kts
kotlin {
    jvmToolchain(21)
}

compileOptions และ kotlinOptions

หากไม่ได้ใช้ Toolchain Kotlin คุณจะต้องกำหนดค่าเป้าหมาย JVM โดยใช้บล็อกแยกต่างหากสำหรับ Java และ Kotlin

// build.gradle.kts
android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }

    kotlinOptions {
        jvmTarget = "11"
    }
}

11. เผยแพร่กฎการเก็บรักษาของผู้บริโภค

หากไลบรารี KMP ต้องจัดส่งกฎการเก็บรักษาสำหรับผู้ใช้ (เช่น กฎ ProGuard สำหรับ R8) ให้แก่ผู้ใช้ คุณต้องเปิดใช้การเผยแพร่อย่างชัดเจนด้วยปลั๊กอินใหม่ ก่อนหน้านี้ กฎการเก็บรักษาสำหรับผู้ใช้จะได้รับการเผยแพร่โดยค่าเริ่มต้นหากมีการระบุ

Android-KMP

ปลั๊กอินใหม่กำหนดให้คุณต้องตั้งค่า optimization.consumerKeepRules.publish = true และระบุไฟล์กฎ ภายในบล็อก consumerKeepRules เพื่อเผยแพร่กฎการเก็บรักษาสำหรับผู้บริโภค

// build.gradle.kts
kotlin {
  android {
    optimization {
      consumerKeepRules.apply {
        publish = true
        file("consumer-proguard-rules.pro")
      }
    }
  }
}

ปลั๊กอินเดิม

เมื่อใช้ com.android.library ระบบจะเผยแพร่ไฟล์กฎที่ระบุด้วย consumerProguardFiles ใน android.defaultConfig เป็นอาร์ติแฟกต์ของไลบรารีโดยค่าเริ่มต้น

// build.gradle.kts
android {
  defaultConfig {
    consumerProguardFiles("consumer-proguard-rules.pro")
  }
}

12. เผยแพร่ไลบรารีไปยัง Maven

หากคุณวางแผนที่จะเผยแพร่ไลบรารี KMP ไปยัง Maven เพื่อให้โปรเจ็กต์อื่นๆ ใช้ได้ กระบวนการจะแตกต่างกันไปตามว่าคุณใช้ปลั๊กอิน Android-KMP ใหม่หรือปลั๊กอินเดิม

Android-KMP

ปลั๊กอิน com.android.kotlin.multiplatform.library ผสานรวมกับ กลไกการเผยแพร่ Kotlin Multiplatform มาตรฐาน ไม่จำเป็นต้องมีขั้นตอนเฉพาะสำหรับ Android นอกเหนือจากกระบวนการเผยแพร่ไลบรารี KMP มาตรฐาน

หากต้องการเผยแพร่ไลบรารี ให้ทำตามเอกสารประกอบอย่างเป็นทางการของ JetBrains ดังนี้ ตั้งค่าการเผยแพร่สำหรับไลบรารีแบบหลายแพลตฟอร์ม

ปลั๊กอินเดิม

เมื่อใช้ com.android.library สำหรับเป้าหมาย Android ในโปรเจ็กต์ KMP คุณต้องทำตามคำแนะนำในการเผยแพร่ไลบรารี Android มาตรฐานเพื่อ เตรียมและเผยแพร่อาร์ติแฟกต์เฉพาะ Android (.aar)

ดูวิธีการอย่างละเอียดได้ที่เตรียมไลบรารีสำหรับการเผยแพร่

เอกสารอ้างอิง API ของปลั๊กอิน

ปลั๊กอินใหม่มี API ที่แตกต่างจาก com.android.library ดูข้อมูลโดยละเอียดเกี่ยวกับ DSL และอินเทอร์เฟซใหม่ได้ที่เอกสารอ้างอิง API

ปัญหาที่ทราบเกี่ยวกับปลั๊กอินไลบรารี Android-KMP

ปัญหาที่ทราบซึ่งอาจเกิดขึ้นเมื่อใช้ปลั๊กอิน com.android.kotlin.multiplatform.library ใหม่มีดังนี้