Guida alla migrazione dell'SDK Android Driver 5.0

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

Aggiornamenti del plug-in Gradle e Android Gradle

Esegui l'upgrade delle versioni del plug-in Gradle e Android Gradle

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

Questa release principale dell'SDK richiede le seguenti dipendenze di versione per il progetto di applicazione Android:

  • una versione Gradle almeno v7.5.0 ma non superiore a v7.6.0.
  • una versione del plug-in Android Gradle (AGP) nell'intervallo v7.4.x.

Puoi scegliere come target una versione superiore dei plug-in. Tuttavia, potresti visualizzare avvisi di ritiro o alcune nuove funzionalità potrebbero non funzionare.

Per modificare la versione Gradle, modifica la riga nel file /gradle/wrapper/gradle-wrapper.properties del tuo progetto

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

Per modificare la versione del plug-in Android per 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 - Abilita il supporto della libreria Java 8

Fonte

Poiché il livello API minimo dell'SDK è 23 e la versione AGP richiesta è 7.4 o versioni successive, la configurazione è leggermente diversa dalla documentazione di 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, fonte

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

Se viene eseguita la migrazione del progetto da AGP 4.0 o versioni successive, AGP potrebbe emettere i seguenti avvisi sulle rimozioni di file:

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

La rimozione di queste righe in genere risolve i problemi.

Migrazione di Kotlin da 1.6 a 1.9

Passaggio 1 - Esegui la migrazione al plug-in Kotlin Gradle 1.9.0

Fonte

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

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

Devi eseguire la migrazione della tua applicazione da Kotlin-synthetics nel caso in cui provenisse dal plug-in Kotlin Gradle 1.6.X o 1.7.X. Per ulteriori informazioni, consulta la guida alla migrazione ufficiale.

Passaggio 2 - Aggiorna kotlin-stdlib alla versione 1.9.0

Fonte

Esegui l'upgrade di kotlin-stblib alla versione 1.9.0 nel file build.gradle dell'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 in kotlin-stdlib a partire da Kotlin 1.8.0.

Ritiro di StatusListener

L'interfaccia StatusListener è ora deprecata (da rimuovere nella v6) a favore di DriverStatusListener.

Ci sono principalmente tre cambiamenti:

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

DriverStatusListener condivide la stessa struttura di StatusListener. La differenza principale è che DriverStatusListener.updateStatus() richiede un parametro aggiuntivo denominato cause. Ciò fornisce agli utenti insight sulla causa di un aggiornamento con livello di stato di errore.

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

Il seguente esempio 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 è riportato un esempio di implementazione 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, proprio 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.
    }
  }
});