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

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

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

WorkManager में अपलोड करने का काम सेट अप करना

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

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

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

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

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

Kotlin

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

Groovy

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

कोड स्निपेट

इस कोड में, ट्रेस अपलोड करने के लिए काम सेट अप करने का तरीका बताया गया है. जब आपके ऐप्लिकेशन को 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 को बढ़ाती है. अपनी पसंद के बैकएंड SDK या एचटीटीपी क्लाइंट का इस्तेमाल करके, असली फ़ाइल अपलोड लॉजिक को मैनेज करने के लिए, doWork() तरीका लागू करें.

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

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

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

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

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

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

अगले चरण

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