Định cấu hình ART

Trang này thảo luận về cách định cấu hình môi trường thời gian chạy Android (ART) và các tuỳ chọn biên dịch của môi trường này. Các chủ đề được đề cập ở đây bao gồm cấu hình biên dịch trước của hình ảnh hệ thống, các tuỳ 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 cũng như định dạng có thể thực thi Dalvik để làm việc với ART. Hãy 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 (AOT) và bắt đầu từ Android 7, ART sử dụng kết hợp kết hợp giữa tính năng biên dịch AOT, biên dịch đúng thời điểm (JIT) và diễn giải, đồng thời tính năng biên dịch AOT có thể được hướng dẫn theo cấu hình. Bạn có thể định cấu hình tổ hợp của tất cả các chế độ thực thi này và sẽ được thảo luận trong phần này. Ví dụ: các thiết bị Pixel được định cấu hình để hoạt động theo quy trình sau:

  1. Ban đầu, ứng dụng được cài đặt bằng tệp siêu dữ liệu dex (.dm) do Cửa hàng Play phân phối, trong đó chứa hồ sơ trên đám mây. ART AOT biên dịch các phương thức được liệt kê trong hồ sơ trên đám mây. 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 được 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 AOT sẽ được diễn giải. Trong số các phương thức được diễn giải, những phương thức thường xuyên được thực thi sẽ được biên dịch JIT. 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ó).
  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 tiếp theo của ứng dụng, ART sử dụng các cấu phần phần mềm do trình nền biên dịch tạo ra, chứa nhiều mã được biên dịch AOT hơn so với các mã được tạo trong quá trình biên dịch. Các phương thức không được biên dịch AOT vẫn được diễn giải hoặc biên dịch JIT. ART cập nhật quá trình cài đặt hồ sơ dựa trên quá trình thực thi, sau đó hồ sơ sẽ được các lần chạy tiếp theo của trình nền biên dịch thu thập.

ART bao gồm một trình biên dịch (công cụ dex2oat) và một môi trường thời gian chạy (libart.so) được tải trong quá trình khởi động. 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 phần mềm biên dịch mà thời gian chạy tải. Số lượng tệp, đuôi tệp và tên tệp 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 này sẽ được tạo:

  • .vdex: chứa một số siêu dữ liệu bổ sung để tăng tốc quá trình xác minh, đôi khi cùng với mã DEX không nén của tệp APK.
  • .odex: chứa mã được biên dịch AOT cho các phương thức trong tệp APK.
  • .art (optional) chứa nội dung đại diện nội bộ của ART cho một số chuỗi và lớp được liệt kê trong APK, dùng để tăng tốc quá trình khởi động ứng dụng.

Tuỳ chọn biên dịch

Có hai danh mục tuỳ 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 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 một thiết bị.

Bộ lọc trình biên dịch

Một tuỳ 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 điều khiển cách ART biên dịch mã DEX và là một tuỳ chọn đượ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 quy trình xác minh mã DEX (không biên dịch AOT).
  • quicken: (Android 11 trở xuống) Chạy quy trình xác minh mã DEX và tối ưu hoá một số lệnh DEX để có hiệu suất trình thông dịch tốt hơn.
  • speed: Chạy quy trình xác minh mã DEX và biên dịch trước tất cả phương thức. Không tối ưu hoá việc tải lớp cho bất kỳ lớp nào.
  • speed-profile: Chạy quy trình xác minh mã DEX, biên dịch AOT các phương thức được liệt kê trong hồ sơ và tối ưu hoá tải lớp cho các lớp trong hồ sơ.

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 AOT khi hình ảnh hệ thống đang được tạo. Quá trình này được gọi là dexpreopt. Bạn có thể sử dụng các tệp đã biên dịch đó miễn là tất cả phần phụ thuộc không thay đổi, đặc biệt là đường dẫn lớp khởi động.

