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