ปลั๊กอิน Android Gradle เวอร์ชัน 4.1.0 (สิงหาคม 2020)

ความเข้ากันได้

เวอร์ชันขั้นต่ำ เวอร์ชันเริ่มต้น หมายเหตุ
Gradle 6.5 ไม่มี ดูข้อมูลเพิ่มเติมได้ที่การอัปเดต Gradle
เครื่องมือสร้าง SDK 29.0.2 29.0.2 ติดตั้งหรือกำหนดค่าเครื่องมือสร้าง SDK
NDK ไม่มี 21.1.6352462 ติดตั้งหรือกำหนดค่า NDK เวอร์ชันอื่น

<p>This version of the Android plugin requires the following:</p>
<ul>
  <li>
    <p><a href="https://docs.gradle.org/6.5.1/release-notes.html">Gradle 6.5</a>.
    To learn more, read the section about <a href="#updating-gradle">updating
    Gradle</a>.</p>
  </li>
  <li>
    <p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
    29.0.2</a> or higher.</p>
  </li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>

ฟีเจอร์ใหม่

ปลั๊กอิน Android Gradle เวอร์ชันนี้มีฟีเจอร์ใหม่ดังต่อไปนี้

การรองรับ Kotlin Script DSL

เพื่อช่วยปรับปรุงประสบการณ์การแก้ไขสำหรับผู้ใช้ Kotlin Buildscript ตอนนี้ DSL และ API ของปลั๊กอิน Android Gradle เวอร์ชัน 4.1 ได้รับการกำหนดไว้ในชุดอินเทอร์เฟซ Kotlin แยกจากคลาสการใช้งาน ซึ่งหมายความว่า

  • ตอนนี้มีการประกาศการอนุญาตให้เป็น Null และการเปลี่ยนแปลงได้ของประเภท Kotlin อย่างชัดเจน
  • เอกสารประกอบที่สร้างจากอินเทอร์เฟซเหล่านั้นจะเผยแพร่ใน ข้อมูลอ้างอิงของ Kotlin API
  • มีการกำหนดพื้นผิว API ของปลั๊กอิน Android Gradle อย่างชัดเจน เพื่อให้ การขยายบิลด์ Android มีความยืดหยุ่นมากขึ้นในอนาคต

สำคัญ: หากคุณใช้สคริปต์บิลด์ KTS หรือใช้ Kotlin ใน buildSrc, การดำเนินการนี้อาจทำให้เกิดการหยุดชะงักของความเข้ากันได้ของซอร์สสำหรับข้อผิดพลาดบางอย่าง ที่อาจแสดงเป็นข้อผิดพลาดรันไทม์ในรุ่นก่อนหน้า

ตอนนี้มีการกำหนดประเภทคอลเล็กชันที่ออกแบบมาให้เปลี่ยนแปลงได้ใน DSL อย่างสม่ำเสมอ ดังนี้

val collection: MutableCollectionType

ซึ่งหมายความว่าคุณจะไม่สามารถเขียนโค้ดต่อไปนี้ ในสคริปต์ Kotlin สำหรับคอลเล็กชันบางรายการที่เคยรองรับได้อีกต่อไป

collection = collectionTypeOf(...)

อย่างไรก็ตาม ระบบรองรับการเปลี่ยนแปลงคอลเล็กชันอย่างสม่ำเสมอ ดังนั้น collection += … และ collection.add(...) ควรใช้งานได้ทุกที่แล้ว

หากพบปัญหาเมื่ออัปเกรดโปรเจ็กต์ที่ใช้ API และ DSL ของ Kotlin ในปลั๊กอิน Android Gradle โปรดรายงานข้อบกพร่อง

ส่งออกทรัพยากร Dependency ของ C/C++ จาก AAR

ปลั๊กอิน Android Gradle เวอร์ชัน 4.0 เพิ่มความสามารถในการ นำเข้าแพ็กเกจ Prefab ในทรัพยากร Dependency ของ AAR ใน AGP 4.1, ตอนนี้คุณสามารถส่งออกไลบรารีจากบิลด์แบบเนทีฟภายนอกใน AAR สำหรับโปรเจ็กต์ไลบรารี Android ได้แล้ว

หากต้องการส่งออกไลบรารีแบบเนทีฟ ให้เพิ่มโค้ดต่อไปนี้ลงในบล็อก android ของ ไฟล์ build.gradle ของโปรเจ็กต์ไลบรารี

buildFeatures {
    prefabPublishing true
}

prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }

<var>myotherlibrary</var> {
    headers "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

buildFeatures {
    prefabPublishing = true
}

prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }

