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 địa yêu cầu tải các tệp này lên 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 thụ 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ượng dữ liệu (Wi-Fi), đang sạc và ở trạng thái rảnh.

Thiết lập một 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 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 một công việc tải lên

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

Thêm phần phụ thuộc WorkManager

Bên cạnh 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 của bạn. WorkManager cần các quyền này.

Kotlin

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

Groovy

   dependencies {
       implementation 'androidx.work:work-runtime:2.12.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 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 lên thực tế bằng SDK 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 vùng đệm) và Profiling.requestProfiling để bắt đầu dấu vết.

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

    • Tạo OneTimeWorkRequest cho worker.

    • Đặt quy tắc ràng buộc: Sử dụng setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) và 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 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 khi họ đang tải lên.

    • Truyền dữ liệu: Sử dụng setInputData để truyền đường dẫn theo dõi đế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.