Настройте сотрудника для загрузки профиля.

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

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

Настройте задание загрузки в WorkManager.

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

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

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

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

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

Котлин

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

Классный

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

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

Этот код демонстрирует, как настроить задание для загрузки трассировок. Задание должно быть настроено после получения вашим приложением ProfilingResult . Раздел, посвященный профилированию, в этом разделе опущен, но пример можно найти в разделе «Запись системной трассировки» .

Котлин

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» .