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

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

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

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

ปลั๊กอิน Android Gradle รองรับ Maven Publish Gradle plugin ซึ่งช่วยให้คุณเผยแพร่ชิ้นงานบิลด์ไปยัง ที่เก็บ 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 Plugin จะเลือกเวอร์ชันเริ่มต้นที่จะใช้ในการคอมไพล์ไฟล์ซอร์สโค้ด ก่อนหน้านี้ ปลั๊กอินจะเลือก NDK เวอร์ชันล่าสุดที่ดาวน์โหลด ใช้พร็อพเพอร์ตี้ android.ndkVersion ในไฟล์ build.gradle ของโมดูลเพื่อลบล้างค่าเริ่มต้นที่ปลั๊กอินเลือก

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

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

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

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

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

  • ตอนนี้ Unit Test ทั้งหมด รวมถึง Unit Test ของ 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 โดยปกติแล้วปลั๊กอิน 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";
                  }
                }