Guía de migración del SDK de Android Driver 5.0

En esta guía, se describen los cambios necesarios para migrar a la versión 5.0.

Actualizaciones del complemento de Android para Gradle y Gradle

Cómo actualizar las versiones del complemento de Gradle para Android y Gradle

Primero, actualiza las versiones del complemento de Android para Gradle y Gradle. Esta actualización incluye una mejor compatibilidad con ciertas dependencias del SDK (incluida Kotlin 1.9), así como algunas correcciones de errores críticos.

Esta versión principal del SDK requiere las siguientes dependencias de versión para tu proyecto de aplicación para Android:

  • Tener una versión de Gradle v7.5.0 como mínimo, pero no una posterior a la v7.6.0
  • una versión del complemento de Android para Gradle (AGP) en el rango de la versión 7.4.x

Puedes orientar una versión posterior de los complementos. Sin embargo, es posible que recibas advertencias de baja o que algunas funciones nuevas no funcionen.

Para modificar la versión de Gradle, modifica la línea del archivo /gradle/wrapper/gradle-wrapper.properties de tu proyecto.

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

Para modificar la versión del complemento de Android para Gradle, modifica el archivo build.gradle que contiene el bloque buildscript. Por ejemplo:

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

Migración de compatibilidad de la biblioteca de Java 7 a Java 8

Paso 1: Habilita la compatibilidad con la biblioteca de Java 8

Origen

Como el nivel mínimo de API del SDK es 23 y la versión requerida del AGP es 7.4 o posterior, la configuración es un poco diferente de la documentación de origen mencionada.

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

Paso 2: Migra de ProGuard o DexGuard a R8

R8, fuente

AGP v7.4 y versiones posteriores usa R8 como la herramienta predeterminada de reducción, ofuscación y optimización para el objeto binario, por lo que no se necesita ninguna acción especial en este momento.

Si el proyecto se migra desde AGP 4.0 y versiones posteriores, AGP puede emitir las siguientes advertencias sobre la eliminación de archivos:

  • Uso de useProguard true en el archivo build.gradle
  • Uso de android.enableR8=false en el archivo gradle.properties

Por lo general, quitar esas líneas resuelve los problemas.

Migración de Kotlin 1.6 a 1.9

Paso 1: Migra al complemento de Kotlin para Gradle 1.9.0

Origen

Actualiza la versión del complemento de Kotlin para Gradle en el archivo build.gradle del módulo de nivel superior de la aplicación. Asegúrate de agregar org.jetbrains.kotlin:kotlin-gradle-plugin en las dependencias del bloque buildscript en caso de que falte.

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

Debes migrar tu aplicación desde sintéticos de Kotlin en caso de que provengan del complemento de Kotlin para Gradle 1.6.X o 1.7.X. Consulta la guía de migración oficial para obtener más información.

Paso 2: Actualiza kotlin-stdlib a la versión 1.9.0

Origen

Actualiza kotlin-stblib a 1.9.0 en el archivo build.gradle de tu aplicación.

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

Asegúrate de quitar las referencias a kotlin-stdlib-jdk7 o kotlin-stdlib-jdk8. Se consolidaron ambas dependencias en kotlin-stdlib a partir de Kotlin 1.8.0.

Baja de StatusListener

La interfaz StatusListener dejó de estar disponible (se quitará en la versión 6) y se reemplazó por DriverStatusListener.

Hay principalmente 3 cambios:

  1. Cambia la interfaz implements de StatusListener a DriverStatusListener.
  2. Agrega un parámetro Nullable cause a updateStatus.
  3. Llama a DriverContextBuilder.setDriverStatusListener en lugar de a setStatusListener.

DriverStatusListener comparte la misma estructura que StatusListener. La principal diferencia entre ellos es que DriverStatusListener.updateStatus() toma un parámetro adicional llamado cause. Esto proporciona a los usuarios estadísticas sobre la causa de una actualización con nivel de estado de error.

Por lo general, se usa cause a fin de recuperar el código de error que muestra Fleet Engine para las actualizaciones de ubicación con errores.

En el siguiente ejemplo, se muestra cómo implementar 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());

A continuación, se muestra una implementación de ejemplo de 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());

Cómo implementar DriverStatusListener como una interfaz funcional

DriverStatusListener es compatible con las interfaces funcionales de Java al igual que su predecesor. Este es un ejemplo:

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