ปลั๊กอิน Android Gradle เวอร์ชัน 4.0.0 (เมษายน 2020)

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

4.0.1 (กรกฎาคม 2020)

การอัปเดตย่อยนี้รองรับความเข้ากันได้กับการตั้งค่าเริ่มต้นและ ฟีเจอร์ใหม่สำหรับ ระดับการมองเห็นแพ็กเกจ ใน Android 11

ใน Android เวอร์ชันก่อนหน้า คุณสามารถดูรายการแอปทั้งหมด ที่ติดตั้งในอุปกรณ์ได้ ตั้งแต่ Android 11 (ระดับ API 30) ขึ้นไป แอปจะเข้าถึงได้เฉพาะรายการแพ็กเกจที่ติดตั้งซึ่งกรองแล้วโดยค่าเริ่มต้น หากต้องการดูรายการแอปที่กว้างขึ้นในระบบ ตอนนี้คุณต้อง เพิ่ม <queries> องค์ประกอบ ในไฟล์ Manifest ของ Android ของแอปหรือไลบรารี

ปลั๊กอิน Android Gradle เวอร์ชัน 4.1 ขึ้นไปเข้ากันได้กับการประกาศใหม่ <queries> แล้ว แต่เวอร์ชันเก่าไม่ เข้ากัน หากคุณเพิ่มองค์ประกอบ <queries> หรือหากคุณ เริ่มใช้ไลบรารีหรือ SDK ที่รองรับการกำหนดเป้าหมายเป็น Android 11 คุณ อาจพบข้อผิดพลาดในการผสานไฟล์ Manifest เมื่อสร้างแอป

เราจึงออกแพตช์ชุดหนึ่งสำหรับ AGP 3.3 และ ขึ้นไปเพื่อแก้ไขปัญหานี้ หากใช้ AGP เวอร์ชันเก่า อัปเกรด เป็นเวอร์ชันใดเวอร์ชันหนึ่งต่อไปนี้

เวอร์ชันขั้นต่ำ เวอร์ชันเริ่มต้น หมายเหตุ
Gradle 6.1.1 6.1.1 ดูข้อมูลเพิ่มเติมได้ที่การอัปเดต Gradle
SDK Build Tools 29.0.2 29.0.2 ติดตั้ง หรือ กำหนดค่า SDK Build Tools

ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ใหม่นี้ได้ที่ ระดับการมองเห็นแพ็กเกจ ใน Android 11

ฟีเจอร์ใหม่

ปลั๊กอิน Android Gradle เวอร์ชันนี้มีฟีเจอร์ใหม่ต่อไปนี้

การรองรับตัววิเคราะห์บิลด์ของ Android Studio

หน้าต่างตัววิเคราะห์บิลด์ ช่วยให้คุณเข้าใจและวินิจฉัยปัญหาเกี่ยวกับกระบวนการบิลด์ เช่น การเพิ่มประสิทธิภาพที่ปิดใช้และงานที่กำหนดค่าไม่ถูกต้อง ฟีเจอร์นี้พร้อมใช้งานเมื่อคุณใช้ Android Studio 4.0 ขึ้นไปกับ ปลั๊กอิน Android Gradle 4.0.0 ขึ้นไป คุณสามารถเปิดหน้าต่างตัววิเคราะห์บิลด์ จาก Android Studio ได้ดังนี้

  1. หากยังไม่ได้ดำเนินการ ให้สร้างแอปโดยเลือกบิลด์ > สร้าง โปรเจ็กต์ จากแถบเมนู
  2. เลือกมุมมอง > หน้าต่างเครื่องมือ > บิลด์ จากแถบเมนู
  3. ในหน้าต่างบิลด์ ให้เปิดหน้าต่างตัววิเคราะห์บิลด์ ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
    • หลังจาก Android Studio สร้างโปรเจ็กต์เสร็จแล้ว ให้คลิกแท็บเครื่องมือวิเคราะห์บิลด์
    • หลังจาก Android Studio สร้างโปรเจ็กต์เสร็จแล้ว ให้คลิกลิงก์ทางด้านขวาของหน้าต่างเอาต์พุตบิลด์

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

