Śledzenie kompozycji

Ślady są często najlepszym źródłem informacji, gdy po raz pierwszy analizujesz problem z wydajnością. Pozwalają one sformułować hipotezę dotyczącą problemu i miejsca, od którego należy zacząć poszukiwania.

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

Śledzenie systemu śledzi tylko obszary specjalnie oznaczone do śledzenia, więc nie obciąża systemu i nie wpływa znacząco na wydajność aplikacji. Śledzenie systemu świetnie nadaje się do sprawdzania, ile czasu zajmuje wykonanie poszczególnych sekcji kodu.

Śledzenie metod śledzi każde wywołanie funkcji w aplikacji. Jest to bardzo kosztowne i ma duży wpływ 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 typu „composable”. Są one dostępne w śladach metod.

Śledzenie kompozycji pokazuje funkcje typu „composable” w śledzeniu systemu. Ta funkcja zapewnia niską inwazyjność śledzenia systemu, a jednocześnie szczegółowość śledzenia metod w ramach kompozycji.

Konfiguracja śledzenia kompozycji

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

  • Android Studio Flamingo
  • Compose UI: 1.3.0
  • Compose Compiler: 1.3.0

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

Dodatkowo musisz dodać nową zależność od śledzenia środowiska wykonawczego Compose:

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

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

