Ś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.0")

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

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

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

Dzięki tej zależności, gdy wykonasz śledzenie systemu obejmujące rekompozycję, możesz automatycznie zobaczyć funkcje typu „composable”.

Wykonaj śledzenie systemu

Aby wykonać ś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.

    Śledzenie systemu
    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:

    Wykres płomieniowy
    Rysunek 6. Wykres płomieniowy

Ograniczenia

Narzut rozmiaru pliku APK

Staraliśmy się jak najbardziej zminimalizować narzut tej funkcji, ale w przypadku aplikacji Compose występuje wzrost rozmiaru pliku APK spowodowany ciągami śledzenia osadzonymi 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

Możesz zarejestrować ślad kompozycji 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 polecenie nagrywania utworzone wcześniej.

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óra 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 przez Ciebie błędy i Twoje prośby. Możesz przesłać nam opinię za pomocą narzędzia do śledzenia problemów.