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

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

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

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

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

دامپ‌های پشتیبانی‌شده

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

  • مدیر پنجره: یک حالت واحد از مدیر پنجره را حذف کنید.
  • SurfaceFlinger: یک اسنپ‌شات از SurfaceFlinger تهیه کنید.
  • تصویر صفحه: یک تصویر صفحه را در کنار فایل‌های فشرده جمع‌آوری کنید.

منابع

برای اطلاعات بیشتر در مورد ساخت و اجرای Winscope به بخش اجرای 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

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

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

    Timestamp dialog

    شکل ۲. پنجره‌ی نمایش مهر زمانی.

  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

    شکل ۳. در هنگام اجرای برنامه.

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

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

    Flicker activity

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

  5. فعالیت برنامه را در نمای سلسله مراتبی انتخاب کنید. اگر نمی‌توانید آن را پیدا کنید، تیک گزینه « فقط نمایش V» را بردارید. سپس، نمای ویژگی‌ها را بررسی کنید.

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

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

    App properties

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

    اگرچه فعالیت برنامه روی قابل مشاهده و مات تنظیم شده است، اما سطح به دلیل خطای 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 خیلی زود مات می‌شود.

اشکال گزارش شده توسط کاربر

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

در مطالعه موردی ما، تنها اطلاعات ارائه شده، عنوان « هنگام بازگشایی برنامه از حالت تقسیم صفحه، صفحه چشمک می‌زند» و یک مهر زمانی تقریبی ۱۸ آوریل ۲۰۲۴، ساعت ۳:۵۱ بعد از ظهر به وقت گرینویچ-۰۴:۰۰ است.

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

  1. فایل ردیابی را در Winscope بارگذاری کنید. Winscope با انتخاب خودکار SurfaceFlinger باز می‌شود.

    Winscope landing page with SurfaceFlinger view

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

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

    Timestamp dialog

    شکل ۷. پنجره‌ی نمایش مهر زمانی.

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

    علاوه بر سطوح قابل مشاهده (مستطیل‌های سبز)، یک مستطیل خاکستری، که نشان دهنده سطح ناحیه نمایش است، با نام نمایش ناشناخته ، نمایش داده می‌شود. برای بهبود دید، روی ( کلیک کنید visibility icon ) در کنار سطح ScreenDecorHwcOverlay#64 قرار می‌گیرد تا مستطیل مربوطه پنهان شده و سطوح پشت آن نمایان شوند. ما پوشش را برای تجزیه و تحلیل حذف می‌کنیم زیرا برای کاربر قابل مشاهده نیست و به عنوان یک انیمیشن سوسو زدن گزارش نمی‌شود.

    User report

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

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

    transitions

    شکل ۹. گذارها.

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

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

    لانچر در زمان ۱۵:۵۰:۵۷.۲۷۸ ظاهر می‌شود، اما انیمیشن در آن زمان شروع نمی‌شود. تصویر زمینه از قبل قابل مشاهده است زیرا هیچ چیزی بین برنامه‌های تقسیم صفحه (جداکننده) رسم نشده است. یک فریم قبل‌تر (۱۵:۵۰:۵۷.۲۱۲)، تصویر زمینه قابل مشاهده نیست و جداکننده نشان داده می‌شود، که نحوه نمایش تقسیم صفحه در حالت عدم نمایش انیمیشن است.

    Screen before flicker

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

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

    End of first transition

    شکل ۱۱. پایان اولین گذار.

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

  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. در نمای سلسله مراتبی، گزینه Flat را از حالت انتخاب خارج کنید تا کل درخت سلسله مراتبی نمایش داده شود و به گره‌های والد سطح برنامه بروید تا هر دو تبدیل Calculated و Requested یکسان شوند و تبدیلی که در Surface(name=Task=7934)/@0x1941191_transition-leash#40670 درخواست شده است را نشان دهد.

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

    collapse the curated properties

    شکل ۱۸. نمایش ویژگی‌های انتخاب‌شده.

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

    show diff

    شکل ۱۹. نمایش تفاوت.

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

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

    Identification of the flicker

    شکل ۲۰. شناسایی سوسو زدن.

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