Как настроить загрузку профиля

ProfilingManager сохраняет трассировки локально на устройстве. Хотя вы можете получить эти файлы с помощью ADB для локальной отладки, для сбора данных о полях необходимо загрузить их на сервер.

Файлы трассировки могут быть большими (часто несколько мегабайт). Чтобы не мешать пользователю и не расходовать мобильный интернет, загрузку следует выполнять в фоновом режиме, желательно когда устройство подключено к безлимитной сети (Wi-Fi), заряжается и не используется.

Как настроить задание загрузки WorkManager

ProfilingManager не зависит от облака, поэтому вы можете загружать трассировки в любую инфраструктуру. В примере ниже показано, как использовать WorkManager, чтобы запланировать загрузку, которая не помешает пользователю.

Пример кода для настройки задания загрузки

Ниже приведен пример того, как можно настроить задачу, которая не будет мешать пользователю загружать трассировки на ваш сервер.

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

Помимо существующих зависимостей ProfilingManager, добавьте в файл build.gradle.kts следующие библиотеки Jetpack: WorkManager needs them.

Kotlin

   dependencies {
       implementation("androidx.work:work-runtime:2.12.0")
   }
   

Яркий

   dependencies {
       implementation 'androidx.work:work-runtime:2.12.0'
   }
   

Фрагмент кода

В этом коде показано, как настроить задание для загрузки трассировок. Задание должно быть настроено, когда приложение получает ProfilingResult. В этом разделе не рассматривается профилирование, но пример можно найти в статье Как записать трассировку системы.

Kotlin

class TraceUploadWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    override fun doWork(): Result {
        // Perform your uploading work here
        Log.d("ProfileTest", "Uploading trace: " + inputData.getString("PROFILE_PATH"))

        return Result.success()
    }
}

fun setupProfileUploadWorker(profileFilepath: String?) {
    val workMgr = WorkManager.getInstance(applicationContext)
    val workRequestBuilder = OneTimeWorkRequest.Builder(TraceUploadWorker::class)

    val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.UNMETERED)
        .setRequiresDeviceIdle(true)
        .setRequiresCharging(true)
        .build()
    workRequestBuilder.setConstraints(constraints)

    val inputDataBuilder = Data.Builder()
    inputDataBuilder.putString("PROFILE_PATH", profileFilepath)
    workRequestBuilder.setInputData(inputDataBuilder.build())

    workMgr.enqueue(workRequestBuilder.build())
}

Java

public static class TraceUploadWorker extends Worker {

  public TraceUploadWorker(
      @androidx.annotation.NonNull Context context,
      @androidx.annotation.NonNull WorkerParameters workerParams) {
    super(context, workerParams);
  }

  @androidx.annotation.NonNull
  @Override
  public Result doWork() {
    // Perform your uploading work here
    Log.d("ProfileTest", "Uploading trace: " + getInputData().getString("PROFILE_PATH"));

    return Result.success();
  }
}

public void setupProfileUploadWorker(String profileFilepath) {
  WorkManager workMgr = WorkManager.getInstance(getApplicationContext());
  OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder(
      TraceUploadWorker.class);

  Constraints constraints = new Constraints.Builder()
      .setRequiredNetworkType(NetworkType.UNMETERED)
      .setRequiresDeviceIdle(true)
      .build();
  workRequestBuilder.setConstraints(constraints);

  Data.Builder inputDataBuilder = new Data.Builder();
  inputDataBuilder.putString("PROFILE_PATH", profileFilepath);
  workRequestBuilder.setInputData(inputDataBuilder.build());

  workMgr.enqueue(workRequestBuilder.build());
}

Анализ кода

Код выполняет следующие действия:

  • Определите исполнителя. Создайте класс TraceUploadWorker, расширяющий Worker. Реализуйте метод doWork(), чтобы обрабатывать логику загрузки файлов с помощью выбранного вами SDK для серверной части или HTTP-клиента.

  • Запрос профилирования. Используйте SystemTraceRequestBuilder, чтобы настроить трассировку (длительность, правила буферизации), и Profiling.requestProfiling, чтобы запустить ее.

  • Запланируйте работу.

    • Создайте OneTimeWorkRequest для своего работника.

    • Задайте ограничения. Используйте setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) и setRequiresCharging(true), чтобы загрузка выполнялась, только когда устройство подключено к Wi-Fi, заряжается и не используется. Это важно, чтобы не мешать пользователю, который загружает данные.

    • Передача данных. Используйте setInputData, чтобы передать путь трассировки рабочему процессу.

    • Постановка в очередь. Отправьте запрос в WorkManager, вызвав WorkManager#enqueue.

Дальнейшие действия

После загрузки трассировок вы можете анализировать их по отдельности или выполнить массовый анализ трассировок. Инструкции по настройке масштабируемого конвейера анализа можно найти в статье Развертывание Bigtrace в Kubernetes.