Profile obrazów rozruchowych

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

Profil obrazu rozruchowego

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 .art rozruchu.

  • 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 .art rozruchu 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.prof

Wynik 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.jar jest używany przez com.google.android.ext.services i com.android.systemui. Każdy wpis zawiera 2 pakiety używane z core-oj.jar.

  • Oba procesy używają metody z indeksem DEX 520, ale tylko proces systemui uż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 profman obsł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 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 pliku local.prop (efekt trwały do momentu usunięcia pliku). Aby to zrobić:

    1. Utwórz plik local.prop o tej 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:

    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.

  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 zajmuje 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 na urządzeniu najważniejsze ścieżki użytkownika.

  2. Przechwyć profil za pomocą tego polecenia:

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

    adb pull /data/misc/profman/android.prof
  4. Za pomocą tych poleceń przejdź do plików JAR ścieżki klas rozruchowych:

    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. Używając danych, dostosuj polecenie profman za 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 profman lub w kodzie źródłowym.