ปลั๊กอิน 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 29.0.2 29.0.2 ติดตั้งหรือกำหนดค่าเครื่องมือสร้าง SDK

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

ฟีเจอร์ใหม่

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

การรองรับเครื่องมือวิเคราะห์การสร้างของ Android Studio

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

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

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

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

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

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

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

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

  • การสตรีมแบบต่อเนื่อง (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)

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

หากต้องการเปิดใช้การรองรับ API ภาษาเหล่านี้ ให้รวมข้อมูลต่อไปนี้ไว้ในไฟล์ 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") }

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

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

  • คุณต้องการเรียกใช้ Lint ในโมดูลไลบรารีแบบแยก ซึ่งจะช่วยให้ Lint รู้จักการใช้งาน 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

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

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

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

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

ซึ่งหมายความว่าเมื่อแอปขอดาวน์โหลดโมดูลฟีเจอร์ แอปจะดาวน์โหลดโมดูลฟีเจอร์อื่นๆ ที่ขึ้นอยู่กับโมดูลนั้นด้วย หลังจากสร้าง โมดูลฟีเจอร์ สำหรับแอปแล้ว คุณจะประกาศทรัพยากร Dependency แบบฟีเจอร์ต่อฟีเจอร์ในไฟล์ build.gradle ของโมดูลได้ ตัวอย่างเช่น โมดูล :video จะประกาศการอ้างอิง :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"))
    ...
}

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

-Drundebug.feature.on.feature=true

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

เมื่อสร้างแอปโดยใช้ Android Gradle Plugin 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

การขึ้นต่อกันแต่ละรายการจะแสดงแพ็กเกจ 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)

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

การขึ้นต่อกันแต่ละรายการจะแสดงแพ็กเกจไฟล์การกำหนดค่า{: .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

ลักษณะการทำงานของการกำหนดค่าการลงนามในแอปในบล็อก signingConfig เปลี่ยนเป็นดังนี้

การลงนาม v1

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

การลงนาม v2

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

การเปลี่ยนแปลงเหล่านี้ช่วยให้ AGP เพิ่มประสิทธิภาพบิลด์ได้โดยการปิดใช้กลไกการลงนาม โดยขึ้นอยู่กับว่าผู้ใช้ได้เปิดใช้ Flag เหล่านี้อย่างชัดแจ้งหรือไม่ ก่อนการเปิดตัวนี้ 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 Bundle และลดความซับซ้อนของการออกแบบแบบแยกส่วนของแอปได้

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

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

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

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

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

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

Error: Annotation processors must be explicitly declared now.

หากต้องการแก้ไขปัญหานี้ คุณต้องรวมเครื่องมือประมวลผลคำอธิบายประกอบไว้ในไฟล์ build.gradle โดยใช้การกำหนดค่าการขึ้นต่อกันของ 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