Przewodnik migracji pakietu Android Driver SDK 5.0

W tym przewodniku opisano zmiany niezbędne do przejścia na wersję 5.0.

Aktualizacje Gradle i wtyczki do obsługi Gradle na Androidzie

Uaktualnij wersje wtyczki Gradle i wtyczki Androida do obsługi Gradle

Najpierw uaktualnij wersje wtyczki Gradle i wtyczki Androida do obsługi Gradle. Uaktualnienie obejmuje lepszą zgodność z określonymi zależnościami pakietu SDK (w tym Kotlin 1.9) oraz poprawki krytycznych błędów.

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

  • wersja Gradle nie mniejsza niż 7.5.0, ale nie nowsza niż 7.6.0;
  • we wtyczce Androida do obsługi Gradle (AGP) w wersji 7.4.x.

Możesz ustawić kierowanie na wyższą wersję wtyczek, ale możesz napotkać ostrzeżenia o wycofaniu lub niektóre nowe funkcje mogą nie działać.

Aby zmodyfikować 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 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'
    }
}

Obsługa migracji z Javy 7 do biblioteki Java 8

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

Źródło

Ponieważ minimalny poziom interfejsu API pakietu SDK to 23, a wymagana wersja AGP to 7.4 lub nowsza, konfiguracja nieco się różni 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 do R8

R8, źródło

AGP w wersji 7.4+ używa R8 jako domyślnego narzędzia do zmniejszania, zaciemniania i optymalizacji pliku binarnego, więc nie trzeba teraz podejmować żadnych dodatkowych działań.

Jeśli projekt jest przenoszony z AGP w wersji 4.0 lub nowszej, AGP może wyświetlać te ostrzeżenia dotyczące usuwania plików:

  • Wykorzystanie useProguard true w build.gradle pliku
  • Wykorzystanie android.enableR8=false w gradle.properties pliku

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

Migracja do Kotlin 1.6 do 1.9

Krok 1. Przejdź na wtyczkę Kotlin Gradle 1.9.0

Źródło

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

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

Jeśli korzystasz z wtyczki Kotlin Gradle w wersji 1.6.X lub 1.7.X, musisz przeprowadzić migrację aplikacji z Kotlin-synthetics. Więcej informacji znajdziesz w oficjalnym przewodniku po migracji.

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 odwołania do kotlin-stdlib-jdk7 lub kotlin-stdlib-jdk8. Obie zależności zostały scalone w zasadę kotlin-stdlib od wersji Kotlin 1.8.0.

Wycofanie funkcji StatusListener

Interfejs StatusListener został wycofany (zostanie usunięty w wersji 6) i zastąpi go interfejsem DriverStatusListener.

Wprowadziliśmy głównie 3 zmiany:

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

DriverStatusListener ma taką samą strukturę jak StatusListener. Główna różnica między nimi polega na tym, że DriverStatusListener.updateStatus() używa dodatkowego parametru o nazwie cause. Dzięki temu użytkownicy poznają przyczynę aktualizacji ze stanem błędu.

Zwykle używasz cause do pobrania kodu błędu zwróconego przez Fleet Engine w przypadku 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());

Wdróż DriverStatusListener jako działający interfejs

DriverStatusListener obsługuje funkcjonalne interfejsy Java tak 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.
    }
  }
});