Android Driver SDK 5.0 遷移指南

本指南說明遷移至 5.0 版的必要變更。

Gradle 和 Android Gradle 外掛程式更新

升級 Gradle 和 Android Gradle 外掛程式版本

首先,請升級 Gradle 和 Android Gradle 外掛程式版本。本次升級可提升與特定 SDK 依附元件 (包括 Kotlin 1.9) 的相容性,並修正一些重大錯誤。

這個 SDK 主要版本需要 Android 應用程式專案的下列版本依附元件:

  • Gradle 版本至少為 7.5.0,但不得高於 7.6.0。
  • Android Gradle 外掛程式 (AGP) 版本介於 7.4.x 版。

您可以指定較高版本的外掛程式,但可能會遇到淘汰警告,或部分新功能無法運作。

如要修改 Gradle 版本,請修改專案 /gradle/wrapper/gradle-wrapper.properties 檔案中的這一行

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

如要修改 Android Gradle 外掛程式版本,請修改包含 buildscript 區塊的 build.gradle 檔案。例如:

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

從 Java 7 遷移至 Java 8 程式庫支援

步驟 1 - 啟用 Java 8 程式庫支援

資料來源

由於 SDK 最低 API 級別為 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

R8、來源

AGP 7.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

資料來源

在應用程式頂層模組的 build.gradle 檔案中,更新 Kotlin Gradle 外掛程式版本。請務必在 buildscript 區塊的依附元件中新增 org.jetbrains.kotlin:kotlin-gradle-plugin,以免遺漏。

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

如果您使用 Kotlin Gradle 外掛程式 1.6.X 或 1.7.X,請務必將應用程式從 Kotlin-synthetics 遷移。詳情請參閱官方遷移指南

步驟 2 - 將 kotlin-stdlib 升級至 1.9.0

資料來源

在應用程式的 build.gradle 檔案中,將 kotlin-stblib 升級至 1.9.0。

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

請務必移除所有對 kotlin-stdlib-jdk7kotlin-stdlib-jdk8 的參照。自 Kotlin 1.8.0 起,這兩個依附元件已整併為 kotlin-stdlib

StatusListener 已淘汰

StatusListener 介面現已淘汰 (將在第 6 版中移除),改以 DriverStatusListener 取代。

主要有以下 3 項異動:

  1. implements 介面從 StatusListener 變更為 DriverStatusListener
  2. updateStatus 中新增 Nullable cause 參數。
  3. 請呼叫 DriverContextBuilder.setDriverStatusListener,不要呼叫 setStatusListener

DriverStatusListenerStatusListener 具有相同的結構。兩者之間的主要差異在於 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.
    }
  }
});