Winscope का इस्तेमाल करके, विंडो के ट्रांज़िशन को ट्रैक करना

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

इन ट्रेस को इस्तेमाल किया जा सकता है

Winscope, अलग-अलग ट्रेस इकट्ठा करने और उन्हें विज़ुअली दिखाने की सुविधा देता है. इसका मतलब है कि यह सिस्टम सेवा की स्थितियों के क्रम को इकट्ठा करता है. इन ट्रेस को, इस्तेमाल के खास उदाहरणों के हिसाब से कॉन्फ़िगर किया जा सकता है. जैसे, कम ओवरहेड से लेकर ज़्यादा वर्बोसिटी तक. Winscope में इन ट्रेस का इस्तेमाल किया जा सकता है:

  • EventLog: EventLog का इस्तेमाल करके, सिस्टम के गड़बड़ी की जानकारी वाले इवेंट रिकॉर्ड को इकट्ठा करें. Winscope में, इस जानकारी का इस्तेमाल सिर्फ़ CUJ मार्किंग की पहचान करने और उन्हें दिखाने के लिए किया जाता है.
  • IME: इनपुट पद्धति संपादक (IME) पाइपलाइन से ट्रेस इवेंट. इनमें IMS, IMMS, और IME क्लाइंट शामिल हैं.
  • इनपुट: इनपुट इवेंट पाइपलाइन के अलग-अलग हिस्सों से इनपुट इवेंट को ट्रेस करें.
  • ProtoLog: यह सिस्टम सेवाओं और क्लाइंट प्रोसेस में चल रही सिस्टम सेवाओं के कोड से ProtoLog मैसेज इकट्ठा करता है.
  • स्क्रीन रिकॉर्डिंग: ट्रेस के साथ स्क्रीन रिकॉर्डिंग इकट्ठा करें.
  • शेल ट्रांज़िशन: रिकॉर्ड विंडो और गतिविधि ट्रांज़िशन सिस्टम की जानकारी.
  • SurfaceFlinger: SurfaceFlinger के ऐसे ट्रेस इकट्ठा करता है जिनमें लेयर (सरफ़ेस) के बारे में जानकारी होती है. जैसे, पोज़िशन, बफ़र, और कंपोज़िशन.
  • लेन-देन: कंपोज़िशन के लिए, SurfaceControl का इस्तेमाल करके SurfaceFlinger को मिले एटॉमिक बदलावों के सेट को ट्रैक करें.
  • ViewCapture: यह सुविधा, सिस्टम के उन सभी व्यू की प्रॉपर्टी कैप्चर करती है जो ViewCapture के साथ काम करते हैं. जैसे, सिस्टम यूज़र इंटरफ़ेस (यूआई) और लॉन्चर.
  • Window Manager: Trace Window Manager स्टेट में विंडो से जुड़ी जानकारी होती है. इसमें इनपुट और फ़ोकस इवेंट, स्क्रीन ओरिएंटेशन, ट्रांज़िशन, ऐनिमेशन, पोज़िशनिंग, और ट्रांसफ़ॉर्मेशन शामिल हैं.

इस्तेमाल किए जा सकने वाले डंप

Winscope, डिवाइस की स्थिति के डंप इकट्ठा करके दिखा सकता है. ये डंप, डिवाइस की स्थिति के स्नैपशॉट होते हैं. इन्हें आपके तय किए गए खास समय पर लिया जाता है. ट्रेस के उलट, डिवाइस के इस्तेमाल के दौरान डंप लगातार इकट्ठा नहीं किए जाते. साथ ही, इनसे परफ़ॉर्मेंस पर भी असर नहीं पड़ता. डंप सिर्फ़ उपयोगकर्ता के तय किए गए समय पर लिए जाते हैं. इससे यह पुष्टि की जाती है कि परफ़ॉर्मेंस और वर्बोसिटी से समझौता नहीं किया गया है. इससे, किसी खास समय पर डिवाइस की स्थिति का ज़्यादा सटीक और असरदार तरीके से विश्लेषण किया जा सकता है. Winscope में ये डंप इस्तेमाल किए जा सकते हैं:

  • विंडो मैनेजर: विंडो मैनेजर की एक स्थिति को डंप करता है.
  • SurfaceFlinger: किसी एक SurfaceFlinger स्नैपशॉट को डंप करें.
  • स्क्रीनशॉट: डंप के साथ-साथ स्क्रीनशॉट भी इकट्ठा करें.

संसाधन

Winscope को बनाने और चलाने के बारे में जानकारी के लिए, Winscope चलाएं लेख पढ़ें.

