Winscope هي أداة ويب تتيح للمستخدمين تسجيل حالات العديد من خدمات النظام وإعادة تشغيلها وتحليلها أثناء الرسومات المتحرّكة والانتقالات وبعدها. يسجِّل Winscope جميع حالات خدمة النظام ذات الصلة في ملف تتبُّع. باستخدام واجهة مستخدم Winscope مع ملف التتبُّع، يمكنك فحص حالة هذه الخدمات لكل إطار من إطارات الصور المتحركة، مع تسجيل شاشة أو بدونه، من خلال إعادة تشغيل التحولات والتنقّل خلالها وتصحيح أخطائها.
عمليات التتبّع المتوافقة
يوفّر Winscope إمكانية جمع عمليات التتبّع المختلفة أو تسلسلات حالات خدمات النظام وتمثيلها بصريًا. يمكنك ضبط عمليات التتبُّع هذه لتلائم حالات استخدام معيّنة، بدءًا من انخفاض الوقت المستغرَق في المعالجة إلى زيادة مستوى التفصيل. تتيح أداة Winscope التتبّع التالي:
- EventLog: يمكنك جمع سجلّ أحداث بيانات تشخيص النظام باستخدام
EventLog
. في Winscope، لا تُستخدَم هذه المعلومات إلا لتحديد علامات CUJ وعرضها. - محرر أسلوب الإدخال (IME): تتبُّع الأحداث من مسار محرِّر أسلوب الإدخال (IME)، بما في ذلك IMS وIMMS وبرنامج IME Client
- الإدخال: يمكنك تتبُّع أحداث الإدخال من أجزاء مختلفة من مسار إرسال حدث الإدخال.
- ProtoLog: جمع رسائلProtoLog من خدمات النظام ورمز خدمات النظام التي تعمل في عمليات العميل
- تسجيل الشاشة: يمكنك جمع تسجيل شاشة إلى جانب التتبّعات.
- عمليات نقل البيانات في Shell: تسجيل تفاصيل نظام نقل البيانات في النوافذ والأنشطة
- SurfaceFlinger: يمكنك جمع مسارات SurfaceFlinger التي تحتوي على معلومات عن مساحات العرض (الطبقات)، مثل الموضع والذاكرة المؤقتة والتركيب.
- المعاملات: تتبُّع مجموعة التغييرات الأساسية التي تلقّاها SurfaceFlinger
باستخدام
SurfaceControl
للتركيب - ViewCapture: يمكنك التقاط مجموعة من خصائص جميع طرق العرض من نوافذ النظام التي تتيح استخدام ViewCapture، مثل واجهة مستخدم النظام ومشغّل التطبيقات.
- مدير النوافذ: تتبُّع حالات مدير النوافذ التي تحتوي على تفاصيل تتعلّق بالنوافذ، بما في ذلك أحداث الإدخال والتركيز، واتجاه الشاشة، والانتقالات، والصور المتحركة، والموضع، والتحويلات
ملفات البيانات المسموح بها
يمكن لتطبيق Winscope جمع بيانات الحالة وعرضها، وهي لقطات لحالة الجهاز يتم التقاطها في لحظات محدّدة يحدّدها المستخدم. على عكس عمليات التتبُّع، التي يتم جمعها باستمرار أثناء استخدام الجهاز ويمكن أن تؤثّر في الأداء، لا يتم تسجيل عمليات تسجيل الذاكرة إلا في هذه اللحظات التي يحدّدها المستخدم، ما يضمن عدم التأثير في الأداء ومستوى التفصيل. يتيح ذلك تحليلًا أكثر تركيزًا وفعالية لحالة الجهاز في نقاط زمنية معيّنة. تتيح أداة Winscope استخدام ملفات البيانات المُجمَّعة التالية:
- مدير النوافذ: تفريغ حالة واحدة لإدارة النوافذ
- SurfaceFlinger: تفريغ لقطة واحدة من SurfaceFlinger
- لقطة شاشة: يمكنك جمع لقطة شاشة إلى جانب ملفات البيانات.
المراجع
راجِع مقالة تشغيل Winscope للحصول على معلومات عن إنشاء وتشغيل Winscope.
راجِع مقالة التقاط عمليات التتبّع للحصول على معلومات عن جمع عمليات التتبّع.
اطّلِع على تحميل عمليات التتبُّع للحصول على معلومات عن كيفية تحميل عمليات التتبُّع باستخدام واجهة مستخدم الويب Winscope.
اطّلِع على تحليل عمليات التتبّع للحصول على معلومات عن تحليل عمليات التتبّع.
أمثلة
يوضّح المثال التالي كيفية تصحيح أخطاء اختبار وميض الشاشة وأخطاء برمجية أبلغ عنها أحد المستخدمين.
تعذّر اجتياز اختبار وميض الشاشة
يوضّح هذا المثال كيفية استخدام Winscope لتصحيح أخطاء اختبار وميض الشاشة.
فحص سبب تعذُّر الاختبار
اتّبِع الخطوات التالية لتحديد نوع المشكلة وفحص رسالة تعذُّر الاختبار.
حدِّد نوع المشكلة من خلال فحص اسم الاختبار والصف.
اسم الاختبار والفئة:
FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]
نوع المشكلة:
يشير "التشغيل من الإشعار" إلى تشغيل تطبيق من إشعار على شاشة القفل (
OpenAppFromLockscreenNotificationColdTest
).يتوقّع الاختبار أن يصبح التطبيق مرئيًا (
#appLayerBecomesVisible
).
راجِع رسالة تعذُّر الاختبار التي تقدّم معلومات شاملة عن سبب التعذُّر، بما في ذلك:
- مقارنة بين النتيجة المتوقّعة والنتيجة الفعلية المرئية
- الطوابع الزمنية للمساعدة في تحديد وقت حدوث الخطأ
- اسم العنصر أو الملف المرتبط بالتعطُّل
- معلومات سياقية إضافية ذات صلة بفهم المشكلة وتحديدها وإصلاحها
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 تلقائيًا:
الشكل 1: الصفحة المقصودة لخدمة Winscope مع عرض SurfaceFlinger
انتقِل إلى الطابع الزمني الذي تحدث فيه المشكلة عن طريق نسخ الطابع الزمني من رسالة الاستثناء ولصقه في حقل الطابع الزمني. يمكنك إما نسخ الطابع الزمني بتنسيق يمكن قراءته بالعين (
2024-05-10T11:04:14.227572545
) ولصقه في الحقل الأول، أو نسخ الطابع الزمني بنانوثانية (1715339054227572545ns
) ولصقه في الحقل الثاني.الشكل 2: مربّع حوار الطابع الزمني
اضغط على مفتاح السهم المتّجه لليسار للانتقال إلى الإطار السابق. في هذه الحالة، يظهر تطبيق 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
يشير ذلك إلى أنّه كان يتم تشغيل التطبيق عندما أصبحت الشاشة سوداء، ويشير أيضًا إلى أنّ هذا الحدث يحدث أثناء تشغيل التطبيق، لأنّ شاشة التمهيد لا تزال مرئية:
الشكل 3: عند تشغيل التطبيق
اضغط على مفتاح السهم المتّجه لليسار للانتقال إلى اللقطة التالية التي يحدث فيها الوميض. في عرض المستطيلات، يتم عرض
NotificationShade
على الشاشة بدلاً من التطبيق. يتم عرض مساحات العرض التالية في هذا الإطار:- العناصر الزخرفية التي تظهر فوق الشاشة (أعلى الشاشة وأسفلها)
- شريط التنقل
موقع المؤشر (من تسجيل الشاشة)
الشكل 4: نشاط وميض
اختَر نشاط التطبيق في عرض التدرّج الهرمي. إذا لم تتمكّن من العثور عليه، ألغِ تفعيل الخيار عرض القيمة فقط. بعد ذلك، تحقّق من عرض المواقع.
اسم مساحة عرض التطبيق هو:
com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
الشكل 5: مواقع التطبيقات
على الرغم من ضبط نشاط التطبيق على أنّه مرئي وغير شفاف، لا يتم عرض المساحة بسبب خطأ
Invisible due to: null visible region
. ويحدث ذلك لأنّه تم وضع سطح آخر غير شفاف أمامه أثناء التركيب. تستند هذه الفرضية إلى أنّ المستطيلNotificationShade
يظهر أمام المستطيلNotificationActivity
في العرض الثلاثي الأبعاد، وأنّ المستطيل المربّع الظاهر (الأخضر)NotificationShade
قد يكون الطبقة التي تم اختيارها.للتحقّق من صحة هذه الفرضية، اختَر
NotificationShade
السطح المرئي في الإطار الحالي وتحقّق من خصائصه. تم ضبط الإشارات علىOPAQUE|ENABLE_BACKPRESSURE (0x102)
. اسم سطحNotificationShade
هوNotificationShade#3447
. بعد ذلك، اضغط على السهم المتّجه لليسار للتنقل إلى الإطار السابق (قبل الوميض) وفحص خصائص سطحNotificationShade
مرة أخرى. يُرجى ملاحظة أنّه بدلاً منOPAQUE
، تتضمّن المساحة فقط العلامةENABLE_BACKPRESSURE (0x100)
. يؤكد ذلك أنّNotificationShade
يصبح غير شفاف قبل اكتمال عملية إطلاق التطبيق تمامًا. بما أنّ الرمزNotificationShade
يظهر قبل الرمزNotificationActivity
، لا يظهر التطبيق. الرمزNotificationShade
أسود، لذا تصبح الشاشة سوداء لفترة قصيرة، ما يؤدي إلى الوميض.حدِّد في الرمز سبب ظهور
NotificationShade
بشكل غير شفاف في وقت مبكر جدًا.
خطأ أبلغ عنه المستخدم
قد يكون من الصعب تصحيح الأخطاء التي يبلغ عنها المستخدمون لأنّها غالبًا ما تفتقر إلى معلومات detailed. على عكس حالات تعذُّر اجتياز اختبار وميض الشاشة التي تقدّم طوابع زمنية محدّدة وتفاصيل عن العناصر وتسجيلات شاشة، لا تشمل عادةً الأخطاء التي يبلّغ عنها المستخدم سوى وصف موجز للمشكلة.
في دراسة الحالة هذه، تكون المعلومات الوحيدة المقدَّمة هي العنوان وميض الشاشة عند إعادة فتح التطبيق من وضع "تقسيم الشاشة" والطابع الزمني التقريبي التالي: 18 نيسان (أبريل) 2024، الساعة 3:51 بعد الظهر، التوقيت العالمي المنسَّق -04:00.
اتّبِع الخطوات التالية لتصحيح أخطاء أبلغ عنها المستخدمون:
حمِّل ملف التتبُّع في Winscope. يتم فتح Winscope مع SurfaceFlinger autoselected.
الشكل 6: الصفحة المقصودة لخدمة Winscope مع عرض SurfaceFlinger
انتقِل إلى الطابع الزمني التقريبي الذي أبلغ عنه المستخدم، وفي هذه الحالة
3:50 PM GMT-04:00
، عن طريق إدخال15:50:00
في حقل الطابع الزمني القابل للقراءة بالعين.الشكل 7: مربّع حوار الطابع الزمني
استخدِم عرض المستطيلات لتحديد ما تم رسمه على الشاشة. للحصول على عرض أفضل، استخدِم شريط التمرير التدوير لتغيير منظور المستطيلات. من خلال وضع علامة على عرض 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
لإخفاء الصندوق المرتبط به وإظهار الأسطح التي تقع خلفه. نزيل التراكب من أجل التحليل لأنّه لا يظهر للمستخدم ولن يتم الإبلاغ عنه على أنّه صورة متحركة ومتعرّجة.الشكل 8: تقرير المستخدم
بعد تحديد مساحات العرض المعنيّة في عرض الشاشة المُقسّمة، استخدِم ميزة تتبُّع "الانتقالات" للانتقال من خلال إجراءات المستخدِم المختلفة للعثور على وميض الشاشة. انقر على علامة التبويب الانتقالات في Winscope ل visualizing list of played transitions:
الشكل 9: الانتقالات
يتم تمييز الانتقال الذي تم تشغيله خلال هذا الإطار باللون الأزرق. في هذا السياق، تتضمّن علامات النقل
TRANSIT_FLAG_IS_RECENTS
، والتي تشير إلى أنّ المستخدم يدخل إلى شاشة "التطبيقات المستخدَمة مؤخرًا".انقر على الرابط في عمود وقت الإرسال (في هذه الحالة
2024-04-18, 15:50:57.205
) للانتقال إلى تلك النقطة في الوقت والتحقّق من المستطيلات في علامة التبويب Surface Flinger. تأكَّد من صحة حالة الجهاز أثناء عملية النقل من خلال التنقّل في عملية النقل باستخدام مفتاح السهم الأيمن وملاحظة المستطيلات.يظهر مشغّل التطبيقات في الساعة 15:50:57.278، ولكن لا يبدأ العرض المتحرك في ذلك الوقت. تظهر الخلفية حاليًا لأنّه لا يتم رسم أي شيء بين التطبيقات التي تم تقسيم الشاشة بينها (المقسم). في اللقطة السابقة (15:50:57.212)، لا تظهر الخلفية ، ويتم عرض المقسم، وهو الشكل الذي يظهر به الشاشة المُقسّمة في حال عدم عرض الصور المتحركة.
الشكل 10: الشاشة قبل حدث الوميض
للاطّلاع على عملية النقل التالية، انقر على المخطط الزمني مباشرةً. يتم تمثيل حالات SurfaceFlinger بصف من الكتل الزرقاء الفاتحة. يتم تمثيل الانتقالات بصف من الكتل الوردية.
الشكل 11: نهاية النقل الأول
انقر على صف SurfaceFlinger في موضع بدء التأثير التالي. في الشكل 11، يشير الخط الأزرق الرفيع إلى الوضع الرأسي للمؤشر. يعرض الجدول التالي لصف SurfaceFlinger الخلفية الزرقاء الفاتحة التي تشير إلى موضع الصف الأفقي. انتقِل إلى مراحل التحوّل باستخدام مفتاح السهم المتّجه لليسار لمعرفة ما إذا كان يحدث وميض. تأكَّد مما يلي: أنّ الجهاز يبدو مناسبًا لإجراء عملية النقل هذه.
تخطّى الانتقال التالي لأنّ مدته قصيرة جدًا، لذا من غير المرجّح أن يحتوي على وميض. بدلاً من ذلك، انقر على المخطط الزمني في صف SurfaceFlinger في موضع بدء الانتقال الأطول التالي، كما هو موضّح من خلال المؤشر في الصورة التالية.
الشكل 12: نهاية الانتقال الثاني
أثناء عملية النقل هذه، في
15:51:13.239
، لاحظ أنّSplash Screen
طبقات كل من التطبيقات وجهات الاتصال وتطبيق الاتصال تظهر على جانب الشاشة نفسه:الشكل 13: شاشات البداية
يُرجى توضيح التطبيق الذي يظهر على الجانب غير الصحيح. أضِف إشارة مرجعية إلى موقعك الحالي من خلال النقر على رمز العلامة بجانب حقل الإدخال ns، للمساعدة في الرجوع إلى هذا الإطار لاحقًا.
الشكل 14: إضافة إشارة مرجعية
انتقِل إلى إطار في نهاية الانتقال من خلال النقر على المخطط الزمني مباشرةً، على سبيل المثال، إلى
15:51:13.859
. في ما يلي التطبيقان في موضعهما النهائي الآن، مع لوحة الاتصال على يمين الشاشة وجهات الاتصال على يسارها:الشكل 15: شاشة تقسيم نهائية
انقر على علامة الإشارة المرجعية في المخطط الزمني للرجوع إلى اللقطة التي يتضمّن فيها الوميض.
الشكل 16: المخطط الزمني للإشارات المرجعية
يظهر كلا التطبيقَين على يمين الشاشة، ما يشير إلى أنّ تطبيق "أداة الاتصال" في موضع غير صحيح.
انقر على شاشة البداية الخاصة بتطبيق الاتصال للاطّلاع على خصائصه. اطّلِع على خصائص التحويل في عرض المواقع المنظَّمة.
الشكل 17: تحويل السمات
يتم تطبيق التحويل المحسوب على هذه المساحة، ولكن لا يتم ضبطه على هذا المستوى. تحتوي الأعمدة المحسوبة والمطلوبة على قيم مختلفة، ما يشير إلى أنّه يتم اكتساب التحويل من سطح رئيسي.
أزِل العلامة من المربّع بجانب مسطّح في عرض التدرّج الهرمي لعرض شجرة التدرّج الهرمي بالكامل، وانتقِل إلى العقد الرئيسية لمساحة عرض التطبيق إلى أن تصبح عملية التحويل في كل من المُحسَّنة والمطلوبة متطابقة، ما يعرض عملية التحويل التي يتم طلبها على سطح
Surface(name=Task=7934)/@0x1941191_transition-leash#40670
.تأكَّد من وقت ضبط التحويل لأول مرة والقيمة التي تم ضبطها. يمكنك تصغير المواقع التي تمّت تصفيتها من خلال النقر على الرمز بجانب العنوان:
الشكل 18: اضغط على رمز التصغير بجانب المواقع التي تم اختيارها.
انقر على عرض الاختلاف في عرض Proto Dump لتمييز السمات التي يتم تغييرها في هذا الإطار. اكتب
transform
في حقل البحث النصي لفلترة المواقع:الشكل 19: عرض الاختلاف
تم ضبط التحويل من
IDENTITY
إلىSCALE|TRANSLATE|ROT_270
في هذا الإطار للعنصرtransition-leash
.توضِّح هذه المعلومات أنّ الوميض حدث عند تطبيق التحويل على سلسلة الصور المتحركة لتطبيق "قائمة الاتصال" في وضع تقسيم الشاشة.
الشكل 20: تحديد وميض الشاشة
حدِّد في الرمز سبب ضبط هذا التحويل على قيد انتقال تقسيم الشاشة.