ปลั๊กอิน 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 และมีการแก้ไขข้อบกพร่องทั่วไป และการปรับปรุงประสิทธิภาพ
การเพิ่มประสิทธิภาพ
- การทำงานแบบขนานที่ดียิ่งขึ้นสำหรับโปรเจ็กต์แบบหลายโมดูลผ่านกราฟงานแบบละเอียด
- เมื่อทำการเปลี่ยนแปลงการขึ้นต่อกัน Gradle จะสร้างได้เร็วขึ้นโดยไม่
ต้องคอมไพล์โมดูลที่ไม่มีสิทธิ์เข้าถึง API ของการขึ้นต่อกันนั้นซ้ำ
คุณควรจำกัดการพึ่งพาที่ทำให้ API รั่วไหลไปยังโมดูลอื่นๆ โดย
ใช้
การกำหนดค่าการพึ่งพาใหม่ของ 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
จากบรรทัดคำสั่ง
ฟีเจอร์ใหม่
- การจัดการการขึ้นต่อกันที่รับรู้ตัวแปร ได้ เมื่อสร้างโมดูลบางเวอร์ชัน ตอนนี้ปลั๊กอินจะ จับคู่เวอร์ชันของโมดูลการอ้างอิงไลบรารีในเครื่องกับ เวอร์ชันของโมดูลที่คุณกำลังสร้างโดยอัตโนมัติ
- รวมปลั๊กอินโมดูลฟีเจอร์ใหม่เพื่อรองรับ Android Instant Apps และ Android Instant Apps SDK (ซึ่งคุณดาวน์โหลดได้ โดยใช้ SDK Manager) หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างโมดูลฟีเจอร์ด้วยปลั๊กอินใหม่ โปรดอ่านโครงสร้างของ Instant App ที่มีหลายฟีเจอร์
- รองรับการใช้ฟีเจอร์ภาษาของ Java 8 และไลบรารี Java 8 บางอย่างในตัว ตอนนี้เราเลิกใช้งาน Jack แล้วและไม่จำเป็นต้องใช้ และคุณ ควรปิดใช้ Jack ก่อนเพื่อใช้การรองรับ Java 8 ที่ได้รับการปรับปรุงซึ่งมีอยู่ใน ชุดเครื่องมือเริ่มต้น อ่านข้อมูลเพิ่มเติมได้ที่ ใช้ฟีเจอร์ภาษาของ Java 8
-
เพิ่มการรองรับการเรียกใช้การทดสอบด้วย Android Test Orchestrator ซึ่งช่วยให้คุณเรียกใช้การทดสอบแต่ละรายการของแอปได้ภายใน การเรียกใช้ Instrumentation ของตัวเอง เนื่องจากการทดสอบแต่ละรายการทำงานในอินสแตนซ์ Instrumentation ของตัวเอง สถานะที่แชร์ระหว่างการทดสอบจึงไม่สะสมใน CPU หรือหน่วยความจำของอุปกรณ์ และแม้ว่าการทดสอบรายการหนึ่งจะขัดข้อง แต่ก็จะทำให้เฉพาะอินสแตนซ์ของ Instrumentation ของการทดสอบนั้นหยุดทำงานเท่านั้น การทดสอบอื่นๆ จึงยังคงทำงานได้
- เพิ่ม
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
การอ้างอิง จากนั้นโมดูลแอปและไลบรารีอื่นๆ จะขึ้นอยู่กับโปรเจ็กต์ 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 หรือ แปลง รูปภาพเป็น WebPGroovy
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 ของโปรเซสเซอร์โดยใช้
annotationProcessor
การกำหนดค่าการขึ้นต่อกัน - ตอนนี้การใช้
ndkCompile
ที่เลิกใช้งานแล้วมีการจำกัดมากขึ้น คุณควรย้ายข้อมูลไปใช้ CMake หรือ ndk-build เพื่อคอมไพล์ โค้ดเนทีฟที่ต้องการแพ็กเกจลงใน APK แทน ดูข้อมูลเพิ่มเติมได้ที่หัวข้อย้ายข้อมูลจาก ndkcompile