কম্পোজিশন ট্রেসিং

পারফর্ম্যান্স সংক্রান্ত সমস্যা প্রথমবার দেখার সময় ট্রেস প্রায়ই তথ্যের সেরা সোর্স হিসেবে কাজ করে। এগুলি আপনাকে সমস্যাটি কী এবং কোথায় খুঁজতে হবে তার একটি অনুমান তৈরি করতে দেয়।

Android-এ দুই লেভেলের ট্রেসিং কাজ করে: সিস্টেম ট্রেসিং ও মেথড ট্রেসিং।

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

মেথড ট্রেসিং আপনার অ্যাপের প্রতিটি ফাংশন কল ট্র্যাক করে। এটি খুব ব্যয়বহুল এবং তাই এটি আপনার অ্যাপের পারফর্ম্যান্সকে ব্যাপকভাবে প্রভাবিত করে, তবে এটি আপনাকে কী ঘটছে, কোন ফাংশন কল করা হচ্ছে এবং কত ঘন ঘন কল করা হচ্ছে তার একটি সম্পূর্ণ ছবি দেয়।

ডিফল্ট হিসেবে, সিস্টেম ট্রেসে আলাদা আলাদা কম্পোজেবল ফাংশন থাকে না। এগুলি মেথড ট্রেসে উপলভ্য।

কম্পোজিশন ট্রেসিং সিস্টেম ট্রেসের মধ্যে কম্পোজেবল ফাংশন দেখায়। এই ফিচার আপনাকে সিস্টেম ট্রেসিং থেকে কম অনুপ্রবেশ দেয়, সাথে কম্পোজিশনে মেথড ট্রেসিং লেভেলের বিস্তারিত বিবরণ দেয়।

কম্পোজিশন ট্রেসিং সেট-আপ

আপনার প্রোজেক্টে কম্পোজিশন ট্রেসিং ব্যবহার করে দেখতে, আপনাকে অন্তত নিম্নলিখিত ভার্সনে আপডেট করতে হবে:

  • Android Studio Flamingo
  • Compose UI: 1.3.0
  • Compose Compiler: 1.3.0

আপনি যে ডিভাইস বা এমুলেটরে ট্রেস রান করেন সেটির API লেভেলও কমপক্ষে ৩০ হতে হবে।

এছাড়াও, আপনাকে Compose রানটাইম ট্রেসিংয়ে নতুন ডিপেন্ডেন্সি যোগ করতে হবে:

implementation("androidx.compose.runtime:runtime-tracing:1.12.1")

আপনি Compose BOM ব্যবহার করলে, আপনাকে ভার্সন উল্লেখ করতে হবে না:

val composeBom = platform("androidx.compose:compose-bom:2026.09.00")
implementation(composeBom)
// ...

// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")

এই ডিপেন্ডেন্সির মাধ্যমে, আপনি যখন সিস্টেম ট্রেস নেন যাতে রিকম্পোজিশন অন্তর্ভুক্ত থাকে, আপনি কম্পোজেবল ফাংশন অটোমেটিক দেখতে পাবেন।

সিস্টেম ট্রেস নিন

