प्रोफ़ाइल अपलोड करने के लिए वर्कर सेट अप करना

ProfilingManager, ट्रेस को डिवाइस पर सेव करता है. लोकल डीबगिंग के लिए, ADB का इस्तेमाल करके इन फ़ाइलों को वापस पाया जा सकता है. हालांकि, फ़ील्ड डेटा इकट्ठा करने के लिए, उन्हें सर्वर पर अपलोड करना ज़रूरी है.

ट्रेस फ़ाइलें बड़ी हो सकती हैं. अक्सर इनका साइज़ कई एमबी होता है. उपयोगकर्ता अनुभव पर बुरा असर पड़ने या मोबाइल डेटा खर्च होने से बचाने के लिए, आपको अपलोड को बैकग्राउंड में होने के लिए शेड्यूल करना चाहिए. ऐसा तब करें, जब डिवाइस अनलिमिटेड नेटवर्क (वाई-फ़ाई) से कनेक्ट हो, चार्ज हो रहा हो, और इस्तेमाल न किया जा रहा हो.

WorkManager की मदद से, अपलोड करने का टास्क सेट अप करना

ProfilingManager किसी भी क्लाउड पर काम करता है. इसलिए, अपनी पसंद के किसी भी इंफ़्रास्ट्रक्चर पर ट्रेस अपलोड किए जा सकते हैं. नीचे दिए गए उदाहरण में, WorkManager का इस्तेमाल करके, अपलोड करने के ऐसे जॉब को शेड्यूल करने का तरीका बताया गया है जिससे उपयोगकर्ता को कोई परेशानी न हो.

अपलोड करने का काम सेट अप करने के लिए कोड का उदाहरण

यहां एक उदाहरण दिया गया है, जिसमें बताया गया है कि उपयोगकर्ता के काम में रुकावट डाले बिना, आपके सर्वर पर ट्रेस अपलोड करने के लिए कोई जॉब कैसे सेट अप की जा सकती है.

WorkManager डिपेंडेंसी जोड़ना

अपनी मौजूदा ProfilingManager डिपेंडेंसी के अलावा, इन Jetpack लाइब्रेरी को अपनी build.gradle.kts फ़ाइल में जोड़ें. WorkManager को इनकी ज़रूरत होती है.

Kotlin

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

Groovy

   dependencies {
       implementation 'androidx.work:work-runtime:2.11.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());
}

कोड के बारे में सिलसिलेवार तरीके से दी गई जानकारी

यह कोड ये काम करता है:

  • वर्कर के बारे में बताना: Worker को बढ़ाने वाली TraceUploadWorker क्लास बनाएं. अपने पसंदीदा बैकएंड एसडीके टूल या एचटीटीपी क्लाइंट का इस्तेमाल करके, फ़ाइल अपलोड करने के लॉजिक को मैनेज करने के लिए, doWork() तरीके का इस्तेमाल करें.

  • प्रोफ़ाइलिंग का अनुरोध करना: ट्रेस (अवधि, बफ़र नीति) को कॉन्फ़िगर करने के लिए SystemTraceRequestBuilder का इस्तेमाल करें. साथ ही, इसे शुरू करने के लिए Profiling.requestProfiling का इस्तेमाल करें.

  • काम शेड्यूल करना:

    • अपने वर्कर के लिए OneTimeWorkRequest बनाएं.

    • पाबंदियां सेट करें: setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true), और setRequiresCharging(true) का इस्तेमाल करके यह पक्का करें कि डेटा सिर्फ़ तब अपलोड हो, जब उपयोगकर्ता वाई-फ़ाई से कनेक्ट हो, डिवाइस चार्ज हो रहा हो, और उसका इस्तेमाल न किया जा रहा हो. अपलोड करने के काम में उपयोगकर्ता को किसी तरह की रुकावट से बचाने के लिए, यह ज़रूरी है.

    • डेटा पास करना: वर्कर को ट्रेस पाथ पास करने के लिए, setInputData का इस्तेमाल करें.

    • कतार में जोड़ना: WorkManager#enqueue को कॉल करके, WorkManager को अनुरोध सबमिट करें.

अगले चरण

ट्रेस अपलोड करने के बाद, उनका अलग-अलग विश्लेषण किया जा सकता है. इसके अलावा, एक साथ कई ट्रेस का विश्लेषण भी किया जा सकता है. स्केल की जा सकने वाली विश्लेषण पाइपलाइन सेट अप करने के बारे में जानने के लिए, Kubernetes पर Bigtrace डिप्लॉय करना लेख पढ़ें.