ปลั๊กอิน Android Gradle 8.1.0 (กรกฎาคม 2023)

ปลั๊กอิน Android Gradle 8.1.0 เป็นรุ่นหลักที่มีฟีเจอร์และการปรับปรุงใหม่ๆ มากมาย

ความเข้ากันได้

เวอร์ชันขั้นต่ำ เวอร์ชันเริ่มต้น หมายเหตุ
Gradle 8.0 8.0 ดูข้อมูลเพิ่มเติมได้ที่การอัปเดต Gradle
เครื่องมือสร้าง SDK 33.0.1 33.0.1 ติดตั้งหรือกำหนดค่าเครื่องมือสร้าง SDK
NDK ไม่มี 25.1.8937393 ติดตั้งหรือกำหนดค่า NDK เวอร์ชันอื่น
JDK 17 17 ดูข้อมูลเพิ่มเติมได้ที่การตั้งค่าเวอร์ชัน JDK

Kotlin DSL เป็นค่าเริ่มต้นสำหรับการกำหนดค่าบิลด์

ตอนนี้โปรเจ็กต์ใหม่จะใช้ Kotlin DSL (build.gradle.kts) โดยค่าเริ่มต้นสำหรับการกำหนดค่าบิลด์ ซึ่งจะมอบประสบการณ์การแก้ไขที่ดีกว่า Groovy DSL (build.gradle) ด้วยการไฮไลต์ไวยากรณ์ การเติมโค้ดอัตโนมัติ และการไปยังประกาศ โปรดทราบว่าหากใช้ AGP 8.1 และ Kotlin DSL สำหรับการกำหนดค่าบิลด์ คุณควรใช้ Gradle 8.1 เพื่อประสบการณ์การใช้งานที่ดีที่สุด ดูข้อมูลเพิ่มเติมได้ที่คำแนะนำในการย้ายข้อมูล Kotlin DSL

การรองรับภาษาที่ใช้ในแอปโดยอัตโนมัติ

ตั้งแต่ Android Studio Giraffe Canary 7 และ AGP 8.1.0-alpha07 เป็นต้นไป คุณจะ กำหนดค่าแอปให้รองรับค่ากำหนดภาษาต่อแอปได้โดยอัตโนมัติ ปลั๊กอิน Android Gradle จะสร้างไฟล์ LocaleConfig ตามทรัพยากรของโปรเจ็กต์ และเพิ่มการอ้างอิงไปยังไฟล์ Manifest สุดท้าย คุณจึงไม่ต้อง ดำเนินการด้วยตนเองอีกต่อไป AGP ใช้ทรัพยากรในโฟลเดอร์ res ของโมดูลแอป และทรัพยากร Dependency ของโมดูลไลบรารีเพื่อกำหนดภาษาที่จะรวมไว้ในไฟล์ LocaleConfig

โปรดทราบว่าฟีเจอร์ภาษาต่อแอปอัตโนมัติรองรับแอปที่ใช้ Android 13 (API ระดับ 33) ขึ้นไป หากต้องการใช้ฟีเจอร์นี้ คุณต้องตั้งค่า compileSdkVersion เป็น 33 ขึ้นไป หากต้องการกำหนดค่ากำหนดภาษาต่อแอป สำหรับ Android เวอร์ชันก่อนหน้า คุณยังคงต้องใช้ API และเครื่องมือเลือกภาษาในแอป

หากต้องการเปิดใช้การรองรับภาษาต่อแอปโดยอัตโนมัติ ให้ระบุภาษาเริ่มต้น

  1. สร้างไฟล์ใหม่ชื่อ resources.properties ในโฟลเดอร์ res ของโมดูลแอป
  2. ในไฟล์ resources.properties ให้ตั้งค่าภาษาเริ่มต้นด้วยป้ายกำกับ unqualifiedResLocale หากต้องการสร้างชื่อภาษา ให้รวมรหัสภาษาเข้ากับรหัสสคริปต์และรหัสภูมิภาค (ไม่บังคับ) โดยคั่นแต่ละรหัสด้วยขีดกลาง ดังนี้

    • ภาษา: ใช้รหัส ISO 639-1 แบบ 2 หรือ 3 ตัวอักษร
    • สคริปต์ (ไม่บังคับ): ใช้รหัส ISO 15924
    • ภูมิภาค (ไม่บังคับ): ใช้รหัส ISO 3166-1-alpha-2 แบบ 2 ตัวอักษร หรือรหัส UN_M.49 แบบ 3 หลัก

    เช่น หากภาษาเริ่มต้นของคุณคือภาษาอังกฤษแบบอเมริกัน

        unqualifiedResLocale=en-US
        

