Przewodnik migracji pakietu Android Driver SDK 5.0

W tym przewodniku opisujemy zmiany, które należy wprowadzić, aby przejść na wersję 5.0.

Aktualizacje Gradle i wtyczki Androida do obsługi Gradle

Uaktualnianie wersji Gradle i wtyczki Androida do obsługi Gradle

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

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

  • wersję Gradle co najmniej 7.5.0, ale nie wyższą niż 7.6.0;
  • wersję wtyczki Androida do obsługi Gradle (AGP) z zakresu v7.4.x.

Możesz kierować reklamy na wyższą wersję wtyczek, ale mogą pojawić się ostrzeżenia o wycofaniu lub 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 zmodyfikować wersję wtyczki Androida do obsługi Gradle, zmień 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 bibliotek z Javy 7 na Javę 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 tej opisanej w 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. Migracja z Proguard lub Dexguard do R8

R8, źródło

Wtyczka Androida do obsługi Gradle w wersji 7.4 lub nowszej używa R8 jako domyślnego narzędzia do zmniejszania, zaciemniania i optymalizacji kodu binarnego, więc na tym etapie nie musisz podejmować żadnych specjalnych działań.

Jeśli projekt został przeniesiony z wtyczki Androida do obsługi Gradle w wersji 4.0 lub nowszej, wtyczka Androida do obsługi Gradle może wyświetlać te ostrzeżenia o usunięciu plików:

  • useProguard true użycie w build.gradle pliku
  • Użycie android.enableR8=false w pliku gradle.properties

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

Migracja z Kotlin 1.6 na 1.9

Krok 1. Migracja do wtyczki Gradle dla języka Kotlin w wersji 1.9.0

Źródło

Zaktualizuj wersję wtyczki Kotlin Gradle w pliku build.gradle modułu najwyższego poziomu aplikacji. Jeśli brakuje zależności, dodaj org.jetbrains.kotlin:kotlin-gradle-plugin w bloku buildscript.

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

Wycofanie interfejsu StatusListener

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

Wprowadziliśmy 3 główne zmiany:

  1. Zmień interfejs implements z StatusListener na DriverStatusListener.
  2. Dodaj parametr Nullable cause do updateStatus.
  3. Zadzwoń pod numer DriverContextBuilder.setDriverStatusListener zamiast pod numer 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ą dowiedzieć się, co spowodowało błąd aktualizacji.

Zwykle używasz cause, aby pobrać kod błędu zwrócony przez Fleet Engine w przypadku nieudanych informacji o zmianie 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 znajdziesz przykładową implementację 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());

Wdrażanie DriverStatusListener jako interfejsu funkcjonalnego

DriverStatusListener obsługuje interfejsy funkcyjne Javy, podobnie 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.
    }
  }
});