Định cấu hình ART

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:

  1. 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.
  2. 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).
  3. 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.
  4. 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:

  1. 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.
  2. 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ịch speed 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.
    Có thể định cấu hình đến hết PRODUCT_SYSTEM_SERVER_COMPILER_FILTER (xem phần sau trong phần này tài liệu).
  • Ứ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ịch speed 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ịch verify 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
  • 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.

  • DONT_DEXPREOPT_PREBUILTS (Android 5 trở lên)
  • 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 (Android 9) trở lên)
  • 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.

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (kể từ Android 8 MR1)
  • 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.

  • LOCAL_DEX_PREOPT
  • 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ệ.

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • 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.

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • 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.

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • 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_MODULELOCAL_PACKAGE cho tệp JAR và APK tương ứng.

  • PRODUCT_DEXPREOPT_SPEED_APPS (kể từ Android 8)
  • 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.

  • PRODUCT_SYSTEM_SERVER_APPS (kể từ Android 8)
  • 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.

  • PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD (kể từ Android 8)
  • 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.

  • WITH_DEXPREOPT_PIC (cho đến Android 7)
  • 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.

  • WITH_DEXPREOPT_BOOT_IMG_ONLY (cho đến Android 7 MR1)
  • 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.

  • PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
  • 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.

    • (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ịch speed đượ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ịch speed sẽ được sử dụng.
    • Nếu bạn đặt thành speed-profile, bộ lọc trình biên dịch speed-profile sẽ được dùng, hoặc bộ lọc trình biên dịch verify 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ịch verify 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
  • 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

    • (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ủa SYSTEMSERVERCLASSPATH). Đ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ủa SYSTEMSERVERCLASSPATH). Đị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 qua SystemServiceManager.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 qua SystemServiceManager.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.

    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ả khi dalvik.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ịch speed-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ới verify. 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.
    • 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.
    • 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.
    • 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ừa Dex2OatBootComplete): 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.
    • 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_FASTPRIORITY_INTERACTIVE trong ART Dịch vụ.

    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. Xem PRODUCT_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 :

      adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
      adb reboot
      
    Đố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.