Hồ sơ hình ảnh khởi động

Android 11 trở lên hỗ trợ tạo hồ sơ hình ảnh khởi động, gói gọn thông tin về mã của nhiều thành phần cấp hệ thống khác nhau như máy chủ hệ thống và đường dẫn lớp khởi động. Android Runtime (ART) sử dụng thông tin này để thực hiện tối ưu hóa toàn hệ thống, một số tối ưu hóa trong số đó rất quan trọng đối với hiệu suất của Android và tác động đến việc thực thi tất cả mã không phải gốc (cấp hệ thống hoặc ứng dụng). Trong một số trường hợp, cấu hình hình ảnh khởi động có thể ảnh hưởng đến hiệu suất thực thi và mức tiêu thụ bộ nhớ theo tỷ lệ phần trăm hai chữ số.

Nhận thông tin hồ sơ khởi động

Cấu hình hình ảnh khởi động được lấy từ cấu hình của các ứng dụng được thực thi trong các hành trình quan trọng của người dùng (CUJ). Trong cấu hình thiết bị cụ thể, ART ghi lại (như một phần của cấu hình JIT) các phương thức và lớp đường dẫn lớp khởi động được ứng dụng sử dụng, sau đó ghi lại thông tin đó trong hồ sơ ứng dụng (ví dụ: /data/misc/profiles/cur/0/com.android.chrome/primary.prof ), trong đó nó được lập chỉ mục bởi tệp đường dẫn lớp khởi động Dalvik EXecutable (DEX) (xem định dạng hồ sơ ART ).

Xem lại hồ sơ ứng dụng được ghi trong CUJ để xác định phần nào của đường dẫn lớp khởi động được sử dụng nhiều nhất và quan trọng nhất để tối ưu hóa (ví dụ: xem định dạng hồ sơ ART ). Việc bao gồm tất cả các phương thức hoặc lớp ảnh hưởng tiêu cực đến hiệu suất, vì vậy hãy tập trung vào các đường dẫn mã được sử dụng phổ biến nhất. Ví dụ: nếu một phương thức từ đường dẫn lớp khởi động được một ứng dụng sử dụng thì phương thức đó không phải là một phần của cấu hình khởi động. Mỗi thiết bị phải định cấu hình lựa chọn phương pháp/lớp dựa trên lựa chọn CUJ và lượng dữ liệu được tạo ra từ quá trình kiểm tra.

Để tổng hợp thông tin đường dẫn lớp khởi động từ tất cả hồ sơ ứng dụng riêng lẻ trên thiết bị, hãy chạy lệnh adb shell cmd package snapshot-profile android . Bạn có thể sử dụng thông tin tổng hợp làm cơ sở để xử lý và lựa chọn phương pháp/lớp mà không cần tổng hợp các cấu hình riêng lẻ theo cách thủ công (mặc dù bạn có thể làm điều đó nếu muốn).

Hồ sơ hình ảnh khởi động

Hình 1. Quy trình lấy hồ sơ image khởi động

Dữ liệu hồ sơ hình ảnh khởi động

Cấu hình ảnh khởi động bao gồm các tệp và dữ liệu sau.

  • Cấu hình cho đường dẫn lớp khởi động ( frameworks/base/config/boot-image-profile.txt ). Xác định phương thức nào từ đường dẫn lớp khởi động được tối ưu hóa, lớp nào được đưa vào hình ảnh .art khởi động và cách trình bày các tệp DEX tương ứng.

  • Danh sách các lớp được tải trước . Xác định lớp nào được tải trước trong Zygote.

  • Cấu hình cho các thành phần máy chủ hệ thống ( frameworks/base/services/art-profile ). Xác định phương thức nào từ máy chủ hệ thống được tối ưu hóa/biên dịch, lớp nào được bao gồm trong hình ảnh .art khởi động và cách trình bày các tệp DEX tương ứng.

Định dạng hồ sơ ART

Cấu hình ART ghi lại thông tin từ mỗi tệp DEX được tải, bao gồm thông tin về các phương pháp đáng tối ưu hóa và các lớp được sử dụng trong quá trình khởi động. Khi bật cấu hình hình ảnh khởi động, ART cũng bao gồm các tệp JAR của đường dẫn lớp khởi động và máy chủ hệ thống trong cấu hình và chú thích từng tệp DEX bằng tên của gói sử dụng nó.

Ví dụ: kết xuất cấu hình ảnh khởi động thô bằng lệnh sau:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

Điều này tạo ra đầu ra tương tự như:

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

