Thiết lập worker để tải hồ sơ lên

ProfilingManager lưu các dấu vết trên thiết bị. Mặc dù bạn có thể truy xuất các tệp này bằng ADB để gỡ lỗi cục bộ, nhưng việc thu thập dữ liệu thực tế đòi hỏi bạn phải tải các tệp này lên một máy chủ.

Tệp theo dõi có thể có kích thước lớn (thường là vài MB). Để tránh ảnh hưởng tiêu cực đến trải nghiệm người dùng hoặc tiêu tốn dữ liệu di động, bạn nên lên lịch tải lên ở chế độ nền, tốt nhất là khi thiết bị đang kết nối với mạng không đo lưu lượng (Wi-Fi), đang sạc và ở trạng thái rảnh.

Thiết lập một tác vụ tải lên WorkManager

ProfilingManager không phụ thuộc vào đám mây; bạn có thể tải dấu vết lên bất kỳ cơ sở hạ tầng nào mà bạn chọn. Ví dụ sau minh hoạ cách sử dụng WorkManager để lên lịch cho một tác vụ tải lên nhằm tránh làm gián đoạn người dùng.

Ví dụ về mã để thiết lập một tác vụ tải lên

Sau đây là ví dụ về cách thiết lập một công việc không làm gián đoạn người dùng để tải dấu vết lên máy chủ của bạn.

Thêm các phần phụ thuộc của WorkManager

Ngoài các phần phụ thuộc ProfilingManager hiện có, hãy thêm các thư viện Jetpack này vào tệp build.gradle.kts. WorkManager cần những thông tin này.

Kotlin

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

Groovy

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

Đoạn mã

Mã này cho biết cách thiết lập một công việc để tải dấu vết lên. Bạn nên thiết lập công việc khi ứng dụng nhận được ProfilingResult. Phần lập hồ sơ bị bỏ qua trong phần này nhưng bạn có thể xem ví dụ trong phần Ghi lại dấu vết hệ thống.

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

Hướng dẫn từng bước về mã

Mã này sẽ thực hiện những việc sau:

  • Xác định worker: Tạo một lớp TraceUploadWorker mở rộng Worker. Triển khai phương thức doWork() để xử lý logic tải tệp thực tế lên bằng SDK phụ trợ hoặc ứng dụng HTTP mà bạn muốn.

  • Yêu cầu phân tích hiệu suất: Sử dụng SystemTraceRequestBuilder để định cấu hình dấu vết (thời lượng, chính sách vùng đệm) và Profiling.requestProfiling để bắt đầu.

  • Lên lịch cho công việc:

    • Tạo một OneTimeWorkRequest cho worker của bạn.

    • Đặt các ràng buộc: Sử dụng setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true)setRequiresCharging(true) để đảm bảo quá trình tải lên chỉ diễn ra khi người dùng đang dùng Wi-Fi, đang sạc và không chủ động sử dụng thiết bị. Điều này rất quan trọng để tránh làm gián đoạn công việc tải lên của người dùng.

    • Truyền dữ liệu: Sử dụng setInputData để truyền đường dẫn theo dõi đến worker.

    • Thêm vào hàng đợi: Gửi yêu cầu đến WorkManager bằng cách gọi WorkManager#enqueue.

Các bước tiếp theo

Sau khi tải các dấu vết lên, bạn có thể phân tích từng dấu vết hoặc thực hiện phân tích dấu vết hàng loạt. Để biết hướng dẫn về cách thiết lập một quy trình phân tích có thể mở rộng, hãy tham khảo bài viết Triển khai Bigtrace trên Kubernetes.