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

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

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

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

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

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

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

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

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

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

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

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

implementation("androidx.compose.runtime:runtime-tracing:1.0.0-beta01")

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

सिस्टम ट्रेस करें

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

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

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

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

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

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

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

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

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

सीमाएं

APK का साइज़ ओवरहेड

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

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 इंस्ट्रूमेंटेशन आर्ग्युमेंट जोड़ें. मैक्रोबेंचमार्क इंस्ट्रुमेंटेशन आर्ग्युमेंट के बारे में ज़्यादा जानने के लिए, मैक्रोबेंचमार्क इंस्ट्रुमेंटेशन आर्ग्युमेंट देखें.

सुझाव

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