ปลั๊กอิน Android Gradle 3.0.0 (ตุลาคม 2017)

ปลั๊กอิน Android Gradle 3.0.0 มีการเปลี่ยนแปลงมากมายที่มุ่งแก้ไขปัญหาด้านประสิทธิภาพของโปรเจ็กต์ขนาดใหญ่

ตัวอย่างเช่น ในโปรเจ็กต์โครงสร้างพื้นฐาน ตัวอย่าง ที่มีโมดูลประมาณ 130 โมดูลและทรัพยากร Dependency ภายนอกจำนวนมาก (แต่ไม่มีโค้ดหรือทรัพยากร) คุณอาจพบการปรับปรุงประสิทธิภาพ ที่คล้ายกับตัวอย่างต่อไปนี้

เวอร์ชันปลั๊กอิน Android + เวอร์ชัน Gradle ปลั๊กอิน Android 2.2.0 + Gradle 2.14.1 ปลั๊กอิน Android 2.3.0 + Gradle 3.3 ปลั๊กอิน Android 3.0.0 + Gradle 4.1
การกำหนดค่า (เช่น การเรียกใช้ ./gradlew --help) ประมาณ 2 นาที ประมาณ 9 วินาที ประมาณ 2.5 วินาที
การเปลี่ยนแปลง Java 1 บรรทัด (การเปลี่ยนแปลงการใช้งาน) ประมาณ 2 นาที 15 วินาที ประมาณ 29 วินาที ประมาณ 6.4 วินาที

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

หากไม่พบการปรับปรุงประสิทธิภาพตามที่อธิบายไว้ข้างต้น โปรดรายงานข้อบกพร่อง และแนบการติดตามบิลด์โดยใช้ Gradle Profiler

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

เวอร์ชันขั้นต่ำ เวอร์ชันเริ่มต้น หมายเหตุ
Gradle 4.1 4.1 ดูข้อมูลเพิ่มเติมได้ที่การอัปเดต Gradle
เครื่องมือสร้าง SDK 26.0.2 26.0.2 ติดตั้งหรือกำหนดค่าเครื่องมือสร้าง SDK การอัปเดตนี้จะทำให้คุณไม่จำเป็นต้องระบุเวอร์ชันสำหรับเครื่องมือบิลด์อีกต่อไป เนื่องจากปลั๊กอินจะใช้เวอร์ชันขั้นต่ำที่กำหนดโดยค่าเริ่มต้น ดังนั้น ตอนนี้คุณจึงนำพร็อพเพอร์ตี้ android.buildToolsVersion ออกได้แล้ว

3.0.1 (พฤศจิกายน 2017)

เป็นการอัปเดตเล็กน้อยเพื่อรองรับ Android Studio 3.0.1 รวมถึงการแก้ไขข้อบกพร่องทั่วไป และการปรับปรุงประสิทธิภาพ

การเพิ่มประสิทธิภาพ

  • การทำงานแบบขนานที่ดีขึ้นสำหรับโปรเจ็กต์แบบหลายโมดูลผ่านกราฟงานแบบละเอียด
  • เมื่อทำการเปลี่ยนแปลงทรัพยากร Dependency Gradle จะสร้างบิลด์ได้เร็วขึ้นโดยไม่ คอมไพล์โมดูลที่ไม่มีสิทธิ์เข้าถึง API ของทรัพยากร Dependency นั้นซ้ำ คุณควรจำกัดทรัพยากร Dependency ที่จะเปิดเผย API ให้โมดูลอื่นๆ โดย ใช้ การกำหนดค่าทรัพยากร Dependency ใหม่ของ Gradle: implementation, api, compileOnly, และ runtimeOnly
  • ความเร็วในการสร้างบิลด์แบบเพิ่มขึ้นเร็วขึ้นเนื่องจากการสร้างไฟล์ DEX ต่อคลาส ตอนนี้ระบบจะคอมไพล์แต่ละคลาสเป็นไฟล์ DEX แยกกัน และจะสร้างไฟล์ DEX ใหม่เฉพาะคลาสที่ได้รับการแก้ไข นอกจากนี้ คุณควรคาดหวังว่าความเร็วในการสร้างบิลด์จะดีขึ้นสำหรับ แอปที่ตั้งค่า minSdkVersion เป็น 20 หรือต่ำกว่า และใช้ Multi-Dex แบบเดิม
  • ความเร็วในการสร้างบิลด์ดีขึ้นด้วยการเพิ่มประสิทธิภาพงานบางอย่างให้ใช้เอาต์พุตที่แคชไว้ หากต้องการใช้ประโยชน์จากการเพิ่มประสิทธิภาพนี้ คุณต้องเปิดใช้แคชบิลด์ของ Gradle ก่อน
  • การประมวลผลทรัพยากรแบบเพิ่มขึ้นดีขึ้นโดยใช้ AAPT2 ซึ่งตอนนี้ เปิดใช้โดยค่าเริ่มต้น หากพบปัญหาขณะใช้ AAPT2, โปรด รายงานข้อบกพร่อง นอกจากนี้ คุณยัง ปิดใช้ AAPT2 ได้โดยตั้งค่า android.enableAapt2=false ใน gradle.properties ไฟล์ แล้วรีสตาร์ท Gradle Daemon โดย เรียกใช้ ./gradlew --stop จากบรรทัดคำสั่ง

