Śledzenie kompozycji

Ścieżki są często najlepszym źródłem informacji na początku analizowania problemu z wydajnością. Pozwalają one wysnuć hipotezę na temat problemu i miejsca, w którym należy zacząć poszukiwania.

Na Androidzie obsługiwane są 2 poziomy śledzenia: śledzenie systemu i śledzenie metody.

Śledzenie systemowe śledzi tylko obszary specjalnie oznaczone do śledzenia, więc ma niewielkie obciążenie i nie wpływa znacząco na wydajność aplikacji. Śledzenie systemu to świetny sposób na sprawdzenie, ile czasu zajmuje wykonanie poszczególnych fragmentów kodu.

Śledzenie metody śledzi każde wywołanie funkcji w aplikacji. Jest to bardzo kosztowne, co znacznie wpływa na wydajność aplikacji, ale daje pełny obraz tego, co się dzieje, jakie funkcje są wywoływane i jak często.

Domyślnie śledzenie systemu nie obejmuje poszczególnych funkcji składanych. Są one dostępne w śladach metody.

Obecnie testujemy nową funkcję śledzenia systemu, która umożliwia wyświetlanie funkcji składanych w ramach śladów systemowych. Zapewnia ona niski poziom inwazyjności śledzenia systemowego, a także szczegółowe informacje o metodach śledzenia w kompozycji.

Konfigurowanie śledzenia kompozycji

Aby wypróbować śledzenie rekompozycji w projekcie, musisz zaktualizować program do co najmniej tych wersji:

  • Android Studio Flamingo
  • Interfejs tworzenia: 1.3.0
  • Kompilator Compose: 1.3.0

Urządzenie lub emulator, na którym uruchamiasz śledzenie, musi też mieć co najmniej poziom API 30.

Dodatkowo musisz dodać nowe zależności od śledzenia środowiska wykonawczego Compose:

implementation("androidx.compose.runtime:runtime-tracing:1.7.5")

Jeśli używasz listy materiałów do tworzenia, nie musisz określać wersji:

val composeBom = platform("androidx.compose:compose-bom:2024.10.01")
implementation(composeBom)
// ...

// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")

Dzięki tej zależności, gdy wykonasz śledzenie systemu, które obejmuje rekompozycję, funkcje kompozytowe będą automatycznie widoczne.

Wykonywanie śledzenia systemu

Aby przeprowadzić śledzenie systemu i zobaczyć nowe śledzenie rekompozycji w akcji:

  1. Otwórz profilator:

    Android Studio – rozpoczęcie profilowania
    Rysunek 2. Android Studio – rozpoczęcie profilowania
  2. Kliknij Oś czasu procesora.

    Profilowanie w Android Studio – linia czasu procesora
    Rysunek 3. Profilowanie w Android Studio – linia czasu CPU
  3. Przejdź w aplikacji do interfejsu, który chcesz śledzić, a potem wybierz System, ŚledźNagrywaj.

    Opcje śledzenia – śledzenie systemu
    Rysunek 4. Opcje śledzenia – śledzenie systemu
  4. Użyj aplikacji, aby spowodować ponowne skompilowanie i zatrzymać nagrywanie. Gdy ślad zostanie przetworzony i wyświetlony, powinieneś zobaczyć elementy składowe w śladzie ponownego składania. Za pomocą klawiatury i myszy możesz powiększać i przesuwać widok ścieżki. Jeśli nie wiesz, jak się po niej poruszać, zapoznaj się z dokumentacją dotyczącą nagrywania ścieżek.

    Śledzenie systemu
    Rysunek 5. Ślad systemu

    Kliknięcie dwukrotnie na kompozytywnym na wykresie powoduje przejście do jego kodu źródłowego.

  5. Na diagramie płomienia możesz też zobaczyć komponenty wraz z numerem pliku i linii:

    Wykres płomieniowy
    Rysunek 6. Wykres płomieniowy

Uwagi

Nadmiar rozmiaru pliku APK

