Hướng dẫn di chuyển SDK trình điều khiển Android 5.0

Hướng dẫn này mô tả những thay đổi cần thiết để di chuyển sang phiên bản 5.0.

Bản cập nhật Gradle và trình bổ trợ Android cho Gradle

Nâng cấp phiên bản Gradle và trình bổ trợ Android cho Gradle

Trước tiên, hãy nâng cấp phiên bản Gradle và trình bổ trợ Android cho Gradle. Bản nâng cấp này có khả năng tương thích tốt hơn với một số phần phụ thuộc SDK (bao gồm cả Kotlin 1.9), cũng như một số bản sửa lỗi quan trọng.

Bản phát hành chính này của SDK yêu cầu các phần phụ thuộc phiên bản sau đây cho dự án ứng dụng Android của bạn:

  • Gradle phiên bản tối thiểu là v7.5.0 nhưng không cao hơn v7.6.0.
  • phiên bản Trình bổ trợ Android cho Gradle (AGP) trong phạm vi phiên bản 7.4.x.

Bạn có thể nhắm đến phiên bản cao hơn của các trình bổ trợ; tuy nhiên, bạn có thể gặp phải cảnh báo không dùng nữa hoặc một số tính năng mới có thể không hoạt động.

Để sửa đổi phiên bản Gradle, hãy sửa đổi dòng trong tệp /gradle/wrapper/gradle-wrapper.properties của dự án

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

Để sửa đổi phiên bản Trình bổ trợ Android cho Gradle, hãy sửa đổi tệp build.gradle chứa khối buildscript. Ví dụ:

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

Di chuyển từ thư viện Java 7 sang thư viện Java 8

Bước 1 – Bật tính năng hỗ trợ thư viện Java 8

Nguồn

Vì cấp độ API tối thiểu của SDK là 23 và phiên bản AGP bắt buộc là 7.4 trở lên, nên cấu hình này hơi khác so với tài liệu nguồn đã đề cập.

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

Bước 2 – Di chuyển từ Proguard hoặc Dexguard sang R8

R8, nguồn

AGP phiên bản 7.4 trở lên sử dụng R8 làm công cụ thu nhỏ, làm rối mã nguồn và tối ưu hoá mặc định cho tệp nhị phân, vì vậy, bạn không cần làm gì đặc biệt tại thời điểm này.

Nếu dự án được di chuyển từ AGP 4.0 trở lên, thì AGP có thể đưa ra các cảnh báo sau về việc xoá tệp:

  • useProguard true mức sử dụng trong tệp build.gradle
  • android.enableR8=false mức sử dụng trong tệp gradle.properties

Việc xoá các dòng này thường giải quyết được những vấn đề đó.

Di chuyển Kotlin từ 1.6 lên 1.9

Bước 1 – Di chuyển sang Trình bổ trợ Kotlin cho Gradle 1.9.0

Nguồn

Cập nhật phiên bản Trình bổ trợ Kotlin Gradle trong tệp build.gradle mô-đun cấp cao nhất của ứng dụng. Hãy nhớ thêm org.jetbrains.kotlin:kotlin-gradle-plugin vào các phần phụ thuộc trong khối buildscript nếu thiếu.

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

Bạn phải di chuyển ứng dụng của mình khỏi Kotlin-synthetics trong trường hợp bạn đang sử dụng Trình bổ trợ Kotlin cho Gradle 1.6.X hoặc 1.7.X. Hãy tham khảo hướng dẫn di chuyển chính thức để biết thêm thông tin.

Bước 2 – Nâng cấp kotlin-stdlib lên 1.9.0

Nguồn

Nâng cấp kotlin-stblib lên phiên bản 1.9.0 trong tệp build.gradle của ứng dụng.

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

Hãy nhớ xoá mọi tham chiếu đến kotlin-stdlib-jdk7 hoặc kotlin-stdlib-jdk8. Cả hai phần phụ thuộc này đã được hợp nhất thành kotlin-stdlib bắt đầu từ Kotlin 1.8.0.

Ngừng sử dụng StatusListener

Giao diện StatusListener hiện không được dùng nữa (sẽ bị xoá trong phiên bản 6) và được thay bằng DriverStatusListener.

Có 3 thay đổi chính:

  1. Thay đổi giao diện implements từ StatusListener thành DriverStatusListener.
  2. Thêm tham số Nullable cause vào updateStatus.
  3. Gọi DriverContextBuilder.setDriverStatusListener thay vì setStatusListener.

DriverStatusListener có cùng cấu trúc với StatusListener. Điểm khác biệt chính giữa hai hàm này là DriverStatusListener.updateStatus() nhận một tham số bổ sung có tên là cause. Điều này cung cấp cho người dùng thông tin chi tiết về nguyên nhân của một bản cập nhật có cấp trạng thái lỗi.

Thông thường, bạn sẽ sử dụng cause để truy xuất mã lỗi do Fleet Engine trả về cho các bản cập nhật vị trí không thành công.

Mẫu sau đây minh hoạ cách triển khai 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());

Sau đây là một ví dụ về cách triển khai 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());

Triển khai DriverStatusListener dưới dạng một giao diện chức năng

DriverStatusListener hỗ trợ các giao diện chức năng Java giống như phiên bản tiền nhiệm của nó. Sau đây là một ví dụ:

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