AGP จะเพิ่มภาษาเริ่มต้นนี้และภาษาอื่น ที่คุณระบุโดยใช้ไดเรกทอรี values-* ในโฟลเดอร์ res ไปยังไฟล์ LocaleConfig ที่สร้างขึ้นโดยอัตโนมัติ

การรองรับภาษาต่อแอปอัตโนมัติจะปิดอยู่โดยค่าเริ่มต้น หากต้องการเปิดฟีเจอร์นี้ ให้ใช้การตั้งค่า generateLocaleConfig ในบล็อก androidResources {} ของ ไฟล์ build.gradle.kts ระดับโมดูล (ไฟล์ build.gradle หากคุณใช้ Groovy)

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android Lint มีไบต์โค้ดที่กำหนดเป้าหมายเป็น JVM 17

ตั้งแต่ AGP 8.1.0-alpha04 เป็นต้นไป Android Lint จะมีไบต์โค้ดที่กำหนดเป้าหมายเป็น JVM 17 หากเขียนการตรวจสอบ Lint ที่กำหนดเอง คุณต้องคอมไพล์ด้วย JDK 17 ขึ้นไป และระบุ jvmTarget = '17' ในตัวเลือกคอมไพเลอร์ Kotlin

ดูข้อมูลเพิ่มเติมเกี่ยวกับเครื่องมือ Lint ได้ที่ปรับปรุงโค้ดโดยใช้ Lint ตรวจสอบ

ย้ายการตั้งค่าการบีบอัดไลบรารีเนทีฟไปที่ DSL

ตั้งแต่ AGP 8.1.0-alpha10 เป็นต้นไป คุณจะได้รับคำเตือนหากไม่ได้กำหนดค่า การบีบอัดไลบรารีเนทีฟโดยใช้ DSL แทนไฟล์ Manifest คำแนะนำต่อไปนี้จะอธิบายวิธีอัปเดตการกำหนดค่าเพื่อใช้ DSL หากต้องการ รับความช่วยเหลือในการอัปเดตเหล่านี้ ให้ใช้ผู้ช่วยอัปเกรด AGP (เครื่องมือ > ผู้ช่วยอัปเกรด AGP)

หากต้องการใช้ไลบรารีเนทีฟที่ไม่ได้บีบอัด ให้นำแอตทริบิวต์ android::extractNativeLibs ออกจากไฟล์ Manifest แล้วเพิ่มโค้ดต่อไปนี้ลงในไฟล์ build.gradle.kts ระดับโมดูล (ไฟล์ build.gradle หากคุณใช้ Groovy)

Kotlin

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

Flag ของบิลด์ทดลอง

ซึ่งเป็นฟีเจอร์ทดลองสำหรับการกำหนดค่าบิลด์ที่พร้อมใช้งานใน AGP 8.1

