บันทึกประจำรุ่นสำหรับตัวอย่างปลั๊กอิน Android Gradle

หน้านี้มีบันทึกประจำรุ่นสำหรับการเปิดตัวเวอร์ชันตัวอย่างของปลั๊กอิน Android Gradle (AGP)

ปลั๊กอิน Android Gradle 9.0

ปลั๊กอิน Android Gradle 9.0 เป็นรุ่นหลักใหม่ของ AGP และมีการเปลี่ยนแปลง API และลักษณะการทำงาน

หากต้องการอัปเดตเป็นปลั๊กอิน Android Gradle 9.0.0-beta03 ให้ใช้ ผู้ช่วยอัปเกรดปลั๊กอิน Android Gradle ใน การอัปเดตฟีเจอร์ใหม่ของ Android Studio Otter 3 | 2025.2.3

ผู้ช่วยการอัปเกรด AGP จะช่วยรักษาลักษณะการทำงานที่มีอยู่เมื่ออัปเกรดโปรเจ็กต์ในกรณีที่เหมาะสม ซึ่งจะช่วยให้คุณอัปเกรดโปรเจ็กต์เพื่อใช้ AGP 9.0 ได้ แม้ว่าคุณจะยังไม่พร้อมที่จะใช้ค่าเริ่มต้นใหม่ทั้งหมดใน AGP 9.0 ก็ตาม

ความเข้ากันได้

API ระดับสูงสุดของ Android ที่ปลั๊กอิน Android Gradle 9.0.0-beta03 รองรับคือ API ระดับ 36

ปลั๊กอิน Android Gradle 9.0.0-beta03 ต้องใช้ Gradle 9.0.0

เวอร์ชันขั้นต่ำ เวอร์ชันเริ่มต้น หมายเหตุ
Gradle 9.1.0 9.1.0 ดูข้อมูลเพิ่มเติมได้ที่การอัปเดต Gradle
เครื่องมือสร้าง SDK 36.0.0 36.0.0 ติดตั้งหรือกำหนดค่าเครื่องมือสร้าง SDK
NDK ไม่มี 28.2.13676358 ติดตั้งหรือกำหนดค่า NDK เวอร์ชันอื่น
JDK 17 17 ดูข้อมูลเพิ่มเติมได้ที่การตั้งค่าเวอร์ชัน JDK

android ตอนนี้คลาส DSL จะใช้เฉพาะอินเทอร์เฟซสาธารณะใหม่เท่านั้น

ในช่วงหลายปีที่ผ่านมา เราได้เปิดตัวอินเทอร์เฟซใหม่สำหรับ DSL และ API เพื่อให้ควบคุมได้ดียิ่งขึ้นว่า API ใดเป็นแบบสาธารณะ AGP เวอร์ชัน 7.x และ 8.x ยังคงใช้ประเภท DSL แบบเก่า (เช่น BaseExtension) ซึ่ง ยังได้ใช้การติดตั้งใช้งานอินเทอร์เฟซสาธารณะใหม่ด้วย เพื่อรักษาความเข้ากันได้ ขณะที่การทำงานในอินเทอร์เฟซดำเนินต่อไป

AGP 9.0 จะใช้อินเทอร์เฟซ DSL ใหม่ของเราเท่านั้น และการใช้งานได้เปลี่ยนเป็นประเภทใหม่ที่ซ่อนไว้อย่างสมบูรณ์ การดำเนินการนี้ ยังเป็นการนำสิทธิ์เข้าถึง API ของตัวแปรเก่าที่เลิกใช้งานแล้วออกด้วย

หากต้องการอัปเดตเป็น AGP 9.0 คุณอาจต้องดำเนินการต่อไปนี้

  • ตรวจสอบว่าโปรเจ็กต์ของคุณใช้งานได้กับ Kotlin ในตัว:ปลั๊กอิน org.jetbrains.kotlin.android ใช้ไม่ได้กับ DSL ใหม่
  • เปลี่ยนโปรเจ็กต์ KMP ไปใช้ ปลั๊กอินไลบรารี Android Gradle สำหรับ KMP: การใช้ปลั๊กอิน org.jetbrains.kotlin.multiplatform ในโปรเจ็กต์ย่อย Gradle เดียวกันกับปลั๊กอิน com.android.library และ com.android.application ไม่สามารถใช้ร่วมกับ DSL ใหม่ได้

  • อัปเดตไฟล์บิลด์: แม้ว่าการเปลี่ยนแปลงอินเทอร์เฟซจะมุ่งเน้นให้ DSL มีความคล้ายคลึงกันมากที่สุด แต่ก็อาจมีการเปลี่ยนแปลงเล็กๆ น้อยๆ

  • อัปเดตตรรกะการสร้างที่กำหนดเองเพื่ออ้างอิง DSL และ API ใหม่ แทนที่การอ้างอิง DSL ภายในด้วยอินเทอร์เฟซ DSL สาธารณะ ในกรณีส่วนใหญ่ การดำเนินการนี้จะเป็นการแทนที่แบบ 1:1 แทนที่การใช้ applicationVariants และ API ที่คล้ายกันด้วย androidComponents API ใหม่ ซึ่งอาจซับซ้อนกว่าเนื่องจาก androidComponents API ได้รับการออกแบบมาให้มีความเสถียรมากขึ้นเพื่อให้ปลั๊กอินใช้งานร่วมกันได้นานขึ้น ดูตัวอย่างได้ที่ สูตร Gradle

  • อัปเดตปลั๊กอินของบุคคลที่สาม: ปลั๊กอินของบุคคลที่สามบางรายการอาจยังคงขึ้นอยู่กับอินเทอร์เฟซหรือ API ที่ ไม่ได้เปิดเผยอีกต่อไป ย้ายข้อมูลไปยังปลั๊กอินเวอร์ชันที่เข้ากันได้ กับ AGP 9.0

