Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Triển khai trình biên dịch ART Just-In-Time (JIT)

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

Kiến trúc JIT

Kiến trúc JIT
Hình 1. Kiến trúc JIT.

Tổng hợp JIT

Việc biên dịch JIT bao gồm các hoạt động sau:

Biên tập hướng dẫn hồ sơ
Hình 2. Biên dịch có hướng dẫn hồ sơ.
  1. Người dùng chạy ứng dụng, sau đó kích hoạt ART để tải tệp .dex .
    • Nếu tệp .oat (nhị phân AOT cho tệp .dex ) có sẵn, ART sẽ sử dụng trực tiếp tệp đó. Mặc dù các tệp .oat được tạo thường xuyên, chúng không phải lúc nào cũng chứa mã đã biên dịch (AOT binary).
    • Nếu tệp .oat không chứa mã đã biên dịch, ART sẽ chạy qua JIT và trình thông dịch để thực thi tệp .dex .
  2. JIT được bật cho bất kỳ ứng dụng nào không được biên dịch theo 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 mới có thể truy cập.
  4. Daemon biên dịch AOT ( dex2oat ) phân tích cú pháp tệp đó để thúc đẩy quá trình biên dịch của nó.

    Daemon JIT
    Hình 3. Các hoạt động của JIT daemon.

Dịch vụ Google Play là một ví dụ được sử dụng bởi các ứng dụng khác hoạt động tương tự như thư viện được chia sẻ.

Quy trình làm việc JIT

Kiến trúc JIT
Hình 4. Luồng dữ liệu JIT.
  • Thông tin cấu hình được lưu trữ trong bộ đệm mã và bị thu gom rác dưới áp lực của bộ nhớ.
    • Không có gì đảm bảo rằng một ảnh chụp nhanh được chụp khi ứng dụng ở chế độ nền sẽ chứa dữ liệu đầy đủ (tức là mọi thứ đã được JITed).
    • Không có nỗ lực nào để đảm bảo mọi thứ đượ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ể ở ba trạng thái khác nhau:
    • thông dịch (mã dex)
    • JIT biên dịch
    • AOT biên dịch
    Nếu cả mã JIT và AOT đều tồn tại (ví dụ: do tối ưu hóa lặp đi lặp lại), mã JITed được ưu tiên hơn.
  • Yêu cầu bộ nhớ để chạy JIT mà không ảnh hưởng đến hiệu suất ứng dụng nền trước phụ thuộc vào ứng dụng được đề cập. Các ứng dụng lớn yêu cầu nhiều bộ nhớ hơn các ứng dụng nhỏ. Nói chung, các ứng dụng lớn ổn định khoảng 4 MB.

Bật ghi nhật ký JIT

Để bật 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 như sau:

adb shell cmd package compile

Các trường hợp sử dụng phổ biến để 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 để 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
    

Xóa dữ liệu hồ sơ

Để xóa dữ liệu hồ sơ và xóa mã đã biên dịch, hãy chạy như sau:

  • Đối với một gói:
    adb shell cmd package compile --reset my-package
    
  • Đối với tất cả các gói:
    adb shell cmd package compile --reset -a