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

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

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

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

ฟีเจอร์ใหม่

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

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

    Groovy

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

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

    Groovy

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

    Kotlin

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

    • android_merged_assets: เส้นทางสัมบูรณ์ไปยังไดเรกทอรีชิ้นงานที่ผสานรวม

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

    • android_merged_manifest: Absolute Path ไปยังไฟล์ Manifest ที่ผสานแล้ว

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

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

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

    Groovy

            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
  • การกำหนดค่า lintChecks ใหม่ช่วยให้คุณสร้าง JAR ที่กําหนดกฎ Lint ที่กำหนดเอง และแพ็กเกจลงในโปรเจ็กต์ AAR และ APK ได้

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

    Groovy

            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

    Groovy

          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 ภายนอก
  • ตอนนี้คุณต้องเพิ่มตัวประมวลผลคำอธิบายประกอบลงในคลาสเส้นทางของผู้ประมวลผลโดยใช้การกำหนดค่าความเกี่ยวข้องannotationProcessor
  • การใช้ ndkCompile ที่เลิกใช้งานแล้วถูกจํากัดมากขึ้น คุณควรเปลี่ยนไปใช้ CMake หรือ ndk-build เพื่อคอมไพล์โค้ดเนทีฟที่ต้องการแพ็กลงใน APK แทน โปรดดูข้อมูลเพิ่มเติมที่หัวข้อย้ายข้อมูลจาก ndkcompile