ปลั๊กอิน 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 และเครื่องมือเลือกภาษาในแอป
หากต้องการเปิดใช้การรองรับภาษาต่อแอปโดยอัตโนมัติ ให้ระบุภาษาเริ่มต้น
- สร้างไฟล์ใหม่ชื่อ
resources.properties ในโฟลเดอร์ res ของโมดูลแอป
ในไฟล์ 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 จะมีไบต์โค้ดที่กำหนดเป้าหมายเป็น 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 Managed Device
(AVD) ที่จะใช้งานได้ในเวลาใดก็ตาม หากค่าเป็น 0 หรือติดลบ จะไม่มีจำนวนอุปกรณ์สูงสุด |
android.experimental.testOptions.installApkTimeout |
AGP 8.0 |
ไม่มี |
ระยะหมดเวลาเป็นวินาทีในการติดตั้ง APK หากค่าเป็น 0
หรือเป็นค่าลบ UTP จะตั้งค่าเป็นค่าเริ่มต้น |
ปัญหาที่แก้ไขแล้ว
ปลั๊กอิน Android Gradle 8.1.4
| ปัญหาที่แก้ไขแล้ว |
| ปลั๊กอิน Android Gradle |
|
อย่าเรียกใช้งาน Dexing ในคลาสของโปรเจ็กต์ย่อยเมื่อมีการ Dex ผ่านการแปลงอาร์ติแฟกต์แล้ว
|
|
ปลั๊กอิน Android Gradle 8.1.3
| ปัญหาที่แก้ไขแล้ว |
| ปลั๊กอิน Android Gradle |
|
[AGP 8.1.0] การทดสอบ ./gradlew ล้มเหลวโดยมีข้อความ "Unable to find manifest output" หากทั้ง splits.abi.isEnable และ testOptions.unitTests.isIncludeAndroidResources เป็นจริง
|
|
บิลด์ล้มเหลวหลังจากอัปเดตเป็น AGP 8.1
|
|
ปลั๊กอิน Android Gradle 8.1.2
| ปัญหาที่แก้ไขแล้ว |
| ปลั๊กอิน Android Gradle |
|
androidResources ไม่พร้อมใช้งานในโมดูลไลบรารี Android
|
|
[AGP 8.1.0] การทดสอบ ./gradlew ล้มเหลวโดยมีข้อความ "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.1
| ปัญหาที่แก้ไขแล้ว |
| Dexer (D8) |
|
ระเบียน Java 16: equals(null) จะส่ง NullPointerException
|
|
| Shrinker (R8) |
|
java.lang.VerifyError: ผู้ตรวจสอบปฏิเสธคลาส
|
|
การสร้างค้างอยู่ที่ :minifyReleaseWithR8 เมื่อใช้ไลบรารี Apache POI
|
|
ปฏิเสธการเรียกใช้เมื่อเปิดใช้การเพิ่มประสิทธิภาพ r8
|
|
NoClassDefFoundError สำหรับ java.lang.reflect.Executable
|
|
ปลั๊กอิน 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 ไม่ตรวจสอบการแคสต์ที่ถูกต้องสำหรับผู้รับการเรียก
|
|
TypedArray#close (API 31) ไม่ได้ทำการ Desugar แต่ AS ไม่แสดงคำเตือนเมื่อใช้ใน try-with-resources
|
|
ข้อบกพร่อง: คำเตือนที่ผิดพลาดว่า "ผู้ให้บริการ 'BC' ถูกเลิกใช้งานแล้วและตั้งแต่ Android P เป็นต้นไป..."
|
|
ผลบวกลวงของ Lint เกี่ยวกับ remember หลังจากอัปเกรด Kotlin เป็น 1.8.0
|
|
คำเตือนของเครื่องมือวิเคราะห์ซอร์สโค้ดที่ผิดพลาดสำหรับการตรวจสอบ SDK_INT ที่ดำเนินการภายในเมธอดที่มีพารามิเตอร์ enum
|
|
การตรวจสอบเครื่องมือวิเคราะห์ซอร์สโค้ด TypographyQuotes ไม่ทำงานกับเครื่องหมายคำพูดที่หลีกเลี่ยง
|
|
การตรวจสอบ Lint ของ TrustAllX509TrustManager จะแจ้งว่าอินเทอร์เฟซที่ขยาย X509TrustManager ไม่ถูกต้อง
|
|
การจัดรูปแบบใหม่เฉพาะโค้ดที่แทรกของการแก้ไขการแทนที่
|
|
Lint: ตัวอย่างความตั้งใจจะยกเว้นสำหรับ ReplaceStringQuickFix
|
|
| Shrinker (R8) |
|
VerifyError: ผู้ตรวจสอบปฏิเสธคลาสเมื่อใช้ 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 ขึ้นไป
|
|