यूज़र इंटरफ़ेस (यूआई) में होने वाली गड़बड़ियों का पता लगाना

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

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

Android 12 और उसके बाद के वर्शन पर जंक का पता लगाना

Android 12 (एपीआई लेवल 31) या इसके बाद के वर्शन का इस्तेमाल करने वाले डिवाइसों के लिए, कैप्चर किया गया ट्रेस, सीपीयू प्रोफ़ाइलर में डिसप्ले पैन के नीचे मौजूद जंकी फ़्रेम ट्रैक में दिखता है.

जैंक का पता लगाने के लिए,

  1. Android Studio में, View > Tool Windows > Profiler को चुनें या टूलबार में Profile पर क्लिक करें.

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

  2. सीपीयू प्रोफ़ाइलर खोलने के लिए, सीपीयू टाइमलाइन में कहीं भी क्लिक करें.

  3. सीपीयू प्रोफ़ाइलर में कॉन्फ़िगरेशन मेन्यू से सिस्टम ट्रेस चुनें. इसके बाद, रिकॉर्ड करें पर क्लिक करें. ऐप्लिकेशन का इस्तेमाल करने के बाद, बंद करें पर क्लिक करें.

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

  5. जब आपको कोई जंकी फ़्रेम मिल जाए, तो उस पर क्लिक करें. इसके अलावा, चुने गए फ़्रेम पर फ़ोकस करने के लिए, ज़ूम को अडजस्ट करने के लिए M दबाएं. इन थ्रेड में काम के इवेंट हाइलाइट किए गए हैं: मुख्य थ्रेड, RenderThread, और GPU completion. प्रोफ़ाइलर का स्क्रीनशॉट, जिसमें जंक फ़्रेम और मुख्य थ्रेड दिख रहे हैं

  6. आपके पास सभी फ़्रेम या रेंडरिंग के समय का ब्रेकडाउन देखने का विकल्प होता है. इसके लिए, सभी फ़्रेम और लाइफ़साइकल चेकबॉक्स को टॉगल करें. ऊपर दिए गए Profiler का स्क्रीनशॉट, लेकिन इसमें 'सभी फ़्रेम' और 'लाइफ़साइकल' चेकबॉक्स चुने गए हैं

Android 11 पर जंक का पता लगाना

Android 11 (एपीआई लेवल 30) का इस्तेमाल करने वाले डिवाइसों के लिए, कैप्चर किया गया ट्रेस, सीपीयू प्रोफ़ाइलर के फ़्रेम लाइफ़साइकल सेक्शन में दिखता है.

अलग-अलग ट्रैक के साथ फ़्रेम लाइफ़साइकल सेक्शन

फ़्रेम लाइफ़साइकल सेक्शन में लेयर का नाम और चार ट्रैक होते हैं. हर ट्रैक, फ़्रेम रेंडरिंग पाइपलाइन के एक चरण के बारे में बताता है. फ़्रेम लाइफ़साइकल के एलिमेंट ये हैं:

  1. फ़्रेम का लाइफ़साइकल (लेयर का नाम): सेक्शन के टाइटल में, ब्रैकेट में लेयर का नाम होता है. लेयर, कंपोज़िशन की एक यूनिट होती है.
  2. ऐप्लिकेशन: इस ट्रैक से पता चलता है कि ऐप्लिकेशन ने बफ़र को कब डीक्यू किया और कब वापस क्यू किया. यह आम तौर पर, RenderThread में मौजूद ट्रेस इवेंट से मेल खाता है.
  3. GPU से फ़्रेम रेंडर होने में लगने वाला समय: इस ट्रैक से पता चलता है कि बफ़र का मालिकाना हक GPU के पास कितने समय तक था. यह वह समय है जब बफ़र को GPU को भेजा जाता है और GPU बफ़र पर अपना काम पूरा करता है. इससे यह पता नहीं चलता कि इस दौरान जीपीयू सिर्फ़ इस बफ़र पर काम कर रहा था. किसी तय समय के दौरान जीपीयू किस तरह काम करता है, इस बारे में ज़्यादा जानकारी पाने के लिए, Android GPU Inspector का इस्तेमाल करें.
  4. कंपोज़िशन: यह ट्रैक, उस समय को दिखाता है जब SurfaceFlinger, बफ़र को लॉक करता है और उसे कंपोज़िशन के लिए भेजता है. साथ ही, यह उस समय को भी दिखाता है जब बफ़र को डिसप्ले पर भेजा जाता है.
  5. स्क्रीन पर दिखने वाले फ़्रेम: यह ट्रैक दिखाता है कि फ़्रेम स्क्रीन पर कितने समय तक दिखा.

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