সিস্টেম ট্রেস নিতে এবং নতুন কম্পোজিশন ট্রেসিং অ্যাকশনে দেখতে, এইসব ধাপ অনুসরণ করুন:

  1. প্রোফাইলার খুলুন:

    Android Studio - প্রোফাইলিং শুরু করুন
    ছবি ২. Android Studio - প্রোফাইলিং শুরু করুন
  2. CPU টাইমলাইন বিকল্পে ক্লিক করুন

    Android Studio Profiler - CPU টাইমলাইন
    ছবি ৩। Android Studio Profiler - CPU টাইমলাইন
  3. আপনি যে UI ট্রেস করতে চান সেখানে আপনার অ্যাপ নেভিগেট করুন এবং তারপরে সিস্টেম ট্রেস এবং রেকর্ড বিকল্প বেছে নিন

    ট্রেস করার বিকল্প - সিস্টেম ট্রেস
    ছবি ৪. ট্রেস বিকল্প - সিস্টেম ট্রেস
  4. রিকম্পোজিশন করতে এবং রেকর্ডিং বন্ধ করতে আপনার অ্যাপ ব্যবহার করুন। ট্রেস প্রসেস করা হয়ে গেলে এবং দেখা গেলে, আপনি এখন কম্পোজিশন ট্রেসে কম্পোজেবল দেখতে পাবেন। আপনি কীবোর্ড ও মাউস ব্যবহার করে ট্রেস জুম ও প্যান করতে পারবেন; ট্রেস নেভিগেট করার ব্যাপারে আপনার কোনও ধারণা না থাকলে, ট্রেস রেকর্ড করুন ডকুমেন্টেশন দেখুন।

    Android Studio-তে সিস্টেম ট্রেস ভিজ্যুয়ালাইজেশনের উদাহরণ।
    ছবি ৫. সিস্টেম ট্রেস

    চার্টে কোনও কম্পোজেবলে ডবল ক্লিক করলে, আপনি সেটির সোর্স কোডে পৌঁছে যাবেন।

  5. এছাড়াও, আপনি ফাইল ও লাইন নম্বরের সাথে ফ্লেম চার্টে কম্পোজেবল দেখতে পাবেন:

    কম্পোজেবল ফাংশন দেখানো ফ্লেম চার্টের একটি উদাহরণ।
    ছবি ৬। ফ্লেম চার্ট

Caveats

কম্পোজিশন ট্রেসিং ব্যবহার করার সময়, APK সাইজ ও পারফর্ম্যান্সের ব্যাপারে নিম্নলিখিত সতর্কতাগুলি বিবেচনা করুন।

APK সাইজ ওভারহেড

আমরা এই ফিচারের ওভারহেড যতটা সম্ভব কমানোর চেষ্টা করেছি, তবে কম্পোজ কম্পাইলারের মাধ্যমে APK-তে এম্বেড করা ট্রেসিং স্ট্রিং থেকে আসা কম্পোজ অ্যাপের জন্য APK সাইজ বৃদ্ধি পেয়েছে। আপনার অ্যাপ যদি খুব বেশি কম্পোজ ব্যবহার না করে, তাহলে এই সাইজ বৃদ্ধি তুলনামূলকভাবে কম হতে পারে অথবা সম্পূর্ণ কম্পোজ অ্যাপের জন্য বেশি হতে পারে। এই ট্রেসিং স্ট্রিংগুলি অতিরিক্তভাবে আনঅবফাসকেট করা হয়েছে যাতে সেগুলি ট্রেসিং টুলে দেখা যেতে পারে, যেমনটি আগে দেখানো হয়েছে। Compose কম্পাইলার ভার্সন 1.3.0 থেকে শুরু করে সব অ্যাপে সেগুলি ইনজেক্ট করে।

নিম্নলিখিত Proguard নিয়ম যোগ করে আপনার প্রোডাকশন বিল্ড থেকে ট্রেসিং স্ট্রিং সরানো যেতে পারে:

-assumenosideeffects public class androidx.compose.runtime.ComposerKt {

   boolean isTraceInProgress();

   void traceEventStart(int,int,int,java.lang.String);

   void traceEventStart(int,java.lang.String);

   void traceEventEnd();

}

এইসব ফাংশন ভবিষ্যতে পরিবর্তন হতে পারে, তবে যেকোনও পরিবর্তন Compose রিলিজ নোট-এ উল্লেখ করা হবে।

মনে রাখবেন, ফাংশনগুলি রেখে দিলে, APK সাইজের খরচ কিছুটা হলেও, এটি নিশ্চিত করে যে প্রোফাইল করা APKটি অ্যাপ ব্যবহারকারীরা যে APK রান করেন তার মতোই।

সঠিক সময়

