Winscope ব্যবহার করে উইন্ডো ট্রানজিশন ট্রেস করুন

উইনস্কোপ একটি ওয়েব টুল যা আপনাকে অ্যানিমেশন এবং ট্রানজিশন চলাকালীন ও পরে বিভিন্ন সিস্টেম সার্ভিসের অবস্থা রেকর্ড, রিপ্লে এবং বিশ্লেষণ করতে দেয়। উইনস্কোপ সমস্ত প্রাসঙ্গিক সিস্টেম সার্ভিসের অবস্থা একটি ট্রেস ফাইলে রেকর্ড করে। ট্রেস ফাইলটির সাথে উইনস্কোপ UI ব্যবহার করে, আপনি স্ক্রিন রেকর্ডিং সহ বা ছাড়াই, ট্রানজিশনগুলো রিপ্লে, স্টেপ-থ্রু এবং ডিবাগ করার মাধ্যমে প্রতিটি অ্যানিমেশন ফ্রেমের জন্য এই সার্ভিসগুলোর অবস্থা পরীক্ষা করতে পারেন।

সমর্থিত ট্রেস

উইনস্কোপ বিভিন্ন ট্রেস , অর্থাৎ সিস্টেম সার্ভিস স্টেটের ক্রম, সংগ্রহ এবং দৃশ্যমানভাবে উপস্থাপন করার ক্ষমতা প্রদান করে। আপনি এই ট্রেসগুলিকে নির্দিষ্ট ব্যবহারের ক্ষেত্র অনুসারে কনফিগার করতে পারেন, যা কম ওভারহেড থেকে শুরু করে উচ্চ ভার্বোসিটি পর্যন্ত হতে পারে। উইনস্কোপ নিম্নলিখিত ট্রেসগুলি সমর্থন করে:

  • ইভেন্টলগ: EventLog ব্যবহার করে সিস্টেমের ডায়াগনস্টিক ইভেন্টের রেকর্ড সংগ্রহ করুন। উইনস্কোপে এই তথ্য শুধুমাত্র CUJ মার্কিং শনাক্ত ও প্রদর্শন করতে ব্যবহৃত হয়।
  • আইএমই: ইনপুট মেথড এডিটর (আইএমই) পাইপলাইন থেকে ইভেন্টগুলো ট্রেস করুন, যার মধ্যে আইএমএস, আইএমএমএস এবং আইএমই ক্লায়েন্ট অন্তর্ভুক্ত।
  • ইনপুট: ইনপুট ইভেন্ট পাইপলাইনের বিভিন্ন অংশ থেকে ইনপুট ইভেন্টগুলো ট্রেস করুন।
  • প্রোটোলগ: সিস্টেম সার্ভিস এবং ক্লায়েন্ট প্রসেসে চলমান সিস্টেম সার্ভিসের কোড থেকে প্রোটোলগ বার্তা সংগ্রহ করে।
  • স্ক্রিন রেকর্ডিং: প্রাপ্ত চিহ্নগুলোর পাশাপাশি একটি স্ক্রিন রেকর্ডিং সংগ্রহ করুন।
  • শেল ট্রানজিশন: রেকর্ড উইন্ডো এবং অ্যাক্টিভিটি ট্রানজিশন সিস্টেমের বিবরণ।
  • সারফেসফ্লিঙ্গার: পৃষ্ঠতল (স্তর) সম্পর্কিত অবস্থান, বাফার এবং গঠনের মতো তথ্য সম্বলিত সারফেসফ্লিঙ্গার ট্রেস সংগ্রহ করে।
  • লেনদেন: গঠনের জন্য SurfaceControl ব্যবহার করে SurfaceFlinger দ্বারা প্রাপ্ত পারমাণবিক পরিবর্তনসমূহের সেটটি চিহ্নিত করুন।
  • ভিউক্যাপচার: সিস্টেম উইন্ডোগুলোর সেইসব ভিউয়ের (যেমন সিস্টেম ইউআই এবং লঞ্চার) বিভিন্ন প্রোপার্টি ক্যাপচার করুন, যেগুলো ভিউক্যাপচার সমর্থন করে।
  • উইন্ডো ম্যানেজার: উইন্ডো ম্যানেজারের অবস্থাগুলো ট্রেস করুন, যাতে উইন্ডো সম্পর্কিত বিশদ বিবরণ থাকে, যেমন ইনপুট এবং ফোকাস ইভেন্ট, স্ক্রিন ওরিয়েন্টেশন, ট্রানজিশন, অ্যানিমেশন, পজিশনিং এবং ট্রান্সফরমেশন।

