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, dieWorkererweitert. Implementieren Sie diedoWork()-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), undProfiling.requestProfiling, um ihn zu starten.Arbeit planen:
Erstellen Sie eine
OneTimeWorkRequestfür Ihren Worker.Einschränkungen festlegen: Verwenden Sie
setRequiredNetworkType(NetworkType.UNMETERED),setRequiresDeviceIdle(true)undsetRequiresCharging(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#enqueueaufrufen.
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.