कंपोज़िशन ट्रेसिंग

परफ़ॉर्मेंस से जुड़ी किसी समस्या की जांच करते समय, ट्रेस सबसे अच्छा सोर्स होते हैं. इनकी मदद से, यह अनुमान लगाया जा सकता है कि समस्या क्या है और इसकी जांच कहां से शुरू करनी है.

Android पर दो लेवल की ट्रेसिंग की सुविधा उपलब्ध है: सिस्टम ट्रेसिंग और मेथड ट्रेसिंग.

सिस्टम ट्रेसिंग सिर्फ़ उन हिस्सों को ट्रैक करती है जिन्हें खास तौर पर ट्रेसिंग के लिए मार्क किया गया है. इसलिए, इसमें कम ओवरहेड होता है और यह आपके ऐप्लिकेशन की परफ़ॉर्मेंस पर ज़्यादा असर नहीं डालती. सिस्टम ट्रेसिंग, यह देखने के लिए सबसे सही है कि आपके कोड के कुछ खास सेक्शन को चलने में कितना समय लग रहा है.

मेथड ट्रेसिंग, आपके ऐप्लिकेशन में हर फ़ंक्शन कॉल को ट्रैक करती है. यह बहुत महंगा है. इसलिए, इससे आपके ऐप्लिकेशन की परफ़ॉर्मेंस पर काफ़ी असर पड़ता है. हालांकि, इससे आपको यह पूरी जानकारी मिलती है कि क्या हो रहा है, कौनसे फ़ंक्शन कॉल किए जा रहे हैं, और उन्हें कितनी बार कॉल किया जा रहा है.

डिफ़ॉल्ट रूप से, सिस्टम ट्रेस में अलग-अलग कंपोज़ेबल फ़ंक्शन शामिल नहीं होते. ये तरीके के ट्रेस में उपलब्ध होते हैं.

कंपोज़िशन ट्रेसिंग से, सिस्टम ट्रेस के अंदर कंपोज़ेबल फ़ंक्शन दिखते हैं. इस सुविधा से, आपको सिस्टम ट्रेसिंग से कम रुकावट मिलती है. साथ ही, कंपोज़िशन में मेथड ट्रेसिंग के लेवल की जानकारी मिलती है.

कंपोज़िशन ट्रेसिंग सेटअप करना

अपने प्रोजेक्ट में रीकंपोज़िशन ट्रेसिंग की सुविधा आज़माने के लिए, आपको कम से कम इन वर्शन पर अपडेट करना होगा:

  • Android Studio फ़्लमिंगो
  • Compose UI: 1.3.0
  • Compose कंपाइलर: 1.3.0

जिस डिवाइस या एम्युलेटर पर ट्रेस चलाया जा रहा है उस पर भी कम से कम एपीआई लेवल 30 होना चाहिए.

इसके अलावा, आपको Compose Runtime Tracing पर एक नई डिपेंडेंसी जोड़नी होगी:

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

अगर Compose BOM का इस्तेमाल किया जा रहा है, तो आपको वर्शन की जानकारी देने की ज़रूरत नहीं है:

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

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

इस डिपेंडेंसी की मदद से, रीकंपोज़िशन को शामिल करने वाला सिस्टम ट्रेस लेने पर, कंपोज़ेबल फ़ंक्शन अपने-आप दिख जाते हैं.

सिस्टम ट्रेस करना

सिस्टम ट्रेस लेने और रीकंपोज़िशन ट्रेसिंग की सुविधा को काम करते हुए देखने के लिए, यह तरीका अपनाएं:

  1. प्रोफ़ाइलर खोलें:

    Android Studio - Start Profiling
    दूसरी इमेज. Android Studio - Start Profiling
  2. सीपीयू टाइमलाइन पर क्लिक करें

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

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

    Android Studio में सिस्टम ट्रेस विज़ुअलाइज़ेशन का उदाहरण.
    पांचवीं इमेज. सिस्टम ट्रेस

    चार्ट में मौजूद किसी कंपोज़ेबल पर दो बार क्लिक करने से, आपको उसके सोर्स कोड पर ले जाया जाता है.

  5. फ़ाइल और लाइन नंबर के साथ-साथ, कंपोज़ेबल को फ़्लेम चार्ट में भी देखा जा सकता है:

    कंपोज़ेबल फ़ंक्शन दिखाने वाले फ़्लेम चार्ट का उदाहरण.
    छठी इमेज. फ़्लेम चार्ट

सीमाएं

कंपोज़िशन ट्रेसिंग का इस्तेमाल करते समय, APK के साइज़ और परफ़ॉर्मेंस से जुड़ी इन चेतावनियों को ध्यान में रखें.

APK के साइज़ में बढ़ोतरी

हमारा मकसद इस सुविधा के ओवरहेड को कम से कम करना है. हालांकि, Compose कंपाइलर की मदद से APK में एम्बेड की गई ट्रेसिंग स्ट्रिंग की वजह से, Compose ऐप्लिकेशन के APK का साइज़ बढ़ जाता है. अगर आपका ऐप्लिकेशन Compose का ज़्यादा इस्तेमाल नहीं कर रहा है, तो साइज़ में यह बढ़ोतरी काफ़ी कम हो सकती है. हालांकि, अगर आपका ऐप्लिकेशन पूरी तरह से Compose पर आधारित है, तो साइज़ में यह बढ़ोतरी ज़्यादा हो सकती है. इन ट्रेसिंग स्ट्रिंग को भी अनऑब्फ़स्केट किया जाता है, ताकि ये ट्रेसिंग टूल में दिख सकें. जैसा कि पहले दिखाया गया था. 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 के रिलीज़ नोट में बताया जाएगा.

ध्यान दें कि कुछ एपीके साइज़ की कीमत चुकाकर, फ़ंक्शन को चालू रखने से यह पक्का होता है कि प्रोफ़ाइल किया जा रहा एपीके वही है जिसे ऐप्लिकेशन के उपयोगकर्ता चलाते हैं.

सटीक टाइमिंग

परफ़ॉर्मेंस टेस्टिंग की तरह ही, सटीक प्रोफ़ाइलिंग के लिए आपको ऐप्लिकेशन को प्रोफ़ाइल किए जा सकने वाले ऐप्लिकेशन के मुताबिक 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 इंस्ट्रुमेंटेशन के आर्ग्युमेंट देखें.

सुझाव/राय दें या शिकायत करें

हमें इस सुविधा के बारे में आपके सुझाव/राय जानकर खुशी होगी. अगर आपको इसमें कोई गड़बड़ी मिलती है, तो हमें बताएं. साथ ही, अगर आपको कोई अनुरोध करना है, तो हमें बताएं. समस्या ट्रैकर का इस्तेमाल करके, हमें सुझाव/राय दें या शिकायत करें.