Konfigurowanie procesu przesyłania profilu

ProfilingManager zapisuje logi lokalnie na urządzeniu. Możesz pobrać te pliki za pomocą ADB na potrzeby lokalnego debugowania, ale zbieranie danych z terenu wymaga przesłania ich na serwer.

Pliki logów czasu mogą być duże (często mają kilka megabajtów). Aby uniknąć negatywnego wpływu na wrażenia użytkownika lub zużycia mobilnej transmisji danych, zaplanuj przesyłanie w tle, najlepiej, gdy urządzenie jest połączone z siecią bez taryfowego rozliczania danych (Wi-Fi), ładuje się i jest bezczynne.

Konfigurowanie zadania przesyłania w bibliotece WorkManager

ProfilingManager nie jest powiązany z żadną chmurą, więc możesz przesyłać logi czasu do dowolnej infrastruktury. Poniższy przykład pokazuje, jak używać WorkManager do planowania zadania przesyłania, które nie będzie przeszkadzać użytkownikowi.

Przykładowy kod do skonfigurowania zadania przesyłania

Oto przykład, jak skonfigurować zadanie, które nie zakłóca działania użytkownika, aby przesyłać logi czasu 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 ich potrzebuje.

Kotlin

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

Dynamiczny

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

Fragment kodu

Ten kod pokazuje, jak skonfigurować zadanie przesyłania logów czasu oczekiwania. Zadanie powinno zostać skonfigurowane, gdy aplikacja otrzyma ProfilingResult. Sekcja profilowania została pominięta w tej sekcji, ale przykład można znaleźć w artykule Rejestrowanie śledzenia systemu.

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

Przewodnik po kodzie

Kod wykonuje te czynności:

  • Zdefiniuj instancję roboczą: utwórz klasę TraceUploadWorker rozszerzającą Worker. Zaimplementuj metodę doWork(), aby obsłużyć logikę przesyłania pliku za pomocą preferowanego pakietu SDK backendu lub klienta HTTP.

  • Żądanie profilowania: użyj SystemTraceRequestBuilder, aby skonfigurować ślad (czas trwania, zasady buforowania), i Profiling.requestProfiling, aby go uruchomić.

  • Zaplanuj pracę:

    • Utwórz OneTimeWorkRequest dla instancji roboczej.

    • Ustaw ograniczenia: użyj setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) i setRequiresCharging(true), aby przesyłanie odbywało się tylko wtedy, gdy użytkownik jest połączony z Wi-Fi, ładuje urządzenie i nie korzysta z niego aktywnie. Jest to ważne, aby uniknąć zakłóceń w pracy użytkownika związanych z zadaniem przesyłania.

    • Przekazywanie danych: użyj setInputData, aby przekazać ścieżkę logu do instancji roboczej.

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

Następne kroki

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