Ś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 obejmuje 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.

Śledzenie kompozycji wyświetla funkcje typu „composable” w ramach śladów systemowych. Ta funkcja zapewnia niski poziom inwazyjności dzięki śledzeniu systemu i szczegółowym informacjom o metodach śledzenia w kompozycji.

Konfiguracja śledzenia kompozycji

Aby wypróbować śledzenie rekompozycji w projekcie, musisz zaktualizować te wersje:

  • 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 w środowisku wykonawczym Compose:

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

Jeśli używasz kompilowania pliku BOM, nie musisz określać wersji:

val composeBom = platform("androidx.compose:compose-bom:2025.05.00")
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ę, możesz automatycznie zobaczyć funkcje kompozytowe.

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 prześledzić, a potem wybierz System śledzeniaNagrywaj.

    Opcje śledzenia – śledzenie systemu
    Rysunek 4. Opcje śledzenia – śledzenie systemu
  4. Użyj aplikacji, aby spowodować ponowne złożenie i zatrzymać nagrywanie. Gdy ślad zostanie przetworzony i wyświetlony, powinieneś zobaczyć elementy kompozytowe 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 kompozytowalnej funkcji 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 kompilator Compose umieszcza w pliku APK. 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 funkcji, które zwiększają rozmiar pliku APK, zapewnia, ż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.

Tworzenie śledzenia 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, znalezione przez Ciebie błędy oraz prośby. Opinię możesz przesłać za pomocą narzędzia do zgłaszania problemów.