Как создать профиль

На этой странице показано, как записать трассировку системы с помощью API ProfilingManager .

Добавить зависимости

Для оптимальной работы с API ProfilingManager добавьте следующие библиотеки Jetpack в файл build.gradle.kts .

Котлин

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

Круто

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

Запись трассировки системы

После добавления необходимых зависимостей используйте следующий код для записи трассировки системы. В этом примере показана базовая настройка в Activity для запуска и управления сеансом профилирования.

Котлин

@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
}

Ява

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();
}

Пример кода настраивает и управляет сеансом профилирования, выполняя следующие шаги:

  1. Настройте исполнитель. Создайте Executor , чтобы определить поток, который будет получать результаты профилирования. Профилирование происходит в фоновом режиме. Использование исполнителя потока, не связанного с пользовательским интерфейсом, помогает предотвратить ошибки «Приложение не отвечает» (ANR) при добавлении дополнительных обработчиков в обратный вызов позже.

  2. Обработка результатов профилирования. Создайте объект Consumer<ProfilingResult> . Система использует этот объект для отправки результатов профилирования из ProfilingManager обратно в ваше приложение.

  3. Создайте запрос на профилирование. Создайте SystemTraceRequestBuilder для настройки сеанса профилирования. Этот конструктор позволяет настраивать параметры трассировки ProfilingManager . Настройка конструктора необязательна; если вы этого не сделаете, система будет использовать настройки по умолчанию.

    • Определите тег. Используйте setTag() , чтобы добавить тег к имени трассы. Этот тег поможет вам идентифицировать трассу.
    • Необязательно: задайте длительность. Используйте setDurationMs() , чтобы указать длительность профилирования в миллисекундах. Например, 60000 задаёт 60-секундную трассировку. Трассировка автоматически завершается по истечении указанного времени, если до этого не сработает CancellationSignal .
    • Выберите политику буферизации. Используйте setBufferFillPolicy() , чтобы определить способ хранения данных трассировки. BufferFillPolicy.RING_BUFFER означает, что при заполнении буфера новые данные будут перезаписывать самые старые, обеспечивая непрерывную запись последних действий.
    • Установите размер буфера. Используйте функцию setBufferSizeKb() чтобы задать размер буфера для трассировки, который можно использовать для управления размером выходного файла трассировки.
  4. Необязательно: управляйте жизненным циклом сеанса. Создайте объект CancellationSignal . Этот объект позволяет остановить сеанс профилирования в любой момент, обеспечивая точный контроль над его продолжительностью.

  5. Запуск и получение результатов. При вызове requestProfiling() ProfilingManager запускает сеанс профилирования в фоновом режиме. После завершения профилирования он отправляет результат ProfilingResult в ваш метод resultCallback#accept . Если профилирование завершено успешно, результат ProfilingResult предоставляет путь к сохраненной трассировке на вашем устройстве с помощью ProfilingResult#getResultFilePath . Вы можете получить этот файл программно или, для локального профилирования, выполнив команду adb pull <trace_path> с вашего компьютера.

  6. Добавьте пользовательские точки трассировки. Вы можете добавить пользовательские точки трассировки в код своего приложения. В предыдущем примере кода срез трассировки с именем MyApp:HeavyOperation добавляется с помощью Trace.beginSection() и Trace.endSection() . Этот пользовательский срез отображается в сгенерированном профиле, выделяя определённые операции в вашем приложении.