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

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

Android पर ट्रैकिंग के दो लेवल काम करते हैं: सिस्टम ट्रैकिंग और तरीका ट्रैकिंग.

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

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

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

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

कॉम्पोज़िशन ट्रैकिंग के लिए सेट अप करना

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

  • Android Studio Flamingo
  • Compose का यूज़र इंटरफ़ेस (यूआई): 1.3.0
  • Compose कंपाइलर: 1.3.0

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

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

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

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

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

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

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

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

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

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

    Android Studio - प्रोफ़ाइलिंग शुरू करना
    दूसरी इमेज. Android Studio - प्रोफ़ाइलिंग शुरू करना
  2. सीपीयू टाइमलाइन पर क्लिक करें

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

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

    सिस्टम ट्रेस करने वाला टूल
    पांचवीं इमेज. सिस्टम ट्रेस

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

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

    फ़्लेम चार्ट
    छठी इमेज. फ़्लेम चार्ट

सीमाएं

APK का साइज़

हमने इस सुविधा के ओवरहेड को कम से कम करने की कोशिश की है. हालांकि, Compose कंपाइलर की मदद से APK में एम्बेड की गई ट्रैकिंग स्ट्रिंग की वजह से, Compose ऐप्लिकेशन के APK का साइज़ बढ़ जाता है. अगर आपका ऐप्लिकेशन Compose का ज़्यादा इस्तेमाल नहीं कर रहा है, तो ऐप्लिकेशन का साइज़ ज़्यादा नहीं बढ़ेगा. हालांकि, अगर ऐप्लिकेशन में Compose का पूरा इस्तेमाल किया जा रहा है, तो ऐप्लिकेशन का साइज़ ज़्यादा बढ़ सकता है. इन ट्रैकिंग स्ट्रिंग को भी साफ़ तौर पर दिखाया जाता है, ताकि वे ट्रैकिंग टूल में दिख सकें, जैसा कि पहले दिखाया गया है. Compose कंपाइलर, उन्हें 1.3.0 वर्शन से शुरू होने वाले सभी ऐप्लिकेशन में इंजेक्ट करता है.

प्रोगार्ड का यह नियम जोड़कर, अपने प्रोडक्शन बिल्ड में ट्रैकिंग स्ट्रिंग हटाई जा सकती हैं:

-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 की प्रोफ़ाइल बनाई जा रही है वह वही है जिसे ऐप्लिकेशन के उपयोगकर्ता चलाते हैं.

सटीक समय

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

सुझाव

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