Śledzenie kompozycji

Logi czasu są często najlepszym źródłem informacji przy pierwszym badaniu problemu z wydajnością. Pozwalają też stworzyć hipotezę dotyczącą problemu i tego, gdzie szukać rozwiązania.

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

Śledzenie systemu śledzi tylko obszary oznaczone do śledzenia, więc ma niewielki narzut i nie wpływa znacząco na wydajność aplikacji. Śledzenie systemu to doskonały sposób na sprawdzenie, jak długo działają określone sekcje kodu.

Śledzenie metod śledzi każde wywołanie funkcji w aplikacji. Jest to bardzo kosztowne, dlatego w znacznym stopniu wpływa na wydajność aplikacji. Daje jednak pełny obraz tego, co się dzieje, jakie funkcje są wywoływane i jak często są wywoływane.

Domyślnie ślady systemu nie zawierają poszczególnych funkcji kompozycyjnych. Są one dostępne w śladach metod.

Obecnie testujemy nową funkcję śledzenia systemu, aby wyświetlać w logach czasu funkcje kompozycyjne. Nie przeszkadza im śledzenie systemu, a jednocześnie stosuje się poziomy szczegółowości kompozycji.

Skonfiguruj śledzenie kompozycji

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

  • Flaming na Androida Studio
  • Interfejs tworzenia wiadomości: 1.3.0
  • Kompilator tworzenia wiadomości: 1.3.0

Urządzenie lub emulator, na którym uruchamiasz log czasu, również musi mieć minimalny poziom API 30.

Musisz też dodać nową zależność od Śledzenia środowiska wykonawczego tworzenia:

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

Dzięki tej zależności, gdy przeprowadzasz log czasu systemu, który obejmuje zmianę kompozycji, możesz automatycznie zobaczyć funkcje kompozycyjne.

Przeprowadź log czasu

Aby uruchomić ślad systemu i zobaczyć, jak działa nowe śledzenie zmian, 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.

    Profiler Android Studio – oś czasu dotycząca procesora
    Rysunek 3. Profiler Android Studio – oś czasu z użyciem procesora
  3. Przejdź do interfejsu aplikacji, który chcesz śledzić, a następnie wybierz System Trace (Ślad systemu) i Record (Rekord)

    Opcje logu czasu – log czasu systemu
    Rysunek 4. Opcje śledzenia – log czasu systemu
  4. Użyj aplikacji, aby zmienić kompozycję i zatrzymać nagrywanie. Po przetworzeniu i wyświetleniu logu czasu funkcje kompozycyjne powinny być widoczne w logu czasu zmiany kompozycji. Za pomocą klawiatury i myszy możesz powiększać i przesuwać ślad. Jeśli nie wiesz, jak poruszać się po logu czasu, zapoznaj się z dokumentacją rejestrowania logów czasu.

    Śledzenie systemu
    Rysunek 5. Śledzenie systemu

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

  5. Możesz też zobaczyć kompozycje na wykresie płomieniowym wraz z plikiem i numerem wiersza:

    Wykres płomieniowy
    Rysunek 6. Wykres płomieniowy

Zastrzeżenia

Rozmiar pliku APK

Chcieliśmy zminimalizować obciążenie związane z tą funkcją, ale w przypadku aplikacji do tworzenia wiadomości zwiększył się rozmiar pliku APK pochodzącego z ciągów śledzących umieszczonych w pliku APK przez kompilator Compose. Ten wzrost rozmiaru może być względnie mały, jeśli aplikacja nie używa dużo funkcji tworzenia wiadomości lub większa w przypadku pełnych wersji aplikacji. Te ciągi znaków są dodatkowo niezaciemnione, 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 śledzące można usunąć w kompilacji produkcyjnej, dodając tę regułę Proardard:

-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ę zmienić w przyszłości, ale o wszelkich zmianach poinformujemy w informacjach o wersji w tworzeniu wiadomości.

Pamiętaj, że przechowywanie ich, choć wiąże się z pewnymi kosztami, gwarantuje, że profilowany plik APK jest tym samym, którego używają użytkownicy aplikacji.

Dokładne czasy

Aby dokładnie profilować, tak jak w przypadku każdego testu wydajności, musisz utworzyć aplikację profileable i non-debuggable zgodnie z aplikacjami profilowymi.

Zapisz log czasu z terminala

Ślad kompozycji można przechwycić z terminala. Aby to zrobić, musisz wykonać czynności, które Android Studio zwykle wykonuje 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, używając polecenia Perfetto.
  2. Ręcznie dodaj sekcję źródła danych track_event, postępując 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> log czasu z urządzenia (lokalizacja podana w poleceniu rekordu).

  2. Otwórz w Perfetto.

Śledź ślady dzięki 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ą znaczników macrobench, musisz:

  1. Dodaj te 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 wykonaniem testów porównawczych dodaj argument instrumentacji androidx.benchmark.fullTracing.enable=true. Więcej informacji o argumentach instrumentacji w makroporównaniu znajdziesz w artykule o argumentach narzędzi makroporównawczych.

Opinia

Chętnie poznamy Twoją opinię na temat tej funkcji, ewentualnych błędów oraz ewentualnych próśb. Możesz przesłać nam opinię za pomocą narzędzia do śledzenia problemów.