Panduan Migrasi Android Driver SDK 5.0

Panduan ini menjelaskan perubahan yang diperlukan untuk bermigrasi ke versi 5.0.

Update Plugin Android dan Gradle

Mengupgrade versi Gradle dan Plugin Android Gradle

Pertama, upgrade versi Gradle dan Plugin Android Gradle Anda. Upgrade ini menyertakan kompatibilitas yang lebih baik dengan dependensi SDK tertentu (termasuk Kotlin 1.9), serta beberapa perbaikan bug penting.

Rilis utama SDK ini memerlukan dependensi versi berikut untuk Project aplikasi Android:

  • versi Gradle minimal v7.5.0 tetapi tidak lebih tinggi dari v7.6.0.
  • versi Plugin Android Gradle (AGP) dalam rentang v7.4.x.

Anda dapat menargetkan versi plugin yang lebih tinggi; Namun, Anda mungkin menjalankan ke peringatan penghentian penggunaan, atau beberapa fitur baru mungkin tidak berfungsi.

Untuk memodifikasi versi Gradle, ubah baris di kolom File /gradle/wrapper/gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip

Untuk mengubah versi Plugin Android Gradle, ubah file build.gradle yang berisi blok buildscript. Contoh:

buildscript {
    repositories {
        google()
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.4.1'
    }
}

Migrasi dukungan library Java 7 ke Java 8

Langkah 1 - Aktifkan dukungan library Java 8

Sumber

Karena level API min SDK adalah 23 dan versi AGP yang diperlukan adalah 7.4+, sedikit berbeda dari dokumentasi sumber yang disebutkan.

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'
}

Langkah 2 - Bermigrasi dari Proguard atau Dexguard ke R8

R8, sumber

AGP v7.4+ menggunakan R8 sebagai alat penyingkatan, obfuscation, dan pengoptimalan default untuk biner, jadi tidak ada tindakan khusus yang diperlukan pada saat ini.

Jika project dimigrasikan dari AGP 4.0+, AGP dapat mengeluarkan peringatan berikut tentang penghapusan file:

  • Penggunaan useProguard true dalam file build.gradle
  • Penggunaan android.enableR8=false dalam file gradle.properties

Menghapus baris ini biasanya dapat menyelesaikan masalah tersebut.

Migrasi Kotlin 1.6 ke 1.9

Langkah 1 - Bermigrasi ke Plugin Kotlin Gradle 1.9.0

Sumber

Mengupdate versi Plugin Kotlin Gradle di modul tingkat atas aplikasi build.gradle Anda. Pastikan untuk menambahkan org.jetbrains.kotlin:kotlin-gradle-plugin dalam dependensi dari blok buildscript jika blok itu hilang.

buildscript {
  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0"
  }
}

Anda harus memigrasikan aplikasi dari sintaksis Kotlin jika Anda akan dari Plugin Kotlin Gradle 1.6.X atau 1.7.X. Lihat laman migrasi resmi panduan untuk informasi selengkapnya.

Langkah 2 - Upgrade kotlin-stdlib ke 1.9.0

Sumber

Upgrade kotlin-stblib ke versi 1.9.0 di file build.gradle aplikasi Anda.

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.0"
}

Pastikan untuk menghapus referensi ke kotlin-stdlib-jdk7 atau kotlin-stdlib-jdk8. Kedua dependensi telah dikonsolidasikan ke dalam kotlin-stdlib dimulai di Kotlin 1.8.0.

Penghentian StatusListener

Antarmuka StatusListener kini tidak digunakan lagi (akan dihapus di v6), dan digantikan dari DriverStatusListener.

Ada 3 perubahan utama:

  1. Mengubah antarmuka implements dari StatusListener menjadi DriverStatusListener.
  2. Tambahkan parameter Nullable cause ke updateStatus.
  3. Panggil DriverContextBuilder.setDriverStatusListener, bukan setStatusListener.

DriverStatusListener memiliki struktur yang sama dengan StatusListener. Utama perbedaan di antara keduanya adalah DriverStatusListener.updateStatus() mengambil parameter tambahan bernama cause. Laporan ini memberikan insight kepada pengguna tentang penyebab perbarui dengan tingkat status error.

Biasanya, Anda akan menggunakan cause untuk mengambil kode error yang ditampilkan oleh Fleet Mesin untuk pembaruan lokasi yang gagal.

Contoh berikut menunjukkan cara menerapkan 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());

Berikut adalah contoh implementasi 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());

Menerapkan DriverStatusListener sebagai antarmuka fungsional

DriverStatusListener mendukung antarmuka fungsional Java seperti pendahulunya. Berikut ini contohnya:

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.
    }
  }
});