সমর্থিত ডাম্প

উইনস্কোপ স্টেট ডাম্প সংগ্রহ ও প্রদর্শন করতে পারে, যা হলো আপনার দ্বারা সংজ্ঞায়িত নির্দিষ্ট মুহূর্তে নেওয়া ডিভাইসের অবস্থার স্ন্যাপশট। ট্রেসের বিপরীতে, যা ডিভাইস ব্যবহারের সময় ক্রমাগত সংগ্রহ করা হয় এবং পারফরম্যান্সকে প্রভাবিত করতে পারে, ডাম্প শুধুমাত্র এই ব্যবহারকারী-সংজ্ঞায়িত মুহূর্তগুলিতেই নেওয়া হয়, যাতে পারফরম্যান্স এবং ভার্বোসিটি ক্ষতিগ্রস্ত না হয় তা যাচাই করা যায়। এটি নির্দিষ্ট সময়ে ডিভাইসের অবস্থার আরও সুনির্দিষ্ট এবং কার্যকর বিশ্লেষণের সুযোগ করে দেয়। উইনস্কোপ নিম্নলিখিত ডাম্পগুলি সমর্থন করে:

  • উইন্ডো ম্যানেজার: উইন্ডো ম্যানেজারের একটিমাত্র অবস্থা ডাম্প করুন।
  • সারফেসফ্লিঙ্গার: একটি একক সারফেসফ্লিঙ্গার স্ন্যাপশট ডাম্প করুন।
  • স্ক্রিনশট: ডাম্পগুলোর পাশাপাশি একটি স্ক্রিনশট সংগ্রহ করুন।

সম্পদ

Winscope তৈরি ও চালানোর বিষয়ে তথ্যের জন্য Run Winscope দেখুন।

ট্রেস সংগ্রহ করার বিষয়ে তথ্যের জন্য ‘ক্যাপচার ট্রেস’ দেখুন।

Winscope ওয়েব UI ব্যবহার করে কীভাবে ট্রেস লোড করতে হয়, সে সম্পর্কে তথ্যের জন্য লোড ট্রেস দেখুন।

ট্রেস বিশ্লেষণ সম্পর্কে তথ্যের জন্য ‘ট্রেস বিশ্লেষণ’ দেখুন।

উদাহরণ

নিম্নলিখিত উদাহরণে একটি ফ্লিকার টেস্টের ব্যর্থতা এবং ব্যবহারকারীর রিপোর্ট করা একটি বাগ ডিবাগ করার পদ্ধতি বর্ণনা করা হয়েছে।

ফ্লিকার পরীক্ষার ব্যর্থতা

এই উদাহরণটি দেখায় কিভাবে উইনস্কোপ ব্যবহার করে একটি ফ্লিকার টেস্টের ব্যর্থতা ডিবাগ করা যায়।

পরীক্ষার ব্যর্থতা পরীক্ষা করুন

