Android 11 lub nowszy obsługuje generowanie profili obrazu rozruchowego, które zawierają informacje o kodzie różnych komponentów na poziomie systemu, takich jak serwer systemowy i ścieżka klas uruchamiania. Środowisko wykonawcze Androida (ART) korzysta z tych informacji do optymalizacji na poziomie całego systemu. Niektóre z nich są kluczowe dla wydajności Androida i mają wpływ na wykonywanie całego kodu niestandardowego (na poziomie systemu lub aplikacji). W niektórych przypadkach profile obrazu rozruchu mogą wpływać na wydajność i zużycie pamięci w zakresie dwucyfrowych wartości procentowych.
Pobieranie informacji o profilu rozruchu
Profile obrazów rozruchowych są tworzone na podstawie profili aplikacji uruchamianych podczas krytycznych ścieżek użytkownika. W przypadku określonej konfiguracji urządzenia ART rejestruje (w ramach profili JIT) metody i klasy ścieżki uruchamiania 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ą one indeksowane przez plik wykonywalny DEX (patrz format profilu ART).
Sprawdź profile aplikacji zarejestrowane podczas testów CUJ, aby określić, która część ścieżki klasyfikacji jest najczęściej używana i najważniejsza do optymalizacji (patrz 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 do uruchamiania jest używana przez jedną aplikację, nie powinna być częścią profili uruchamiania. Na każdym urządzeniu należy skonfigurować wybór metody/klasy na podstawie wyboru CUJ i ilości danych wygenerowanych przez testy.
Aby zebrać informacje o ścieżce uruchamiania ze wszystkich profili aplikacji na urządzeniu, uruchom komendę 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 uzyskiwania profili obrazu rozruchowego
Dane profilu obrazu rozruchowego
Profile obrazu rozruchowego zawierają te pliki i dane.
Profil ścieżki klas rozruchowych (
frameworks/base/config/boot-image-profile.txt
). Określa, które metody z ścieżki klas rozruchowych 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 również pliki JAR ścieżki klas i serwera systemu. Oprócz tego do każdego pliku DEX dołącza adnotację z nazwą pakietu, który go używa.
Na przykład możesz wyodrębnić profil obrazu rozruchowego w postaci surowych danych za pomocą tego polecenia:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof
Dane wyjściowe będą wyglądać tak:
=== 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żywane zcore-oj.jar
.Oba procesy używają metody o indeksie DEX 520, ale tylko proces
systemui
używa metody o indeksie 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 wewnętrznie opatruje każdą metodę wieloma flagami (uruchamiania, po uruchomieniu, gorąca, ABI), co jest więcej niż wyświetlane w formacie tylko z dumpem. Aby korzystać ze wszystkich sygnałów, zmodyfikuj dostępne skrypty.
Rekomendacje
Aby uzyskać najlepsze wyniki, postępuj zgodnie z tymi wskazówkami.
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 kluczowy dla 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 testów CUJ, aby zwiększyć pewność, że optymalizacje profilu obrazu rozruchowego będą dobrze działać w produkcji (ten scenariusz jest opisany poniżej).
Konfigurowanie urządzeń
Aby włączyć konfigurację profilu rozruchu za pomocą właściwości systemu, 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 momentu usunięcia pliku). Aby to zrobić:Utwórz plik
local.prop
z treś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`
Generowanie profili obrazu rozruchowego
Aby wygenerować podstawowy profil obrazu rozruchowego za pomocą testowania na jednym urządzeniu, wykonaj podane niżej czynności.
Skonfiguruj urządzenie.
Skonfiguruj urządzenie zgodnie z instrukcjami podanymi w artykule Konfigurowanie urządzeń.
(Opcjonalnie) Wyczyszczenie i zastąpienie innych profili nowym formatem profilu wymaga czasu. Aby przyspieszyć zbieranie danych, 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 CUJ na urządzeniu.
Aby utworzyć profil, użyj tego polecenia:
adb shell cmd package snapshot-profile android
Wyodrębnij 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.