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 rozruchowych. Środowisko wykonawcze Androida (ART) używa tych informacji do przeprowadzania optymalizacji w całym systemie. Niektóre z nich są kluczowe dla wydajności Androida i wpływają na wykonywanie całego kodu innego niż natywny (na poziomie systemu lub aplikacji). W niektórych przypadkach profile obrazu rozruchowego mogą wpływać na wydajność wykonywania i zużycie pamięci o kilkanaście procent.
Uzyskiwanie informacji o profilu rozruchowym
Profile obrazu rozruchowego są tworzone na podstawie profili aplikacji uruchamianych podczas najważniejszych ścieżek użytkownika. W określonej konfiguracji urządzenia ART przechwytuje
(w ramach profili JIT) metody i klasy ścieżki klas rozruchowych 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 Dalvik (DEX) ścieżki klas rozruchowych (patrz Format profilu
ART).
Sprawdź profile aplikacji zarejestrowane podczas najważniejszych ścieżek użytkownika, aby określić, która część ścieżki klas rozruchowych jest najczęściej używana i najważniejsza do zoptymalizowania (przykład znajdziesz w artykule Format profilu ART). Uwzględnienie wszystkich metod lub klas negatywnie wpływa na wydajność, dlatego skup się na najczęściej używanych ścieżkach kodu. Jeśli na przykład metoda ze ścieżki klas rozruchowych jest używana przez jedną aplikację, nie powinna być częścią profili rozruchowych. Każde urządzenie powinno skonfigurować wybór metody lub klasy na podstawie wyboru najważniejszych ścieżek użytkownika i ilości danych wygenerowanych przez testy.
Aby zebrać informacje o ścieżce klas rozruchowych ze wszystkich profili poszczególnych 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 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 ze ścieżki klas rozruchowych mają zostać zoptymalizowane i która klasa ma zostać uwzględniona w obrazie.artrozruchu.Lista wstępnie wczytanych klas. Określa, które klasy są wstępnie wczytywane w Zygote.
Profil komponentów serwera systemowego (
frameworks/base/services/art-profile). Określa, które metody z serwera systemowego mają zostać zoptymalizowane lub skompilowane, która klasa ma zostać uwzględniona w obrazie.artrozruchu oraz jak mają być ułożone odpowiednie pliki DEX.
Format profilu ART
Profil ART przechwytuje informacje z każdego wczytanego pliku DEX, w tym informacje o metodach, które warto zoptymalizować, oraz o klasach używanych podczas uruchamiania. Gdy włączone jest profilowanie obrazu rozruchowego, ART uwzględnia w profilu również ścieżkę klas rozruchowych i pliki JAR serwera systemowego oraz opatruje każdy plik DEX nazwą pakietu, który go używa.
Aby na przykład zrzucić surowy profil obrazu rozruchowego, użyj tego polecenia:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.profWynik będzie podobny do tego:
=== 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 powyższym przykładzie:
core-oj.jarjest używany przezcom.google.android.ext.servicesicom.android.systemui. Każdy wpis zawiera 2 pakiety używane zcore-oj.jar.Oba procesy używają metody z indeksem DEX 520, ale tylko proces
systemuiużywa metody z indeksem DEX 521. Ta sama zasada dotyczy innych sekcji profilu (np. klas uruchamiania).
Podczas przetwarzania danych filtruj metody i klasy na podstawie użycia, przyznając priorytet procesom na poziomie systemu (np. serwerowi systemowemu lub systemui) albo metodom, które mogą nie być powszechnie używane, ale są ważne (np. metody używane przez aplikację aparatu).
Format profilu wewnętrznie opatruje każdą metodę kilkoma flagami (startup, post-startup, hotness, abi), co jest większą liczbą niż wyświetlana w formacie tylko do zrzutu. Aby wykorzystać wszystkie sygnały, zmodyfikuj dostępne skrypty.
Rekomendacje
Aby uzyskać najlepsze wyniki, postępuj zgodnie z tymi wskazówkami.
Wdróż konfigurację generowania profili obrazu rozruchowego na kilku urządzeniach testowych i przed wygenerowaniem ostatecznego profilu obrazu rozruchowego zagreguj wyniki. Narzędzie
profmanobsługuje agregowanie i wybieranie wielu profili obrazu rozruchowego, ale działa tylko z tą samą wersją obrazu rozruchowego (tą samą ścieżką klas rozruchowych).Przyznaj priorytet metodom i klasom używanym przez procesy systemowe. Te metody i klasy mogą używać kodu, który nie jest często używany przez inne aplikacje, ale jest kluczowy do zoptymalizowania.
Kształt danych z pojedynczego uruchomienia urządzenia bardzo różni się od kształtu danych z urządzeń testowych, które wykonują najważniejsze ścieżki użytkownika. Jeśli nie masz dużej floty urządzeń testowych, użyj tego samego urządzenia do uruchomienia kilku najważniejszych ścieżek użytkownika, aby zwiększyć pewność, że optymalizacje profilu obrazu rozruchowego będą dobrze działać w środowisku produkcyjnym (ten scenariusz opisujemy poniżej).
Konfigurowanie urządzeń
Aby włączyć konfigurację profilu rozruchowego za pomocą właściwości systemu, użyj jednej z tych metod.
Opcja 1. Ręczne ustawianie właściwości (działa do ponownego uruchomienia):
adb rootadb shell stopadb shell setprop dalvik.vm.profilebootclasspath trueadb shell setprop dalvik.vm.profilesystemserver trueadb shell startOpcja 2. Użyj pliku
local.prop(efekt trwały do momentu usunięcia pliku). Aby to zrobić:Utwórz plik
local.propo tej zawartości:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=trueUruchom te polecenia:
adb push local.prop /data/adb shell chmod 0750 /data/local.propadb reboot
Opcja 3. Użyj konfiguracji urządzenia, aby ustawić te właściwości po stronie serwera:
adb shell device_config put runtime_native_boot profilebootclasspath true adb shell device_config put runtime_native_boot profilesystemserver true
Generowanie profili obrazu rozruchowego
Aby wygenerować podstawowy profil obrazu rozruchowego za pomocą testowania na jednym urządzeniu, postępuj zgodnie z tymi instrukcjami.
Skonfiguruj urządzenie.
Skonfiguruj urządzenie zgodnie z opisem w sekcji Konfigurowanie urządzeń.
(Opcjonalnie) Wyczyszczenie i zastąpienie innych profili nowym formatem profilu zajmuje trochę czasu. Aby przyspieszyć zbieranie profili, zresetuj wszystkie profile na urządzeniu.
adb shell stopadb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"adb shell startUruchom na urządzeniu najważniejsze ścieżki użytkownika.
Przechwyć profil za pomocą tego polecenia:
adb shell cmd package snapshot-profile androidWyodrębnij profil za pomocą tego polecenia:
adb pull /data/misc/profman/android.profZa pomocą tych poleceń przejdź do plików JAR ścieżki klas rozruchowych:
m distls $ANDROID_PRODUCT_OUT/boot.zipWygeneruj profil obrazu rozruchowego za pomocą tego polecenia
profman:profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...Używając danych, dostosuj polecenie
profmanza pomocą dostępnych flag progowych wyboru:--method-threshold--class-threshold--clean-class-threshold--preloaded-class-threshold--upgrade-startup-to-hot--special-package
Pełną listę znajdziesz na stronie pomocy
profmanlub w kodzie źródłowym.