การเปลี่ยนไปใช้อินเทอร์เฟซ DSL ใหม่จะป้องกันไม่ให้ปลั๊กอินและสคริปต์บิลด์ Gradle ใช้ API ที่เลิกใช้งานแล้วต่างๆ ซึ่งรวมถึง

API ที่เลิกใช้งานแล้วในบล็อก android การทำงาน การแทนที่
applicationVariants,
libraryVariants,
testVariants และ
unitTestVariants
จุดขยายสำหรับปลั๊กอินเพื่อเพิ่มฟังก์ชันการทำงานใหม่ๆ ให้กับ AGP แทนที่ด้วย androidComponents.onVariants API เช่น
androidComponents {
    onVariants() { variant ->
        variant.signingConfig
            .enableV1Signing.set(false)
    }
}
API ก่อนหน้าบางรายการอาจไม่มี API ใหม่มาแทนที่โดยตรง ยื่นปัญหาหากมี Use Case ที่ API ตัวแปรใหม่ไม่ครอบคลุม
variantFilter อนุญาตให้ปิดใช้ตัวแปรที่เลือก แทนที่ด้วย androidComponents.beforeVariants API เช่น
androidComponents {
    beforeVariants(
        selector()
            .withBuildType("debug")
            .withFlavor("color", "blue")
    ) { variantBuilder ->
        variantBuilder.enable = false
    }
  }
deviceProvider และ
testServer
การลงทะเบียนสภาพแวดล้อมการทดสอบที่กำหนดเองเพื่อเรียกใช้การทดสอบกับ อุปกรณ์และโปรแกรมจำลอง Android เปลี่ยนไปใช้อุปกรณ์ที่มีการจัดการจาก Gradle
sdkDirectory,
ndkDirectory,
bootClasspath,
adbExecutable และ
adbExe
การใช้คอมโพเนนต์ต่างๆ ของ Android SDK สำหรับงานที่กำหนดเอง เปลี่ยนไปใช้ androidComponents.sdkComponents
registerArtifactType,
registerBuildTypeSourceProvider,
registerProductFlavorSourceProvider,
registerJavaArtifact,
registerMultiFlavorSourceProvider และ
wrapJavaSourceSet
ฟังก์ชันที่เลิกใช้งานแล้วส่วนใหญ่เกี่ยวข้องกับการจัดการแหล่งที่มาที่สร้างขึ้นใน Android Studio ซึ่งหยุดทำงานใน AGP 7.2.0 ไม่มี API ที่จะมาแทนที่ API เหล่านี้โดยตรง
dexOptions การตั้งค่าที่ล้าสมัยซึ่งเกี่ยวข้องกับdxเครื่องมือที่ถูกแทนที่ด้วย d8 การตั้งค่าทั้งหมด ไม่มีผลตั้งแต่ปลั๊กอิน Android Gradle 7.0 ไม่มีการแทนที่โดยตรง
generatePureSplits สร้างการแยกการกำหนดค่าสำหรับ Instant App ตอนนี้ความสามารถในการแยกการกำหนดค่าได้รวมอยู่ใน App Bundle ของ Android แล้ว
aidlPackagedList ไฟล์ AIDL ที่จะแพ็กเกจใน AAR เพื่อเปิดเผยเป็น API สำหรับไลบรารี และแอปที่ขึ้นอยู่กับไลบรารีนี้ ซึ่งยังคงแสดงใน LibraryExtension แต่จะไม่แสดงในส่วนขยายประเภทอื่นๆ

หากอัปเดตเป็น AGP 9.0 และเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้ แสดงว่า โปรเจ็กต์ของคุณยังอ้างอิงประเภทเก่าบางประเภทอยู่

java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension

หากถูกปลั๊กอินของบุคคลที่สามที่ไม่รองรับบล็อก คุณสามารถเลือกไม่ใช้และ กลับไปใช้การติดตั้งใช้งานเก่าสำหรับ DSL รวมถึง API ตัวแปรเก่าได้ ในระหว่างนี้ อินเทอร์เฟซใหม่จะพร้อมใช้งาน และคุณยังคง อัปเดตตรรกะการสร้างของคุณเองเป็น API ใหม่ได้ หากต้องการเลือกไม่ใช้ ให้ใส่บรรทัดนี้ใน ไฟล์ gradle.properties ของคุณ

