ปลั๊กอิน Android Gradle 7.0.0 (กรกฎาคม 2021)
ปลั๊กอิน Android Gradle 7.0.0 เป็นเวอร์ชันสำคัญที่มีฟีเจอร์ใหม่ๆ มากมาย ฟีเจอร์และการปรับปรุงต่างๆ
7.0.1 (สิงหาคม 2021)
การอัปเดตเล็กน้อยนี้ครอบคลุมถึงการแก้ไขข้อบกพร่องหลายรายการด้วย ถ้าต้องการดูรายการการแก้ไขข้อบกพร่องที่น่าสนใจ ให้อ่านโพสต์ที่เกี่ยวข้องใน บล็อกการอัปเดตการเผยแพร่
ความเข้ากันได้
เวอร์ชันต่ำสุด | เวอร์ชันเริ่มต้น | |
---|---|---|
เกรเดิล | 7.0.2 | 7.0.2 |
เครื่องมือสร้าง SDK | 30.0.2 | 30.0.2 |
NDK | ไม่มี | 21.4.7075529 |
JDK | 11 | 11 |
ต้องใช้ JDK 11 เพื่อเรียกใช้ AGP 7.0
ตอนนี้ JDK 11 ใช้ปลั๊กอิน Android Gradle 7.0 เพื่อสร้างแอปได้แล้ว ที่จำเป็นต่อการเรียกใช้ Gradle Android Studio Arctic Fox รวม JDK 11 และ กำหนดค่าให้ Gradle ใช้งานโดยค่าเริ่มต้น ซึ่งหมายความว่า Android Studio ส่วนใหญ่ ผู้ใช้ไม่จำเป็นต้องแก้ไขการกำหนดค่าใดๆ ในโปรเจ็กต์
หากคุณจำเป็นต้องตั้งค่า เวอร์ชัน JDK ที่ AGP ใช้งานภายใน Android Studio คุณต้องใช้ JDK 11 หรือสูงกว่า
เมื่อใช้ AGP ที่ไม่เกี่ยวข้องกับ Android Studio ให้อัปเกรดเวอร์ชัน JDK ภายใน
การตั้งค่าตัวแปรสภาพแวดล้อม JAVA_HOME
หรือตัวเลือกบรรทัดคำสั่ง -Dorg.gradle.java.home
ในไดเรกทอรีการติดตั้ง JDK 11 ของคุณ
โปรดทราบว่า SDK Manager และ AVD Manager ในแพ็กเกจเครื่องมือ SDK ที่เลิกใช้งานแล้ว ใช้กับ JDK 11 ไม่ได้ ใช้ SDK Manager และ AVD Manager ต่อไป ที่มี AGP 7.0 ขึ้นไป คุณต้องเปลี่ยนไปใช้เครื่องมือเวอร์ชันใหม่ใน ปัจจุบัน เครื่องมือบรรทัดคำสั่ง Android SDK แพ็กเกจ
API เวอร์ชันเสถียร
ตอนนี้ Variant API ใหม่มีความเสถียรแล้ว ดูอินเทอร์เฟซใหม่ใน com.android.build.api.variant และตัวอย่างใน โปรเจ็กต์ GitHub gradle-recipes ในฐานะส่วนหนึ่งของ API ตัวแปร เราได้ทำให้ไฟล์ระดับกลางจำนวนหนึ่งใช้งานได้ ซึ่งเรียกว่า ผ่าน อาร์ติแฟกต์ ของ Google อาร์ติแฟกต์เหล่านี้จะได้รับมาอย่างปลอดภัย เช่น ไฟล์ Manifest ที่ผสานรวม และปรับแต่งได้โดยการใช้ปลั๊กอินและโค้ดของบุคคลที่สาม
เราจะขยาย Variant API ต่อไปด้วยการเพิ่มฟังก์ชันใหม่ และเพิ่มสิ่งประดิษฐ์ระดับกลาง ที่เรามีให้ การปรับแต่งได้มากขึ้น
การเปลี่ยนแปลงลักษณะการทำงานของ Lint
ส่วนนี้จะอธิบายการเปลี่ยนแปลงลักษณะการทำงานของ Lint หลายรายการใน Android Gradle ปลั๊กอิน 7.0.0
ปรับปรุง Lint สำหรับทรัพยากร Dependency ของไลบรารี
การเรียกใช้ Lint กับ checkDependencies = true
เร็วขึ้นแล้ว
กว่าเดิม สำหรับโปรเจ็กต์ Android ที่ประกอบด้วยแอปที่มีไลบรารี
ทรัพยากร Dependency ขอแนะนำให้ตั้งค่า checkDependencies
เป็น
true
ดังที่แสดงด้านล่าง และเรียกใช้ Lint ผ่าน
./gradlew :app:lint
ซึ่งจะวิเคราะห์ทรัพยากร Dependency ทั้งหมด
พร้อมกันและสร้างรายงานฉบับเดียว โดยรวมปัญหาจาก
และทรัพยากร Dependency ทั้งหมด
ดึงดูด
// build.gradle
android {
...
lintOptions {
checkDependencies true
}
}
Kotlin
// build.gradle.kts
android {
...
lint {
isCheckDependencies = true
}
}
งาน Lint สามารถใช้เป็น UP-TO-DATE ได้แล้ว
หากแหล่งที่มาและทรัพยากรของโมดูลไม่มีการเปลี่ยนแปลง การวิเคราะห์ Lint
ของโมดูลนี้ไม่จำเป็นต้องเรียกใช้อีกครั้ง เมื่อเกิดกรณีนี้ขึ้น ฟิลด์
การดำเนินงานจะปรากฏเป็น "UP-TO-DATE" ใน Gradle
เอาต์พุต จากการเปลี่ยนแปลงนี้ เมื่อเรียกใช้ Lint ในโมดูลแอปพลิเคชันด้วย checkDependencies = true
เฉพาะโมดูลที่มีการเปลี่ยนแปลงจะ
ต้องเรียกใช้การวิเคราะห์ ทำให้ Lint ทำงานได้เร็วขึ้น
นอกจากนี้ คุณก็ไม่จำเป็นต้องเรียกใช้งานรายงาน Lint หากอินพุตของอินพุตไม่ มีการเปลี่ยนแปลง ปัญหาที่ทราบแล้วที่เกี่ยวข้องคือไม่มี Lint เอาต์พุตข้อความที่พิมพ์ไปยัง stdout เมื่องาน Lint เป็น UP-TO-DATE (ปัญหา #191897708)
การเรียกใช้ Lint ในโมดูลฟีเจอร์แบบไดนามิก
AGP ไม่รองรับการเรียกใช้ Lint จากโมดูลฟีเจอร์แบบไดนามิกอีกต่อไป
การเรียกใช้ Lint จากโมดูลแอปพลิเคชันที่เกี่ยวข้องจะเรียกใช้ Lint ใน
โมดูลฟีเจอร์แบบไดนามิกและรวมปัญหาทั้งหมดใน Lint ของแอป
รายงาน ปัญหาที่ทราบแล้วที่เกี่ยวข้องคือเมื่อเรียกใช้ Lint
ด้วย checkDependencies = true
จากโมดูลแอป
จะไม่มีการตรวจสอบทรัพยากร Dependency ของไลบรารีฟีเจอร์ไดนามิก เว้นแต่จะเป็นแอปด้วย
ทรัพยากร Dependency (ปัญหา
#191977888)
การเรียกใช้ Lint ในตัวแปรเริ่มต้นเท่านั้น
การเรียกใช้ ./gradlew :app:lint
ตอนนี้เรียกใช้ Lint เฉพาะ
รูปแบบเริ่มต้น ใน AGP เวอร์ชันก่อนหน้า ระบบจะเรียกใช้ Lint
รายละเอียดปลีกย่อย
ไม่มีคำเตือนของชั้นเรียนในตัวลดขนาด R8
R8 ได้แม่นยำยิ่งขึ้นและ
จัดการชั้นเรียนที่ขาดหายไปและตัวเลือก -dontwarn
อย่างสม่ำเสมอ
คุณจึงควรเริ่มประเมินคำเตือนคลาสที่ขาดหายไปซึ่งส่งขึ้นมา
โดย R8
เมื่อ R8 พบการอ้างอิงคลาสที่ไม่ได้กำหนดไว้ในแอป หรือ ทรัพยากร Dependency อย่างใดอย่างหนึ่ง ระบบจะแสดงคำเตือนที่ปรากฏในบิลด์ของคุณ เอาต์พุต เช่น
R8: Missing class: java.lang.instrument.ClassFileTransformer
คำเตือนนี้หมายความว่าคำจำกัดความของคลาส
ไม่พบ java.lang.instrument.ClassFileTransformer
เมื่อวิเคราะห์โค้ดของแอป แม้ว่าโดยปกติจะหมายความว่ามีข้อผิดพลาด
คุณไม่จำเป็นต้องสนใจคำเตือนนี้ก็ได้ สาเหตุที่พบบ่อย 2 ประการ
การไม่สนใจคำเตือนมีดังนี้
-
ไลบรารีที่กำหนดเป้าหมาย JVM และคลาสที่หายไปเป็น JVM ประเภทไลบรารี (ตามตัวอย่างด้านบน)
-
ทรัพยากร Dependency รายการหนึ่งของคุณใช้ API เวลาคอมไพล์เท่านั้น
คุณจะเพิกเฉยต่อคำเตือนของชั้นเรียนที่ขาดหายไปได้โดยการเพิ่ม -dontwarn
ลงในไฟล์ proguard-rules.pro
เช่น
-dontwarn java.lang.instrument.ClassFileTransformer
เพื่อความสะดวก AGP จะสร้างไฟล์ที่มี
ที่ขาดหายไป โดยเขียนลงในเส้นทางของไฟล์ดังเช่นตัวอย่างต่อไปนี้
app/build/outputs/mapping/release/missing_rules.txt
เพิ่ม
ลงในไฟล์ proguard-rules.pro
เพื่อไม่สนใจคำเตือน
ใน AGP 7.0 ข้อความในชั้นเรียนที่หายไปจะปรากฏเป็นคำเตือน และคุณสามารถ
เปลี่ยนให้มีข้อผิดพลาดได้โดยการตั้งค่า
android.r8.failOnMissingClasses = true
นิ้ว
gradle.properties
ใน AGP 8.0 คำเตือนเหล่านี้จะกลายเป็น
ที่ทำให้บิลด์ของคุณเสียหาย คุณสามารถเปิดใช้ลักษณะการทำงานของ AGP 7.0 ได้โดย
กำลังเพิ่มตัวเลือก -ignorewarnings
ใน
proguard-rules.pro
แต่ไม่แนะนำ
นำแคชบิลด์ของปลั๊กอิน Android Gradle ออกแล้ว
ระบบได้นำแคชของบิลด์ AGP ออกจาก AGP 4.1 แล้ว เปิดตัวก่อนหน้านี้ใน AGP 2.3 มีการใช้แคชบิลด์ AGP เพื่อเสริมแคชบิลด์ของ Gradle โดยแคชบิลด์ของ Gradle ใน AGP 4.1 เท่านั้น การเปลี่ยนแปลงนี้จะไม่ส่งผลต่อ เวลาบิลด์
ใน AGP 7.0 พร็อพเพอร์ตี้ android.enableBuildCache
พร็อพเพอร์ตี้ android.buildCacheDir
และ
นำงาน cleanBuildCache
รายการออกแล้ว
ใช้ซอร์สโค้ด Java 11 ในโปรเจ็กต์ของคุณ
ตอนนี้คุณสามารถคอมไพล์ซอร์สโค้ด Java 11 ในโปรเจ็กต์ของแอปได้สูงสุด คุณสามารถใช้คุณลักษณะภาษาใหม่ๆ เช่น เมธอดอินเตอร์เฟซส่วนตัว ไดมอนด์ สำหรับคลาสที่ไม่ระบุตัวตน และไวยากรณ์ตัวแปรในเครื่องสำหรับพารามิเตอร์ lambda
หากต้องการเปิดใช้ฟีเจอร์นี้ ให้ตั้งค่า compileOptions
เป็น
เวอร์ชัน Java และตั้งค่า compileSdkVersion
เป็น 30 ขึ้นไป:
// build.gradle
android {
compileSdkVersion 30
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "11"
}
}
// build.gradle.kts
android {
compileSdkVersion(30)
compileOptions {
sourceCompatibility(JavaVersion.VERSION_11)
targetCompatibility(JavaVersion.VERSION_11)
}
kotlinOptions {
jvmTarget = "11"
}
}
นำการกำหนดค่าการขึ้นต่อกันออกแล้ว
ใน AGP 7.0 การกำหนดค่า (หรือขอบเขตทรัพยากร) ต่อไปนี้คือ นำออกแล้ว:
-
compile
เราได้เปลี่ยนมาใช้api
แทน ทั้งนี้ขึ้นอยู่กับ Use Case หรือimplementation
และมีผลกับตัวแปร *Compile เช่นdebugCompile
-
provided
ผลิตภัณฑ์นี้เปลี่ยนเป็นcompileOnly
และจะมีผลกับตัวแปร *ที่ระบุ ด้วย เช่นreleaseProvided
-
apk
ผลิตภัณฑ์นี้เปลี่ยนเป็นruntimeOnly
-
publish
ผลิตภัณฑ์นี้เปลี่ยนเป็นruntimeOnly
ในกรณีส่วนใหญ่ AGP การอัปเกรด Assistant จะย้ายข้อมูลโปรเจ็กต์ไปยังเวอร์ชันใหม่โดยอัตโนมัติ การกำหนดค่าเอง
การเปลี่ยนคลาสพาธเมื่อคอมไพล์เทียบกับ Android ปลั๊กอิน Gradle
หากกำลังคอมไพล์โดยใช้ปลั๊กอิน Android Gradle
classpath อาจมีการเปลี่ยนแปลง เนื่องจากตอนนี้ AGP ใช้ api/implementation
การกำหนดค่าภายในเครื่อง ระบบอาจนำอาร์ติแฟกต์บางส่วนออกจากคอมไพล์ของคุณ
คลาสพาธ หากคุณใช้ทรัพยากร Dependency ของ AGP ขณะคอมไพล์ ให้ใช้
เพิ่มเป็นทรัพยากร Dependency ที่ชัดเจน
การเพิ่มไลบรารีเนทีฟในทรัพยากร Java ไม่รองรับโฟลเดอร์
ก่อนหน้านี้คุณสามารถเพิ่มไลบรารีแบบเนทีฟในโฟลเดอร์ทรัพยากรของ Java และ
ลงทะเบียนโฟลเดอร์โดยใช้ android.sourceSets.main.resources.srcDirs
เพื่อให้ระบบดึงข้อมูลไลบรารีเนทีฟและเพิ่มลงในไฟล์สุดท้าย
APK ตั้งแต่ AGP 7.0 เป็นต้นไป จะไม่มีการสนับสนุน และไลบรารีแบบเนทีฟใน
ระบบจะไม่พิจารณาโฟลเดอร์ทรัพยากรของ Java แต่ให้ใช้วิธีการของ DSL แทน
ไลบรารีแบบเนทีฟ android.sourceSets.main.jniLibs.srcDirs
สำหรับ
ข้อมูลเพิ่มเติม โปรดดู
วิธีกำหนดค่า
ชุดแหล่งที่มา
ปัญหาที่ทราบ
ส่วนนี้อธิบายปัญหาที่ทราบในปลั๊กอิน Android Gradle 7.0.0
เข้ากันไม่ได้กับปลั๊กอิน Kotlin Multiplatform 1.4.x
ปลั๊กอิน Android Gradle 7.0.0 ใช้ได้กับ คอตลิน ปลั๊กอินหลายแพลตฟอร์ม 1.5.0 ขึ้นไป โปรเจ็กต์ที่ใช้ Kotlin การรองรับหลายแพลตฟอร์มจำเป็นต้องอัปเดตเป็น Kotlin 1.5.0 เพื่อใช้ Android Gradle ปลั๊กอิน 7.0.0 ในการแก้ปัญหาเฉพาะหน้า คุณอาจดาวน์เกรดปลั๊กอิน Android Gradle เป็น 4.2.x แต่เราไม่แนะนำให้ทำเช่นนั้น
สำหรับข้อมูลเพิ่มเติม โปรดดู KT-43944
ไม่มีเอาต์พุตของ Lint
ไม่มีเอาต์พุตข้อความ Lint ที่พิมพ์ไปยัง Stdout เมื่องาน Lint คือ ล่าสุด (ปัญหา #191897708) ดูบริบทเพิ่มเติมได้ที่ การเปลี่ยนแปลงลักษณะการทำงานของ Lint ฉบับนี้ จะได้รับการแก้ไขในปลั๊กอิน Android Gradle 7.1
ทรัพยากร Dependency ของไลบรารีฟีเจอร์แบบไดนามิกบางรายการไม่ได้รับการตรวจสอบโดยใช้ Lint
เมื่อใช้ Lint กับ checkDependencies = true
จาก
โมดูลแอป, ทรัพยากร Dependency ของไลบรารีฟีเจอร์แบบไดนามิกจะไม่ได้รับการตรวจสอบ เว้นแต่
แต่ยังเป็นทรัพยากร Dependency ของแอป
(ปัญหา #191977888)
ในการแก้ไขเบื้องต้น คุณสามารถเรียกใช้งาน Lint ในไลบรารีเหล่านั้นได้ หากต้องการบริบทเพิ่มเติม
ดูการเปลี่ยนแปลงลักษณะการทำงานของ Lint