Worker für das Hochladen von Profilen einrichten

`ProfilingManager` speichert Traces lokal auf dem Gerät. Sie können diese Dateien zwar mit ADB für das lokale Debugging abrufen, für die Erhebung von Felddaten müssen sie jedoch auf einen Server hochgeladen werden.

Trace-Dateien können groß sein (oft mehrere MB). Um die Nutzerfreundlichkeit nicht zu beeinträchtigen oder mobile Daten zu verbrauchen, sollten Sie Uploads im Hintergrund planen, vorzugsweise wenn das Gerät mit einem Netzwerk ohne Datenlimit (WLAN) verbunden ist, geladen wird und sich im Leerlauf befindet.

WorkManager-Uploadjob einrichten

ProfilingManager ist cloudunabhängig. Sie können Traces in eine beliebige Infrastruktur hochladen. Das folgende Beispiel zeigt, wie Sie mit WorkManager einen Uploadjob planen, der keine Unterbrechungen für den Nutzer verursacht.

Codebeispiel zum Einrichten eines Uploadjobs

Hier ist ein Beispiel dafür, wie Sie einen Job einrichten können, der den Nutzer nicht stört, um Traces auf Ihren Server hochzuladen.

WorkManager-Abhängigkeiten hinzufügen

Fügen Sie zusätzlich zu den vorhandenen ProfilingManager-Abhängigkeiten diese Jetpack-Bibliotheken der Datei build.gradle.kts hinzu. WorkManager benötigt sie.

Kotlin

   dependencies {
       implementation("androidx.work:work-runtime:2.11.2")
   }
   

Groovy

   dependencies {
       implementation 'androidx.work:work-runtime:2.11.2'
   }
   

Code-Snippet

Dieser Code zeigt, wie Sie einen Job zum Hochladen von Traces einrichten. Der Job sollte eingerichtet werden, wenn ProfilingResult von Ihrer App empfangen wird. Der Profiling-Abschnitt wird in diesem Abschnitt ausgelassen, ein Beispiel finden Sie jedoch unter System trace aufzeichnen.

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());
}

Code-Anleitung

Der Code führt Folgendes aus:

  • Worker definieren: Erstellen Sie eine TraceUploadWorker Klasse, die von Worker abgeleitet wird. Implementieren Sie die Methode doWork(), um die eigentliche Datei-Uploadlogik mit dem bevorzugten Backend-SDK oder HTTP-Client zu verarbeiten.

  • Profiling anfordern: Verwenden Sie SystemTraceRequestBuilder, um den Trace zu konfigurieren (Dauer, Pufferrichtlinie) und Profiling.requestProfiling, um ihn zu starten.

  • Arbeit planen:

    • Erstellen Sie eine OneTimeWorkRequest für Ihren Worker.

    • Beschränkungen festlegen: Verwenden Sie setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) und setRequiresCharging(true), um sicherzustellen, dass der Upload nur erfolgt, wenn der Nutzer mit einem WLAN verbunden ist, das Gerät geladen wird und es nicht aktiv verwendet wird. Das ist wichtig, um Unterbrechungen für den Nutzer durch den Uploadjob zu vermeiden.

    • Daten übergeben: Verwenden Sie setInputData, um den Trace-Pfad an den Worker zu übergeben.

    • In die Warteschlange stellen: Senden Sie die Anfrage an WorkManager, indem Sie WorkManager#enqueue aufrufen.

Nächste Schritte

Nach dem Hochladen von Traces können Sie sie einzeln analysieren oder eine Bulk-Trace Analyse durchführen. Eine Anleitung zum Einrichten einer skalierbaren Analysepipeline finden Sie unter Bigtrace auf Kubernetes bereitstellen.