Android Runtime (ART) bao gồm một trình biên dịch tức thì (JIT) có tính năng lập hồ sơ mã, liên tục cải thiện hiệu suất của các ứng dụng Android khi chúng chạy. Trình biên dịch JIT bổ sung cho trình biên dịch trước thời gian (AOT) hiện tại của ART và cải thiện hiệu suất thời gian chạy, tiết kiệm dung lượng lưu trữ, đồng thời tăng tốc các bản cập nhật ứng dụng và hệ thống. Nó cũng cải thiện trình biên dịch AOT bằng cách tránh tình trạng hệ thống bị chậm trong quá trình tự động cập nhật ứng dụng hoặc biên dịch lại ứng dụng trong quá trình cập nhật qua mạng (OTA).
Mặc dù JIT và AOT sử dụng cùng một trình biên dịch với một nhóm các quy trình tối ưu hoá tương tự, nhưng mã được tạo có thể không giống nhau. JIT sử dụng thông tin về loại thời gian chạy, có thể thực hiện việc nội tuyến tốt hơn và cho phép biên dịch thay thế trên ngăn xếp (OSR), tất cả đều tạo ra mã có chút khác biệt.
Cấu trúc JIT

Biên dịch JIT
Quá trình biên dịch JIT bao gồm các hoạt động sau:

- Người dùng chạy ứng dụng, sau đó kích hoạt ART để tải tệp
.dex
.- Nếu có tệp
.oat
(nhị phân AOT cho tệp.dex
), ART sẽ sử dụng trực tiếp tệp này. Mặc dù các tệp.oat
được tạo thường xuyên, nhưng không phải lúc nào các tệp này cũng chứa mã đã biên dịch (nhị phân AOT). - Nếu tệp
.oat
không chứa mã đã biên dịch, ART sẽ chạy thông qua JIT và trình thông dịch để thực thi tệp.dex
.
- Nếu có tệp
- JIT được bật cho mọi ứng dụng không được biên dịch theo bộ lọc biên dịch
speed
(có nội dung "biên dịch nhiều nhất có thể từ ứng dụng"). - Dữ liệu hồ sơ JIT được kết xuất vào một tệp trong thư mục hệ thống mà chỉ ứng dụng mới có thể truy cập.
- Trình nền biên dịch AOT (
dex2oat
) sẽ phân tích cú pháp tệp đó để điều khiển quá trình biên dịch.
Hình 3. Các hoạt động của trình nền JIT.
Dịch vụ Google Play là một ví dụ được các ứng dụng khác sử dụng, có hành vi tương tự như các thư viện dùng chung.
Quy trình JIT

- Thông tin về việc lập hồ sơ được lưu trữ trong bộ nhớ đệm mã và chịu sự thu thập rác trong điều kiện bộ nhớ bị hạn chế.
- Không có gì đảm bảo rằng ảnh chụp nhanh được thực hiện khi ứng dụng ở chế độ nền sẽ chứa dữ liệu đầy đủ (tức là mọi thứ đã được JIT).
- Không có nỗ lực nào để đảm bảo mọi thứ đều được ghi lại (vì điều này có thể ảnh hưởng đến hiệu suất thời gian chạy).
- Các phương thức có thể ở 3 trạng thái:
- được diễn giải (mã dex)
- Được biên dịch JIT
- Được biên dịch AOT
- Yêu cầu về bộ nhớ để chạy JIT mà không ảnh hưởng đến hiệu suất của ứng dụng trên nền trước phụ thuộc vào ứng dụng được đề cập. Các ứng dụng lớn cần nhiều bộ nhớ hơn các ứng dụng nhỏ. Nhìn chung, các ứng dụng lớn ổn định ở mức khoảng 4 MB.
Bật tính năng ghi nhật ký JIT
Để bật tính năng ghi nhật ký JIT, hãy chạy các lệnh sau:
adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start
Tắt JIT
Để tắt JIT, hãy chạy các lệnh sau:
adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start
Buộc biên dịch
Để buộc biên dịch, hãy chạy lệnh sau:
adb shell cmd package compile
Các trường hợp sử dụng phổ biến để bắt buộc biên dịch một gói cụ thể:
- Dựa trên hồ sơ:
adb shell cmd package compile -m speed-profile -f my-package
- Toàn quyền:
adb shell cmd package compile -m speed -f my-package
Các trường hợp sử dụng phổ biến để bắt buộc biên dịch tất cả các gói:
- Dựa trên hồ sơ:
adb shell cmd package compile -m speed-profile -f -a
- Toàn quyền:
adb shell cmd package compile -m speed -f -a
Xoá dữ liệu hồ sơ
Trên Android 13 trở xuống
Để xoá dữ liệu hồ sơ cục bộ và xoá mã đã biên dịch, hãy chạy lệnh sau:
adb shell pm compile --reset
Trên Android 14 trở lên
Cách chỉ xoá dữ liệu hồ sơ cục bộ:
adb shell pm art clear-app-profiles
Lưu ý: Không giống như lệnh dành cho Android 13 trở xuống, lệnh này không xoá dữ liệu hồ sơ bên ngoài (`.dm`) được cài đặt cùng với ứng dụng.
Để xoá dữ liệu hồ sơ cục bộ và xoá mã đã biên dịch được tạo từ dữ liệu hồ sơ cục bộ (tức là đặt lại về trạng thái cài đặt), hãy chạy lệnh sau:
adb shell pm compile --reset
Lưu ý: Lệnh này không xoá mã đã biên dịch được tạo từ dữ liệu hồ sơ bên ngoài (.dm) được cài đặt cùng với ứng dụng.
Để xoá tất cả mã đã biên dịch, hãy chạy lệnh sau:
adb shell cmd package compile -m verify -f
Lưu ý: Lệnh này sẽ giữ lại dữ liệu hồ sơ trên thiết bị.