কিভাবে একটি প্রোফাইল ক্যাপচার

এই পৃষ্ঠাটি দেখায় কিভাবে ProfilingManager API ব্যবহার করে একটি সিস্টেম ট্রেস রেকর্ড করতে হয়।

নির্ভরতা যোগ করুন

ProfilingManager API-এর সর্বোত্তম অভিজ্ঞতার জন্য, আপনার build.gradle.kts ফাইলে নিম্নলিখিত Jetpack লাইব্রেরিগুলি যোগ করুন।

কোটলিন

   dependencies {
       implementation("androidx.tracing:tracing:1.3.0")
       implementation("androidx.core:core:1.17.0")
   }
   

খাঁজকাটা

   dependencies {
       implementation 'androidx.tracing:tracing:1.3.0'
       implementation 'androidx.core:core:1.17.0'
   }
   

একটি সিস্টেম ট্রেস রেকর্ড করুন

প্রয়োজনীয় নির্ভরতা যোগ করার পরে, একটি সিস্টেম ট্রেস রেকর্ড করতে নিম্নলিখিত কোডটি ব্যবহার করুন। এই উদাহরণে একটি প্রোফাইলিং সেশন শুরু এবং পরিচালনা করার জন্য একটি Activity মধ্যে একটি মৌলিক সেটআপ দেখানো হয়েছে।

কোটলিন

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
fun sampleRecordSystemTrace() {
    val mainExecutor: Executor =
        Dispatchers.IO.asExecutor() // Your choice of executor for the callback to occur on.
    val resultCallback = Consumer<ProfilingResult> { profilingResult ->
        if (profilingResult.errorCode == ProfilingResult.ERROR_NONE) {
            Log.d(
                "ProfileTest",
                "Received profiling result file=" + profilingResult.resultFilePath
            )
        } else {
            Log.e(
                "ProfileTest",
                "Profiling failed errorcode=" + profilingResult.errorCode + " errormsg=" + profilingResult.errorMessage
            )
        }
    }
    val stopSignal = CancellationSignal()

    val requestBuilder = SystemTraceRequestBuilder()
    requestBuilder.setCancellationSignal(stopSignal)
    requestBuilder.setTag("FOO") // Caller supplied tag for identification
    requestBuilder.setDurationMs(60000)
    requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER)
    requestBuilder.setBufferSizeKb(20971520)
    requestProfiling(applicationContext, requestBuilder.build(), mainExecutor, resultCallback)

    // Wait some time for profiling to start.

    Trace.beginSection("MyApp:HeavyOperation")
    heavyOperation()
    Trace.endSection()

    // Once the interesting code section is profiled, stop profile
    stopSignal.cancel()
}

fun heavyOperation() {
    // Computations you want to profile
}

জাভা

void heavyOperation() {
  // Computations you want to profile
}

void sampleRecordSystemTrace() {
  Executor mainExecutor = Executors.newSingleThreadExecutor();
  Consumer<ProfilingResult> resultCallback =
      new Consumer<ProfilingResult>() {
        @Override
        public void accept(ProfilingResult profilingResult) {
          if (profilingResult.getErrorCode() == ProfilingResult.ERROR_NONE) {
            Log.d(
                "ProfileTest",
                "Received profiling result file=" + profilingResult.getResultFilePath());
          } else {
            Log.e(
                "ProfileTest",
                "Profiling failed errorcode="

                    + profilingResult.getErrorCode()
                    + " errormsg="
                    + profilingResult.getErrorMessage());
          }
        }
      };
  CancellationSignal stopSignal = new CancellationSignal();

  SystemTraceRequestBuilder requestBuilder = new SystemTraceRequestBuilder();
  requestBuilder.setCancellationSignal(stopSignal);
  requestBuilder.setTag("FOO");
  requestBuilder.setDurationMs(60000);
  requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER);
  requestBuilder.setBufferSizeKb(20971520);
  Profiling.requestProfiling(getApplicationContext(), requestBuilder.build(), mainExecutor,
      resultCallback);

  // Wait some time for profiling to start.

  Trace.beginSection("MyApp:HeavyOperation");
  heavyOperation();
  Trace.endSection();

  // Once the interesting code section is profiled, stop profile
  stopSignal.cancel();
}

