ปลั๊กอิน Android Gradle 3.6.0 (กุมภาพันธ์ 2020)

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

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

ฟีเจอร์ใหม่

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

การเชื่อมโยง View

การเชื่อมโยง View ช่วยให้มั่นใจได้ถึงความปลอดภัยในเวลาคอมไพล์เมื่ออ้างอิง View ใน โค้ด ตอนนี้คุณสามารถแทนที่ findViewById() ด้วยการอ้างอิงคลาสการเชื่อมโยงที่สร้างขึ้นโดยอัตโนมัติ หากต้องการเริ่มใช้การเชื่อมโยง View, ให้ใส่ข้อมูลต่อไปนี้ในไฟล์ build.gradle ของแต่ละโมดูล

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบเกี่ยวกับการเชื่อมโยง View Binding

การรองรับปลั๊กอิน Maven Publish

ปลั๊กอิน Android Gradle รองรับปลั๊กอิน Maven Publish Gradle ซึ่งช่วยให้คุณเผยแพร่สิ่งประดิษฐ์บิลด์ไปยัง ที่เก็บ Apache Maven ได้ ปลั๊กอิน Android Gradle จะสร้าง คอมโพเนนต์ สำหรับอาร์ติแฟกต์ตัวแปรบิลด์แต่ละรายการในโมดูลแอปหรือไลบรารีที่คุณ ใช้เพื่อปรับแต่ง การเผยแพร่ ไปที่ที่เก็บ Maven

ดูข้อมูลเพิ่มเติมได้ที่หน้าเกี่ยวกับวิธีใช้ปลั๊กอิน Maven Publish plugin

เครื่องมือการสร้างแพ็กเกจเริ่มต้นใหม่

เมื่อสร้างแอปเวอร์ชันดีบัก ปลั๊กอินจะใช้เครื่องมือการสร้างแพ็กเกจใหม่ ที่ชื่อว่า zipflinger เพื่อสร้าง APK เครื่องมือใหม่นี้ควรช่วยเพิ่มความเร็วในการสร้าง หากเครื่องมือการสร้างแพ็กเกจใหม่ ทำงานไม่เป็นไปตามที่คาดไว้ โปรดรายงานข้อบกพร่อง คุณสามารถกลับไปใช้เครื่องมือการสร้างแพ็กเกจแบบเก่าได้โดยใส่ข้อมูลต่อไปนี้ในไฟล์ gradle.properties

        android.useNewApkCreator=false
      

การระบุแหล่งที่มาของการสร้างแบบเนทีฟ

ตอนนี้คุณสามารถกำหนดระยะเวลาที่ Clang ใช้ในการสร้างและ ลิงก์ไฟล์ C/C++ แต่ละไฟล์ในโปรเจ็กต์ได้แล้ว Gradle สามารถแสดงผลการติดตาม Chrome ที่มีไทม์สแตมป์สำหรับเหตุการณ์คอมไพเลอร์เหล่านี้ เพื่อให้คุณเข้าใจเวลาที่ต้องใช้ในการสร้างโปรเจ็กต์ได้ดียิ่งขึ้น หากต้องการแสดงผลไฟล์การระบุแหล่งที่มาของการสร้างนี้ ให้ทำดังนี้

  1. เพิ่มแฟล็ก -Pandroid.enableProfileJson=true เมื่อ เรียกใช้การสร้าง Gradle เช่น

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. เปิดเบราว์เซอร์ Chrome แล้วพิมพ์ chrome://tracing ใน แถบค้นหา

  3. คลิกปุ่มโหลด แล้วไปที่ <var>project-root</var>/build/android-profile เพื่อค้นหาไฟล์ ไฟล์จะมีชื่อว่า profile-<var>timestamp</var>.json.gz.

คุณจะเห็นข้อมูลการระบุแหล่งที่มาของบิลด์แบบเนทีฟที่ด้านบนของโปรแกรมดู

การติดตามการระบุแหล่งที่มาของการบิลด์ดั้งเดิมใน Chrome

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

เมื่อใช้ปลั๊กอินเวอร์ชันนี้ คุณอาจพบการเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้

ไลบรารีแบบเนทีฟจะสร้างแพ็กเกจแบบไม่ได้บีบอัดโดย ค่าเริ่มต้น

