ปลั๊กอิน 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 หรือสูงกว่า หากต้องการเรียนรู้เพิ่มเติม โปรดอ่านส่วนที่เกี่ยวกับ การอัปเดต Gradle
  • เครื่องมือสร้างรุ่น 26.0.2 หรือสูงกว่า เมื่อใช้การอัปเดตนี้ คุณไม่จำเป็นต้องระบุเวอร์ชันสำหรับ เครื่องมือบิลด์ ปลั๊กอินจะใช้เวอร์ชันขั้นต่ำที่จำเป็นโดยค่าเริ่มต้น ตอนนี้คุณก็นำพร็อพเพอร์ตี้ android.buildToolsVersion ออกได้แล้ว

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

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

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

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

ฟีเจอร์ใหม่

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

    • เพิ่ม 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 ไปที่ รองรับการทดสอบ 1 หน่วยที่ต้องใช้ทรัพยากร Android เช่น Roboelectric เมื่อตั้งค่าตัวเลือกนี้ ลงใน true ปลั๊กอินจะดำเนินการจัดการทรัพยากร เนื้อหา และ รวมไฟล์ Manifest ก่อนเรียกใช้การทดสอบหน่วยของคุณ จากนั้น การทดสอบจะสามารถทำได้ ตรวจสอบ com/android/tools/test_config.properties ใน classpath สำหรับคีย์ต่อไปนี้

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

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