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

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 bất kỳ sự cố đã biết bạn có thể gặp phải.
Ngoài ra, bạn hãy xem video sau đây để tìm hiểu thông tin tổng quan.

Lưu ý: Khi phát triển ứng dụng dành cho Android, bạn không bắt buộc phải sử dụng
các tính năng ngôn ngữ Java 8. Bạn có thể giữ nguyên các giá trị khả năng tương thích nguồn và đích của dự án thành Java 7, nhưng vẫn cần biên dịch bằng JDK 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, thuộc quá trình biên dịch các tệp lớp thành mã dex qua D8/R8 như minh hoạ trong hình 1.

Hình 1. Hỗ trợ tính năng ngôn ngữ Java 8 bằng cách sử dụng thao tác biến đổi mã byte desugar.

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

Để bắt đầu sử dụng các tính năng ngôn ngữ Java 8 được hỗ trợ, hãy cập nhật Plugin Android lên 3.0.0 (trở lên). Sau đó, đố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 của mô-đun như 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 cách sử dụng trình bổ trợ Android cho Gradle 3.0.0 trở lên, trình bổ trợ
không hỗ trợ toàn bộ 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:

Ngoài các tính năng ngôn ngữ Java 8 ở trên, các phiên bản trình bổ trợ 3.0.0
trở lên hỗ trợ thêm

try-with-resources cho tất cả các cấp độ API Android.

Hiện tại, công cụ đơn giản hoá 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 trê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+ dù chứa tính năng đơn giản hoá có sẵn tại trình bổ trợ Android cho Gradle 3.0.0 nhưng 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 và được mô tả trong phần sau.

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

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 bổ sung gần đây cho 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 khác hữu ích với các API ở trên
  • 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 tính năng đơ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.

Để bật tính năng hỗ trợ cho các API ngôn ngữ trên mọi phiên bản của nền tảng Android, hãy cập nhật trình bổ trợ Android lên 4.0.0 trở lên rồi đưa những nội dung sau vào tệp build.gradle 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.1.5'
}

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.1.5")
}

Xin lưu ý rằng bạn cũng cần bổ sung đoạn mã trên vào tệp build.gradle của library module (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 hiển thị 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.0
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 được sử dụng, hãy xem desugar_jdk_libs.

Để 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 được sử dụng, hãy xem tệp CHANGELOG.md trong kho lưu trữ GitHub