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

يحفظ 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() للتعامل مع منطق تحميل الملفات الفعلي باستخدام حزمة تطوير البرامج المفضّلة لديك في الخلفية أو برنامج HTTP.

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

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

    • أنشئ OneTimeWorkRequest للمنفِّذ.

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

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

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

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

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