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 را برای اشکالزدایی از خطای تست سوسو زدن نشان میدهد.
بررسی شکست آزمایش
برای تعیین نوع مشکل و بررسی پیام عدم موفقیت آزمایش، این مراحل را دنبال کنید.
با بررسی نام آزمون و کلاس، نوع مسئله را تعیین کنید.
نام آزمون و کلاس:
FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]
نوع مسئله:
- CUJ به اجرای یک برنامه از طریق اعلان صفحه قفل (
OpenAppFromLockscreenNotificationColdTest
) اشاره دارد. - این تست انتظار دارد که برنامه قابل مشاهده شود (
#appLayerBecomesVisible
).
- CUJ به اجرای یک برنامه از طریق اعلان صفحه قفل (
پیام خطای تست را بررسی کنید، که اطلاعات جامعی در مورد خطا ارائه میدهد، از جمله:
- مقایسه بین نتیجه مورد انتظار و نتیجه قابل مشاهده واقعی
- مهرهای زمانی برای کمک به تعیین دقیق زمان وقوع خرابی
- نام مصنوع یا فایل مرتبط با خرابی
- اطلاعات زمینهای اضافی مرتبط با درک و اشکالزدایی از خطا
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
است.
اشکالزدایی
برای تشخیص علت لرزش دست، مراحل زیر را دنبال کنید:
فایلهای ردیابی را دانلود کرده و آنها را در Winscope بارگذاری کنید. Winscope با انتخاب خودکار SurfaceFlinger باز میشود:
شکل ۱. صفحه فرود Winscope با نمای SurfaceFlinger.
با کپی کردن و چسباندن برچسب زمانی از پیام استثنا در فیلد برچسب زمانی، به برچسب زمانی که مشکل در آن رخ میدهد، بروید. میتوانید برچسب زمانی را با فرمت قابل خواندن توسط انسان (
2024-05-10T11:04:14.227572545
) کپی کرده و در فیلد اول جایگذاری کنید، یا برچسب زمانی را به نانوثانیه کپی کرده (1715339054227572545ns
) و در فیلد دوم جایگذاری کنید.شکل ۲. پنجرهی نمایش مهر زمانی.
برای رفتن به فریم قبلی، کلید جهتنمای چپ را فشار دهید. در این حالت، برنامهی 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
این نشان میدهد که برنامه هنگام سیاه شدن صفحه در حال اجرا بوده و این رویداد در حین اجرای برنامه اتفاق میافتد، زیرا صفحه شروع هنوز قابل مشاهده است:
شکل ۳. در هنگام اجرای برنامه.
برای رفتن به فریم بعدی، جایی که سوسو زدن رخ میدهد، کلید جهتنمای راست را فشار دهید. در نمای مستطیلی، به جای برنامه،
NotificationShade
روی صفحه نمایش داده میشود. سطوح زیر در این فریم نشان داده شدهاند:- پوششهای دکور صفحه نمایش (بالا و پایین)
- نوار ناوبری
- مکان اشارهگر (از ضبط صفحه نمایش)
شکل ۴. فعالیت سوسو زدن.
فعالیت برنامه را در نمای سلسله مراتبی انتخاب کنید. اگر نمیتوانید آن را پیدا کنید، تیک گزینه « فقط نمایش V» را بردارید. سپس، نمای ویژگیها را بررسی کنید.
نام سطح برنامه:
com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
شکل ۵. ویژگیهای برنامه.
اگرچه فعالیت برنامه روی قابل مشاهده و مات تنظیم شده است، اما سطح به دلیل خطای
Invisible due to: null visible region
نشان داده نمیشود. این اتفاق به این دلیل رخ میدهد که در طول ترکیب، یک سطح مات دیگر در جلوی آن قرار داده شده است. این فرضیه از آنجا ناشی میشود کهNotificationShade
rect در نمای سهبعدی در جلویNotificationActivity
rect قرار دارد وNotificationShade
قابل مشاهده (سبز) به طور بالقوه لایه انتخاب شده است.برای اعتبارسنجی این فرضیه، سطح
NotificationShade
قابل مشاهده در فریم فعلی را انتخاب کرده و ویژگیهای آن را بررسی کنید. پرچمها رویOPAQUE|ENABLE_BACKPRESSURE (0x102)
تنظیم شدهاند. نام سطحNotificationShade
،NotificationShade#3447
است. سپس، فلش سمت چپ را فشار دهید تا به فریم قبلی (قبل از چشمک زدن) برگردید و دوباره ویژگیهای سطحNotificationShade
بررسی کنید. توجه داشته باشید که به جایOPAQUE
بودن، سطح فقط پرچمENABLE_BACKPRESSURE (0x100)
دارد. این تأیید میکند کهNotificationShade
قبل از اتمام کامل اجرای برنامه، مات میشود. از آنجایی کهNotificationShade
جلویNotificationActivity
است، برنامه نمایش داده نمیشود.NotificationShade
سیاه است، بنابراین صفحه نمایش برای مدت کوتاهی سیاه میشود که باعث چشمک زدن میشود.در کد مشخص کنید که چرا
NotificationShade
خیلی زود مات میشود.
اشکال گزارش شده توسط کاربر
اشکالزدایی اشکالات گزارششده توسط کاربر میتواند چالشبرانگیز باشد زیرا اغلب فاقد اطلاعات دقیق هستند. برخلاف خطاهای تست سوسو زدن که مهرهای زمانی خاص، جزئیات عناصر و ضبطهای صفحه را ارائه میدهند، اشکالات گزارششده توسط کاربر معمولاً فقط شامل شرح مختصری از مشکل هستند.
در مطالعه موردی ما، تنها اطلاعات ارائه شده، عنوان « هنگام بازگشایی برنامه از حالت تقسیم صفحه، صفحه چشمک میزند» و یک مهر زمانی تقریبی ۱۸ آوریل ۲۰۲۴، ساعت ۳:۵۱ بعد از ظهر به وقت گرینویچ-۰۴:۰۰ است.
برای رفع اشکال گزارش شده توسط کاربر، این مراحل را دنبال کنید:
فایل ردیابی را در Winscope بارگذاری کنید. Winscope با انتخاب خودکار SurfaceFlinger باز میشود.
شکل ۶. صفحه فرود Winscope با نمای SurfaceFlinger.
با وارد کردن
15:50:00
در فیلد مهر زمانی خوانا برای انسان، به مهر زمانی تقریبی گزارش شده توسط کاربر، که در این مورد3:50 PM GMT-04:00
، بروید.شکل ۷. پنجرهی نمایش مهر زمانی.
از نمای مستطیلها برای شناسایی آنچه روی صفحه نمایش داده شده است استفاده کنید. برای مشاهده بهتر، از نوار لغزنده چرخش برای تغییر پرسپکتیو مستطیلها استفاده کنید. با علامتگذاری نمایش فقط 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
علاوه بر سطوح قابل مشاهده (مستطیلهای سبز)، یک مستطیل خاکستری، که نشان دهنده سطح ناحیه نمایش است، با نام نمایش ناشناخته ، نمایش داده میشود. برای بهبود دید، روی ( کلیک کنید
) در کنار سطح
ScreenDecorHwcOverlay#64
قرار میگیرد تا مستطیل مربوطه پنهان شده و سطوح پشت آن نمایان شوند. ما پوشش را برای تجزیه و تحلیل حذف میکنیم زیرا برای کاربر قابل مشاهده نیست و به عنوان یک انیمیشن سوسو زدن گزارش نمیشود.شکل ۸. گزارش کاربر.
- لانچر:
پس از اینکه مشخص کردید کدام سطوح در نمای تقسیم صفحه درگیر هستند، از ردیابی Transitions برای مرور اقدامات مختلف کاربر و یافتن سوسو زدن استفاده کنید. برای مشاهده فهرست انتقالهای اجرا شده، روی برگه Transitions در Winscope کلیک کنید:
شکل ۹. گذارها.
انتقالی که در طول این فریم انجام میشود با رنگ آبی مشخص شده است. در این حالت، پرچمهای انتقال شامل
TRANSIT_FLAG_IS_RECENTS
هستند که نشان میدهد کاربر وارد صفحه recents میشود.برای رفتن به آن نقطه زمانی و تأیید rectها در برگه Surface Flinger ، روی پیوند موجود در ستون Dispatch Time (در این مورد
2024-04-18, 15:50:57.205
) کلیک کنید. صحت وضعیت دستگاه را در طول انتقال با حرکت دادن کلید جهتنمای راست در طول انتقال و مشاهده rectها تأیید کنید.لانچر در زمان ۱۵:۵۰:۵۷.۲۷۸ ظاهر میشود، اما انیمیشن در آن زمان شروع نمیشود. تصویر زمینه از قبل قابل مشاهده است زیرا هیچ چیزی بین برنامههای تقسیم صفحه (جداکننده) رسم نشده است. یک فریم قبلتر (۱۵:۵۰:۵۷.۲۱۲)، تصویر زمینه قابل مشاهده نیست و جداکننده نشان داده میشود، که نحوه نمایش تقسیم صفحه در حالت عدم نمایش انیمیشن است.
شکل ۱۰. صفحه نمایش قبل از رویداد سوسو زدن.
برای بررسی گذار بعدی، مستقیماً روی جدول زمانی کلیک کنید. حالتهای SurfaceFlinger با ردیفی از بلوکهای آبی روشن نمایش داده میشوند. گذارها با ردیفی از بلوکهای صورتی نمایش داده میشوند.
شکل ۱۱. پایان اولین گذار.
روی ردیف SurfaceFlinger در موقعیت شروع انتقال بعدی کلیک کنید. در شکل 11، موقعیت عمودی مکاننما با خط آبی نازک نشان داده شده است. پسزمینه آبی روشن ردیف SurfaceFlinger موقعیت افقی آن را نشان میدهد. با کلید جهتنمای راست، در طول انتقال حرکت کنید تا ببینید آیا سوسو زدن رخ میدهد یا خیر. تأیید کنید که دستگاه برای این انتقال درست به نظر میرسد.
از انتقال بعدی صرف نظر کنید زیرا مدت زمان آن بسیار کوتاه است، بنابراین بعید است که شامل سوسو زدن باشد. در عوض، همانطور که با مکان نما در تصویر زیر نشان داده شده است، روی خط زمانی در ردیف SurfaceFlinger در موقعیت شروع انتقال طولانی تر بعدی کلیک کنید.
شکل ۱۲. پایان گذار دوم.
در طول این انتقال، در
15:51:13.239
، مشاهده کنید که لایههایSplash Screen
برای هر دو برنامه، مخاطبین و شمارهگیر، در یک طرف صفحه نمایش قرار دارند:شکل ۱۳. صفحات اسپلش.
مشخص کنید کدام برنامه در سمت اشتباه قرار دارد. با کلیک روی نماد پرچم در کنار فیلد ورودی ns ، یک نشانک به موقعیت فعلی خود اضافه کنید تا بعداً بتوانید به این فریم برگردید.
شکل ۱۴. اضافه کردن نشانک.
با کلیک مستقیم روی خط زمانی، به یک فریم در انتهای گذار بروید، مثلاً به
15:51:13.859
. در اینجا دو برنامه اکنون در موقعیت نهایی خود قرار دارند، شمارهگیر در سمت چپ و مخاطبین در سمت راست:شکل ۱۵. صفحه تقسیم نهایی.
برای بازگشت به فریمی که نشانگر سوسو میزند، روی پرچم نشانک در جدول زمانی کلیک کنید.
شکل ۱۶. جدول زمانی نشانهگذاری.
هر دو برنامه در سمت راست هستند که نشان میدهد شمارهگیر در موقعیت نادرستی قرار دارد.
برای مشاهدهی ویژگیهای شمارهگیر، روی صفحهی آغازین آن کلیک کنید. بهطور خاص به ویژگیهای تبدیل آن در نمای ویژگیهای انتخابشده نگاه کنید.
شکل ۱۷. ویژگیهای تبدیل.
تبدیل محاسبهشده به این سطح اعمال میشود، اما در این سطح تنظیم نمیشود. ستونهای محاسبهشده و درخواستشده مقادیر متفاوتی دارند که نشان میدهد تبدیل از یک سطح والد به ارث رسیده است.
در نمای سلسله مراتبی، گزینه Flat را از حالت انتخاب خارج کنید تا کل درخت سلسله مراتبی نمایش داده شود و به گرههای والد سطح برنامه بروید تا هر دو تبدیل Calculated و Requested یکسان شوند و تبدیلی که در
Surface(name=Task=7934)/@0x1941191_transition-leash#40670
درخواست شده است را نشان دهد.تأیید کنید که تبدیل برای اولین بار چه زمانی و روی چه مقداری تنظیم شده است. با کلیک روی نماد کنار عنوان، ویژگیهای انتخابشده را جمع کنید:
شکل ۱۸. نمایش ویژگیهای انتخابشده.
برای برجسته کردن ویژگیهایی که در این فریم تغییر میکنند، در نمای Proto Dump، گزینه Show diff را انتخاب کنید. برای فیلتر کردن ویژگیها، در فیلد جستجوی متن،
transform
تایپ کنید:شکل ۱۹. نمایش تفاوت.
در این فریم برای
transition-leash
تبدیل ازIDENTITY
بهSCALE|TRANSLATE|ROT_270
تنظیم شده است.این اطلاعات نشان میدهد که سوسو زدن زمانی رخ داده است که تبدیل روی انیمیشن بند انگشتی برنامه صفحه تقسیم شده شمارهگیر اعمال شده است.
شکل ۲۰. شناسایی سوسو زدن.
در کد مشخص کنید که چرا این تبدیل روی تسمه انتقال صفحه نمایش تقسیم شده تنظیم شده است.