Ś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, w którym należy rozpocząć poszukiwania.

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

Śledzenie systemu śledzi tylko obszary oznaczone do śledzenia, dlatego ma niewielki narzut i nie wpływa znacząco na wydajność aplikacji. Śledzenie systemu jest przydatne do sprawdzania, jak długo działają poszczególne sekcje kodu.

Śledzenie metod śledzi każde wywołanie funkcji w aplikacji. Jest to bardzo kosztowne i dlatego 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 ślady systemu nie obejmują poszczególnych funkcji typu „composable”. Są one dostępne w śladach metod.

Śledzenie kompozycji pokazuje funkcje typu „composable” w śladach systemu. Ta funkcja zapewnia niski poziom ingerencji śledzenia systemu oraz poziom szczegółowości śledzenia metod w kompozycji.

Konfiguracja śledzenia kompozycji

Aby wypróbować śledzenie rekompozycji w projekcie, musisz zaktualizować go co najmniej do 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ć co najmniej poziom API 30.

Musisz też dodać nową zależność od Compose Runtime Tracing:

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

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

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

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

Dzięki tej zależności podczas śledzenia systemu, które obejmuje rekompozycję, możesz automatycznie zobaczyć funkcje typu „composable”.

Śledzenie systemu

Aby przeprowadzić śledzenie systemu i zobaczyć, jak działa nowe śledzenie rekompozycji, wykonaj te czynności:

  1. Otwórz profiler:

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

    Profiler Android Studio – oś czasu procesora
    Rysunek 3. Profiler Android Studio – oś czasu procesora
  3. Otwórz w aplikacji interfejs, 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 spowodować rekompozycję, i zatrzymaj nagrywanie. Gdy ślad zostanie przetworzony i się pojawi, powinny być widoczne funkcje typu „composable” w śladzie rekompozycji. Do powiększania i przesuwania śladu możesz używać klawiatury i myszy . Jeśli nie wiesz, jak poruszać się po śladzie, zapoznaj się z dokumentacją dotyczącą rejestrowania śladów.

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

    Dwukrotne kliknięcie funkcji typu „composable” na wykresie powoduje przejście do jej kodu źródłowego.

  5. Funkcje typu „composable” możesz też zobaczyć na wykresie płomieniowym wraz z numerem pliku i wiersza:

    Przykład wykresu płomieniowego przedstawiającego funkcje kompozycyjne.
    Rysunek 6. Wykres płomieniowy

Uwagi

Podczas korzystania ze śledzenia kompozycji pamiętaj o tych kwestiach dotyczących rozmiaru pliku APK i wydajności.

Narzut rozmiaru pliku APK

Staraliśmy się jak najbardziej zminimalizować narzut tej funkcji, ale w przypadku aplikacji Compose rozmiar pliku APK zwiększa się ze względu na ciągi śledzenia osadzone w pliku APK przez kompilator Compose. Ten wzrost rozmiaru może być stosunkowo niewielki, jeśli aplikacja nie używa zbyt wielu funkcji Compose, lub większy w przypadku aplikacji w pełni opartych na Compose. Te ciągi śledzenia są dodatkowo niezaszyfrowane, dzięki czemu mogą się pojawiać w narzędziach do śledzenia, jak pokazano wcześniej. Kompilator Compose wstawia je do wszystkich aplikacji, począwszy od wersji 1.3.0.

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

Pamiętaj, że pozostawienie tych funkcji w aplikacji, choć zwiększa rozmiar pliku APK, zapewnia, że profilowany plik APK jest taki sam jak ten, który uruchamiają użytkownicy aplikacji.

Dokładny pomiar czasu

Aby uzyskać dokładne profilowanie, podobnie jak w przypadku testów wydajności, musisz ustawić aplikację profileable i non-debuggable zgodnie z opisem w sekcji Aplikacje profilowane.

Rejestrowanie śladu z terminala

Ślad kompozycji można zarejestrować z terminala. Aby to zrobić, musisz wykonać czynności, które Android Studio zwykle wykonuje automatycznie.

Dodawanie zależności

Najpierw dodaj dodatkowe zależności do aplikacji.

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

Generowanie polecenia nagrywania

  1. Wygeneruj polecenie nagrywania za pomocą w Perfetto.
  2. Ręcznie dodaj sekcję źródła danych track_event zgodnie z tym przykładem:

    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

Rejestrowanie śladu

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

Otwieranie śladu

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

  2. Otwórz w Perfetto.

Rejestrowanie śladu za pomocą Jetpack Macrobenchmark

Wydajność możesz mierzyć za pomocą Jetpack Macrobenchmark, które udostępnia ślady jako wyniki. Aby włączyć śledzenie kompozycji za pomocą testó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 artykule Argumenty instrumentacji Macrobenchmark.

Prześlij opinię

Chętnie poznamy Twoją opinię na temat tej funkcji, wszelkie znalezione błędy i prośby. Możesz przesłać nam opinię za pomocą narzędzia do śledzenia problemów.