Android 驱动程序 SDK 5.0 迁移指南

本指南介绍了迁移到 5.0 版所需的更改。

Gradle 和 Android Gradle 插件更新

升级 Gradle 和 Android Gradle 插件版本

首先,升级 Gradle 和 Android Gradle 插件版本。此次升级包括与某些 SDK 依赖项(包括 Kotlin 1.9)的更好兼容性,以及一些重要的 bug 修复。

此 SDK 主要版本需要您的 Android 应用项目:

  • 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 库支持

来源

由于 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 v7.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-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 接口现已废弃(将于 v6 中移除),取而代之的是 共 DriverStatusListener 个。

主要有 3 项变更:

  1. implements 接口从 StatusListener 更改为 DriverStatusListener
  2. updateStatus 添加 Nullable cause 参数。
  3. 调用 DriverContextBuilder.setDriverStatusListener,而不是调用 setStatusListener

DriverStatusListenerStatusListener 具有相同的结构。主要 它们之间的区别在于,DriverStatusListener.updateStatus() 会接受 名为 cause 的额外参数。这样,用户便可以深入了解 update 以返回错误状态级别。

通常,您可以使用 cause 检索舰队返回的错误代码 引擎。

以下示例说明了如何实现 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.
    }
  }
});