Android 11 trở lên hỗ trợ tạo hồ sơ hình ảnh khởi động, giúp đóng gói thông tin về mã của nhiều thành phần cấp hệ thống, chẳng hạn 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 các hoạt động tối ưu hoá trên toàn hệ thống. Một số hoạt động trong số đó rất quan trọng đối với hiệu suất của Android và ảnh hưởng đến quá trình thực thi tất 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 có hai chữ số.
Nhận thông tin về 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 (trong phần hồ sơ JIT) các phương thức và lớp đường dẫn 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 này được lập chỉ mục theo tệp Dalvik EXecutable (DEX) đường dẫn 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 sử 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ả cá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ã thường dùng 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 duy nhất 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 về đườ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ở cho việc xử lý và lựa chọn phương thức/lớp mà không cần tổng hợp các hồ sơ riêng lẻ theo cách thủ công (mặc dù bạn có thể làm như vậy nếu muốn).
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á và lớp nào được đưa vào hình ảnh.art
khởi động.Danh sách các lớp được tải sẵn. Xác định những lớp được tải sẵn 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 đưa vào 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 dùng trong quá trình khởi động. Khi bật tính năng lập hồ sơ hình ảnh khởi động, ART cũng sẽ đưa classpath 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ư sau:
=== 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
đượccom.google.android.ext.services
vàcom.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 là 520, nhưng chỉ quy trình
systemui
sử dụng phương thức có chỉ mục DEX là 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, hãy lọc các phương thức/lớp 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 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 do ứng dụng camera 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 khởi động, độ nóng, abi), nhiều hơn so với đị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 hiện có.
Đề 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 của hình ả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 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 không thường xuyên sử dụng nhưng vẫn rất quan trọng để tối ưu hoá.
Hình dạng dữ liệu từ một lần chạy thiết bị duy nhất trông rất khác so với các thiết bị kiểm thử thực thi CUJ trong thực tế. Nếu bạn không có nhiều thiết bị kiểm thử, hãy dùng cùng một thiết bị để chạy một số CUJ nhằm tăng độ tin cậy rằng các hoạt động tối ưu hoá hồ sơ hình ảnh khởi động sẽ hoạt động tốt trong quá trình sản xuất (trường hợp này được mô tả bên dưới).
Đị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 (hoạt động cho đến khi 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:Tạo tệp
local.prop
có nội dung:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=true
Chạy các lệnh sau:
adb push local.prop /data/
adb shell chmod 0750 /data/local.prop
adb reboot
Lựa 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:
adb shell device_config put runtime_native_boot profilebootclasspath true adb shell device_config put runtime_native_boot profilesystemserver true
Tạo hồ sơ hình ảnh khởi động
Hãy làm theo hướng dẫn sau để tạo một 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ị duy nhất.
Thiết lập thiết bị.
Định cấu hình thiết bị như mô tả trong phần Định cấu hình thiết bị.
(Không bắt buộc) Định dạng hồ sơ mới cần có thời gian để 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
Chạy CUJ trên thiết bị.
Ghi lại hồ sơ bằng lệnh sau:
adb shell cmd package snapshot-profile android
Trích xuất hồ sơ bằng lệnh sau:
adb pull /data/misc/profman/android.prof
Chuyển đến các tệp JAR trong đường dẫn lớp khởi động bằng cách dùng các lệnh sau:
m dist
ls $ANDROID_PRODUCT_OUT/boot.zip
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=...
Dựa vào dữ liệu, hãy điều chỉnh lệnh
profman
bằng cách dùng các cờ ngưỡng lựa chọn hiện có.--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
.