প্রোফাইল ফিরিয়ে আনা ও আপলোড করা

আপনি অ্যাপ-চালিত প্রোফাইল বা ট্রিগার-ভিত্তিক প্রোফাইল ক্যাপচার করুন না কেন, ProfilingManager ডিভাইসে সম্পূর্ণ ফাইল সেভ করে এবং আপনার রেজিস্টার করা কলব্যাকে একটি ProfilingResult ডেলিভার করে। সেভ করা প্রোফাইলের পাথ পেতে ProfilingResult.getResultFilePath কল করুন:

ডিভাইস থেকে প্রোফাইল ফিরিয়ে আনা

এই বিভাগে বর্ণনা করা হয়েছে যে ডিভাইসে ProfilingManager কোথায় প্রোফাইল স্টোর করে, অটোমেটিক ফাইল ক্লিন-আপ কীভাবে কাজ করে এবং adb ব্যবহার করে কীভাবে লোকাল ফাইল পুল করতে হয়।

ফাইলের লোকেশন ও নাম দেওয়ার ফর্ম্যাট

ProfilingManager আপনার অ্যাপ-নির্দিষ্ট স্টোরেজ ডিরেক্টরি-তে /data/user/0/<app>/files/profiling/-এ রিড্যাক্ট করা প্রোফাইল সেভ করে। ফাইলের নামের ফর্ম্যাট প্রোফাইল কীভাবে ক্যাপচার করা হয়েছে তার উপর নির্ভর করে:

  • অ্যাপ-চালিত প্রোফাইল:

    profile_<tag>_<datetime>_uid-<uid>.<profile-type-ext>
    

    প্রোফাইলের জন্য অনুরোধ করার সময় কোনও ট্যাগ প্রদান করা না হলে, <tag>_ বাদ দেওয়া হয়: profile_<datetime>_uid-<uid>.<profile-type-ext>.

  • ট্রিগার-ভিত্তিক প্রোফাইল:

    profile_trigger-type-<trigger_type>_<datetime>_uid-<uid>.<profile-type-ext>
    

যেখানে:

  • <app> হল আপনার অ্যাপের প্যাকেজের নাম।
  • <tag> হল কলারের প্রদান করা ট্যাগের প্রথম ২০টি বর্ণসাংখ্যিক অক্ষর (এবং হাইফেন) যা setTag-এর সাথে কনফিগার করা হয়েছে অথবা requestProfiling-এ পাস করা হয়েছে, a-z, 0-9 এবং --এর বাইরে থাকা যেকোনও অক্ষর সরিয়ে দিয়ে ছোট হাতের অক্ষরে কনভার্ট করা হয়েছে।
  • <trigger_type> হল ProfilingTrigger থেকে ট্রিগারের জন্য পূর্ণসংখ্যা ধ্রুবক কোড। ফাইলের নাম পার্স করার পরিবর্তে কোডে সবসময় ProfilingResult.getTriggerType কল করুন।
  • <datetime> হল প্রোফাইল রেকর্ড করার তারিখ ও সময় (yyyy-MM-dd-HH-mm-ss-SSS)।
  • <uid> হল আপনার অ্যাপের Linux ব্যবহারকারী আইডি (সাম্প্রতিক Profiling মডিউল ভার্সনে অন্তর্ভুক্ত)।
  • <profile-type-ext> হল ক্যাপচার করা প্রোফাইলের ধরনের ফাইল এক্সটেনশন:
    • সিস্টেম ট্রেসের জন্য .perfetto-trace
    • Java হিপ ডাম্পের জন্য .perfetto-java-heap-dump
    • হিপ প্রোফাইলের জন্য .perfetto-heap-profile
    • স্ট্যাক স্যাম্পলিং প্রোফাইলের জন্য .perfetto-stack-sample

অন-ডিভাইস স্টোরেজ ও ক্লিন-আপ

