ปลั๊กอิน 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 เวอร์ชันนี้มีฟีเจอร์ใหม่ต่อไปนี้

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

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

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

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

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

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

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

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

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

        android.useNewApkCreator=false
      

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

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

  1. เพิ่ม Flag -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 Plugin แพ็กเกจไลบรารีแบบเนทีฟที่บีบอัดแทน ให้ใส่ข้อมูลต่อไปนี้ในไฟล์ Manifest ของแอป

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

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

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

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

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

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

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

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

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

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

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

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

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

  • ตอนนี้การทดสอบ 1 หน่วยทั้งหมด รวมถึงการทดสอบ 1 หน่วยของ Roboelectric แคชได้ทั้งหมดแล้ว ดูข้อมูลเพิ่มเติมได้ที่ปัญหา #115873047

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

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

  • ตอนนี้โมดูลไลบรารีที่ใช้การเชื่อมโยงข้อมูลรองรับการทดสอบหน่วย Robolectric แล้ว ดูข้อมูลเพิ่มเติมได้ที่ปัญหา #126775542
  • ตอนนี้คุณสามารถเรียกใช้connectedAndroidTestงานในหลายข้อบังคับได้ขณะที่เปิดใช้โหมดการเรียกใช้แบบขนานของ Gradle

ปัญหาที่ทราบ

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

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

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

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

ไม่มีคลาส Manifest {:#agp-missing-manifest}

หากแอปกำหนดสิทธิ์ที่กำหนดเองในไฟล์ Manifest โดยปกติแล้วปลั๊กอิน Gradle ของ Android จะสร้างคลาส 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";
                  }
                }