Android Sürücü SDK'sı 5.0 Taşıma Kılavuzu

Bu kılavuzda, 5.0 sürümüne geçiş için gerekli değişiklikler açıklanmaktadır.

Gradle ve Android Gradle eklentisi güncellemeleri

Gradle ve Android Gradle eklentisi sürümlerini yükseltme

Öncelikle Gradle ve Android Gradle eklentisi sürümlerinizi yükseltin. Bu yükseltme, belirli SDK bağımlılıkları (Kotlin 1.9 dahil) ile daha iyi uyumluluğun yanı sıra bazı kritik hata düzeltmelerini içerir.

Bu SDK ana sürümü, Android uygulama projeniz için aşağıdaki sürüm bağımlılıkları gerektirir:

  • En az 7.5.0 ancak en fazla 7.6.0 sürümüne sahip bir Gradle sürümü.
  • v7.4.x aralığında bir Android Gradle eklentisi (AGP) sürümü.

Eklentilerin daha yüksek bir sürümünü hedefleyebilirsiniz. Ancak desteği sonlandırılma uyarılarıyla karşılaşabilir veya bazı yeni özellikler çalışmayabilir.

Gradle sürümünü değiştirmek için projenizin /gradle/wrapper/gradle-wrapper.properties dosyasında ilgili satırı değiştirin.

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

Android Gradle eklentisi sürümünü değiştirmek için buildscript bloğunu içeren build.gradle dosyasını değiştirin. Örneğin:

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

Java 7'den Java 8'e kitaplık desteği taşıma

1. adım: Java 8 kitaplık desteğini etkinleştirin

Kaynak

SDK'nın minimum API düzeyi 23 ve gerekli AGP sürümü 7.4 ve üzeri olduğundan yapılandırma, belirtilen kaynak dokümanlardan biraz farklıdır.

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

2. Adım: ProGuard veya Dexguard'dan R8'e geçiş yapın

R8, kaynak

AGP 7.4 ve sonraki sürümleri, ikili dosyalar için varsayılan sıkıştırma, karartma ve optimizasyon aracı olarak R8'i kullandığından bu noktada özel bir işlem yapmanız gerekmez.

Proje AGP 4.0 veya sonraki bir sürümden taşındıysa AGP, dosya kaldırmayla ilgili aşağıdaki uyarıları verebilir:

  • build.gradle dosyasında useProguard true kullanımı
  • gradle.properties dosyasında android.enableR8=false kullanımı

Bu satırları kaldırmak genellikle bu sorunları çözer.

Kotlin 1.6'dan 1.9'a geçiş

1. Adım: Kotlin Gradle Eklentisi 1.9.0'a geçin

Kaynak

Uygulamanızın üst düzey modülünün build.gradle dosyasında Kotlin Gradle Eklentisi sürümünü güncelleyin. Eksik olması durumunda buildscript bloğundaki bağımlılıklara org.jetbrains.kotlin:kotlin-gradle-plugin eklediğinizden emin olun.

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

Kotlin Gradle Eklentisi 1.6.X veya 1.7.X sürümünü kullanıyorsanız uygulamanızı Kotlin-synthetics'ten taşımanız gerekir. Daha fazla bilgi için resmi taşıma kılavuzuna bakın.

2. Adım: kotlin-stdlib'i 1.9.0 sürümüne yükseltin

Kaynak

Uygulamanızın build.gradle dosyasında kotlin-stblib sürümünü 1.9.0'a yükseltin.

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

kotlin-stdlib-jdk7 veya kotlin-stdlib-jdk8 ile ilgili tüm referansları kaldırdığınızdan emin olun. Her iki bağımlılık da Kotlin 1.8.0'dan itibaren kotlin-stdlib olarak birleştirildi.

StatusListener desteğinin sonlandırılması

StatusListener arayüzünün desteği sonlandırıldı (v6'da kaldırılacak). Bunun yerine DriverStatusListener arayüzü kullanılacak.

Temel olarak 3 değişiklik vardır:

  1. implements arayüzünü StatusListener yerine DriverStatusListener olarak değiştirin.
  2. updateStatus'ye bir Nullable cause parametresi ekleyin.
  3. setStatusListener yerine DriverContextBuilder.setDriverStatusListener numaralı telefonu arayın.

DriverStatusListener, StatusListener ile aynı yapıya sahiptir. Aralarındaki temel fark, DriverStatusListener.updateStatus()'ün cause adlı ek bir parametre almasıdır. Bu sayede kullanıcılar, hata durumu düzeyinde bir güncellemenin nedeni hakkında bilgi edinebilir.

Genellikle, başarısız konum güncellemeleri için Fleet Engine tarafından döndürülen hata kodunu almak üzere cause işlevini kullanırsınız.

Aşağıdaki örnekte StatusListener değerinin nasıl uygulanacağı gösterilmektedir:

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

Aşağıda örnek bir DriverStatusListener uygulaması gösterilmektedir:

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

DriverStatusListener işlevsel arayüz olarak uygulanır.

DriverStatusListener, önceki sürüm gibi Java işlevsel arayüzlerini destekler. Aşağıda buna örnek bir görsel verilmiştir:

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