ปลั๊กอิน 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. ในหน้าต่าง Build ให้เปิดหน้าต่าง Build Analyzer ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
    • หลังจาก Android Studio สร้างโปรเจ็กต์เสร็จแล้ว ให้คลิกแท็บเครื่องมือวิเคราะห์การสร้าง
    • หลังจาก Android Studio บิลด์โปรเจ็กต์เสร็จแล้ว ให้คลิกลิงก์ทางด้านขวาของหน้าต่างเอาต์พุตการสร้าง

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

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

การกรอง Sugar ออกจากไลบรารี Java 8 ใน D8 และ R8

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

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

ชุด API ที่รองรับในรุ่นนี้ ได้แก่

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

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

หากต้องการเปิดใช้การรองรับ 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 ของโมดูลไลบรารีด้วยหาก

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

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

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

ปลั๊กอิน Android Gradle 4.0.0 เปิดตัววิธีใหม่ในการควบคุมฟีเจอร์การสร้างที่ต้องการเปิดและปิดใช้ เช่น การเชื่อมโยงข้อมูลและการเชื่อมโยงมุมมอง เมื่อเพิ่มฟีเจอร์ใหม่ ระบบจะปิดใช้ฟีเจอร์เหล่านั้นโดยค่าเริ่มต้น จากนั้นคุณสามารถใช้บล็อก 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 ประกาศการพึ่งพา :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 (เพื่อรองรับฟีเจอร์เมื่อแก้ไขการกําหนดค่าการเรียกใช้ เช่น) โดยคลิกความช่วยเหลือ > แก้ไขตัวเลือก VM ที่กำหนดเองจากแถบเมนู และใส่ข้อมูลต่อไปนี้

-Drundebug.feature.on.feature=true

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

เมื่อสร้างแอปโดยใช้ 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 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} คำสั่งนี้จะค้นหาแพ็กเกจไฟล์กำหนดค่าที่ตรงกับชื่อและเวอร์ชันแพ็กเกจที่ระบุ และแสดงเป้าหมายที่กําหนดไว้เพื่อใช้ในบิลด์ ตัวอย่างเช่น หากแอปพลิเคชันของคุณกำหนด 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 โปรดดูข้อมูลเพิ่มเติมที่ตัวอย่างไฟล์แบบสำเร็จรูปของ curl{:.external}

การเปลี่ยนแปลงลักษณะการทำงาน

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

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

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

การรับรอง v1

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

การรับรอง v2

  • หากเปิดใช้ v2SigningEnabled อย่างชัดแจ้ง AGP จะดำเนินการ App Signing เวอร์ชัน 2
  • หากผู้ใช้ปิดใช้ v2SigningEnabled อย่างชัดเจน ระบบจะไม่ทำการรับรองแอปเวอร์ชัน 2
  • หากผู้ใช้ไม่ได้เปิดใช้การรับรอง 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 จะไม่ตรวจสอบหรือรวมโปรแกรมประมวลผลคำอธิบายประกอบที่คุณประกาศไว้ในเส้นทางการคอมไพล์อีกต่อไป และพร็อพเพอร์ตี้ annotationProcessorOptions.includeCompileClasspath DSL จะไม่มีผลอีกต่อไป หากรวมเครื่องประมวลผลคำอธิบายประกอบไว้ในเส้นทางคอมไพล์ คุณอาจได้รับข้อผิดพลาดต่อไปนี้

Error: Annotation processors must be explicitly declared now.

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

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

ปลั๊กอิน Android Gradle เวอร์ชันก่อนหน้ากำหนดให้คุณแพ็กเกจไลบรารีที่สร้างไว้ล่วงหน้าซึ่งบิลด์แบบเนทีฟภายนอกของ 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