ปลั๊กอิน 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. ในโฟลเดอร์ res ของโมดูลแอป ให้สร้างไฟล์ใหม่ชื่อ resources.properties
  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 จะมี Bytecode ที่กําหนดเป้าหมาย 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 การสร้างเวอร์ชันทดลอง

นี่เป็น Flag ทดลองสําหรับการกําหนดค่าบิลด์ที่มีอยู่ใน AGP 8.1

ตั้งค่าสถานะ เพิ่มใน ค่าเริ่มต้น หมายเหตุ
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false การเปิดใช้ตัวเลือกนี้โดยไม่ระบุการกำหนดค่าการรับรองจะทำให้ AGP ใช้การกำหนดค่าการรับรองข้อบกพร่องเริ่มต้นเมื่อเรียกใช้บิลด์ที่โปรไฟล์ได้หรือแก้ไขข้อบกพร่องได้ ระบบจะปิดใช้ Flag นี้โดยค่าเริ่มต้นเพื่อกระตุ้นให้ผู้เขียนบิลด์ประกาศการกำหนดค่าการรับรองโปรไฟล์ที่เฉพาะเจาะจง
android.experimental.library.desugarAndroidTest AGP 8.0 false Flag นี้ช่วยให้เครื่องมือสร้างไลบรารีเปิดใช้การกรอง Sugar ออกจากไลบรารีหลักสำหรับ APK ทดสอบได้โดยไม่ส่งผลต่อ AAR ที่สร้างขึ้น เช่น ผ่านการตรวจสอบโค้ด เราวางแผนที่จะรองรับลักษณะการทำงานนี้ใน Variant API ในอนาคต
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false หากเปิดใช้ อุปกรณ์ที่มีการจัดการของ Gradle จะอนุญาตให้ใช้ประเภทอุปกรณ์ที่กําหนดเองซึ่งผู้ใช้ระบุได้ ซึ่งปลั๊กอินสามารถระบุได้ คุณต้องเปิดใช้ Flag นี้หากต้องการใช้ปลั๊กอิน Firebase Test Lab
android.lint.printStackTrace AGP 8.0 false หากเปิดใช้ Android Lint จะพิมพ์สแต็กเทรซหากเกิดข้อขัดข้อง Flag นี้มีความสามารถเหมือนกับตัวแปรสภาพแวดล้อม 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 โดยใช้ AGP API จะทําให้แคชการกําหนดค่าใช้งานไม่ได้
[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 สําหรับตัวแปรการทดสอบ
Flag บูลีนสำหรับการปิดใช้การตรวจสอบ SDK ที่คอมไพล์ใน CheckAarMetadataTask
ข้อผิดพลาดเกี่ยวกับบิลด์หมายถึง API ระดับ 34 ซึ่งไม่มีอยู่
การตั้งค่าเครื่องมือทํางาน JVM จะไม่ส่งผลต่อค่า targetCompatibility ของ JavaCompile
รายการ Deep Link การนำทางที่มีโดเมนไวลด์การ์ดไม่มีแอตทริบิวต์ `android:host` ในไฟล์ Manifest ที่ผสาน
งาน processDebugMainManifest ดำเนินการไม่สำเร็จตั้งแต่ปลั๊กอิน Android Gradle 8.1
เรานํา AnalyticsRecordingTask ออกได้ไหม
เนื้อหาของ output-metadata.json ไม่สอดคล้องกัน
เรานํา AnalyticsRecordingTask ออกได้ไหม
เนื้อหาของ output-metadata.json ไม่สอดคล้องกัน
การตั้งค่าเครื่องมือทํางาน JVM จะไม่ส่งผลต่อค่า targetCompatibility ของ JavaCompile
รายการ Deep Link การนำทางที่มีโดเมนไวลด์การ์ดไม่มีแอตทริบิวต์ `android:host` ในไฟล์ Manifest ที่ผสาน
งาน processDebugMainManifest ดำเนินการไม่สำเร็จตั้งแต่ปลั๊กอิน Android Gradle 8.1
Android Studio ไม่สนใจตัวแปรสภาพแวดล้อม STUDIO_GRADLE_JDK
ประเภทแหล่งที่มาที่กําหนดเองควรสร้างชุดแหล่งที่มาหลายรูปแบบ
DependenciesInfoBuilder ต้องการการอัปเดต API และเอกสาร
DexingNoClasspathTransform (minSdk >= 24) ที่มีเป้าหมายเป็น Java 11 ไม่สำเร็จเนื่องจากไม่มีสมาชิกที่ฝังอยู่
DslExtension.Builder.extendProjectWith() ไม่ทํางานตามที่อธิบายไว้ใน Groovy
เพิ่ม VariantSelector.withFlavor API ที่ไม่ได้ใช้ 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)
การกรองภาษา Sugar ออกจากไลบรารีหลักทำให้แอปขัดข้องหลังจากการอัปเดตล่าสุด
agp 8.1.0 ถดถอยกับ API 21 - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] ตรวจสอบไม่สําเร็จ: !method->IsAbstract()
Lint
Lint จะตรวจสอบเฉพาะการแคสต์ที่ปลอดภัยสำหรับอินเทอร์เฟซที่ติดตั้งใช้งานโดยตรงเท่านั้น ไม่ใช่อินเทอร์เฟซที่รับช่วงมา
Lint จะไม่ตรวจสอบการแคสต์ที่ถูกต้องสำหรับผู้รับสาย
TypedArray#close (API 31) ไม่ได้แปลงเป็นรูปแบบทั่วไป แต่ AS ไม่แสดงคำเตือนเมื่อใช้ใน try-with-resources
ข้อบกพร่อง: คำเตือนผลบวกลวงของ "ผู้ให้บริการ "BC" เลิกใช้งานแล้ว และตั้งแต่ Android P..."
Lint แสดงผลบวกลวงเกี่ยวกับ remember หลังจากอัปเกรด Kotlin เป็น 1.8.0
คําเตือน Lint ที่ผิดพลาดสําหรับการตรวจสอบ SDK_INT ที่ดําเนินการภายในเมธอดที่มีพารามิเตอร์ enum
การตรวจสอบ Lint ของ TypographyQuotes ไม่ทำงานกับเครื่องหมายคำพูดที่หลบอยู่
การตรวจสอบ Lint ของ TrustAllX509TrustManager แจ้งว่าอินเทอร์เฟซที่ขยาย X509TrustManager ไม่ถูกต้อง
จัดรูปแบบโค้ดที่แทรกมาใหม่ของวิธีแก้ไขด้วยการแทนที่
Lint: การแสดงตัวอย่างความตั้งใจทำให้เกิดข้อยกเว้นสำหรับ ReplaceStringQuickFix
Shrinker (R8)
VerifyError: Verifier rejected class when using R8 with Kotlin 1.8.20
R8 ใน AGP 8 ทำให้บริการ Google Fit ใช้งานไม่ได้
การรวมข้อมูลไฟล์ต้นทางที่มีชื่อที่เหลือซึ่งทับซ้อนกับชื่ออินพุตแสดงอย่างไม่ถูกต้อง
R8 ทำงานไม่สำเร็จระหว่างการสร้าง Compose ด้วย ArrayIndexOutOfBoundsException
โค้ดที่เกี่ยวข้องกับ StringBuilder แบบง่ายไม่มีการเรียกใช้ส่วนท้ายเพื่อเพิ่มต่อในโหมดรุ่นหรือแก้ไขได้=เท็จ
กรณีพิเศษในเมธอด VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
dex-startup-optimization ส่งผลให้เกิด java.lang.VerifyError: Rejecting class
ขัดข้องด้วยข้อผิดพลาดในการยืนยันใน Android 12 ขึ้นไป

ปลั๊กอิน Android Gradle 8.1.1

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

ปลั๊กอิน Android Gradle 8.1.2

ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle
androidResources ไม่พร้อมใช้งานในโมดูลไลบรารี Android
[AGP 8.1.0] ./gradlew test ดำเนินการไม่สำเร็จพร้อมข้อความ "ไม่พบเอาต์พุตไฟล์ Manifest" หากทั้ง 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 ดำเนินการไม่สำเร็จพร้อมข้อความ "ไม่พบเอาต์พุตไฟล์ Manifest" หากทั้ง splits.abi.isEnable และ testOptions.unitTests.isIncludeAndroidResources เป็น "จริง"
บิลด์ไม่สำเร็จหลังจากอัปเดตเป็น AGP 8.1

ปลั๊กอิน Android Gradle 8.1.4

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