ปลั๊กอิน 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 ประการที่ควรละเว้นคำเตือนมีดังนี้

  1. ไลบรารีที่กำหนดเป้าหมายเป็น JVM และคลาสที่ขาดหายไปเป็นประเภทไลบรารี JVM (ดังตัวอย่างด้านบน)

  2. 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