Định cấu hình NGHỆ THUẬT

Trang này thảo luận cách định cấu hình thời gian chạy Android (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 cân bằng 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 để làm việc với ART. Xem 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.

ART hoạt động như thế nào

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, nó sử dụng sự kết hợp giữa biên dịch AOT, biên dịch và giải thích đúng lúc (JIT), đồng thời quá trình biên dịch AOT có thể được hướng dẫn theo cấu hình. Sự kết hợp của tất cả các chế độ thực thi này có thể được 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 Play Store phân phối, tệp này chứa hồ sơ đám mây. ART AOT-biên dịch các phương thức được liệt kê trong hồ sơ đá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 được thực thi thường xuyên sẽ được biên dịch JIT. ART tạo hồ sơ cục bộ dựa trên quá trình thực thi và kết hợp nó với hồ sơ đá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 cấu hình kết hợp được tạo trong vài lần chạy đầu tiên.
  4. Trong những lần chạy ứng dụng tiếp theo, ART sử dụng các tạo phẩm được tạo bởi trình nền biên dịch, chứa nhiều mã do AOT biên dịch hơn so với các mã được tạo trong 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 cài đặt hồ sơ, dựa trên quá trình thực thi và hồ sơ sau đó sẽ được chọn trong các lần chạy tiếp theo của 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à thời gian chạy ( libart.so ) được tải trong khi khởi động. Công cụ dex2oat lấy tệp APK và tạo một hoặc nhiều tệp tạo phẩm biên dịch mà thời gian chạy sẽ 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 này được tạo:

  • .vdex : chứa một số siêu dữ liệu bổ sung để tăng tốc độ xác minh, đôi khi cùng với mã DEX không nén của APK.
  • .odex : chứa mã do AOT biên dịch cho các phương thức trong APK.
  • .art (optional) chứa các bản trình bày nội bộ ART 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.

Tùy chọn biên dịch

Có hai loại tùy chọn biên dịch cho ART:

  1. Cấu hình ROM hệ thống: AOT biên dịch mã gì khi xây dựng image 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 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 điều khiển cách ART biên dịch mã DEX và là một tùy chọn được chuyển tới 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 (không biên dịch AOT).
  • quicken : (cho đến Android 11) chạy xác minh mã DEX và tối ưu hóa một số hướng dẫn DEX để có hiệu suất trình thông dịch 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 thức.
  • speed-profile : Chạy xác minh mã DEX và các phương thức biên dịch AOT được liệt kê trong tệp 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 xây dựng. Quá trình này được gọi là dexpreopt . Các tệp được biên dịch như vậy có thể sử dụng được miễn là tất cả cá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 các bản cập nhật mô-đun hệ thống thì đường dẫn lớp khởi động rất có thể sẽ thay đổi trong bản cập nhật tiếp theo, điều này khiến tất cả các tệp dexpreopt trở nên cũ và không thể sử dụng được.

Có một số tùy chọn xây dựng ART có sẵn để định cấu hình dexpreopt. Cách bạn định cấu hình các tùy chọn này tùy thuộc vào dung lượng lưu trữ khả dụng cho ả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ã đường dẫn lớp khởi động: được biên dịch bằng bộ lọc trình biên dịch cấu 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 bộ lọc trình biên dịch cấu 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 cấu hình.
    • (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).
  • Các ứng dụng cốt lõi dành riêng cho sản phẩm (xem PRODUCT_DEXPREOPT_SPEED_APPS sau trong 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ả các ứng dụng khác: được biên dịch bằng bộ lọc trình biên dịch cấu 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 cấu hình.

    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).

Tùy chọn tệp thực hiện

  • 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. Được 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 các bản dựng sẵn bị hủy tùy chọn. Đây là những ứng dụng có include $(BUILD_PREBUILT) được chỉ định trong Android.mk của chúng. Bỏ qua tùy chọn dexpreopt của các ứng dụng dựng sẵn có khả năng được cập nhật qua Google Play sẽ tiết kiệm dung lượng trong hình ảnh hệ thống nhưng sẽ làm tăng thêm thời gian khởi động lần đầu. Lưu ý rằng tùy chọn này không có hiệu lực đối với các ứng dụng dựng 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 giải mã. 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 giá trị đó có được chỉ định và hồ sơ không được cung cấp hay không.

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (kể từ Android 8 MR1)
  • Việc kích hoạt WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY chỉ giải thích đường dẫn lớp khởi động và các lọ máy chủ hệ thống.

  • LOCAL_DEX_PREOPT
  • Dexpreopt cũng có thể được bật hoặc tắt trên cơ sở từng ứng dụng 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 khi vô hiệu hóa dexpreopt của những ứng dụng có thể nhận ngay bản cập nhật Google Play 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 OTA nâng cấp phiên bản chính 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 loại bỏ tệp classes.dex khỏi tệp APK hoặc JAR. Thông thường, tệp này bị xóa vì không còn cần thiết sau dexpreopt, 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 hợp lệ.

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • Chuyển các tùy chọn tới dex2oat để kiểm soát cách biên dịch hình ảnh khởi động. Nó có thể được sử dụng để chỉ định danh sách lớp hình ảnh tùy chỉnh, danh sách lớp được biên dịch và bộ lọc trình biên dịch.

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • Chuyển các tùy chọn tới 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 chuyển các tùy chọn dex2oat cho một cấu hình sản phẩm và mô-đun cụ thể. Nó được đặt trong tệp device.mk của sản phẩm bởi $(call add-product-dex-preopt-module-config,<modules>,<option>) trong đó <modules> là danh sách tên LOCAL_MODULELOCAL_PACKAGE cho các tệp JAR và APK , tương ứng.

  • 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 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 hồ sơ ở lần khởi động lại tiếp theo, do đó, có thể tốt hơn nếu sản phẩm luôn được biên dịch AOT các ứng dụng này.

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

  • PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD (kể từ Android 8)
  • 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 bật cho bản dựng userdebug và eng. Hành vi này có thể được ghi đè bằng cách đặt tùy chọn này 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, WITH_DEXPREOPT_PIC có thể được chỉ định để bật mã không phụ thuộc vào vị trí (PIC). Với điều này, mã được biên dịch từ hình ảnh không cần phải di chuyển từ /system sang /data/dalvik-cache , tiết kiệm dung lượng 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 /data nên kích hoạt tính năng biên dịch PIC.

    Trong Android 7.0, trình biên dịch PIC được bật theo mặc định.

  • WITH_DEXPREOPT_BOOT_IMG_ONLY (cho đến Android 7 MR1)
  • Tùy chọn này đã được thay thế bằng WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY cũng ưu tiên trước các JAR của máy chủ hệ thống.

  • PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
  • Tùy 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 được chỉ định, bộ lọc trình biên dịch cấu speed-profile sẽ được sử dụng hoặc bộ lọc trình biên dịch cấu hình speed sẽ được sử dụng nếu cấu hình không được cung cấp.
    • (Android 13 trở xuống) 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ịch speed sẽ được sử dụng.
    • Nếu được đặt thành speed-profile , bộ lọc trình biên dịch cấu 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 cấu hình không đượ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 JAR được tải bởi máy chủ hệ thống. Các JAR được biên dịch bằng bộ lọc trình biên dịch được chỉ định bởi PRODUCT_SYSTEM_SERVER_COMPILER_FILTER

    • (Bắt buộc) PRODUCT_SYSTEM_SERVER_JARS : Danh sách các JAR đường dẫn lớp của máy chủ hệ thống trên nền tảng (nghĩa là, như một phần của SYSTEMSERVERCLASSPATH ). Việc thêm JAR đường dẫn lớp của máy chủ hệ thống vào danh sách này là bắt buộc. Việc không thêm các JAR đường dẫn lớp của máy chủ hệ thống vào danh sách sẽ dẫn đến các JAR đó không được tải.
    • (Bắt buộc) PRODUCT_APEX_SYSTEM_SERVER_JARS : Danh sách các JAR đường dẫn lớp của máy chủ hệ thống được phân phối bằng APEX (nghĩa là như một phần của SYSTEMSERVERCLASSPATH ). Định dạng là <apex name>:<jar name> . Việc thêm JAR đường dẫn lớp của máy chủ hệ thống APEX vào danh sách này là bắt buộc. Việc không thêm các JAR đường dẫn lớp của máy chủ hệ thống APEX vào danh sách này sẽ dẫn đến các JAR đó không được tải.
    • (Tùy chọn, Android 13 trở xuống) PRODUCT_STANDALONE_SYSTEM_SERVER_JARS : Danh sách các JAR mà máy chủ hệ thống tải động bằng cách sử dụng các trình nạp lớp riêng biệt (thông qua SystemServiceManager.startServiceFromJar ). Việc thêm các JAR 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 JAR đượ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 JAR được phân phối bằng APEX mà máy chủ hệ thống tải động bằng cách sử dụng các trình nạp lớp riêng biệt (nghĩa là thông qua SystemServiceManager.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 JAR máy chủ hệ thống APEX độc lập vào danh sách này. Việc không thêm JAR 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 sẵn là danh sách các lớp mà Zygote 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 riêng các trình khởi tạo lớp này, cho phép chú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 các lớp được tải trước được đặt tại frameworks/base/config/preloaded-classes và nó chứa danh sách được điều chỉnh để sử dụng thông thường trên điện thoại. Điều này có thể khác đối 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ẽ gây lãng phí bộ nhớ khi các lớp không sử dụng đượ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 gây lãng phí bộ nhớ.

    Cách sử dụng ví dụ (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 bất kỳ tệp cấu hình sản phẩm nào lấy tệp 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): 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à số liệu nội bộ của thời gian chạy. Nó bao gồm số lượng cuộc gọi, các nhánh ngược và các yếu tố khác.
    • dalvik.vm.usejitprofiles (cho đến Android 13): Cấu hình JIT có được bật hay không; điều này có thể được sử dụng ngay cả khi dalvik.vm.usejit sai. Lưu ý rằng nếu điều này là sai, speed-profile của bộ lọc trình biên dịch 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 được.
    • dalvik.vm.jitprithreadweight (mặc định là dalvik.vm.jitthreshold / 20): Trọng số của các "mẫu" JIT (xem jitthreshold) cho luồng giao diện người dùng ứng dụng. Sử dụng để tăng tốc độ biên soạn 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 thức liên quan được biên dịch để giảm thiểu việc chuyển đổi (vốn tốn kém).

    Tùy chọn Dex2oat

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

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

    Một tập hợp các lõi 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 lõi 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 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 để tránh 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 việc sử dụng tài nguyên của dex2oat (xem Lớp trừu tượng Cgroup ).

    Hồ sơ nhiệm vụ được hỗ trợ là:

    • Dex2OatBackground (kể từ Android 14) (theo mặc định kế thừa Dex2OatBootComplete ): Kiểm soát các tài nguyên để 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.
    • Dex2OatBootComplete :
      • (cho đến Android 13) Kiểm soát tài nguyê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 để sử dụng cho mọi thứ sau khi khởi động chứ không phải ở 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 cả hai thuộc tính hệ thống và hồ sơ tác vụ đều được chỉ định, cả hai đều có hiệu lực.

    Các tùy chọn để kiểm soát kích thước heap:

    • dalvik.vm.image-dex2oat-Xms : Kích thước heap ban đầu cho ảnh khởi động.
    • dalvik.vm.image-dex2oat-Xmx : Kích thước heap tối đa cho hình ảnh khởi động.
    • dalvik.vm.dex2oat-Xms : Kích thước heap ban đầu cho mọi thứ khác.
    • dalvik.vm.dex2oat-Xmx : Kích thước heap tối đa cho mọi thứ khác.

    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.

    Các tùy chọn để điều khiển 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 có 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 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 tùy chọn khác để kiểm soát việc biên dịch mọi thứ ngoài ả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 byte để vô hiệu hóa quá trình biên dịch AOT.
    • 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 sự cố hết bộ nhớ. Lưu ý rằng ngay cả khi tùy chọn này được 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ố 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 chờ tối thiểu trước khi bộ thực thi tạo hồ sơ của ứng dụng, vào 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 chờ tối thiểu 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): 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 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 hồ sơ ( speed-profile ), thường là trong quá trình dexopt nền. Lưu ý rằng ngoài ngưỡng phần trăm còn có một ngưỡng có ít nhất 50 lớp mới và không thể định cấu hình được.
    • 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 cấu hình để 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 hồ sơ ( speed-profile ), thường là trong quá trình dexopt nền. Lưu ý rằng ngoài ngưỡng phần trăm còn có một ngưỡng gồm ít nhất 100 phương pháp mới và không thể định cấu hình được.
    • 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 đặc 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, khiến dex2oat giải quyết 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 để gỡ lỗi gốc hay không, chẳng hạn như thông tin giải phóng ngăn xếp, ký hiệu ELF và phần lùn.
    • dalvik.vm.dex2oat-minidebuginfo (kể từ Android 9) (mặc định: true) Có hay không tạo ra lượng thông tin gỡ lỗi được nén LZMA tối thiểu cần thiết để in dấu vết ngược.

    Tùy chọn dịch vụ ART

    Kể từ Android 14, việc biên dịch AOT trên thiết bị cho các ứng dụng (còn gọi là dexopt) 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 .

    Tùy chọn quản lý gói

    Trước Android 14, việc biên dịch AOT trên thiết bị cho các ứng dụng (còn gọi là dexopt) do người 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 cụ thể A/B

    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 để 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, các tệp được chọn trước có thể được cài đặt trong phân vùng hệ thống thứ hai chưa 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ã đườ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ả các ứng dụng khác sẽ được biên dịch sang phân vùng hệ thống thứ hai chưa sử dụng. Điều này có thể được kiểm soát bằng SYSTEM_OTHER_ODEX_FILTER , có giá trị mặc định là:

    SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
    

    Nền tảng dexot OTA

    Trên các thiết bị hỗ trợ A/B, các ứng dụng có thể được biên dịch ở chế độ nền trước khi khởi động lại với hình ảnh hệ thống mới. Xem phần Biên dịch ứng dụng ở chế độ 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 quá trình 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 tính năng biên dịch theo hướng dẫn cấu hình và tiết kiệm dung lượng lưu trữ.

    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 không được đặt và các 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ả ứng dụng có thể gỡ lỗi và không thể gỡ lỗi, hãy đặt persist.debug.dalvik.vm.jdwp.enabled thành 1 . Thiết bị phải được khởi động lại để 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 gỡ lỗi người dùng, 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 các luồng 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à có thể đính kèm trình gỡ lỗi hoặc lập hồ sơ bất kỳ ứng dụng nào trên bản dựng userdebug.