Konfigurowanie procesu przesyłania profilu

Menedżer profilowania zapisuje ślady lokalnie na urządzeniu. Chociaż możesz pobrać te pliki za pomocą ADB na potrzeby lokalnego debugowania, zbieranie danych w terenie wymaga przesłania ich na serwer.

Pliki śledzenia mogą być duże (często mają kilka MB). Aby uniknąć negatywnego wpływu na komfort użytkownika lub zużycia mobilnej transmisji danych, zaplanuj przesyłanie w tle, najlepiej gdy urządzenie jest podłączone do sieci bez pomiaru (Wi-Fi), ładuje się i jest nieużywane.

Konfigurowanie zadania przesyłania WorkManager

ProfilingManager jest niezależny od chmury. Możesz przesyłać ślady do dowolnej infrastruktury. Poniższy przykład pokazuje, jak za pomocą funkcji WorkManager zaplanować zadanie przesyłania, które nie będzie przeszkadzać użytkownikom.

Przykładowy kod do skonfigurowania zadania przesyłania

Oto przykład konfiguracji zadania, które nie przeszkadza użytkownikowi, aby przesyłać ślady na serwer.

Dodawanie zależności biblioteki WorkManager

Oprócz istniejących zależności ProfilingManager dodaj do pliku build.gradle.kts te biblioteki Jetpack: WorkManager potrzebuje tych informacji.

Kotlin

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

Groovy

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

Fragment kodu

Ten kod pokazuje, jak skonfigurować zadanie przesyłania śladów. Zadanie powinno zostać skonfigurowane, gdy aplikacja otrzyma ProfilingResult. Sekcja profilowania została pominięta, ale przykład można znaleźć w artykule Rejestrowanie śladu systemowego.

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

Omówienie kodu

Kod wykonuje te czynności:

  • Zdefiniuj proces roboczy: utwórz klasę TraceUploadWorker rozszerzającą Worker. Zaimplementuj metodę doWork(), aby obsługiwać logikę przesyłania plików za pomocą preferowanego pakietu SDK backendu lub klienta HTTP.

  • Profilowanie żądań: użyj SystemTraceRequestBuilder, aby skonfigurować śledzenie (czas trwania, zasady buforowania), i Profiling.requestProfiling, aby je rozpocząć.

  • Zaplanuj pracę:

    • Utwórz OneTimeWorkRequest dla instancji roboczej.

    • Ustaw ograniczenia: użyj symboli setRequiredNetworkType(NetworkType.UNMETERED),setRequiresDeviceIdle(true)setRequiresCharging(true), aby mieć pewność, że przesyłanie nastąpi tylko wtedy, gdy użytkownik jest połączony z Wi-Fi, ładuje urządzenie i nie używa go aktywnie. Jest to ważne, aby uniknąć zakłóceń w pracy użytkownika z zadaniem przesyłania.

    • Przekazywanie danych: użyj symbolu setInputData, aby przekazać ścieżkę śledzenia do procesu roboczego.

    • Kolejkowanie: prześlij żądanie do WorkManagera, wywołując WorkManager#enqueue.

Następne kroki

Po przesłaniu śladów możesz je analizować pojedynczo lub przeprowadzić analizę zbiorczą. Wskazówki dotyczące konfigurowania skalowalnego potoku analizy znajdziesz w artykule Wdrażanie Bigtrace w Kubernetes.