ट्रेस इकट्ठा करने के बारे में जानकारी पाने के लिए, ट्रेस कैप्चर करना लेख पढ़ें.

Winscope Web UI का इस्तेमाल करके ट्रेस लोड करने के बारे में जानने के लिए, ट्रेस लोड करना लेख पढ़ें.

ट्रेस का विश्लेषण करने के बारे में जानकारी पाने के लिए, ट्रेस का विश्लेषण करना लेख पढ़ें.

उदाहरण

यहां दिए गए उदाहरण में, फ़्लिकर टेस्ट के फ़ेल होने और उपयोगकर्ता की ओर से रिपोर्ट किए गए बग को डीबग करने का तरीका बताया गया है.

फ़्लिकर टेस्ट फ़ेल हो गया

इस उदाहरण में, फ़्लिकर टेस्ट के फ़ेल होने की समस्या को डीबग करने के लिए, Winscope का इस्तेमाल करने का तरीका दिखाया गया है.

टेस्ट फ़ेल होने की वजह की जांच करना

समस्या का टाइप पता करने और टेस्ट के फ़ेल होने का मैसेज देखने के लिए, यह तरीका अपनाएं.

  1. टेस्ट और क्लास के नाम की जांच करके, समस्या का टाइप पता करें.

    टेस्ट और क्लास का नाम:

    FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]
    

    समस्या प्रकार:

    • सीयूजे का मतलब, लॉकस्क्रीन पर दिखने वाली सूचना से किसी ऐप्लिकेशन को लॉन्च करना है (OpenAppFromLockscreenNotificationColdTest).
    • इस टेस्ट में, ऐप्लिकेशन को दिखने की स्थिति में (#appLayerBecomesVisible) होना चाहिए.
  2. जांच पूरी न होने की वजह बताने वाले मैसेज को देखें. इसमें जांच पूरी न होने के बारे में पूरी जानकारी दी गई होती है. जैसे:

    • अनुमानित नतीजे और असल में दिखने वाले नतीजे के बीच तुलना
    • टाइमस्टैंप, ताकि यह पता लगाया जा सके कि गड़बड़ी कब हुई
    • गड़बड़ी से जुड़ी आर्टफ़ैक्ट या फ़ाइल का नाम
    • गड़बड़ी को समझने और उसे ठीक करने के लिए, कॉन्टेक्स्ट के आधार पर अतिरिक्त जानकारी
    android.tools.flicker.subject.exceptions.IncorrectVisibilityException: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity# should be visible
    
    Where?
        Timestamp(UNIX=2024-05-10T11:04:14.227572545(1715339054227572545ns), UPTIME=37m21s184ms79178ns(2241184079178ns), ELAPSED=0ns)
    
    What?
        Expected: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#
        Actual: [e636ecd com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3457: Buffer is empty, Visible region calculated by Composition Engine is empty, com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458: Visible region calculated by Composition Engine is empty]
    
    Other information
        Artifact: FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.zip
    
    Check the test run artifacts for trace files
    
        at android.tools.flicker.subject.layers.LayerTraceEntrySubject.isVisible(LayerTraceEntrySubject.kt:187)
        at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:151)
        at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:150)
        at android.tools.flicker.assertions.NamedAssertion.invoke(NamedAssertion.kt:32)
        at android.tools.flicker.assertions.CompoundAssertion.invoke(CompoundAssertion.kt:42)
        at android.tools.flicker.assertions.AssertionsChecker.test(AssertionsChecker.kt:79)
        at android.tools.flicker.subject.FlickerTraceSubject.forAllEntries(FlickerTraceSubject.kt:59)
        at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:46)
        at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:43)
        at android.tools.flicker.assertions.AssertionDataImpl.checkAssertion(AssertionDataImpl.kt:33)
        at android.tools.flicker.assertions.ReaderAssertionRunner.doRunAssertion(ReaderAssertionRunner.kt:35)
        at android.tools.flicker.assertions.ReaderAssertionRunner.runAssertion(ReaderAssertionRunner.kt:29)
        at android.tools.flicker.assertions.BaseAssertionRunner.runAssertion(BaseAssertionRunner.kt:36)
        at android.tools.flicker.legacy.LegacyFlickerTest.doProcess(LegacyFlickerTest.kt:59)
        at android.tools.flicker.assertions.BaseFlickerTest.assertLayers(BaseFlickerTest.kt:89)
        at com.android.server.wm.flicker.notification.OpenAppTransition.appLayerBecomesVisible_coldStart(OpenAppTransition.kt:51)
        at com.android.server.wm.flicker.notification.OpenAppFromNotificationColdTest.appLayerBecomesVisible(OpenAppFromNotificationColdTest.kt:64)
    

    इस आउटपुट सैंपल से यह पता चलता है:

    • यह समस्या 2024-05-10T11:04:14.227572545 पर हुई.
    • NotificationActivity दिखना चाहिए, लेकिन यह नहीं दिख रहा है.
    • आर्टफ़ैक्ट फ़ाइल का नाम FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV है. इसमें डीबग करने के लिए ट्रेस शामिल हैं.

