ปลั๊กอิน 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 Manager และ AVD Manager ในแพ็กเกจเครื่องมือ SDK ที่เลิกใช้งานแล้ว ใช้กับ JDK 11 ไม่ได้ หากต้องการใช้ SDK Manager และ AVD Manager กับ AGP 7.0 ขึ้นไปต่อไป คุณจะต้องเปลี่ยนไปใช้เครื่องมือเวอร์ชันใหม่ใน แพ็กเกจเครื่องมือบรรทัดคำสั่งของ Android SDKปัจจุบัน

API ของตัวแปรมีเสถียรภาพ

ตอนนี้ Variant API ใหม่เสถียรแล้ว ดูอินเทอร์เฟซใหม่ในแพ็กเกจ com.android.build.api.variant และตัวอย่างในโปรเจ็กต์ gradle-recipes ใน GitHub เราได้จัดเตรียมไฟล์กลางจำนวนหนึ่งที่เรียกว่าอาร์ติแฟกต์ไว้ให้ใช้งานผ่านอินเทอร์เฟซอาร์ติแฟกต์ ซึ่งเป็นส่วนหนึ่งของ Variant API ใหม่ คุณสามารถรับอาร์ติแฟกต์เหล่านี้ เช่น 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 ทั้งหมดของแอป

Groovy

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

ตอนนี้งาน Lint สามารถเป็น UP-TO-DATE ได้แล้ว

หากแหล่งที่มาและทรัพยากรของโมดูลไม่เปลี่ยนแปลง คุณก็ไม่จำเป็นต้องเรียกใช้ งานการวิเคราะห์ Lint สำหรับโมดูลอีกครั้ง เมื่อเกิดกรณีนี้ การดำเนินการของงานจะปรากฏเป็น "ล่าสุด" ในเอาต์พุต Gradle การเปลี่ยนแปลงนี้จะทำให้เมื่อเรียกใช้ Lint ในโมดูลแอปพลิเคชันที่มี checkDependencies = true เฉพาะโมดูลที่มีการเปลี่ยนแปลงเท่านั้นที่จะต้องเรียกใช้การวิเคราะห์ จึงทำให้ Lint ทำงานได้เร็วขึ้น

นอกจากนี้ คุณไม่จำเป็นต้องเรียกใช้ Task รายงาน 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 พบการอ้างอิงคลาสที่ไม่ได้กำหนดไว้ในแอปหรือ การอ้างอิงคลาสที่ไม่ได้กำหนดไว้ในหนึ่งในการอ้างอิงของแอป 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 4.1 ได้นำแคชบิลด์ AGP ออกแล้ว แคชบิลด์ของ 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"
  }
}

นำการกำหนดค่าการขึ้นต่อกันออกแล้ว

ใน AGP 7.0 เราได้นำการกำหนดค่า (หรือขอบเขตการอ้างอิง) ต่อไปนี้ออก แล้ว

  • compile
    api หรือ implementation จะแทนที่การดำเนินการนี้ ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน
    รวมถึงใช้กับตัวแปร *Compile ด้วย เช่น debugCompile
  • provided
    ฟีเจอร์นี้ถูกแทนที่ด้วย compileOnly
    นอกจากนี้ยังใช้กับผลิตภัณฑ์ย่อย*ที่ระบุด้วย เช่น releaseProvided
  • apk
    ฟีเจอร์นี้ถูกแทนที่ด้วย runtimeOnly
  • publish
    ฟีเจอร์นี้ถูกแทนที่ด้วย runtimeOnly

ในกรณีส่วนใหญ่ AGP Upgrade Assistant จะย้ายข้อมูลโปรเจ็กต์ไปยังการกำหนดค่าใหม่โดยอัตโนมัติ

การเปลี่ยนแปลง Classpath เมื่อคอมไพล์กับปลั๊กอิน Android Gradle

หากคุณกำลังคอมไพล์กับปลั๊กอิน Android Gradle เส้นทางคลาสของคอมไพล์ อาจเปลี่ยนแปลง เนื่องจากตอนนี้ 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 Multiplatform ต้องอัปเดตเป็น 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

เมื่อเรียกใช้ Lint ด้วย checkDependencies = true จากโมดูลแอป ระบบจะไม่ตรวจสอบทรัพยากร Dependency ของไลบรารีฟีเจอร์แบบไดนามิก เว้นแต่ว่าทรัพยากรเหล่านั้นจะเป็นทรัพยากร Dependency ของแอปด้วย (ปัญหา #191977888) คุณแก้ไขปัญหาเบื้องต้นได้โดยเรียกใช้งาน Lint ในไลบรารีเหล่านั้น ดูบริบทเพิ่มเติมได้ที่การเปลี่ยนแปลงลักษณะการทำงานของ Lint