本指南介绍了迁移到 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 插件版本,请修改包含 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
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-jdk7 或
kotlin-stdlib-jdk8 的所有引用。从 Kotlin
1.8.0 开始,这两个依赖项已合并到
kotlin-stdlib 中。
StatusListener 弃用
StatusListener 接口现已弃用(将在 v6 中移除),建议改用
DriverStatusListener。
主要有 3 项更改:
- 将
implements接口从StatusListener更改为DriverStatusListener。 - 向
updateStatus添加Nullablecause参数。 - 调用
DriverContextBuilder.setDriverStatusListener,而不是setStatusListener。
DriverStatusListener 与 StatusListener 具有相同的结构。它们之间的主要
区别在于,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.
}
}
});