Przechwytywanie danych analizy porównawczej

Dane to główny typ informacji wyodrębnionych z testów porównawczych. Są one przekazywane do funkcji measureRepeated jako List, co pozwala określić wiele objętych pomiarem danych jednocześnie. Test porównawczy wymaga co najmniej jednego typu danych.

Ten fragment kodu rejestruje dane dotyczące czasu renderowania klatek i niestandardowych sekcji śledzenia:

Kotlin

benchmarkRule.measureRepeated(
    packageName = TARGET_PACKAGE,
    metrics = listOf(
        FrameTimingMetric(),
        TraceSectionMetric("RV CreateView"),
        TraceSectionMetric("RV OnBindView"),
    ),
    iterations = 5,
    // ...
)

Java

benchmarkRule.measureRepeated(
    TARGET_PACKAGE,     // packageName
    Arrays.asList(      // metrics
        new StartupTimingMetric(),
        new TraceSectionMetric("RV CreateView"),
        new TraceSectionMetric("RV OnBindView"),
    ),
    5,                  // Iterations
    // ...
);

W tym przykładzie RV CreateView i RV OnBindView to identyfikatory możliwych do śledzenia bloków zdefiniowane w sekcji RecyclerView. Kod źródłowy metody createViewHolder() jest przykładem definiowania możliwych do śledzenia bloków we własnym kodzie.

StartupTimingMetric, TraceSectionMetric, FrameTimingMetric i PowerMetric omówimy szczegółowo w dalszej części tego dokumentu.

Wyniki testów porównawczych są wysyłane do Android Studio, tak jak na ilustracji 1. Jeśli zdefiniowano wiele danych, w wynikach wyjściowych będą się one wyświetlać wszystkie.

Wyniki metod TraceSectionMetric i FrameTimingMetric.
Rysunek 1. Wyniki: TraceSectionMetric i FrameTimingMetric.

Wskaźnik czasu uruchamiania

StartupTimingMetric rejestruje dane o czasie uruchamiania aplikacji z tymi wartościami:

  • timeToInitialDisplayMs: czas od momentu, w którym system otrzymuje intencję uruchomienia, do wyrenderowania pierwszej klatki miejsca docelowego Activity.
  • timeToFullDisplayMs: czas od momentu, w którym system otrzymuje intencję uruchomienia, do momentu pełnego przesłania raportów o aplikacji przy użyciu metody reportFullyDrawn(). Pomiar kończy się po zakończeniu renderowania pierwszej klatki po wywołaniu reportFullyDrawn() lub po jego wystąpieniu. Ten pomiar może być niedostępny na Androidzie 10 (poziom interfejsu API 29) i starszych.

StartupTimingMetric na wyjściu generuje wartości minimalną, medianę i maksymalną z iteracji początkowych. Aby ocenić poprawę wyników podczas uruchamiania, skup się na wartościach mediany, ponieważ to one najlepiej określają typowy czas uruchamiania. Więcej informacji o tym, co wpływa na czas uruchamiania aplikacji, znajdziesz w artykule Czas uruchamiania aplikacji.

Wyniki StartupTimingMetric
Rysunek 2. Wyniki: StartupTimingMetric.

Metryka czasu renderowania klatki

FrameTimingMetric przechwytuje informacje o czasie z klatek wygenerowanych w ramach testu porównawczego, np. przewinięcia lub animacji, i nadaje te wartości:

  • frameOverrunMs: czas, przez jaki dane klatka nie mieszczą się w terminie. Liczba dodatnia oznacza, że klatka została upuszczona i widoczne są zacięcia lub zacinanie się. Liczby ujemne wskazują, o ile szybsza klatka jest szybsza od ostatecznego terminu. Uwaga: ta funkcja jest dostępna tylko na Androidzie 12 (poziom interfejsu API 31) i nowszych.
  • frameDurationCpuMs: czas potrzebny na utworzenie klatki przez procesor zarówno w wątku UI, jak i w RenderThread.

Dane te są zbierane w formacie 50, 90, 95 i 99 centyla.

Więcej informacji o wykrywaniu i poprawianiu spowolnionych klatek znajdziesz w artykule Powolne renderowanie.

Wyniki FrameTimingMetric
Rysunek 3. Wyniki: FrameTimingMetric.

Wskaźnik sekcji TraceSection

Funkcja TraceSectionMetric przechwytuje liczbę wystąpień sekcji logu czasu pasującego do podanego sectionName oraz ilość potrzebnego czasu. Podaje minimalny, medianę i maksymalny czas (w milisekundach). Sekcja logu czasu jest definiowana przez wywołanie funkcji trace(sectionName) lub kod między Trace.beginSection(sectionName) a Trace.endSection() lub ich warianty asynchroniczne. Zawsze wybiera pierwsze wystąpienie sekcji logu czasu zarejestrowanego podczas pomiaru. Domyślnie generuje tylko sekcje logu czasu z pakietu. Aby uwzględnić procesy spoza pakietu, ustaw targetPackageOnly = false.

Więcej informacji o śledzeniu znajdziesz w artykułach Omówienie śledzenia systemu i Definiowanie zdarzeń niestandardowych.

Wskaźnik sekcji TraceSection
Rysunek 4. Wyniki: TraceSectionMetric.

PowerMetrics

PowerMetric rejestruje zmianę mocy lub energii w trakcie testu dla podanych kategorii mocy. Każda wybrana kategoria jest podzielona na wymierne podskładniki, a niewybrane kategorie są dodawane do „niewybranych” danych.

Te dane mierzą wykorzystanie w całym systemie, a nie w poszczególnych aplikacjach. Są one ograniczone do telefonów Pixel 6, Pixel 6 Pro i nowszych:

  • power<category>Uw: ilość energii zużytej podczas testu w tej kategorii.
  • energy<category>Uws: ilość energii przesłanej w jednostce czasu w trakcie testu w tej kategorii.

Kategorie obejmują:

  • CPU
  • DISPLAY
  • GPU
  • GPS
  • MEMORY
  • MACHINE_LEARNING
  • NETWORK
  • UNCATEGORIZED

W przypadku niektórych kategorii, takich jak CPU, oddzielenie pracy wykonywanej przez inne procesy od pracy wykonywanej przez Twoją aplikację może być trudne. Aby zminimalizować zakłócenia, usuń lub ogranicz niepotrzebne aplikacje i konta.

Wyniki z PowerMetric
Rysunek 5. Wyniki: PowerMetric.