Sử dụng các tính năng và API của ngôn ngữ Java 8

Trình bổ trợ Android cho Gradle 3.0.0 trở lên hỗ trợ tất cả các tính năng ngôn ngữ Java 7 và một tập hợp con các tính năng ngôn ngữ Java 8 thay đổi dựa theo phiên bản nền tảng. Khi xây dựng ứng dụng bằng trình bổ trợ Android cho Gradle 4.0.0 trở lên, bạn có thể dùng một số API ngôn ngữ Java 8 mà không yêu cầu cấp độ API tối thiểu cho ứng dụng của bạn.

Trang này mô tả các tính năng ngôn ngữ Java 8, cách định cấu hình chính xác dự án để sử dụng những tính năng này cùng mọi sự cố đã biết mà có thể bạn gặp phải. Hãy xem video sau đây để biết thông tin tổng quan về các tính năng ngôn ngữ Java 8.

Trình bổ trợ Android cho Gradle cung cấp khả năng hỗ trợ tích hợp để sử dụng một số tính năng ngôn ngữ Java 8 cùng các thư viện bên thứ ba sử dụng những tính năng đó. Chuỗi công cụ mặc định triển khai các tính năng ngôn ngữ mới bằng cách thực hiện các biến đổi mã byte (được gọi là desugar) như một phần của quá trình biên dịch các tệp lớp D8/R8 thành mã DEX, như minh hoạ trong hình 1.

Hỗ trợ tính năng ngôn ngữ Java 8 bằng cách "desugar" ("đơn giản hoá") biến đổi mã byte
Hình 1. Hỗ trợ tính năng ngôn ngữ Java 8 bằng cách desugar biến đổi mã byte.

Hỗ trợ tính năng ngôn ngữ Java 8 (trình bổ trợ Android cho Gradle 3.0.0 trở lên)

Cách bắt đầu sử dụng các tính năng ngôn ngữ Java 8 được hỗ trợ:

  1. Cập nhật trình bổ trợ Android cho Gradle lên phiên bản 3.0.0 trở lên.
  2. Đối với mỗi mô-đun sử dụng các tính năng ngôn ngữ Java 8 (trong mã nguồn hoặc thông qua các phần phụ thuộc), hãy cập nhật tệp build.gradle hoặc build.gradle.kts của mô-đun như minh hoạ dưới đây:

Groovy

