คู่มือนี้อธิบายการเปลี่ยนแปลงที่จำเป็นสำหรับการย้ายข้อมูลเป็นเวอร์ชัน 5.0
การอัปเดต Gradle และปลั๊กอิน Android Gradle
อัปเกรด Gradle และปลั๊กอิน Android Gradle
ขั้นแรก ให้อัปเกรด Gradle และปลั๊กอิน Android Gradle การอัปเกรดนี้รวมถึงการทำงานร่วมกันได้ดียิ่งขึ้นกับทรัพยากร Dependency ของ SDK บางรายการ (รวมถึง Kotlin 1.9) ตลอดจนการแก้ไขข้อบกพร่องที่สำคัญบางอย่าง
การเผยแพร่ SDK เวอร์ชันหลักนี้กำหนดให้โปรเจ็กต์แอปพลิเคชัน Android ต้องมีทรัพยากร Dependency เวอร์ชันต่อไปนี้
- Gradle เวอร์ชัน v7.5.0 ขึ้นไป แต่ไม่เกิน v7.6.0
- ปลั๊กอิน Android Gradle (AGP) เวอร์ชัน v7.4.x
คุณสามารถกำหนดเป้าหมายเป็นปลั๊กอินเวอร์ชันที่สูงกว่าได้ แต่คุณอาจพบคำเตือนการเลิกใช้งาน หรือฟีเจอร์ใหม่บางอย่างอาจทำงานไม่ได้
หากต้องการแก้ไข Gradle เวอร์ชัน ให้แก้ไขบรรทัดในไฟล์ /gradle/wrapper/gradle-wrapper.properties ของโปรเจ็กต์
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
หากต้องการแก้ไขปลั๊กอิน Android Gradle เวอร์ชัน ให้แก้ไขไฟล์ build.gradle ที่มีบล็อก buildscript เช่น
buildscript {
repositories {
google()
mavenCentral()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.4.1'
}
}
การย้ายข้อมูลการรองรับไลบรารี Java 7 เป็น Java 8
ขั้นตอนที่ 1 - เปิดใช้การรองรับไลบรารี Java 8
เนื่องจากระดับ API ขั้นต่ำของ SDK คือ 23 และ AGP เวอร์ชันที่กำหนดคือ 7.4 ขึ้นไป การกำหนดค่าจึงแตกต่างจากเอกสารประกอบแหล่งที่มาที่กล่าวถึงเล็กน้อย
buildscript {
repositories {
google()
mavenCentral()
jcenter()
maven {
url = uri("https://storage.googleapis.com/r8-releases/raw")
}
}
dependencies {
classpath 'com.android.tools:r8:8.0.46'
classpath 'com.android.tools.build:gradle:7.4.1'
}
}
android {
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.3'
}
ขั้นตอนที่ 2 - ย้ายข้อมูลจาก Proguard หรือ Dexguard ไปเป็น R8
AGP v7.4 ขึ้นไปใช้ R8 เป็นเครื่องมือเริ่มต้นสำหรับการลดขนาด การทำให้สับสน และการเพิ่มประสิทธิภาพสำหรับไบนารี ดังนั้นจึงไม่จำเป็นต้องดำเนินการพิเศษใดๆ ในตอนนี้
หากย้ายข้อมูลโปรเจ็กต์จาก AGP 4.0 ขึ้นไป AGP อาจแสดงคำเตือนต่อไปนี้เกี่ยวกับการนำไฟล์ออก
- การใช้
useProguard trueในไฟล์build.gradle - การใช้
android.enableR8=falseในไฟล์gradle.properties
การนำบรรทัดเหล่านี้ออกมักจะช่วยแก้ปัญหาดังกล่าวได้
การย้ายข้อมูลจาก Kotlin 1.6 เป็น 1.9
ขั้นตอนที่ 1 - ย้ายข้อมูลเป็นปลั๊กอิน Kotlin Gradle 1.9.0
อัปเดตปลั๊กอิน Kotlin Gradle เวอร์ชันในไฟล์ build.gradle ของโมดูลระดับบนสุดของแอปพลิเคชัน ตรวจสอบว่าได้เพิ่ม org.jetbrains.kotlin:kotlin-gradle-plugin ในทรัพยากร Dependency จากบล็อก buildscript ในกรณีที่ไม่มี
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0"
}
}
คุณต้องย้ายข้อมูลแอปพลิเคชันจาก Kotlin-synthetics ในกรณีที่ใช้ปลั๊กอิน Kotlin Gradle 1.6.X หรือ 1.7.X ดูข้อมูลเพิ่มเติมได้จากคำแนะนำในการย้ายข้อมูลอย่างเป็นทางการ
ขั้นตอนที่ 2 - อัปเกรด kotlin-stdlib เป็น 1.9.0
อัปเกรด kotlin-stblib เป็น 1.9.0 ในไฟล์ build.gradle ของแอปพลิเคชัน
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.0"
}
ตรวจสอบว่าได้นำข้อมูลอ้างอิงถึง kotlin-stdlib-jdk7 หรือ kotlin-stdlib-jdk8 ออกแล้ว ทรัพยากร Dependency ทั้ง 2 รายการนี้ได้รวมเข้ากับ
kotlin-stdlib แล้วโดยเริ่มตั้งแต่ Kotlin
1.8.0
การเลิกใช้งาน StatusListener
ตอนนี้อินเทอร์เฟซ StatusListener เลิกใช้งานแล้ว (จะนำออกใน v6) และเปลี่ยนไปใช้ DriverStatusListener แทน
การเปลี่ยนแปลงหลักๆ มี 3 อย่างดังนี้
- เปลี่ยนอินเทอร์เฟซ
implementsจากStatusListenerเป็นDriverStatusListener - เพิ่มพารามิเตอร์
NullablecauseลงในupdateStatus - เรียก
DriverContextBuilder.setDriverStatusListenerแทนsetStatusListener
DriverStatusListener มีโครงสร้างเหมือนกับ StatusListener ความแตกต่างหลักๆ ระหว่างทั้ง 2 อย่างนี้คือ DriverStatusListener.updateStatus() ใช้พารามิเตอร์เพิ่มเติมที่ชื่อว่า cause ซึ่งจะให้ข้อมูลเชิงลึกแก่ผู้ใช้เกี่ยวกับสาเหตุของการอัปเดตที่มีระดับสถานะข้อผิดพลาด
โดยปกติแล้ว คุณจะใช้ cause เพื่อดึงรหัสข้อผิดพลาดที่ Fleet Engine แสดงผลสำหรับการอัปเดตตำแหน่งที่ไม่สำเร็จ
ตัวอย่างต่อไปนี้แสดงวิธีใช้ StatusListener
class MyStatusListener implements StatusListener {
/** Called when background status is updated during actions such as location reporting. */
@Override
public void updateStatus(
StatusLevel statusLevel, StatusCode statusCode, String statusMsg) {
// Implementation
}
}
// Inject StatusListener into DriverContext.
DriverContextBuilder.setStatusListener(new MyStatusListener());
ตัวอย่างต่อไปนี้แสดงการใช้งาน DriverStatusListener
class MyStatusListener implements DriverStatusListener {
/** Called when background status is updated during actions such as location reporting. */
@Override
public void updateStatus(
StatusLevel statusLevel, StatusCode statusCode, String statusMsg, @Nullable Throwable cause) {
// Existing implementation
if (cause != null && cause instanceof StatusRuntimeException) {
if (Status.NOT_FOUND.getCode().equals(cause.getStatus().getCode())) {
// NOT_FOUND gRPC exception thrown by Fleet Engine.
}
}
}
}
DriverContextBuilder.setStatusListener(new MyStatusListener());
ใช้ DriverStatusListener เป็นอินเทอร์เฟซการทำงาน
DriverStatusListener รองรับอินเทอร์เฟซการทำงานของ Java เช่นเดียวกับอินเทอร์เฟซก่อนหน้า ตัวอย่างการใช้งาน
DriverContextBuilder.setDriverStatusListener((statusLevel, statusCode, statusMsg, cause) -> {
if (cause != null && cause instanceof StatusRuntimeException) {
if (Status.NOT_FOUND.getCode().equals(cause.getStatus().getCode())) {
// NOT_FOUND gRPC exception thrown by Fleet Engine.
}
}
});