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

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

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

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

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

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

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

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

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

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

สำหรับโมดูลไลบรารี หากคุณรวมทรัพยากรสำหรับภาษาที่ไม่ได้รวมไว้ในชุดทรัพยากรเริ่มต้น (เช่น หากคุณรวม 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 และ Bundle) และจะใช้เส้นทางที่ใช้อักขระตัวพิมพ์ใหญ่
  • ตอนนี้การเชื่อมโยงข้อมูลจะเพิ่มขึ้นทีละรายการโดยค่าเริ่มต้น ดูข้อมูลเพิ่มเติมได้ที่ ปัญหา #110061530

  • ตอนนี้ Unit Test ทั้งหมด รวมถึง Roboelectric Unit Test สามารถแคชได้อย่างเต็มรูปแบบ แล้ว ดูข้อมูลเพิ่มเติมได้ที่ ปัญหา #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 โดยปกติแล้วปลั๊กอิน 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";
                  }
                }