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

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

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

WorkManager अपलोड जॉब सेट अप करना

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

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

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

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

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

Kotlin

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

Groovy

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

कोड वॉकथ्रू

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

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

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

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

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

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

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

    • Enqueue: WorkManager#enqueue को कॉल करके, WorkManager को अनुरोध सबमिट करें.

अगले चरण

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