ردیابی انتقال پنجره با استفاده از Winscope

Winscope یک ابزار وب است که به کاربران اجازه می دهد تا وضعیت چندین سرویس سیستم را در طول و بعد از انیمیشن ها و انتقال ها ضبط، پخش و تجزیه و تحلیل کنند. Winscope تمام وضعیت های مربوط به سرویس سیستم را در یک فایل ردیابی ثبت می کند. با استفاده از رابط کاربری Winscope با فایل ردیابی، می‌توانید وضعیت این سرویس‌ها را برای هر فریم انیمیشن، با یا بدون ضبط صفحه، با پخش مجدد، گام برداشتن و اشکال‌زدایی انتقال‌ها بررسی کنید.

ردیابی های پشتیبانی شده

Winscope توانایی جمع آوری و نمایش بصری ردپاها یا توالی های مختلف وضعیت های سرویس سیستم را فراهم می کند. می‌توانید این ردیابی‌ها را متناسب با موارد استفاده خاص، از سربار کم تا پرحرفی بالا، پیکربندی کنید. ردیابی های زیر توسط Winscope پشتیبانی می شوند:

  • EventLog: رکورد رویداد تشخیصی سیستم را با استفاده از EventLog جمع آوری کنید. در Winscope از این اطلاعات فقط برای شناسایی و نمایش علائم CUJ استفاده می شود.
  • IME: رویدادها را از خط لوله ویرایشگر روش ورودی (IME) ردیابی کنید، از جمله IMS، IMMS، و IME Client.
  • ورودی: ردیابی رویدادهای ورودی از بخش‌های مختلف خط لوله رویداد ورودی.
  • ProtoLog: جمع آوری پیام های ProtoLog از سرویس های سیستم و کد سرویس های سیستم در حال اجرا در فرآیندهای مشتری.
  • ضبط صفحه: یک صفحه ضبط شده را در کنار ردیابی ها جمع آوری کنید.
  • انتقال پوسته: جزئیات سیستم انتقال پنجره و فعالیت را ضبط کنید.
  • SurfaceFlinger: آثار SurfaceFlinger حاوی اطلاعاتی در مورد سطوح (لایه ها) مانند موقعیت، بافر و ترکیب را جمع آوری کنید.
  • تراکنش ها: مجموعه تغییرات اتمی دریافت شده توسط SurfaceFlinger را با استفاده از SurfaceControl برای ترکیب ردیابی کنید.
  • ViewCapture: طیف وسیعی از ویژگی‌های همه نماها را از ویندوز سیستم که از ViewCapture پشتیبانی می‌کنند، مانند System UI و Launcher، ضبط کنید.
  • Window Manager: ردیابی وضعیت های Window Manager حاوی جزئیات مربوط به ویندوز، از جمله رویدادهای ورودی و تمرکز، جهت گیری صفحه، انتقال، انیمیشن ها، موقعیت یابی، و تبدیل.

زباله های پشتیبانی شده

Winscope می‌تواند حالت‌های dump را جمع‌آوری و نمایش دهد، که عکس‌های فوری از وضعیت دستگاه هستند که در لحظات خاصی که توسط کاربر تعریف می‌شود گرفته شده‌اند. برخلاف ردیابی‌هایی که به‌طور مداوم در طول استفاده از دستگاه جمع‌آوری می‌شوند و می‌توانند بر عملکرد تأثیر بگذارند، تخلیه‌ها فقط در این لحظات تعریف‌شده توسط کاربر گرفته می‌شوند و تضمین می‌کنند که عملکرد و پرحرفی به خطر نیفتد. این امکان را برای تجزیه و تحلیل متمرکزتر و کارآمدتر از وضعیت دستگاه در مقاطع زمانی خاص فراهم می کند. Dump های زیر توسط Winscope پشتیبانی می شوند:

  • Window Manager: یک حالت مدیریت پنجره را تخلیه کنید.
  • SurfaceFlinger: یک عکس فوری از SurfaceFlinger ارسال کنید.
  • اسکرین شات: یک اسکرین شات در کنار dump ها جمع آوری کنید.

منابع

برای اطلاعات در مورد ساخت و اجرای Winscope به Run Winscope مراجعه کنید.

برای اطلاعات در مورد جمع آوری ردپاها، به ضبط ردیابی ها مراجعه کنید.

برای اطلاعات در مورد نحوه بارگیری ردیابی ها با استفاده از رابط کاربری وب Winscope به بارگذاری ردیابی ها مراجعه کنید.

برای اطلاعات در مورد تجزیه و تحلیل ردیابی به تجزیه و تحلیل ردیابی ها مراجعه کنید.

نمونه ها

مثال زیر نحوه رفع اشکال شکست تست فلیکر و اشکال گزارش شده توسط کاربر را شرح می دهد.

تست فلیکر شکست خورد

این مثال نحوه استفاده از Winscope را برای رفع اشکال شکست تست فلیکر نشان می دهد.

شکست آزمون را بررسی کنید

