Guida alla migrazione dell'SDK Android Driver 5.0

Questa guida descrive le modifiche necessarie per eseguire la migrazione alla versione 5.0.

Aggiornamenti di Gradle e del plug-in Android Gradle

Eseguire l'upgrade delle versioni di Gradle e del plug-in Android per Gradle

Innanzitutto, esegui l'upgrade delle versioni di Gradle e del plug-in Android per Gradle. Questo upgrade include una migliore compatibilità con determinate dipendenze dell'SDK (incluso Kotlin 1.9), nonché alcune correzioni di bug critici.

Questa release principale dell'SDK richiede le seguenti dipendenze di versione per il tuo Progetto app Android:

  • Una versione Gradle almeno alla v7.5.0 ma non successiva alla v7.6.0.
  • una versione del plug-in Android Gradle (AGP) nella gamma v7.4.x.

Puoi scegliere come target una versione successiva dei plug-in; tuttavia, potresti eseguire agli avvisi di ritiro, oppure alcune nuove funzionalità potrebbero non funzionare.

Per modificare la versione Gradle, modifica la riga nell'interfaccia File /gradle/wrapper/gradle-wrapper.properties

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

Per modificare la versione del plug-in Android Gradle, modifica il file build.gradle che contiene il blocco buildscript. Ad esempio:

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

Migrazione del supporto delle librerie da Java 7 a Java 8

Passaggio 1: attiva il supporto della libreria Java 8

Origine

Poiché il livello API minimo dell'SDK è 23 e la versione AGP richiesta è 7.4 o successive, è leggermente diversa dalla documentazione dell'origine menzionata.

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

Passaggio 2: esegui la migrazione da ProGuard o Dexguard a R8

R8, origine

AGP 7.4 e versioni successive utilizzano R8 come strumento di ottimizzazione, offuscamento e riduzione per il file binario, quindi non è necessaria alcuna azione speciale a questo punto.

Se la migrazione del progetto viene eseguita da AGP 4.0 o versioni successive, AGP potrebbe emettere i seguenti avvisi sulla rimozione dei file:

  • Utilizzo di useProguard true in build.gradle file
  • Utilizzo di android.enableR8=false in gradle.properties file

La rimozione di queste righe di solito risolve i problemi.

Migrazione da Kotlin 1.6 a 1.9

Passaggio 1: esegui la migrazione al plug-in Gradle di Kotlin 1.9.0

Origine

Aggiorna la versione del plug-in Kotlin Gradle nel modulo di primo livello dell'applicazione il file build.gradle. Assicurati di aggiungere org.jetbrains.kotlin:kotlin-gradle-plugin nelle dipendenze del blocco buildscript nel caso in cui mancasse.

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

Se partecipi, devi eseguire la migrazione della tua applicazione dai sintetici Kotlin dal plug-in Kotlin Gradle 1.6.X o 1.7.X. Consulta il documento ufficiale sulla migrazione per ulteriori informazioni.

Passaggio 2: esegui l'upgrade di kotlin-stdlib alla versione 1.9.0

Origine

Esegui l'upgrade di kotlin-stblib alla versione 1.9.0 nel file build.gradle della tua applicazione.

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

Assicurati di rimuovere tutti i riferimenti a kotlin-stdlib-jdk7 o kotlin-stdlib-jdk8. Entrambe le dipendenze sono state consolidate kotlin-stdlib che inizia a Kotlin 1.8.0.

Ritiro di StatusListener

L'interfaccia StatusListener è stata ritirata (da rimuovere nella versione 6) di DriverStatusListener.

Esistono principalmente tre modifiche:

  1. Modifica l'interfaccia implements da StatusListener a DriverStatusListener.
  2. Aggiungi un parametro Nullable cause a updateStatus.
  3. Chiama il numero DriverContextBuilder.setDriverStatusListener anziché setStatusListener.

DriverStatusListener condivide la stessa struttura di StatusListener. La differenza principale tra i due è che DriverStatusListener.updateStatus() accetta un parametro aggiuntivo denominato cause. Fornisce agli utenti approfondimenti sulla causa di un vengono aggiornate con il livello di stato di errore.

In genere, utilizzi cause per recuperare il codice di errore restituito da Fleet Engine per gli aggiornamenti della posizione non riusciti.

L'esempio seguente illustra come implementare 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());

Di seguito è riportata un'implementazione di esempio di 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());

Implementa DriverStatusListener come interfaccia funzionale

DriverStatusListener supporta le interfacce funzionali Java come il suo predecessore. Ecco un esempio:

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