Trang này thảo luận cách định cấu hình Android Runtime (ART) và các tuỳ chọn biên dịch. Chủ đề
địa chỉ ở đây bao gồm cả cấu hình biên dịch trước hình ảnh hệ thống, dex2oat
các tuỳ chọn biên dịch cũng như cách đánh đổi không gian phân vùng hệ thống, không gian phân vùng dữ liệu và
hiệu suất.
Xem ART và Dalvik cũng như định dạng thực thi Dalvik để hoạt động với ART. Xem phần Xác minh Hành vi của ứng dụng trên Android Runtime (ART) để đảm bảo ứng dụng của bạn hoạt động đúng cách.
Cách hoạt động của ART
ART sử dụng tính năng biên dịch trước khi chạy (AOT) và kể từ Android 7, công nghệ này sử dụng kết hợp kết hợp giữa biên dịch AOT, biên dịch đúng thời điểm (JIT) và diễn giải, và quá trình biên dịch AOT có thể theo hướng dẫn của hồ sơ. Sự kết hợp của tất cả các chế độ thực thi này có thể định cấu hình và sẽ được thảo luận trong phần này. Ví dụ: thiết bị Pixel được định cấu hình để hoạt động theo quy trình sau:
- Ban đầu, một ứng dụng được cài đặt với tệp siêu dữ liệu dex (
.dm
) do Cửa hàng Play chứa một hồ sơ trên đám mây. ART AOT biên dịch các phương thức được liệt kê trên đám mây hồ sơ. Hoặc nếu ứng dụng được cài đặt mà không có tệp siêu dữ liệu dex, thì quá trình biên dịch AOT sẽ không thực hiện. - Trong vài lần đầu tiên ứng dụng chạy, các phương thức không được biên dịch bằng AOT sẽ được diễn giải. Trong số các phương thức thông dịch, những phương thức thường được thực thi sẽ được biên dịch JIT. (theo giờ ART) tạo một hồ sơ cục bộ dựa trên quá trình thực thi và kết hợp hồ sơ đó với hồ sơ trên đám mây (nếu có tồn tại).
- Khi thiết bị ở trạng thái rảnh và đang sạc, một trình nền biên dịch sẽ chạy để biên dịch lại ứng dụng dựa trên hồ sơ kết hợp được tạo trong vài lần chạy đầu tiên.
- Trong các lần chạy ứng dụng tiếp theo, ART sử dụng các cấu phần phần mềm do quá trình biên dịch tạo ra daemon, chứa nhiều mã được biên dịch AOT hơn so với các mã được tạo trong Các phương thức không phải do AOT biên dịch vẫn được thông dịch hoặc biên dịch JIT. ART cập nhật hồ sơ cài đặt dựa trên việc thực thi và hồ sơ sau đó sẽ được chọn trong các lần chạy tiếp theo trình nền biên dịch.
ART bao gồm một trình biên dịch (công cụ dex2oat
) và một thời gian chạy
(libart.so
) được tải trong quá trình khởi động. Chiến lược phát hành đĩa đơn
Công cụ dex2oat
lấy một tệp APK và tạo một hoặc nhiều tệp APK
các tệp cấu phần phần mềm biên dịch mà thời gian chạy tải. Số lượng tệp,
các tiện ích và tên có thể thay đổi qua các bản phát hành, nhưng kể từ
Bản phát hành Android 8, các tệp sau được tạo:
.vdex
: chứa một số siêu dữ liệu bổ sung để xác minh nhanh hơn, đôi khi cùng với bằng mã DEX không nén của APK..odex
: chứa mã được biên dịch bằng AOT cho các phương thức trong APK..art (optional)
chứa ART nội bộ bản trình bày của một số chuỗi và lớp được liệt kê trong APK, dùng để tăng tốc khởi động ứng dụng.
Tuỳ chọn biên dịch
Có hai danh mục lựa chọn biên dịch cho ART:
- Cấu hình ROM hệ thống: Mã nào được biên dịch AOT khi tạo một hình ảnh hệ thống.
- Cấu hình thời gian chạy: cách ART biên dịch và chạy ứng dụng trên thiết bị.
Bộ lọc trình biên dịch
Một tuỳ chọn ART chính để định cấu hình 2 danh mục này là trình biên dịch
. Các bộ lọc trình biên dịch điều khiển cách ART biên dịch mã DEX và là một
được truyền đến công cụ dex2oat
. Kể từ Android 8,
có 4 bộ lọc được hỗ trợ chính thức:
verify
: chỉ chạy xác minh mã DEX (không biên dịch AOT).quicken
: (cho đến Android 11) chạy mã DEX và tối ưu hoá một số hướng dẫn DEX để có hiệu suất phiên dịch tốt hơn.speed
: Chạy quy trình xác minh mã DEX và biên dịch AOT cho tất cả các phương thức.speed-profile
: Chạy phương thức xác minh mã DEX và biên dịch AOT được liệt kê trong tệp cấu hình.
Cấu hình ROM hệ thống
Các thư viện và ứng dụng cài đặt sẵn được biên dịch bằng AOT khi xây dựng hình ảnh hệ thống. Chiến dịch này có tên là dexpreopt. Các tệp đã biên dịch như vậy vẫn có thể sử dụng được, miễn là tất cả các phần phụ thuộc vẫn không thay đổi, đặc biệt là đường dẫn lớp khởi động.
Lưu ý: Nếu thiết bị tự chụp mô-đun hệ thống được cập nhật thì đường dẫn lớp khởi động sẽ rất có thể thay đổi trong bản cập nhật tiếp theo, làm hiển thị tất cả các tệp dexpreopt đã lỗi thời và không sử dụng được.
Có một số tuỳ chọn bản dựng ART để định cấu hình dexpreopt. Cách bạn thiết lập các tuỳ chọn này phụ thuộc vào dung lượng lưu trữ có sẵn cho hình ảnh hệ thống và số lượng các ứng dụng được cài đặt sẵn. Bạn có thể chia các tệp JAR/APK được biên dịch thành ROM hệ thống thành 4 danh mục:
- Mã đường dẫn lớp khởi động: được biên dịch bằng bộ lọc trình biên dịch
speed-profile
theo mặc định. - Mã máy chủ hệ thống (xem
PRODUCT_SYSTEM_SERVER_JARS
,PRODUCT_APEX_SYSTEM_SERVER_JARS
,PRODUCT_STANDALONE_SYSTEM_SERVER_JARS
PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS
ở phần sau trong tài liệu này):- (Android 14 trở lên) Được biên dịch bằng
speed-profile
bộ lọc trình biên dịch theo mặc định hoặc được biên dịch bằng bộ lọc trình biên dịchspeed
nếu một hồ sơ sẽ không được cung cấp. - (Android 13 trở xuống) Được biên dịch bằng
speed
theo mặc định.
PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
(xem phần sau trong phần này tài liệu). - (Android 14 trở lên) Được biên dịch bằng
- Ứng dụng cốt lõi theo sản phẩm cụ thể (xem
PRODUCT_DEXPREOPT_SPEED_APPS
ở phần sau trong phần này document): được biên dịch với bộ lọc trình biên dịchspeed
theo mặc định. - Tất cả các ứng dụng khác: được biên dịch bằng bộ lọc trình biên dịch
speed-profile
theo mặc định, hoặc được biên dịch bằng bộ lọc trình biên dịchverify
nếu hồ sơ không được cung cấp.Có thể định cấu hình đến hết
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
(xem phần sau trong phần này tài liệu).
Tuỳ chọn makefile
WITH_DEXPREOPT
DONT_DEXPREOPT_PREBUILTS
(Android 5 trở lên)PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
(Android 9) trở lên)WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
(kể từ Android 8 MR1)LOCAL_DEX_PREOPT
PRODUCT_DEX_PREOPT_BOOT_FLAGS
PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
PRODUCT_DEX_PREOPT_MODULE_CONFIGS
PRODUCT_DEXPREOPT_SPEED_APPS
(kể từ Android 8)PRODUCT_SYSTEM_SERVER_APPS
(kể từ Android 8)PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD
(kể từ Android 8)WITH_DEXPREOPT_PIC
(cho đến Android 7)WITH_DEXPREOPT_BOOT_IMG_ONLY
(cho đến Android 7 MR1)PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
- (Android 14 trở lên) Nếu bạn chưa chỉ định,
speed-profile
bộ lọc trình biên dịch được sử dụng hoặc bộ lọc trình biên dịchspeed
được sử dụng nếu không có hồ sơ đã cung cấp. - (Android 13 trở xuống) Nếu bạn không chỉ định, trình biên dịch
speed
bộ lọc được sử dụng. - Nếu bạn đặt thành
speed
, bộ lọc trình biên dịchspeed
sẽ được sử dụng. - Nếu bạn đặt thành
speed-profile
, bộ lọc trình biên dịchspeed-profile
sẽ được dùng, hoặc bộ lọc trình biên dịchverify
sẽ được sử dụng nếu hồ sơ không được cung cấp. - Nếu bạn đặt thành
verify
, bộ lọc trình biên dịchverify
sẽ được sử dụng. PRODUCT_SYSTEM_SERVER_JARS
,PRODUCT_APEX_SYSTEM_SERVER_JARS
PRODUCT_STANDALONE_SYSTEM_SERVER_JARS
,PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS
- (Bắt buộc)
PRODUCT_SYSTEM_SERVER_JARS
: Danh sách các tệp JAR classpath của máy chủ hệ thống trên nền tảng (tức là một phần củaSYSTEMSERVERCLASSPATH
). Đang thêm máy chủ hệ thống Bạn phải cung cấp các tệp JAR classpath cho danh sách này. Không thêm được các tệp JAR classpath của máy chủ hệ thống vào danh sách dẫn đến việc các tệp JAR đó không được tải. - (Bắt buộc)
PRODUCT_APEX_SYSTEM_SERVER_JARS
: Danh sách các tệp JAR classpath của máy chủ hệ thống được phân phối bằng APEX (tức là một phần củaSYSTEMSERVERCLASSPATH
). Định dạng là<apex name>:<jar name>
. Thêm các tệp JAR classpath của máy chủ hệ thống APEX vào danh sách này là bắt buộc. Nếu không thêm được các tệp JAR classpath của máy chủ hệ thống APEX vào danh sách này, thì: những tệp JAR đó không được tải. - (Không bắt buộc, Android 13 trở xuống)
PRODUCT_STANDALONE_SYSTEM_SERVER_JARS
: Danh sách các tệp JAR mà máy chủ hệ thống tải một cách linh hoạt bằng các trình tải lớp riêng biệt (thông quaSystemServiceManager.startServiceFromJar
). Thêm các tệp JAR của máy chủ hệ thống độc lập vào Đây là danh sách không bắt buộc nhưng bạn nên rất nên dùng danh sách này vì danh sách này giúp biên dịch các tệp JAR do đó có hiệu suất thời gian chạy tốt. - (bắt buộc, kể từ Android 13)
PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS
: Danh sách Các tệp JAR được phân phối bằng APEX mà máy chủ hệ thống tải động bằng các trình tải lớp riêng biệt (tức là thông quaSystemServiceManager.startServiceFromJar
hoặc được khai báo là<apex-system-service>
). Định dạng là<apex name>:<jar name>
. Thêm các tệp JAR của máy chủ hệ thống APEX độc lập vào danh sách này là bắt buộc. Việc không thêm các tệp JAR máy chủ độc lập của hệ thống APEX vào danh sách này sẽ dẫn đến lỗi khởi động.
Liệu dex2oat
có được gọi trên mã DEX được cài đặt trên ảnh hệ thống hay không. Bật theo mặc định.
Việc bật DONT_DEXPREOPT_PREBUILTS
sẽ ngăn không cho tạo sẵn
đã được phê duyệt. Đây là những ứng dụng có include $(BUILD_PREBUILT)
được chỉ định trong Android.mk
. Bỏ qua
dexpreopt của các ứng dụng tạo sẵn có khả năng được cập nhật qua Google Play
tiết kiệm dung lượng trong hình ảnh hệ thống nhưng làm tăng thêm thời gian khởi động đầu tiên. Lưu ý rằng tuỳ chọn này không có hiệu lực
trên các ứng dụng tạo sẵn được xác định trong Android.bp
.
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
chỉ định bộ lọc trình biên dịch mặc định
cho các ứng dụng đã được cấp quyền riêng tư. Các ứng dụng này được xác định trong Android.bp
hoặc có
include $(BUILD_PREBUILT)
được chỉ định trong Android.mk
của họ. Nếu bạn chưa chỉ định,
giá trị mặc định là speed-profile
hoặc verify
nếu giá trị không được chỉ định
và hồ sơ sẽ không được cung cấp.
Chỉ bật WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
dexpreopts
đường dẫn lớp khởi động và các tệp jars máy chủ hệ thống.
Bạn cũng có thể bật hoặc tắt Dexpreopt trên từng ứng dụng bằng cách
chỉ định tuỳ chọn LOCAL_DEX_PREOPT
trong phần định nghĩa mô-đun.
Cách này có thể hữu ích cho việc tắt tính năng dexpreopt của những ứng dụng có thể ngay lập tức
nhận bản cập nhật của Google Play vì bản cập nhật sẽ hiển thị tệp dex đã được phê duyệt
mã trong ảnh hệ thống đã lỗi thời. Điều này cũng hữu ích để tiết kiệm không gian trên
bản nâng cấp phiên bản qua mạng không dây (OTA) vì người dùng có thể đã có phiên bản ứng dụng mới hơn trong
phân vùng dữ liệu.
LOCAL_DEX_PREOPT
hỗ trợ các giá trị true
hoặc false
để
bật hoặc tắt dexpreopt tương ứng. Ngoài ra, nostripping
có thể
được chỉ định nếu dexpreopt không tách classes.dex
từ tệp APK hoặc JAR. Thông thường, tệp này bị xoá vì không
cần nhiều thời gian hơn sau khi dexpreopt, nhưng lựa chọn cuối cùng này là cần thiết để
cho phép chữ ký APK của bên thứ ba vẫn hợp lệ.
Truyền các tuỳ chọn đến dex2oat
để kiểm soát cách hình ảnh khởi động
biên dịch. Bạn có thể dùng đối số này để chỉ định danh sách lớp hình ảnh tuỳ chỉnh, được biên dịch
danh sách lớp và bộ lọc trình biên dịch.
Truyền các tuỳ chọn cho dex2oat
để kiểm soát mọi thứ ngoài những
hình ảnh khởi động được biên dịch.
Cung cấp khả năng truyền các tuỳ chọn dex2oat
cho một sự kiện cụ thể
mô-đun và cấu hình sản phẩm. Thuộc tính này được đặt trong
device.mk
tệp của $(call add-product-dex-preopt-module-config,<modules>,<option>)
trong đó <modules>
là danh sách LOCAL_MODULE
và
LOCAL_PACKAGE
cho tệp JAR và APK tương ứng.
Danh sách ứng dụng được xác định là cốt lõi trong các sản phẩm này và
mong muốn biên dịch bằng bộ lọc trình biên dịch speed
. Cho
ví dụ: các ứng dụng ổn định như SystemUI sẽ có cơ hội sử dụng
tính năng biên dịch theo hướng dẫn của hồ sơ vào lần khởi động lại tiếp theo, vì vậy có thể sẽ tốt hơn cho
để các ứng dụng này luôn được biên dịch bằng AOT.
Danh sách ứng dụng mà máy chủ hệ thống tải. Các ứng dụng này
được biên dịch theo mặc định bằng bộ lọc trình biên dịch speed
.
Liệu có bao gồm phiên bản gỡ lỗi của ART trên thiết bị hay không. Theo mặc định, đây là
được bật để gỡ lỗi người dùng và bản dựng eng. Bạn có thể ghi đè hành vi này bằng cách nhập một cách rõ ràng
đặt tuỳ chọn thành true
hoặc false
.
Theo mặc định, thiết bị sử dụng phiên bản không gỡ lỗi (libart.so
).
Để chuyển đổi, hãy đặt thuộc tính hệ thống persist.sys.dalvik.vm.lib.2
thành
libartd.so
.
Trong Android 5.1.0 đến Android 6.0.1, WITH_DEXPREOPT_PIC
có thể
được chỉ định để bật mã độc lập về vị trí (PIC). Với cách này, tổng hợp
mã của hình ảnh không phải được chuyển từ
/system
vào /data/dalvik-cache
, giúp tiết kiệm dung lượng trong phân vùng dữ liệu.
Tuy nhiên, có tác động nhỏ về thời gian chạy vì nó vô hiệu hoá một tính năng tối ưu hoá tận dụng
của mã phụ thuộc vào vị trí. Thông thường, các thiết bị muốn tiết kiệm dung lượng ở /data
sẽ bật tính năng biên dịch PIC.
Trong Android 7.0, tính năng biên dịch PIC được bật theo mặc định.
Lựa chọn này đã được thay thế bằng WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
cũng sử dụng trước các tệp JAR của máy chủ hệ thống.
Tuỳ chọn này chỉ định bộ lọc của trình biên dịch cho máy chủ hệ thống.
Sau đây là danh sách các tệp JAR do máy chủ hệ thống tải. Các tệp JAR được biên dịch bằng
bộ lọc trình biên dịch do PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
chỉ định
Cấu hình đường dẫn lớp khởi động
Danh sách các lớp được tải trước là danh sách các lớp mà Zygote khởi động trên đó
của bạn. Thao tác này giúp từng ứng dụng không phải chạy các trình khởi chạy lớp này
riêng lẻ, cho phép chúng khởi động nhanh hơn và chia sẻ các trang trong bộ nhớ. Chiến lược phát hành đĩa đơn
tệp danh sách lớp học được tải trước nằm tại frameworks/base/config/preloaded-classes
theo mặc định, và danh sách này chứa danh sách được điều chỉnh để sử dụng điện thoại thông thường. Điều này có thể
khác với các thiết bị khác, chẳng hạn như thiết bị đeo được và phải được điều chỉnh
cho phù hợp. Hãy cẩn thận khi điều chỉnh tính năng này; thêm quá nhiều lớp học lãng phí
khi các lớp không sử dụng được tải. Việc thêm quá ít lớp sẽ buộc từng ứng dụng
phải có bản sao riêng, điều này một lần nữa lại gây lãng phí bộ nhớ.
Ví dụ về cách sử dụng (trong device.mk
của sản phẩm):
PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
Lưu ý: Bạn phải đặt dòng này trước
kế thừa bất kỳ tệp makefile cấu hình sản phẩm nào lấy tệp mặc định
build/target/product/base.mk
.
Cấu hình thời gian chạy
Các lựa chọn JIT
Các tuỳ chọn sau chỉ ảnh hưởng đến các bản phát hành Android mà trình biên dịch ART JIT có sẵn.
dalvik.vm.usejit
: Liệu có bật JIT hay không.dalvik.vm.jitinitialsize
(mặc định là 64K): Dung lượng ban đầu của bộ nhớ đệm mã. Bộ nhớ đệm mã sẽ thường xuyên GC và tăng lên nếu cần.dalvik.vm.jitmaxsize
(mặc định là 64M): Dung lượng tối đa của bộ nhớ đệm mã.dalvik.vm.jitthreshold
(mặc định là 10000): Ngưỡng mà "độ nóng" bộ đếm của một phương thức cần được truyền theo thứ tự cho phương thức được biên dịch JIT. "Độ nóng" bộ đếm là một chỉ số nội bộ vào môi trường thời gian chạy. Dữ liệu này bao gồm số cuộc gọi, số nhánh quay lại và các số liệu khác yếu tố khác.dalvik.vm.usejitprofiles
(cho đến Android 13): Liệu hay không bật hồ sơ JIT; Bạn có thể sử dụng thuộc tính này ngay cả khidalvik.vm.usejit
là false. Lưu ý rằng nếu giá trị này là false, thì bộ lọc của trình biên dịchspeed-profile
sẽ thực hiện không biên dịch AOT (AOT) bất kỳ phương thức nào và tương đương vớiverify
. Từ Android 14, hồ sơ JIT luôn được bật và không thể tắt được.dalvik.vm.jitprithreadweight
(mặc định làdalvik.vm.jitthreshold
/ 20): Trọng số của "mẫu" JIT (xem jitthreshold) cho luồng giao diện người dùng của ứng dụng. Dùng để tăng tốc độ biên dịch có ảnh hưởng trực tiếp đến trải nghiệm người dùng khi họ tương tác với .dalvik.vm.jittransitionweight
(mặc định làdalvik.vm.jitthreshold
/ 10): Trọng số của phương thức lệnh gọi chuyển đổi giữa mã biên dịch và trình phiên dịch. Điều này giúp đảm bảo các phương thức có liên quan được biên dịch để giảm thiểu chuyển đổi (tức là đắt).
Tuỳ chọn Dex2oat
Các tuỳ chọn này ảnh hưởng đến việc biên dịch trên thiết bị (còn gọi là dexopt) và một vài tuỳ chọn trong số đó cũng ảnh hưởng đến dexpreopt, trong khi các tuỳ chọn được thảo luận trong phần Cấu hình ROM hệ thống ở trên ảnh hưởng đến dexpreopt.
Các tuỳ chọn để kiểm soát việc sử dụng tài nguyên:
dalvik.vm.image-dex2oat-cpu-set
/dalvik.vm.image-dex2oat-threads
(cho đến Android 11): Số lượng luồng và tập hợp lõi CPU (xem bên dưới) để sử dụng cho hình ảnh khởi động.dalvik.vm.boot-dex2oat-threads
/dalvik.vm.boot-dex2oat-cpu-set
:- (cho đến Android 11) Số luồng và tập hợp lõi CPU (xem bên dưới) để sử dụng trong thời gian khởi động cho mọi thứ khác ngoài hình ảnh khởi động.
- (kể từ Android 12) Số luồng và tập hợp lõi CPU
(xem bên dưới) để sử dụng trong thời gian khởi động cho mọi thứ, kể cả hình ảnh khởi động.
- Cụ thể, kể từ Android 14, điều này tương ứng với
lớp ưu tiên
PRIORITY_BOOT
trong Dịch vụ ART.
- Cụ thể, kể từ Android 14, điều này tương ứng với
lớp ưu tiên
dalvik.vm.restore-dex2oat-threads
/dalvik.vm.restore-dex2oat-cpu-set
:- (từ Android 11 cho đến Android 13) số lượng luồng và bộ lõi CPU (xem bên dưới) dùng cho việc khôi phục từ đám mây sao lưu.
- (kể từ Android 14) Số luồng và tập hợp lõi CPU
(xem bên dưới) để sử dụng cho mọi tính năng nhạy cảm với độ trễ hơn bình thường, bao gồm
đang khôi phục từ bản sao lưu trên đám mây.
- Cụ thể, giá trị này tương ứng với lớp ưu tiên
PRIORITY_INTERACTIVE_FAST
trong Dịch vụ ART.
- Cụ thể, giá trị này tương ứng với lớp ưu tiên
dalvik.vm.background-dex2oat-threads
/dalvik.vm.background-dex2oat-cpu-set
(kể từ Android 14): Số luồng và tập hợp lõi CPU (xem bên dưới) để sử dụng trong nền.- Cụ thể, giá trị này tương ứng với lớp ưu tiên
PRIORITY_BACKGROUND
trong Dịch vụ ART.
- Cụ thể, giá trị này tương ứng với lớp ưu tiên
dalvik.vm.dex2oat-threads
/dalvik.vm.dex2oat-cpu-set
: Số lượng luồng và tập hợp lõi CPU dùng cho mọi hoạt động khác.
Bạn phải chỉ định tập hợp các lõi CPU dưới dạng danh sách mã CPU được phân tách bằng dấu phẩy. Ví dụ: để chạy trên dex2oat trên lõi CPU 0-3, đặt:
dalvik.vm.dex2oat-cpu-set=0,1,2,3
Khi đặt thuộc tính đối tượng chung sở thích cho CPU, bạn nên so khớp với thuộc tính tương ứng cho số lượng luồng dex2oat để khớp với số CPU đã chọn nhằm tránh bộ nhớ và I/O không cần thiết tranh chấp:
dalvik.vm.dex2oat-cpu-set=0,1,2,3 dalvik.vm.dex2oat-threads=4
Ngoài các thuộc tính hệ thống ở trên, bạn cũng có thể sử dụng hồ sơ tác vụ để kiểm soát cách sử dụng tài nguyên của dex2oat (xem Lớp trừu tượng nhóm).
Hồ sơ công việc được hỗ trợ bao gồm:
Dex2OatBackground
(kể từ Android 14) (theo mặc định kế thừaDex2OatBootComplete
): Kiểm soát các tài nguyên sẽ sử dụng ở chế độ nền.- Cụ thể, giá trị này tương ứng với lớp ưu tiên
PRIORITY_BACKGROUND
trong Dịch vụ ART.
- Cụ thể, giá trị này tương ứng với lớp ưu tiên
Dex2OatBootComplete
:- (cho đến Android 13) Kiểm soát tài nguyên để sử dụng cho mọi trường hợp sau khi khởi động.
- (kể từ Android 14) Kiểm soát tài nguyên để sử dụng cho mọi trường hợp
sau khi khởi động và không chạy trong nền.
- Cụ thể, giá trị này tương ứng với lớp ưu tiên
PRIORITY_INTERACTIVE_FAST
vàPRIORITY_INTERACTIVE
trong ART Dịch vụ.
- Cụ thể, giá trị này tương ứng với lớp ưu tiên
Khi cả thuộc tính hệ thống và hồ sơ tác vụ được chỉ định, cả hai đều có hiệu lực.
Các tuỳ chọn kiểm soát kích thước vùng nhớ khối xếp:
dalvik.vm.image-dex2oat-Xms
: Kích thước vùng nhớ khối xếp ban đầu cho hình ảnh khởi động.dalvik.vm.image-dex2oat-Xmx
: Kích thước vùng nhớ khối xếp tối đa cho hình ảnh khởi động.dalvik.vm.dex2oat-Xms
: Kích thước vùng nhớ khối xếp ban đầu cho mọi nội dung khác.dalvik.vm.dex2oat-Xmx
: Kích thước vùng nhớ khối xếp tối đa cho mọi nội dung khác.
Các tuỳ chọn kiểm soát kích thước vùng nhớ khối xếp ban đầu và tối đa cho
Không được giảm dex2oat
vì chúng có thể giới hạn số lượng
ứng dụng có thể được biên dịch.
Các tuỳ chọn để kiểm soát bộ lọc của trình biên dịch:
dalvik.vm.image-dex2oat-filter
(cho đến Android 11): Bộ lọc trình biên dịch cho hình ảnh khởi động. Kể từ Android 12, trình biên dịch bộ lọc cho hình ảnh khởi động luôn làspeed-profile
và không thể thay đổi.dalvik.vm.systemservercompilerfilter
(kể từ Android 13): Bộ lọc trình biên dịch cho máy chủ hệ thống. XemPRODUCT_SYSTEM_SERVER_COMPILER_FILTER
.dalvik.vm.systemuicompilerfilter
(kể từ Android 13): Bộ lọc trình biên dịch cho gói Giao diện người dùng hệ thống.dalvik.vm.dex2oat-filter
(cho đến Android 6): Bộ lọc trình biên dịch cho mọi nội dung khác.pm.dexopt.<reason>
(kể từ Android 7): Bộ lọc trình biên dịch cho mọi nội dung khác. Xem Cấu hình dịch vụ ART dành cho Android 14 trở lên, hoặc Cấu hình trình quản lý gói cho Android 13 trở xuống.
Các tuỳ chọn khác để kiểm soát việc biên dịch mọi thứ ngoài hình ảnh khởi động:
dalvik.vm.dex2oat-very-large
(kể từ Android 7.1): Tổng kích thước tệp dex tối thiểu tính theo byte để tắt tính năng biên dịch AOT.dalvik.vm.dex2oat-swap
(kể từ Android 7.1) (mặc định: true): Cho phép sử dụng hoán đổi cho dex2oat. Điều này có thể giúp tránh sự cố hết bộ nhớ. Xin lưu ý rằng ngay cả khi tuỳ chọn này là bật, dex2oat sẽ chỉ sử dụng tệp hoán đổi trong một số điều kiện nhất định, chẳng hạn như khi số tệp dex lớn và các điều kiện có thể thay đổi.dalvik.vm.ps-min-first-save-ms
(kể từ Android 12): thời gian tối thiểu để chờ trước khi thời gian chạy tạo hồ sơ của ứng dụng, lần đầu tiên khởi chạy ứng dụng.dalvik.vm.ps-min-save-period-ms
(kể từ Android 12): thời gian tối thiểu để chờ trước khi cập nhật hồ sơ của ứng dụng.dalvik.vm.dex2oat64.enabled
(kể từ Android 11) (mặc định: false): Liệu có sử dụng phiên bản 64 bit của dex2oat hay không.dalvik.vm.bgdexopt.new-classes-percent
(kể từ Android 12) (mặc định: 20): Tỷ lệ phần trăm tối thiểu (từ 0 đến 100) của các lớp mới trong một hồ sơ để kích hoạt quá trình biên dịch lại. Chỉ áp dụng cho quá trình biên dịch theo hướng dẫn của hồ sơ (speed-profile
), thường là trong dexopt ở chế độ nền. Xin lưu ý rằng chúng tôi cũng đặt ra một ngưỡng tối thiểu là 50 lớp học mới ngoài ngưỡng tỷ lệ phần trăm và không thể định cấu hình.dalvik.vm.bgdexopt.new-methods-percent
(kể từ Android 12) (mặc định: 20): Tỷ lệ phần trăm tối thiểu, từ 0 đến 100, của các phương thức mới trong một hồ sơ để kích hoạt quá trình biên dịch lại. Chỉ áp dụng cho quá trình biên dịch theo hướng dẫn của hồ sơ (speed-profile
), thường là trong dexopt ở chế độ nền. Lưu ý rằng ngoài ra còn có một ngưỡng gồm ít nhất 100 phương thức mới ngưỡng tỷ lệ phần trăm và không thể định cấu hình.dalvik.vm.dex2oat-max-image-block-size
(kể từ Android 10) (mặc định: 524288) Kích thước khối rắn tối đa cho hình ảnh nén. Một hình ảnh lớn được chia thành tập hợp hình khối các khối sao cho không có khối nào lớn hơn kích thước tối đa.dalvik.vm.dex2oat-resolve-startup-strings
(kể từ Android 10) (mặc định: true) Nếu true, lệnh dex2oat sẽ phân giải tất cả các chuỗi const được tham chiếu từ các phương thức được đánh dấu là "khởi động" trong hồ sơ.debug.generate-debug-info
(mặc định: false) Liệu có tạo thông tin gỡ lỗi cho hoạt động gỡ lỗi gốc hay không, chẳng hạn như gỡ bỏ ngăn xếp thông tin, ký hiệu ELF và các phần lùn.dalvik.vm.dex2oat-minidebuginfo
(kể từ Android 9) (mặc định: true) Liệu có tạo lượng thông tin gỡ lỗi được nén bằng LZMA tối thiểu hay không cần thiết để in các dấu vết ngược.
Tùy chọn dịch vụ ART
Kể từ Android 14, tính năng biên dịch AOT trên thiết bị cho các ứng dụng (còn gọi là dexopt) là do ART Service xử lý. Để biết thông tin về cách định cấu hình Dịch vụ ART, hãy xem Cấu hình Dịch vụ ART.Các tuỳ chọn của trình quản lý gói
Trước Android 14, tính năng biên dịch AOT trên thiết bị cho các ứng dụng (còn gọi là dexopt) là do trình quản lý gói xử lý. Để biết thông tin về cách định cấu hình trình quản lý gói cho dexopt, hãy xem Cấu hình trình quản lý gói.Cấu hình theo A/B cụ thể
Cấu hình ROM
Kể từ Android 7.0, các thiết bị có thể sử dụng 2 phân vùng hệ thống để bật Cập nhật hệ thống A/B. Để tiết kiệm kích thước phân vùng hệ thống, bạn có thể cài đặt các tệp đã chọn trước trong phân vùng hệ thống thứ hai không được sử dụng. Sau đó, các tệp này được sao chép vào phân vùng dữ liệu trong lần khởi động đầu tiên.
Ví dụ về cách sử dụng (trong device-common.mk
):
PRODUCT_PACKAGES += \ cppreopts.sh PRODUCT_PROPERTY_OVERRIDES += \ ro.cp_system_other_odex=1
Và trong BoardConfig.mk
của thiết bị:
BOARD_USES_SYSTEM_OTHER_ODEX := true
Lưu ý rằng mã đường dẫn lớp khởi động, mã máy chủ hệ thống và lõi dành riêng cho sản phẩm
ứng dụng luôn biên dịch vào phân vùng hệ thống. Theo mặc định, tất cả các tuỳ chọn khác
các ứng dụng sẽ được biên dịch sang phân vùng hệ thống thứ hai không dùng đến. Thông tin này có thể là
được kiểm soát bằng SYSTEM_OTHER_ODEX_FILTER
, có giá trị bằng
mặc định là:
SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
dexopt ở chế độ nền OTA
Trên các thiết bị hỗ trợ A/B, ứng dụng có thể được biên dịch ở chế độ nền trước khi khởi động lại bằng hình ảnh hệ thống mới. Xem phần Biên dịch ứng dụng trong nền để tùy ý đưa tập lệnh biên dịch và tệp nhị phân vào hình ảnh hệ thống. Chiến lược phát hành đĩa đơn bộ lọc biên dịch dùng cho quá trình biên dịch này được kiểm soát bằng:
pm.dexopt.ab-ota=speed-profile
Bạn nên sử dụng speed-profile
để tận dụng tính năng hướng dẫn hồ sơ
biên dịch và tiết kiệm bộ nhớ.
Tùy chọn JDWP
Việc tạo luồng Giao thức dây gỡ lỗi Java (JDWP) trong các bản dựng userdebug được kiểm soát thông qua
Thuộc tính hệ thống persist.debug.dalvik.vm.jdwp.enabled
. Theo mặc định, thuộc tính này
chưa được đặt và luồng JDWP chỉ được tạo cho các ứng dụng có thể gỡ lỗi. Để bật các luồng JDWP cho cả hai
Các ứng dụng có thể gỡ lỗi và không thể gỡ lỗi, hãy đặt persist.debug.dalvik.vm.jdwp.enabled
đến 1
. Bạn phải khởi động lại thiết bị để các thay đổi đối với thuộc tính có hiệu lực.
Để gỡ lỗi một ứng dụng không thể gỡ lỗi trên bản dựng userdebug, hãy bật JDWP bằng cách chạy lệnh sau :
Đối với các thiết bị chạy Android 13 trở xuống, thời gian chạy sẽ tạo JDWP cho các ứng dụng có thể gỡ lỗi và không thể gỡ lỗi trên các bản dựng userdebug. Điều này có nghĩa là bạn có thể để đính kèm trình gỡ lỗi hoặc lập hồ sơ cho bất kỳ ứng dụng nào trên các bản dựng userdebug.adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
adb reboot