ปลั๊กอิน Android Gradle 7.0.0 (กรกฎาคม 2021)
ปลั๊กอิน Android Gradle 7.0.0 เป็นรุ่นหลักที่มีฟีเจอร์และการปรับปรุงใหม่ๆ มากมาย
7.0.1 (สิงหาคม 2021)
การอัปเดตเล็กน้อยนี้มีการแก้ไขข้อบกพร่องหลายรายการ หากต้องการดูรายการข้อบกพร่องที่แก้ไขแล้วที่สำคัญ โปรดอ่านโพสต์ที่เกี่ยวข้องใน บล็อกการอัปเดตรุ่น
ความเข้ากันได้
เวอร์ชันต่ำสุด | เวอร์ชันเริ่มต้น | หมายเหตุ | |
---|---|---|---|
Gradle | 7.0.2 | 7.0.2 | ดูข้อมูลเพิ่มเติมได้ที่การอัปเดต Gradle |
เครื่องมือสร้าง SDK | 30.0.2 | 30.0.2 | ติดตั้งหรือกําหนดค่าเครื่องมือสร้าง SDK |
NDK | ไม่มี | 21.4.7075529 | ติดตั้งหรือกําหนดค่า NDK เวอร์ชันอื่น |
JDK | 11 | 11 | ดูข้อมูลเพิ่มเติมได้ที่การตั้งค่าเวอร์ชัน JDK |
ต้องใช้ JDK 11 เพื่อเรียกใช้ AGP 7.0
เมื่อใช้ปลั๊กอิน Android Gradle 7.0 เพื่อสร้างแอป คุณต้องใช้ JDK 11 เพื่อเรียกใช้ 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 และเครื่องมือจัดการ AVD ในแพ็กเกจเครื่องมือ SDK ที่เลิกใช้งานแล้วใช้กับ JDK 11 ไม่ได้ หากต้องการใช้เครื่องมือจัดการ SDK และเครื่องมือจัดการ AVD กับ AGP 7.0 ขึ้นไปต่อไป คุณต้องเปลี่ยนไปใช้เครื่องมือเวอร์ชันใหม่ในแพ็กเกจเครื่องมือบรรทัดคำสั่ง Android SDK เวอร์ชันปัจจุบัน
Variant API เวอร์ชันเสถียร
Variant API เวอร์ชันใหม่พร้อมใช้งานอย่างเสถียรแล้ว ดูอินเทอร์เฟซใหม่ในแพ็กเกจ com.android.build.api.variant และดูตัวอย่างในโปรเจ็กต์ GitHub ของ gradle-recipes เราได้จัดเตรียมไฟล์สื่อกลางจำนวนหนึ่งที่เรียกว่าอาร์ติแฟกต์ไว้ให้ใช้งานผ่านอินเทอร์เฟซอาร์ติแฟกต์ ซึ่งเป็นส่วนหนึ่งของ Variant API เวอร์ชันใหม่ คุณรับอาร์ติแฟกต์เหล่านี้ เช่น ไฟล์ Manifest ที่ผสานแล้ว ได้อย่างปลอดภัยและปรับแต่งโดยใช้ปลั๊กอินและโค้ดของบุคคลที่สาม
เราจะขยาย Variant API ต่อไปด้วยการเพิ่มฟังก์ชันการทำงานใหม่ๆ และเพิ่มจำนวนอาร์ติแฟกต์ระดับกลางที่เรามีให้ปรับแต่ง
การเปลี่ยนแปลงลักษณะการทํางานของ Lint
ส่วนนี้จะอธิบายการเปลี่ยนแปลงลักษณะการทํางานหลายอย่างของ Lint ในปลั๊กอิน Android Gradle 7.0.0
ปรับปรุงโปรแกรมตรวจหาข้อบกพร่องสำหรับทรัพยากร Dependency ของไลบรารี
ตอนนี้การเรียกใช้ Lint ด้วย checkDependencies = true
ทำงานได้เร็วขึ้นกว่าที่เคย สําหรับโปรเจ็กต์ Android ที่แอปมีทรัพยากร Dependency ของไลบรารี เราขอแนะนําให้ตั้งค่า checkDependencies
เป็น true
ดังที่แสดงด้านล่าง และเรียกใช้ Lint ผ่าน ./gradlew :app:lint
ซึ่งจะวิเคราะห์ข้อบังคับทั้งหมดของข้อกําหนด Dependency พร้อมกันและสร้างรายงานเดียวซึ่งรวมปัญหาจากแอปและข้อกําหนด Dependency ทั้งหมด
Groovy
// build.gradle
android {
...
lintOptions {
checkDependencies true
}
}
Kotlin
// build.gradle.kts
android {
...
lint {
isCheckDependencies = true
}
}
ตอนนี้งาน Lint จะเป็น "อัปเดต" ได้แล้ว
หากแหล่งที่มาและทรัพยากรของโมดูลไม่มีการเปลี่ยนแปลง ก็ไม่จำเป็นต้องเรียกใช้งานการวิเคราะห์ Lint ของโมดูลนั้นอีกครั้ง เมื่อเกิดกรณีนี้ขึ้น การดำเนินการของงานจะปรากฏเป็น "อัปเดตแล้ว" ในเอาต์พุต Gradle การเปลี่ยนแปลงนี้ทำให้เมื่อเรียกใช้ Lint ในโมดูลแอปพลิเคชันด้วย checkDependencies = true
จะมีเพียงโมดูลที่มีการเปลี่ยนแปลงเท่านั้นที่ต้องเรียกใช้การวิเคราะห์ ด้วยเหตุนี้ Lint จึงทำงานได้เร็วขึ้น
นอกจากนี้ ไม่จำเป็นต้องเรียกใช้งานรายงาน Lint หากอินพุตไม่มีการเปลี่ยนแปลง ปัญหาที่ทราบที่เกี่ยวข้องคือไม่มีเอาต์พุตข้อความของ Lint ที่พิมพ์ไปยัง stdout เมื่องาน Lint เป็น "อัปเดต" (ปัญหา #191897708)
เรียกใช้ Lint ในโมดูลฟีเจอร์แบบไดนามิก
AGP ไม่รองรับการเรียกใช้ Lint จากโมดูลฟีเจอร์แบบไดนามิกอีกต่อไป
การเรียกใช้ Lint จากโมดูลแอปพลิเคชันที่เกี่ยวข้องจะเรียกใช้ Lint ในโมดูลฟีเจอร์แบบไดนามิกและรวมปัญหาทั้งหมดไว้ในรายงาน Lint ของแอป ปัญหาที่ทราบที่เกี่ยวข้องคือเมื่อเรียกใช้ Lint ด้วย checkDependencies = true
จากโมดูลแอป ระบบจะไม่ตรวจสอบ Dependency ของไลบรารีฟีเจอร์แบบไดนามิก เว้นแต่ว่าจะเป็น Dependency ของแอปด้วย (ปัญหา #191977888)
เรียกใช้โปรแกรมตรวจไวยากรณ์ในตัวแปรเริ่มต้นเท่านั้น
ตอนนี้การเรียกใช้ ./gradlew :app:lint
จะเรียกใช้โปรแกรมตรวจสอบโค้ดสำหรับตัวแปรเริ่มต้นเท่านั้น ใน AGP เวอร์ชันก่อนหน้า เครื่องมือนี้จะเรียกใช้ Lint สำหรับตัวแปรทั้งหมด
ไม่มีคำเตือนระดับชั้นเรียนในเครื่องมือบีบอัด R8
R8 จัดการคลาสที่ขาดหายไปและตัวเลือก -dontwarn
ได้อย่างแม่นยำและสม่ำเสมอมากขึ้น
คุณจึงควรเริ่มประเมินคำเตือนคลาสที่ขาดหายไปซึ่ง R8 แสดง
เมื่อ R8 พบการอ้างอิงคลาสที่ไม่ได้กำหนดไว้ในแอปหรือหนึ่งในข้อกำหนด เครื่องมือจะแสดงคำเตือนที่ปรากฏในเอาต์พุตของบิลด์ เช่น
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 ซึ่งเปิดตัวไปก่อนหน้านี้ใน AGP 2.3 เพื่อเสริมแคชการสร้าง 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"
}
}
นำการกำหนดค่าทรัพยากร Dependency ออกแล้ว
ใน AGP 7.0 ระบบได้นำการกำหนดค่า (หรือขอบเขตของข้อกำหนด) ต่อไปนี้ออกแล้ว
-
compile
ตอนนี้มีการใช้api
หรือimplementation
แทนแล้ว ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน
มีผลกับตัวแปร *Compile ด้วย เช่นdebugCompile
-
provided
ระบบได้แทนที่compileOnly
แทนแล้ว
มีผลกับผลิตภัณฑ์ย่อย*ที่ระบุด้วย เช่นreleaseProvided
-
apk
ระบบได้แทนที่runtimeOnly
แทนแล้ว -
publish
ระบบได้แทนที่runtimeOnly
แทนแล้ว
ในกรณีส่วนใหญ่ ผู้ช่วยการอัปเกรด AGP จะย้ายข้อมูลโปรเจ็กต์ของคุณไปยังการกำหนดค่าใหม่โดยอัตโนมัติ
การเปลี่ยนแปลงเส้นทางเมื่อคอมไพล์กับปลั๊กอิน Gradle ของ Android
หากคุณคอมไพล์กับปลั๊กอิน Gradle ของ Android เส้นทางคอมไพล์ของคุณอาจเปลี่ยนแปลง เนื่องจากตอนนี้ AGP ใช้การกำหนดค่า api/implementation
ภายใน จึงอาจนำอาร์ติแฟกต์บางรายการออกจาก classpath ของคอมไพล์ หากคุณใช้ทรัพยากร 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 ใช้ได้กับปลั๊กอิน Kotlin แบบหลายแพลตฟอร์ม 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
ไลบรารีฟีเจอร์แบบไดนามิกบางรายการอาจไม่ได้รับการเรียกใช้เครื่องมือตรวจสอบโค้ด
เมื่อเรียกใช้ Lint ด้วย checkDependencies = true
จากข้อบังคับของแอป ระบบจะไม่ตรวจสอบทรัพยากร Dependency ของไลบรารีฟีเจอร์แบบไดนามิก เว้นแต่ว่าจะเป็นทรัพยากร Dependency ของแอปด้วย (ปัญหา #191977888)
วิธีแก้ปัญหาชั่วคราวคือเรียกใช้งาน Lint ในไลบรารีเหล่านั้น ดูบริบทเพิ่มเติมได้ในส่วนการเปลี่ยนแปลงลักษณะการทํางานของ Lint