Guide de migration du SDK Android Driver 5.0

Ce guide décrit les modifications nécessaires pour migrer vers la version 5.0.

Mises à jour de Gradle et du plug-in Android Gradle

Mettre à niveau les versions de Gradle et du plug-in Android Gradle

Commencez par mettre à niveau vos versions de Gradle et du plug-in Android Gradle. Cette mise à niveau inclut une meilleure compatibilité avec certaines dépendances du SDK (y compris Kotlin 1.9), ainsi que des corrections de bugs critiques.

Cette version majeure du SDK nécessite les dépendances de version suivantes pour votre projet d'application Android :

  • une version de Gradle au moins égale à v7.5.0, mais pas supérieure à v7.6.0.
  • une version du plug-in Android Gradle (AGP) comprise dans la plage 7.4.x.

Vous pouvez cibler une version plus récente des plug-ins. Toutefois, vous risquez de rencontrer des avertissements d'abandon ou de constater que certaines nouvelles fonctionnalités ne fonctionnent pas.

Pour modifier la version de Gradle, modifiez la ligne dans le fichier /gradle/wrapper/gradle-wrapper.properties de votre projet.

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

Pour modifier la version du plug-in Android Gradle, modifiez le fichier build.gradle contenant le bloc buildscript. Exemple :

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

Migration de la prise en charge de la bibliothèque Java 7 vers Java 8

Étape 1 : Activez la compatibilité avec la bibliothèque Java 8

Source

Étant donné que le niveau d'API minimal du SDK est 23 et que la version AGP requise est 7.4 ou ultérieure, la configuration est légèrement différente de celle mentionnée dans la documentation source.

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

Étape 2 : Migrer de Proguard ou Dexguard vers R8

R8, source

AGP 7.4 et versions ultérieures utilisent R8 comme outil par défaut de réduction, d'obscurcissement et d'optimisation du binaire. Aucune action spéciale n'est donc requise pour le moment.

Si le projet est migré depuis AGP 4.0 ou version ultérieure, AGP peut émettre les avertissements suivants concernant la suppression de fichiers :

  • Utilisation de useProguard true dans le fichier build.gradle
  • Utilisation de android.enableR8=false dans le fichier gradle.properties

La suppression de ces lignes permet généralement de résoudre ces problèmes.

Migration de Kotlin 1.6 vers 1.9

Étape 1 : Migrer vers le plug-in Kotlin Gradle 1.9.0

Source

Mettez à jour la version du plug-in Kotlin Gradle dans le fichier build.gradle du module de premier niveau de votre application. Assurez-vous d'ajouter org.jetbrains.kotlin:kotlin-gradle-plugin dans les dépendances du bloc buildscript si elle est manquante.

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

Si vous utilisez le plug-in Kotlin Gradle version 1.6.X ou 1.7.X, vous devez migrer votre application depuis Kotlin-synthetics. Pour en savoir plus, consultez le guide de migration officiel.

Étape 2 : Mettez à niveau kotlin-stdlib vers la version 1.9.0

Source

Mettez à niveau kotlin-stblib vers la version 1.9.0 dans le fichier build.gradle de votre application.

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

Veillez à supprimer toutes les références à kotlin-stdlib-jdk7 ou kotlin-stdlib-jdk8. Les deux dépendances ont été regroupées dans kotlin-stdlib à partir de Kotlin 1.8.0.

Obsolescence de StatusListener

L'interface StatusListener est désormais obsolète (elle sera supprimée dans la version 6) au profit de DriverStatusListener.

Voici les trois principales modifications :

  1. Remplacez l'interface implements de StatusListener par DriverStatusListener.
  2. Ajoutez un paramètre Nullable cause à updateStatus.
  3. Appelez DriverContextBuilder.setDriverStatusListener au lieu de setStatusListener.

DriverStatusListener partage la même structure que StatusListener. La principale différence entre les deux est que DriverStatusListener.updateStatus() prend un paramètre supplémentaire nommé cause. Cela permet aux utilisateurs de comprendre la cause d'une mise à jour avec un niveau d'état d'erreur.

En règle générale, vous utilisez cause pour récupérer le code d'erreur renvoyé par Fleet Engine en cas d'échec des mises à jour de la position.

L'exemple suivant montre comment implémenter 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());

Voici un exemple d'implémentation 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());

Implémenter DriverStatusListener en tant qu'interface fonctionnelle

DriverStatusListener est compatible avec les interfaces fonctionnelles Java, tout comme son prédécesseur. Voici un exemple :

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