Android 11 lub nowszy obsługuje generowanie profili obrazów rozruchowych, które zawierają informacje o kodzie różnych komponentów na poziomie systemu, takich jak serwer systemu i ścieżka klasy rozruchu. Środowisko wykonawcze Android (ART) wykorzystuje te informacje do przeprowadzania optymalizacji w całym systemie, z których niektóre mają kluczowe znaczenie dla wydajności Androida i wpływają na wykonanie całego kodu nienatywnego (na poziomie systemu lub aplikacji). W niektórych przypadkach profile obrazu rozruchu mogą wpływać na wydajność i zużycie pamięci o dwucyfrowych wartościach procentowych.
Pobieranie informacji o profilu rozruchu
Profile obrazów rozruchowych są tworzone na podstawie profili aplikacji uruchamianych podczas krytycznych ścieżek użytkownika. W określonej konfiguracji urządzenia ART przechwytuje (w ramach profili JIT) metody i klasy rozruchu klasy rozruchowej używane przez aplikacje, a następnie zapisuje te informacje w profilu aplikacji (np. /data/misc/profiles/cur/0/com.android.chrome/primary.prof
), gdzie są indeksowane przez plik wykonywalny Dalvik EXecutable (DEX) (patrz format profilu ART).
Przejrzyj profile aplikacji zarejestrowane podczas głównej ścieżki użytkownika, aby określić, która część ścieżki klasy rozruchowej jest najczęściej używana i najważniejsza do optymalizacji (np. w sekcji Format profilu ART). Uwzględnianie wszystkich metod lub klas ma negatywny wpływ na wydajność, dlatego skup się na najczęściej używanych ścieżkach kodu. Jeśli na przykład metoda z ścieżki klas w bootloaderze jest używana przez jedną aplikację, nie powinna być częścią profili rozruchu. Każde urządzenie powinno skonfigurować wybór metody/klasy na podstawie wybranej ścieżki głównej i ilości danych wytwarzanych podczas testów.
Aby zebrać informacje o ścieżce rozruchu ze wszystkich profili aplikacji na urządzeniu, uruchom polecenie adb shell cmd package snapshot-profile android
. Możesz użyć zagregowanych informacji jako podstawy do przetwarzania i wyboru metody lub klasy bez ręcznego agregowania poszczególnych profili (chociaż możesz to zrobić, jeśli chcesz).
Rysunek 1. Proces pobierania profili obrazu rozruchowego
Dane profilowe obrazu rozruchowego
Profile obrazu rozruchowego zawierają te pliki i dane.
Profil ścieżki klas rozruchowej (
frameworks/base/config/boot-image-profile.txt
). Określa, które metody z ścieżki klas rozruchowej zostaną zoptymalizowane, która klasa jest uwzględniona w obrazie rozruchowym.art
i jak rozmieszczone są odpowiednie pliki DEX.Lista wstępnie załadowanych klas. Określa, które klasy są wstępnie ładowane w Zygote.
Profil dla komponentów serwera systemowego (
frameworks/base/services/art-profile
). Określa, które metody z serwera systemowego zostaną zoptymalizowane/skompilowane, która klasa zostanie uwzględniona w obrazie rozruchu.art
i jak zostaną rozmieszczone odpowiednie pliki DEX.
Format profilu ART
Profil ART rejestruje informacje z każdego załadowanego pliku DEX, w tym informacje o metodach, które warto zoptymalizować, oraz klasy używane podczas uruchamiania. Gdy profilowanie obrazu rozruchu jest włączone, ART uwzględnia w profilu pliki JAR ścieżki klas i serwera systemu, a także dołącza do każdego pliku DEX adnotację z nazwą pakietu, który go używa.
Na przykład wykonaj zrzut surowego profilu obrazu rozruchowego za pomocą tego polecenia:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof
Zostaną wyświetlone dane wyjściowe podobne do tych:
=== 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: …
W tym przykładzie:
core-oj.jar
jest używany przezcom.google.android.ext.services
icom.android.systemui
. Każdy wpis zawiera 2 pakiety użyte na konciecore-oj.jar
.Oba procesy korzystają z metody z indeksem DEX 520, ale tylko proces
systemui
korzysta z metody z indeksem DEX 521. To samo uzasadnienie dotyczy innych sekcji profilu (np. klas start-upów).
Podczas przetwarzania danych metody i klasy są filtrowane na podstawie użycia, a priorytet mają procesy na poziomie systemu (np. serwer systemowy lub systemui
) lub metody, które nie są często używane, ale są ważne (np. metody używane przez aplikację aparatu).
Format profilu ma wewnętrznie adnotacje do każdej metody za pomocą wielu flag (startup, post-startup, hotness, abi), co stanowi więcej niż w formacie tylko zrzutu. Aby korzystać ze wszystkich sygnałów, zmodyfikuj dostępne skrypty.
Rekomendacje
Poniższe wskazówki pomogą Ci uzyskać najlepsze wyniki.
Wprowadź konfigurację generowania profili obrazu rozruchowego na kilka urządzeń testowych i zbierz wyniki przed wygenerowaniem ostatecznego profilu obrazu rozruchowego. Narzędzie
profman
obsługuje agregację i wybieranie wielu profili obrazu rozruchu, ale działa tylko z tą samą wersją obrazu rozruchu (ta sama ścieżka klas rozruchu).Nadaj priorytet metodom lub klasom, których używają procesy systemowe. Te metody lub klasy mogą używać kodu, który nie jest często używany przez inne aplikacje, ale jest nadal niezbędny do optymalizacji.
Format danych z pojedynczego uruchomienia na urządzeniu wygląda zupełnie inaczej niż w przypadku urządzeń testowych, które wykonują testy CUJ w rzeczywistych warunkach. Jeśli nie masz dużej floty urządzeń testowych, użyj tego samego urządzenia do uruchomienia kilku głównych interfejsów użytkownika, aby zwiększyć pewność, że optymalizacje profilu obrazu rozruchowego sprawdzą się w środowisku produkcyjnym (ten scenariusz został opisany poniżej).
Konfigurowanie urządzeń
Aby włączyć konfigurację profilu rozruchu za pomocą właściwości systemowych, użyj jednej z tych metod.
Opcja 1. Ręczne konfigurowanie komponentów (działa do momentu ponownego uruchomienia):
adb root
adb shell stop
adb shell setprop dalvik.vm.profilebootclasspath true
adb shell setprop dalvik.vm.profilesystemserver true
adb shell start
Opcja 2. Użyj
local.prop
(trwały efekt do czasu usunięcia pliku). Aby to zrobić:Utwórz plik
local.prop
z tą zawartością:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=true
Uruchom te polecenia:
adb push local.prop /data/
adb shell chmod 0750 /data/local.prop
adb reboot
Opcja 3. Użyj konfiguracji urządzenia, aby ustawić te właściwości po stronie serwera:
persist.device_config.runtime_native_boot.profilesystemserver persist.device_config.runtime_native_boot.profilebootclasspath`
Wygeneruj profile obrazu rozruchowego
Wykonaj poniższe instrukcje, aby wygenerować podstawowy profil obrazu rozruchowego przez testowanie na jednym urządzeniu.
Skonfiguruj urządzenie.
Skonfiguruj urządzenie zgodnie z opisem w sekcji Konfigurowanie urządzeń.
(Opcjonalnie) Wyczyszczenie i zastąpienie innych profili nowym formatem profilu może zająć trochę czasu. Aby przyspieszyć zbieranie profili, zresetuj wszystkie profile na urządzeniu.
adb shell stop
adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
adb shell start
Uruchom główne ścieżki dźwiękowe na urządzeniu.
Przechwytuj profil za pomocą tego polecenia:
adb shell cmd package snapshot-profile android
Rozpakuj profil za pomocą tego polecenia:
adb pull /data/misc/profman/android.prof
Przejdź do plików JAR ścieżki klaszystycznia uruchamiania za pomocą tych poleceń:
m dist
ls $ANDROID_PRODUCT_OUT/boot.zip
Wygeneruj profil obrazu rozruchowego za pomocą tego polecenia
profman
.profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
Na podstawie danych dostosuj polecenie
profman
za pomocą dostępnych flag progów wyboru.--method-threshold
--class-threshold
--clean-class-threshold
--preloaded-class-threshold
--upgrade-startup-to-hot
--special-package
Pełną listę znajdziesz na stronie pomocy
profman
lub w kodzie źródłowym.