Cho dù mã nguồn của bạn được viết bằng Java, Kotlin hay cả hai, bạn đều phải chọn JDK hoặc phiên bản ngôn ngữ Java cho bản dựng của mình ở một số nơi.
Bảng chú giải thuật ngữ
- Java Development Kit (JDK)
-
Java Development Kit (JDK) chứa:
- Các công cụ, chẳng hạn như trình biên dịch, trình phân tích tài nguyên và trình tạo tệp lưu trữ. Các tệp này được dùng ở chế độ nền trong quá trình tạo bản dựng để tạo ứng dụng của bạn.
- Các thư viện chứa những API mà bạn có thể gọi từ mã nguồn Kotlin hoặc Java. Xin lưu ý rằng không phải chức năng nào cũng có trên Android.
- Máy ảo Java (JVM), một trình thông dịch thực thi các ứng dụng Java. Bạn sử dụng JVM để chạy IDE Android Studio và công cụ bản dựng Gradle. JVM không được dùng trên các thiết bị hoặc trình mô phỏng Android.
- JetBrains Runtime (JBR)
- JetBrains Runtime (JBR) là một JDK nâng cao, được phân phối cùng với Android Studio. Nền tảng này có một số điểm tối ưu hoá để sử dụng trong Studio và các sản phẩm liên quan của JetBrains, nhưng cũng có thể dùng để chạy các ứng dụng Java khác.
Làm cách nào để chọn JDK để chạy Android Studio?
Bạn nên sử dụng JBR để chạy Android Studio. JDK này được triển khai cùng với Android Studio và dùng để kiểm thử Android Studio, đồng thời có các điểm cải tiến để sử dụng Android Studio một cách tối ưu. Để đảm bảo điều này, đừng đặt biến môi trường STUDIO_JDK
.
Các tập lệnh khởi động cho Android Studio tìm kiếm JVM theo thứ tự sau:
- Biến môi trường
STUDIO_JDK
- thư mục
studio.jdk
(trong bản phân phối Android Studio) - thư mục
jbr
(JetBrains Runtime) trong bản phân phối Android Studio. Được đề xuất. - Biến môi trường
JDK_HOME
- Biến môi trường
JAVA_HOME
- Tệp thực thi
java
trong biến môi trườngPATH
Làm cách nào để chọn JDK chạy bản dựng Gradle?
Nếu bạn chạy Gradle bằng các nút trong Android Studio, thì JDK được đặt trong phần cài đặt Android Studio sẽ được dùng để chạy Gradle. Nếu bạn chạy Gradle trong một thiết bị đầu cuối, bên trong hoặc bên ngoài Android Studio, biến môi trường JAVA_HOME
(nếu được thiết lập) sẽ xác định JDK nào chạy các tập lệnh Gradle. Nếu bạn không đặt JAVA_HOME
, thì hệ thống sẽ dùng lệnh java
trên biến môi trường PATH
.
Để có kết quả nhất quán nhất, hãy nhớ đặt biến môi trường JAVA_HOME
và cấu hình JDK của Gradle trong Android Studio thành cùng một JDK.
Khi chạy bản dựng, Gradle sẽ tạo một quy trình gọi là trình nền để thực hiện bản dựng thực tế. Bạn có thể sử dụng lại quy trình này, miễn là các bản dựng đang dùng cùng một phiên bản JDK và Gradle. Việc dùng lại một trình nền sẽ giảm thời gian khởi động JVM mới và khởi chạy hệ thống bản dựng.
Nếu bạn bắt đầu các bản dựng bằng các JDK hoặc phiên bản Gradle khác nhau, thì các trình nền bổ sung sẽ được tạo, tiêu thụ nhiều CPU và bộ nhớ hơn.
Cấu hình JDK của Gradle trong Android Studio
Để sửa đổi cấu hình JDK của Gradle trong dự án hiện có, hãy mở phần cài đặt Gradle trong File (Tệp) (hoặc Android Studio trên macOS) > Settings > Build, Execution, Deployment > Build Tools > Gradle (Cài đặt > Xây dựng, Thực thi, Triển khai > Công cụ xây dựng > Gradle). Trình đơn thả xuống Gradle JDK có các lựa chọn sau đây để bạn chọn:
- Các macro như
JAVA_HOME
vàGRADLE_LOCAL_JAVA_HOME
- Các mục trong bảng JDK ở định dạng
vendor-version
nhưjbr-17
được lưu trữ trong tệp cấu hình Android - Tải JDK xuống
- Thêm một JDK cụ thể
- JDK được phát hiện cục bộ từ thư mục cài đặt JDK mặc định của hệ điều hành
Lựa chọn đã chọn được lưu trữ trong lựa chọn gradleJvm
trong tệp .idea/gradle.xml
của dự án và quá trình phân giải đường dẫn JDK của lựa chọn này được dùng để chạy Gradle khi khởi động thông qua Android Studio.

