Konfigurowanie procesu przesyłania profilu

Biblioteka ProfilingManager zapisuje ślady lokalnie na urządzeniu. Możesz pobrać te pliki za pomocą ADB na potrzeby lokalnego debugowania, ale zbieranie danych o polach wymaga przesłania ich na serwer.

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

Konfigurowanie zadania przesyłania w bibliotece WorkManager

ProfilingManager jest niezależna od chmury. Możesz przesyłać ślady 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ład kodu do konfigurowania zadania przesyłania

Oto przykład, jak skonfigurować zadanie, które nie będzie przeszkadzać użytkownikowi, aby przesyłać ślady na serwer.

Dodawanie zależności biblioteki WorkManager

Oprócz dotychczasowych zależności biblioteki ProfilingManager dodaj te biblioteki Jetpack do pliku build.gradle.kts. WorkManager ich potrzebuje.

Kotlin

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

Dynamiczny

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

Fragment kodu

Ten kod pokazuje, jak skonfigurować zadanie przesyłania śladów. Zadanie należy skonfigurować, gdy aplikacja otrzyma ProfilingResult. Sekcja profilowania została w tym miejscu pominięta, ale przykład znajdziesz w artykule Rejestrowanie śladu 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());
}

Omówienie kodu

Kod wykonuje te czynności:

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

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

  • Planowanie pracy:

    • Utwórz OneTimeWorkRequest dla procesu roboczego.

    • Ustaw ograniczenia: użyj setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) i setRequiresCharging(true), aby przesyłanie odbywało się tylko wtedy, gdy użytkownik korzysta z Wi-Fi, ładuje urządzenie i nie używa go aktywnie. Jest to ważne, aby uniknąć zakłócenia działania użytkownika przez zadanie przesyłania.

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

    • Umieszczanie w kolejce: prześlij żądanie do biblioteki WorkManager, wywołując WorkManager#enqueue.

Następne kroki

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