Śledzenie kompozycji

Ślady są często najlepszym źródłem informacji, gdy po raz pierwszy analizujesz problem z wydajnością. Pozwalają sformułować hipotezę, na czym polega problem i od czego szukać.

Na Androidzie obsługiwane są 2 poziomy śledzenia: śledzenie systemu i metoda.

Śledzenie systemu śledzi tylko obszary specjalnie oznaczone do śledzenia, więc wiąże się z niskim narzutem i nie wpływa znacząco na wydajność aplikacji. Śledzenie systemu to świetny sposób na sprawdzenie, ile czasu zajmuje wykonywanie poszczególnych sekcji kodu.

Śledzenie metod śledzi wszystkie wywołania 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 są wywoływane.

Domyślnie logi systemowe nie obejmują poszczególnych funkcji kompozycyjnych. Są one dostępne w logach metod.

Obecnie testujemy nową funkcję śledzenia systemu, aby pokazać funkcje kompozycyjne w śladach systemu. Zapewnia to bezproblemową uciążliwość śledzenia systemu, a z poziomem szczegółowości kompozycji śledzenia metod.

Skonfiguruj śledzenie kompozycji

Aby wypróbować śledzenie zmiany kompozycji w projekcie, musisz zaktualizować ją do co najmniej tych wersji:

  • Android Studio – flaming
  • Interfejs tworzenia wiadomości: 1.3.0
  • Kompilator Compose: 1.3.0

Urządzenie lub emulator, na którym uruchamiasz śledzenie, musi też mieć minimalny poziom interfejsu API 30.

Dodatkowo musisz dodać nową zależność od śledzenia środowiska wykonawczego Compose:

implementation("androidx.compose.runtime:runtime-tracing:1.0.0-beta01")

Dzięki tej zależności, gdy uruchomisz zrzut systemu obejmujący zmianę kompozycji, funkcje kompozycyjne pojawią się automatycznie.

Śledź system

Aby uruchomić ślad systemu i zobaczyć, jak działa nowe śledzenie zmiany kompozycji, wykonaj te czynności:

  1. Otwórz program profilujący:

    Android Studio – Rozpocznij profilowanie
    Rysunek 2. Android Studio – rozpocznij profilowanie
  2. Kliknij Oś czasu procesora.

    Program profilujący Android Studio – oś czasu procesora
    Rysunek 3. Android Studio Profiler – oś czasu procesora
  3. Przejdź do interfejsu aplikacji, który chcesz śledzić, a następnie wybierz Śledzenie systemu i Rejestr

    Opcje logu czasu – log czasu systemu
    Rysunek 4. Opcje logu czasu – log czasu systemu
  4. Aby zmienić kompozycję i zatrzymać nagrywanie, użyj aplikacji. Gdy log czasu zostanie przetworzony i pojawi się, elementy kompozycyjne powinny być widoczne w logu czasu zmiany kompozycji. Możesz używać klawiatury i myszy do powiększania i przesuwania logu czasu. Jeśli nie wiesz, jak poruszać się po logu, zapoznaj się z dokumentacją rejestrowania logów czasu.

    Śledzenie systemu
    Rysunek 5. Śledzenie systemu

    Dwukrotne kliknięcie funkcji kompozycyjnej na wykresie spowoduje otwarcie jej kodu źródłowego.

  5. Elementy kompozycyjne możesz też zobaczyć na wykresie płomieniowym wraz z numerem pliku i wiersza:

    Wykres płomieniowy
    Rysunek 6. Wykres płomieniowy

Uwagi

narzut związany z rozmiarem pliku APK

Chcieliśmy jak najbardziej ograniczyć koszty związane z korzystaniem z tej funkcji, ale w przypadku aplikacji do tworzenia wiadomości, które pochodzą z ciągów śledzenia umieszczonych w pliku APK przez kompilator Compose, zwiększyliśmy rozmiar plików APK. Ten wzrost może być stosunkowo niewielki, jeśli Twoja aplikacja nie używa zbyt wielu funkcji tworzenia wiadomości lub większych. Te ciągi śledzenia są dodatkowo nie zaciemnione, 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 śledzące 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();

}

W przyszłości mogą one ulec zmianie, ale o wszelkich zmianach będzie można poinformować w informacjach o wersji Utwórz.

Pamiętaj, że uwzględnienie plików i jednocześnie wiążą się z kosztem związanych z ich rozmiarem, gwarantuje, że profilowany plik APK będzie taki sam, jaki uruchamiają użytkownicy aplikacji.

Dokładny czas

Aby profilowanie było dokładne, tak jak w przypadku każdego testu wydajności, musisz skonfigurować aplikację profileable i non-debuggable zgodnie z aplikacjami z możliwością profilowania.

Zapisz log czasu z terminala

Zrzut kompozycji można przechwycić z terminala. Musisz to zrobić automatycznie.

Dodaj 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 rekordu

  1. Wygeneruj polecenie rekordu w Perfetto.
  2. Dodaj ręcznie 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
    

Zapisz ślad

  1. Uruchom aplikację i przygotuj sekcję, którą chcesz ś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 wcześniej utworzone polecenie nagrywania.

Otwórz log czasu

  1. adb pull <location> loguje log na urządzeniu (lokalizację określoną w poleceniu rejestru).

  2. Otwórz w Perfetto.

Rejestrowanie logów przy użyciu Jetpack Macrobenchmark

Wydajność możesz mierzyć za pomocą narzędzia Jetpack Macrobenchmark, które udostępnia logi czasu jako wyniki. Aby włączyć śledzenie kompozycji za pomocą macrobenchmarków, musisz wykonać te czynności:

  1. Dodaj do modułu testu Macrobenchmark te dodatkowe zależności:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. Zanim uruchomisz testy porównawcze, dodaj argument instrumentacji androidx.benchmark.fullTracing.enable=true. Więcej informacji o argumentach instrumentacji w analizie porównawczej znajdziesz w artykule Argumenty instrumentacji w analizie porównawczej.

Opinia

Chętnie poznamy Twoją opinię na temat tej funkcji, znalezionych z nią błędów i Twoich próśb. Możesz przesłać nam opinię, korzystając z narzędzia do śledzenia problemów.