ปลั๊กอิน Android Gradle 8.1.0 เป็นเวอร์ชันหลักที่มีฟีเจอร์และการปรับปรุงใหม่ๆ มากมาย
ความเข้ากันได้
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 และเครื่องมือเลือกภาษาในแอป
หากต้องการเปิดใช้การรองรับภาษาของแต่ละแอปโดยอัตโนมัติ ให้ระบุภาษาเริ่มต้นโดยทำดังนี้
- ในโฟลเดอร์
res
ของโมดูลแอป ให้สร้างไฟล์ใหม่ชื่อ resources.properties
ในไฟล์ resources.properties
ให้ตั้งค่าภาษาเริ่มต้นด้วยป้ายกำกับ unqualifiedResLocale
หากต้องการสร้างชื่อภาษา ให้รวมรหัสภาษาเข้ากับสคริปต์และรหัสภูมิภาค (ไม่บังคับ) โดยคั่นแต่ละรายการด้วยขีดกลาง
ตัวอย่างเช่น หากภาษาเริ่มต้นคือภาษาอังกฤษแบบอเมริกัน
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 ผ่านการเปลี่ยนรูปแบบอาร์ติแฟกต์แล้ว
|
|