Migrationsanleitung für Android Driver SDK 5.0

In diesem Leitfaden werden die Änderungen beschrieben, die für die Migration zu Version 5.0 erforderlich sind.

Updates für Gradle und das Android-Gradle-Plug-in

Gradle- und Android-Gradle-Plug-in-Versionen aktualisieren

Aktualisieren Sie zuerst Ihre Gradle- und Android-Gradle-Plug-in-Versionen. Dieses Upgrade bietet eine bessere Kompatibilität mit bestimmten SDK-Abhängigkeiten (einschließlich Kotlin 1.9) sowie einige wichtige Fehlerkorrekturen.

Für diese Hauptversion des SDK sind die folgenden Versionsabhängigkeiten für Ihr Android-App-Projekt erforderlich:

  • eine Gradle-Version mindestens v7.5.0, aber nicht höher als v7.6.0.
  • eine Version des Android-Gradle-Plug-ins (AGP) im Bereich von v7.4.x.

Sie können eine höhere Version der Plug-ins verwenden. Es kann jedoch zu Warnungen wegen Einstellung kommen oder einige neue Funktionen funktionieren möglicherweise nicht.

Wenn Sie die Gradle-Version ändern möchten, bearbeiten Sie die Zeile in der /gradle/wrapper/gradle-wrapper.properties-Datei Ihres Projekts.

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

Wenn Sie die Version des Android-Gradle-Plug-ins ändern möchten, bearbeiten Sie die Datei build.gradle, die den Block buildscript enthält. Beispiel:

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

Migration der Bibliotheksunterstützung von Java 7 zu Java 8

Schritt 1: Unterstützung für Java 8-Bibliotheken aktivieren

Quelle

Da das SDK-Mindest-API-Level 23 und die erforderliche AGP-Version 7.4+ ist, weicht die Konfiguration geringfügig von der genannten Quelldokumentation ab.

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

Schritt 2: Von ProGuard oder DexGuard zu R8 migrieren

R8, Quelle

AGP v7.4+ verwendet R8 als Standardtool für die Verkleinerung, Verschleierung und Optimierung der Binärdatei. Daher sind an dieser Stelle keine besonderen Maßnahmen erforderlich.

Wenn das Projekt von AGP 4.0 oder höher migriert wird, gibt AGP möglicherweise die folgenden Warnungen zum Entfernen von Dateien aus:

  • useProguard true-Nutzung in der Datei build.gradle
  • android.enableR8=false-Nutzung in der Datei gradle.properties

Wenn Sie diese Zeilen entfernen, werden diese Probleme in der Regel behoben.

Migration von Kotlin 1.6 auf 1.9

Schritt 1: Zum Kotlin-Gradle-Plug-in 1.9.0 migrieren

Quelle

Aktualisieren Sie die Version des Kotlin-Gradle-Plug-ins in der Datei „build.gradle“ des Moduls auf oberster Ebene Ihrer Anwendung. Fügen Sie org.jetbrains.kotlin:kotlin-gradle-plugin in den Abhängigkeiten des buildscript-Blocks hinzu, falls es fehlt.

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

Wenn Sie das Kotlin-Gradle-Plug-in 1.6.X oder 1.7.X verwenden, müssen Sie Ihre Anwendung von Kotlin-Synthetics migrieren. Weitere Informationen finden Sie im offiziellen Migrationsleitfaden.

Schritt 2: Upgrade von „kotlin-stdlib“ auf Version 1.9.0

Quelle

Aktualisieren Sie kotlin-stblib in der Datei „build.gradle“ Ihrer Anwendung auf Version 1.9.0.

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

Entfernen Sie alle Verweise auf kotlin-stdlib-jdk7 oder kotlin-stdlib-jdk8. Beide Abhängigkeiten wurden ab Kotlin 1.8.0 in kotlin-stdlib zusammengefasst.

Einstellung von StatusListener

Die StatusListener-Schnittstelle wird nicht mehr unterstützt (wird in Version 6 entfernt) und durch DriverStatusListener ersetzt.

Es gibt hauptsächlich drei Änderungen:

  1. Ändern Sie die implements-Schnittstelle von StatusListener zu DriverStatusListener.
  2. Fügen Sie updateStatus den Parameter Nullable cause hinzu.
  3. Rufen Sie DriverContextBuilder.setDriverStatusListener anstelle von setStatusListener an.

DriverStatusListener hat dieselbe Struktur wie StatusListener. Der Hauptunterschied zwischen den beiden besteht darin, dass DriverStatusListener.updateStatus() einen zusätzlichen Parameter namens cause akzeptiert. So erhalten Nutzer Informationen zur Ursache eines Updates mit Fehlerstatus.

Normalerweise verwenden Sie cause, um den von Fleet Engine zurückgegebenen Fehlercode für fehlgeschlagene Standortaktualisierungen abzurufen.

Das folgende Beispiel zeigt, wie StatusListener implementiert wird:

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());

Im Folgenden finden Sie ein Beispiel für die Implementierung von 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 als funktionale Schnittstelle implementieren

DriverStatusListener unterstützt funktionale Java-Schnittstellen genau wie sein Vorgänger. Hier ein Beispiel:

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