Android Studio, सभी फ़्रेम टैब में, ट्रेस में मौजूद सभी फ़्रेम को टेबल फ़ॉर्मैट में भी दिखाता है.

'सभी फ़्रेम' टैब में, ट्रेस में मौजूद सभी फ़्रेम की टेबल

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

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

Android 11 पर जंक का पता लगाने और उसकी जांच करने के लिए, यह तरीका अपनाएं:

  1. सभी फ़्रेम टेबल को ऐप्लिकेशन कॉलम के हिसाब से घटते क्रम में लगाएं, ताकि सबसे ज़्यादा समय लेने वाले फ़्रेम सबसे ऊपर दिखें.

    ऐप्लिकेशन कॉलम को घटते क्रम में लगाया गया है

  2. सबसे ज़्यादा समय तक चलने वाले फ़्रेम ढूंढें और टेबल की लाइन चुनें. इससे बाईं ओर मौजूद टाइमलाइन व्यू में, चुने गए फ़्रेम को ज़ूम इन किया जाता है.

    फ़्रेम टेबल के साथ टाइमलाइन व्यू

  3. फ़्रेम का लाइफ़साइकल और थ्रेड सेक्शन में, काम के थ्रेड देखें.

    फ़्रेम की लाइफ़साइकल और थ्रेड सेक्शन

Android 10 और इससे पहले के वर्शन पर जंक का पता लगाना

Android 10 (एपीआई लेवल 29) और इससे पहले के वर्शन का इस्तेमाल करने वाले डिवाइसों के लिए, ओएस ग्राफ़िक्स पाइपलाइन से जुड़ी जानकारी, सीपीयू प्रोफ़ाइलर सिस्टम ट्रेस के डिस्प्ले नाम वाले सेक्शन में दिखती है.

डिसप्ले यूज़र इंटरफ़ेस (यूआई) विंडो

  • फ़्रेम: इस सेक्शन में, आपके ऐप्लिकेशन में यूज़र इंटरफ़ेस (यूआई) थ्रेड और RenderThread ट्रेस इवेंट दिखाए जाते हैं. 16 मि॰से॰ से ज़्यादा समय लेने वाले इवेंट को लाल रंग में दिखाया जाता है, ताकि संभावित जंक फ़्रेम को हाइलाइट किया जा सके. ऐसा इसलिए किया जाता है, क्योंकि ये इवेंट 60 फ़्रेम प्रति सेकंड (एफ़पीएस) पर रेंडर करने की समयसीमा से ज़्यादा समय लेते हैं.
  • SurfaceFlinger: इस सेक्शन से पता चलता है कि SurfaceFlinger, फ़्रेम बफ़र को कब प्रोसेस करता है. SurfaceFlinger एक सिस्टम प्रोसेस है. यह डिसप्ले को बफ़र भेजने के लिए ज़िम्मेदार होती है.
  • VSYNC: इस सेक्शन में VSYNC दिखता है. यह एक ऐसा सिग्नल है जो डिसप्ले पाइपलाइन को सिंक करता है. इस ट्रैक में VSYNC-ऐप्लिकेशन सिग्नल दिखता है. इससे पता चलता है कि आपका ऐप्लिकेशन कब बहुत देर से शुरू हो रहा है. आम तौर पर, ऐसा इसलिए होता है, क्योंकि यूज़र इंटरफ़ेस (यूआई) थ्रेड व्यस्त होती है. इससे ऐनिमेशन के दौरान, आपकी स्क्रीन पर फ़्लिकरिंग दिखती है. साथ ही, ऐनिमेशन या स्क्रोल पूरा होने तक इनपुट में ज़्यादा समय लगता है. यह ज़्यादा रीफ़्रेश रेट वाले डिसप्ले के लिए खास तौर पर ज़रूरी है, क्योंकि ये हर सेकंड में 60 बार से ज़्यादा या अलग-अलग रेट पर हो सकते हैं.
  • BufferQueue: इस सेक्शन में यह दिखाया जाता है कि कितने फ़्रेम बफ़र कतार में हैं और SurfaceFlinger के इस्तेमाल करने का इंतज़ार कर रहे हैं. Android 9 (एपीआई लेवल 28) या इसके बाद के वर्शन पर काम करने वाले डिवाइसों पर डिप्लॉय किए गए ऐप्लिकेशन के लिए, यह ट्रैक ऐप्लिकेशन के सरफेस BufferQueue (0, 1 या 2) के बफ़र की संख्या दिखाता है. BufferQueue की मदद से, इमेज बफ़र की स्थिति को समझा जा सकता है. ऐसा तब होता है, जब वे Android के ग्राफ़िक्स कॉम्पोनेंट के बीच ट्रांसफ़र होते हैं. उदाहरण के लिए, 2 वैल्यू का मतलब है कि ऐप्लिकेशन फ़िलहाल तीन बफ़र का इस्तेमाल कर रहा है. इससे इनपुट में ज़्यादा देरी होती है.