Trong ví dụ trên:

  • core-oj.jar được sử dụng bởi com.google.android.ext.servicescom.android.systemui . Mỗi mục liệt kê hai gói được sử dụng từ core-oj.jar .

  • Cả hai quy trình đều sử dụng phương thức có chỉ mục DEX 520, nhưng chỉ quy trình systemui sử dụng phương thức có chỉ mục DEX 521. Cơ sở lý luận tương tự áp dụng cho các phần hồ sơ khác (ví dụ: các lớp khởi động).

Trong quá trình xử lý dữ liệu, lọc các phương thức/lớp dựa trên mức sử dụng, ưu tiên cho các quy trình cấp hệ thống (ví dụ: máy chủ hệ thống hoặc systemui ) hoặc các phương thức có thể không được sử dụng phổ biến nhưng vẫn quan trọng (ví dụ: các phương thức được sử dụng bởi ứng dụng máy ảnh).

Định dạng hồ sơ chú thích nội bộ từng phương thức bằng nhiều cờ (khởi động, sau khởi động, độ nóng, abi), nhiều hơn mức được hiển thị ở định dạng chỉ kết xuất. Để tận dụng tất cả các tín hiệu, hãy sửa đổi các tập lệnh có sẵn.

khuyến nghị

Sử dụng các hướng dẫn sau để có kết quả tốt nhất.

  • Triển khai cấu hình để tạo hồ sơ hình ảnh khởi động cho một số thiết bị thử nghiệm và tổng hợp kết quả trước khi tạo hồ sơ hình ảnh khởi động cuối cùng. Công cụ profman hỗ trợ tổng hợp và chọn nhiều cấu hình ảnh khởi động, nhưng nó chỉ hoạt động với cùng một phiên bản của ảnh khởi động (cùng đường dẫn lớp khởi động).

  • Ưu tiên lựa chọn cho các phương thức/lớp được sử dụng bởi các quy trình hệ thống. Các phương thức/lớp này có thể sử dụng mã không thường được các ứng dụng khác sử dụng nhưng điều đó vẫn rất quan trọng để tối ưu hóa.

  • Hình dạng dữ liệu từ một lần chạy thiết bị trông rất khác so với các thiết bị thử nghiệm thực thi CUJ trong thế giới thực. Nếu bạn không có nhiều thiết bị thử nghiệm, hãy sử dụng cùng một thiết bị để chạy nhiều CUJ nhằm tăng độ tin cậy rằng tối ưu hóa cấu hình hình ảnh khởi động sẽ hoạt động tốt trong sản xuất (kịch bản này được mô tả bên dưới).

Cấu hình thiết bị

Để bật cấu hình cấu hình khởi động thông qua thuộc tính hệ thống, hãy sử dụng một trong các phương pháp sau.

  • Tùy chọn 1: Thiết lập đạo cụ theo cách thủ công (hoạt động để khởi động lại):

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
    
  • Tùy chọn 2: Sử dụng local.prop (có hiệu lực vĩnh viễn cho đến khi tệp bị xóa). Làm như vậy:

    1. Tạo tệp local.prop có nội dung:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. Chạy các lệnh sau:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
      
  • Tùy chọn 3: Sử dụng cấu hình thiết bị để đặt các thuộc tính phía máy chủ sau:

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

Tạo hồ sơ hình ảnh khởi động

Sử dụng các hướng dẫn sau để tạo cấu hình hình ảnh khởi động cơ bản bằng cách thử nghiệm trên một thiết bị.

  1. Thiết lập thiết bị.

    1. Định cấu hình thiết bị như được mô tả trong Định cấu hình thiết bị .

    2. (Tùy chọn) Cần có thời gian để định dạng hồ sơ mới làm sạch và thay thế các hồ sơ khác. Để tăng tốc độ thu thập hồ sơ, hãy đặt lại tất cả hồ sơ trên thiết bị.

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
      
    3. Chạy CUJ trên thiết bị.

  2. Chụp hồ sơ bằng lệnh sau:

    adb shell cmd package snapshot-profile android
    
  3. Trích xuất hồ sơ bằng lệnh sau:

    adb pull /data/misc/profman/android.prof
    
  4. Điều hướng đến các tệp JAR của đường dẫn lớp khởi động bằng các lệnh sau:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
    
  5. Tạo hồ sơ hình ảnh khởi động bằng lệnh profman sau.

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
    
  6. Sử dụng dữ liệu, điều chỉnh lệnh profman bằng cách sử dụng các cờ ngưỡng lựa chọn có sẵn.

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    Để xem danh sách đầy đủ, hãy tham khảo trang trợ giúp profman hoặc mã nguồn.