android.newDsl=false

นอกจากนี้ คุณยังเริ่มอัปเกรดเป็น API ใหม่ก่อนอัปเกรดเป็น AGP 9.0 ได้ด้วย อินเทอร์เฟซใหม่มีอยู่ใน AGP หลายเวอร์ชัน คุณจึงใช้ทั้งเวอร์ชันใหม่และเวอร์ชันเก่าได้ เอกสารอ้างอิง AGP API แสดง API Surface สำหรับ AGP แต่ละเวอร์ชัน และเวลาที่เพิ่มคลาส เมธอด และฟิลด์แต่ละรายการ

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

หากพบว่า DSL หรือ Variant API ใหม่ไม่มีความสามารถหรือ ฟีเจอร์บางอย่าง โปรดรายงานปัญหาโดยเร็วที่สุด

Kotlin ในตัว

ปลั๊กอิน Android Gradle 9.0 เปิดตัวการรองรับ Kotlin ในตัวและเปิดใช้โดยค่าเริ่มต้น ซึ่งหมายความว่าคุณไม่จำเป็นต้องใช้ปลั๊กอิน org.jetbrains.kotlin.android (หรือ kotlin-android) ในไฟล์บิลด์อีกต่อไป เพื่อคอมไพล์ไฟล์ต้นฉบับ Kotlin ซึ่งจะช่วยลดความซับซ้อนของการผสานรวม Kotlin กับ AGP, หลีกเลี่ยงการใช้ API ที่เลิกใช้งานแล้ว และปรับปรุงประสิทธิภาพในบางกรณี

ดังนั้น เมื่ออัปเกรดโปรเจ็กต์เป็น AGP 9.0 คุณจะต้องย้ายไปใช้ Kotlin ในตัวหรือเลือกไม่ใช้ด้วย

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

การขึ้นอยู่กับปลั๊กอิน Kotlin Gradle 2.2.10 ในรันไทม์

ปลั๊กอิน Android Gradle 9.0 มีทรัพยากร Dependency รันไทม์ในปลั๊กอิน Kotlin Gradle (KGP) 2.2.10 ซึ่งเป็นเวอร์ชันขั้นต่ำที่จำเป็นสำหรับ การรองรับ Kotlin ในตัว

ซึ่งหมายความว่าหากคุณเลือกใช้ Kotlin ในตัวและใช้ KGP เวอร์ชันต่ำกว่า 2.2.10 Gradle จะอัปเกรด KGP เป็นเวอร์ชัน 2.2.10 โดยอัตโนมัติ

ในทำนองเดียวกัน หากคุณใช้ KSP เวอร์ชันต่ำกว่า 2.2.10-2.0.2 AGP จะ อัปเกรด KSP เป็นเวอร์ชัน 2.2.10-2.0.2 เพื่อให้ตรงกับ KGP

ดังนั้น หากเลือกไม่ใช้ Kotlin ในตัวและต้องการใช้ KGP หรือ KSP เวอร์ชันเก่า คุณต้องเพิ่มข้อมูลต่อไปนี้ลงในไฟล์บิลด์ระดับบนสุด

buildscript {
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
            version { strictly("KGP_VERSION") }
        }
        classpath("com.google.devtoolsksp:symbol-processing-gradle-plugin") {
            version { strictly("KSP_VERSION") }
        }
    }
}

การรองรับ IDE สำหรับการทดสอบ

AGP 9.0 รองรับ IDE ของ Android Studio อย่างเต็มรูปแบบสำหรับ การตั้งค่าการทดสอบ หากต้องการรับการสนับสนุนนี้ ให้ใช้ AGP 9.0.0-alpha07 ขึ้นไป

การเปลี่ยนแปลงลักษณะการทำงาน

ปลั๊กอิน Android Gradle 9.0 มีลักษณะการทํางานใหม่ดังนี้

ลักษณะการทำงาน คำแนะนำ
ปลั๊กอิน Android Gradle 9.0 ใช้ NDK เวอร์ชัน r28c โดยค่าเริ่มต้น โปรดระบุเวอร์ชัน NDK ที่ต้องการใช้อย่างชัดเจน
Android Gradle Plugin 9.0 กำหนดให้ผู้ใช้ไลบรารีต้องใช้ SDK เวอร์ชันเดียวกันหรือสูงกว่าในการคอมไพล์โดยค่าเริ่มต้น ใช้ SDK ที่คอมไพล์เดียวกันหรือสูงกว่าเมื่อใช้ไลบรารี หากทำไม่ได้ หรือต้องการให้ผู้ใช้ไลบรารีที่คุณ เผยแพร่มีเวลามากขึ้นในการเปลี่ยน ให้ตั้งค่า AarMetadata.minCompileSdk อย่างชัดเจน

