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

ProfilingManager lưu các dấu vết cục bộ 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 trường đòi hỏi phải tải các tệp này lên một máy chủ.

Tệp dấu vết 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 thụ dữ liệu di động, bạn nên lên lịch tải lên để diễn ra ở 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ượng dữ liệu (Wi-Fi), đang sạc và rảnh.

Thiết lập công việc 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 đây minh hoạ cách sử dụng WorkManager để lên lịch cho một công việc 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 công việc 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ủ.

Thêm các phần phụ thuộc 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 các thư viện này.

Kotlin

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

Groovy

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

Đ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 hồ sơ bị bỏ qua trong phần này nhưng bạn có thể tìm thấy một ví dụ trong bài viết 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 thực hiện những việc sau:

  • Xác định trình thực thi: 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ần phụ trợ hoặc ứng dụng HTTP mà bạn muốn.

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

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

    • Tạo OneTimeWorkRequest cho trình thực thi.

    • Đặt các điều kiện 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 kết nối với 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 người dùng bằng công việc tải lên.

    • Truyền dữ liệu: Sử dụng setInputData để truyền đường dẫn dấu vết đến trình thực thi.

    • 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 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. Để được hướng dẫn về cách thiết lập 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.