Ś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 określić, od czego zacząć poszukiwania.

Android obsługuje 2 poziomy śledzenia: śledzenie systemu i śledzenie metod.

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

Śledzenie metod rejestruje 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 ślady systemowe nie obejmują poszczególnych funkcji kompozycyjnych. Są one dostępne w śladach metod.

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

Konfigurowanie śledzenia kompozycji

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

  • Android Studio Flamingo
  • Compose UI: 1.3.0
  • Kompilator Compose: 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 śledzenia środowiska wykonawczego Compose:

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

Jeśli używasz tworzenia listy materiałowej, 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 podczas tworzenia śladu systemowego, który obejmuje ponowne komponowanie, możesz automatycznie wyświetlać funkcje kompozycyjne.

Wykonaj śledzenie systemu

Aby wykonać śledzenie systemu i zobaczyć w działaniu nowe śledzenie ponownego komponowania, 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 potem wybierz Ślad systemowyNagrywaj.

    Opcje śledzenia – śledzenie systemu
    Rysunek 4. Opcje śledzenia – śledzenie systemu
  4. Użyj aplikacji, aby spowodować ponowne komponowanie i zatrzymać nagrywanie. Po przetworzeniu śladu i jego wyświetleniu w śladzie ponownego komponowania powinny być widoczne funkcje kompozycyjne. Aby powiększać i przesuwać ślad, możesz używać klawiatury i myszy. Jeśli nie wiesz, jak poruszać się po śladzie, zapoznaj się z dokumentacją nagrywania śladów.

    Śledzenie systemu
    Rysunek 5. Śledzenie systemu

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

  5. Wykres płomieniowy zawiera też funkcje kompozycyjne oraz nazwę pliku i numer wiersza:

    Wykres płomieniowy
    Rysunek 6. Wykres płomieniowy

Uwagi

Dodatkowy rozmiar pliku APK

Staraliśmy się jak najbardziej zminimalizować obciążenie związane z tą funkcją, ale w przypadku aplikacji napisanych w Compose rozmiar pliku APK wzrośnie z powodu ciągów śledzenia osadzonych w pliku APK przez kompilator Compose. Wzrost rozmiaru może być stosunkowo niewielki, jeśli aplikacja nie korzysta w dużym stopniu z Compose, lub większy w przypadku aplikacji w pełni opartych na Compose. 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 ś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();

}

Funkcje te mogą się zmienić w przyszłości, ale wszelkie zmiany będą wymienione w informacjach o wersji Compose.

Pamiętaj, że zachowanie funkcji, choć wiąże się z pewnym kosztem rozmiaru pliku APK, zapewnia, że profilowany plik APK jest taki sam jak ten, którego używają użytkownicy aplikacji.

Dokładne pomiary czasu

Aby uzyskać dokładne profilowanie, podobnie jak w przypadku wszystkich testów wydajności, musisz przygotować aplikację profileablenon-debuggable zgodnie z wymaganiami dotyczącymi aplikacji, które można profilować.

Uzyskiwanie ś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 do aplikacji dodatkowe zależności.

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

Otwórz ślad

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

  2. Otwórz w Perfetto.

Rejestrowanie śladu za pomocą biblioteki Jetpack Macrobenchmark

Skuteczność możesz mierzyć za pomocą Jetpack Macrobenchmark, która podaje wyniki w postaci śladów. Aby włączyć śledzenie kompozycji za pomocą testów porównawczych makro, 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 androidx.benchmark.fullTracing.enable=trueinstrumentacji. Więcej informacji o argumentach instrumentacji Macrobenchmark znajdziesz w artykule Argumenty instrumentacji Macrobenchmark.

Opinia

Chętnie poznamy Twoją opinię o tej funkcji, wszelkie znalezione w niej błędy i Twoje prośby. Możesz przesłać nam opinię, korzystając z narzędzia do rejestrowania błędów.