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 lapangan memerlukan penguploadan file 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 berbayar (Wi-Fi), sedang diisi daya, dan tidak digunakan.

Menyiapkan tugas upload WorkManager

ProfilingManager bersifat cloud-agnostik; Anda dapat mengupload trace ke infrastruktur apa pun yang Anda pilih. Contoh berikut menunjukkan cara menggunakan WorkManager untuk menjadwalkan tugas upload yang menghindari gangguan pengguna.

Contoh kode untuk menyiapkan tugas upload

Berikut adalah contoh cara menyiapkan tugas yang tidak mengganggu pengguna untuk mengupload trace ke server Anda.

Menambahkan dependensi WorkManager

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

Kotlin

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

Groovy

   dependencies {
       implementation 'androidx.work:work-runtime:2.12.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 dihilangkan di bagian ini, tetapi contohnya dapat ditemukan di Merekam pelacakan 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 ini 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.

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

  • Menjadwalkan pekerjaan:

    • Buat OneTimeWorkRequest untuk worker Anda.

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

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

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

Langkah Berikutnya

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