Các macro này cho phép chọn đường dẫn JDK của dự án một cách linh hoạt:
JAVA_HOME
: sử dụng biến môi trường có cùng tênGRADLE_LOCAL_JAVA_HOME
: sử dụng thuộc tínhjava.home
trong tệp.gradle/config.properties
. Thuộc tính này mặc định là JetBrains Runtime.
JDK đã chọn được dùng để chạy bản dựng Gradle và phân giải các tham chiếu đến API JDK khi bạn chỉnh sửa tập lệnh bản dựng và mã nguồn. Xin lưu ý rằng compileSdk
được chỉ định sẽ hạn chế thêm những biểu tượng Java có sẵn khi chỉnh sửa và tạo mã nguồn.
Hãy nhớ chọn phiên bản JDK cao hơn hoặc bằng các phiên bản JDK mà các trình bổ trợ bạn dùng trong bản dựng Gradle sử dụng. Để xác định phiên bản JDK tối thiểu bắt buộc cho Trình bổ trợ Android cho Gradle (AGP), hãy xem bảng tương thích trong ghi chú phát hành.
Ví dụ: Trình bổ trợ Android cho Gradle phiên bản 8.x yêu cầu JDK 17. Nếu bạn cố gắng chạy một bản dựng Gradle sử dụng JDK với phiên bản cũ hơn, thì bản dựng đó sẽ báo cáo một thông báo như:
An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
> Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
Your current JDK is located in /usr/local/buildtools/java/jdk
You can try some of the following options:
- changing the IDE settings.
- changing the JAVA_HOME environment variable.
- changing `org.gradle.java.home` in `gradle.properties`.
Tôi có thể sử dụng API Java nào trong mã nguồn Java hoặc Kotlin?
Một ứng dụng Android có thể sử dụng một số API được xác định trong JDK, nhưng không phải tất cả. SDK Android xác định việc triển khai nhiều hàm thư viện Java trong số các API hiện có. Thuộc tính compileSdk
chỉ định phiên bản Android SDK cần dùng khi biên dịch mã nguồn Kotlin hoặc Java.
Kotlin
android {
...
compileSdk = 33
}
Groovy
android {
...
compileSdk 33
}
Mỗi phiên bản Android đều hỗ trợ một phiên bản JDK cụ thể và một tập hợp con các API Java có sẵn của phiên bản đó. Nếu sử dụng một API Java có trong compileSdk
không có trong minSdk
đã chỉ định, thì bạn có thể sử dụng API này trong phiên bản Android cũ hơn thông qua một quy trình gọi là huỷ bỏ đường cú pháp.
Hãy xem Các API Java 11 trở lên hiện có thông qua quy trình đơn giản hoá để biết các API được hỗ trợ.
Hãy sử dụng bảng này để xác định phiên bản Java nào được hỗ trợ bởi từng API Android và nơi tìm thông tin chi tiết về những API Java có sẵn.
Android | Java | API và các tính năng ngôn ngữ được hỗ trợ |
---|---|---|
14 (API 34) | 17 | Thư viện Core |
13 (API 33) | 11 | Thư viện Core |
12 (API 32) | 11 | Java API |
11 trở xuống | Phiên bản Android |
JDK nào biên dịch mã nguồn Java của tôi?
JDK chuỗi công cụ Java chứa trình biên dịch Java dùng để biên dịch mọi mã nguồn Java. JDK này cũng chạy javadoc và kiểm thử đơn vị trong quá trình tạo bản dựng.
Theo mặc định, chuỗi công cụ sẽ dùng JDK để chạy Gradle. Nếu bạn sử dụng chế độ mặc định và chạy một bản dựng trên nhiều máy (ví dụ: máy cục bộ và một máy chủ Tích hợp liên tục riêng biệt), thì kết quả của bản dựng có thể khác nhau nếu bạn sử dụng các phiên bản JDK khác nhau.
Để tạo bản dựng nhất quán hơn, bạn có thể chỉ định rõ ràng phiên bản chuỗi công cụ Java. Chỉ định điều này:
- Xác định vị trí của một JDK tương thích trên hệ thống đang chạy bản dựng.
- Nếu không có JDK tương thích (và trình phân giải chuỗi công cụ được xác định), hãy tải một JDK xuống.
- Hiển thị các API Java của chuỗi công cụ cho các lệnh gọi từ mã nguồn.
- Biên dịch nguồn Java bằng phiên bản ngôn ngữ Java.
- Cung cấp giá trị mặc định cho
sourceCompatibility
vàtargetCompatibility
.
Bạn nên luôn chỉ định chuỗi công cụ Java và đảm bảo rằng JDK được chỉ định đã được cài đặt hoặc thêm một trình phân giải chuỗi công cụ vào bản dựng của bạn.
Bạn có thể chỉ định chuỗi công cụ cho dù mã nguồn của bạn được viết bằng Java, Kotlin hay cả hai. Chỉ định chuỗi công cụ ở cấp cao nhất của tệp build.gradle(.kts)
trong mô-đun.
Chỉ định phiên bản chuỗi công cụ Java như sau:
Kotlin
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Groovy
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Cách này có tác dụng nếu nguồn của bạn là Kotlin, Java hoặc kết hợp cả hai.
Phiên bản JDK của chuỗi công cụ có thể giống với JDK dùng để chạy Gradle, nhưng hãy lưu ý rằng chúng phục vụ các mục đích khác nhau.
Tôi có thể sử dụng những tính năng nào của nguồn ngôn ngữ Java trong mã nguồn Java?
Thuộc tính sourceCompatibility
xác định những tính năng ngôn ngữ Java có sẵn trong quá trình biên dịch nguồn Java.
Điều này không ảnh hưởng đến nguồn Kotlin.
Chỉ định sourceCompatibility
trong tệp build.gradle(.kts)
của mô-đun như sau:
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
}
}
Groovy
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
}
}
Nếu không được chỉ định, thuộc tính này sẽ mặc định là phiên bản Java toolchain. Nếu bạn không sử dụng chuỗi công cụ Java, thì theo mặc định, chuỗi công cụ này sẽ là phiên bản do trình bổ trợ Android cho Gradle chọn (ví dụ: Java 8 trở lên).
Tôi có thể sử dụng những tính năng nào của tệp nhị phân Java khi biên dịch nguồn Kotlin hoặc Java?
Các thuộc tính targetCompatibility
và jvmTarget
xác định phiên bản định dạng lớp Java được dùng khi tạo mã byte cho nguồn Java và Kotlin đã biên dịch, tương ứng.
Một số tính năng của Kotlin đã có trước khi các tính năng tương đương của Java được thêm vào.
Các trình biên dịch Kotlin ban đầu phải tạo cách riêng để biểu thị những tính năng đó của Kotlin. Sau đó, một số tính năng này đã được thêm vào Java.
Với các cấp jvmTarget
sau này, trình biên dịch Kotlin có thể trực tiếp sử dụng tính năng Java, điều này có thể giúp cải thiện hiệu suất.
Các phiên bản Android khác nhau hỗ trợ các phiên bản Java khác nhau. Bạn có thể tận dụng các tính năng bổ sung của Java bằng cách tăng targetCompatibility
và jvmTarget
, nhưng điều này có thể buộc bạn phải tăng phiên bản SDK Android tối thiểu để đảm bảo tính năng này có sẵn.
Xin lưu ý rằng targetCompatibility
phải lớn hơn hoặc bằng sourceCompatibility
. Trên thực tế, sourceCompatibility
, targetCompatibility
và jvmTarget
thường phải sử dụng cùng một giá trị.
Bạn có thể đặt các giá trị này như sau:
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
Groovy
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget '17'
}
}
Nếu không được chỉ định, các thuộc tính này sẽ mặc định là phiên bản chuỗi công cụ Java. Nếu bạn không sử dụng chuỗi công cụ Java, thì các giá trị mặc định có thể khác nhau và gây ra vấn đề về bản dựng. Do đó, bạn nên luôn chỉ định rõ ràng các giá trị này hoặc sử dụng chuỗi công cụ Java.