Chociaż staraliśmy się zminimalizować obciążenie tej funkcji, rozmiar plików APK aplikacji Compose zwiększa się z powodu ciągów znaków do śledzenia, które są umieszczane w pliku APK przez kompilator Compose. Wzrost rozmiaru może być stosunkowo niewielki, jeśli aplikacja nie korzysta zbyt często z Compose, lub większy w przypadku pełnych aplikacji Compose. Te ciągi znaków są dodatkowo odszyfrowane, aby mogły być widoczne w narzędziach do śledzenia, jak pokazano wcześniej. Kompilator Compose wstrzykuje je do wszystkich aplikacji, począwszy od wersji 1.3.0.

W wersji produkcyjnej można usunąć ciągi znaków służące do śledzenia, dodając tę regułę Proguard:

-assumenosideeffects public class androidx.compose.runtime.ComposerKt {

   boolean isTraceInProgress();

   void traceEventStart(int,int,int,java.lang.String);

   void traceEventStart(int,java.lang.String);

   void traceEventEnd();

}

Te funkcje mogą się w przyszłości zmienić, ale o wszelkich zmianach będziemy informować w informacjach o wersji.

Pamiętaj, że pozostawienie tych danych (choć wiąże się to z pewnym kosztem w zakresie rozmiaru pliku APK) gwarantuje, że profilowany plik APK jest taki sam jak ten, który użytkownicy uruchamiają.

dokładne ustalanie czasu;

Aby uzyskać dokładne wyniki profilowania, podobnie jak w przypadku testów wydajności, musisz utworzyć aplikację profileablenon-debuggable zgodnie z profilowanymi aplikacjami.

Przechwytywanie informacji o wykonywaniu w terminalu

Można przechwycić ślad kompozytorski z terminala. Aby to zrobić, musisz wykonać czynności, które Android Studio zwykle wykonuje automatycznie.

Dodawanie zależności

Najpierw dodaj do aplikacji dodatkowe zależności.

implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")

Wygeneruj polecenie rejestracji

  1. Wygeneruj polecenie rejestrowania za pomocą Perfetto.
  2. Ręcznie dodaj sekcję track_event źródła danych, jak w tym przykładzie:

    adb shell perfetto \
      -c - --txt \
      -o /data/misc/perfetto-traces/trace \
    <<EOF
    buffers: {
        size_kb: 63488
        fill_policy: RING_BUFFER
    }
    buffers: {
        size_kb: 2048
        fill_policy: RING_BUFFER
    }
    data_sources: {
        config {
            name: "track_event"
        }
    }
    duration_ms: 10000
    flush_period_ms: 30000
    incremental_state_config {
        clear_period_ms: 5000
    }
    EOF
    

Tworzenie logu czasu

  1. Uruchom aplikację i przygotuj sekcję, którą chcesz śledzić.
  2. Włącz śledzenie w aplikacji, wysyłając transmisję.

    # set app package variable, e.g. com.google.samples.apps.nowinandroid.debug
    # can be found through `adb shell ps -ef` or `adb shell cmd package list packages`
    package=<your app process>
    
    # issue a broadcast to enable tracing
    adb shell am broadcast \
    -a androidx.tracing.perfetto.action.ENABLE_TRACING \
    $package/androidx.tracing.perfetto.TracingReceiver
    
  3. Uruchom wcześniej utworzone polecenie nagrywania.

Otwórz ślad

  1. adb pull <location> ślad z urządzenia (lokalizacja określona w komendzie record).

  2. Otwórz w Perfetto.

Tworzenie śladu za pomocą Jetpack Macrobenchmark

Wydajność możesz mierzyć za pomocą testu makrobenchmarku Jetpacka, który w wyniku zwraca ścieżki. Aby włączyć śledzenie kompozycji za pomocą makrobenchmarków, wykonaj te czynności:

  1. Dodaj do modułu testu Macrobenchmark te dodatkowe zależności:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. Dodaj argument androidx.benchmark.fullTracing.enable=true przed uruchomieniem testów porównawczych. Więcej informacji o argumentach instrumentacji Macrobenchmark znajdziesz w artykule Argumenty instrumentacji Macrobenchmark.

Opinia

Chętnie poznamy Twoją opinię na temat tej funkcji, znalezionych w niej błędów oraz Twoje sugestie. Opinię możesz przesłać za pomocą problemu w systemie śledzenia.