डीबग

फ़्लिकर होने की वजह का पता लगाने के लिए, यह तरीका अपनाएं:

  1. ट्रेस फ़ाइलें डाउनलोड करें और उन्हें Winscope में लोड करें. Winscope, SurfaceFlinger के साथ खुलता है. यह अपने-आप चुना जाता है:

    SurfaceFlinger व्यू के साथ Winscope का लैंडिंग पेज

    पहली इमेज. SurfaceFlinger व्यू के साथ Winscope का लैंडिंग पेज.

  2. उस टाइमस्टैंप पर जाएं जहां समस्या हुई है. इसके लिए, अपवाद वाले मैसेज से टाइमस्टैंप को कॉपी करके, टाइमस्टैंप फ़ील्ड में चिपकाएं. आपके पास टाइमस्टैंप को इंसानों के पढ़ने लायक फ़ॉर्मैट में कॉपी (2024-05-10T11:04:14.227572545) करके पहले फ़ील्ड में चिपकाने का विकल्प होता है. इसके अलावा, टाइमस्टैंप को नैनोसेकंड में कॉपी (1715339054227572545ns) करके दूसरे फ़ील्ड में चिपकाया जा सकता है.

    टाइमस्टैंप डायलॉग

    दूसरी इमेज. टाइमस्टैंप वाला डायलॉग.

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

    ऐप्लिकेशन और स्प्लैश स्क्रीन के नाम ये हैं:

    com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
    
    Splash Screen com.android.server.wm.flicker.testapp#3453
    

    इससे पता चलता है कि स्क्रीन काली होने के दौरान, ऐप्लिकेशन लॉन्च हो रहा था. साथ ही, यह इवेंट ऐप्लिकेशन लॉन्च होने के दौरान हो रहा है, क्योंकि स्प्लैश स्क्रीन अब भी दिख रही है:

    ऐप्लिकेशन लॉन्च करने पर

    तीसरी इमेज. ऐप्लिकेशन लॉन्च करने पर.

  4. अगले फ़्रेम पर वापस जाने के लिए, राइट ऐरो बटन दबाएं. इस फ़्रेम में फ़्लिकर की समस्या होती है. रेक्ट व्यू में, ऐप्लिकेशन के बजाय स्क्रीन पर NotificationShade दिखता है. इस फ़्रेम में ये सर्फ़ेस दिखते हैं:

    • स्क्रीन डेकोर ओवरले (ऊपर और नीचे)
    • नेविगेशन बार
    • पॉइंटर की जगह (स्क्रीन रिकॉर्डिंग से)

    फ़्लिकर गतिविधि

    चौथी इमेज. स्क्रीन के फ़्लिकर होने की गतिविधि.

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

    ऐप्लिकेशन के प्लैटफ़ॉर्म का नाम यह है:

    com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
    

    ऐप्लिकेशन प्रॉपर्टी

    पांचवीं इमेज. ऐप्लिकेशन प्रॉपर्टी.

    ऐप्लिकेशन की गतिविधि को दिखने और न दिखने के तौर पर सेट किया गया है. हालांकि, Invisible due to: null visible region गड़बड़ी की वजह से, यह गतिविधि नहीं दिख रही है. ऐसा इसलिए होता है, क्योंकि कंपोज़िशन के दौरान इसके सामने कोई दूसरा अपारदर्शी ऑब्जेक्ट रख दिया गया था. यह हाइपोथेसिस इस बात पर आधारित है कि 3D व्यू में NotificationShade रेक्ट, NotificationActivity रेक्ट के सामने है. साथ ही, दिखने वाला (हरा) NotificationShade, चुनी गई लेयर हो सकती है.

  6. इस हाइपोथेसिस की पुष्टि करने के लिए, मौजूदा फ़्रेम पर दिखने वाला NotificationShade चुनें और उसकी प्रॉपर्टी देखें. फ़्लैग को OPAQUE|ENABLE_BACKPRESSURE (0x102) पर सेट किया गया है. NotificationShade की सतह का नाम NotificationShade#3447 है. इसके बाद, बाईं ओर वाले ऐरो को दबाकर, पिछली फ़्रेम (फ़्लिकर से पहले) पर वापस जाएं. साथ ही, NotificationShade की प्रॉपर्टी फिर से देखें. ध्यान दें कि OPAQUE के बजाय, सर्फ़ेस में सिर्फ़ ENABLE_BACKPRESSURE (0x100) फ़्लैग है. इससे पुष्टि होती है कि ऐप्लिकेशन लॉन्च होने से पहले, NotificationShade ओपेक हो जाता है. NotificationShade, NotificationActivity से पहले है. इसलिए, ऐप्लिकेशन नहीं दिखाया जाता. NotificationShade काले रंग का है. इसलिए, स्क्रीन कुछ समय के लिए काली हो जाती है. इससे स्क्रीन फ़्लिकर होती है.

  7. कोड में यह पता लगाएं कि NotificationShade इतनी जल्दी अपारदर्शी क्यों हो जाता है.

