Android Driver SDK 5.0 移行ガイド

このガイドでは、バージョン 5.0 に移行するために必要な変更について説明します。

Gradle と Android Gradle プラグインの更新

Gradle と Android Gradle プラグインのバージョンをアップグレードする

まず、Gradle と Android Gradle プラグインのバージョンをアップグレードします。このアップグレードには、特定の SDK 依存関係(Kotlin 1.9 を含む)との互換性の向上と、いくつかの重要なバグの修正が含まれています。

この SDK のメジャー リリースでは、Android アプリ プロジェクトに次のバージョンの依存関係が必要です。

  • Gradle バージョン v7.5.0 以上 v7.6.0 以下。
  • Android Gradle プラグイン(AGP)バージョン v7.4.x。

プラグインのより高いバージョンをターゲットにすることもできますが、非推奨の警告が表示されたり、一部の新機能が動作しない可能性があります。

Gradle のバージョンを変更するには、プロジェクトの /gradle/wrapper/gradle-wrapper.properties ファイルの行を変更します。

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

Android Gradle プラグインのバージョンを変更するには、buildscript ブロックを含む build.gradle ファイルを変更します。次に例を示します。

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

Java 7 から Java 8 ライブラリ サポートへの移行

ステップ 1 - Java 8 ライブラリのサポートを有効にする

ソース

SDK の最小 API レベルは 23 で、必要な AGP バージョンは 7.4 以降であるため、構成は上記のソース ドキュメントとは若干異なります。

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 - Proguard または Dexguard から R8 に移行する

R8、ソース

AGP v7.4 以降では、R8 がバイナリのデフォルトの縮小、難読化、最適化ツールとして使用されるため、この時点では特別な操作は必要ありません。

プロジェクトが AGP 4.0 以降から移行された場合、AGP はファイルの削除に関する次の警告を発行することがあります。

  • build.gradle ファイルでの useProguard true の使用
  • gradle.properties ファイルでの android.enableR8=false の使用

通常、これらの行を削除すると、これらの問題は解決します。

Kotlin 1.6 から 1.9 への移行

ステップ 1 - Kotlin Gradle プラグイン 1.9.0 に移行する

ソース

アプリケーションのトップレベル モジュールの build.gradle ファイルで Kotlin Gradle プラグインのバージョンを更新します。不足している場合は、buildscript ブロックの依存関係に org.jetbrains.kotlin:kotlin-gradle-plugin を追加してください。

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

Kotlin Gradle プラグイン 1.6.X または 1.7.X から移行する場合は、アプリケーションを Kotlin-synthetics から移行する必要があります。詳細については、公式の移行 ガイドをご覧ください。

ステップ 2 - kotlin-stdlib を 1.9.0 にアップグレードする

ソース

アプリケーションの build.gradle ファイルで kotlin-stblib を 1.9.0 にアップグレードします。

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

kotlin-stdlib-jdk7 または kotlin-stdlib-jdk8 への参照を削除してください。どちらの依存関係も、 kotlin-stdlib 以降では Kotlin 1.8.0 に統合されています。

StatusListener の非推奨

StatusListener インターフェースは非推奨になりました(v6 で削除予定)。代わりに DriverStatusListener を使用してください。

主に 3 つの変更があります。

  1. implements インターフェースを StatusListener から DriverStatusListener に変更します。
  2. Nullable cause パラメータを updateStatus に追加します。
  3. setStatusListener ではなく DriverContextBuilder.setDriverStatusListener を呼び出します。

DriverStatusListenerStatusListener と同じ構造を共有します。主な違いは、DriverStatusListener.updateStatus()cause という名前の追加パラメータを受け取る点です。これにより、エラー ステータス レベルの更新の原因に関する分析情報をユーザーに提供できます。

通常、cause を使用して、位置情報の更新に失敗した場合に Fleet Engine から返されるエラーコードを取得します。

次のサンプルは、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());

以下に、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());

DriverStatusListener を関数型インターフェースとして実装する

DriverStatusListener は、以前のバージョンと同様に Java 関数型インターフェースをサポートしています。次に例を示します。

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