डिसप्ले सेक्शन में, जैंक का पता लगाने के लिए काम के सिग्नल मिलते हैं. उदाहरण के लिए, जब यूज़र इंटरफ़ेस (यूआई) थ्रेड या RenderThread को 16 मि॰से॰ से ज़्यादा समय लगता है. जैंक की वजह के बारे में सटीक जानकारी पाने के लिए, थ्रेड सेक्शन की जांच करें. इसमें यूज़र इंटरफ़ेस (यूआई) रेंडरिंग से जुड़ी थ्रेड दिखती हैं.

डिसप्ले में मौजूद Threads सेक्शन

ऊपर दिए गए फ़िगर में, थ्रेड सेक्शन में यूज़र इंटरफ़ेस (यूआई) थ्रेड (java.com.google.samples.apps.iosched), RenderThread, और GPU completion थ्रेड दिखाया गया है. ये थ्रेड, यूज़र इंटरफ़ेस (यूआई) रेंडरिंग से जुड़ी हैं. इनसे जंक की समस्या हो सकती है.

Android 10 या इससे पहले के वर्शन पर जंक का पता लगाने के लिए, यह तरीका अपनाएं:

  1. डिस्प्ले में फ़्रेम ट्रैक देखें. लाल फ़्रेम, जांच के लिए उम्मीदवार हैं.

    डिसप्ले में मौजूद फ़्रेम सेक्शन

  2. जब आपको कोई ऐसा फ़्रेम दिखे जिसमें गड़बड़ी हो सकती है, तो W दबाकर या Control (macOS पर Command) को दबाकर रखते हुए माउस के पहिए को स्क्रोल करके ज़ूम इन करें. ज़ूम इन करते रहें, जब तक आपको यूज़र इंटरफ़ेस (यूआई) थ्रेड और RenderThread में ट्रेस इवेंट न दिखने लगें.

    यूज़र इंटरफ़ेस (यूआई) थ्रेड और RenderThread में ट्रेस इवेंट

    ऊपर दिए गए फ़िगर में, Choreographer#doFrame तब दिखता है, जब यूज़र इंटरफ़ेस (यूआई) थ्रेड, ऐनिमेशन, व्यू लेआउट, इमेज ड्रॉइंग, और उनसे जुड़ी प्रोसेस को मैनेज करने के लिए Choreographer को कॉल करता है. DrawFrames से पता चलता है कि RenderThread, GPU को ड्राइंग के लिए असल कमांड कब भेजता है.

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

    यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट की सटीक अवधि दिखाने वाला मेन्यू

ज़्यादा जानें

जंक को कम करने के तरीके के बारे में ज़्यादा जानने के लिए, जंक के सामान्य सोर्स देखें.