ตั้งค่าสถานะ เพิ่มใน ค่าเริ่มต้น หมายเหตุ
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false การเปิดใช้โดยไม่ได้ระบุการกำหนดค่าการลงนามจะทำให้ AGP ใช้การกำหนดค่าการลงนามดีบักเริ่มต้นเมื่อเรียกใช้บิลด์ที่สร้างโปรไฟล์หรือดีบักได้ โดยค่าเริ่มต้น ระบบจะปิดใช้ฟีเจอร์นี้เพื่อกระตุ้นให้ผู้เขียนบิลด์ ประกาศการกำหนดค่าการลงนามในการสร้างโปรไฟล์ที่เฉพาะเจาะจง
android.experimental.library.desugarAndroidTest AGP 8.0 false แฟล็กนี้ช่วยให้ผู้สร้างไลบรารีเปิดใช้การยกเลิกการเพิ่มน้ำตาลของไลบรารีหลักสำหรับ APK ของการทดสอบได้โดยไม่ส่งผลต่อ AAR ที่สร้างขึ้น เช่น ผ่านการ Lint เราวางแผนที่จะรองรับลักษณะการทำงานนี้ใน Variant API ในที่สุด
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false หากเปิดใช้ Gradle Managed Devices จะอนุญาตให้อุปกรณ์ที่กำหนดเองซึ่งผู้ใช้กำหนด ประเภทที่ปลั๊กอินระบุได้ ต้องเปิดใช้ Flag นี้หากคุณ ต้องการใช้ปลั๊กอิน Firebase Test Lab
android.lint.printStackTrace AGP 8.0 false หากเปิดใช้ Android Lint จะพิมพ์ Stacktrace หากเกิดข้อขัดข้อง โดยฟีเจอร์นี้ มีความสามารถเช่นเดียวกับตัวแปรสภาพแวดล้อม LINT_PRINT_STACKTRACE
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 ไม่มี ระบุจำนวนสูงสุดของอุปกรณ์ Gradle ที่มีการจัดการพร้อมกัน (AVD) ที่จะใช้งานได้ในเวลาใดก็ตาม หากค่าเป็น 0 หรือติดลบ จะไม่มีจำนวนอุปกรณ์สูงสุด
android.experimental.testOptions.installApkTimeout AGP 8.0 ไม่มี ระยะหมดเวลาเป็นวินาทีในการติดตั้ง APK หากค่าเป็น 0 หรือเป็นค่าลบ UTP จะตั้งค่าเป็นค่าเริ่มต้น

ปัญหาที่แก้ไขแล้ว