ดูข้อมูลเพิ่มเติมได้ที่ ระบุการถดถอยของความเร็วบิลด์

การยกเลิกการเพิ่มน้ำตาลในไลบรารี Java 8 ใน D8 และ R8

ตอนนี้ปลั๊กอิน Android Gradle รองรับการใช้ Java 8 Language API จำนวนมากโดยไม่ต้องกำหนดระดับ API ขั้นต่ำสำหรับแอป

คอมไพเลอร์ DEX, D8 ใน Android Studio 3.0 ขึ้นไปรองรับฟีเจอร์ภาษา Java 8 (เช่น นิพจน์แลมบ์ดา, เมธอดอินเทอร์เฟซเริ่มต้น, try-with-resources และอื่นๆ) อย่างมากผ่านกระบวนการที่เรียกว่า การยกเลิกการเพิ่มน้ำตาล ใน Android Studio 4.0 ระบบได้ขยายเครื่องมือยกเลิกการเพิ่มน้ำตาลให้สามารถ ยกเลิกการเพิ่มน้ำตาลใน Java Language API ได้ ซึ่งหมายความว่าตอนนี้คุณสามารถรวม Standard Language API ที่พร้อมใช้งานเฉพาะใน Android เวอร์ชันล่าสุด (เช่น java.util.streams) ในแอปที่รองรับ Android เวอร์ชันเก่าได้แล้ว

ระบบรองรับ API ชุดต่อไปนี้ในรุ่นนี้

  • Sequential Streams (java.util.stream)
  • java.time บางส่วน
  • java.util.function
  • การเพิ่มล่าสุดใน java.util.{Map,Collection,Comparator}
  • Optionals (java.util.Optional, java.util.OptionalInt และ java.util.OptionalDouble) และคลาสใหม่อื่นๆ ที่มีประโยชน์กับ API ด้านบน
  • การเพิ่มบางอย่างใน java.util.concurrent.atomic (เมธอดใหม่ใน AtomicInteger, AtomicLong และ AtomicReference)
  • ConcurrentHashMap (พร้อมการแก้ไขข้อบกพร่องสำหรับ Android 5.0)

D8 จะคอมไพล์ไฟล์ DEX ของไลบรารีแยกต่างหากที่มีการใช้งาน API ที่ขาดหายไปและรวมไว้ในแอปเพื่อรองรับ Language API เหล่านี้ กระบวนการ Desugaring จะเขียนโค้ดของแอปใหม่เพื่อใช้ไลบรารีนี้แทนในรันไทม์

หากต้องการเปิดใช้การรองรับ Language API เหล่านี้ ให้รวมข้อมูลต่อไปนี้ในไฟล์ โมดูลแอป's build.gradle

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }

dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4' }

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled = true
  }

