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
TraceUploadWorkermở rộngWorker. Triển khai phương thứcdoWork()để 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
OneTimeWorkRequestcho worker của bạn.Đặt cá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 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.