ปลั๊กอิน 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 ให้ใช้ JDK 11 โดยค่าเริ่มต้น ซึ่งหมายความว่าผู้ใช้ Android Studio ส่วนใหญ่ไม่จำเป็นต้องทำการเปลี่ยนแปลงการกำหนดค่าในโปรเจ็กต์
หากต้องการตั้งค่าเวอร์ชัน JDK ที่ AGP ใช้ภายใน Android Studio ด้วยตนเอง คุณต้องใช้ JDK 11 ขึ้นไป
เมื่อใช้ AGP แยกจาก Android Studio ให้อัปเกรดเวอร์ชัน JDK โดย
ตั้งค่าตัวแปรสภาพแวดล้อม JAVA_HOME
หรือ-Dorg.gradle.java.home ตัวเลือกบรรทัดคำสั่ง
เป็นไดเรกทอรีการติดตั้ง JDK 11
โปรดทราบว่า เครื่องมือจัดการ SDK และ AVD Manager ในแพ็กเกจ SDK Tools ที่เลิกใช้งานแล้ว จะทำงานร่วมกับ JDK 11 ไม่ได้ หากต้องการใช้เครื่องมือจัดการ SDK และ AVD Manager กับ AGP 7.0 ขึ้นไปต่อไป คุณต้องเปลี่ยนไปใช้เครื่องมือเวอร์ชันใหม่ใน แพ็กเกจ Android SDK Command-Line Tools ปัจจุบัน
API ของตัวแปรมีเสถียรภาพแล้ว
API ของตัวแปรใหม่มีเสถียรภาพแล้ว ดูอินเทอร์เฟซใหม่ในแพ็กเกจ com.android.build.api.variant และตัวอย่างในโปรเจ็กต์ gradle-recipes GitHub เราได้จัดเตรียมไฟล์ระดับกลางจำนวนหนึ่งที่เรียกว่าอาร์ติแฟกต์ผ่านอินเทอร์เฟซ อาร์ติแฟกต์ ซึ่งเป็นส่วนหนึ่งของ API ของตัวแปรใหม่ คุณสามารถรับและปรับแต่งอาร์ติแฟกต์เหล่านี้ เช่น ไฟล์ Manifest ที่ผสานแล้วได้อย่างปลอดภัยโดยใช้ปลั๊กอินและโค้ดของบุคคลที่สาม
เราจะขยาย API ของตัวแปรต่อไปโดยการเพิ่มฟังก์ชันการทำงานใหม่ๆ และเพิ่มจำนวนอาร์ติแฟกต์ระดับกลางที่เราจัดเตรียมไว้ให้คุณปรับแต่ง
การเปลี่ยนแปลงลักษณะการทำงานของเครื่องมือวิเคราะห์ซอร์สโค้ด
ส่วนนี้อธิบายการเปลี่ยนแปลงลักษณะการทำงานหลายอย่างของเครื่องมือวิเคราะห์ซอร์สโค้ดในปลั๊กอิน Android Gradle เวอร์ชัน 7.0.0
ปรับปรุงเครื่องมือวิเคราะห์ซอร์สโค้ดสำหรับการอ้างอิงไลบรารี
การเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดด้วย checkDependencies = true ตอนนี้เร็วกว่าเดิม
สำหรับโปรเจ็กต์ Android ที่ประกอบด้วยแอปที่มีการอ้างอิงไลบรารี เราขอแนะนำให้ตั้งค่า checkDependencies เป็น true ดังที่แสดงด้านล่าง และเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดผ่าน ./gradlew :app:lint ซึ่งจะวิเคราะห์โมดูลทรัพยากร Dependency ทั้งหมดแบบขนานและสร้างรายงานเดียวที่มีปัญหาจากแอปและทรัพยากร Dependency ทั้งหมด
ดึงดูด
// build.gradle
android {
...
lintOptions {
checkDependencies true
}
}Kotlin
// build.gradle.kts
android {
...
lint {
isCheckDependencies = true
}
}ตอนนี้งานของเครื่องมือวิเคราะห์ซอร์สโค้ดอาจเป็น UP-TO-DATE
หากซอร์สและทรัพยากรของโมดูลไม่เปลี่ยนแปลง คุณก็ไม่จำเป็นต้องเรียกใช้งานวิเคราะห์ซอร์สโค้ด
สำหรับโมดูลนั้นอีก เมื่อเกิดกรณีนี้ การ
ดำเนินการของงานจะปรากฏเป็น "UP-TO-DATE" ในเอาต์พุตของ Gradle
การเปลี่ยนแปลงนี้จะทำให้เมื่อเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดในโมดูลแอปพลิเคชันด้วย checkDependencies = true เฉพาะโมดูลที่เปลี่ยนแปลงเท่านั้นที่จะต้องเรียกใช้งานวิเคราะห์ เครื่องมือวิเคราะห์ซอร์สโค้ดจึงทำงานได้เร็วยิ่งขึ้น
นอกจากนี้ งานรายงานของเครื่องมือวิเคราะห์ซอร์สโค้ดก็ไม่จำเป็นต้องเรียกใช้หากอินพุตไม่ เปลี่ยนแปลง ปัญหาที่ทราบ ที่เกี่ยวข้องคือไม่มีเอาต์พุตข้อความของเครื่องมือวิเคราะห์ซอร์สโค้ดพิมพ์ไปยัง stdout เมื่องานของเครื่องมือวิเคราะห์ซอร์สโค้ดเป็น UP-TO-DATE (ปัญหา #191897708)
การเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดในโมดูลฟีเจอร์แบบไดนามิก
AGP ไม่รองรับการเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดจากโมดูลฟีเจอร์แบบไดนามิกอีกต่อไป
การเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดจากโมดูลแอปพลิเคชันที่เกี่ยวข้องจะเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดใน
โมดูลฟีเจอร์แบบไดนามิกและรวมปัญหาทั้งหมดไว้ในรายงานของเครื่องมือวิเคราะห์ซอร์สโค้ดของแอป
ปัญหาที่ทราบ ที่เกี่ยวข้องคือเมื่อเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ด
ด้วย checkDependencies = true จากโมดูลแอปพลิเคชัน
ระบบจะไม่ตรวจสอบทรัพยากร Dependency ของไลบรารีฟีเจอร์แบบไดนามิก เว้นแต่ว่าทรัพยากร Dependency เหล่านั้นจะเป็นทรัพยากร Dependency ของแอปด้วย (ปัญหา
#191977888)
การเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดในตัวแปรเริ่มต้นเท่านั้น
การเรียกใช้ ./gradlew :app:lint จะเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดสำหรับ
ตัวแปรเริ่มต้นเท่านั้น ใน AGP เวอร์ชันก่อนหน้า ระบบจะเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดสำหรับตัวแปรทั้งหมด
คำเตือนเกี่ยวกับคลาสที่ขาดหายไปใน R8 Shrinker
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.ClassFileTransformerAGP จะสร้างไฟล์ที่มีกฎที่อาจขาดหายไปทั้งหมดและเขียนกฎเหล่านั้นลงในเส้นทางไฟล์ เช่น 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 ในโปรเจ็กต์ของแอป ซึ่งช่วยให้ คุณใช้ฟีเจอร์ภาษาใหม่ๆ ได้ เช่น เมธอดอินเทอร์เฟซส่วนตัว, Diamond Operator สำหรับคลาสที่ไม่ระบุชื่อ และไวยากรณ์ตัวแปรเฉพาะที่สำหรับพารามิเตอร์ 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 เราได้นำการกำหนดค่า (หรือขอบเขตทรัพยากร Dependency) ต่อไปนี้ออกแล้ว
-
compile
การกำหนดค่านี้ถูกแทนที่ด้วยapiหรือimplementationทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน
นอกจากนี้ยังใช้กับตัวแปร *Compile ด้วย เช่นdebugCompile -
provided
การกำหนดค่านี้ถูกแทนที่ด้วยcompileOnly
นอกจากนี้ยังใช้กับตัวแปร *Provided ด้วย เช่น:releaseProvided -
apk
การกำหนดค่านี้ถูกแทนที่ด้วยruntimeOnly -
publish
การกำหนดค่านี้ถูกแทนที่ด้วยruntimeOnly
ในกรณีส่วนใหญ่ ผู้ช่วยอัปเกรด AGP จะย้ายข้อมูลโปรเจ็กต์ไปยังการกำหนดค่าใหม่ โดยอัตโนมัติ
การเปลี่ยนแปลง Classpath เมื่อคอมไพล์กับปลั๊กอิน Android Gradle
หากคุณกำลังคอมไพล์กับปลั๊กอิน Android Gradle Classpath ของการคอมไพล์
อาจเปลี่ยนแปลง เนื่องจากตอนนี้ AGP ใช้การกำหนดค่า api/implementation
ภายใน อาร์ติแฟกต์บางรายการจึงอาจถูกนำออกจาก Classpath ของการคอมไพล์ หากคุณขึ้นต่อกันกับทรัพยากร Dependency ของ AGP ในเวลาคอมไพล์ โปรดเพิ่มทรัพยากร Dependency นั้นเป็นทรัพยากร 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 Multiplatform plugin เวอร์ชัน 1.5.0 ขึ้นไป โปรเจ็กต์ที่ใช้การรองรับ Kotlin Multiplatform ต้องอัปเดตเป็น Kotlin เวอร์ชัน 1.5.0 จึงจะใช้ปลั๊กอิน Android Gradle เวอร์ชัน 7.0.0 ได้ คุณสามารถดาวน์เกรดปลั๊กอิน Android Gradle เป็นเวอร์ชัน 4.2.x เพื่อหลีกเลี่ยงปัญหา แต่เราไม่แนะนำให้ทำเช่นนั้น
ดูข้อมูลเพิ่มเติมได้ที่ KT-43944.
เอาต์พุตของเครื่องมือวิเคราะห์ซอร์สโค้ดขาดหายไป
ไม่มีเอาต์พุตข้อความของเครื่องมือวิเคราะห์ซอร์สโค้ดพิมพ์ไปยัง stdout เมื่องานของเครื่องมือวิเคราะห์ซอร์สโค้ดเป็น UP-TO-DATE (ปัญหา #191897708) ดูบริบทเพิ่มเติมได้ที่ การเปลี่ยนแปลงลักษณะการทำงานของเครื่องมือวิเคราะห์ซอร์สโค้ด เราจะแก้ไขปัญหานี้ ในปลั๊กอิน Android Gradle เวอร์ชัน 7.1
ระบบไม่ได้ตรวจสอบทรัพยากร Dependency ของไลบรารีฟีเจอร์แบบไดนามิกทั้งหมดด้วยเครื่องมือวิเคราะห์ซอร์สโค้ด
เมื่อเรียกใช้เครื่องมือวิเคราะห์ซอร์สโค้ดด้วย checkDependencies = true จากโมดูลแอปพลิเคชัน ระบบจะไม่ตรวจสอบทรัพยากร Dependency ของไลบรารีฟีเจอร์แบบไดนามิก เว้นแต่ว่าทรัพยากร Dependency เหล่านั้นจะเป็นทรัพยากร Dependency ของแอปด้วย (ปัญหา #191977888)
คุณสามารถเรียกใช้งานของเครื่องมือวิเคราะห์ซอร์สโค้ดในไลบรารีเหล่านั้นเพื่อหลีกเลี่ยงปัญหา ดูบริบทเพิ่มเติมได้ที่
ดู การเปลี่ยนแปลงลักษณะการทำงานของเครื่องมือวิเคราะห์ซอร์สโค้ด