Configurare un worker per il caricamento dei profili

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 TraceUploadWorker che estenda Worker. Implementa il metodo doWork() per gestire la logica di caricamento dei file effettiva utilizzando l'SDK backend o il client HTTP che preferisci.

  • Profilazione delle richieste: utilizza SystemTraceRequestBuilder per configurare la traccia (durata, policy del buffer) e Profiling.requestProfiling per avviarla.

  • Pianifica il lavoro:

    • Crea un OneTimeWorkRequest per il worker.

    • Imposta vincoli: utilizza setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) e setRequiresCharging(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 setInputData per 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.