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
TraceUploadWorkermở rộngWorker. Triển khai phương thứcdoWork()để 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
OneTimeWorkRequestcho 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.