Ś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, ile czasu zajmuje wykonanie poszczególnych sekcji 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.
Dodatkowo musisz dodać nową zależność od śledzenia środowiska wykonawczego Compose:
implementation("androidx.compose.runtime:runtime-tracing:1.9.3")
Jeśli używasz Compose BOM, nie musisz określać wersji:
val composeBom = platform("androidx.compose:compose-bom:2025.10.01")
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:
Otwórz profiler:
Rysunek 2 Android Studio – rozpocznij profilowanie Kliknij Oś czasu procesora.
Rysunek 3. Profiler Android Studio – oś czasu procesora Otwórz w aplikacji interfejs, który chcesz śledzić, a potem wybierz Ślad systemowy i Nagrywaj.
Rysunek 4. Opcje śledzenia – śledzenie systemu Użyj aplikacji, aby spowodować ponowne skomponowanie 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.
Rysunek 5. Śledzenie systemu Dwukrotne kliknięcie elementu kompozycyjnego na wykresie powoduje przejście do jego kodu źródłowego.
W wykresie płomieniowym możesz też zobaczyć funkcje kompozycyjne wraz z numerem pliku i wiersza:
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();
}
Te funkcje mogą się w przyszłości zmienić, ale wszelkie zmiany będą wymienione w informacjach o wersji Compose.
Pamiętaj, że zachowanie funkcji, mimo że zwiększa rozmiar 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ę profileable i non-debuggable zgodnie z informacjami w sekcji Aplikacje, które można profilować.
Uzyskiwanie śladu z terminala
Ślad kompozycji można uzyskać 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
- Wygeneruj polecenie nagrywania za pomocą Perfetto.
Ręcznie dodaj sekcję źródła danych
track_eventzgodnie 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
- Uruchom aplikację i przygotuj sekcję, którą chcesz śledzić.
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.TracingReceiverUruchom polecenie nagrywania utworzone wcześniej.
Otwórz ślad
adb pull <location>ślad z urządzenia (lokalizacja określona w poleceniu record);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:
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")Przed uruchomieniem testów porównawczych dodaj
androidx.benchmark.fullTracing.enable=trueargument instrumentacji. 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.