Przewodnik migracji pakietu Android Driver SDK 5.0

W tym przewodniku opisano zmiany niezbędne do migracji do wersji 5.0.

Aktualizacje Gradle i wtyczki Androida do obsługi Gradle

Uaktualnij wersje wtyczki Gradle i Androida do obsługi Gradle

Najpierw uaktualnij wersje wtyczki Gradle i Androida do obsługi Gradle. To uaktualnienie zapewnia lepszą zgodność z niektórymi zależnościami pakietu SDK. (w tym Kotlin 1.9), a także kilka ważnych poprawek.

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

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

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 zmodyfikować wersję Gradle, zmodyfikuj wiersz w pliku /gradle/wrapper/gradle-wrapper.properties plik

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

Aby zmodyfikować 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 obsługi biblioteki Java 7 do biblioteki Java 8

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

Źródło

Ponieważ minimalny poziom interfejsu API SDK to 23, a wymagana wersja AGP to 7.4 lub nowsza, konfiguracji jest nieco inny niż wspomniana dokumentacja źródłowa.

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 lub nowszej używa R8 jako domyślnego narzędzia do zmniejszania, zaciemniania kodu i optymalizacji dla pliku binarnego, więc na razie nie musisz nic robić.

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 usługi android.enableR8=false w gradle.properties pliku

Usunięcie tych wierszy zazwyczaj rozwiązuje te problemy.

Migracja do Kotlin 1.6 do wersji 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"
}

Usuń wszelkie odniesienia do kotlin-stdlib-jdk7 lub kotlin-stdlib-jdk8 Obie zależności zostały skonsolidowane w kotlin-stdlib, początek w Kotlin 1.8.0.

Wycofanie elementu StatusListener

Interfejs StatusListener został wycofany (do usunięcia w wersji 6) na korzyść z DriverStatusListener.

Wprowadziliśmy głównie 3 zmiany:

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

DriverStatusListener ma taką samą strukturę jak StatusListener. Główny różnica między nimi polega na tym, że DriverStatusListener.updateStatus() pobiera dodatkowy parametr o nazwie cause. Zapewnia to użytkownikom informacje na temat przyczyny aktualizować o poziom stanu błędu.

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

Poniższy przykład pokazuje, jak wdrożyć 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 funkcjonalne interfejsy Java tak samo jak nad konkurencją. 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.
    }
  }
});