ปลั๊กอิน Android Gradle 8.1.0

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
ปัญหา `com.android.build.gradle.tasks.ShaderCompile` กับแคชการกำหนดค่า
การเพิ่มลงในทรัพยากร Java โดยใช้ API ของ AGP จะทำให้แคชการกำหนดค่าใช้งานไม่ได้
[Android Studio : Flamingo | 2022.2.1 Canary 8] liblog.so บรรจุอยู่ภายใน APK
KGP จะอ่านไฟล์ Manifest ระหว่างการกำหนดค่า ซึ่งจะทำให้แคชการกำหนดค่าไม่ถูกต้องเมื่อมีการเปลี่ยนแปลงไฟล์ Manifest
สร้างข้อความเตือนที่ไม่ชัดเจนเมื่อมีปัญหาในไฟล์ Manifest ที่ผสาน
การอัปเกรดเป็น AGP 7.4 จะทำให้เกิด StackOverflowError
ClassNotFoundException ในฟีเจอร์แบบไดนามิกที่ขึ้นต่อกันกับโปรเจ็กต์ย่อยของไลบรารี Kotlin โดยตรง
processDebugUnitTestManifest ล้มเหลวโดยมีตัวยึดตำแหน่งไฟล์ Manifest สำหรับตัวแปรทดสอบ
processDebugUnitTestManifest ล้มเหลวโดยมีตัวยึดตำแหน่งไฟล์ Manifest สำหรับตัวแปรทดสอบ
พร็อพเพอร์ตี้เนมสเปซน่าจะเป็นของ HasAndroidResources
ปิดใช้ข้อความ "ไฟล์ Gradle มีการเปลี่ยนแปลงตั้งแต่การซิงค์โปรเจ็กต์ครั้งล่าสุด" ไม่ได้
"เราขอแนะนำให้ใช้ปลั๊กอิน Android Gradle เวอร์ชันใหม่กว่า" เมื่อไม่มีเวอร์ชันใหม่กว่า
processDebugUnitTestManifest ล้มเหลวโดยมีตัวยึดตำแหน่งไฟล์ Manifest สำหรับตัวแปรทดสอบ
แฟล็กบูลีนสําหรับปิดใช้การตรวจสอบ SDK ที่คอมไพล์ใน CheckAarMetadataTask
ข้อผิดพลาดในการสร้างอ้างอิงถึง API ระดับ 34 ซึ่งไม่มีอยู่
การตั้งค่า Toolchain ของ JVM จะไม่ส่งผลต่อค่า targetCompatibility ของ JavaCompile
รายการ Deep Link ของการนำทางที่มีโดเมนไวลด์การ์ดไม่มีแอตทริบิวต์ `android:host` ในไฟล์ Manifest ที่ผสาน
งาน processDebugMainManifest ล้มเหลวเนื่องจาก Android Gradle Plugin 8.1
เราจะนำ AnalyticsRecordingTask ออกได้ไหม
เนื้อหาของ output-metadata.json ไม่สอดคล้องกัน
เราจะนำ AnalyticsRecordingTask ออกได้ไหม
เนื้อหาของ output-metadata.json ไม่สอดคล้องกัน
การตั้งค่า Toolchain ของ JVM จะไม่ส่งผลต่อค่า targetCompatibility ของ JavaCompile
รายการ Deep Link ของการนำทางที่มีโดเมนไวลด์การ์ดไม่มีแอตทริบิวต์ `android:host` ในไฟล์ Manifest ที่ผสาน
งาน processDebugMainManifest ล้มเหลวเนื่องจาก Android Gradle Plugin 8.1
Android Studio ไม่สนใจตัวแปรสภาพแวดล้อม STUDIO_GRADLE_JDK
ประเภทแหล่งที่มาที่กำหนดเองควรสร้างชุดแหล่งข้อมูลแบบหลายรสชาติ
DependenciesInfoBuilder ต้องมีการอัปเดต API + เอกสาร
DexingNoClasspathTransform (minSdk >= 24) ที่มีเป้าหมาย Java 11 ไม่สำเร็จเนื่องจากไม่มีสมาชิกที่ซ้อนกัน
DslExtension.Builder.extendProjectWith() ไม่ทำงานตามที่อธิบายไว้ใน Groovy
เพิ่ม API VariantSelector.withFlavor ที่ไม่ได้ใช้ kotlin.Pair
AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) ไม่พบแคชเนื่องจาก `proguard.txt` มีการเปลี่ยนแปลง
ไฟล์ Manifest ของแอปที่ผสานรวมจะมีแอตทริบิวต์ extractNativeLibs และ useEmbeddedDex จากทรัพยากร Dependency
AGP: แสดงเส้นทางไปยังเครื่องมือ AIDL และไฟล์ AIDL ของเฟรมเวิร์กเป็น API สาธารณะ
คำขอ: ให้ IDE เสนอวิธีแก้ไขสำหรับ "PermittedSubclasses requires ASM9"
ข้อบกพร่อง: "เปิดใช้ KSP และใช้โปรเซสเซอร์ KSP สำหรับการอ้างอิงนี้แทน" จะนำไปยังเว็บไซต์
Gradle 8.1 ทำให้การแคชการกำหนดค่าใช้งานไม่ได้เนื่องจาก .gradle/.android/analytics.settings
generateLocaleConfig ใน AGP 8.1.0 ใช้การจัดลำดับแบบไม่แน่นอน ซึ่งทำให้บิลด์ที่ทำซ้ำไม่ได้
Dexer (D8)
การยกเลิกการเพิ่มน้ำตาลในไลบรารีหลักทำให้แอปขัดข้องหลังจากการอัปเดตล่าสุด
การถดถอยของ AGP 8.1.0 กับ API 21 - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
Lint
Lint จะตรวจสอบการแคสต์ที่ปลอดภัยสำหรับอินเทอร์เฟซที่ใช้งานโดยตรงเท่านั้น ไม่ใช่อินเทอร์เฟซที่รับค่ามา
Lint ไม่ตรวจสอบการแคสต์ที่ถูกต้องสำหรับผู้รับการเรียก
TypedArray#close (API 31) ไม่ได้ทำการ Desugar แต่ AS ไม่แสดงคำเตือนเมื่อใช้ใน try-with-resources
ข้อบกพร่อง: คำเตือนที่ผิดพลาดว่า "ผู้ให้บริการ 'BC' ถูกเลิกใช้งานแล้วและตั้งแต่ Android P เป็นต้นไป..."
ผลบวกลวงของ Lint เกี่ยวกับ remember หลังจากอัปเกรด Kotlin เป็น 1.8.0
คำเตือน Lint ที่เป็นข้อสันนิษฐานที่ผิดพลาดสำหรับการตรวจสอบ SDK_INT ที่ดำเนินการภายในเมธอดที่มีพารามิเตอร์ Enum
การตรวจสอบ TypographyQuotes Lint ไม่ทำงานกับเครื่องหมายคำพูดที่หลีกเลี่ยง
การตรวจสอบ Lint ของ TrustAllX509TrustManager จะแจ้งว่าอินเทอร์เฟซที่ขยาย X509TrustManager ไม่ถูกต้อง
จัดรูปแบบใหม่เฉพาะโค้ดที่แทรกของการแก้ไขการแทนที่
Lint: การแสดงตัวอย่างความตั้งใจจะทำให้เกิดข้อยกเว้นสำหรับ ReplaceStringQuickFix
Shrinker (R8)
VerifyError: Verifier ปฏิเสธคลาสเมื่อใช้ R8 กับ Kotlin 1.8.20
R8 ใน AGP 8 ทำให้บริการ Google Fit หยุดทำงาน
การรวมข้อมูลไฟล์ต้นฉบับที่มีชื่อที่เหลือซึ่งทับซ้อนกับชื่ออินพุตจะแสดงอย่างไม่ถูกต้อง
R8 ล้มเหลวระหว่างการสร้าง Compose โดยมี ArrayIndexOutOfBoundsException
โค้ดที่เกี่ยวข้องกับ StringBuilder อย่างง่ายไม่มีการเรียกหางเพื่อต่อท้ายในโหมดรีลีสหรือ debuggable=false
กรณีข้อยกเว้นในเมธอด VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
dex-startup-optimization ส่งผลให้เกิด java.lang.VerifyError: Rejecting class
แอปขัดข้องพร้อมข้อผิดพลาดในการยืนยันใน Android 12 ขึ้นไป