সমস্যার ধরণ নির্ধারণ করতে এবং পরীক্ষার ব্যর্থতার বার্তাটি পরীক্ষা করতে এই ধাপগুলো অনুসরণ করুন।

  1. টেস্ট এবং ক্লাসের নাম পরীক্ষা করে সমস্যার ধরণ নির্ধারণ করুন।

    পরীক্ষা এবং ক্লাসের নাম:

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

    সমস্যার ধরণ:

    • CUJ বলতে লকস্ক্রিন নোটিফিকেশন থেকে একটি অ্যাপ চালু করাকে বোঝায় ( 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 landing page with SurfaceFlinger view

    চিত্র ১. সারফেসফ্লিঙ্গার ভিউ সহ উইনস্কোপ ল্যান্ডিং পেজ।

  2. এক্সেপশন মেসেজ থেকে টাইমস্ট্যাম্পটি কপি করে টাইমস্ট্যাম্প ফিল্ডে পেস্ট করে সমস্যাটি যে টাইমস্ট্যাম্পে ঘটেছে সেখানে যান। আপনি টাইমস্ট্যাম্পটি পাঠযোগ্য ফরম্যাটে ( 2024-05-10T11:04:14.227572545 ) কপি করে প্রথম ফিল্ডে পেস্ট করতে পারেন, অথবা টাইমস্ট্যাম্পটি ন্যানোসেকেন্ডে ( 1715339054227572545ns ) কপি করে দ্বিতীয় ফিল্ডে পেস্ট করতে পারেন।

    Timestamp dialog

    চিত্র ২. টাইমস্ট্যাম্প ডায়ালগ।

  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
    

    এর থেকে বোঝা যায় যে, যখন স্ক্রিনটি কালো হয়ে যায়, তখন অ্যাপটি চালু হচ্ছিল এবং এই ঘটনাটি অ্যাপ চালু হওয়ার সময়েই ঘটছে, কারণ স্প্ল্যাশ স্ক্রিনটি তখনও দেখা যাচ্ছে:

    At app launch

    চিত্র ৩. অ্যাপ চালু করার সময়।

  4. পরবর্তী ফ্রেমে ফিরে যেতে ডান অ্যারো কী চাপুন, যেখানে ফ্লিকারটি ঘটে। রেক্টস ভিউতে অ্যাপের পরিবর্তে স্ক্রিনে NotificationShade দেখানো হয়। এই ফ্রেমে নিম্নলিখিত সারফেসগুলো দেখানো হয়েছে:

    • স্ক্রিন ডেকোর ওভারলে (উপরে এবং নীচে)
    • নেভিগেশন বার
    • পয়েন্টারের অবস্থান (স্ক্রিন রেকর্ডিং থেকে)

    Flicker activity

    চিত্র ৪. ঝিকিমিকি কার্যকলাপ।

  5. হায়ারার্কি ভিউতে অ্যাপ অ্যাক্টিভিটিটি নির্বাচন করুন। যদি এটি খুঁজে না পান, তাহলে 'Show only V' অপশনটি আনটগল করুন। এরপর, প্রোপার্টিজ ভিউটি ইন্সপেক্ট করুন।

    অ্যাপটির পৃষ্ঠের নাম হলো:

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

    App properties

    চিত্র ৫. অ্যাপের বৈশিষ্ট্যসমূহ।

    যদিও অ্যাপ অ্যাক্টিভিটিটি ভিজিবল এবং ওপেক হিসেবে সেট করা আছে, Invisible due to: null visible region ত্রুটির কারণে সারফেসটি দেখানো হচ্ছে না। এটি ঘটে কারণ কম্পোজিশনের সময় এর সামনে আরেকটি ওপেক সারফেস রাখা হয়েছিল। এই অনুমানের কারণ হলো, থ্রিডি ভিউতে NotificationShade রেক্টটি NotificationActivity রেক্টের সামনে রয়েছে এবং দৃশ্যমান (সবুজ) NotificationShade সম্ভবত নির্বাচিত লেয়ার।

  6. এই অনুমানটি যাচাই করার জন্য, বর্তমান ফ্রেমে দৃশ্যমান NotificationShade সারফেসটি নির্বাচন করুন এবং এর প্রোপার্টিগুলো পরীক্ষা করুন। ফ্ল্যাগগুলো OPAQUE|ENABLE_BACKPRESSURE (0x102) হিসেবে সেট করা আছে। NotificationShade সারফেসটির নাম হলো NotificationShade#3447 । এরপর, আগের ফ্রেমে (ফ্লিকারের আগে) ফিরে যেতে বাম অ্যারো চাপুন এবং আবার NotificationShade সারফেসটির প্রোপার্টিগুলো পরীক্ষা করুন। লক্ষ্য করুন যে OPAQUE হওয়ার পরিবর্তে, সারফেসটিতে শুধুমাত্র ENABLE_BACKPRESSURE (0x100) ফ্ল্যাগটি রয়েছে। এটি নিশ্চিত করে যে অ্যাপ চালু হওয়া পুরোপুরি শেষ হওয়ার আগেই NotificationShade অস্বচ্ছ হয়ে যায়। যেহেতু NotificationShade টি NotificationActivity এর সামনে থাকে, তাই অ্যাপটি দেখানো হয় না। NotificationShade টি কালো, তাই স্ক্রিনটি ক্ষণিকের জন্য কালো হয়ে যায়, যা ফ্লিকারের কারণ।

  7. কোডে চিহ্নিত করুন কেন NotificationShade খুব তাড়াতাড়ি অস্বচ্ছ হয়ে যায়।

ব্যবহারকারীর রিপোর্ট করা বাগ

ব্যবহারকারীদের জানানো বাগ ডিবাগ করা কঠিন হতে পারে, কারণ সেগুলিতে প্রায়শই বিস্তারিত তথ্যের অভাব থাকে। ফ্লিকার টেস্ট ফেইলরগুলোর মতো নয়, যেগুলোতে নির্দিষ্ট টাইমস্ট্যাম্প, এলিমেন্টের বিবরণ এবং স্ক্রিন রেকর্ডিং থাকে, ব্যবহারকারীদের জানানো বাগগুলোতে সাধারণত সমস্যাটির একটি সংক্ষিপ্ত বিবরণই কেবল অন্তর্ভুক্ত থাকে।

আমাদের কেস স্টাডিতে প্রদত্ত একমাত্র তথ্য হলো ‘স্প্লিট স্ক্রিন থেকে অ্যাপ পুনরায় খোলার সময় স্ক্রিন ঝিকমিক করেছে’ শিরোনাম এবং একটি আনুমানিক টাইমস্ট্যাম্প, যা হলো ১৮ এপ্রিল, ২০২৪ বিকাল ৩:৫১ জিএমটি-০৪:০০

ব্যবহারকারীর জানানো কোনো বাগ ডিবাগ করতে এই ধাপগুলো অনুসরণ করুন:

  1. উইনস্কোপে ট্রেস ফাইলটি লোড করুন। উইনস্কোপ খুললে সারফেসফ্লিঙ্গার স্বয়ংক্রিয়ভাবে নির্বাচিত থাকে।

    Winscope landing page with SurfaceFlinger view

    চিত্র ৬. সারফেসফ্লিঙ্গার ভিউ সহ উইনস্কোপ ল্যান্ডিং পেজ।

  2. ব্যবহারকারীর দেওয়া আনুমানিক টাইমস্ট্যাম্পে (এই ক্ষেত্রে 3:50 PM GMT-04:00 যেতে, পাঠযোগ্য টাইমস্ট্যাম্প ফিল্ডে 15:50:00 লিখুন।

    Timestamp dialog

    চিত্র ৭. টাইমস্ট্যাম্প ডায়ালগ।

  3. স্ক্রিনে কী আঁকা হয়েছে তা শনাক্ত করতে রেক্টস ভিউ ব্যবহার করুন। আরও ভালোভাবে দেখার জন্য, রেক্টস-এর দৃষ্টিকোণ পরিবর্তন করতে রোটেশন স্লাইডার ব্যবহার করুন। হায়ারার্কি ভিউতে ‘শো অনলি ভি’ এবং ‘ফ্ল্যাট’ চিহ্নিত করলে ওয়ালপেপার, স্ক্রিন ডেকোর ওভারলে, লেটারবক্স, লঞ্চার, কন্টাক্টস এবং ডায়ালার সারফেসগুলো দেখা যায়।

    প্যাকেজের নামগুলো হলো:

    • লঞ্চার: 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

    দৃশ্যমান পৃষ্ঠতলগুলো (সবুজ আয়তক্ষেত্র) ছাড়াও, 'অজানা ডিসপ্লে' নামের একটি ধূসর আয়তক্ষেত্র প্রদর্শিত হয়, যা ডিসপ্লে এলাকার পৃষ্ঠতলকে প্রতিনিধিত্ব করে। দৃশ্যমানতা উন্নত করতে, ক্লিক করুন ( visibility icon ScreenDecorHwcOverlay#64 সারফেসের পাশে থাকা ওভারলেটি এর সংশ্লিষ্ট রেক্টকে আড়াল করে এবং পেছনের সারফেসগুলোকে প্রকাশ করে। বিশ্লেষণের জন্য আমরা ওভারলেটি সরিয়ে ফেলি, কারণ এটি ব্যবহারকারীর কাছে দৃশ্যমান নয় এবং এটিকে একটি ফ্লিকারিং অ্যানিমেশন হিসেবেও রিপোর্ট করা হবে না।

    User report

    চিত্র ৮. ব্যবহারকারীর প্রতিবেদন।

  4. স্প্লিট স্ক্রিন ভিউতে কোন সারফেসগুলো জড়িত তা শনাক্ত করার পর, ট্রানজিশন ট্রেস ব্যবহার করে ব্যবহারকারীর বিভিন্ন কার্যকলাপ ধাপে ধাপে অনুসরণ করুন এবং ফ্লিকারটি খুঁজে বের করুন। প্লে হওয়া ট্রানজিশনগুলোর তালিকা দেখতে উইনস্কোপ-এর ট্রানজিশন ট্যাবে ক্লিক করুন:

    transitions

    চিত্র ৯. রূপান্তর।

    এই ফ্রেমে প্রদর্শিত ট্রানজিশনটি নীল রঙে হাইলাইট করা হয়েছে। এক্ষেত্রে, ট্রানজিশন ফ্ল্যাগগুলোর মধ্যে রয়েছে TRANSIT_FLAG_IS_RECENTS , যা নির্দেশ করে যে ব্যবহারকারী রিসেন্টস স্ক্রিনে প্রবেশ করছেন।

  5. ডিসপ্যাচ টাইম কলামের লিঙ্কে (এই ক্ষেত্রে 2024-04-18, 15:50:57.205 ) ক্লিক করে সেই নির্দিষ্ট সময়ে যান এবং সারফেস ফ্লিংগার ট্যাবে থাকা রেক্টগুলো যাচাই করুন। ডান অ্যারো কী ব্যবহার করে ট্রানজিশনটি ধাপে ধাপে অনুসরণ করে এবং রেক্টগুলো পর্যবেক্ষণ করে ট্রানজিশন চলাকালীন ডিভাইসটির অবস্থার সঠিকতা নিশ্চিত করুন।

    লঞ্চারটি ১৫:৫০:৫৭.২৭৮ সময়ে দেখা যায়, কিন্তু অ্যানিমেশনটি তখন শুরু হয় না। ওয়ালপেপারটি আগে থেকেই দেখা যাচ্ছে, কারণ স্প্লিট-স্ক্রিন অ্যাপগুলোর মাঝে (ডিভাইডার) কিছুই আঁকা হয়নি। এক ফ্রেম আগে (১৫:৫০:৫৭.২১২), ওয়ালপেপারটি দেখা যায় না এবং ডিভাইডারটি দেখানো হয়, যা অ্যানিমেশন না চলার সময় স্প্লিট-স্ক্রিনের আসল রূপ।

    Screen before flicker

    চিত্র ১০। ফ্লিকার ঘটনার পূর্বের স্ক্রিন।

  6. পরবর্তী ট্রানজিশনটি দেখতে সরাসরি টাইমলাইনে ক্লিক করুন। সারফেসফ্লিঙ্গার স্টেটগুলো হালকা নীল ব্লকের একটি সারি দ্বারা চিহ্নিত করা হয়। ট্রানজিশনগুলো গোলাপী ব্লকের একটি সারি দ্বারা চিহ্নিত করা হয়।

    End of first transition

    চিত্র ১১। প্রথম রূপান্তরের সমাপ্তি।

    পরবর্তী ট্রানজিশনের শুরুর অবস্থানে সারফেসফ্লিঙ্গার সারিটিতে ক্লিক করুন। চিত্র ১১-তে, কার্সরের উল্লম্ব অবস্থানটি একটি পাতলা নীল রেখা দ্বারা নির্দেশিত। সারফেসফ্লিঙ্গার সারিটির হালকা নীল পটভূমি এর অনুভূমিক অবস্থান দেখায়। কোনো ফ্লিকার ঘটে কিনা তা দেখতে ডান অ্যারো কী ব্যবহার করে ট্রানজিশনটি ধাপে ধাপে সম্পন্ন করুন। এই ট্রানজিশনের জন্য ডিভাইসটি সঠিক দেখাচ্ছে কিনা তা নিশ্চিত করুন।

  7. পরবর্তী ট্রানজিশনটি এড়িয়ে যান, কারণ এর সময়কাল খুব কম, তাই এতে ফ্লিকার থাকার সম্ভাবনা কম। এর পরিবর্তে, নিচের ছবিতে কার্সার দ্বারা নির্দেশিত সারফেসফ্লিঙ্গার (SurfaceFlinger) সারিতে থাকা পরবর্তী দীর্ঘতর ট্রানজিশনের শুরুর অবস্থানে টাইমলাইনে ক্লিক করুন।

    end of second transition

    চিত্র ১২। দ্বিতীয় রূপান্তরের সমাপ্তি।

    এই পরিবর্তনের সময়, 15:51:13.239 এ, লক্ষ্য করুন যে কন্টাক্টস এবং ডায়ালার, উভয় অ্যাপের Splash Screen লেয়ারগুলো ডিসপ্লের একই দিকে রয়েছে:

    splash screens

    চিত্র ১৩. স্প্ল্যাশ স্ক্রিন।

  8. কোন অ্যাপটি ভুল দিকে আছে তা স্পষ্ট করুন। পরবর্তীতে এই ফ্রেমে ফিরে আসতে সাহায্য করার জন্য, ns ইনপুট ফিল্ডের পাশের পতাকা আইকনে ক্লিক করে আপনার বর্তমান অবস্থানে একটি বুকমার্ক যোগ করুন।

    add bookmark

    চিত্র ১৪। বুকমার্ক যোগ করুন।

  9. সরাসরি টাইমলাইনে ক্লিক করে ট্রানজিশনের শেষের একটি ফ্রেমে যান, যেমন, 15:51:13.859 এ। এখানে অ্যাপ দুটি এখন তাদের চূড়ান্ত অবস্থানে রয়েছে, বাম দিকে ডায়ালার এবং ডান দিকে কন্টাক্টস:

    final split screen

    চিত্র ১৫। চূড়ান্ত স্প্লিট স্ক্রিন।

  10. ফ্লিকারযুক্ত ফ্রেমটিতে ফিরে যেতে টাইমলাইনে থাকা বুকমার্কের পতাকাটিতে ক্লিক করুন।

    bookmark timeline

    চিত্র ১৬। বুকমার্ক টাইমলাইন।

    দুটি অ্যাপই ডানদিকে রয়েছে, যা থেকে বোঝা যায় যে ডায়ালারটি ভুল অবস্থানে আছে।

  11. ডায়লারের প্রোপার্টিগুলো দেখতে এর স্প্ল্যাশ স্ক্রিনে ক্লিক করুন। বিশেষভাবে নির্বাচিত প্রোপার্টি ভিউতে এর ট্রান্সফর্ম প্রোপার্টিগুলো দেখুন।

    Transform properties

    চিত্র ১৭। রূপান্তর বৈশিষ্ট্যসমূহ।

    গণনাকৃত ট্রান্সফর্মটি এই সারফেসে প্রয়োগ করা হয়েছে, কিন্তু এই লেভেলে সেট করা হয়নি। 'গণনাকৃত' এবং 'অনুরোধকৃত' কলামগুলোর মান ভিন্ন, যা নির্দেশ করে যে ট্রান্সফর্মটি একটি প্যারেন্ট সারফেস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত হচ্ছে।

  12. সম্পূর্ণ হায়ারার্কি ট্রি দেখানোর জন্য হায়ারার্কি ভিউতে 'ফ্ল্যাট' অনির্বাচিত করুন, এবং অ্যাপ সারফেসের প্যারেন্ট নোডগুলিতে নেভিগেট করুন যতক্ষণ না 'ক্যালকুলেটেড ' এবং 'রিকোয়েস্টেড' উভয় ট্রান্সফর্ম একই হয়, যা Surface(name=Task=7934)/@0x1941191_transition-leash#40670 সারফেসে অনুরোধ করা ট্রান্সফর্মটি দেখাচ্ছে।

  13. ট্রান্সফর্মটি প্রথম কখন এবং কোন মানে সেট করা হয়েছিল তা নিশ্চিত করুন। শিরোনামের পাশের আইকনে ক্লিক করে সংকলিত প্রোপার্টিগুলো সংকুচিত করুন:

    collapse the curated properties

    চিত্র ১৮। সংকলিত বৈশিষ্ট্যগুলো সংকুচিত করুন।

  14. এই ফ্রেমে যে প্রোপার্টিগুলো পরিবর্তন করা হচ্ছে, সেগুলোকে হাইলাইট করতে প্রোটো ডাম্প ভিউতে ‘Show diff’ নির্বাচন করুন। প্রোপার্টিগুলো ফিল্টার করতে টেক্সট সার্চ ফিল্ডে transform টাইপ করুন:

    show diff

    চিত্র ১৯। পার্থক্য দেখাও।

    এই ফ্রেমে transition-leash জন্য ট্রান্সফর্মটি IDENTITY থেকে SCALE|TRANSLATE|ROT_270 তে সেট করা হয়েছে।

    এই তথ্য থেকে দেখা যায় যে, ডায়ালার স্প্লিট স্ক্রিন অ্যাপের অ্যানিমেশন লিশে ট্রান্সফর্ম প্রয়োগ করার সময় ফ্লিকারটি ঘটেছিল।

    Identification of the flicker

    চিত্র ২০। কম্পনটির শনাক্তকরণ।

  15. কোডে শনাক্ত করুন কেন এই ট্রান্সফর্মটি স্প্লিট স্ক্রিন ট্রানজিশন লিশে সেট করা হয়েছে।