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.

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:

Tính năng ngôn ngữ Java 8 Lưu ý
Biểu thức Lambda Lưu ý rằng 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 ở 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 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.0 7.3.0-beta03
Để 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 desugar_jdk_libs.