ปลั๊กอิน Android Gradle 8.1.1

ปัญหาที่แก้ไขแล้ว
Dexer (D8)
ระเบียน Java 16: equals(null) จะส่ง NullPointerException
Shrinker (R8)
java.lang.VerifyError: Verifier rejected class
Build ค้างอยู่ที่ :minifyReleaseWithR8 เมื่อใช้ไลบรารี Apache POI
ปฏิเสธการเรียกใช้เมื่อเปิดใช้การเพิ่มประสิทธิภาพ r8
NoClassDefFoundError สำหรับ java.lang.reflect.Executable

ปลั๊กอิน Android Gradle 8.1.2

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
androidResources ไม่พร้อมใช้งานในโมดูลไลบรารี Android
[AGP 8.1.0] ./gradlew test ล้มเหลวโดยมีข้อความ "Unable to find manifest output" หากทั้ง splits.abi.isEnable และ testOptions.unitTests.isIncludeAndroidResources เป็นจริง
Shrinker (R8)
Kotlin 1.9 ทำให้ R8 ทำลาย Lambda ของ Kotlin หากมีการลบการตรวจสอบค่า Null
R8 ล้มเหลวโดยมีข้อความ "พบค่าที่ไม่ได้กำหนดในระหว่างการคอมไพล์" สำหรับ play-services-measurement-21.3.0-runtime.jar

ปลั๊กอิน Android Gradle 8.1.3

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
[AGP 8.1.0] ./gradlew test ล้มเหลวโดยมีข้อความ "Unable to find manifest output" หากทั้ง splits.abi.isEnable และ testOptions.unitTests.isIncludeAndroidResources เป็นจริง
บิลด์ล้มเหลวหลังจากอัปเดตเป็น AGP 8.1

ปลั๊กอิน Android Gradle 8.1.4

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
อย่าเรียกใช้งาน Dexing ในคลาสของโปรเจ็กต์ย่อยเมื่อมีการ Dex ผ่านการแปลงอาร์ติแฟกต์อยู่แล้ว