AGP 9.0 มีการอัปเดตค่าเริ่มต้นของพร็อพเพอร์ตี้ Gradle ต่อไปนี้ ซึ่งจะช่วยให้คุณเลือกที่จะคงลักษณะการทำงานของ AGP 8.13 ไว้เมื่ออัปเกรดได้

พร็อพเพอร์ตี้ การทำงาน เปลี่ยนจาก AGP 8.13 เป็น AGP 9.0 คำแนะนำ
android.newDsl ใช้อินเทอร์เฟซ DSL ใหม่โดยไม่ต้องเปิดเผยการใช้งานเดิมของบล็อก android
นอกจากนี้ ยังหมายความว่าคุณจะเข้าถึง API ตัวแปรเดิม เช่น android.applicationVariants ไม่ได้อีกต่อไป
falsetrue คุณเลือกไม่รับได้โดยการตั้งค่า android.newDsl=false
เมื่อปลั๊กอินและตรรกะการบิลด์ทั้งหมดที่โปรเจ็กต์ของคุณใช้เข้ากันได้แล้ว ให้นำการเลือกไม่ใช้ออก
android.builtInKotlin เปิดใช้ Kotlin ในตัว falsetrue ย้ายข้อมูลไปยัง Kotlin ในตัว หากทำได้ หรือ เลือกไม่ใช้
android.uniquePackageNames บังคับให้แต่ละไลบรารีมีชื่อแพ็กเกจที่แตกต่างกัน falsetrue ระบุชื่อแพ็กเกจที่ไม่ซ้ำกันสำหรับไลบรารีทั้งหมดภายในโปรเจ็กต์ หากทำไม่ได้ คุณสามารถปิดใช้ฟีเจอร์นี้ขณะย้ายข้อมูล
android.useAndroidx ใช้ทรัพยากร Dependency ของ androidx โดยค่าเริ่มต้น falsetrue ใช้ androidx ทรัพยากร Dependency
android.default.androidx.test.runner เรียกใช้การทดสอบในอุปกรณ์ด้วยคลาส androidx.test.runner.AndroidJUnitRunner โดยค่าเริ่มต้น ซึ่งจะแทนที่ค่าเริ่มต้นของ InstrumentationTestRunner ที่เลิกใช้งานแล้วสำหรับ
android {
  defaultConfig {
    testInstrumentationRunner = "..."
  }
}
falsetrue ใช้ AndroidJUnitRunner หรือระบุ testInstrumentationRunner ที่กำหนดเองอย่างชัดเจน
android.dependency.useConstraints ควบคุมการใช้ข้อจำกัดของ Dependency ระหว่างการกำหนดค่า
ค่าเริ่มต้นใน AGP 9.0 คือ false ซึ่งใช้ข้อจำกัดในการทดสอบอุปกรณ์แอปพลิเคชัน (AndroidTest) เท่านั้น การตั้งค่านี้เป็น true จะเปลี่ยนกลับไปใช้ลักษณะการทำงานของเวอร์ชัน 8.13
truefalse อย่าใช้ข้อจํากัดของ Dependency ในทุกที่ เว้นแต่คุณจะต้องการ การยอมรับค่าเริ่มต้นใหม่ของฟีเจอร์นี้ยังช่วยให้การเพิ่มประสิทธิภาพใน กระบวนการนำเข้าโปรเจ็กต์ ซึ่งจะช่วยลดเวลาในการนำเข้าสำหรับการสร้าง ที่มีโปรเจ็กต์ย่อยของไลบรารี Android จำนวนมาก
android.enableAppCompileTimeRClass คอมไพล์โค้ดในแอปพลิเคชันกับคลาส R ที่ไม่ใช่เวอร์ชันสุดท้าย ซึ่งจะทำให้การคอมไพล์แอปพลิเคชันสอดคล้องกับการคอมไพล์ไลบรารี
ซึ่งจะช่วยปรับปรุงการเพิ่มขึ้นและปูทางสำหรับการเพิ่มประสิทธิภาพ ในอนาคตให้กับขั้นตอนการประมวลผลทรัพยากร
falsetrue โปรเจ็กต์จำนวนมากสามารถใช้ลักษณะการทำงานใหม่ได้โดยไม่ต้องเปลี่ยนแปลงแหล่งที่มา หากมีการใช้ฟิลด์คลาส R ในที่ใดก็ตามที่ต้องใช้ค่าคงที่ เช่น เคส switch ให้ปรับโครงสร้างใหม่เพื่อใช้คำสั่ง if แบบต่อกัน
android.sdk.defaultTargetSdkToCompileSdkIfUnset ใช้เวอร์ชัน SDK ที่คอมไพล์เป็นค่าเริ่มต้นสำหรับเวอร์ชัน SDK เป้าหมายในแอปและการทดสอบ
ก่อนการเปลี่ยนแปลงนี้ SDK เป้าหมายจะตั้งค่าเริ่มต้นเป็น SDK ขั้นต่ำ เวอร์ชัน
falsetrue ระบุเวอร์ชัน SDK เป้าหมายอย่างชัดเจนสำหรับแอปและการทดสอบ
android.onlyEnableUnitTestForTheTestedBuildType สร้างเฉพาะคอมโพเนนต์การทดสอบหน่วยสำหรับประเภทบิลด์ที่ทดสอบ
ในโปรเจ็กต์เริ่มต้น การดำเนินการนี้จะส่งผลให้มีการทดสอบหน่วยเดียวสำหรับการแก้ไขข้อบกพร่อง ซึ่งลักษณะการทำงานก่อนหน้านี้คือการทดสอบหน่วยที่เรียกใช้สำหรับการแก้ไขข้อบกพร่องหรือ การเผยแพร่
falsetrue หากโปรเจ็กต์ไม่จำเป็นต้องเรียกใช้การทดสอบทั้งสำหรับการแก้ไขข้อบกพร่องและเวอร์ชันที่เผยแพร่ คุณก็ไม่ต้องเปลี่ยนแปลงใดๆ
android.proguard.failOnMissingFiles สร้างไม่สำเร็จพร้อมข้อผิดพลาดหากไม่มีไฟล์ที่ระบุใน AGP DSL อยู่ในดิสก์ ก่อนการเปลี่ยนแปลงนี้ การสะกดชื่อไฟล์ผิด จะส่งผลให้ระบบไม่สนใจไฟล์โดยไม่มีการแจ้งเตือน falsetrue นำการประกาศไฟล์ ProGuard ที่ไม่ถูกต้องออก
android.r8.optimizedResourceShrinking ช่วยให้ R8 เก็บทรัพยากร Android น้อยลงได้โดยพิจารณา คลาสและทรัพยากร Android ร่วมกัน falsetrue หากกฎการเก็บรักษาของโปรเจ็กต์เสร็จสมบูรณ์แล้ว คุณก็ไม่ต้องเปลี่ยนแปลงใดๆ
android.r8.strictFullModeForKeepRules ช่วยให้ R8 เก็บข้อมูลน้อยลงโดยไม่ต้องเก็บตัวสร้างเริ่มต้นโดยนัย เมื่อมีการเก็บคลาส กล่าวคือ -keep class A ไม่ได้หมายความว่า -keep class A { <init>(); }
falsetrue หากกฎการเก็บรักษาของโปรเจ็กต์เสร็จสมบูรณ์แล้ว คุณก็ไม่ต้องเปลี่ยนแปลงใดๆ