เมื่อคุณสร้างแอป ปลั๊กอินจะตั้งค่า extractNativeLibs เป็น "false" โดย ค่าเริ่มต้น นั่นคือ ไลบรารีแบบเนทีฟจะมีการจัดแนวหน้าและสร้างแพ็กเกจ ไม่ได้บีบอัด แม้ว่าการดำเนินการนี้จะทำให้ขนาดที่อัปโหลดใหญ่ขึ้น แต่ผู้ใช้ได้รับประโยชน์ดังต่อไปนี้

  • ขนาดการติดตั้งแอปเล็กลง เนื่องจากแพลตฟอร์มสามารถเข้าถึงไลบรารีแบบเนทีฟ ได้โดยตรงจาก APK ที่ติดตั้งไว้ โดยไม่ต้องสร้างสำเนาของ ไลบรารี
  • ขนาดการดาวน์โหลดเล็กลง เนื่องจากโดยปกติแล้วการบีบอัดของ Play Store จะดีกว่าเมื่อคุณใส่ไลบรารีแบบเนทีฟที่ไม่ได้บีบอัดไว้ใน APK หรือ Android App Bundle

หากต้องการให้ปลั๊กอิน Android Gradle สร้างแพ็กเกจไลบรารีแบบเนทีฟที่บีบอัดไว้ ให้ใส่ข้อมูลต่อไปนี้ในไฟล์ Manifest ของแอป

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

หมายเหตุ: แอตทริบิวต์ extractNativeLibs ในไฟล์ Manifest ถูกแทนที่ด้วยตัวเลือก useLegacyPackaging DSL ดูข้อมูลเพิ่มเติมได้ที่หมายเหตุประจำรุ่น ใช้ DSL เพื่อสร้างแพ็กเกจไลบรารีแบบเนทีฟที่บีบอัดไว้

เวอร์ชัน NDK เริ่มต้น

หากคุณดาวน์โหลด NDK หลายเวอร์ชัน ตอนนี้ปลั๊กอิน Android Gradle จะเลือกเวอร์ชันเริ่มต้นที่จะใช้ในการคอมไพล์ไฟล์ซอร์สโค้ด ก่อนหน้านี้ ปลั๊กอินจะเลือก NDK เวอร์ชันล่าสุดที่ดาวน์โหลด ใช้พร็อพเพอร์ตี้ android.ndkVersion ในไฟล์ build.gradle ของโมดูลเพื่อลบล้างค่าเริ่มต้นที่ปลั๊กอินเลือก

การสร้างคลาส R ที่ง่ายขึ้น

ปลั๊กอิน Android Gradle ช่วยลดความซับซ้อนของ classpath ในเวลาคอมไพล์โดย สร้างคลาส R เพียงคลาสเดียวสำหรับโมดูลไลบรารีแต่ละโมดูลในโปรเจ็กต์ และ แชร์คลาส R เหล่านั้นกับทรัพยากร Dependency ของโมดูลอื่นๆ การเพิ่มประสิทธิภาพนี้ ควรส่งผลให้การสร้างเร็วขึ้น แต่คุณต้องคำนึงถึงสิ่งต่อไปนี้

  • เนื่องจากคอมไพเลอร์แชร์คลาส R กับทรัพยากร Dependency ของโมดูลต้นทาง จึงเป็นเรื่องสำคัญที่แต่ละโมดูลในโปรเจ็กต์จะต้องใช้ชื่อแพ็กเกจที่ไม่ซ้ำกัน
  • การมองเห็นคลาส R ของไลบรารีสำหรับทรัพยากร Dependency อื่นๆ ของโปรเจ็กต์ กำหนดโดยการกำหนดค่าที่ใช้ในการรวมไลบรารีเป็น ทรัพยากร Dependency ตัวอย่างเช่น หากไลบรารี A รวมไลบรารี B เป็นทรัพยากร Dependency "api" ไลบรารี A และไลบรารีอื่นๆ ที่ขึ้นต่อกันกับไลบรารี A จะเข้าถึงคลาส R ของไลบรารี B ได้ อย่างไรก็ตาม ไลบรารีอื่นๆ อาจเข้าถึงคลาส R ของไลบรารี B ไม่ได้ หากไลบรารี A ใช้การกำหนดค่าทรัพยากร Dependency implementation ดูข้อมูลเพิ่มเติมได้ที่ เกี่ยวกับการกำหนดค่าทรัพยากร Dependency

นำทรัพยากรที่ขาดหายไปจากการกำหนดค่าเริ่มต้น ออก

สำหรับโมดูลไลบรารี หากคุณรวมทรัพยากรสำหรับภาษาที่คุณ ไม่ได้รวมไว้ในชุดทรัพยากรเริ่มต้น เช่น หากคุณรวม hello_world เป็นทรัพยากรสตริงใน /values-es/strings.xml แต่ไม่ได้กำหนดทรัพยากรดังกล่าวใน /values/strings.xml ปลั๊กอิน Android Gradle จะไม่รวมทรัพยากรดังกล่าวเมื่อคอมไพล์โปรเจ็กต์อีกต่อไป การเปลี่ยนแปลงลักษณะการทำงานนี้ ควรส่งผลให้เกิดข้อยกเว้น Resource Not Found ในรันไทม์ และความเร็วในการสร้างดีขึ้น

