Profile obrazu rozruchowego

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).

Profil obrazu rozruchowego

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 przez com.google.android.ext.servicescom.android.systemui. Każdy wpis zawiera 2 pakiety użyte na koncie core-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ć:

    1. Utwórz plik local.prop z tą zawartością:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. 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.

  1. Skonfiguruj urządzenie.

    1. Skonfiguruj urządzenie zgodnie z opisem w sekcji Konfigurowanie urządzeń.

    2. (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
      
    3. Uruchom główne ścieżki dźwiękowe na urządzeniu.

  2. Przechwytuj profil za pomocą tego polecenia:

    adb shell cmd package snapshot-profile android
    
  3. Rozpakuj profil za pomocą tego polecenia:

    adb pull /data/misc/profman/android.prof
    
  4. Przejdź do plików JAR ścieżki klaszystycznia uruchamiania za pomocą tych poleceń:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
    
  5. 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=...
    
  6. 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.