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

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