ตอนนี้ D8 จะปฏิบัติตามนโยบายการเก็บรักษา CLASS สำหรับคำอธิบายประกอบ

เมื่อคอมไพล์แอป ตอนนี้ D8 จะปฏิบัติตามเมื่อคำอธิบายประกอบใช้นโยบายการเก็บรักษา CLASS และคำอธิบายประกอบเหล่านั้นจะไม่พร้อมใช้งานใน รันไทม์อีกต่อไป ลักษณะการทำงานนี้จะเกิดขึ้นด้วยเมื่อตั้งค่า SDK เป้าหมายของแอปเป็น ระดับ API 23 ซึ่งก่อนหน้านี้อนุญาตให้เข้าถึงคำอธิบายประกอบเหล่านี้ในระหว่าง รันไทม์เมื่อคอมไพล์แอปโดยใช้ปลั๊กอิน Android Gradle และ D8 เวอร์ชันเก่า

การเปลี่ยนแปลงลักษณะการทำงานอื่นๆ

  • aaptOptions.noCompress ไม่พิจารณาตัวพิมพ์เล็กและใหญ่ในทุก แพลตฟอร์ม (ทั้งสำหรับ APK และ App Bundle) และจะพิจารณาเส้นทางที่ใช้อักขระตัวพิมพ์ใหญ่
  • ตอนนี้การเชื่อมโยงข้อมูลจะเพิ่มขึ้นทีละน้อยโดยค่าเริ่มต้น ดูข้อมูลเพิ่มเติมได้ที่ ปัญหา #110061530.

  • ตอนนี้ Unit Test ทั้งหมด รวมถึง Unit Test ของ Robolectric สามารถแคชได้อย่างสมบูรณ์ ดูข้อมูลเพิ่มเติมได้ที่ ปัญหา #115873047.

แก้ไขข้อบกพร่อง

ปลั๊กอิน Android Gradle เวอร์ชันนี้มีการแก้ไขข้อบกพร่องต่อไปนี้

ปัญหาที่ทราบแล้ว

ส่วนนี้อธิบายปัญหาที่ทราบแล้วซึ่งพบในปลั๊กอิน Android Gradle 3.6.0

ประสิทธิภาพของ Task Android Lint ช้า

Android Lint อาจใช้เวลานานขึ้นมากในการดำเนินการให้เสร็จสมบูรณ์ในบางโปรเจ็กต์เนื่องจากมีการเกิดปัญหาซ้ำในโครงสร้างพื้นฐานการแยกวิเคราะห์ ซึ่งส่งผลให้การคำนวณประเภทที่อนุมานสำหรับแลมบ์ดาในโครงสร้างโค้ดบางอย่างช้าลง

ระบบได้รายงานปัญหาดังกล่าวเป็น ข้อบกพร่องใน IDEA และจะได้รับการแก้ไขในปลั๊กอิน Android Gradle 4.0

คลาส Manifest ขาดหายไป {:#agp-missing-manifest}

หากแอปกำหนดสิทธิ์ที่กำหนดเองในไฟล์ Manifest โดยปกติแล้วปลั๊กอิน Android Gradle จะสร้างคลาส Manifest.java ที่ มีสิทธิ์ที่กำหนดเองเป็นค่าคงที่สตริง ปลั๊กอินจะสร้างแพ็กเกจ คลาสนี้พร้อมกับแอปเพื่อให้คุณอ้างอิงสิทธิ์เหล่านั้นได้ง่ายขึ้นในรันไทม์

การสร้างคลาส Manifest ไม่ทำงานในปลั๊กอิน Android Gradle 3.6.0 หากคุณสร้างแอปด้วยปลั๊กอินเวอร์ชันนี้และแอปอ้างอิง คลาส Manifest คุณอาจเห็นข้อยกเว้นClassNotFoundException หากต้องการแก้ไขปัญหานี้ ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้

  • อ้างอิงสิทธิ์ที่กำหนดเองด้วยชื่อที่ผ่านการรับรองแบบเต็ม เช่น "com.example.myapp.permission.DEADLY_ACTIVITY"

  • กำหนดค่าคงที่ของคุณเอง ดังที่แสดงด้านล่าง

                public final class CustomPermissions {
                  public static final class permission {
                    public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
                  }
                }