Przewodnik migracji pakietu Android Driver SDK 5.0

Ten przewodnik opisuje zmiany niezbędne do przejścia na wersję 5.0.

Aktualizacje Gradle i wtyczki Androida do obsługi Gradle

Uaktualnij wersje wtyczki Gradle i Androida do obsługi Gradle

Najpierw zaktualizuj wersje Gradle i wtyczki Androida do obsługi Gradle. Ta aktualizacja obejmuje lepszą zgodność z niektórymi zależnościami pakietu SDK (w tym Kotlin 1.9), a także poprawki błędów krytycznych.

Ta główna wersja pakietu SDK wymaga tych wersji zależności w projekcie aplikacji na Androida:

  • wersję Gradle w wersji 7.5.0 lub nowszej niż 7.6.0.
  • wtyczka Androida do obsługi Gradle (AGP) w wersji 7.4.x lub nowszej;

Możesz kierować użytkowników na wyższą wersję wtyczek; jednak możesz uruchomić ostrzeżenia o wycofaniu, a niektóre nowe funkcje mogą nie działać.

Aby zmienić wersję Gradle, zmodyfikuj wiersz w pliku /gradle/wrapper/gradle-wrapper.properties projektu.

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

Aby zmienić wersję wtyczki Androida do obsługi Gradle, zmodyfikuj plik build.gradle, który zawiera blok buildscript. Na przykład:

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

Migracja z biblioteki Java 7 na bibliotekę Java 8

Krok 1. Włącz obsługę biblioteki Java 8

Źródło

Minimalny poziom interfejsu API pakietu SDK to 23, a wymagana wersja AGP to 7.4 lub nowsza, więc konfiguracja różni się nieco od wspomnianej dokumentacji źródłowej.

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

Krok 2. Przejdź z Proguard lub Dexguard na R8

R8, źródło

AGP w wersji 7.4 i nowszej używa R8 jako domyślnego narzędzia do kompresji, zaciemnienia i optymalizacji pliku binarnego, więc na razie nie musisz podejmować żadnych specjalnych działań.

Jeśli projekt został przeniesiony z AGP w wersji 4.0 lub nowszej, interfejs AGP może wyświetlić następujące ostrzeżenia o usuwaniu plików:

  • Użycie usługi useProguard true w build.gradle pliku
  • Użycie danych android.enableR8=false w pliku gradle.properties

Usunięcie tych linii zwykle rozwiązuje te problemy.

Migracja z wersji Kotlin 1.6 na 1.9

Krok 1. Przejdź na wtyczkę Kotlin Gradle 1.9.0

Źródło

Zaktualizuj wersję wtyczki Kotlin Gradle w module najwyższego poziomu aplikacji build.gradle. Pamiętaj, aby dodać: org.jetbrains.kotlin:kotlin-gradle-plugin w zależnościach z bloku buildscript, na wypadek gdyby go brakowało.

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

Musisz przeprowadzić migrację swojej aplikacji z Kotlin-syntetics, jeśli zamierzasz z wtyczki Kotlin Gradle w wersji 1.6.X lub 1.7.X. Zapoznaj się z oficjalną migracją przewodnika po znajdziesz więcej informacji.

Krok 2. Uaktualnij kotlin-stdlib do wersji 1.9.0

Źródło

Uaktualnij kotlin-stblib do wersji 1.9.0 w pliku build.gradle aplikacji.

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

Pamiętaj, aby usunąć wszelkie odniesienia do kotlin-stdlib-jdk7 lub kotlin-stdlib-jdk8. Oba te zależności zostały scalone w kotlin-stdlibkotlin-stdlib w wersji Kotlin 1.8.0.

Wycofanie usługi StatusListener

Interfejs StatusListener został wycofany (zostanie usunięty w wersji 6) na rzecz interfejsu DriverStatusListener.

Główne zmiany to:

  1. Zmień interfejs implements z StatusListener na DriverStatusListener
  2. Dodaj parametr Nullable cause do updateStatus.
  3. Wywołaj funkcję DriverContextBuilder.setDriverStatusListener zamiast setStatusListener

DriverStatusListener ma taką samą strukturę jak StatusListener. Główna różnica między nimi polega na tym, że funkcja DriverStatusListener.updateStatus() przyjmuje dodatkowy parametr o nazwie cause. Dzięki temu użytkownicy mogą uzyskać informacje o przyczynie aktualizacji wraz z poziomem stanu błędu.

Zwykle używasz cause do pobrania kodu błędu zwróconego przez flotę Silnik dla nieudanych aktualizacji lokalizacji.

Ten przykład pokazuje, jak zaimplementować 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());

Poniżej znajduje się przykładowa implementacja 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());

Zaimplementuj DriverStatusListener jako funkcjonalny interfejs

DriverStatusListener obsługuje interfejsy funkcyjne Javy tak samo jak jego poprzednik. Oto przykład:

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