ডিভাইস স্টোরেজ দ্রুত খালি করতে, সফলভাবে আপলোড করার সাথে সাথেই আপনার আপলোড ওয়ার্কারে প্রতিটি প্রোফাইল ফাইল মুছে দিন (কারণ অটোমেটিক ক্লিন-আপ তখনই রান করে যখন ProfilingManager আপনার অ্যাপে ফলাফল ডেলিভার করে, অন্যথায় কোনও ক্যাম্পেন শেষ হওয়ার পরে আপনার অ্যাপ কলব্যাক রেজিস্টার করা বন্ধ করে দিলে, আপলোড না করা ফাইল ডিস্কে থেকে যেতে পারে)। সাম্প্রতিক Profiling মডিউল ভার্সনে ফলব্যাক হিসেবে, নতুন ফলাফল ডেলিভার করা হলে, ProfilingManager আপনার অ্যাপ-নির্দিষ্ট স্টোরেজ ডিরেক্টরিতে ৫ দিনের বেশি পুরনো ডেলিভার করা ফাইলও অটোমেটিক মুছে দেয়।

WorkManager-এর মাধ্যমে প্রোডাকশনে প্রোফাইল আপলোড করা

প্রোফাইল ফাইলের সাইজ কয়েক মেগাবাইট হতে পারে, তাই ডিভাইস আনমিটার্ড নেটওয়ার্কে (ওয়াই-ফাই) কানেক্ট করা থাকলে, চার্জিং ও আইডল অবস্থায় থাকলে ব্যাকগ্রাউন্ডে প্রোডাকশন আপলোড শিডিউল করুন।

আপলোড করার আগে, প্রোফাইল ফাইল কম্প্রেস করুন (যেমন, GZIPOutputStream বা ZipOutputStream ব্যবহার করে)। Perfetto protobuf প্রোফাইল এবং Java হিপ ডাম্প উল্লেখযোগ্যভাবে কম্প্রেস করে, নেটওয়ার্ক ব্যান্ডউইথ এবং ব্যাকএন্ড স্টোরেজ খরচ কমায়।

WorkManager ডিপেন্ডেন্সি যোগ করুন

ProfilingManager হল ক্লাউড-অ্যাগনস্টিক, তাই আপনি WorkManager ব্যবহার করে যেকোনও ব্যাকএন্ডে প্রোফাইল আপলোড করার শিডিউল করতে পারবেন। আপনার 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())
}

জাভা

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)
      .setRequiresCharging(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 ক্লায়েন্ট ব্যবহার করে এটি কম্প্রেস এবং আপলোড করুন এবং আপলোড সফল হলে স্থানীয় ফাইলটি মুছে দিন।
  • কাজ শিডিউল করা:
    • আপনার কর্মীর জন্য একটি OneTimeWorkRequest তৈরি করুন।
    • সীমাবদ্ধতা সেট করুন: setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) এবং setRequiresCharging(true) ব্যবহার করুন যাতে ডিভাইস ওয়াই-ফাইয়ে কানেক্ট করা, চার্জিং এবং আইডল অবস্থায় থাকলে তবেই আপলোড হয়।
    • ডেটা পাস করা: setInputData ব্যবহার করে getResultFilePath থেকে প্রোফাইল পাথ ওয়ার্কারের কাছে পাস করুন।
    • সারিতে যোগ করুন: WorkManager.enqueue-এ কল করে WorkManager-এ অনুরোধ জমা দিন।

পরবর্তী ধাপ

প্রোফাইল ফিরিয়ে আনা বা আপলোড করার পরে, Perfetto UI-তে সেগুলি ভিজ্যুয়ালাইজ করুন, PerfettoSQL-এর মাধ্যমে স্বতন্ত্র প্রোফাইল কোয়েরি করুন, একসাথে অনেক ট্রেস বিশ্লেষণ করুন, অথবা AI-এর মাধ্যমে প্রোফাইল বিশ্লেষণ করুন। স্কেলেবল সার্ভার-সাইড বিশ্লেষণ পাইপলাইন সেট-আপ করার ব্যাপারে নির্দেশিকা পেতে, Kubernetes-এ Bigtrace ডেপ্লয় করা দেখুন।