Menyiapkan pekerja untuk mengupload profil

ProfilingManager menyimpan rekaman aktivitas secara lokal di perangkat. Meskipun Anda dapat mengambil file ini menggunakan ADB untuk proses debug lokal, pengumpulan data kolom memerlukan penguploadan file tersebut ke server.

File rekaman aktivitas dapat berukuran besar (sering kali beberapa MB). Untuk menghindari dampak negatif pada pengalaman pengguna atau penggunaan data seluler, Anda harus menjadwalkan upload agar terjadi di latar belakang, sebaiknya saat perangkat terhubung ke jaringan yang tidak diukur (Wi-Fi), sedang diisi daya, dan tidak digunakan.

Menyiapkan tugas upload WorkManager

ProfilingManager tidak bergantung pada cloud; Anda dapat mengupload rekaman aktivitas ke infrastruktur mana pun yang Anda pilih. Contoh berikut menunjukkan cara menggunakan WorkManager untuk menjadwalkan tugas upload yang tidak mengganggu pengguna.

Contoh kode untuk menyiapkan tugas upload

Berikut contoh cara menyiapkan tugas yang tidak mengganggu pengguna untuk mengupload rekaman aktivitas ke server Anda.

Menambahkan dependensi WorkManager

Selain dependensi ProfilingManager yang ada, tambahkan library Jetpack ini ke file build.gradle.kts Anda. WorkManager membutuhkannya.

Kotlin

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

Groovy

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

Cuplikan kode

Kode ini menunjukkan cara menyiapkan tugas untuk mengupload rekaman aktivitas. Tugas harus disiapkan saat ProfilingResult diterima oleh aplikasi Anda. Bagian pembuatan profil tidak disertakan dalam bagian ini, tetapi contohnya dapat ditemukan di Merekam aktivitas sistem.

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

Panduan kode

Kode tersebut melakukan hal berikut:

  • Tentukan pekerja: Buat class TraceUploadWorker yang memperluas Worker. Terapkan metode doWork() untuk menangani logika upload file yang sebenarnya menggunakan SDK backend atau klien HTTP pilihan Anda.

  • Pembuatan profil permintaan: Gunakan SystemTraceRequestBuilder untuk mengonfigurasi rekaman aktivitas (durasi, kebijakan buffer) dan Profiling.requestProfiling untuk memulainya.

  • Jadwalkan pekerjaan:

    • Buat OneTimeWorkRequest untuk pekerja Anda.

    • Menetapkan batasan: Gunakan setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true), dan setRequiresCharging(true) untuk memastikan upload hanya terjadi saat pengguna terhubung ke Wi-Fi, mengisi daya, dan tidak menggunakan perangkat secara aktif. Hal ini penting untuk menghindari gangguan pada pengguna dengan tugas upload.

    • Meneruskan data: Gunakan setInputData untuk meneruskan jalur rekaman aktivitas ke pekerja.

    • Antrekan: Kirim permintaan ke WorkManager dengan memanggil WorkManager#enqueue.

Langkah Berikutnya

Setelah mengupload rekaman aktivitas, Anda dapat menganalisisnya satu per satu atau melakukan analisis rekaman aktivitas massal. Untuk mendapatkan panduan tentang cara menyiapkan pipeline analisis yang skalabel, lihat Men-deploy Bigtrace di Kubernetes.