แทนที่ -keep class A ด้วย -keep class A { <init>(); } ในกฎการเก็บของโปรเจ็กต์สำหรับกรณีที่คุณต้องการเก็บตัวสร้างเริ่มต้น
android.defaults.buildfeatures.resvalues เปิดใช้ resValues ในโปรเจ็กต์ย่อยทั้งหมด truefalse เปิดใช้ resValues ในโปรเจ็กต์ย่อยที่ต้องการเท่านั้น โดยตั้งค่าต่อไปนี้ในไฟล์บิลด์ Gradle ของโปรเจ็กต์เหล่านั้น
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders เปิดใช้ การคอมไพล์ Shader ในโปรเจ็กต์ย่อยทั้งหมด truefalse เปิดใช้การคอมไพล์ Shader ในโปรเจ็กต์ย่อยที่มี Shader เท่านั้นที่จะคอมไพล์โดยการตั้งค่าต่อไปนี้ในไฟล์บิลด์ Gradle ของโปรเจ็กต์เหล่านั้น
android {
  buildFeatures {
    shaders = true
  }
}
android.r8.proguardAndroidTxt.disallowed ใน AGP 9.0 getDefaultProguardFile() จะรองรับเฉพาะ proguard-android-optimize.txt เท่านั้น ไม่รองรับ proguard-android.txt ทั้งนี้เพื่อป้องกันการใช้­dontoptimizeโดยไม่ตั้งใจ ซึ่งรวมอยู่ใน proguard-android.txt falsetrue คุณระบุ ­dontoptimize อย่างชัดเจนใน proguardFile ที่กำหนดเองได้หากต้องการหลีกเลี่ยงการเพิ่มประสิทธิภาพควบคู่ไปกับการใช้ proguard-android-optimize.txt โปรดนำแฟล็ก ­dontoptimize ออกจากไฟล์นี้หากเป็นไปได้ เนื่องจากจะลดประโยชน์ของการเพิ่มประสิทธิภาพ R8 หากไม่ต้องการ ให้เลือกไม่ใช้โดยตั้งค่า android.r8.globalOptionsInConsumerRules.disallowed=false
android.r8.globalOptionsInConsumerRules.disallowed ตั้งแต่ AGP 9.0 เป็นต้นไป การเผยแพร่ไลบรารี Android และโมดูลฟีเจอร์จะล้มเหลวหากไฟล์ keep ของผู้ใช้มีการกำหนดค่า Proguard ที่มีปัญหา ไฟล์ที่ผู้ใช้เก็บไว้ซึ่งมีตัวเลือกส่วนกลาง เช่น ­dontoptimize หรือ ­dontobfuscate ควรใช้ในโมดูลแอปพลิเคชันเท่านั้น และอาจลดประโยชน์จากการเพิ่มประสิทธิภาพสำหรับผู้ใช้ไลบรารี การคอมไพล์โมดูลแอป Android จะไม่สนใจตัวเลือกส่วนกลางดังกล่าวโดยไม่มีการแจ้งเตือนหากฝังอยู่ในทรัพยากร Dependency ที่คอมไพล์ไว้ล่วงหน้า (JAR หรือ AAR) คุณจะดูได้ว่าเหตุการณ์นี้เกิดขึ้นเมื่อใดโดยตรวจสอบ configuration.txt (โดยปกติจะอยู่ในเส้นทางเช่น <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) เพื่อดูความคิดเห็น เช่น # REMOVED CONSUMER RULE: ­dontoptimize falsetrue ไลบรารีที่เผยแพร่แล้วควรนำกฎที่ไม่เข้ากันออก ไลบรารีภายในควรย้ายกฎที่ไม่เข้ากันแต่จำเป็นไปยัง proguardFile ในโมดูลแอปแทน เลือกไม่ใช้โดยไปที่android.r8.globalOptionsInConsumerRules.disallowed=false เมื่อไฟล์ Keep สำหรับผู้บริโภคทั้งหมดของคุณเข้ากันได้แล้ว ให้นำการเลือกไม่ใช้ดังกล่าวออก
android.sourceset.disallowProvider ไม่อนุญาตให้ส่งผู้ให้บริการสำหรับแหล่งที่มาที่สร้างขึ้นโดยใช้ AndroidSourceSet DSL falsetrue ใช้ API Sources ใน androidComponents เพื่อลงทะเบียนแหล่งที่มาที่สร้างขึ้น
android.custom.shader.path.required ต้องตั้งค่าเส้นทางคอมไพเลอร์ Shader อย่างชัดเจนใน local.properties หากเปิดใช้การคอมไพล์ Shader falsetrue เพิ่ม glslc.dir=/path/to/shader-tools ลงใน local.properties ของโปรเจ็กต์