उपयोगकर्ता की ओर से रिपोर्ट की गई गड़बड़ी

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

हमारी केस स्टडी में, सिर्फ़ यह जानकारी दी गई है: टाइटल स्प्लिट स्क्रीन से ऐप्लिकेशन को फिर से खोलने पर स्क्रीन फ़्लिकर हुई और अनुमानित टाइमस्टैंप 18 अप्रैल, 2024 शाम 3:51 GMT-04:00.

उपयोगकर्ता की ओर से बताई गई किसी गड़बड़ी को ठीक करने के लिए, यह तरीका अपनाएं:

  1. Winscope में ट्रेस फ़ाइल लोड करें. Winscope, SurfaceFlinger के साथ खुलता है. यह अपने-आप चुना जाता है.

    SurfaceFlinger व्यू के साथ Winscope का लैंडिंग पेज

    छठी इमेज. SurfaceFlinger व्यू के साथ Winscope का लैंडिंग पेज.

  2. उपयोगकर्ता की ओर से रिपोर्ट किए गए अनुमानित टाइमस्टैंप पर जाएं. इस मामले में, 3:50 PM GMT-04:00 पर जाने के लिए, 15:50:00 को समझने में आसान टाइमस्टैंप फ़ील्ड में डालें.

    टाइमस्टैंप डायलॉग

    सातवीं इमेज. टाइमस्टैंप वाला डायलॉग.

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

    पैकेज के नाम ये हैं:

    • लॉन्चर: com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#40602
    • संपर्क: com.google.android.contacts/com.android.contacts.activities.PeopleActivity#40565
    • डायल करने की सुविधा: com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564

    दिखने वाले प्लैटफ़ॉर्म (हरे रंग के आयत) के अलावा, एक धूसर रंग का आयत भी दिखता है. यह डिसप्ले एरिया प्लैटफ़ॉर्म को दिखाता है. इसका नाम Unknown display है. विज़िबिलिटी को बेहतर बनाने के लिए, ScreenDecorHwcOverlay#64 के बगल में मौजूद (विज़िबिलिटी आइकॉन) पर क्लिक करें. इससे, ScreenDecorHwcOverlay#64 से जुड़ा रेक्ट छिप जाएगा और उसके पीछे मौजूद सतहें दिखेंगी. हम विश्लेषण के लिए ओवरले हटा देते हैं, क्योंकि यह उपयोगकर्ता को नहीं दिखता और इसे फ़्लिकर करने वाले ऐनिमेशन के तौर पर रिपोर्ट नहीं किया जाएगा.

    उपयोगकर्ता की रिपोर्ट

    आठवीं इमेज. उपयोगकर्ता की रिपोर्ट.

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

    ट्रांज़िशन

    नौवीं इमेज. ट्रांज़िशन.

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

  5. उस समय पर जाने के लिए, डिस्पैच का समय कॉलम (इस मामले में 2024-04-18, 15:50:57.205) में मौजूद लिंक पर क्लिक करें. इसके बाद, Surface Flinger टैब में रेक्ट की पुष्टि करें. ट्रांज़िशन के दौरान डिवाइस की स्थिति सही है या नहीं, इसकी पुष्टि करें. इसके लिए, सही ऐरो कुंजी का इस्तेमाल करके ट्रांज़िशन करें और रेक्ट को देखें.

    लॉन्चर 15:50:57.278 पर दिखता है, लेकिन ऐनिमेशन तब शुरू नहीं होता. वॉलपेपर पहले से ही दिख रहा है, क्योंकि स्प्लिट-स्क्रीन वाले ऐप्लिकेशन (डिवाइडर) के बीच कुछ भी नहीं बनाया गया है. एक फ़्रेम पहले (15:50:57.212), वॉलपेपर नहीं दिख रहा है. साथ ही, डिवाइडर दिख रहा है. स्प्लिट-स्क्रीन में ऐनिमेशन न होने पर ऐसा ही दिखता है.

    फ़्लिकर होने से पहले की स्क्रीन

    दसवीं इमेज. फ़्लिकर इवेंट से पहले की स्क्रीन.

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

    पहले ट्रांज़िशन के खत्म होने का समय

    ग्यारहवीं इमेज. पहले ट्रांज़िशन के खत्म होने का समय.

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

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

    दूसरे ट्रांज़िशन के आखिर में

    बारहवीं इमेज. दूसरे ट्रांज़िशन का अंत.

    इस ट्रांज़िशन के दौरान, 15:51:13.239 पर देखें कि दोनों ऐप्लिकेशन, संपर्क, और डायलर के लिए Splash Screen लेयर, डिसप्ले के एक ही तरफ़ हैं:

    स्प्लैश स्क्रीन

    तेरहवीं इमेज. स्प्लैश स्क्रीन.

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

    बुकमार्क जोड़ें

    चौदहवीं इमेज. बुकमार्क जोड़ें.

  9. टाइमलाइन पर सीधे क्लिक करके, ट्रांज़िशन के आखिर में मौजूद किसी फ़्रेम पर जाएं. उदाहरण के लिए, 15:51:13.859 पर क्लिक करें. यहां दोनों ऐप्लिकेशन अब अपनी आखिरी जगह पर हैं. डायलर बाईं ओर और संपर्क दाईं ओर है:

    फ़ाइनल स्प्लिट स्क्रीन

    15वीं इमेज. स्प्लिट स्क्रीन का फ़ाइनल लेआउट.

  10. टाइमलाइन में मौजूद बुकमार्क के फ़्लैग पर क्लिक करके, उस फ़्रेम पर वापस जाएं जिसमें फ़्लिकर हो रहा है.

    बुकमार्क की टाइमलाइन

    16वीं इमेज. टाइमलाइन को बुकमार्क करें.

    दोनों ऐप्लिकेशन दाईं ओर हैं. इससे पता चलता है कि डायलर गलत जगह पर है.

  11. डायलर की स्प्लैश स्क्रीन की प्रॉपर्टी देखने के लिए, उस पर क्लिक करें. खास तौर पर, चुनी गई प्रॉपर्टी व्यू में, उसकी ट्रांसफ़ॉर्म प्रॉपर्टी देखें.

    इमेज में बदलाव करने से जुड़ी प्रॉपर्टी

    17वीं इमेज. बदलाव करने से जुड़ी प्रॉपर्टी.

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

  12. पूरा हैरारकी ट्री दिखाने के लिए, हैरारकी व्यू में फ़्लैट से चुने हुए का निशान हटाएं. इसके बाद, ऐप्लिकेशन की सतह के पैरंट नोड पर तब तक जाएं, जब तक कैलकुलेट किया गया और अनुरोध किया गया ट्रांसफ़ॉर्म एक जैसे न हो जाएं. इससे पता चलेगा कि Surface(name=Task=7934)/@0x1941191_transition-leash#40670 प्लैटफ़ॉर्म पर अनुरोध किया गया ट्रांसफ़ॉर्म दिख रहा है.

  13. पुष्टि करें कि ट्रांसफ़ॉर्म को पहली बार कब और किस वैल्यू पर सेट किया गया था. टाइटल के बगल में मौजूद आइकॉन पर क्लिक करके, चुनी गई प्रॉपर्टी को छोटा करें:

    चुनी गई प्रॉपर्टी को छोटा करें

    18वीं इमेज. चुनी गई प्रॉपर्टी को छोटा करें.

  14. इस फ़्रेम में बदली जा रही प्रॉपर्टी को हाइलाइट करने के लिए, Proto Dump व्यू में Show diff को चुनें. प्रॉपर्टी फ़िल्टर करने के लिए, टेक्स्ट सर्च फ़ील्ड में transform टाइप करें:

    अंतर दिखाओ

    19वीं इमेज. अंतर दिखाएं.

    इस फ़्रेम में, transition-leash के लिए ट्रांसफ़ॉर्म को IDENTITY से SCALE|TRANSLATE|ROT_270 पर सेट किया गया है.

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

    फ़्लिकर की पहचान करना

    20वीं इमेज. फ़्लिकर की पहचान करना.

  15. कोड में यह पता लगाएं कि इस ट्रांसफ़ॉर्म को स्प्लिट स्क्रीन ट्रांज़िशन लीश पर क्यों सेट किया गया है.