ProfilingManager salva le tracce localmente sul dispositivo. Anche se puoi recuperare questi file utilizzando ADB per il debug locale, la raccolta dei dati di campo richiede il caricamento su un server.
I file di traccia possono essere di grandi dimensioni (spesso diversi MB). Per evitare di influire negativamente sull'esperienza utente o di consumare dati mobili, devi programmare i caricamenti in background, preferibilmente quando il dispositivo è connesso a una rete non a consumo (Wi-Fi), è in carica e inattivo.
Configurare un job di caricamento di WorkManager
ProfilingManager è indipendente dal cloud. Puoi caricare le tracce su qualsiasi
infrastruttura tu scelga. L'esempio seguente mostra come utilizzare
WorkManager per pianificare un job di caricamento che eviti interruzioni per gli utenti.
Esempio di codice per configurare un job di caricamento
Ecco un esempio di come configurare un job che non interrompa l'attività dell'utente per caricare le tracce sul server.
Aggiungere le dipendenze di WorkManager
Oltre alle dipendenze ProfilingManager esistenti, aggiungi queste librerie Jetpack al file build.gradle.kts. WorkManager ha bisogno di te.
Kotlin
dependencies { implementation("androidx.work:work-runtime:2.11.0") }
Groovy
dependencies { implementation 'androidx.work:work-runtime:2.11.0' }
Snippet di codice
Questo codice mostra come configurare un job per il caricamento delle tracce. Il job deve essere
configurato quando la tua app riceve ProfilingResult. La sezione di profilazione
è omessa in questa sezione, ma un esempio è disponibile in Registrare una traccia
di 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()); }
Procedura dettagliata del codice
Il codice esegue queste operazioni:
Definisci il worker: crea una classe
TraceUploadWorkerche estendaWorker. Implementa il metododoWork()per gestire la logica di caricamento dei file effettiva utilizzando l'SDK backend o il client HTTP che preferisci.Profilazione delle richieste: utilizza
SystemTraceRequestBuilderper configurare la traccia (durata, policy del buffer) eProfiling.requestProfilingper avviarla.Pianifica il lavoro:
Crea un
OneTimeWorkRequestper il worker.Imposta vincoli: utilizza
setRequiredNetworkType(NetworkType.UNMETERED),setRequiresDeviceIdle(true)esetRequiresCharging(true)per assicurarti che il caricamento avvenga solo quando l'utente è connesso al Wi-Fi, il dispositivo è in carica e non è in uso. Questo è importante per evitare interruzioni all'utente durante il processo di caricamento.Passare i dati: utilizza
setInputDataper passare il percorso della traccia al worker.Metti in coda: invia la richiesta a WorkManager chiamando
WorkManager#enqueue.
Passaggi successivi
Dopo aver caricato le tracce, puoi analizzarle singolarmente o eseguire un'analisi collettiva delle tracce. Per indicazioni sulla configurazione di una pipeline di analisi scalabile, consulta Deployment di Bigtrace su Kubernetes.