O ProfilingManager salva rastros localmente no dispositivo. Embora seja possível recuperar esses arquivos usando o ADB para depuração local, a coleta de dados de campo exige o upload deles para um servidor.
Os arquivos de rastreamento podem ser grandes (geralmente vários MBs). Para evitar afetar negativamente a experiência do usuário ou consumir dados móveis, programe uploads para ocorrer em segundo plano, de preferência quando o dispositivo estiver em uma rede ilimitada (Wi-Fi), carregando e inativo.
Configurar um job de upload do WorkManager
O ProfilingManager é independente da nuvem. Você pode fazer upload de rastros para qualquer infraestrutura. O exemplo a seguir demonstra como usar
WorkManager para programar um job de upload que evita interrupções ao usuário.
Exemplo de código para configurar um job de upload
Confira um exemplo de como configurar um job que não seja disruptivo para o usuário para fazer upload de rastros para o servidor.
Adicionar dependências do WorkManager
Além das dependências do ProfilingManager, adicione estas bibliotecas do Jetpack ao arquivo build.gradle.kts. O WorkManager precisa delas.
Kotlin
dependencies { implementation("androidx.work:work-runtime:2.11.2") }
Groovy
dependencies { implementation 'androidx.work:work-runtime:2.11.2' }
Snippet de código
Este código mostra como configurar um job para fazer upload de rastros. 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:
Definir o worker: crie uma classe
TraceUploadWorkerque estendaWorker. Implemente o métododoWork()para processar a lógica de upload de arquivos real usando o SDK de back-end ou o cliente HTTP de sua preferência.Solicitar a criação de perfil: use
SystemTraceRequestBuilderpara configurar o rastreamento (duração, política de buffer) eProfiling.requestProfilingpara iniciá-lo.Programar o trabalho:
Crie uma
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 no Wi-Fi, carregando e não usando o dispositivo ativamente. Isso é importante para evitar interrupções ao usuário com o job de upload.Transmitir dados: use
setInputDatapara transmitir o caminho do rastreamento ao worker.Colocar na fila: envie a solicitação ao WorkManager chamando
WorkManager#enqueue.
Próximas etapas
Depois de fazer upload dos rastros, você pode analisá-los individualmente ou realizar uma análise em massa. Para orientações sobre como configurar um pipeline de análise escalonável, consulte Como implantar o Bigtrace no Kubernetes.