یک worker برای آپلود پروفایل تنظیم کنید

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» مراجعه کنید.