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) 版本介於 v7.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 可能會針對檔案移除作業發出以下警告:

  • build.gradle 檔案中的 useProguard true 用法
  • gradle.properties 檔案中的 android.enableR8=false 用法

移除這些行通常可以解決這些問題。

從 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 合成物件遷移應用程式。詳情請參閱官方遷移指南

步驟 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 介面現已淘汰 (將在 v6 中移除),改用 DriverStatusListener

主要有 3 項變更:

  1. implements 介面從 StatusListener 變更為 DriverStatusListener
  2. Nullable cause 參數新增至 updateStatus
  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.
    }
  }
});