android {
    ...
    // Configure only for each module that uses Java 8
    // language features (either in its source code or
    // through dependencies).
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    // For Kotlin projects
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Kotlin

android {
    ...
    // Configure only for each module that uses Java 8
    // language features (either in its source code or
    // through dependencies).
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    // For Kotlin projects
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Khi xây dựng ứng dụng bằng trình bổ trợ Android cho Gradle 3.0.0 trở lên, trình bổ trợ không hỗ trợ hết các tính năng ngôn ngữ Java 8. Các tính năng ngôn ngữ sau đây hiện có mặt ở mọi cấp độ API:

Tính năng ngôn ngữ Java 8 Lưu ý
Biểu thức lambda Android không hỗ trợ chuyển đổi tuần tự các biểu thức lambda.
Tham chiếu phương thức  
Chú thích kiểu dữ liệu Thông tin chú thích kiểu dữ liệu chỉ có sẵn tại thời điểm biên dịch nhưng không xuất hiện tại thời gian chạy. Ngoài ra, nền tảng này hỗ trợ TYPE thuộc API cấp 24 trở xuống, nhưng không hỗ trợ ElementType.TYPE_USE hoặc ElementType.TYPE_PARAMETER.
Phương thức giao diện tĩnh và mặc định  
Chú thích lặp lại  

Ngoài các tính năng ngôn ngữ Java 8 này, trình bổ trợ Android cho Gradle phiên bản 3.0.0 trở lên hỗ trợ mở rộng cho try cùng các tài nguyên đối với tất cả cấp độ API Android.

Quá trình đơn giản hoá (desugar) không hỗ trợ MethodHandle.invoke hoặc MethodHandle.invokeExact. Nếu mã nguồn hoặc một trong các phần phụ thuộc của mô-đun sử dụng các phương thức này, bạn cần chỉ định minSdkVersion 26 trở lên. Nếu không, bạn sẽ gặp lỗi sau:

Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26

Trong một số trường hợp, mô-đun có thể không sử dụng các phương thức invoke hoặc invokeExact ngay cả khi những phương thức này thuộc phần phụ thuộc thư viện. Vì vậy, để tiếp tục sử dụng thư viện đó bằng minSdkVersion 25 trở xuống, hãy bật tính năng rút gọn mã để xoá các phương thức không sử dụng. Nếu cách này không hiệu quả, hãy cân nhắc sử dụng thư viện không dùng các phương thức không được hỗ trợ.

Ngôn ngữ Java 8 trở lên có tính năng đơn giản hoá trên trình bổ trợ Android cho Gradle 3.0.0 trở lên và không hỗ trợ bất kỳ lớp và API bổ sung nào (chẳng hạn như java.util.stream.*) trên các bản phát hành Android cũ. Tính năng hỗ trợ đơn giản hoá một phần API Java hiện có sẵn trong trình bổ trợ Android cho Gradle 4.0.0 trở lên, như mô tả trong phần sau.

Hỗ trợ đơn giản hoá API Java 8 trở lên (trình bổ trợ Android cho Gradle 4.0.0 trở lên)

Nếu bạn đang xây dựng ứng dụng bằng cách sử dụng trình bổ trợ Android cho Gradle 4.0.0 trở lên thì trình bổ trợ sẽ mở rộng khả năng hỗ trợ sử dụng một số API ngôn ngữ Java 8 mà không yêu cầu cấp độ API tối thiểu cho ứng dụng.

Chúng tôi có thể hỗ trợ thêm cho các phiên bản nền tảng cũ vì trình bổ trợ 4.0.0 trở lên mở rộng công cụ đơn giản hoá sang các API ngôn ngữ Java. Vì vậy, bạn có thể đưa các API ngôn ngữ tiêu chuẩn chỉ có trong các bản phát hành Android gần đây (chẳng hạn như java.util.streams) vào các ứng dụng hỗ trợ các phiên bản Android cũ.

Bộ API sau đây được hỗ trợ khi xây dựng ứng dụng bằng cách sử dụng trình bổ trợ Android cho Gradle 4.0.0 trở lên:

  • Luồng tuần tự (java.util.stream)
  • Một tập hợp con của java.time
  • java.util.function
  • Các mục mới bổ sung gần đây vào java.util.{Map,Collection,Comparator}
  • Mục không bắt buộc (java.util.Optional, java.util.OptionalIntjava.util.OptionalDouble) và một số lớp mới
  • Một số mục bổ sung cho java.util.concurrent.atomic (các phương thức mới trên AtomicInteger, AtomicLongAtomicReference)
  • ConcurrentHashMap (có bản sửa lỗi cho Android 5.0)

Để xem danh sách đầy đủ các API được hỗ trợ, hãy truy cập phần các API Java 8 trở lên hiện có sẵn thông qua quá trình đơn giản hoá.

Để hỗ trợ các API ngôn ngữ này, trình bổ trợ sẽ biên dịch một tệp DEX riêng có chứa cách triển khai các API bị thiếu và đưa vào ứng dụng. Quá trình đơn giản hoá sẽ viết lại mã ứng dụng nhằm sử dụng thư viện này trong thời gian chạy.

Cách bật tính năng hỗ trợ cho các API ngôn ngữ này trên mọi phiên bản của nền tảng Android:

  1. Cập nhật trình bổ trợ Android cho Gradle lên 4.0.0 (trở lên).
  2. Đưa nội dung sau vào tệp build.gradle hoặc build.gradle.kts của mô-đun ứng dụng:

Groovy

android {
    defaultConfig {
        // Required when setting minSdkVersion to 20 or lower
        multiDexEnabled true
    }

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

Kotlin

android {
    defaultConfig {
        // Required when setting minSdkVersion to 20 or lower
        multiDexEnabled = true
    }

    compileOptions {
        // Flag to enable support for the new language APIs

        // For AGP 4.1+
        isCoreLibraryDesugaringEnabled = true
        // For AGP 4.0
        // 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:1.2.2")
}

Xin lưu ý rằng bạn cũng cần bổ sung đoạn mã trên vào tệp build.gradle hoặc build.gradle.kts của mô-đun thư viện nếu:

  • Các hoạt động kiểm thử được đo lường của mô-đun thư viện sử dụng các API ngôn ngữ này (trực tiếp hoặc thông qua mô-đun thư viện hoặc các phần phụ thuộc của mô-đun). Việc này là để cung cấp các API còn thiếu cho APK kiểm thử được đo lường.

  • Bạn muốn chạy riêng công cụ tìm lỗi mã nguồn trên mô-đun thư viện. Tính năng này giúp công cụ tìm lỗi mã nguồn nhận biết cách sử dụng hợp lệ của các API ngôn ngữ và tránh báo cáo các cảnh báo sai.

Ngoài ra, xin lưu ý rằng chỉ khi sử dụng trình rút gọn mã R8 bạn mới có thể kết hợp tính năng đơn giản hoá API với tính năng rút gọn.

Phiên bản

Bảng sau đây cho thấy các phiên bản của thư viện API Java 8 trở lên và phiên bản trình bổ trợ Android cho Gradle tối thiểu hỗ trợ từng phiên bản:

Phiên bản Phiên bản trình bổ trợ Android cho Gradle tối thiểu
1.1.5 4.0.0
1.2.2 7.3.0
2.0.0 7.4.0-alpha10

Để biết thông tin chi tiết về các phiên bản của thư viện API Java 8 trở lên, hãy xem tệp CHANGELOG.md trong kho lưu trữ GitHub desugar_jdk_libs.