সঠিক প্রোফাইলিংয়ের জন্য, যেকোনও পারফর্ম্যান্স টেস্টিংয়ের মতো, আপনাকে প্রোফাইল করা যায় এমন অ্যাপ্লিকেশন অনুযায়ী অ্যাপ profileable ও non-debuggable তৈরি করতে হবে।

টার্মিনাল থেকে ট্রেস ক্যাপচার করুন

টার্মিনাল থেকে কম্পোজিশন ট্রেস ক্যাপচার করা সম্ভব। এটি করতে, আপনাকে সেইসব ধাপ অনুসরণ করতে হবে যা Android Studio সাধারণত আপনার জন্য অটোমেটিক করে থাকে।

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

প্রথমে, আপনার অ্যাপে অতিরিক্ত ডিপেন্ডেন্সি যোগ করুন।

implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")

রেকর্ড কমান্ড জেনারেট করুন

  1. Perfetto-তে ব্যবহার করে রেকর্ড কমান্ড জেনারেট করুন।
  2. নিম্নলিখিত উদাহরণ অনুযায়ী track_event ডেটা সোর্স বিভাগ ম্যানুয়ালি যোগ করুন:

    adb shell perfetto \
      -c - --txt \
      -o /data/misc/perfetto-traces/trace \
    <<EOF
    buffers: {
        size_kb: 63488
        fill_policy: RING_BUFFER
    }
    buffers: {
        size_kb: 2048
        fill_policy: RING_BUFFER
    }
    data_sources: {
        config {
            name: "track_event"
        }
    }
    duration_ms: 10000
    flush_period_ms: 30000
    incremental_state_config {
        clear_period_ms: 5000
    }
    EOF

ট্রেস ক্যাপচার করুন

  1. অ্যাপটি চালু করুন এবং আপনি যে বিভাগটি ট্রেস করতে চান সেটি প্রস্তুত করুন।
  2. ব্রডকাস্ট ইস্যু করে অ্যাপে ট্রেসিং চালু করুন।

    # set app package variable, e.g. com.google.samples.apps.nowinandroid.debug
    # can be found through `adb shell ps -ef` or `adb shell cmd package list packages`
    package=<your app process>
    
    # issue a broadcast to enable tracing
    adb shell am broadcast \
    -a androidx.tracing.perfetto.action.ENABLE_TRACING \
    $package/androidx.tracing.perfetto.TracingReceiver
    
  3. আপনার আগে তৈরি করা রেকর্ডিং কমান্ড শুরু করুন।

ট্রেস খুলুন

  1. adb pull <location> ডিভাইস থেকে ট্রেস (রেকর্ড কমান্ডে নির্দিষ্ট করা লোকেশন)।

  2. Perfetto-তে খুলুন।

Jetpack Macrobenchmark-এর সাহায্যে ট্রেস ক্যাপচার করা

আপনি Jetpack Macrobenchmark-এর সাহায্যে পারফর্ম্যান্স পরিমাপ করতে পারবেন, যা ফলাফল হিসেবে ট্রেস প্রদান করে। ম্যাক্রোবেঞ্চমার্কের সাথে কম্পোজিশন ট্রেসিং চালু করতে, আপনাকে এগুলি করতে হবে:

  1. Macrobenchmark টেস্ট মডিউলে এইসব অতিরিক্ত ডিপেন্ডেন্সি যোগ করুন:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. বেঞ্চমার্ক রান করার আগে androidx.benchmark.fullTracing.enable=true ইন্সট্রুমেন্টেশন আর্গুমেন্ট যোগ করুন। Macrobenchmark ইনস্ট্রুমেন্টেশন আর্গুমেন্ট সম্পর্কে আরও জানতে Macrobenchmark ইনস্ট্রুমেন্টেশন আর্গুমেন্ট চেক করুন।

রিকম্পোজিশন ট্রেসিং

