ProfilingManager ردپاها را به صورت محلی روی دستگاه ذخیره میکند. در حالی که میتوانید این فایلها را با استفاده از ADB برای اشکالزدایی محلی بازیابی کنید، جمعآوری دادههای میدانی نیاز به آپلود آنها در یک سرور دارد.
فایلهای ردیابی میتوانند بزرگ باشند (اغلب چندین مگابایت). برای جلوگیری از تأثیر منفی بر تجربه کاربری یا مصرف داده تلفن همراه، باید آپلودها را طوری برنامهریزی کنید که در پسزمینه انجام شوند، ترجیحاً زمانی که دستگاه به یک شبکه بدون محدودیت زمانی (Wi-Fi)، در حال شارژ و بدون استفاده است.
تنظیم یک کار آپلود در WorkManager
ProfilingManager مستقل از فضای ابری است؛ شما میتوانید ردپاها را در هر زیرساختی که انتخاب میکنید آپلود کنید. مثال زیر نحوه استفاده WorkManager برای زمانبندی یک کار آپلود که از اختلال کاربر جلوگیری میکند، نشان میدهد.
مثال کد برای تنظیم یک کار آپلود
در اینجا مثالی از نحوه تنظیم یک job برای آپلود ردیابیها به سرور شما آورده شده است که برای کاربر مزاحمتی ایجاد نمیکند.
اضافه کردن وابستگیهای WorkManager
علاوه بر وابستگیهای ProfilingManager موجود، این کتابخانههای Jetpack را به فایل build.gradle.kts خود اضافه کنید. WorkManager به آنها نیاز دارد.
کاتلین
dependencies { implementation("androidx.work:work-runtime:2.11.0") }
گرووی
dependencies { implementation 'androidx.work:work-runtime:2.11.0' }
قطعه کد
این کد نحوه تنظیم یک job برای آپلود ردیابیها را نشان میدهد. این job باید زمانی تنظیم شود که ProfilingResult توسط برنامه شما دریافت شود. بخش پروفایلینگ در این بخش حذف شده است، اما مثالی از آن را میتوانید در Record a system trace بیابید.
کاتلین
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()) }
جاوا
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()); }
راهنمای کد
کد زیر کارهای زیر را انجام میدهد:
تعریف ورکر : یک کلاس
TraceUploadWorkerایجاد کنید کهWorkerرا به ارث میبرد. متدdoWork()را برای مدیریت منطق آپلود فایل واقعی با استفاده از SDK بکاند یا کلاینت HTTP مورد نظر خود پیادهسازی کنید.درخواست پروفایلینگ : از
SystemTraceRequestBuilderبرای پیکربندی ردیابی (مدت زمان، سیاست بافر) وProfiling.requestProfilingبرای شروع آن استفاده کنید.کار را زمانبندی کنید :
برای ورکر خود یک
OneTimeWorkRequestایجاد کنید.تنظیم محدودیتها: از
setRequiredNetworkType(NetworkType.UNMETERED)،setRequiresDeviceIdle(true)وsetRequiresCharging(true)استفاده کنید تا مطمئن شوید آپلود فقط زمانی اتفاق میافتد که کاربر به Wi-Fi متصل است، در حال شارژ است و به طور فعال از دستگاه استفاده نمیکند. این امر برای جلوگیری از اختلال در کار آپلود برای کاربر مهم است.ارسال داده: از
setInputDataبرای ارسال مسیر ردیابی به worker استفاده کنید.نوبتدهی: درخواست را با فراخوانی
WorkManager#enqueueبه WorkManager ارسال کنید.
مراحل بعدی
پس از آپلود ردیابیها، میتوانید آنها را به صورت جداگانه تجزیه و تحلیل کنید یا تجزیه و تحلیل ردیابی انبوه را انجام دهید. برای راهنمایی در مورد راهاندازی یک خط لوله تجزیه و تحلیل مقیاسپذیر، به «استقرار Bigtrace در Kubernetes» مراجعه کنید.