O ProfilingManager salva os traces localmente no dispositivo. Embora seja possível recuperar esses arquivos usando o ADB para depuração local, a coleta de dados de campo requer o upload deles para um servidor.
Os arquivos de trace podem ser grandes (geralmente vários MBs). Para evitar afetar negativamente a experiência do usuário ou consumir dados móveis, programe os uploads para ocorrerem em segundo plano, de preferência quando o dispositivo estiver em uma rede ilimitada (Wi-Fi), carregando e ocioso.
Configurar um job de upload do WorkManager
O ProfilingManager é independente de nuvem. É possível fazer upload de traces para qualquer
infraestrutura que você escolher. O exemplo a seguir demonstra como usar
WorkManager para programar um job de upload que evite interrupções para o usuário.
Exemplo de código para configurar um job de upload
Veja um exemplo de como configurar um job que não interrompe o usuário para fazer upload de traces no servidor.
Adicionar dependências do WorkManager
Além das dependências ProfilingManager atuais, adicione estas bibliotecas do Jetpack
ao arquivo build.gradle.kts. WorkManager precisa deles.
Kotlin
dependencies { implementation("androidx.work:work-runtime:2.12.0") }
Groovy
dependencies { implementation 'androidx.work:work-runtime:2.12.0' }
Snippet de código
Este código mostra como configurar um job para fazer upload de traces. O job precisa ser
configurado quando o ProfilingResult é recebido pelo app. A seção de criação de perfil
é omitida nesta seção, mas um exemplo pode ser encontrado em Gravar um rastreamento
do sistema.
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()); }
Tutorial do código
O código realiza as ações a seguir:
Defina o worker: crie uma classe
TraceUploadWorkerque estendaWorker. Implemente o métododoWork()para processar a lógica real de upload de arquivos usando o SDK de back-end ou o cliente HTTP de sua preferência.Solicitar criação de perfil: use
SystemTraceRequestBuilderpara configurar o trace (duração, política de buffer) eProfiling.requestProfilingpara iniciá-lo.Programar o trabalho:
Crie um
OneTimeWorkRequestpara o worker.Defina restrições: use
setRequiredNetworkType(NetworkType.UNMETERED),setRequiresDeviceIdle(true)esetRequiresCharging(true)para garantir que o upload só aconteça quando o usuário estiver conectado ao Wi-Fi, carregando e não estiver usando o dispositivo. Isso é importante para evitar interrupções para o usuário com o job de upload.Transmitir dados: use
setInputDatapara transmitir o caminho do trace para o worker.Enfileirar: envie a solicitação ao WorkManager chamando
WorkManager#enqueue.
Próximas etapas
Depois de fazer upload dos traces, é possível analisá-los individualmente ou realizar uma análise de traces em massa. Para orientações sobre como configurar um pipeline de análise escalonável, consulte Como implantar o Bigtrace no Kubernetes.