রিকম্পোজিশন ট্রেসিং কম্পোজিশন ট্রেসিং থেকে কম্পোজেবল ফাংশন ছাড়াও, কম্পোজেবল ফাংশনগুলিকে ট্রেসে রিকম্পোজ করার কারণ হিসেবে স্টেট রিড এবং রাইট যোগ করে। এটি আপনাকে খুঁজে পেতে সাহায্য করে যে কোন স্টেট পরিবর্তন একটি রিকম্পোজিশন ট্রিগার করেছে।

রিকম্পোজিশন ট্রেসিংয়ের ওভারহেড কম্পোজিশন ট্রেসিংয়ের চেয়ে বেশি, তাই এটি রিকম্পোজিশন ডিবাগ করার জন্য ব্যবহার করুন, পারফর্ম্যান্স পরিমাপ করার জন্য নয়।

রিকম্পোজিশন ট্রেসিং সেট-আপ

আপনার অ্যাপ মডিউলে Compose Runtime Tracing 1.13.0 বা তার পরবর্তী যেকোনও ভার্সনের উপর নির্ভরতা যোগ করুন:

// Compose BOM 2026.11.00+ (runtime-tracing 1.13.0+)
implementation("androidx.compose.runtime:runtime-tracing")

আপনি যে ডিভাইস বা এমুলেটরে ট্রেস রান করেন, সেটিতে API লেভেল ২৯ বা তার বেশি হতে হবে।

রিকম্পোজিশন ট্রেস ক্যাপচার করুন

টার্মিনাল থেকে রিকম্পোজিশন ট্রেস ক্যাপচার করতে record_recomposition_trace.py স্ক্রিপ্ট ব্যবহার করুন।

  1. অ্যাপটি চালু করুন এবং আপনি যে বিভাগটি ট্রেস করতে চান সেটি প্রস্তুত করুন।
  2. রেকর্ডিং শুরু করুন:

    ./record_recomposition_trace.py -p <your app package>
  3. রিকম্পোজিশন করার জন্য আপনার অ্যাপ ব্যবহার করুন এবং তারপরে রেকর্ডিং বন্ধ করতে Control+C প্রেস করুন। পরিবর্তে, নির্দিষ্ট সময়সীমার জন্য রেকর্ড করতে, -t-এর সাথে সেকেন্ডে সময়সীমা পাস করুন, যেমন -t 10।

স্ক্রিপ্টটি অ্যাপে কম্পোজিশন এবং রিকম্পোজিশন ট্রেসিং চালু করে, একটি সিস্টেম ট্রেস রেকর্ড করে এবং তারপরে ট্রেসিং বন্ধ করে এবং বর্তমান ডিরেক্টরিতে একটি একক <package>-recompose-<timestamp>.zip ফাইলে সমস্ত ট্রেস সেভ করে। Perfetto-তে ফাইল খুলুন।

স্টেট রাইট বেছে নিলে, স্টেট পরিবর্তন করেছে এমন কল স্ট্যাক দেখা যায় এবং ফ্লো অ্যারো এর ফলে হওয়া রিকম্পোজিশন দেখায়:

Perfetto-তে একটি রিকম্পোজিশন ট্রেস, যার মধ্যে একটি নির্বাচিত স্টেট রাইট, এর কল স্ট্যাক এবং এর ফলে হওয়া রিকম্পোজিশনের একটি ফ্লো অ্যারো রয়েছে।
ছবি ৭. Perfetto-তে রিকম্পোজিশন ট্রেস

কাস্টম Perfetto কনফিগারেশন বা ট্রেস বাফার সাইজের মতো সব বিকল্প দেখতে --help-এর সাথে স্ক্রিপ্ট রান করুন।

মতামত

এই ফিচার সম্পর্কে আপনার মতামত, এতে কোনও সমস্যা খুঁজে পেলে এবং কোনও অনুরোধ থাকলে, আমাদের জানাতে ভুলবেন না। আপনি ইস্যু ট্র্যাকার ব্যবহার করে আমাদের মতামত পাঠাতে পারেন।