Lưu ý: Nếu thiết bị nhận bản cập nhật mô-đun hệ thống, thì rất có thể đường dẫn lớp khởi động sẽ thay đổi trong bản cập nhật tiếp theo, khiến tất cả tệp dexpreopt trở nên 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 định cấu hình các tuỳ chọn này phụ thuộc vào không gian 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 tệp JAR/APK được biên dịch thành ROM hệ thống có thể được chia 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 của tài liệu này):
    • (Android 14 trở lên) Đượ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 speed nếu không cung cấp hồ sơ.
    • (Android 13 trở xuống) Được biên dịch bằng bộ lọc trình biên dịch speed theo mặc định.
    Có thể định cấu hình thông qua PRODUCT_SYSTEM_SERVER_COMPILER_FILTER (xem phần sau trong tài liệu này).
  • Ứ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 bằng bộ lọc trình biên dịch speed theo mặc định.
  • Tất 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 không cung cấp hồ sơ.

    Có thể định cấu hình thông qua PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (xem phần sau trong tài liệu này).

Tuỳ chọn Makefile

  • WITH_DEXPREOPT
  • Liệu dex2oat có được gọi trên mã DEX được cài đặt trên hình ả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 các tệp tạo sẵn được chọn trước. Đây là những ứng dụng có include $(BUILD_PREBUILT) được chỉ định trong Android.mk. Việc bỏ qua tính năng dexpreopt của các ứng dụng tạo sẵn có khả năng được cập nhật thông qua Google Play sẽ giúp tiết kiệm dung lượng trong hình ảnh hệ thống nhưng sẽ làm tăng thời gian khởi động đầu tiên. Xin lưu ý rằng tuỳ chọn này không ảnh hưởng đế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 dexpreopt. 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. Nếu không được chỉ định, giá trị mặc định sẽ là speed-profile hoặc verify nếu giá trị không được chỉ định và bạn không cung cấp hồ sơ.

  • 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 lớp đường dẫn khởi động và các tệp jar máy chủ hệ thống.

  • LOCAL_DEX_PREOPT
  • Bạn cũng có thể bật hoặc tắt Dexpreopt trên cơ sở từng ứng dụng bằng cách chỉ định tuỳ chọn LOCAL_DEX_PREOPT trong định nghĩa mô-đun. Điều này có thể hữu ích khi tắt tính năng dexpreopt của các ứng dụng có thể nhận được bản cập nhật Google Play ngay lập tức vì các bản cập nhật sẽ khiến mã dexpreopt trong hình ảnh hệ thống trở nên lỗi thời. Điều này cũng hữu ích để tiết kiệm dung lượng trên các bản cập nhật OTA phiên bản lớn 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 dexpreopt tương ứng. Ngoài ra, bạn có thể chỉ định nostripping nếu dexpreopt không nên xoá tệp classes.dex khỏi tệp APK hoặc JAR. Thông thường, tệp này sẽ bị xoá vì không còn cần thiết sau khi dexpreopt, nhưng tuỳ 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 biên dịch hình ảnh khởi động. Bạn có thể dùng lớp này để chỉ định danh sách lớp hình ảnh tuỳ chỉnh, danh sách lớp biên dịch và bộ lọc trình biên dịch.

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • Truyền các tuỳ chọn đến dex2oat để kiểm soát cách biên dịch mọi thứ ngoài hình ảnh khởi động.

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • Cung cấp khả năng truyền các tuỳ chọn dex2oat cho một mô-đun và cấu hình sản phẩm cụ thể. Giá trị này đượ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 tên LOCAL_MODULELOCAL_PACKAGE tương ứng cho tệp JAR và APK.

  • PRODUCT_DEXPREOPT_SPEED_APPS (kể từ Android 8)
  • 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ần được biên dịch bằng bộ lọc trình biên dịch speed. Ví dụ: các ứng dụng ổn định như SystemUI chỉ có cơ hội sử dụng tính năng biên dịch theo hướng dẫn hồ sơ trong lần khởi động lại tiếp theo, vì vậy, sản phẩm nên luôn biên dịch các ứng dụng này theo phương thức AOT.

  • PRODUCT_SYSTEM_SERVER_APPS (kể từ Android 8)
  • Danh sách ứng dụng do máy chủ hệ thống tải. Theo mặc định, các ứng dụng này được biên dịch 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ó đưa phiên bản gỡ lỗi của ART vào thiết bị hay không. Theo mặc định, tính năng này được bật cho các bản dựng userdebug và eng. Bạn có thể ghi đè hành vi này bằng cách đặt tuỳ 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.

  • WITH_DEXPREOPT_PIC (cho đến Android 7)
  • Trong Android 5.1.0 đến Android 6.0.1, bạn có thể chỉ định WITH_DEXPREOPT_PIC để bật mã độc lập với vị trí (PIC). Nhờ đó, mã biên dịch từ hình ảnh không cần phải được di chuyển từ /system sang /data/dalvik-cache, giúp tiết kiệm dung lượng trong phân vùng dữ liệu. Tuy nhiên, điều này sẽ ảnh hưởng nhẹ đến thời gian chạy vì tính năng này sẽ tắt tính năng tối ưu hoá 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 /data phải 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)
  • Tuỳ chọn này được thay thế bằng WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY cũng chọn 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 trình biên dịch cho máy chủ hệ thống.

    • (Android 14 trở lên) Nếu không 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ịch speed sẽ được sử dụng nếu không cung cấp hồ sơ.
    • (Android 13 trở xuống) Nếu không 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ịch speed sẽ được sử dụng.
    • Nếu được đặt thành speed-profile, 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ịch verify sẽ được sử dụng nếu không có hồ sơ nào được cung cấp.
    • Nếu được đặ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 tệp JAR đường dẫn lớp của máy chủ hệ thống trên nền tảng (tức là một phần của SYSTEMSERVERCLASSPATH). Bạn phải thêm tệp JAR đường dẫn lớp của máy chủ hệ thống vào danh sách này. Việc không thêm các tệp JAR đường dẫn lớp máy chủ hệ thống vào danh sách sẽ khiến các tệp JAR đó không được tải.
    • (Bắt buộc) PRODUCT_APEX_SYSTEM_SERVER_JARS: Danh sách tệp JAR trong đường dẫn lớp 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>. Bạn bắt buộc phải thêm các tệp JAR đường dẫn lớp máy chủ hệ thống APEX vào danh sách này. Nếu không thêm các tệp JAR đường dẫn lớp máy chủ hệ thống APEX vào danh sách này, thì các tệp JAR đó sẽ 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 động bằng cách sử dụng trình tải lớp riêng biệt (thông qua SystemServiceManager.startServiceFromJar). Bạn không bắt buộc phải thêm tệp JAR của máy chủ hệ thống độc lập vào danh sách này nhưng nên làm như vậy vì việc này giúp biên dịch các tệp JAR 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 tệp JAR được phân phối bằng APEX mà máy chủ hệ thống tải động bằng 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>. Bạn phải 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. Việc không thêm được tệp JAR của máy chủ hệ thống APEX độc lập 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 lớp được tải trước là danh sách các lớp mà Zygote khởi chạy khi khởi động. Điều này giúp mỗi ứng dụng không phải chạy riêng các trình khởi tạo lớp này, cho phép các ứng dụng khởi động nhanh hơn và chia sẻ các trang trong bộ nhớ. Theo mặc định, tệp danh sách lớp được tải trước nằm ở frameworks/base/config/preloaded-classes và chứa danh sách được điều chỉnh cho phù hợp với việc 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 như thiết bị đeo 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; việc thêm quá nhiều lớp sẽ lãng phí bộ nhớ khi các lớp không dùng đến được tải. Việc thêm quá ít lớp buộc mỗi ứng dụng phải có bản sao riêng, điều này lại 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 khi kế thừa mọi tệp makefile cấu hình sản phẩm lấy tệp makefile mặc định từ build/target/product/base.mk.

    Cấu hình thời gian chạy

    Tuỳ chọn JIT

    Các tuỳ chọn sau chỉ ảnh hưởng đến các bản phát hành Android có trình biên dịch JIT ART.

    • dalvik.vm.usejit: Liệu JIT có được bật 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 thực hiện GC và tăng 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à 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 chỉ số nội bộ của thời gian chạy. Chỉ số này bao gồm số lượng lệnh gọi, nhánh lui và các yếu tố khác.
    • dalvik.vm.usejitprofiles (cho đến Android 13): Liệu hồ sơ JIT có được bật hay không; bạn có thể sử dụng thuộc tính này ngay cả khi dalvik.vm.usejit là sai. Xin lưu ý rằng nếu giá trị này là sai, thì bộ lọc trình biên dịch speed-profile sẽ không biên dịch AOT bất kỳ phương thức nào và tương đương với verify. Kể từ Android 14, hồ sơ JIT luôn được bật và không thể tắt.
    • dalvik.vm.jitprithreadweight (mặc định là dalvik.vm.jitthreshold / 20): Tỷ lệ của "mẫu" JIT (xem jitthreshold) cho luồng giao diện người dùng của ứng dụng. Sử dụng để tăng tốc quá trình biên dịch các phương thức trực tiếp ảnh hưởng đến trải nghiệm 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): Tỷ lệ 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 rằng các phương thức liên quan được biên dịch để giảm thiểu các quá trình chuyển đổi (tốn kém).

    Tuỳ chọn Dex2oat

    Các tuỳ chọn này ảnh hưởng đến quá trình biên dịch trên thiết bị (còn gọi là dexopt) và một số tuỳ chọn 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 chỉ ảnh hưởng đến dexpreopt.

    Các tuỳ chọn để kiểm soát mức sử dụng tài nguyên:

    • dalvik.vm.image-dex2oat-threads/dalvik.vm.image-dex2oat-cpu-set (cho đến Android 11): Số lượng luồng và nhóm 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ố lượng luồng và nhóm lõi CPU (xem bên dưới) để sử dụng trong thời gian khởi động cho mọi thứ ngoại trừ hình ảnh khởi động.
      • (kể từ Android 12) Số lượng luồng và nhóm lõi CPU (xem bên dưới) để sử dụng trong thời gian khởi động cho mọi thứ, bao gồm 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:
      • (kể từ Android 11 cho đến Android 13) Số luồng và nhóm lõi CPU (xem bên dưới) để dùng khi khôi phục từ bản sao lưu trên đám mây.
      • (kể từ Android 14) Số lượng luồng và nhóm lõi CPU (xem bên dưới) để sử dụng cho mọi thứ nhạy cảm hơn với độ trễ so với bình thường, bao gồm cả việc khôi phục từ bản sao lưu trên đám mây.
        • Cụ thể, điều 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ố lượng luồng và nhóm lõi CPU (xem bên dưới) để sử dụng ở chế độ nền.
      • Cụ thể, điều 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à nhóm lõi CPU để sử dụng cho mọi thứ khác.

    Bạn phải chỉ định một tập hợp 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 các nhân CPU 0-3, hãy đặt:

    dalvik.vm.dex2oat-cpu-set=0,1,2,3
    

    Khi đặt các thuộc tính tương đồng với CPU, bạn nên so khớp thuộc tính tương ứng với số lượng luồng dex2oat để khớp với số lượng CPU đã chọn nhằm tránh tình trạng tranh chấp bộ nhớ và I/O không cần thiết:

    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 mức sử dụng tài nguyên của dex2oat (xem Lớp trừu tượng Cgroup).

    Sau đây là các hồ sơ tác vụ được hỗ trợ:

    • Dex2OatBackground (kể từ Android 14) (theo mặc định kế thừa Dex2OatBootComplete): Contrôle les tài nguyên à utiliser en arrière-plan.
      • Cụ thể, điều 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 cần sử dụng cho mọi thứ sau khi khởi động.
      • (kể từ Android 14) Kiểm soát tài nguyên cần sử dụng cho mọi thứ sau khi khởi động và không chạy ở chế độ nền.
        • Cụ thể, điều này tương ứng với lớp ưu tiên PRIORITY_INTERACTIVE_FASTPRIORITY_INTERACTIVE trong Dịch vụ ART.

    Khi bạn chỉ định cả thuộc tính hệ thống và hồ sơ tác vụ, 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 thứ khác.
    • dalvik.vm.dex2oat-Xmx: Kích thước vùng nhớ khối xếp tối đa cho mọi thứ khác.

    Bạn không nên giảm 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 dex2oat vì các tuỳ chọn này có thể giới hạn ứng dụng có thể biên dịch.

    Các tuỳ chọn để kiểm soát bộ lọc 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, bộ lọc trình biên dịch 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 thứ khác.
    • pm.dexopt.<reason> (kể từ Android 7): Bộ lọc trình biên dịch cho mọi thứ khác. Xem phần Cấu hình dịch vụ ART 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 trừ 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 bằng kibibyte để tắt tính năng biên dịch trước khi tải.
    • dalvik.vm.dex2oat-swap (kể từ Android 7.1) (mặc định: true): Cho phép sử dụng tệp hoán đổi cho dex2oat. Điều này có thể giúp tránh các sự cố hết bộ nhớ. Xin lưu ý rằng ngay cả khi bạn bật tuỳ chọn này, 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ố lượng 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 môi trường thời gian chạy tạo hồ sơ 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 (kể từ Android 12): Thời gian tối thiểu cần 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 quá trình dexopt ở chế độ nền. Xin lưu ý rằng ngoài ngưỡng theo tỷ lệ phần trăm, còn có ngưỡng ít nhất 50 lớp mới và bạn không thể định cấu hình ngưỡng này.
    • 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 quá trình dexopt ở chế độ nền. Xin lưu ý rằng ngoài ngưỡng phần trăm, còn có ngưỡng ít nhất 100 phương thức mới và bạn không thể định cấu hình ngưỡng này.
    • 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 một tập hợp các khối đồng nhất 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 đúng, sẽ khiến dex2oat 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) Có tạo thông tin gỡ lỗi cho tính năng gỡ lỗi gốc hay không, chẳng hạn như thông tin về việc gỡ bỏ ngăn xếp, biểu tượng ELF và các phần lùn.
    • dalvik.vm.dex2oat-minidebuginfo (kể từ Android 9) (mặc định: true) Có tạo lượng thông tin gỡ lỗi nén LZMA tối thiểu cần thiết để in dấu vết ngược hay không.

    Các tuỳ chọn của Dịch vụ ART

    Kể từ Android 14, quá trình biên dịch AOT trên thiết bị cho ứng dụng (còn gọi là dexopt) sẽ do Dịch vụ ART xử lý. Để biết thông tin về cách định cấu hình Dịch vụ ART, hãy xem phần Cấu hình Dịch vụ ART.

    Tuỳ chọn trình quản lý gói

    Trước Android 14, trình quản lý gói sẽ xử lý quá trình biên dịch AOT trên thiết bị cho ứng dụng (còn gọi là dexopt). Để 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 phần Cấu hình trình quản lý gói.

    Cấu hình dành riêng cho thử nghiệm A/B

    Cấu hình ROM

    Kể từ Android 7.0, các thiết bị có thể sử dụng hai phân vùng hệ thống để bật tính năng 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 được chọn trước trong phân vùng hệ thống thứ hai không dùng đến. Sau đó, các tệp này sẽ đượ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
    

    Xin lưu ý rằng mã đường dẫn lớp khởi động, mã máy chủ hệ thống và các ứng dụng cốt lõi dành riêng cho sản phẩm luôn biên dịch vào phân vùng hệ thống. Theo mặc định, tất cả ứng dụng khác sẽ được biên dịch sang phân vùng hệ thống thứ hai không sử dụng. Bạn có thể kiểm soát điều này bằng SYSTEM_OTHER_ODEX_FILTER, có giá trị mặc định là:

    SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
    

    OTA dexopt ở chế độ nền

    Trên các thiết bị hỗ trợ A/B, bạn có thể biên dịch ứng dụng ở chế độ nền trước khi khởi động lại bằng hình ảnh hệ thống mới. Hãy xem phần Biên dịch ứng dụng ở chế độ nền để tuỳ ý đưa tập lệnh biên dịch và tệp nhị phân vào hình ảnh hệ thống. 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 biên dịch theo hướng dẫn của hồ sơ và tiết kiệm bộ nhớ.

    Tuỳ chọn JDWP

    Việc tạo luồng Java Debug Wire Protocol (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 không được đặt và luồng JDWP chỉ được tạo cho các ứng dụng có thể gỡ lỗi. Để bật luồng JDWP cho cả ứng dụng có thể gỡ lỗi và không gỡ lỗi, hãy đặt persist.debug.dalvik.vm.jdwp.enabled thành 1. Bạn phải khởi động lại thiết bị để các thay đổi đối với thuộc tính này có hiệu lực.

    Để gỡ lỗi một ứng dụng không gỡ lỗi được 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, môi trường thời gian chạy sẽ tạo luồng JDWP cho các ứng dụng có thể gỡ lỗi và không 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.