Jak zarejestrować profil

Na tej stronie dowiesz się, jak zarejestrować ślad systemowy za pomocą interfejsu ProfilingManager API.

Dodawanie zależności

Aby w pełni korzystać z interfejsu ProfilingManager API, dodaj do pliku build.gradle.kts te biblioteki Jetpack:

Kotlin

   dependencies {
       implementation("androidx.tracing:tracing:1.3.0")
       implementation("androidx.core:core:1.16.0")
   }
   

Groovy

   dependencies {
       implementation 'androidx.tracing:tracing:1.3.0'
       implementation 'androidx.core:core:1.16.0'
   }
   

Nagrywanie śledzenia systemu

Po dodaniu wymaganych zależności użyj tego kodu, aby zarejestrować ślad systemowy. Ten przykład pokazuje podstawową konfigurację w Activity, która umożliwia rozpoczęcie sesji profilowania i zarządzanie nią.

Kotlin

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
fun sampleRecordSystemTrace() {
    val mainExecutor: Executor =
        Dispatchers.IO.asExecutor() // Your choice of executor for the callback to occur on.
    val resultCallback = Consumer<ProfilingResult> { profilingResult ->
        if (profilingResult.errorCode == ProfilingResult.ERROR_NONE) {
            Log.d(
                "ProfileTest",
                "Received profiling result file=" + profilingResult.resultFilePath
            )
        } else {
            Log.e(
                "ProfileTest",
                "Profiling failed errorcode=" + profilingResult.errorCode + " errormsg=" + profilingResult.errorMessage
            )
        }
    }
    val stopSignal = CancellationSignal()

    val requestBuilder = SystemTraceRequestBuilder()
    requestBuilder.setCancellationSignal(stopSignal)
    requestBuilder.setTag("FOO") // Caller supplied tag for identification
    requestBuilder.setDurationMs(60000)
    requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER)
    requestBuilder.setBufferSizeKb(20971520)
    requestProfiling(applicationContext, requestBuilder.build(), mainExecutor, resultCallback)

    // Wait some time for profiling to start.

    Trace.beginSection("MyApp:HeavyOperation")
    heavyOperation()
    Trace.endSection()

    // Once the interesting code section is profiled, stop profile
    stopSignal.cancel()
}

fun heavyOperation() {
    // Computations you want to profile
}

Java

void heavyOperation() {
  // Computations you want to profile
}

void sampleRecordSystemTrace() {
  Executor mainExecutor = Executors.newSingleThreadExecutor();
  Consumer<ProfilingResult> resultCallback =
      new Consumer<ProfilingResult>() {
        @Override
        public void accept(ProfilingResult profilingResult) {
          if (profilingResult.getErrorCode() == ProfilingResult.ERROR_NONE) {
            Log.d(
                "ProfileTest",
                "Received profiling result file=" + profilingResult.getResultFilePath());
          } else {
            Log.e(
                "ProfileTest",
                "Profiling failed errorcode="

                    + profilingResult.getErrorCode()
                    + " errormsg="
                    + profilingResult.getErrorMessage());
          }
        }
      };
  CancellationSignal stopSignal = new CancellationSignal();

  SystemTraceRequestBuilder requestBuilder = new SystemTraceRequestBuilder();
  requestBuilder.setCancellationSignal(stopSignal);
  requestBuilder.setTag("FOO");
  requestBuilder.setDurationMs(60000);
  requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER);
  requestBuilder.setBufferSizeKb(20971520);
  Profiling.requestProfiling(getApplicationContext(), requestBuilder.build(), mainExecutor,
      resultCallback);

  // Wait some time for profiling to start.

  Trace.beginSection("MyApp:HeavyOperation");
  heavyOperation();
  Trace.endSection();

  // Once the interesting code section is profiled, stop profile
  stopSignal.cancel();
}

Przykładowy kod konfiguruje sesję profilowania i zarządza nią, wykonując te czynności:

  1. Skonfiguruj wykonawcę. Utwórz Executor, aby zdefiniować wątek, który będzie otrzymywać wyniki profilowania. Profilowanie odbywa się w tle. Użycie wykonawcy wątku innego niż wątek interfejsu pomaga zapobiegać błędom typu „Aplikacja nie odpowiada” (ANR), jeśli później dodasz więcej przetwarzania do wywołania zwrotnego.

  2. Obsługa wyników profilowania. Utwórz obiekt Consumer<ProfilingResult>. System używa tego obiektu do wysyłania wyników profilowania z ProfilingManager z powrotem do aplikacji.

  3. Utwórz żądanie profilowania. Utwórz SystemTraceRequestBuilder, aby skonfigurować sesję profilowania. Ten kreator umożliwia dostosowywanie ProfilingManagerustawień śledzenia. Dostosowanie narzędzia do tworzenia jest opcjonalne. Jeśli tego nie zrobisz, system użyje ustawień domyślnych.

    • Zdefiniuj tag. Użyj ikony setTag(), aby dodać tag do nazwy śladu. Ten tag pomoże Ci zidentyfikować ślad.
    • Opcjonalnie: ustaw czas trwania. Użyj setDurationMs(), aby określić, jak długo ma trwać profilowanie (w milisekundach). Na przykład 60000 ustawia śledzenie przez 60 sekund. Śledzenie kończy się automatycznie po określonym czasie, jeśli wcześniej nie zostanie wywołane zdarzenie CancellationSignal.
    • Wybierz zasadę buforowania. Użyj setBufferFillPolicy(), aby określić sposób przechowywania danych śledzenia. BufferFillPolicy.RING_BUFFER oznacza, że gdy bufor jest pełny, nowe dane zastępują najstarsze, dzięki czemu zachowywany jest ciągły zapis ostatnich działań.
    • Ustaw rozmiar bufora. Użyj setBufferSizeKb(), aby określić rozmiar bufora śledzenia, za pomocą którego możesz kontrolować rozmiar pliku wyjściowego śledzenia.
  4. Opcjonalnie: zarządzaj cyklem życia sesji. Utwórz CancellationSignal. Ten obiekt umożliwia zatrzymanie sesji profilowania w dowolnym momencie, co pozwala precyzyjnie kontrolować jej długość.

  5. Rozpocznij i uzyskaj wyniki. Gdy zadzwonisz pod numer requestProfiling(),ProfilingManager rozpocznie sesję profilowania w tle. Po zakończeniu profilowania wysyła ProfilingResult do Twojej resultCallback#accept. Jeśli profilowanie zakończy się pomyślnie, ProfilingResult poda ścieżkę, w której ślad został zapisany na urządzeniu, za pomocą ProfilingResult#getResultFilePath. Ten plik możesz uzyskać programowo lub w przypadku profilowania lokalnego, uruchamiając adb pull <trace_path> na komputerze.

  6. Dodaj niestandardowe punkty śledzenia. W kodzie aplikacji możesz dodawać niestandardowe punkty śledzenia. W poprzednim przykładzie kodu dodano wycinek śladu o nazwie MyApp:HeavyOperation za pomocą funkcji Trace.beginSection()Trace.endSection(). Ten niestandardowy wycinek pojawia się w wygenerowanym profilu, podkreślając określone operacje w aplikacji.