ปลั๊กอิน Android Gradle (AGP) เป็นระบบบิลด์ที่รองรับสำหรับแอปพลิเคชัน Android และรองรับการคอมไพล์แหล่งที่มาหลายประเภท และลิงก์เข้าด้วยกันเป็นแอปพลิเคชันที่คุณเรียกใช้ในอุปกรณ์ Android จริง หรือโปรแกรมจำลองได้
ส่วนต่อไปนี้จะอธิบายวิวัฒนาการที่วางแผนไว้ของ DSL และ API ของ AGP เมื่อมีการเปิดตัว API ใหม่ในรุ่นที่เสถียร ระบบจะทําเครื่องหมาย API เก่าว่า เลิกใช้แล้ว จากนั้น API ที่เลิกใช้งานแล้วจะใช้งานไม่ได้ในรุ่นเสถียรถัดไป ส่วนต่อไปนี้จะให้ข้อมูลเกี่ยวกับการเปลี่ยนแปลงที่กำลังจะมีขึ้น ใน AGP แต่ละรุ่นหลัก
ดูบันทึกการเลิกใช้งานหรือการนำ AGP API ออกโดยละเอียดได้ที่การอัปเดต AGP API
AGP 10.0 (ปลายปี 2026)
การเปลี่ยนแปลง API และการปรับปรุงปลั๊กอิน Android Gradle 10.0
AGP 10.0 จะเปลี่ยนไปใช้โมเดลบิลด์ที่รองรับแคชการกำหนดค่าและเลซีอย่างเต็มรูปแบบ การเปิดตัวนี้เป็นผลลัพธ์ของความพยายามหลายปีในการแทนที่ API เดิมที่ไม่ใช่แบบ Lazy ด้วยสถาปัตยกรรมที่ปลอดภัยและมีประสิทธิภาพมากขึ้น
ทำไมถึงต้องใช้โมเดลการสร้างแบบเลซี
ในโมเดลการสร้างแบบเดิมที่ไม่ใช่แบบ Lazy Gradle จะประเมินออบเจ็กต์ ค้นหา ข้อมูลตัวแปร และกำหนดค่างานในโมดูลโปรเจ็กต์ทั้งหมดอย่างกระตือรือร้นในระหว่างการซิงค์ หรือการเรียกใช้การสร้างทุกครั้ง การประเมินแบบกระตือรือร้นนี้ทำให้เสียเวลา CPU และหน่วยความจำไปกับ ตัวแปรและงานที่ไม่ได้ทำงาน และทำให้เกิดความขัดแย้งในการจัดลำดับการประเมิน ในสคริปต์การสร้างที่ซับซ้อน
การเปลี่ยนไปใช้โมเดลบิลด์แบบเลซีอย่างเต็มรูปแบบโดยใช้ Lazy Providers
(Provider<T>) และ Variant API ที่ทันสมัย (androidComponents {}) จะทำให้ระบบคำนวณพร็อพเพอร์ตี้
และการเชื่อมต่อทาสก์แบบเลซีตามต้องการเฉพาะเมื่อกราฟการดำเนินการบิลด์ที่ใช้งานอยู่ต้องการเท่านั้น
API เดิมที่จะนำออกในรุ่นนี้ไม่สามารถใช้งานร่วมกับสถาปัตยกรรมสมัยใหม่นี้ได้ การนำออกจะช่วยให้ AGP รองรับ แคชการกำหนดค่า Gradle และการแยกโปรเจ็กต์ได้อย่างเต็มที่ ซึ่งจะช่วยปรับปรุง ความเร็วในการสร้างและเวลาในการซิงค์ใน Android Studio ได้อย่างมาก
ความแตกต่างหลักของสถาปัตยกรรม
BaseVariant API (applicationVariants.all {}) เวอร์ชันเดิมมีความกระตือรือร้นและ
มุ่งเน้นที่งาน ซึ่งช่วยให้นักพัฒนาแอปเข้าถึงงาน Gradle และการกำหนดค่าภายในได้โดยตรงในระหว่างขั้นตอนการกำหนดค่า ซึ่งทำให้ฟีเจอร์ประสิทธิภาพของ Gradle สมัยใหม่ใช้งานไม่ได้
Variant API ใหม่ (androidComponents {}) จะทำงานแบบเลซีและเน้นที่อาร์ติแฟกต์ โดยจะใช้ Property API ของ Gradle อย่างกว้างขวางและนำการอ้างอิงทั้งหมดไปยัง
Task และ TaskProvider ออกทั้งหมด ซึ่งกำหนดให้คุณต้องโต้ตอบกับอินพุตและ
เอาต์พุต (Variant.artifacts) อย่างชัดเจนแทนที่จะเป็นงานพื้นฐานเอง
สิ่งที่กำลังจะถูกนำออกและแทนที่
ระบบจะลบอินเทอร์เฟซและคลาสก่อนหน้าทั้งหมดที่ใช้ใน DSL เดิมและ Variant API เก่า หากต้องการเตรียมสคริปต์บิลด์และปลั๊กอินที่กำหนดเอง ให้ย้ายข้อมูล ออกจาก API และค่าสถานะที่สิ้นสุดการใช้งานต่อไปนี้
| API หรือฟีเจอร์ที่นำออก | ต้องเปลี่ยนหรือดำเนินการ |
|---|---|
การเข้าถึงงานโดยตรง
|
Artifacts API: แทนที่จะดึงข้อมูลงานเพื่อ
เปลี่ยนลักษณะการทำงาน ให้ใช้ variant.artifacts เพื่อ
ผนวก แก้ไข หรือแทนที่ไฟล์จริง (อาร์ติแฟกต์) ที่ส่งผ่านระหว่าง
งาน
|
การลงทะเบียนแหล่งที่มาแบบ Eager
|
Sources API: เชื่อมต่อเอาต์พุตของไดเรกทอรีงานที่กำหนดเองโดยใช้
variant.sources.java.addGeneratedSourceDirectory(...)
|
การเข้าถึง Classpath / การกำหนดค่า
|
Instrumentation API: หากต้องการแก้ไขหรือตรวจสอบไบต์โค้ด
(กรณีการใช้งานที่พบบ่อยที่สุดสำหรับการเข้าถึง classpath) ให้ใช้
variant.instrumentation.transformClassesWith(...) โดยใช้
AsmClassVisitorFactory
|
การเปลี่ยนแปลงพร็อพเพอร์ตี้แบบกระตือรือร้น
|
อินสแตนซ์ `MapProperty` แบบเลซี: ใช้
variant.buildConfigFields.put(...) และ
variant.manifestPlaceholders.put(...)
|
Flag การเลือกไม่ใช้
|
ไม่มีการแทนที่โดยตรง นำฟีเจอร์เหล่านี้ออกจาก
gradle.properties; ระบบจะบังคับใช้ DSL ที่ทันสมัยและ Kotlin ในตัว
อย่างเคร่งครัด
|
ส่วนขยาย API ตัวแปรเดิม
|
แทนที่ด้วย androidComponents.onVariants() |
การกรองตัวแปร (variantFilter บล็อก) |
แทนที่ด้วย androidComponents.beforeVariants() โดยใช้
ตัวเลือกรูปแบบ
|
คอมโพเนนต์ SDK และ NDK
|
เข้าถึงคอมโพเนนต์ SDK โดยใช้
androidComponents.sdkComponents
|
สภาพแวดล้อมการทดสอบ
|
ย้ายข้อมูลการลงทะเบียนอุปกรณ์ทดสอบที่กำหนดเองไปยังอุปกรณ์ที่มีการจัดการจาก Gradle |
API การลงทะเบียนที่ล้าสมัย
|
ลบแล้วโดยไม่มีการแทนที่โดยตรง |
| Transform API |
แทนที่การแปลงด้วย Artifacts API และ
AsmClassVisitorFactory
|
หากต้องการเข้าถึง DSL และ Variant API (androidComponents {})
อินเทอร์เฟซและคลาสทั้งหมดที่ใช้แทน ให้ใช้ชิ้นงาน gradle-api
เสมอเมื่อพัฒนาปลั๊กอิน Gradle ที่กำหนดเองหรือตรรกะการสร้าง
ขั้นตอนการย้ายโปรเจ็กต์
โปรดทำตามแนวทางการย้ายข้อมูลต่อไปนี้เพื่อให้การอัปเกรดเป็น AGP 10.0 เป็นไปอย่างราบรื่นและคาดการณ์ได้
- เรียกใช้ผู้ช่วยอัปเกรด AGP: ก่อนอัปเกรดเป็น 10.0 โดยตรง ให้เรียกใช้ผู้ช่วยอัปเกรด AGP อย่างเป็นทางการใน Android Studio (
Tools > AGP Upgrade Assistant) ซึ่งจะทำการย้ายข้อมูล DSL และสคริปต์บิลด์ทั่วไปหลายรายการโดยอัตโนมัติ และช่วยรักษาลักษณะการทำงานของบิลด์ที่มีอยู่ - ใช้ทักษะโหมดเอเจนต์ใน Android Studio: ใช้ประโยชน์จากทักษะการอัปเกรด AI (เช่น ทักษะการอัปเกรด AGP ที่มีอยู่ในที่เก็บทักษะ Android) เพื่อทำให้การย้ายข้อมูลตรรกะการสร้างที่ซับซ้อนและ DSL ภายใน Android Studio เป็นไปโดยอัตโนมัติและง่ายขึ้น
- แก้ไขคำเตือนการเลิกใช้งานใน AGP 9.x ก่อน: อัปเกรดโปรเจ็กต์เป็น AGP 9.x เวอร์ชันล่าสุดและแก้ไขคำเตือนการเลิกใช้งานที่มีอยู่ทั้งหมด เมื่อโปรเจ็กต์ของคุณทำงานร่วมกับ 9.x ได้โดยไม่มีคำเตือนและไม่ต้องอาศัย
android.newDsl=falseหรือandroid.builtInKotlin=falseการเปลี่ยนไปใช้ 10.0 ก็จะราบรื่น - ตรวจสอบปลั๊กอิน Gradle ของบุคคลที่สาม: ตรวจสอบว่าปลั๊กอินของบุคคลที่สามได้รับการ
อัปเกรดเป็นเวอร์ชันที่ใช้ร่วมกับ AGP 10.0 ได้ ปลั๊กอินที่ยังคงใช้ส่วนขยายประเภทเดิมจะทำให้การสร้างล้มเหลว เช่น
ClassCastException: ... cannot be cast to class BaseExtension - ใช้สูตรการย้ายข้อมูลอย่างเป็นทางการ: ดูตัวอย่างการย้ายข้อมูลที่ซับซ้อนในสถานการณ์จริงและการเปรียบเทียบแบบเคียงข้างกันได้ในที่เก็บ gradle-recipes ใน GitHub อย่างเป็นทางการ
นี่คือการเปรียบเทียบก่อนและหลังที่แสดงวิธีย้ายข้อมูลจากการค้นหาตัวแปรเดิมอย่างรวดเร็วไปเป็นการกำหนดค่าตัวแปรอย่างช้าๆ โดยใช้
androidComponents {}:
ก่อนหน้า: Legacy Variant API (นำออกใน AGP 10.0)
// Eager evaluation using the legacy Variant API
android {
applicationVariants.all { variant ->
if (variant.buildType.name == "release") {
// Eagerly queries and modifies properties during evaluation
}
}
}
หลังจากนี้: Modern Variant API (androidComponents {})
// Lazy, Configuration Cache compatible Variant API
androidComponents {
onVariants(selector().withBuildType("release")) { variant ->
// Safely and lazily configures properties
}
}
วิธีทดสอบลักษณะการทำงานของ AGP 10.0 ใน AGP 9.x
คุณไม่จำเป็นต้องรอให้ AGP 10.0 เปิดตัวเพื่อเริ่มทดสอบลักษณะการทำงานของบิลด์
และตรวจสอบความเข้ากันได้ ขณะเรียกใช้ AGP 9.x
คุณสามารถบังคับใช้ลักษณะการทำงานของ AGP 10.0 อย่างชัดเจนได้โดยตรวจสอบว่า
gradle.properties ปิดใช้การเลือกไม่ใช้ทั้งหมดและตั้งค่าสถานะลักษณะการทำงานที่เข้มงวดต่อไปนี้
# Enforce modern DSL and Variant API interfaces exclusively
android.newDsl=true
# Enforce built-in Kotlin support without optional opt-out
android.builtInKotlin=true
การบังคับใช้ android.newDsl=true และ android.builtInKotlin=true จะช่วยให้คุณ
ยืนยันได้ว่าตรรกะการบิลด์ที่กำหนดเองและปลั๊กอินของบุคคลที่สาม
เข้ากันได้กับข้อกำหนด API ที่เข้มงวดของ AGP 10.0 อย่างสมบูรณ์
การเลือกไม่ใช้โปรเจ็กต์ย่อยบางรายการระหว่างการย้ายข้อมูล
หากต้องการเปิดใช้ android.newDsl=true ทั่วทั้งโปรเจ็กต์เพื่อ
ทดสอบลักษณะการทำงานที่ทันสมัย แต่ต้องการเวลาเพิ่มเติมในการย้ายข้อมูลโปรเจ็กต์ย่อยที่เฉพาะเจาะจง คุณ
สามารถเลือกไม่ใช้โมดูลแต่ละโมดูลได้ตั้งแต่ AGP 9.4.0-alpha04 เป็นต้นไป
เพิ่ม android.newDsl.optOut ไปยัง gradle.properties โดยระบุเส้นทางโปรเจ็กต์
# Enable modern DSL globally across the build
android.newDsl=true
# Selectively opt out specific sub-projects that still require legacy DSL APIs
android.newDsl.optOut=:lib
การปิดใช้ Kotlin ในตัวแบบเฉพาะเจาะจงต่อโมดูล
หากต้องการเปิดใช้ Kotlin ในตัวทั่วทั้งโปรเจ็กต์ (android.builtInKotlin=true) แต่ต้องการเวลาเพิ่มเติมในการย้ายข้อมูลโปรเจ็กต์ย่อยที่เฉพาะเจาะจงออกจาก kotlin-android (หรือสำหรับโมดูลที่ไม่มีโค้ด Kotlin) ให้กำหนดค่าโมดูลเหล่านั้นที่ระดับ DSL แทนระดับโปรเจ็กต์ ตั้งค่า
enableKotlin = false ภายในไฟล์บิลด์ของโมดูล
android {
enableKotlin = false
}
เวิร์กโฟลว์การรายงานข้อบกพร่องและการแสดงความคิดเห็น
เราต้องการให้มั่นใจว่า Variant API ใหม่รองรับกรณีการใช้งานที่คุณต้องการ หากพบปัญหาในการย้ายข้อมูลออกจาก API เก่าซึ่ง API ใหม่ของผลิตภัณฑ์ย่อยไม่รองรับ Use Case ของคุณ ให้ทำตามขั้นตอนต่อไปนี้เพื่อแสดงความคิดเห็น
- ตรวจสอบสินค้าที่มีอยู่: ก่อนอื่นให้ตรวจสอบ AGP 10.0 Variant API Global Tracking Bug เพื่อดูว่าปัญหาที่ทำให้ย้ายข้อมูลไม่ได้เป็นปัญหาที่ทราบอยู่แล้วหรือไม่ แล้วกด +1 ที่ปัญหา
- รายงาน API ที่ขาดหายไป: หากกรณีการใช้งานของคุณไม่เหมือนใคร โปรดยื่นคำขอฟีเจอร์ใหม่โดยใช้เทมเพลต AGP 10.0 เฉพาะของเรา เพื่อให้เราตรวจสอบและช่วยเหลือได้
(ทดลอง) ระบบจะนำสิทธิ์เข้าถึงคลาส AGP ภายในแบบส่วนตัวออก
ทรัพยากร Dependency บนสิ่งประดิษฐ์ gradle จะซ่อนคลาสภายในทั้งหมด และให้สิทธิ์เข้าถึงการคอมไพล์เฉพาะอินเทอร์เฟซและคลาส ที่อยู่ในสิ่งประดิษฐ์ gradle-api ซึ่งจะส่งผลต่อการคอมไพล์ปลั๊กอิน
คุณเพิ่มการอ้างอิงด้วยตนเองเพื่อเข้าถึงคลาสภายใน ไม่ได้
AGP 9.0 (มกราคม 2026)
API ใหม่ของตัวเลือกมีเสถียรภาพแล้ว ส่วน API เก่าเลิกใช้งานแล้ว
Variant API ที่อยู่ในระยะทดลองใน 4.1 และ 4.2 พร้อมใช้งานแล้วและอยู่ในอาร์ติแฟกต์ gradle-api ตอนนี้อินเทอร์เฟซและคลาสก่อนหน้าซึ่งใช้ใน Variant API เก่าเลิกใช้งานแล้ว และต้องเลือกใช้โดยชัดแจ้งจึงจะใช้งานได้
อินเทอร์เฟซ DSL ใหม่มีความเสถียร ส่วนอินเทอร์เฟซเก่าจะเลิกใช้งาน
อินเทอร์เฟซ DSL ที่อยู่ในระยะทดลองใน 4.1, 4.2 และ 7.0 ตอนนี้เสถียรแล้วและอยู่ในอาร์ติแฟกต์ gradle-api ตอนนี้อินเทอร์เฟซและคลาสก่อนหน้าซึ่งใช้ใน DSL ถูกเลิกใช้งานแล้ว และต้องเลือกใช้โดยชัดแจ้งจึงจะใช้งานได้
ชั้นเรียน AGP ภายในแบบส่วนตัวที่ยังคงเข้าถึงได้
คลาสภายในแบบส่วนตัวจาก AGP ซึ่งอยู่ในอาร์ติแฟกต์อื่นๆ จะยังคงเข้าถึงได้ในระหว่างการคอมไพล์ไฟล์บิลด์และปลั๊กอิน แต่เราไม่แนะนำให้ใช้คลาสเหล่านี้เนื่องจากอาจมีการเปลี่ยนแปลงในลักษณะที่ทำให้เกิดการหยุดทำงานได้ทุกเมื่อ