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

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

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

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

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

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

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

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

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

  • Android Studio फ़्लमिंगो
  • यूज़र इंटरफ़ेस (यूआई) लिखें: 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. अपने ऐप्लिकेशन के उस यूज़र इंटरफ़ेस (यूआई) पर जाएं जिसे आपको ट्रेस करना है. इसके बाद, System Trace और Record चुनें

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

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

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

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

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

सीमाएं

APK का साइज़

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

}

आने वाले समय में ये फ़ंक्शन बदल सकते हैं, लेकिन सभी बदलावों की जानकारी लिखें रिलीज़ नोट में मिलेगी.

ध्यान दें कि 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. इन अतिरिक्त डिपेंडेंसी को मैक्रोबेंचमार्क टेस्ट मॉड्यूल में जोड़ें:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. मानदंड लागू करने से पहले, androidx.benchmark.fullTracing.enable=true इंस्ट्रुमेंटेशन आर्ग्युमेंट जोड़ें. मैक्रोबेंचमार्क इंस्ट्रुमेंटेशन आर्ग्युमेंट के बारे में ज़्यादा जानने के लिए, मैक्रोबेंचमार्क इंस्ट्रुमेंटेशन आर्ग्युमेंट देखें.

सुझाव

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