ฟีเจอร์ที่นำออกแล้ว

ปลั๊กอิน Android Gradle 9.0 จะนำฟังก์ชันการทำงานต่อไปนี้ออก

  • การรองรับแอป Wear OS ที่ฝัง
    AGP 9.0 จะนำการรองรับการฝังแอป Wear OS ออก ซึ่ง Play ไม่รองรับอีกต่อไป ซึ่งรวมถึงการนำwearAppการกำหนดค่าและ AndroidSourceSet.wearAppConfigurationName DSL ออก ดูวิธีเผยแพร่แอปไปยัง Wear OS ได้ที่หัวข้อเผยแพร่ไปยัง Wear OS
  • androidDependencies และsourceSetsรายงานงาน
  • การรองรับ APK แยกของความหนาแน่น
    AGP 9.0 จะนำการรองรับการสร้าง APK แยกตามความหนาแน่นของหน้าจอออก เราได้นำฟังก์ชันการทำงานและ API ที่เกี่ยวข้องออกแล้ว หากต้องการแยก APK ตามความหนาแน่นของหน้าจอโดยใช้ AGP 9.0 ขึ้นไป ให้ใช้ App Bundle

DSL ที่เปลี่ยนแปลง

ปลั๊กอิน Android Gradle 9.0 มีการเปลี่ยนแปลง DSL ที่ส่งผลกับส่วนอื่นดังนี้

  • นำการกำหนดพารามิเตอร์ของ CommonExtension ออกแล้ว

    การเปลี่ยนแปลงนี้เป็นการเปลี่ยนแปลงที่ทำให้เกิดข้อขัดข้องในระดับแหล่งที่มาเท่านั้นเพื่อช่วย หลีกเลี่ยงการเปลี่ยนแปลงที่ทำให้เกิดข้อขัดข้องในระดับแหล่งที่มาในอนาคต แต่ก็หมายความว่า วิธีการบล็อกจะต้องย้ายจาก CommonExtension ไปยัง ApplicationExtension, LibraryExtension, DynamicFeatureExtension และ TestExtension

    เมื่ออัปเกรดโปรเจ็กต์เป็น AGP 9.0 ให้ปรับโครงสร้างโค้ดปลั๊กอิน Gradle ซึ่งใช้พารามิเตอร์หรือเมธอดบล็อกเหล่านั้น ตัวอย่างเช่น มีการอัปเดตปลั๊กอินต่อไปนี้ เพื่อนำพารามิเตอร์ประเภทออกและไม่ใช้เมธอดบล็อกที่นำออกแล้ว

    AGP 8.13

    val commonExtension: CommonExtension<*, *, *, *, *, *> =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig {
            minSdk {
                version = release(28)
            }
        }
    }
    

    AGP 9.0

    val commonExtension: CommonExtension =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig.apply {
            minSdk {
                version = release(28)
            }
        }
    }
    

    สำหรับปลั๊กอินที่กำหนดเป้าหมายเป็น AGP เวอร์ชันต่างๆ การใช้ Getter โดยตรง จะเข้ากันได้แบบไบนารีกับ AGP เวอร์ชันที่ต่ำกว่า 9.0

