Trang này thảo luận về cách cấu hình ART và các tùy chọn biên dịch của nó. Các chủ đề được đề cập ở đây bao gồm cấu hình biên dịch trước hình ảnh hệ thống, các tùy chọn biên dịch dex2oat và 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 , định dạng Dalvik Executable và các trang còn lại trên source.android.com để làm việc với ART. Xem phần Xác minh hành vi ứng dụng trên Android Runtime (ART) để đảm bảo ứng dụng của bạn hoạt động bình thường.
Cách thức hoạt động của ART
ART sử dụng tính năng biên dịch trước thời hạn (AOT) và bắt đầu từ Android 7.0 (Nougat hoặc N), nó sử dụng kết hợp kết hợp giữa biên dịch AOT, biên dịch kịp thời (JIT) và biên dịch hướng dẫn hồ sơ. Sự kết hợp của tất cả các chế độ biên dịch này có thể cấu hình được và sẽ được thảo luận trong phần này. Ví dụ: thiết bị Pixel được định cấu hình với quy trình biên dịch sau:
- Một ứng dụng được cài đặt ban đầu mà không có bất kỳ biên dịch AOT nào. Trong vài lần đầu tiên ứng dụng chạy, nó sẽ được thông dịch và các phương thức thường được thực thi được biên dịch JIT.
- Khi thiết bị ở chế độ chờ và đang sạc, một daemon biên dịch sẽ chạy tới AOT-biên dịch mã được sử dụng thường xuyên dựa trên cấu hình được tạo trong lần chạy đầu tiên.
- Lần khởi động lại ứng dụng tiếp theo sử dụng mã hướng dẫn hồ sơ và tránh thực hiện biên dịch JIT trong thời gian chạy đối với các phương thức đã được biên dịch. Các phương thức được biên dịch JIT trong quá trình chạy mới được thêm vào hồ sơ, sau đó sẽ được chọn bởi daemon 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 để khởi động Zygote. Công cụ dex2oat
lấy một tệp APK và tạo một hoặc nhiều tệp cấu phần biên dịch mà thời gian chạy tải. Số lượng tệp, phần mở rộng và tên của chúng có thể thay đổi giữa các bản phát hành, nhưng kể từ bản phát hành Android 8, các tệp đang được tạo là:
-
.vdex
: chứa mã DEX không nén của APK, với một số siêu dữ liệu bổ sung để tăng tốc độ xác minh. -
.odex
: chứa mã được biên dịch AOT cho các phương thức trong APK. -
.art (optional)
: chứa các biểu diễn nội bộ ART của một số chuỗi và lớp được liệt kê trong APK, được sử dụng để tăng tốc độ khởi động ứng dụng.
Tùy chọn biên dịch
Các lựa chọn biên dịch cho ART gồm hai loại:
- Cấu hình ROM hệ thống: mã nào được biên dịch AOT khi xây dựng 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 các ứng dụng trên thiết bị.
Một tùy chọn ART cốt lõi để định cấu hình hai danh mục này là bộ lọc trình biên dịch . Bộ lọc trình biên dịch thúc đẩy cách ART biên dịch mã DEX và là một tùy chọn được chuyển đến công cụ dex2oat
. Bắt đầu từ Android 8, có bốn bộ lọc được hỗ trợ chính thức:
-
verify
: chỉ chạy xác minh mã DEX. -
quicken
: (bị gỡ bỏ kể từ Android 12) chạy xác minh mã DEX và tối ưu hóa một số hướng dẫn DEX để có được hiệu suất thông dịch viên tốt hơn. -
speed
: chạy xác minh mã DEX và biên dịch AOT tất cả các phương pháp. -
speed-profile
: chạy phương pháp xác minh mã DEX và biên dịch AOT được liệt kê trong tệp hồ sơ.
Cấu hình ROM hệ thống
Có một số tùy chọn xây dựng ART có sẵn để định cấu hình ROM hệ thống. Cách bạn định cấu hình các tùy 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 ứng dụng được cài đặt sẵn. Các JAR / APK được biên dịch thành ROM hệ thống có thể được chia thành bốn loại:
- Mã khởi động classpath: được biên dịch với 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
sau trong tài liệu này):- (kể từ Android 14 (thử nghiệm AOSP)) được biên dịch với bộ lọc trình biên dịch
speed-profile
theo mặc định hoặc được biên dịch với bộ lọc trình biên dịchspeed
nếu cấu hình không được cung cấp. - (cho đến Android 13) được biên dịch với bộ lọc trình biên dịch
speed
theo mặc định.
PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
(xem phần sau của tài liệu này). - (kể từ Android 14 (thử nghiệm AOSP)) được biên dịch với bộ lọc trình biên dịch
- Các ứng dụng cốt lõi dành riêng cho sản phẩm (xem
PRODUCT_DEXPREOPT_SPEED_APPS
ở phần sau của tài liệu này): đượ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 với bộ lọc trình biên dịch
speed-profile
theo mặc định hoặc được biên dịch với bộ lọc trình biên dịchverify
nếu cấu hình không được cung cấp.Có thể định cấu hình thông qua
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
(xem sau trong tài liệu này).
Tùy chọn Makefile
-
WITH_DEXPREOPT
-
DONT_DEXPREOPT_PREBUILTS
(kể từ Android 5) -
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
(kể từ Android 9) -
WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
(mới trong 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 (New in Android 8)
-
PRODUCT_SYSTEM_SERVER_APPS (New in Android 8)
-
PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD(Post Android 8)
-
WITH_DEXPREOPT_PIC (Removed in Android 8)
-
WITH_DEXPREOPT_BOOT_IMG_ONLY
(bị xóa trong Android 8 MR1) -
PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
- (kể từ Android 14 (thử nghiệm AOSP)) Nếu không được chỉ định, bộ lọc trình biên dịch
speed-profile
sẽ được sử dụng hoặc bộ lọc trình biên dịchspeed
được sử dụng nếu cấu hình không được cung cấp. - (cho đến Android 13) Nếu không được chỉ định, bộ lọc trình biên dịch
speed
sẽ được sử dụng. - Nếu được đặt thành
speed
, bộ lọc trình biên dịchspeed
sẽ được sử dụng. - Nếu được đặt thành
speed-profile
speed-profile
sẽ được sử dụng hoặc bộ lọc trình biên dịchverify
được sử dụng nếu cấu hình không được cung cấp. - Nếu được đặt để
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 chum classpath của máy chủ hệ thống trên nền tảng (tức là như một phần củaSYSTEMSERVERCLASSPATH
). Cần thêm các lọ classpath của máy chủ hệ thống vào danh sách này. Không thêm được các lọ đường dẫn đường dẫn máy chủ hệ thống vào danh sách dẫn đến việc các lọ đó không được tải. - (bắt buộc)
PRODUCT_APEX_SYSTEM_SERVER_JARS
: Danh sách các lọ đường dẫn đường dẫn máy chủ hệ thống được phân phối qua apex (tức là như một phần củaSYSTEMSERVERCLASSPATH
). Định dạng là<apex name>:<jar name>
. Cần thêm các chum classpath của máy chủ hệ thống apex vào danh sách này. Không thêm được các chum classpath của máy chủ hệ thống apex vào danh sách này dẫn đến các bình đó không được tải. - (tùy chọn, kể từ Android 13)
PRODUCT_STANDALONE_SYSTEM_SERVER_JARS
: Danh sách các lọ mà máy chủ hệ thống tải động bằng các trình tải lớp riêng biệt (thông quaSystemServiceManager.startServiceFromJar
). Việc thêm các chum máy chủ hệ thống độc lập vào danh sách này là không bắt buộc nhưng được khuyến khích thực sự vì nó làm cho các chum được biên dịch và 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 lọ được phân phối qua apex mà máy chủ hệ thống tải động bằng cách sử dụ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>
. Cần thêm các lọ máy chủ hệ thống đỉnh độc lập vào danh sách này. Không thêm các chum máy chủ hệ thống đỉnh độc lập vào danh sách này dẫn đến lỗi khởi động. - Danh sách các lớp được tải trước
dex2oat
có được gọi trên mã DEX được cài đặt trên hình ảnh hệ thống hay không. Được bật theo mặc định.
Việc kích hoạt DONT_DEXPREOPT_PREBUILTS
ngăn các bản dựng sẵn được tối ưu hóa trước. Đây là những ứng dụng đã include $(BUILD_PREBUILT)
được chỉ định trong Android.mk
của chúng. Việc bỏ qua tối ưu hóa trước các ứng dụng có sẵn có khả năng được cập nhật qua Google Play giúp 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 tùy chọn này không ảnh hưởng đến các ứng dụng dựng 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 tối ưu hóa trước. Các ứng dụng này được xác định trong Android.bp
hoặc include $(BUILD_PREBUILT)
được chỉ định trong Android.mk
của chúng. Nếu không được chỉ định, giá trị mặc định là speed-profile
hoặc verify
nếu giá trị không được chỉ định và cấu hình không được cung cấp.
Việc kích hoạt WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
chỉ tối ưu hóa trước các chum classpath khởi động và máy chủ hệ thống.
Tối ưu hóa trước cũng có thể được bật hoặc tắt trên cơ sở ứng dụng riêng lẻ bằng cách chỉ định tùy chọn LOCAL_DEX_PREOPT
trong định nghĩa mô-đun. Điều này có thể hữu ích để tắt tính năng tối ưu hóa trước của các ứng dụng có thể nhận ngay các bản cập nhật của Google Play vì các bản cập nhật sẽ làm cho mã được tối ưu hóa trước trong hình ảnh hệ thống bị lỗi thời. Điều này cũng hữu ích để tiết kiệm dung lượng trên các OTA nâng cấp phiên bản chính vì người dùng có thể đã có cá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 tính năng tối ưu hóa trước tương ứng. Ngoài ra, 'nostripping' có thể được chỉ định nếu việc tối ưu hóa trước không nên tách tệp classes.dex
khỏi tệp APK hoặc JAR. Thông thường, tệp này sẽ bị loại bỏ vì nó không còn cần thiết sau khi tối ưu hóa trước, nhưng tùy 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 còn hiệu lực.
Chuyển các tùy chọn cho dex2oat
để kiểm soát cách hình ảnh khởi động được biên dịch. Nó có thể được sử dụng để chỉ định danh sách các lớp hình ảnh tùy chỉnh, danh sách các lớp đã biên dịch và bộ lọc trình biên dịch.
Chuyển các tùy chọn cho dex2oat
để kiểm soát cách mọi thứ ngoài hình ảnh khởi động được biên dịch.
Cung cấp khả năng vượt qua các tùy chọn dex2oat
cho một mô-đun và cấu hình sản phẩm cụ thể. Nó được đặt trong tệp device.mk
của sản phẩm bằng $(call add-product-dex-preopt-module-config,<modules>,<option>)
trong đó <modules>
là danh sách các tên LOCAL_MODULE và LOCAL_PACKAGE cho JAR và APK các tệp, tương ứng.
Danh sách các ứng dụng đã được xác định là cốt lõi của sản phẩm và được mong muốn biên dịch với bộ lọc trình biên dịch speed
. Ví dụ: các ứng dụng liên tục như SystemUI chỉ có cơ hội sử dụng tính năng biên dịch theo hướng dẫn cấu hình khi khởi động lại tiếp theo, vì vậy, sản phẩm có thể tốt hơn nếu các ứng dụng này luôn được biên dịch RẤT NHIỀU.
Danh sách các ứng dụng được tải bởi máy chủ hệ thống. Các ứng dụng này được biên dịch theo mặc định với bộ lọc trình biên dịch speed
.
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, tính năng này được kích hoạt cho các bản dựng của userdebug và eng. Hành vi có thể được ghi đè bằng cách đặt tùy chọn thành true
hoặc false
một cách rõ ràng.
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ị trí (PIC). Với điều này, mã đã biên dịch từ hình ảnh không phải di dời từ / system sang / data / dalvik-cache, tiết kiệm không gian trong phân vùng dữ liệu. Tuy nhiên, có một tác động nhỏ trong thời gian chạy vì nó vô hiệu hóa tính năng tối ưu hóa tận dụng 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 trong / dữ liệu nên kích hoạt biên dịch PIC.
Trong Android 7.0, biên dịch PIC được bật theo mặc định.
Tùy chọn này đã được thay thế bằng WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY, tùy chọn này cũng mở trước các chum máy chủ hệ thống.
Tùy chọn này chỉ định bộ lọc trình biên dịch cho máy chủ hệ thống.
Sau đây là danh sách các lọ được tải bởi máy chủ hệ thống. Các bình được biên dịch với bộ lọc trình biên dịch do PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
chỉ định
Cấu hình classpath khởi động
Danh sách lớp được tải trước là danh sách các lớp mà hợp tử khởi tạo khi khởi động. Điều này giúp mỗi ứng dụng không phải chạy các trình khởi tạo lớp này riêng biệt, cho phép chúng khởi động nhanh hơn và chia sẻ các trang trong bộ nhớ. Tệp danh sách các lớp được tải trước được đặt tại frameworks/base/config/preloaded-classes
theo mặc định và nó chứa một danh sách được điều chỉnh để sử dụng trên điện thoại thông thường. Điều này có thể khác đối với các thiết bị khác 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 điều này; thêm quá nhiều lớp sẽ lãng phí bộ nhớ khi các lớp không sử dụng được tải. Thêm quá ít lớp buộc mỗi ứng dụng phải có bản sao của riêng nó, điều này lại gây lãng phí bộ nhớ.
Cách sử dụng ví dụ (trong product.mk của sản phẩm):
PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
Lưu ý: Dòng này phải được đặt trước khi kế thừa bất kỳ cấu hình cấu hình sản phẩm nào lấy cấu hình mặc định từ: build/target/product/base.mk
Cấu hình thời gian chạy
Tùy chọn jit
Các tùy chọn sau chỉ ảnh hưởng đến các bản phát hành Android khi có sẵn trình biên dịch ART JIT.
- dalvik.vm.usejit: JIT có được bật hay không.
- dalvik.vm.jitinitialsize (mặc định 64K): dung lượng ban đầu của bộ đệm mã. Bộ đệm mã sẽ thường xuyên GC và tăng lên nếu cần.
- dalvik.vm.jitmaxsize (mặc định 64M): dung lượng tối đa của bộ đệm mã.
- dalvik.vm.jitthreshold: (mặc định 10000) - Đây là ngưỡng mà bộ đếm "độ nóng" của một phương thức cần vượt qua để phương thức được biên dịch JIT. Bộ đếm "độ nóng" là một số liệu bên trong thời gian chạy. Nó bao gồm số lượng cuộc gọi, các nhánh lùi và các yếu tố khác.
- dalvik.vm.usejitprofiles: có hay không kích hoạt cấu hình JIT; điều này có thể được sử dụng ngay cả khi dalvik.vm.usejit là sai. Lưu ý rằng nếu điều này là sai,
speed-profile
bộ lọc trình biên dịch không AOT-biên dịch bất kỳ phương pháp nào và tương đương vớiverify
. - dalvik.vm.jitprithreadweight (mặc định là dalvik.vm.jitthreshold / 20) - Trọng lượng của các "mẫu" JIT (xem jitthreshold) cho chuỗi giao diện người dùng ứng dụng. Sử dụng để tăng tốc độ biên dịch các phương pháp ảnh hưởng trực tiếp đến trải nghiệm của người dùng khi tương tác với ứng dụng.
- dalvik.vm.jittransitionweight: (mặc định là dalvik.vm.jitthreshold / 10) trọng số của lệnh gọi phương thức chuyển đổi giữa mã biên dịch và trình thông dịch. Điều này giúp đảm bảo các phương pháp liên quan được biên dịch để giảm thiểu quá trình chuyển đổi (tốn kém).
Tùy chọn trình quản lý gói
Kể từ Android 7.0, có một cách chung để chỉ định mức độ biên dịch / xác minh đã xảy ra ở các giai đoạn khác nhau. Các mức biên dịch có thể được cấu hình thông qua các thuộc tính hệ thống với các giá trị mặc định là:
-
pm.dexopt.install=speed-profile
-
pm.dexopt.bg-dexopt=speed-profile
-
pm.dexopt.boot-after-ota=verify
-
pm.dexopt.first-boot=verify
Bộ lọc biên dịch lần đầu tiên thiết bị khởi động. Bộ lọc được sử dụng ở đây chỉ ảnh hưởng đến thời gian khởi động sau khi xuất xưởng. Chúng tôi khuyên bạn nên
verify
bộ lọc để tránh mất nhiều thời gian trước khi người dùng sử dụng điện thoại lần đầu tiên. Lưu ý rằng nếu tất cả các ứng dụng trong hình ảnh hệ thống đã được biên dịch vớiverify
,speed-profile
tốc độ hoặcspeed
với ngữ cảnh trình tải lớp phù hợp,pm.dexopt.first-boot
sẽ không có hiệu lực.
Đây là bộ lọc biên dịch được sử dụng khi cài đặt ứng dụng thông qua Google Play. Chúng tôi khuyên bạn nên đặt bộ lọc cài đặt thành cấu hình tốc độ để cho phép sử dụng cấu hình từ tệp siêu dữ liệu dex. Lưu ý rằng nếu một hồ sơ không được cung cấp hoặc nếu hồ sơ đó trống, thì tốc độ tương đương với xác minh.
Đây là bộ lọc biên dịch được sử dụng khi thiết bị không hoạt động, đang sạc và đã sạc đầy. Hãy thử bộ lọc trình biên dịch speed-profile
để tận dụng khả năng biên dịch theo hướng dẫn hồ sơ và tiết kiệm dung lượng lưu trữ.
Bộ lọc biên dịch được sử dụng sau khi cập nhật qua mạng. Chúng tôi thực sự khuyên bạn nên sử dụng bộ lọc trình biên dịch verify
cho tùy chọn này để tránh thời gian khởi động quá lâu.
Tùy chọn Dex2oat
Lưu ý rằng các tùy chọn này ảnh hưởng đến dex2oat
trong quá trình biên dịch trên thiết bị cũng như trong quá trình tối ưu hóa trước, trong khi hầu hết các tùy chọn được thảo luận ở trên chỉ ảnh hưởng đến việc tối ưu hóa trước.
Để kiểm soát dex2oat
trong khi biên dịch hình ảnh khởi động:
- dalvik.vm.image-dex2oat-Xms: kích thước heap ban đầu
- dalvik.vm.image-dex2oat-Xmx: kích thước heap tối đa
- dalvik.vm.image-dex2oat-filter: tùy chọn bộ lọc trình biên dịch
- dalvik.vm.image-dex2oat-thread: số lượng chủ đề sẽ sử dụng
Để kiểm soát dex2oat
trong khi biên dịch mọi thứ ngoài hình ảnh khởi động:
- dalvik.vm.dex2oat-Xms: kích thước heap ban đầu
- dalvik.vm.dex2oat-Xmx: kích thước heap tối đa
- dalvik.vm.dex2oat-filter: tùy chọn bộ lọc trình biên dịch
Trên các bản phát hành thông qua Android 6.0, một tùy chọn bổ sung được cung cấp để biên dịch mọi thứ ngoài hình ảnh khởi động:
- dalvik.vm.dex2oat-thread: số lượng chủ đề sẽ sử dụng
Bắt đầu với Android 6.1, đây trở thành hai tùy chọn bổ sung để biên dịch mọi thứ ngoài hình ảnh khởi động:
- dalvik.vm.boot-dex2oat-thread: số lượng chủ đề sẽ sử dụng trong thời gian khởi động
- dalvik.vm.dex2oat-thread: số lượng chủ đề sẽ sử dụng sau thời gian khởi động
Bắt đầu với Android 7.1, hai tùy chọn được cung cấp để kiểm soát cách bộ nhớ được sử dụng khi biên dịch mọi thứ ngoài hình ảnh khởi động:
- dalvik.vm.dex2oat-very-large: tổng kích thước tệp dex tối thiểu tính bằng byte để tắt biên dịch AOT
- dalvik.vm.dex2oat-swap: sử dụng tệp hoán đổi dex2oat (dành cho thiết bị có bộ nhớ thấp)
Không nên giảm các tùy chọn kiểm soát kích thước heap ban đầu và tối đa cho dex2oat
vì chúng có thể giới hạn những ứng dụng nào có thể được biên dịch.
Bắt đầu với Android 11, ba tùy chọn sở thích CPU được cung cấp để cho phép giới hạn các luồng trình biên dịch trong một nhóm CPU cụ thể:
- dalvik.vm.boot-dex2oat-cpu-set: CPU chạy các luồng dex2oat trong thời gian khởi động
- dalvik.vm.image-dex2oat-cpu-set: CPU chạy dex2oat trong khi biên dịch hình ảnh khởi động
- dalvik.vm.dex2oat-cpu-set: CPU chạy các luồng dex2oat sau thời gian khởi động
Các CPU phải được chỉ định dưới dạng danh sách id CPU được phân tách bằng dấu phẩy. Ví dụ để chạy trên dex2oat trên CPU 0-3, hãy đặt:
dalvik.vm.dex2oat-cpu-set=0,1,2,3
Khi đặt thuộc tính ái lực của CPU, chúng tôi khuyên bạn nên so khớp thuộc tính tương ứng với số luồng dex2oat để khớp với số CPU đã chọn để tránh bộ nhớ không cần thiết và tranh chấp I / O:
dalvik.vm.dex2oat-cpu-set=0,1,2,3 dalvik.vm.dex2oat-threads=4
Bắt đầu với Android 12, các tùy chọn sau đã được thêm vào:
- dalvik.vm.ps-min-first-save-ms: thời gian chờ thời gian chạy để tạo cấu hình của ứng dụng, lần đầu tiên ứng dụng được khởi chạy
- dalvik.vm.ps-min-save-period-ms: thời gian tối thiểu để đợi trước khi cập nhật hồ sơ của một ứng dụng
- dalvik.vm.systemservercompilerfilter: bộ lọc trình biên dịch mà thiết bị sử dụng khi biên dịch lại máy chủ hệ thống
Cấu hình A / B cụ thể
Cấu hình ROM
Bắt đầu từ Android 7.0, các thiết bị có thể sử dụng hai phân vùng hệ thống để kích hoạ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, các tệp được mở sẵn có thể được cài đặt trong phân vùng hệ thống thứ hai không sử dụng. Sau đó, chúng được sao chép vào phân vùng dữ liệu trong lần khởi động đầu tiên.
Cách sử dụng ví dụ (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ã classpath khởi động, mã máy chủ hệ thống và các ứng dụng lõi dành riêng cho sản phẩm luôn biên dịch thành phân vùng hệ thống. Theo mặc định, tất cả các ứng dụng khác được biên dịch vào phân vùng hệ thống thứ hai không được sử dụng. Điều này có thể được kiểm soát bằng SYSTEM_OTHER_ODEX_FILTER
, có giá trị theo mặc định là:
SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
Nền dexopt OTA
Với các thiết bị hỗ trợ A / B, các ứng dụng có thể được biên dịch trong nền để cập nhật lên hình ảnh hệ thống mới. Xem phần Biên dịch ứng dụng trong nền để tùy chọn bao gồm tập lệnh biên dịch và các tệp nhị phân trong hình ảnh hệ thống. Bộ lọc biên dịch được sử dụng cho biên dịch này được điều khiển bằng:
pm.dexopt.ab-ota=speed-profile
Chúng tôi khuyên bạn nên sử dụng speed-profile
để tận dụng lợi thế của việc biên dịch có hướng dẫn hồ sơ và tiết kiệm dung lượng lưu trữ.