Triển khai trình biên dịch đúng thời điểm ART

Android Runtime (ART) có một trình biên dịch đúng thời điểm (JIT) có khả năng phân tích mã giúp 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 chạy trước (AOT) hiện tại của ART và cải thiện hiệu suất trong thời gian chạy, tiết kiệm không gian lưu trữ, cũng như tăng tốc độ ứng dụng và các bản cập nhật hệ thống. API này cũng cải thiện trình biên dịch AOT bằng cách tránh hệ thống làm 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 khi cập nhật qua mạng không dây (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 biện pháp tối ưu hoá tương tự nhau, mã được tạo có thể không giống hệt nhau. JIT sử dụng loại thời gian chạy thông tin, có thể hoạt động cùng dòng hiệu quả hơn và thực hiện thay thế ngăn xếp (OSR) có thể biên dịch được, tất cả đều tạo ra mã hơi khác.

Kiến trúc JIT

Kiến trúc JIT
Hình 1. Kiến 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:

Bản comp theo hướng dẫn của hồ sơ
Hình 2. Biên dịch theo hồ sơ.
  1. Người dùng chạy ứng dụng, sau đó kích hoạt ART để tải .dex .
    • Nếu tệp .oat (tệp nhị phân AOT cho .dex ), ART sẽ trực tiếp sử dụng tệp đó. Mặc dù các tệp .oat được tạo thường xuyên, nên chúng không phải lúc nào cũng chứa mã được biên dịch (tệp 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.
  2. JIT được bật cho mọi ứng dụng không được biên dịch theo tiêu chuẩn Bộ lọc biên dịch speed (có nội dung "biên dịch càng nhiều càng tốt từ ứng dụng").
  3. 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 có thể truy cập.
  4. Trình biên dịch AOT (dex2oat) phân tích cú pháp tệp đó thành ổ đĩa quá trình biên dịch của nó.

    Trình nền JIT
    Hình 3. Hoạt động trình nền JIT (JIT).

Dịch vụ Google Play là một ví dụ được các ứng dụng khác hoạt động tương tự như thư viện dùng chung.

Quy trình công việc JIT

Kiến trúc JIT
Hình 4. Luồng dữ liệu JIT.
  • Thông tin phân tích tài nguyên được lưu trữ trong bộ nhớ đệm của mã và có trong thùng rác bộ sưu tập dưới áp lực bộ nhớ.
    • Không có gì đảm bảo rằng ảnh chụp nhanh khi ứng dụng nằm trong nền sẽ chứa dữ liệu đầy đủ (tức là mọi thứ đã được JITed).
    • Bạn sẽ không thể đảm bảo mọi thứ đều được ghi lại (vì điều này có thể ảnh hưởng đến kết quả tìm kiếm) hiệu suất thời gian chạy).
  • Các phương thức có thể ở 3 trạng thái khác nhau:
    • được thông dịch (mã dex)
    • Đã biên dịch JIT
    • Đã biên dịch AOT
    Nếu tồn tại cả mã JIT và AOT (ví dụ: do việc loại bỏ tối ưu hoá nhiều lần), ưu tiên mã JITed.
  • Yêu cầu về bộ nhớ để chạy JIT mà không ảnh hưởng đến ứng dụng trên nền trước hiệu suất phụ thuộc vào ứng dụng liên quan. Ứng dụng lớn cần nhiều bộ nhớ hơn so với các ứng dụng nhỏ. Nhìn chung, các ứng dụng lớn thường ổn định trong 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 khi 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
    
  • Đầy đủ:
    adb shell cmd package compile -m speed -f my-package
    

Các trường hợp sử dụng phổ biến đối với việc 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
    
  • Đầy đủ:
    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

Để chỉ xoá dữ liệu hồ sơ trên máy:

adb shell pm art clear-app-profiles 

Lưu ý: Không giống như lệnh dành cho Android 13 hoặc cũ hơn, lệnh này không xoá dữ liệu hồ sơ bên ngoài (.dm`) mà cài đặt cùng với ứng dụng.

Để xoá dữ liệu hồ sơ trên máy và xoá mã đã biên dịch được tạo từ cục bộ dữ liệu cấu hình (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 giữ lại dữ liệu hồ sơ trên máy.