นำ DSL ออกแล้ว

ปลั๊กอิน Android Gradle 9.0 จะนำสิ่งต่อไปนี้ออก

API ที่นำออก

ปลั๊กอิน Android Gradle 9.0 จะนำสิ่งต่อไปนี้ออก

พร็อพเพอร์ตี้ Gradle ที่นำออก

เดิมทีเราได้เพิ่มพร็อพเพอร์ตี้ Gradle ต่อไปนี้เพื่อเป็นวิธีปิดใช้ฟีเจอร์ที่เปิดใช้โดยค่าเริ่มต้นทั่วโลก

ฟีเจอร์เหล่านี้ปิดใช้งานอยู่โดยค่าเริ่มต้นตั้งแต่ AGP 8.0 หรือต่ำกว่า เปิดใช้ ฟีเจอร์เหล่านี้ในโปรเจ็กต์ย่อยที่ใช้ฟีเจอร์ดังกล่าวเท่านั้นเพื่อการสร้างที่มีประสิทธิภาพมากขึ้น

พร็อพเพอร์ตี้ การทำงาน การแทนที่
android.defaults.buildfeatures.aidl เปิดใช้ AIDL การคอมไพล์ในโปรเจ็กต์ย่อยทั้งหมด เปิดใช้การคอมไพล์ AIDL ในโปรเจ็กต์ย่อยที่มีแหล่งที่มาของ AIDL เท่านั้น โดยการตั้งค่าพร็อพเพอร์ตี้ต่อไปนี้ในไฟล์บิลด์ Gradle ของโปรเจ็กต์เหล่านั้น
android {
  buildFeatures {
    aidl = true
  }
}
ในไฟล์บิลด์ Gradle ของแต่ละโปรเจ็กต์ย่อยที่มีแหล่งที่มาของ AIDL
android.defaults.buildfeatures.renderscript เปิดใช้ การคอมไพล์ RenderScript ในโปรเจ็กต์ย่อยทั้งหมด เปิดใช้การคอมไพล์ RenderScript ในโปรเจ็กต์ย่อยที่มีแหล่งที่มาของ RenderScript เท่านั้น โดยการตั้งค่าพร็อพเพอร์ตี้ต่อไปนี้ในไฟล์บิลด์ Gradle ของโปรเจ็กต์เหล่านั้น
android {
  buildFeatures {
    renderScript = true
  }
}

พร็อพเพอร์ตี้ Gradle ที่บังคับใช้

AGP 9.0 จะแสดงข้อผิดพลาดหากคุณตั้งค่าพร็อพเพอร์ตี้ Gradle ต่อไปนี้

ผู้ช่วยอัปเกรดปลั๊กอิน Android Gradle จะไม่อัปเกรดโปรเจ็กต์เป็น AGP 9.0 ที่ใช้พร็อพเพอร์ตี้เหล่านี้

พร็อพเพอร์ตี้ การทำงาน
android.r8.integratedResourceShrinking ตอนนี้ระบบจะเรียกใช้การลดขนาดทรัพยากรเป็นส่วนหนึ่งของ R8 เสมอ และได้นำการติดตั้งใช้งานก่อนหน้านี้ออกแล้ว
android.enableNewResourceShrinker.preciseShrinking ตอนนี้การลดขนาดทรัพยากรจะใช้การลดขนาดทรัพยากรที่แม่นยำเสมอ ซึ่ง ช่วยให้ลบได้มากขึ้น

ปัญหาที่แก้ไขแล้ว

ปลั๊กอิน Android Gradle 9.0.0-alpha10

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
ไม่ควรดึงข้อมูล extractNativeLibs และ useEmbeddedDex จากไฟล์ Manifest
คำเตือนจาก R8 ใน AGP 9.0.0-alpha09
Lint
Kotlin ในตัวจะไม่เพิ่ม .kotlin_module ลงใน META-INF
Classpath ของ Lint มีคลาสที่ซ้ำกันในเวอร์ชันต่างๆ
วิธีแก้ปัญหาการลบล้างทรัพยากรส่วนตัวใช้ไม่ได้ (tools:override = "true")

ปลั๊กอิน Android Gradle 9.0.0-alpha09

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
ปลั๊กอิน `legacy-kapt` จะข้ามการประมวลผลคำอธิบายประกอบ ซึ่งต่างจาก `kotlin-kapt`
compileSdkSpec.minorApiLevel ใช้กับ SettingsExtension ไม่ได้
[fused lib - public] ไลบรารีที่ผสานที่สร้างขึ้นไม่มีแหล่งที่มา

ปลั๊กอิน Android Gradle 9.0.0-alpha08

