Ś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, powinny być widoczne 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 kompozytowalności na wykresie powoduje przejście do jej kodu źródłowego.

  5. Składowe możesz też zobaczyć na wykresie płomienia, wraz z numerem pliku i numerem 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łnej 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 te dodatkowe zależności do modułu testu Macrobenchmark:

    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.