val composeBom = platform("androidx.compose:compose-bom:2026.09.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ę, automatycznie zobaczysz funkcje typu „composable”.

Śledzenie systemu

Aby przeprowadzić śledzenie systemu i zobaczyć nowe śledzenie kompozycji w działaniu, wykonaj te czynności:

  1. Otwórz profiler:

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

    Profiler Android Studio – oś czasu procesora
    Rysunek 3. Profiler Android Studio – oś czasu procesora
  3. W aplikacji przejdź do interfejsu, który chcesz śledzić, a następnie wybierz Śledzenie systemu i Nagraj.

    Opcje śledzenia – śledzenie systemu
    Rysunek 4. Opcje śledzenia – śledzenie systemu
  4. Użyj aplikacji, aby wywołać rekompozycję i zatrzymać nagrywanie. Gdy ślad zostanie przetworzony i wyświetlony, powinny być widoczne elementy kompozycyjne w śladzie kompozycji. Możesz używać klawiatury i myszy, aby powiększać i przesuwać ślad. Jeśli nie wiesz, jak poruszać się po śladzie, zapoznaj się z dokumentacją dotyczącą rejestrowania śladów.

    Przykład wizualizacji śledzenia systemu w Android Studio.
    Rysunek 5. Śledzenie systemu

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

  5. Na wykresie płomieniowym możesz też zobaczyć funkcje kompozycyjne wraz z plikiem i numerem wiersza:

    Przykład wykresu płomieniowego z funkcjami typu „composable”.
    Rysunek 6. Wykres płomieniowy

Uwagi

Korzystając ze śledzenia kompozycji, weź pod uwagę te zastrzeżenia dotyczące rozmiaru i wydajności pliku APK.

Narzut rozmiaru pliku APK

Chociaż staraliśmy się jak najbardziej zminimalizować obciążenie związane z tą funkcją, rozmiar pliku APK aplikacji Compose zwiększa się ze względu na ciągi znaków śledzenia umieszczone w pliku APK przez kompilator Compose. Jeśli aplikacja nie korzysta zbyt często z Compose, wzrost rozmiaru może być stosunkowo niewielki, ale w przypadku aplikacji, które w pełni korzystają z Compose, może być większy. Te ciągi śledzenia są dodatkowo niezaszyfrowane, dzięki czemu mogą pojawiać się w narzędziach do śledzenia, jak pokazano wcześniej. Kompilator Compose wstrzykuje je do wszystkich aplikacji, począwszy od wersji 1.3.0.

Ciągi znaków śledzenia można usunąć z kompilacji produkcyjnej, 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ę zmienić w przyszłości, ale wszelkie zmiany zostaną opisane w informacjach o wersji Compose.

Pamiętaj, że zachowanie funkcji, mimo że zwiększa rozmiar pliku APK, gwarantuje, że profilowany plik APK jest taki sam jak ten, który uruchamiają użytkownicy aplikacji.

Dokładny czas

Aby profilowanie było dokładne, tak jak w przypadku każdego testowania wydajności, musisz ustawić aplikację jako profileable i non-debuggable zgodnie z aplikacjami, które można profilować.

Przechwytywanie logu czasu z terminala

Ślad kompozycji można przechwycić 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 nagrywania

  1. Wygeneruj polecenie nagrywania za pomocą Perfetto.
  2. Ręcznie dodaj sekcję źródła danych track_event, 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

Przechwytywanie logu czasu

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

    # 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 utworzone wcześniej polecenie nagrywania.

Otwieranie logu czasu

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

  2. Otwórz w Perfetto.

Przechwytywanie logu czasu za pomocą Jetpack Macrobenchmark

Wydajność możesz mierzyć za pomocą Jetpack Macrobenchmark, który dostarcza wyniki w postaci logów czasu. Aby włączyć śledzenie kompozycji za pomocą makrotestów porównawczych, musisz:

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

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

Śledzenie rekompozycji

Śledzenie rekompozycji dodaje do śledzenia odczyty i zapisy stanu, które powodują rekompozycję funkcji typu „composable”, oprócz funkcji typu „composable” ze śledzenia kompozycji. Dzięki temu możesz dowiedzieć się, która zmiana stanu wywołała rekompozycję.

Śledzenie rekompozycji wiąże się z większym obciążeniem niż śledzenie kompozycji, dlatego używaj go do debugowania rekompozycji, a nie do pomiaru wydajności.

Konfiguracja śledzenia rekompozycji

Dodaj do modułu aplikacji zależność od Compose Runtime Tracing w wersji 1.13.0 lub nowszej:

// Compose BOM 2026.11.00+ (runtime-tracing 1.13.0+)
implementation("androidx.compose.runtime:runtime-tracing")

Urządzenie lub emulator, na którym uruchamiasz śledzenie, musi mieć interfejs API na poziomie 29 lub wyższym.

Przechwytywanie logu czasu rekompozycji

Użyj skryptu record_recomposition_trace.py, aby przechwycić ślad rekompozycji z terminala.

  1. Uruchom aplikację i przygotuj sekcję, którą chcesz prześledzić.
  2. Rozpocznij nagrywanie:

    ./record_recomposition_trace.py -p <your app package>
  3. Użyj aplikacji, aby wywołać rekompozycję, a następnie naciśnij Control + C, aby zatrzymać nagrywanie. Aby nagrywać przez określony czas, podaj czas trwania w sekundach za pomocą parametru -t, na przykład -t 10.

Skrypt włącza śledzenie tworzenia i ponownego tworzenia w aplikacji, rejestruje śledzenie systemu, a następnie wyłącza śledzenie i zapisuje wszystkie ślady w jednym pliku <package>-recompose-<timestamp>.zip w bieżącym katalogu. Otwórz plik w Perfetto.

Wybranie zapisu stanu powoduje wyświetlenie stosu wywołań, który zmienił stan, a strzałka przepływu wskazuje rekompozycję, którą spowodował:

Ślad rekompozycji w Perfetto z wybranym zapisem stanu, jego stosem wywołań i strzałką przepływu wskazującą na wywołaną przez niego rekompozycję.
Rysunek 7. Ślad rekompozycji w Perfetto

Uruchom skrypt z opcją --help, aby zobaczyć wszystkie opcje, takie jak niestandardowa konfiguracja Perfetto czy rozmiar bufora śledzenia.

Prześlij opinię

Chętnie poznamy Twoją opinię na temat tej funkcji, a także informacje o błędach i Twoje prośby. Możesz przesłać nam opinię za pomocą narzędzia Issue Tracker.