ปัญหาที่แก้ไขแล้ว
ไม่มีปัญหาที่เปิดเผยต่อสาธารณะที่ทำเครื่องหมายว่าแก้ไขแล้วใน AGP 9.0.0-alpha08

ปลั๊กอิน Android Gradle 9.0.0-alpha07

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
บิลด์จะล้มเหลวหากมีงานสร้างโค้ด
เมื่อใช้ `android.builtInKotlin=false` และ `android.newDsl=false` และ `android.enableLegacyVariantApi=false` การใช้ปลั๊กอิน `kotlin-android` จะล้มเหลวพร้อมข้อความ "API 'applicationVariants' ล้าสมัยแล้ว"
Kotlin ในตัวไม่สามารถแก้ไข kotlin-stdlib ที่ไม่มีการกำหนดเวอร์ชันเมื่อ kotlin.stdlib.default.dependency=false
DexData เปิดไฟล์โดยไม่ปิด ทำให้ไม่สามารถล้างข้อมูลได้
AndroidSourceDirectorySet ควรหยุดขยาย PatternFilterable ใน AGP 9.0
ข้อผิดพลาดในการทดสอบในโมดูลทดสอบเท่านั้น
ข้อผิดพลาดที่ไม่ถูกต้องเมื่อใช้ตัวรับบริบทในการตั้งค่าการทดสอบ
ข้อผิดพลาดของ IDE ไม่ถูกต้องสำหรับโค้ด Kotlin ใน testFixtures

ปลั๊กอิน Android Gradle 9.0.0-alpha06

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
DSL การเพิ่มประสิทธิภาพใหม่จะไม่สร้าง configuration.txt โดยค่าเริ่มต้น
AGP 8.13.0 ยืนยันกราฟการนำทางในโมดูลไม่สำเร็จ
AGP ใช้ Gradle API ที่เลิกใช้งานแล้ว: สัญกรณ์แบบหลายสตริง
เตือนผู้ใช้ที่พยายามใช้ไลบรารี Multidex เดิมที่มี minSdkVersion >=21
Lint
Lint ChecksSdkIntAtLeast Check does not check if the annotated value is correct

ปลั๊กอิน Android Gradle 9.0.0-alpha05

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
android.proguard.failOnMissingFiles ไม่ทำงานสำหรับ consumerProguardFiles
อัปเดตการอ้างอิงปลั๊กอิน Kotlin Gradle เป็น 2.2.10
สร้าง KotlinJvmAndroidCompilation โดยใช้ KGP API
ใช้โหมด API ที่ชัดเจนของ Kotlin กับแหล่งที่มาของการทดสอบ
Lint
Lint แสดงคำเตือน "ล้างแคช K2 ไม่ได้"

ปลั๊กอิน Android Gradle 9.0.0-alpha04

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
เปลี่ยนเวอร์ชัน Java ต้นทาง/เป้าหมายเริ่มต้นจาก Java 8 เป็น Java 11 ใน AGP 9.0
เปลี่ยนค่าเริ่มต้นของ android.useAndroidX เป็น true
ข้อยกเว้นที่ดีขึ้นเมื่อใช้ปลั๊กอิน KAPT กับ Kotlin ในตัว
Lint
Lint แสดงคำเตือน "ล้างแคช K2 ไม่ได้"

ปลั๊กอิน Android Gradle 9.0.0-alpha03

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
เมื่อเปิดใช้ `isIncludeAndroidResources` `process{Variant}UnitTestManifest` จะผสานการใช้งาน tools:overrideLibrary ใน AGP 8.12.0 ไม่สำเร็จ
AGP ทำให้เกิดคำเตือนการเลิกใช้งานใน Gradle สำหรับงานทดสอบ JVM
DependencyReportTask ใช้ร่วมกับแคชการกำหนดค่าไม่ได้
Lint
ข้อบกพร่อง: การนำทรัพยากรที่ไม่ได้ใช้ออกไม่ได้นำคำแปลของทรัพยากรเหล่านั้นออกไปด้วย และไม่ได้ถามเกี่ยวกับคำแปลด้วย

ปลั๊กอิน Android Gradle 9.0.0-alpha02

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
สร้างไม่สำเร็จเมื่อไม่มีไฟล์ Proguard
remove buildconfig defaults gradle.properties flags
เปลี่ยนค่าเริ่มต้นของ targetSdk ของแอปให้เป็นไปตาม compileSdk แทนที่จะเป็น minSdk

ปลั๊กอิน Android Gradle 9.0.0-alpha01

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
นำ AndroidSourceSet.jni ที่เลิกใช้งานแล้วออกใน AGP 9.0
นำ Installation.installOptions() ออกใน AGP 9.0
นำ BuildType.isRenderscriptDebuggable ออกใน AGP 9.0
นำ android.defaults.buildfeatures.renderscript ออก
`com.android.kotlin.multiplatform.library` ขัดข้องเมื่อใช้อุปกรณ์ที่มีการจัดการจาก Gradle
นำค่าเริ่มต้น `android.defaults.buildfeatures.aidl` ออกจากแฟล็ก gradle.properties