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 Erfassung 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, solltest du Uploads im Hintergrund planen, vorzugsweise wenn das Gerät mit einem Netzwerk ohne Datenlimit (WLAN) verbunden ist, geladen wird und inaktiv ist.

WorkManager-Upload-Job einrichten

ProfilingManager ist cloudunabhängig. Sie können Traces in jede beliebige Infrastruktur hochladen. Im folgenden Beispiel wird gezeigt, wie Sie mit WorkManager einen Uploadjob planen, der Nutzer nicht stört.

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 der Datei build.gradle.kts zusätzlich zu den vorhandenen ProfilingManager-Abhängigkeiten die folgenden Jetpack-Bibliotheken hinzu. WorkManager benötigt sie.

Kotlin

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

Groovy

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

Code-Snippet

Dieser Code zeigt, wie Sie einen Job zum Hochladen von Traces einrichten. Der Job sollte eingerichtet werden, wenn der ProfilingResult von Ihrer Anwendung empfangen wird. Der Profilerstellungsabschnitt wird in diesem Abschnitt weggelassen. Ein Beispiel finden Sie jedoch unter Systemtrace 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 Worker erweitert. Implementieren Sie die Methode doWork(), um die eigentliche Logik für den Dateiupload mit Ihrem bevorzugten Backend-SDK oder HTTP-Client zu verarbeiten.

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

  • Arbeit planen:

    • Erstellen Sie einen OneTimeWorkRequest für Ihren Worker.

    • Einschränkungen festlegen: Verwende setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) und setRequiresCharging(true), damit der Upload nur erfolgt, wenn der Nutzer mit dem WLAN verbunden ist, das Gerät geladen wird und nicht aktiv verwendet wird. Dies ist wichtig, um Unterbrechungen des Uploadjobs für den Nutzer 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

Nachdem Sie Traces hochgeladen haben, 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.