ปลั๊กอิน 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 ที่มีการจัดการพร้อมกัน
(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 ผ่านการแปลงอาร์ติแฟกต์อยู่แล้ว
|
|