create("<var>myotherlibrary</var>") {
    headers = "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

ในตัวอย่างนี้ ไลบรารี mylibrary และ myotherlibrary จะได้รับการแพ็กเกจใน AAR ที่สร้างโดยบิลด์ และแต่ละไลบรารีจะส่งออกส่วนหัวจากไดเรกทอรีที่ระบุไปยังทรัพยากร Dependency

หมายเหตุ: การตั้งค่าการกำหนดค่าสำหรับการนำเข้าไลบรารีแบบเนทีฟที่สร้างไว้ล่วงหน้ามีการเปลี่ยนแปลงสำหรับผู้ใช้ปลั๊กอิน Android Gradle เวอร์ชัน 4.0 ขึ้นไป ดูข้อมูลเพิ่มเติมได้ใน บันทึกประจำรุ่น 4.0

การรองรับ R8 สำหรับข้อมูลเมตาของ Kotlin

Kotlin ใช้ข้อมูลเมตาที่กำหนดเองในไฟล์คลาส Java เพื่อระบุโครงสร้างภาษา Kotlin ตอนนี้ R8 รองรับการรักษาและเขียนข้อมูลเมตาของ Kotlin ใหม่เพื่อรองรับการลดขนาดไลบรารีและแอปพลิเคชัน Kotlin อย่างเต็มรูปแบบโดยใช้ kotlin-reflect

หากต้องการเก็บข้อมูลเมตาของ Kotlin ไว้ ให้เพิ่มกฎการเก็บรักษาต่อไปนี้

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

ซึ่งจะสั่งให้ R8 เก็บข้อมูลเมตาของ Kotlin ไว้สำหรับคลาสทั้งหมดที่ เก็บไว้โดยตรง

ดูข้อมูลเพิ่มเติมได้ที่ Shrinking Kotlin libraries and applications using Kotlin reflection with R8{:.external} ใน Medium

การยืนยันในบิลด์การแก้ไขข้อบกพร่อง

เมื่อคุณสร้างแอปเวอร์ชันการแก้ไขข้อบกพร่องโดยใช้ปลั๊กอิน Android Gradle เวอร์ชัน 4.1.0 ขึ้นไป คอมไพเลอร์ในตัว (D8) จะเขียนโค้ดของแอปใหม่ เพื่อเปิดใช้การยืนยันในเวลาคอมไพล์ คุณจึงมีการตรวจสอบการยืนยัน ที่ใช้งานอยู่เสมอ

การเปลี่ยนแปลงพฤติกรรม

นำแคชบิลด์ของปลั๊กอิน Android Gradle ออกแล้ว

เราได้นำแคชบิลด์ของ AGP ออกใน AGP 4.1 แคชบิลด์ของ AGP ซึ่งเปิดตัวครั้งแรกใน AGP 2.3 เพื่อเสริมแคชบิลด์ของ Gradle ได้รับการแทนที่ด้วยแคชบิลด์ของ Gradle ทั้งหมดใน AGP 4.1 การเปลี่ยนแปลงนี้ไม่ส่งผลต่อเวลาบิลด์

เราได้เลิกใช้งานงาน cleanBuildCache รวมถึงพร็อพเพอร์ตี้ android.enableBuildCache และ android.buildCacheDir แล้ว และจะนำออกใน AGP 7.0 ปัจจุบันพร็อพเพอร์ตี้ android.enableBuildCache ไม่มีผลใดๆ ขณะที่พร็อพเพอร์ตี้ android.buildCacheDir และงาน cleanBuildCache จะยังคงทำงานได้จนถึง AGP 7.0 เพื่อลบเนื้อหาแคชบิลด์ของ AGP ที่มีอยู่

ขนาดแอปที่ใช้การลดขนาดโค้ดลดลงอย่างมาก

ตั้งแต่รุ่นนี้เป็นต้นไป ระบบจะไม่เก็บฟิลด์จากคลาส R ไว้โดยค่าเริ่มต้น ซึ่งอาจส่งผลให้ APK มีขนาดเล็กลงอย่างมากสำหรับแอปที่เปิดใช้การลดขนาดโค้ด การดำเนินการนี้ไม่ควรส่งผลให้เกิดการเปลี่ยนแปลงลักษณะการทำงาน เว้นแต่คุณ จะเข้าถึงคลาส R โดยใช้การสะท้อน ในกรณีนี้ คุณต้อง เพิ่มกฎการเก็บรักษาสำหรับคลาส R เหล่านั้น

เปลี่ยนชื่อพร็อพเพอร์ตี้ android.namespacedRClass เป็น android.nonTransitiveRClass

เราได้เปลี่ยนชื่อแฟล็กทดลอง android.namespacedRClass เป็น android.nonTransitiveRClass

แฟล็กนี้ตั้งค่าไว้ในไฟล์ gradle.properties และจะเปิดใช้การใช้เนมสเปซของคลาส R ของแต่ละไลบรารี เพื่อให้คลาส R มีเฉพาะทรัพยากรที่ประกาศไว้ในไลบรารีนั้นๆ และไม่มีทรัพยากรจากทรัพยากร Dependency ของไลบรารี ซึ่งจะช่วยลดขนาดของคลาส R สำหรับไลบรารีนั้น

Kotlin DSL: เปลี่ยนชื่อ coreLibraryDesugaringEnabled แล้ว

ตัวเลือกการคอมไพล์ Kotlin DSL coreLibraryDesugaringEnabled เปลี่ยนเป็น isCoreLibraryDesugaringEnabled แล้ว ดูข้อมูลเพิ่มเติมเกี่ยวกับแฟล็กนี้ได้ที่ การรองรับกระบวนการ Desugaring API Java 8 ขึ้นไป (ปลั๊กอิน Android Gradle เวอร์ชัน 4.0.0 ขึ้นไป)

นำพร็อพเพอร์ตี้เวอร์ชันออกจากคลาส BuildConfig ในโปรเจ็กต์ไลบรารี

สำหรับโปรเจ็กต์ไลบรารีเท่านั้น เราได้นำพร็อพเพอร์ตี้ BuildConfig.VERSION_NAME และ BuildConfig.VERSION_CODE ออกจากคลาสที่สร้างขึ้น BuildConfig เนื่องจากค่าคงที่เหล่านี้ไม่ได้แสดงค่าสุดท้าย ของรหัสเวอร์ชันและชื่อเวอร์ชันของแอปพลิเคชัน จึงอาจทำให้เกิดความเข้าใจผิด นอกจากนี้ ระบบยังทิ้งค่าเหล่านี้ระหว่างการผสานไฟล์ Manifest

ในปลั๊กอิน Android Gradle เวอร์ชันในอนาคต เราจะนำพร็อพเพอร์ตี้ versionName และ versionCode ออกจาก DSL สำหรับไลบรารีด้วย ปัจจุบันยังไม่มีวิธีเข้าถึงรหัส/ชื่อเวอร์ชันของแอปจากโปรเจ็กต์ย่อยของไลบรารีโดยอัตโนมัติ

สำหรับโมดูลแอปพลิเคชัน จะไม่มีการเปลี่ยนแปลงใดๆ คุณยังคงกำหนดค่าให้กับ versionCode และ versionName ใน DSL ได้ โดยค่าเหล่านี้จะเผยแพร่ไปยัง ไฟล์ Manifest และฟิลด์ BuildConfig ของแอป

ตั้งค่าเส้นทาง NDK

คุณสามารถตั้งค่าเส้นทางไปยังการติดตั้ง NDK ในเครื่องได้โดยใช้ android.ndkPath พร็อพเพอร์ตี้ในไฟล์ build.gradle ของโมดูล


android {
  ndkPath "your-custom-ndk-path"
}

android {
  ndkPath = "your-custom-ndk-path"
}

หากคุณใช้พร็อพเพอร์ตี้นี้ร่วมกับพร็อพเพอร์ตี้ android.ndkVersion เส้นทางนี้ต้องมี NDK เวอร์ชันที่ตรงกับ android.ndkVersion

การเปลี่ยนแปลงลักษณะการทำงานของการทดสอบ 1 หน่วยของไลบรารี

เราได้เปลี่ยนลักษณะการทำงานของวิธีคอมไพล์และเรียกใช้การทดสอบ 1 หน่วยของไลบรารี ตอนนี้การทดสอบ 1 หน่วยของไลบรารีจะคอมไพล์และเรียกใช้กับคลาสคอมไพล์/รันไทม์ของไลบรารีเอง ซึ่งจะส่งผลให้การทดสอบ 1 หน่วยใช้ไลบรารีในลักษณะเดียวกับโปรเจ็กต์ย่อยภายนอก โดยปกติแล้วการกำหนดค่านี้จะส่งผลให้การทดสอบมีประสิทธิภาพมากขึ้น

ในบางกรณี การทดสอบ 1 หน่วยของไลบรารีที่ใช้การเชื่อมโยงข้อมูลอาจพบคลาส DataBindingComponent หรือ BR ที่ขาดหายไป คุณต้องย้ายการทดสอบเหล่านั้นไปยังการทดสอบแบบมีเครื่องควบคุมในโปรเจ็กต์ androidTest เนื่องจากหากคอมไพล์และเรียกใช้กับคลาสเหล่านั้นในการทดสอบ 1 หน่วย อาจทำให้ได้เอาต์พุตที่ไม่ถูกต้อง

เลิกใช้งานปลั๊กอิน io.fabric Gradle แล้ว

ปลั๊กอิน io.fabric Gradle เลิกใช้งานแล้วและใช้ร่วมกับ ปลั๊กอิน Android Gradle เวอร์ชัน 4.1 ไม่ได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับ Fabric SDK ที่เลิกใช้งานแล้วและการย้ายข้อมูลไปยัง Firebase Crashlytics SDK ได้ที่ อัปเกรดเป็น Firebase Crashlytics SDK