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

Aktualizacja wersji Gradle i wtyczki 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) oraz poprawki niektórych krytycznych błędów.

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

  • Gradle w wersji co najmniej 7.5.0, ale nie wyższej niż 7.6.0.
  • wtyczka Androida do obsługi Gradle (AGP) w wersji 7.4.x.

Możesz kierować reklamy na użytkowników korzystających z wyższej wersji wtyczek, ale może to spowodować wyświetlanie ostrzeżeń o wycofaniu lub nieprawidłowe działanie niektórych nowych funkcji.

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. Przejście 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, zaciemniania i optymalizacji pliku binarnego, więc na razie nie musisz podejmować żadnych specjalnych działań.

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

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

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

Migracja z 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 pliku build.gradle modułu na najwyższym poziomie aplikacji. Jeśli brakuje go w bloku buildscript, dodaj go do zależności.org.jetbrains.kotlin:kotlin-gradle-plugin

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

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

Krok 2. Zaktualizuj kotlin-stdlib do wersji 1.9.0

Źródło

W pliku build.gradle aplikacji zmień wartość kotlin-stblib na 1.9.0.

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-stdlib od 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 implementsStatusListener na DriverStatusListener.
  2. Dodaj parametr Nullable cause do updateStatus.
  3. Zadzwoń pod numer DriverContextBuilder.setDriverStatusListener zamiast setStatusListener.

DriverStatusListener ma tę samą strukturę co 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 parametru cause, aby pobrać kod błędu zwrócony przez Fleet Engine w przypadku nieudanych aktualizacji lokalizacji.

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

Implementacja funkcji DriverStatusListener jako interfejsu funkcjonalnego

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