برای تعیین نوع مشکل و بررسی پیام شکست تست، این مراحل را دنبال کنید.

  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 بارگذاری کنید. Winscope با انتخاب خودکار SurfaceFlinger باز می شود:

    Winscope landing page with SurfaceFlinger view

    شکل 1. صفحه فرود Winscope با نمای SurfaceFlinger.

  2. با کپی و چسباندن مهر زمانی از پیام استثنا در قسمت مهر زمانی، به مهر زمانی بروید که مشکل در آن رخ می‌دهد. می‌توانید مهر زمانی را در قالب قابل خواندن توسط انسان ( 2024-05-10T11:04:14.227572545 ) کپی کنید و در قسمت اول جای‌گذاری کنید، یا مهر زمانی را در نانوثانیه ( 1715339054227572545ns ) کپی کنید و در قسمت دوم جای‌گذاری کنید.

    Timestamp dialog

    شکل 2. گفتگوی مهر زمان.

  3. برای رفتن به فریم قبلی، کلید فلش سمت چپ را فشار دهید. در این حالت، برنامه NotificationActivity به درستی در ویدیو نشان داده می شود، و هر دو سطح برنامه و صفحه نمایش اسپلش قابل مشاهده هستند که با رنگ سبز رنگ در نمای سه بعدی و تراشه 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

    شکل 3. هنگام راه اندازی برنامه.

  4. برای بازگشت به فریم بعدی، جایی که سوسو زدن رخ می دهد، کلید پیکان سمت راست را فشار دهید. در نمای راست، به جای برنامه، NotificationShade روی صفحه نمایش داده می شود. سطوح زیر در این قاب نشان داده شده است:

    • روکش های دکور صفحه (بالا و پایین)
    • نوار ناوبری
    • مکان اشاره گر (از صفحه ضبط شده)

      Flicker activity

      شکل 4. فعالیت سوسو زدن.

  5. فعالیت برنامه را در نمای سلسله مراتبی انتخاب کنید. اگر نمی توانید آن را پیدا کنید، گزینه Show only V را بردارید. سپس نمای خواص را بررسی کنید.

    نام سطح برنامه:

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

    App properties

    شکل 5. ویژگی های برنامه.

    اگرچه فعالیت برنامه روی قابل مشاهده و غیرشفاف تنظیم شده است، به Invisible due to: null visible region نشان داده نمی شود. این به این دلیل رخ می دهد که در هنگام ترکیب، سطح مات دیگری در مقابل آن قرار می گیرد. این فرضیه از قرار گرفتن NotificationShade rect در مقابل NotificationActivity rect در نمای سه‌بعدی ناشی می‌شود و 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 باز می شود.

    Winscope landing page with SurfaceFlinger view

    شکل 6. صفحه فرود Winscope با نمای SurfaceFlinger.

  2. با وارد کردن 15:50:00 در قسمت مهر زمانی قابل خواندن توسط کاربر، به مهر زمانی تقریبی گزارش شده توسط کاربر، در این مورد 3:50 PM GMT-04:00 بروید.

    Timestamp dialog

    شکل 7. گفتگوی مهر زمانی.

  3. از نمای rects برای شناسایی آنچه روی صفحه کشیده شده است استفاده کنید. برای مشاهده بهتر، از نوار لغزنده چرخش برای تغییر پرسپکتیو rects استفاده کنید. با علامت گذاری Show only V و Flat در نمای سلسله مراتبی ، کاغذ دیواری، پوشش دکور صفحه، صندوق نامه، لانچر، مخاطبین و سطوح شماره گیر قابل مشاهده است.

    نام بسته ها عبارتند از:

    • راه‌انداز: 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

    شکل 8. گزارش کاربر.

  4. بعد از اینکه تشخیص دادید چه سطوحی در نمای تقسیم صفحه نمایش درگیر هستند، از ردیابی Transitions برای عبور از اقدامات مختلف کاربر و پیدا کردن سوسو زدن استفاده کنید. روی تب Transitions در Winscope کلیک کنید تا لیستی از انتقال‌های بازی شده را مشاهده کنید:

    transitions

    شکل 9. انتقال.

    انتقالی که در طول این فریم پخش می شود با رنگ آبی مشخص شده است. در این مورد، پرچم‌های انتقال شامل TRANSIT_FLAG_IS_RECENTS است که نشان می‌دهد کاربر در حال ورود به صفحه اخیر است.

  5. برای رفتن به آن نقطه از زمان و تأیید صحت در برگه Surface Flinger ، روی پیوند در ستون Dispatch Time (در این مورد 2024-04-18, 15:50:57.205 ) کلیک کنید. صحت وضعیت دستگاه را در حین انتقال با گام برداشتن از طریق انتقال با کلید جهت‌نمای راست و مشاهده رکت‌ها تأیید کنید.

    Launcher در ساعت 15:50:57.278 ظاهر می شود، اما انیمیشن آن زمان شروع نمی شود. کاغذدیواری از قبل قابل مشاهده است زیرا هیچ چیزی بین برنامه های صفحه تقسیم شده (تقسیم کننده) کشیده نشده است. یک فریم زودتر (15:50:57.212)، کاغذ دیواری قابل مشاهده نیست، و تقسیم‌کننده نشان داده می‌شود، که وقتی متحرک نمی‌شود، صفحه‌نمایش تقسیم‌شده به این شکل به نظر می‌رسد.

    Screen before flicker

    شکل 10. صفحه نمایش قبل از رویداد سوسو زدن.

  6. برای بررسی انتقال بعدی، مستقیماً روی جدول زمانی کلیک کنید. حالت های SurfaceFlinger با یک ردیف بلوک آبی روشن نشان داده می شوند. انتقال ها با ردیفی از بلوک های صورتی نشان داده می شوند.

    End of first transition

    شکل 11. پایان اولین انتقال.

    روی ردیف SurfaceFlinger در موقعیت شروع انتقال بعدی کلیک کنید. در شکل 11، موقعیت عمودی مکان نما با خط آبی نازک نشان داده شده است. پس زمینه آبی روشن ردیف SurfaceFlinger موقعیت افقی آن را نشان می دهد. با استفاده از کلید جهت‌نمای راست، مرحله انتقال را طی کنید تا ببینید آیا سوسو زدن رخ می‌دهد یا خیر. تأیید کنید که دستگاه برای این انتقال درست به نظر می رسد.

  7. از انتقال بعدی صرف نظر کنید زیرا مدت زمان آن بسیار کم است، بنابراین بعید است که دارای سوسو زدن باشد. در عوض، همانطور که توسط مکان نما در تصویر زیر نشان داده شده است، روی خط زمانی در ردیف SurfaceFlinger در موقعیت شروع انتقال طولانی تر بعدی کلیک کنید.

    end of second transition

    شکل 12. پایان انتقال دوم.

    در طول این انتقال، در 15:51:13.239 ، مشاهده کنید که لایه‌های Splash Screen برای هر دو برنامه، مخاطبین و شماره‌گیر، در یک سمت نمایشگر قرار دارند:

    splash screens

    شکل 13. صفحه های پاشش.

  8. مشخص کنید کدام برنامه در سمت اشتباه قرار دارد. با کلیک بر روی نماد پرچم در کنار فیلد ورودی ns ، یک نشانک را به موقعیت فعلی خود اضافه کنید تا بعداً به این قاب بازگردید.

    add bookmark

    شکل 14. اضافه کردن نشانک.

  9. با کلیک مستقیم روی جدول زمانی، به عنوان مثال، به 15:51:13.859 در انتهای انتقال به یک فریم بروید. در اینجا دو برنامه اکنون در موقعیت نهایی خود هستند، شماره گیر در سمت چپ، و مخاطبین در سمت راست:

    final split screen

    شکل 15. صفحه تقسیم نهایی.

  10. روی پرچم نشانک در جدول زمانی کلیک کنید تا با سوسو زدن به کادر بازگردید.

    bookmark timeline

    شکل 16. جدول زمانی نشانک.

    هر دو برنامه در سمت راست قرار دارند که نشان می دهد شماره گیر در موقعیت اشتباهی قرار دارد.

  11. برای مشاهده ویژگی های شماره گیر، روی صفحه نمایش چلپ چلوپ شماره گیر کلیک کنید. به طور خاص به ویژگی های تبدیل آن در نمای ویژگی های انتخاب شده نگاه کنید.

    Transform properties

    شکل 17. تبدیل خواص.

    تبدیل محاسبه شده روی این سطح اعمال می شود، اما به عنوان این سطح تنظیم نمی شود. ستون های محاسبه شده و درخواستی مقادیر متفاوتی دارند که نشان می دهد تبدیل از یک سطح والد به ارث می رسد.

  12. Flat را در نمای سلسله مراتبی برای نمایش کل درخت سلسله مراتب از حالت انتخاب خارج کنید، و به گره های والد سطح برنامه بروید تا زمانی که هر دو تبدیل محاسبه شده و درخواست شده یکسان باشند، نشان می دهد که تبدیل درخواست شده در Surface(name=Task=7934)/@0x1941191_transition-leash#40670 .

  13. تأیید کنید که تبدیل برای اولین بار چه زمانی تنظیم شده است، و به چه مقدار. با کلیک کردن روی نماد کنار عنوان، ویژگی‌های انتخاب‌شده را جمع کنید:

    collapse the curated properties

    شکل 18. خصوصیات انتخاب شده را جمع کنید.

  14. Show diff را در نمای Proto Dump انتخاب کنید تا ویژگی هایی که در این قاب تغییر می کنند برجسته شوند. برای فیلتر کردن خصوصیات، transform در قسمت جستجوی متن تایپ کنید:

    show diff

    شکل 19. نمایش تفاوت.

    تبدیل از IDENTITY به SCALE|TRANSLATE|ROT_270 در این قاب برای transition-leash تنظیم شده است.

    این اطلاعات نشان می‌دهد که سوسو زدن زمانی رخ داده است که این تبدیل روی دسته انیمیشن اپلیکیشن صفحه‌شکن شماره‌گیر اعمال شد.

    Identification of the flicker

    شکل 20. شناسایی سوسو.

  15. در کد مشخص کنید که چرا این تبدیل روی دسته انتقال صفحه تقسیم شده تنظیم شده است.