إعداد عامل لتحميل الملف الشخصي

يحفظ ProfilingManager عمليات التتبُّع على الجهاز. وعلى الرغم من إمكانية استرداد هذه الملفات باستخدام ADB لتصحيح الأخطاء على الجهاز، يتطلّب جمع البيانات الميدانية تحميلها إلى خادم.

يمكن أن تكون ملفات التتبُّع كبيرة (غالبًا ما تكون عدة ميغابايت). لتجنُّب التأثير سلبًا في تجربة المستخدم أو استهلاك بيانات الجوّال، عليك جدولة عمليات التحميل لتحدث في الخلفية، ويُفضَّل أن يكون ذلك عندما يكون الجهاز متصلاً بشبكة لا تفرض تكلفة استخدام (Wi-Fi) وأثناء شحنه وعدم استخدامه.

إعداد مهمة تحميل باستخدام WorkManager

ProfilingManager هو نظام مستقل عن السحابة الإلكترونية، ويمكنك تحميل عمليات التتبُّع إلى أي بنية أساسية تختارها. يوضّح المثال التالي كيفية استخدام WorkManager لجدولة مهمة تحميل تتجنّب مقاطعة المستخدم.

مثال على رمز برمجي لإعداد مهمة تحميل

في ما يلي مثال على كيفية إعداد مهمة لا تؤثر سلبًا في تجربة المستخدم لتحميل بيانات التتبُّع إلى الخادم.

إضافة تبعيات WorkManager

إلى جانب تبعيات ProfilingManager الحالية، أضِف مكتبات Jetpack هذه إلى ملف build.gradle.kts. يحتاج "WorkManager" إلى هذه الأذونات.

Kotlin

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

أنيق

   dependencies {
       implementation 'androidx.work:work-runtime:2.12.0'
   }
   

مقتطف رمز

يوضّح هذا الرمز كيفية إعداد مهمة لتحميل بيانات التتبُّع. يجب إعداد المهمة عندما يتلقّى تطبيقك ProfilingResult. تم حذف قسم تحليل الأداء في هذا القسم، ولكن يمكن العثور على مثال في تسجيل سجلّ تتبّع النظام.

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());
}

جولة تفصيلية في الرمز البرمجي

ينفّذ الرمز ما يلي:

  • تحديد العامل: أنشئ فئة TraceUploadWorker تمدّد Worker. نفِّذ الطريقة doWork() للتعامل مع منطق تحميل الملفات الفعلي باستخدام حزمة تطوير البرامج (SDK) المفضّلة لديك في الخلفية أو عميل HTTP.

  • طلب تحليل الأداء: استخدِم SystemTraceRequestBuilder لضبط التتبُّع (المدة وسياسة التخزين المؤقت) وProfiling.requestProfiling لبدء التتبُّع.

  • جدولة العمل:

    • أنشِئ OneTimeWorkRequest للعامل.

    • ضبط القيود: استخدِم setRequiredNetworkType(NetworkType.UNMETERED) وsetRequiresDeviceIdle(true) وsetRequiresCharging(true) لضمان عدم تحميل البيانات إلا عندما يكون المستخدم متصلاً بشبكة Wi-Fi، وأثناء شحن الجهاز وعدم استخدامه بنشاط. هذا مهم لتجنب تعطيل المستخدم مع مهمة التحميل.

    • نقل البيانات: استخدِم setInputData لنقل مسار التتبُّع إلى العامل.

    • الإضافة إلى قائمة الانتظار: أرسِل الطلب إلى WorkManager من خلال استدعاء WorkManager#enqueue.

الخطوات التالية

بعد تحميل عمليات التتبُّع، يمكنك تحليلها بشكل فردي أو إجراء تحليل مجمّع لعمليات التتبُّع. للحصول على إرشادات حول إعداد مسار تحليل قابل للتوسّع، يُرجى الرجوع إلى مقالة نشر Bigtrace على Kubernetes.