Winscope ابزار وبی است که به شما امکان میدهد وضعیتهای چندین سرویس سیستم را درطول و پساز پویانماییها و گذارها ضبط، بازپخش، و تجزیهوتحلیل کنید. Winscope همه وضعیتهای سرویس سیستم مربوطه را در فایل ردیابی ضبط میکند. بااستفاده از Winscope UI با فایل ردیابی، میتوانید وضعیت این خدمات را برای هر قاب پویانمایی، با یا بدون ضبط صفحه، با بازپخش، گامبهگام پیش رفتن، و اشکالزدایی انتقالها بررسی کنید.
ردیابیهای پشتیبانیشده
Winscope امکان جمعآوری و نمایش تصویری ردیابیهای مختلف را فراهم میکند، یعنی توالیهای وضعیت سرویس سیستم. میتوانید این ردیابیها را پیکربندی کنید تا با موارد استفاده خاص، از سربار کم تا پرحرفی زیاد، مطابقت داشته باشند. Winscope از ردپاهای زیر پشتیبانی میکند:
- EventLog: گزارش رویداد تشخیص خرابی سیستم را بااستفاده از
EventLogجمعآوری کنید. در Winscope، از این اطلاعات فقط برای شناسایی و نمایش نشانهگذاریهای CUJ استفاده میشود. - IME: رویدادهای خط لوله «ویرایشگر روش ورودی» (IME) را ردیابی کنید، ازجمله IMS، IMMS، و «کارخواه IME».
- ورودی: رویدادهای ورودی ردیابی را از بخشهای مختلف خط لوله رویداد ورودی انجام میدهد.
- ProtoLog: پیامهای ProtoLog را از خدمات سیستم و کد خدمات سیستم درحال اجرا در فرایندهای کارخواه جمعآوری میکند.
- ضبط صفحهنمایش: ضبط صفحهنمایش را همراه با ردپاها جمعآوری کنید.
- انتقالهای پوسته: جزئیات سیستم انتقال فعالیت و پنجره را ضبط میکند.
- SurfaceFlinger: ردگیریهای SurfaceFlinger حاوی اطلاعاتی درباره سطوح (لایهها) مثل موقعیت، میانگیر، و ترکیب را جمعآوری میکند.
- تراکنشها: مجموعه تغییرات اتمی دریافتی توسط SurfaceFlinger را
بااستفاده از
SurfaceControlبرای ترکیب ردیابی کنید. - ViewCapture: ضبط کردن طیفی از داراییهای همه نماها از سیستم Windows که از ViewCapture پشتیبانی میکنند، مثل «واسط کاربر سیستم» و «راهانداز».
- مدیر پنجره: ردیابی مدیر پنجره حالتهای حاوی جزئیات مربوط به پنجرهها، ازجمله رویدادهای ورودی و تمرکز، جهت صفحه، انتقالها، پویانماییها، موقعیتیابی، و تبدیلها.
خروجیهای پشتیبانیشده
Winscope میتواند انبارهای حالت را جمعآوری و نمایش دهد. این انبارها عکسهای آنی از حالت دستگاه هستند که در لحظات خاصی که شما تعریف کردهاید گرفته شدهاند. برخلاف ردگیریها که بهطور مداوم درطول استفاده از دستگاه جمعآوری میشوند و میتوانند بر عملکرد تأثیر بگذارند، نسخههای تخلیه فقط در این لحظات تعریفشده توسط کاربر گرفته میشوند تا اطمینان حاصل شود که عملکرد و سطح جزئیات بهخطر نمیافتند. این کار امکان تجزیهوتحلیل متمرکزتر و کارآمدتر وضعیت دستگاه را در نقاط زمانی خاص فراهم میکند. Winscope از تخلیههای زیر پشتیبانی میکند:
- مدیر پنجره: وضعیت «مدیر پنجره» را تخلیه کنید.
- SurfaceFlinger: Dump a single SurfaceFlinger snapshot.
- نماگرفت: نماگرفتی همراه با تخلیهها جمعآوری میشود.
منابع
برای اطلاعات بیشتر درباره ساختن و اجرای 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بهجای برنامه روی صفحه نشان داده میشود. سطوح زیر در این قاب نشان داده میشود:- رونهادهای تزئینی صفحهنمایش (بالا و پایین)
- نوار پیمایش
- مکان اشارهگر (از ضبط صفحهنمایش)
شکل ۴. فعالیت Flicker.
فعالیت برنامه را در نمای سلسلهمراتب انتخاب کنید. اگر نمیتوانید آن را پیدا کنید، گزینه نمایش فقط V را غیرفعال کنید. سپس نمای ویژگیها را بررسی کنید.
نام سطح برنامه:
com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
شکل ۵. داراییهای برنامه.
اگرچه فعالیت برنامه روی قابلمشاهده و مات تنظیم شده است، اما سطح بهدلیل خطای
Invisible due to: null visible regionنشان داده نمیشود. این اتفاق زمانی میافتد که سطح مات دیگری درطول ترکیببندی در جلوی آن قرار داده شده باشد. این فرضیه از این واقعیت ناشی میشود که مستطیلNotificationShadeدر نمای سهبعدی جلوی مستطیلNotificationActivityقرار دارد وNotificationShadeمرئی (سبز) احتمالاً لایه انتخابی است.برای اعتبارسنجی این فرضیه، سطح نمایان
NotificationShadeرا در قاب کنونی انتخاب کنید و ویژگیهای آن را بررسی کنید. پرچمها رویOPAQUE|ENABLE_BACKPRESSURE (0x102)تنظیم شده است. نام سطحNotificationShadeNotificationShade#3447است. سپس، کلید پیکان چپ را فشار دهید تا به قاب قبلی (قبلاز پرش) برگردید و دوباره ویژگیهای سطحNotificationShadeرا بررسی کنید. توجه داشته باشید که بهجایOPAQUE، سطح فقط پرچمENABLE_BACKPRESSURE (0x100)را دارد. این تأیید میکند کهNotificationShadeقبلاز اینکه راهاندازی برنامه کاملاً تمام شود، مات میشود. چونNotificationShadeجلویNotificationActivityقرار دارد، برنامه نشان داده نمیشود.NotificationShadeسیاه است، بنابراین صفحه برای لحظهای سیاه میشود که باعث پرش میشود.در کد مشخص کنید که چرا
NotificationShadeخیلی زود مات میشود.
اشکال گزارششده توسط کاربر
اشکالزدایی کردن اشکالهای گزارششده توسط کاربر میتواند چالشبرانگیز باشد زیرا اغلب فاقد اطلاعات دقیق هستند. برخلاف خطاهای آزمون پرش که مُهرهای زمان خاص، جزئیات عنصر، و ضبطهای صفحه را ارائه میدهند، اشکالات گزارششده توسط کاربر معمولاً فقط شامل شرح مختصری از مشکل است.
در مطالعه موردی ما، تنها اطلاعات ارائهشده عنوان لرزش صفحه هنگام باز کردن مجدد برنامه از صفحه دونیمه و مُهر زمان تقریبی ۱۸ آوریل ۲۰۲۴ ساعت ۳:۵۱ ب.ظ. GMT-04:00 است.
برای اشکالزدایی کردن اشکال گزارششده توسط کاربر، این مراحل را دنبال کنید:
فایل ردیابی را در Winscope بار کنید. Winscope با SurfaceFlinger انتخاب خودکار باز میشود.
شکل ۶. صفحه مقصد Winscope با نمای SurfaceFlinger.
با وارد کردن
15:50:00در فیلد مُهر زمان خوانا برای انسان، به مُهر زمان تقریبی گزارششده توسط کاربر، در این مورد3:50 PM GMT-04:00، پیمایش کنید.
شکل ۷. کادر گفتگوی مُهر زمان.
از نمای 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
علاوهبر سطوح نمایان (مستطیلهای سبز)، مستطیل خاکستری که نشاندهنده سطح ناحیه نمایش است و نمایش ناشناخته نام دارد نمایش داده میشود. برای بهبود نمایان بودن، روی (
)
در کنار سطح ScreenDecorHwcOverlay#64کلیک کنید تا مستطیل مربوط به آن پنهان شود و سطوح پشت آن آشکار شود. پوشش را برای تجزیهوتحلیل برمیداریم زیرا برای کاربر قابلمشاهده نیست و بهعنوان پویانمایی سوسوزننده گزارش نمیشود.
شکل ۸. گزارش کاربر.
- راهانداز:
پساز شناسایی سطوحی که در نمای صفحه تقسیمشده دخیل هستند، از ردیابی «گذارها» برای گامبهگام پیش رفتن در کنشهای مختلف کاربر و پیدا کردن پرش استفاده کنید. روی برگه انتقالها در Winscope کلیک کنید تا فهرست انتقالهای پخششده را تجسم کنید:
شکل ۹. گذرها.
گذار پخششده در این قاب با رنگ آبی برجسته شده است. در این مورد، پرچمهای گذار شامل
TRANSIT_FLAG_IS_RECENTSاست که نشان میدهد کاربر وارد صفحه اخیر شده است.روی پیوند ستون زمان اعزام (در این مورد
2024-04-18, 15:50:57.205) کلیک کنید تا به آن نقطه زمانی بروید و مستطیلها را در زبانه Surface Flinger تأیید کنید. با گامبهگام پیش رفتن در انتقال با کلید جهت راست و مشاهده مستطیلها، صحت وضعیت دستگاه را درطول انتقال تأیید کنید.«راهانداز» در 15:50:57.278 ظاهر میشود، اما پویانمایی در آن زمان شروع نمیشود. کاغذدیواری ازقبل قابلمشاهده است چون چیزی بین برنامههای صفحه دونیمه (جداکننده) کشیده نشده است. یک قاب زودتر (۱۵:۵۰:۵۷.۲۱۲)، کاغذدیواری نمایان نیست و جداکننده نشان داده میشود، که ظاهر صفحهنمایش دوگانه در حالت بدون پویانمایی است.
شکل ۱۰. صفحهنمایش قبلاز رویداد سوسوزدن.
برای بررسی انتقال بعدی، مستقیماً روی خط زمان کلیک کنید. حالتهای SurfaceFlinger با ردیفی از بلوکهای آبی روشن نشان داده میشود. گذارها با ردیفی از بلوکهای صورتی نشان داده میشوند.
شکل ۱۱. پایان اولین گذار.
روی ردیف SurfaceFlinger در موقعیت شروع انتقال بعدی کلیک کنید. در شکل ۱۱، جایگاه عمودی مکاننما با خط آبی نازک نشان داده شده است. پسزمینه آبی روشن ردیف SurfaceFlinger موقعیت افقی آن را نشان میدهد. با کلید راستبَر، مراحل گذار را یکییکی طی کنید تا ببینید آیا لرزش رخ میدهد یا نه. تأیید کنید که دستگاه برای این انتقال درست بهنظر میرسد.
از گذار بعدی رد شوید زیرا مدت آن بسیار کوتاه است، بنابراین احتمالاً دارای سوسو زدن نیست. درعوض، روی خط زمان در ردیف SurfaceFlinger در موقعیت شروع انتقال طولانیتر بعدی کلیک کنید، همانطور که با مکاننما در تصویر زیر نشان داده شده است.
شکل ۱۲. پایان انتقال دوم.
درطول این انتقال، در
15:51:13.239، مشاهده کنید که لایههایSplash Screenبرای هر دو برنامه، مخاطبین، و شمارهگیر، در یک سمت نمایشگر قرار دارند:
شکل ۱۳. صفحههای اسپلش.
توضیح دهید کدام برنامه در سمت اشتباه قرار دارد. با کلیک روی نماد پرچم در کنار فیلد ورودی ns، به موقعیت فعلی خود نشانک اضافه کنید تا بعداً بتوانید به این قاب برگردید.
شکل ۱۴. افزودن نشانک.
با کلیک مستقیم روی خط زمان، برای مثال، روی
15:51:13.859، به قاب در انتهای انتقال پیمایش کنید. در اینجا دو برنامه در موقعیت نهایی خود قرار دارند، شمارهگیر در سمت چپ و مخاطبین در سمت راست:
شکل ۱۵. صفحهٔ دونیمه نهایی.
برای بازگشت به قاب دارای پرش، روی پرچم نشانک در خط زمان کلیک کنید.
شکل ۱۶. خط زمان نشانکگذاری شود.
هر دو برنامه در سمت راست هستند، که نشان میدهد شمارهگیر در جای اشتباهی قرار دارد.
برای مشاهده ویژگیهای صفحه ورود شمارهگیر، روی آن کلیک کنید. بهطور خاص به خصوصیتهای تبدیل آن در نمای خصوصیتها که بهطور ویژه انتخاب شده است نگاه کنید.
شکل ۱۷. خصوصیات تبدیل.
تبدیل محاسبهشده برای این سطح اعمال شده است، اما در این سطح تنظیم نشده است. ستونهای محاسبهشده و درخواستشده مقادیر متفاوتی دارند، که نشان میدهد تبدیل از سطح والد به ارث رسیده است.
تخت را در نمای سلسلهمراتبی لغو انتخاب کنید تا کل درخت سلسلهمراتبی نشان داده شود، و به گرههای اصلی سطح برنامه پیمایش کنید تا هر دو تبدیل محاسبهشده و درخواستشده یکسان شوند، که نشان میدهد تبدیل در سطح
Surface(name=Task=7934)/@0x1941191_transition-leash#40670درخواست شده است.تأیید کنید که تبدیل برای اولینبار چه زمانی و با چه مقداری تنظیم شده است. با کلیک کردن روی نماد کنار عنوان، داراییهای گلچینشده را جمع کنید:
شکل ۱۸. جمع کردن داراییهای گلچینشده.
نمایش تفاوت را در نمای Proto Dump انتخاب کنید تا ویژگیهایی که در این قاب تغییر میکنند برجسته شوند. برای فیلتر کردن داراییها،
transformرا در فیلد جستجوی نوشتاری تایپ کنید:
شکل ۱۹. نمایش تفاوتها.
تبدیل از
IDENTITYبهSCALE|TRANSLATE|ROT_270در این قاب برایtransition-leashتنظیم شده است.این اطلاعات نشان میدهد که لرزش زمانی رخ داده است که تبدیل روی بند انیمیشن برنامه صفحهٔ دونیمه شمارهگیر اعمال شده است.
شکل ۲۰. شناسایی پرش.
در کد شناسایی کنید که چرا این تبدیل روی مهار انتقال صفحه دونیمه تنظیم شده است.