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

Konfiguracja śledzenia kompozycji

Aby wypróbować śledzenie rekompozycji 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ę, funkcje typu „composable” będą widoczne automatycznie.

Śledzenie systemu

Aby przeprowadzić śledzenie systemu i zobaczyć nowe śledzenie rekompozycji 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. Android Studio Profiler – 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. Po przetworzeniu i wyświetleniu śladu powinny być widoczne elementy kompozycyjne w śladzie rekompozycji. 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 pakietu 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ę z powodu ciągów znaków śledzenia umieszczonych 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 aplikacji, które w pełni korzystają z Compose. Te ciągi śledzenia są dodatkowo niezaszyfrowane, więc 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 ś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ładnie wybrany moment

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.

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.