compileOptions { // Flag to enable support for the new language APIs isCoreLibraryDesugaringEnabled = true // Sets Java compatibility to Java 8 sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } }

dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.0.4") }

โปรดทราบว่าคุณอาจต้องรวมข้อมูลโค้ดด้านบนไว้ในไฟล์ โมดูลไลบรารี's build.gradle ด้วยในกรณีต่อไปนี้

  • การทดสอบแบบมีเครื่องมือของโมดูลไลบรารีใช้ Language API เหล่านี้ (โดยตรงหรือผ่านโมดูลไลบรารีหรือทรัพยากร Dependency) เพื่อให้ระบบมี API ที่ขาดหายไปสำหรับ APK การทดสอบแบบมีเครื่องมือ

  • คุณต้องการเรียกใช้ Lint ในโมดูลไลบรารีแบบแยก เพื่อให้ Lint จดจำการใช้งาน Language API ที่ถูกต้องและหลีกเลี่ยงการรายงานคำเตือนที่ไม่ถูกต้อง

ตัวเลือกใหม่ในการเปิดหรือปิดใช้ฟีเจอร์บิลด์

ปลั๊กอิน Android Gradle เวอร์ชัน 4.0.0 ขอแนะนำวิธีใหม่ในการควบคุมฟีเจอร์บิลด์ที่ต้องการเปิดและปิดใช้ เช่น View Binding และ Data Binding เมื่อมีการเพิ่มฟีเจอร์ใหม่ ระบบจะปิดใช้ฟีเจอร์เหล่านั้นโดยค่าเริ่มต้น จากนั้นคุณสามารถใช้บล็อก buildFeatures เพื่อเปิดใช้เฉพาะฟีเจอร์ที่ต้องการ ซึ่งจะช่วยเพิ่มประสิทธิภาพบิลด์สำหรับโปรเจ็กต์ คุณสามารถตั้งค่าตัวเลือกสำหรับแต่ละโมดูลในไฟล์ระดับโมดูล build.gradle ได้ดังนี้

android {
  // The default value for each feature is shown below. You can change the value to
  // override the default behavior.
  buildFeatures {
    // Determines whether to generate a BuildConfig class.
    buildConfig = true
    // Determines whether to support View Binding.
    // Note that the viewBinding.enabled property is now deprecated.
    viewBinding = false
    // Determines whether to support Data Binding.
    // Note that the dataBinding.enabled property is now deprecated.
    dataBinding = false
    // Determines whether to generate binder classes for your AIDL files.
    aidl = true
    // Determines whether to support RenderScript.
    renderScript = true
    // Determines whether to support injecting custom variables into the module’s R class.
    resValues = true
    // Determines whether to support shader AOT compilation.
    shaders = true
  }
}
android {
  // The default value for each feature is shown below. You can change the value to
  // override the default behavior.
  buildFeatures {
    // Determines whether to generate a BuildConfig class.
    buildConfig = true
    // Determines whether to support View Binding.
    // Note that the viewBinding.enabled property is now deprecated.
    viewBinding = false
    // Determines whether to support Data Binding.
    // Note that the dataBinding.enabled property is now deprecated.
    dataBinding = false
    // Determines whether to generate binder classes for your AIDL files.
    aidl = true
    // Determines whether to support RenderScript.
    renderScript = true
    // Determines whether to support injecting custom variables into the module’s R class.
    resValues = true
    // Determines whether to support shader AOT compilation.
    shaders = true
  }
}

นอกจากนี้ คุณยังระบุการตั้งค่าเริ่มต้นสำหรับฟีเจอร์เหล่านี้ในทุกโมดูล ในโปรเจ็กต์ได้โดยรวมข้อมูลอย่างน้อย 1 รายการต่อไปนี้ใน gradle.propertiesของโปรเจ็กต์ ดังที่แสดงด้านล่าง โปรดทราบว่าคุณยังคงใช้บล็อก buildFeatures ในไฟล์ระดับโมดูล build.gradle เพื่อลบล้างการตั้งค่าเริ่มต้นทั่วทั้งโปรเจ็กต์เหล่านี้ได้

android.defaults.buildfeatures.buildconfig=true
android.defaults.buildfeatures.aidl=true
android.defaults.buildfeatures.renderscript=true
android.defaults.buildfeatures.resvalues=true
android.defaults.buildfeatures.shaders=true

ทรัพยากร Dependency ของฟีเจอร์กับฟีเจอร์

ในปลั๊กอิน Android Gradle เวอร์ชันก่อนหน้า โมดูลฟีเจอร์ทั้งหมด ขึ้นอยู่กับโมดูลฐานของแอปเท่านั้น เมื่อใช้ปลั๊กอิน Android Gradle 4.0.0 ตอนนี้คุณสามารถรวมโมดูลฟีเจอร์ที่ขึ้นอยู่กับโมดูลฟีเจอร์อื่น ได้แล้ว นั่นคือ ฟีเจอร์ :video สามารถขึ้นอยู่กับฟีเจอร์ :camera ซึ่งขึ้นอยู่กับโมดูลฐาน ดังที่แสดงในรูปภาพด้านล่าง

การขึ้นต่อกันของฟีเจอร์

โมดูลฟีเจอร์ :video ขึ้นอยู่กับฟีเจอร์ :camera ซึ่งขึ้นอยู่กับโมดูลฐาน :app

ซึ่งหมายความว่าเมื่อแอปขอให้ดาวน์โหลดโมดูลฟีเจอร์ แอปจะดาวน์โหลดโมดูลฟีเจอร์อื่นๆ ที่ขึ้นอยู่กับโมดูลนั้นด้วย หลังจากสร้างโมดูลฟีเจอร์สำหรับแอปแล้ว คุณสามารถประกาศทรัพยากร Dependency ของฟีเจอร์กับฟีเจอร์ในไฟล์ build.gradle ของโมดูลได้ เช่น โมดูล :video จะประกาศทรัพยากร Dependency ใน :camera ดังนี้

// In the build.gradle file of the ':video' module.
dependencies {
  // All feature modules must declare a dependency
  // on the base module.
  implementation project(':app')
  // Declares that this module also depends on the 'camera'
  // feature module.
  implementation project(':camera')
  ...
}
// In the build.gradle file of the ':video' module.
dependencies {
    // All feature modules must declare a dependency
    // on the base module.
    implementation(project(":app"))
    // Declares that this module also depends on the 'camera'
    // feature module.
    implementation(project(":camera"))
    ...
}

นอกจากนี้ คุณควรเปิดใช้ฟีเจอร์ทรัพยากร Dependency ของฟีเจอร์กับฟีเจอร์ใน Android Studio (เพื่อรองรับฟีเจอร์เมื่อแก้ไขการกำหนดค่าการเรียกใช้ เช่น) โดยคลิก ความช่วยเหลือ > แก้ไขตัวเลือก VM ที่กำหนดเอง จากแถบเมนู แล้วรวมข้อมูลต่อไปนี้

-Drundebug.feature.on.feature=true

ข้อมูลเมตาของทรัพยากร Dependency

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

  • รับการแจ้งเตือนเกี่ยวกับปัญหาที่ทราบแล้วเกี่ยวกับ SDK และทรัพยากร Dependency ที่แอปใช้
  • รับความคิดเห็นที่นำไปปฏิบัติได้เพื่อแก้ไขปัญหาเหล่านั้น

ระบบจะบีบอัดข้อมูล เข้ารหัสด้วยคีย์การลงนามของ Google Play และจัดเก็บไว้ใน บล็อกการลงนามของแอปที่เผยแพร่ อย่างไรก็ตาม คุณสามารถตรวจสอบข้อมูลเมตา ด้วยตนเองในไฟล์บิลด์ระดับกลางในเครื่องในไดเรกทอรี <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt

หากไม่ต้องการแชร์ข้อมูลนี้ คุณสามารถเลือกไม่รับได้โดยรวมข้อมูลต่อไปนี้ในไฟล์ build.gradle ของโมดูล

android {
  dependenciesInfo {
      // Disables dependency metadata when building APKs.
      includeInApk = false
      // Disables dependency metadata when building Android App Bundles.
      includeInBundle = false
  }
}
android {
  dependenciesInfo {
      // Disables dependency metadata when building APKs.
      includeInApk = false
      // Disables dependency metadata when building Android App Bundles.
      includeInBundle = false
  }
}

นำเข้าไลบรารีที่มาพร้อมเครื่องจากทรัพยากร Dependency ของ AAR

ตอนนี้คุณสามารถนำเข้าไลบรารี C/C++ จากทรัพยากร Dependency ของ AAR ของแอปได้แล้ว เมื่อทำตามขั้นตอนการกำหนดค่า ที่อธิบายไว้ด้านล่าง Gradle จะทำให้ไลบรารีที่มาพร้อมเครื่องเหล่านี้พร้อมใช้งานโดยอัตโนมัติเพื่อ ใช้กับระบบบิลด์ที่มาพร้อมเครื่องภายนอก เช่น CMake โปรดทราบว่า Gradle จะทำให้ไลบรารีเหล่านี้พร้อมใช้งานสำหรับบิลด์เท่านั้น คุณยังคงต้องกำหนดค่าสคริปต์บิลด์เพื่อใช้ไลบรารีเหล่านี้

ระบบจะส่งออกไลบรารีโดยใช้รูปแบบแพ็กเกจ Prefab

ทรัพยากร Dependency แต่ละรายการจะแสดงแพ็กเกจ Prefab ได้อย่างมาก 1 รายการ ซึ่งประกอบด้วยโมดูลอย่างน้อย 1 รายการ โมดูล Prefab คือไลบรารีเดียว ซึ่งอาจเป็นไลบรารีที่ใช้ร่วมกัน ไลบรารีแบบคงที่ หรือไลบรารีส่วนหัวเท่านั้น

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

กำหนดค่าระบบบิลด์ที่มาพร้อมเครื่องภายนอก

หากต้องการดูขั้นตอนที่คุณต้องทำ ให้ทำตามขั้นตอนด้านล่างสำหรับระบบบิลด์ที่มาพร้อมเครื่องภายนอกที่คุณวางแผนจะใช้

ทรัพยากร Dependency ของ AAR แต่ละรายการของแอปที่มีโค้ดแบบเนทีฟจะแสดงไฟล์ Android.mk ที่คุณต้องนำเข้าไปยังโปรเจ็กต์ ndk-build คุณนำเข้า ไฟล์นี้โดยใช้คำสั่ง import&endash;module ซึ่งจะค้นหาเส้นทางที่คุณ ระบุโดยใช้พร็อพเพอร์ตี้ import&endash;add&endash;path ในโปรเจ็กต์ ndk-build ตัวอย่างเช่น หากแอปพลิเคชันกำหนด libapp.so และใช้ curl คุณ ควรใส่ข้อมูลต่อไปนี้ในไฟล์ Android.mk

  1. สำหรับ CMake

    add_library(app SHARED app.cpp)

    # Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)

  2. สำหรับ ndk-build

    include $(CLEAR_VARS)
    LOCAL_MODULE := libapp
    LOCAL_SRC_FILES := app.cpp
    # Link libcurl from the curl AAR.
    LOCAL_SHARED_LIBRARIES := curl
    include $(BUILD_SHARED_LIBRARY)

    # If you don't expect that your project will be built using versions of the NDK # older than r21, you can omit this block. ifneq ($(call ndk-major-at-least,21),true) $(call import-add-path,$(NDK_GRADLE_INJECTED_IMPORT_PATH)) endif

    # Import all modules that are included in the curl AAR. $(call import-module,prefab/curl)

ระบบจะแสดงทรัพยากร Dependency ที่มาพร้อมเครื่องซึ่งรวมอยู่ใน AAR ให้โปรเจ็กต์ CMake ผ่าน CMAKE_FIND_ROOT_PATH{: .external} ตัวแปร Gradle จะตั้งค่านี้โดยอัตโนมัติเมื่อ เรียกใช้ CMake ดังนั้นหากระบบบิลด์แก้ไขตัวแปรนี้ ให้ตรวจสอบว่าได้เพิ่มค่าลงในตัวแปรแทนที่จะกำหนดค่าใหม่

ทรัพยากร Dependency แต่ละรายการจะแสดงแพ็กเกจ config-file{: .external} ให้บิลด์ CMake ซึ่งคุณ นำเข้าด้วยคำสั่ง find_package{: .external} คำสั่งนี้จะค้นหาแพ็กเกจ config-file ที่ตรงกับชื่อแพ็กเกจและเวอร์ชันที่ระบุ และแสดงเป้าหมายที่กำหนดไว้เพื่อใช้ในบิลด์ ตัวอย่างเช่น หากแอปพลิเคชันกำหนด libapp.so และใช้ curl คุณควรใส่ข้อมูลต่อไปนี้ในไฟล์ CMakeLists.txt


add_library(app SHARED app.cpp)

# Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)

ตอนนี้คุณสามารถระบุ #include "curl/curl.h" ใน app.cpp ได้แล้ว เมื่อสร้างโปรเจ็กต์ ระบบบิลด์ที่มาพร้อมเครื่องภายนอกจะลิงก์ libapp.so กับ libcurl.so และแพ็กเกจ libcurl.so ใน APK หรือ App Bundle โดยอัตโนมัติ ดูข้อมูลเพิ่มเติมได้ที่ ตัวอย่าง Prefab ของ curl{:.external}

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

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

การอัปเดตการกำหนดค่าการลงชื่อ v1/v2

ลักษณะการทำงานสำหรับการกำหนดค่า App Signing ในบล็อก signingConfig เปลี่ยนไปดังนี้

การลงนาม v1

  • หากเปิดใช้ v1SigningEnabled อย่างชัดแจ้ง AGP จะทำการลงนามแอป v1
  • หากผู้ใช้ปิดใช้ v1SigningEnabled อย่างชัดแจ้ง ระบบจะไม่ทำการลงนามแอป v1
  • หากผู้ใช้ไม่ได้เปิดใช้การลงนาม v1 อย่างชัดแจ้ง ระบบอาจปิดใช้โดยอัตโนมัติ ตาม minSdk และ targetSdk

การลงนาม v2

  • หากเปิดใช้ v2SigningEnabled อย่างชัดแจ้ง AGP จะทำการลงนามแอป v2
  • หากผู้ใช้ปิดใช้ v2SigningEnabled อย่างชัดแจ้ง ระบบจะไม่ทำการลงนามแอป v2
  • หากผู้ใช้ไม่ได้เปิดใช้การลงนาม v2 อย่างชัดแจ้ง ระบบอาจปิดใช้โดยอัตโนมัติ ตาม targetSdk

การเปลี่ยนแปลงเหล่านี้ช่วยให้ AGP เพิ่มประสิทธิภาพบิลด์ได้โดยการปิดใช้กลไกการลงนาม ตามที่ผู้ใช้เปิดใช้แฟล็กเหล่านี้อย่างชัดแจ้งหรือไม่ ก่อนหน้านี้ การเผยแพร่ v1Signing อาจปิดใช้ได้แม้ว่าจะเปิดใช้อย่างชัดแจ้ง ซึ่งอาจทำให้เกิดความสับสน

นำปลั๊กอิน Android Gradle feature และ instantapp ออกแล้ว

ปลั๊กอิน Android Gradle เวอร์ชัน 3.6.0 เลิกใช้งานปลั๊กอินฟีเจอร์ (com.android.feature) และปลั๊กอิน Instant App (com.android.instantapp) เพื่อให้ใช้ปลั๊กอินฟีเจอร์แบบไดนามิก (com.android.dynamic-feature) ในการสร้างและแพ็กเกจ Instant App โดยใช้ Android App Bundle

ในปลั๊กอิน Android Gradle เวอร์ชัน 4.0.0 ขึ้นไป ระบบได้นำปลั๊กอินที่เลิกใช้งานแล้วเหล่านี้ออกอย่างสมบูรณ์ ดังนั้น หากต้องการใช้ปลั๊กอิน Android Gradle เวอร์ชันล่าสุด คุณต้องย้ายข้อมูล Instant App เพื่อรองรับ Android App Bundle การย้ายข้อมูล Instant App จะช่วยให้คุณใช้ประโยชน์จาก App Bundle และ ลดความซับซ้อนของการออกแบบแบบแยกส่วนของแอปได้

หมายเหตุ: หากต้องการเปิดโปรเจ็กต์ที่ใช้ปลั๊กอินที่นำออกแล้วใน Android Studio 4.0 ขึ้นไป โปรเจ็กต์ต้องใช้ปลั๊กอิน Android Gradle เวอร์ชัน 3.6.0 หรือต่ำกว่า

นำฟีเจอร์การประมวลผลคำอธิบายประกอบแยกต่างหากออกแล้ว

ระบบได้นำความสามารถในการแยกการประมวลผลคำอธิบายประกอบออกเป็นงานเฉพาะออกแล้ว ตัวเลือกนี้ใช้เพื่อรักษาการคอมไพล์ Java แบบเพิ่มทีละส่วนเมื่อใช้โปรเซสเซอร์สำหรับคำอธิบายประกอบที่ไม่เพิ่มทีละส่วนในโปรเจ็กต์ Java เท่านั้น โดยเปิดใช้ได้โดยตั้งค่า android.enableSeparateAnnotationProcessing เป็น true ในไฟล์ gradle.properties ซึ่งใช้ไม่ได้อีกต่อไป

คุณควรย้ายข้อมูลไปใช้ โปรเซสเซอร์สำหรับคำอธิบายประกอบแบบเพิ่มทีละส่วน แทนเพื่อปรับปรุงประสิทธิภาพบิลด์

includeCompileClasspath เลิกใช้งานแล้ว

ปลั๊กอิน Android Gradle จะไม่ตรวจสอบหรือรวมโปรเซสเซอร์สำหรับคำอธิบายประกอบที่คุณประกาศใน Compile Classpath อีกต่อไป และพร็อพเพอร์ตี้ DSL annotationProcessorOptions.includeCompileClasspath จะไม่มีผลอีกต่อไป หากคุณรวมโปรเซสเซอร์สำหรับคำอธิบายประกอบใน Compile Classpath คุณ อาจได้รับข้อผิดพลาดต่อไปนี้

Error: Annotation processors must be explicitly declared now.

หากต้องการแก้ไขปัญหานี้ คุณต้องรวมโปรเซสเซอร์สำหรับคำอธิบายประกอบไว้ในไฟล์ build.gradle โดยใช้การกำหนดค่าทรัพยากร Dependency annotationProcessor ดูข้อมูลเพิ่มเติมได้ที่เพิ่มโปรเซสเซอร์สำหรับคำอธิบายประกอบ

การแพ็กเกจทรัพยากร Dependency ที่สร้างไว้ล่วงหน้าซึ่ง CMake ใช้โดยอัตโนมัติ

Android Gradle Plugin เวอร์ชันก่อนหน้ากำหนดให้คุณต้องแพ็กเกจไลบรารีที่สร้างไว้ล่วงหน้าซึ่งระบบบิลด์ที่มาพร้อมเครื่องภายนอกของ CMake ใช้โดยชัดแจ้งโดยใช้ jniLibs คุณอาจมีไลบรารีในไดเรกทอรี src/main/jniLibs ของโมดูล หรืออาจอยู่ในไดเรกทอรีอื่นๆ ที่กำหนดค่าไว้ในไฟล์ build.gradle

sourceSets {
  main {
    // The libs directory contains prebuilt libraries that are used by the
    // app's library defined in CMakeLists.txt via an IMPORTED target.
    jniLibs.srcDirs = ['libs']
  }
}
sourceSets {
  main {
    // The libs directory contains prebuilt libraries that are used by the
    // app's library defined in CMakeLists.txt via an IMPORTED target.
    jniLibs.setSrcDirs(listOf("libs"))
  }
}

เมื่อใช้ปลั๊กอิน Android Gradle เวอร์ชัน 4.0 การกำหนดค่าข้างต้นไม่จำเป็นอีกต่อไป และจะทำให้บิลด์ล้มเหลว:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
  > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
    > More than one file was found with OS independent path 'lib/x86/libprebuilt.so'

ตอนนี้ระบบบิลด์ที่มาพร้อมเครื่องภายนอกจะแพ็กเกจไลบรารีเหล่านั้นโดยอัตโนมัติ ดังนั้นการแพ็กเกจไลบรารีด้วย jniLibs อย่างชัดแจ้งจะทำให้เกิดการซ้ำกัน หากต้องการหลีกเลี่ยงข้อผิดพลาดของบิลด์ ให้ย้ายไลบรารีที่สร้างไว้ล่วงหน้าไปยังตำแหน่ง ภายนอก jniLibs หรือนำการกำหนดค่า jniLibs ออกจากไฟล์ build.gradle

ปัญหาที่ทราบแล้ว

ส่วนนี้อธิบายปัญหาที่ทราบแล้วซึ่งพบในปลั๊กอิน Android Gradle เวอร์ชัน 4.0.0

ภาวะแข่งขันในกลไกการทำงานของ Gradle

การเปลี่ยนแปลงในปลั๊กอิน Android Gradle เวอร์ชัน 4.0 อาจทำให้เกิดภาวะแข่งขันใน Gradle เมื่อเรียกใช้ด้วย &endash;&endash;no&endash;daemon และ Gradle เวอร์ชัน 6.3 หรือต่ำกว่า ซึ่งทำให้ บิลด์ค้างหลังจากบิลด์เสร็จสิ้น

ปัญหานี้จะได้รับการแก้ไขใน Gradle เวอร์ชัน 6.4