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