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

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

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

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

কোটলিন

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

গ্রোভি

   dependencies {
       implementation 'androidx.tracing:tracing:1.3.0'
       implementation 'androidx.core:core:1.16.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 তৈরি করুন যা প্রোফাইলিং ফলাফল পাবে। প্রোফাইলিং ব্যাকগ্রাউন্ডে ঘটে। একটি নন-ইউআই থ্রেড এক্সিকিউটর ব্যবহার করা অ্যাপ্লিকেশন নট রেসপন্ডিং (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() ব্যবহার করে যোগ করা হয়েছে। এই কাস্টম স্লাইসটি আপনার অ্যাপের মধ্যে নির্দিষ্ট ক্রিয়াকলাপগুলিকে হাইলাইট করে জেনারেট করা প্রোফাইলে উপস্থিত হয়।