ฟีเจอร์ใหม่

  • การจัดการทรัพยากร Dependency ที่คำนึงถึงตัวแปร เมื่อสร้างตัวแปรหนึ่งของโมดูล ตอนนี้ปลั๊กอินจะจับคู่ตัวแปรของทรัพยากร Dependency ของโมดูลไลบรารีในเครื่องกับตัวแปรของโมดูลที่คุณกำลังสร้างโดยอัตโนมัติ
  • มีปลั๊กอินโมดูลฟีเจอร์ใหม่เพื่อรองรับ Android Instant Apps และ Android Instant Apps SDK (ซึ่งคุณดาวน์โหลด ได้โดยใช้ SDK Manager) ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างโมดูลฟีเจอร์ด้วยปลั๊กอินใหม่ได้ที่ โครงสร้างของ Instant App ที่มีฟีเจอร์หลายรายการ
  • การรองรับในตัวสำหรับการใช้ฟีเจอร์ภาษาของ Java 8 และไลบรารี Java 8 บางรายการ ตอนนี้ Jack เลิกใช้งานแล้วและไม่จำเป็นอีกต่อไป และคุณ ควรปิดใช้ Jack ก่อนเพื่อใช้การรองรับ Java 8 ที่ได้รับการปรับปรุงซึ่งสร้างไว้ใน Toolchain เริ่มต้น ดูข้อมูลเพิ่มเติมได้ที่ ใช้ฟีเจอร์ภาษาของ Java 8
  • เพิ่มการรองรับการเรียกใช้การทดสอบด้วย Android Test Orchestrator ซึ่งช่วยให้คุณเรียกใช้การทดสอบแต่ละรายการของแอปได้ภายใน อินสแตนซ์การเรียกใช้การวัดคุมของตัวเอง เนื่องจากการทดสอบแต่ละรายการทำงานในอินสแตนซ์การวัดคุมของตัวเอง สถานะที่แชร์ระหว่างการทดสอบจึงไม่สะสม ใน CPU หรือหน่วยความจำของอุปกรณ์ และแม้ว่าการทดสอบรายการหนึ่งจะขัดข้อง แต่ก็จะทำให้เกิดการขัดข้องเฉพาะอินสแตนซ์การวัดคุมของตัวเองเท่านั้น การทดสอบอื่นๆ จึงยังคงทำงานได้

    • เพิ่ม testOptions.execution เพื่อกำหนดว่าจะใช้ การจัดระเบียบการทดสอบในอุปกรณ์หรือไม่ หากต้องการ ใช้ Android Test Orchestrator คุณต้องระบุ ANDROID_TEST_ORCHESTRATOR ตามที่แสดงด้านล่าง โดยค่าเริ่มต้น พร็อพเพอร์ตี้นี้จะตั้งค่าเป็น HOST ซึ่งจะปิดใช้การจัดการเป็นกลุ่มในอุปกรณ์และเป็นวิธีมาตรฐานในการเรียกใช้การทดสอบ

    ดึงดูด

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • การกำหนดค่าทรัพยากร Dependency androidTestUtil ใหม่ช่วยให้คุณ ติดตั้ง APK ของเครื่องมือช่วยเหลือในการทดสอบอีกรายการก่อนที่จะเรียกใช้การทดสอบการวัดคุม เช่น Android Test Orchestrator:

    ดึงดูด

            dependencies {
              androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
              ...
            }
            

    Kotlin

            dependencies {
              androidTestUtil("com.android.support.test:orchestrator:1.0.0")
              ...
            }
            
  • เพิ่ม testOptions.unitTests.includeAndroidResources เพื่อรองรับการทำ Unit Test ที่ต้องใช้ทรัพยากร Android เช่น Roboelectric. เมื่อตั้งค่าพร็อพเพอร์ตี้นี้ เป็น true ปลั๊กอินจะผสานทรัพยากร ชิ้นงาน และ ไฟล์ Manifest ก่อนที่จะเรียกใช้การทำ Unit Test จากนั้นการทดสอบจะ ตรวจสอบ com/android/tools/test_config.properties ใน classpath สำหรับคีย์ต่อไปนี้ได้

    • android_merged_assets: Absolute Path ไปยัง ไดเรกทอรี Asset ที่ผสานแล้ว

      หมายเหตุ: สำหรับโมดูลไลบรารี ชิ้นงานที่ผสานแล้วจะไม่มีชิ้นงานของทรัพยากร Dependency (ดูปัญหา #65550419)

    • android_merged_manifest: เส้นทางแบบสัมบูรณ์ไปยังไฟล์ Manifest ที่ผสานแล้ว

    • android_merged_resources: เส้นทางแบบสัมบูรณ์ไปยังไดเรกทอรีทรัพยากรที่ผสานแล้ว ซึ่งมีทรัพยากรทั้งหมดจากโมดูลและทรัพยากร Dependency ทั้งหมด

    • android_custom_package: ชื่อแพ็กเกจของคลาส R สุดท้าย หากคุณแก้ไขรหัสแอปพลิเคชันแบบไดนามิก ชื่อแพ็กเกจนี้อาจไม่ตรงกับแอตทริบิวต์ package ในไฟล์ Manifest ของแอป

  • การรองรับฟอนต์ เป็นทรัพยากร (ซึ่งเป็นฟีเจอร์ใหม่ที่เปิดตัวใน Android 8.0 (ระดับ API 26))
  • การรองรับ APK เฉพาะภาษาด้วย Android Instant Apps SDK 1.1 ขึ้นไป
  • ตอนนี้คุณเปลี่ยนไดเรกทอรีเอาต์พุตสำหรับโปรเจ็กต์บิลด์เนทีฟภายนอก ได้แล้ว ดังที่แสดงด้านล่าง

    ดึงดูด

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory "./outputs/cmake"
                    }
                }
            }
            

    Kotlin

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory = "./outputs/cmake"
                    }
                }
            }
            
  • ตอนนี้คุณใช้ CMake 3.7 ขึ้นไปได้แล้วเมื่อสร้างโปรเจ็กต์เนทีฟจาก Android Studio
  • การกำหนดค่าทรัพยากร Dependency lintChecks ใหม่ช่วยให้คุณสร้าง JAR ที่กำหนดกฎเครื่องมือวิเคราะห์ซอร์สโค้ดที่ปรับแต่งเอง และแพ็กเกจลงในโปรเจ็กต์ AAR และ APK ได้

    กฎ Lint ที่กำหนดเองต้องอยู่ในโปรเจ็กต์แยกต่างหากที่เอาต์พุตเป็น JAR เดียวและมีเฉพาะcompileOnlyทรัพยากร Dependency จากนั้นโมดูลแอปและไลบรารีอื่นๆ จะขึ้นอยู่กับโปรเจ็กต์ Lint ของคุณได้โดยใช้การกำหนดค่า lintChecks ดังนี้

    ดึงดูด

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks project(':lint-checks')
            }
            

    Kotlin

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks(project(":lint-checks"))
            }
            

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

  • ปลั๊กอิน Android 3.0.0 นำ API บางรายการออก และบิลด์ของคุณจะใช้งานไม่ได้ หากคุณใช้ API เหล่านั้น ตัวอย่างเช่น คุณไม่สามารถใช้ Variants API เพื่อ เข้าถึง outputFile() ออบเจ็กต์ หรือใช้ processManifest.manifestOutputFile() เพื่อรับไฟล์ Manifest สำหรับแต่ละตัวแปรได้อีกต่อไป ดูข้อมูลเพิ่มเติมได้ที่ การเปลี่ยนแปลง API
  • คุณไม่จำเป็นต้องระบุเวอร์ชันสำหรับเครื่องมือสร้างอีกต่อไป (ดังนั้น ตอนนี้คุณจึงนำพร็อพเพอร์ตี้ android.buildToolsVersion ออกได้แล้ว) โดยค่าเริ่มต้น ปลั๊กอินจะใช้เวอร์ชันเครื่องมือสร้างขั้นต่ำที่กำหนดสำหรับเวอร์ชันปลั๊กอิน Android ที่คุณใช้อยู่โดยอัตโนมัติ
  • ตอนนี้คุณเปิด/ปิดใช้การบีบอัด PNG ในบล็อก buildTypes ได้แล้ว ดังที่แสดงด้านล่าง การบีบอัด PNG จะเปิดใช้โดยค่าเริ่มต้นสำหรับบิลด์ทั้งหมด ยกเว้นบิลด์ดีบัก เนื่องจากจะเพิ่มเวลาในการสร้างบิลด์สำหรับโปรเจ็กต์ที่มีไฟล์ PNG จำนวนมาก ดังนั้น หากต้องการลดเวลาในการสร้างบิลด์สำหรับประเภทบิลด์อื่นๆ คุณควรปิดใช้การบีบอัด PNG หรือ แปลง รูปภาพเป็น WebP

    ดึงดูด

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
              }
            }
          }
          

    Kotlin

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                isCrunchPngs = false
              }
            }
          }
          
  • ตอนนี้ปลั๊กอิน Android จะสร้างเป้าหมายที่เรียกใช้งานได้ที่คุณกำหนดค่าไว้ในโปรเจ็กต์ CMake ภายนอกโดยอัตโนมัติ
  • ตอนนี้คุณต้อง เพิ่มโปรเซสเซอร์คำอธิบายประกอบ ลงใน classpath ของโปรเซสเซอร์โดยใช้การกำหนดค่าทรัพยากร Dependency annotationProcessor
  • การใช้ ndkCompile ที่เลิกใช้งานแล้วจะถูกจำกัดมากขึ้น คุณควรย้ายข้อมูลไปใช้ CMake หรือ ndk-build เพื่อคอมไพล์โค้ดแบบเนทีฟที่ต้องการแพ็กเกจลงใน APK แทน ดูข้อมูลเพิ่มเติมได้ที่ ย้ายข้อมูลจาก ndkcompile