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

Android 11 trở lên hỗ trợ tạo hồ sơ hình ảnh khởi động, bao gồm thông tin về mã của nhiều thành phần cấp hệ thống 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 để tiến hành tối ưu hoá trên toàn hệ thống, một số trong số đó rất quan trọng đối với hiệu suất của Android và ảnh hưởng đến việc thực thi tất cả các mã không phải mã gốc (cấp hệ thống hoặc ứng dụng). Trong một số trường hợp, hồ sơ 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 ở mức hai chữ số.

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

Hồ sơ hình ảnh khởi động được lấy từ hồ sơ của các ứng dụng được thực thi trong hành trình trọng yếu của người dùng (CUJ). Trong một cấu hình thiết bị cụ thể, ART sẽ ghi lại (như một phần của hồ sơ JIT) các phương thức và lớp đường dẫn lớp khởi động mà ứ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 đó thông tin đó được lập chỉ mục theo tệp Dalvik EXecutable (DEX) của đường dẫn lớp khởi động (xem định dạng hồ sơ ART).

Xem xét các hồ sơ ứng dụng được ghi lại trong CUJ để xác định phần nào của đường dẫn lớp khởi động được dùng nhiều nhất và quan trọng nhất để tối ưu hoá (ví dụ: xem định dạng hồ sơ ART). Việc đưa tất cả phương thức hoặc lớp vào sẽ ả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 trong đường dẫn lớp khởi động được một ứng dụng sử dụng, thì phương thức đó không được nằm trong hồ sơ khởi động. Mỗi thiết bị phải định cấu hình lựa chọn phương thức/lớp dựa trên lựa chọn CUJ và lượng dữ liệu do quá trình kiểm thử tạo ra.

Để 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 thức/lớp mà không cần tổng hợp từng hồ sơ theo cách thủ công (mặc dù bạn có thể làm như vậy nếu muốn).

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

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

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

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

  • Hồ sơ 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 trong đường dẫn lớp khởi động được tối ưu hoá, lớp nào có trong hình ảnh .art khởi động và cách bố trí các tệp DEX tương ứng.

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

  • Hồ sơ 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 hoá/biên dịch, lớp nào có trong hình ảnh .art khởi động và cách bố trí các tệp DEX tương ứng.

Định dạng hồ sơ ART

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

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

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

Thao tác này sẽ tạo ra kết quả 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 com.google.android.ext.servicescom.android.systemui sử dụng. Mỗi mục nhập liệt kê 2 gói được 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 mới sử dụng phương thức có chỉ mục DEX 521. Lý do tương tự cũng á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, các phương thức/lớp lọc dựa trên mức sử dụng, ưu tiên các quy trình ở cấp hệ thống (ví dụ: máy chủ hệ thống hoặc systemui) hoặc cho các phương thức có thể không được dùng phổ biến nhưng vẫn quan trọng (ví dụ: các phương thức mà ứng dụng máy ảnh sử dụng).

Đị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 khi khởi động, mức độ nóng, abi), nhiều hơn so với định dạng chỉ kết xuất. Để sử 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.

Đề xuất

Hãy làm theo các nguyên tắc 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ị kiểm thử 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 hồ sơ hình ảnh khởi động, nhưng chỉ hoạt động với cùng một phiên bản hình ảnh khởi động (cùng một đường dẫn lớp khởi động).

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

  • Hình dạng dữ liệu trong 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 thực tế. 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 cường tin rằng tính năng tối ưu hoá hồ sơ hình ảnh khởi động sẽ hoạt động hiệu quả trong môi trường thực tế (trường hợp này được mô tả dưới đây).

Định cấu hình thiết bị

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

  • Cách 1: Thiết lập đạo cụ theo cách thủ công (có thể 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
    
  • Cách 2: Sử dụng local.prop (có hiệu lực vĩnh viễn cho đến khi tệp bị xoá). Cách làm như sau:

    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
      
  • Cách 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

Hãy làm theo các hướng dẫn sau để tạo hồ sơ hình ảnh khởi động cơ bản bằng cách kiểm thử 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ư mô tả trong phần Định cấu hình thiết bị.

    2. (Không bắt buộc) Phải mất thời gian để định dạng hồ sơ mới dọn dẹp 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. Ghi lại 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. Chuyển đến các tệp JAR trong đườ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 đây.

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
    
  6. Bằng cách sử dụng dữ liệu, hãy tinh 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 hoặc mã nguồn profman.