নমুনা কোডটি নিম্নলিখিত ধাপগুলি অনুসরণ করে প্রোফাইলিং সেশন সেট আপ এবং পরিচালনা করে:

  1. এক্সিকিউটর সেট আপ করুন। প্রোফাইলিং ফলাফল প্রাপ্ত থ্রেডটি নির্ধারণ করার জন্য একটি Executor তৈরি করুন। প্রোফাইলিং ব্যাকগ্রাউন্ডে ঘটে। একটি নন-UI থ্রেড এক্সিকিউটর ব্যবহার করলে অ্যাপ্লিকেশন নট রেসপন্ডিং (ANR) ত্রুটিগুলি প্রতিরোধ করতে সাহায্য করে যদি আপনি পরে কলব্যাকে আরও প্রক্রিয়াকরণ যোগ করেন।

  2. প্রোফাইলিং ফলাফল পরিচালনা করুন। একটি Consumer<ProfilingResult> অবজেক্ট তৈরি করুন। সিস্টেমটি এই অবজেক্ট ব্যবহার করে ProfilingManager থেকে প্রোফাইলিং ফলাফল আপনার অ্যাপে ফেরত পাঠায়।

  3. প্রোফাইলিং রিকোয়েস্ট তৈরি করুন। আপনার প্রোফাইলিং সেশন সেট আপ করার জন্য একটি SystemTraceRequestBuilder তৈরি করুন। এই বিল্ডার আপনাকে ProfilingManager ট্রেস সেটিংস কাস্টমাইজ করতে দেয়। বিল্ডার কাস্টমাইজ করা ঐচ্ছিক; যদি আপনি না করেন, তাহলে সিস্টেম ডিফল্ট সেটিংস ব্যবহার করে।

    • একটি ট্যাগ সংজ্ঞায়িত করুন। ট্রেস নামের সাথে একটি ট্যাগ যুক্ত করতে setTag() ব্যবহার করুন। এই ট্যাগটি আপনাকে ট্রেসটি সনাক্ত করতে সাহায্য করে।
    • ঐচ্ছিক: সময়কাল সেট করুন। মিলিসেকেন্ডে প্রোফাইল কতক্ষণ করতে হবে তা নির্দিষ্ট করতে setDurationMs() ব্যবহার করুন। উদাহরণস্বরূপ, 60000 একটি 60-সেকেন্ডের ট্রেস সেট করে। যদি CancellationSignal এর আগে ট্রিগার না করা হয় তবে নির্দিষ্ট সময়কালের পরে ট্রেস স্বয়ংক্রিয়ভাবে শেষ হয়ে যায়।
    • একটি বাফার নীতি নির্বাচন করুন। ট্রেস ডেটা কীভাবে সংরক্ষণ করা হবে তা নির্ধারণ করতে setBufferFillPolicy() ব্যবহার করুন। BufferFillPolicy.RING_BUFFER এর অর্থ হল যখন বাফারটি পূর্ণ থাকে, তখন নতুন ডেটা পুরনোতম ডেটা ওভাররাইট করে, সাম্প্রতিক কার্যকলাপের একটি ধারাবাহিক রেকর্ড রাখে।
    • একটি বাফার আকার নির্ধারণ করুন। ট্রেসিংয়ের জন্য একটি বাফার আকার নির্দিষ্ট করতে setBufferSizeKb() ব্যবহার করুন যা আপনি আউটপুট ট্রেস ফাইলের আকার নিয়ন্ত্রণ করতে ব্যবহার করতে পারেন।
  4. ঐচ্ছিক: সেশনের জীবনচক্র পরিচালনা করুন। একটি CancellationSignal তৈরি করুন। এই অবজেক্টটি আপনাকে যখনই ইচ্ছা প্রোফাইলিং সেশন বন্ধ করতে দেয়, যার ফলে আপনি এর দৈর্ঘ্যের উপর সুনির্দিষ্ট নিয়ন্ত্রণ পেতে পারেন।

  5. ফলাফল শুরু করুন এবং গ্রহণ করুন। যখন আপনি requestProfiling() কল করেন, তখন ProfilingManager ব্যাকগ্রাউন্ডে একটি প্রোফাইলিং সেশন শুরু করে। প্রোফাইলিং সম্পন্ন হলে, এটি আপনার resultCallback#accept পদ্ধতিতে ProfilingResult পাঠায়। যদি প্রোফাইলিং সফলভাবে সম্পন্ন হয়, তাহলে ProfilingResult ProfilingResult#getResultFilePath মাধ্যমে আপনার ডিভাইসে ট্রেসটি কোথায় সংরক্ষণ করা হয়েছিল তা প্রদান করে। আপনি এই ফাইলটি প্রোগ্রাম্যাটিকভাবে পেতে পারেন অথবা, স্থানীয় প্রোফাইলিংয়ের জন্য, আপনার কম্পিউটার থেকে adb pull <trace_path> চালিয়ে পেতে পারেন।

  6. কাস্টম ট্রেস পয়েন্ট যোগ করুন। আপনি আপনার অ্যাপের কোডে কাস্টম ট্রেস পয়েন্ট যোগ করতে পারেন। পূর্ববর্তী কোড উদাহরণে, MyApp:HeavyOperation নামে একটি ট্রেস স্লাইস Trace.beginSection() এবং Trace.endSection() ব্যবহার করে যোগ করা হয়েছে। এই কাস্টম স্লাইসটি জেনারেট করা প্রোফাইলে প্রদর্শিত হবে, যা আপনার অ্যাপের মধ্যে নির্দিষ্ট ক্রিয়াকলাপগুলিকে হাইলাইট করবে।