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 das Erfassen 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 mit unbegrenztem Datenvolumen (WLAN) verbunden ist, aufgeladen 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 Nutzer verursacht.

Codebeispiel zum Einrichten eines Upload-Jobs

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 Ihren 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.0")
   }
   

Groovy

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

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

Schritt-für-Schritt-Anleitung zum Code

Der Code führt Folgendes aus:

  • Worker definieren: Erstellen Sie eine TraceUploadWorker-Klasse, die Worker erweitert. Implementieren Sie die doWork()-Methode, um die Logik für den eigentlichen Dateiupload mit dem von Ihnen bevorzugten Backend-SDK oder HTTP-Client zu verarbeiten.

  • Profiling von Anfragen: 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.

    • Einschrä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 der Nutzer das Gerät nicht aktiv verwendet. Das ist wichtig, um den Nutzer nicht durch den Upload zu stören.

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

    • In die Warteschlange einreihen: 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 in Kubernetes bereitstellen.