تتبُّع عمليات انتقال النوافذ باستخدام Winscope

‫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 لتصحيح أخطاء اختبار وميض الشاشة.

فحص سبب تعذُّر الاختبار

اتّبِع الخطوات التالية لتحديد نوع المشكلة وفحص رسالة تعذُّر الاختبار.

  1. حدِّد نوع المشكلة من خلال فحص اسم الاختبار والصف.

    اسم الاختبار والفئة:

    FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]
    

    نوع المشكلة:

    • يشير "التشغيل من الإشعار" إلى تشغيل تطبيق من إشعار على شاشة القفل (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 مع عرض SurfaceFlinger

    الشكل 1: الصفحة المقصودة لخدمة Winscope مع عرض SurfaceFlinger

  2. انتقِل إلى الطابع الزمني الذي تحدث فيه المشكلة عن طريق نسخ الطابع الزمني من رسالة الاستثناء ولصقه في حقل الطابع الزمني. يمكنك إما نسخ الطابع الزمني بتنسيق يمكن قراءته بالعين (2024-05-10T11:04:14.227572545) ولصقه في الحقل الأول، أو نسخ الطابع الزمني بنانوثانية (1715339054227572545ns) ولصقه في الحقل الثاني.

    مربّع حوار الطابع الزمني

    الشكل 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
    

    يشير ذلك إلى أنّه كان يتم تشغيل التطبيق عندما أصبحت الشاشة سوداء، ويشير أيضًا إلى أنّ هذا الحدث يحدث أثناء تشغيل التطبيق، لأنّ شاشة التمهيد لا تزال مرئية:

    عند تشغيل التطبيق

    الشكل 3: عند تشغيل التطبيق

  4. اضغط على مفتاح السهم المتّجه لليسار للانتقال إلى اللقطة التالية التي يحدث فيها الوميض. في عرض المستطيلات، يتم عرض NotificationShade على الشاشة بدلاً من التطبيق. يتم عرض مساحات العرض التالية في هذا الإطار:

    • العناصر الزخرفية التي تظهر فوق الشاشة (أعلى الشاشة وأسفلها)
    • شريط التنقل
    • موقع المؤشر (من تسجيل الشاشة)

      نشاط الوميض

      الشكل 4: نشاط وميض

  5. اختَر نشاط التطبيق في عرض التدرّج الهرمي. إذا لم تتمكّن من العثور عليه، ألغِ تفعيل الخيار عرض القيمة فقط. بعد ذلك، تحقّق من عرض المواقع.

    اسم مساحة عرض التطبيق هو:

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

    مواقع التطبيقات

    الشكل 5: مواقع التطبيقات

    على الرغم من ضبط نشاط التطبيق على أنّه مرئي وغير شفاف، لا يتم عرض المساحة بسبب خطأ Invisible due to: null visible region. ويحدث ذلك لأنّه تم وضع سطح آخر غير شفاف أمامه أثناء التركيب. تستند هذه الفرضية إلى أنّ المستطيل NotificationShade يظهر أمام المستطيل NotificationActivity في العرض الثلاثي الأبعاد، وأنّ المستطيل المربّع الظاهر (الأخضر) NotificationShade قد يكون الطبقة التي تم اختيارها.

  6. للتحقّق من صحة هذه الفرضية، اختَر NotificationShade السطح المرئي في الإطار الحالي وتحقّق من خصائصه. تم ضبط الإشارات على OPAQUE|ENABLE_BACKPRESSURE (0x102). اسم سطح NotificationShade هو NotificationShade#3447. بعد ذلك، اضغط على السهم المتّجه لليسار للتنقل إلى الإطار السابق (قبل الوميض) وفحص خصائص سطح NotificationShade مرة أخرى. يُرجى ملاحظة أنّه بدلاً من OPAQUE، تتضمّن المساحة فقط العلامة ENABLE_BACKPRESSURE (0x100). يؤكد ذلك أنّ NotificationShade يصبح غير شفاف قبل اكتمال عملية إطلاق التطبيق تمامًا. بما أنّ الرمز NotificationShade يظهر قبل الرمز NotificationActivity، لا يظهر التطبيق. الرمز NotificationShade أسود، لذا تصبح الشاشة سوداء لفترة قصيرة، ما يؤدي إلى الوميض.

  7. حدِّد في الرمز سبب ظهور NotificationShade بشكل غير شفاف في وقت مبكر جدًا.

خطأ أبلغ عنه المستخدم

قد يكون من الصعب تصحيح الأخطاء التي يبلغ عنها المستخدمون لأنّها غالبًا ما تفتقر إلى معلومات detailed. على عكس حالات تعذُّر اجتياز اختبار وميض الشاشة التي تقدّم طوابع زمنية محدّدة وتفاصيل عن العناصر وتسجيلات شاشة، لا تشمل عادةً الأخطاء التي يبلّغ عنها المستخدم سوى وصف موجز للمشكلة.

في دراسة الحالة هذه، تكون المعلومات الوحيدة المقدَّمة هي العنوان وميض الشاشة عند إعادة فتح التطبيق من وضع "تقسيم الشاشة" والطابع الزمني التقريبي التالي: ‫18 نيسان (أبريل) 2024، الساعة 3:51 بعد الظهر، التوقيت العالمي المنسَّق -04:00.

اتّبِع الخطوات التالية لتصحيح أخطاء أبلغ عنها المستخدمون:

  1. حمِّل ملف التتبُّع في Winscope. يتم فتح Winscope مع SurfaceFlinger autoselected.

    الصفحة المقصودة لخدمة Winscope مع عرض SurfaceFlinger

    الشكل 6: الصفحة المقصودة لخدمة Winscope مع عرض SurfaceFlinger

  2. انتقِل إلى الطابع الزمني التقريبي الذي أبلغ عنه المستخدم، وفي هذه الحالة 3:50 PM GMT-04:00، عن طريق إدخال 15:50:00 في حقل الطابع الزمني القابل للقراءة بالعين.

    مربّع حوار الطابع الزمني

    الشكل 7: مربّع حوار الطابع الزمني

  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

    بالإضافة إلى مساحات العرض المرئية (المستطيلات الخضراء)، يتم عرض مستطيل رمادي يمثّل مساحة منطقة العرض باسم شاشة غير معروفة. لتحسين مستوى الرؤية، انقر على الرمز (رمز مستوى الظهور) بجانب سطح ScreenDecorHwcOverlay#64 لإخفاء الصندوق المرتبط به وإظهار الأسطح التي تقع خلفه. نزيل التراكب من أجل التحليل لأنّه لا يظهر للمستخدم ولن يتم الإبلاغ عنه على أنّه صورة متحركة ومتعرّجة.

    تقرير المستخدم

    الشكل 8: تقرير المستخدم

  4. بعد تحديد مساحات العرض المعنيّة في عرض الشاشة المُقسّمة، استخدِم ميزة تتبُّع "الانتقالات" للانتقال من خلال إجراءات المستخدِم المختلفة للعثور على وميض الشاشة. انقر على علامة التبويب الانتقالات في Winscope ل visualizing list of played transitions:

    الانتقالات

    الشكل 9: الانتقالات

    يتم تمييز الانتقال الذي تم تشغيله خلال هذا الإطار باللون الأزرق. في هذا السياق، تتضمّن علامات النقل TRANSIT_FLAG_IS_RECENTS، والتي تشير إلى أنّ المستخدم يدخل إلى شاشة "التطبيقات المستخدَمة مؤخرًا".

  5. انقر على الرابط في عمود وقت الإرسال (في هذه الحالة 2024-04-18, 15:50:57.205) للانتقال إلى تلك النقطة في الوقت والتحقّق من المستطيلات في علامة التبويب Surface Flinger. تأكَّد من صحة حالة الجهاز أثناء عملية النقل من خلال التنقّل في عملية النقل باستخدام مفتاح السهم الأيمن وملاحظة المستطيلات.

    يظهر مشغّل التطبيقات في الساعة 15:50:57.278، ولكن لا يبدأ العرض المتحرك في ذلك الوقت. تظهر الخلفية حاليًا لأنّه لا يتم رسم أي شيء بين التطبيقات التي تم تقسيم الشاشة بينها (المقسم). في اللقطة السابقة (15:50:57.212)، لا تظهر الخلفية ، ويتم عرض المقسم، وهو الشكل الذي يظهر به الشاشة المُقسّمة في حال عدم عرض الصور المتحركة.

    الشاشة قبل الوميض

    الشكل 10: الشاشة قبل حدث الوميض

  6. للاطّلاع على عملية النقل التالية، انقر على المخطط الزمني مباشرةً. يتم تمثيل حالات SurfaceFlinger بصف من الكتل الزرقاء الفاتحة. يتم تمثيل الانتقالات بصف من الكتل الوردية.

    نهاية النقل الأول

    الشكل 11: نهاية النقل الأول

    انقر على صف SurfaceFlinger في موضع بدء التأثير التالي. في الشكل 11، يشير الخط الأزرق الرفيع إلى الوضع الرأسي للمؤشر. يعرض الجدول التالي لصف SurfaceFlinger الخلفية الزرقاء الفاتحة التي تشير إلى موضع الصف الأفقي. انتقِل إلى مراحل التحوّل باستخدام مفتاح السهم المتّجه لليسار لمعرفة ما إذا كان يحدث وميض. تأكَّد مما يلي: أنّ الجهاز يبدو مناسبًا لإجراء عملية النقل هذه.

  7. تخطّى الانتقال التالي لأنّ مدته قصيرة جدًا، لذا من غير المرجّح أن يحتوي على وميض. بدلاً من ذلك، انقر على المخطط الزمني في صف SurfaceFlinger في موضع بدء الانتقال الأطول التالي، كما هو موضّح من خلال المؤشر في الصورة التالية.

    نهاية النقلة الثانية

    الشكل 12: نهاية الانتقال الثاني

    أثناء عملية النقل هذه، في 15:51:13.239، لاحظ أنّ Splash Screen طبقات كل من التطبيقات وجهات الاتصال وتطبيق الاتصال تظهر على جانب الشاشة نفسه:

    شاشات البداية

    الشكل 13: شاشات البداية

  8. يُرجى توضيح التطبيق الذي يظهر على الجانب غير الصحيح. أضِف إشارة مرجعية إلى موقعك الحالي من خلال النقر على رمز العلامة بجانب حقل الإدخال ns، للمساعدة في الرجوع إلى هذا الإطار لاحقًا.

    إضافة إشارة مرجعية

    الشكل 14: إضافة إشارة مرجعية

  9. انتقِل إلى إطار في نهاية الانتقال من خلال النقر على المخطط الزمني مباشرةً، على سبيل المثال، إلى 15:51:13.859. في ما يلي التطبيقان في موضعهما النهائي الآن، مع لوحة الاتصال على يمين الشاشة وجهات الاتصال على يسارها:

    تقسيم الشاشة النهائي

    الشكل 15: شاشة تقسيم نهائية

  10. انقر على علامة الإشارة المرجعية في المخطط الزمني للرجوع إلى اللقطة التي يتضمّن فيها الوميض.

    المخطط الزمني للإشارات المرجعية

    الشكل 16: المخطط الزمني للإشارات المرجعية

    يظهر كلا التطبيقَين على يمين الشاشة، ما يشير إلى أنّ تطبيق "أداة الاتصال" في موضع غير صحيح.

  11. انقر على شاشة البداية الخاصة بتطبيق الاتصال للاطّلاع على خصائصه. اطّلِع على خصائص التحويل في عرض المواقع المنظَّمة.

    تحويل السمات

    الشكل 17: تحويل السمات

    يتم تطبيق التحويل المحسوب على هذه المساحة، ولكن لا يتم ضبطه على هذا المستوى. تحتوي الأعمدة المحسوبة والمطلوبة على قيم مختلفة، ما يشير إلى أنّه يتم اكتساب التحويل من سطح رئيسي.

  12. أزِل العلامة من المربّع بجانب مسطّح في عرض التدرّج الهرمي لعرض شجرة التدرّج الهرمي بالكامل، وانتقِل إلى العقد الرئيسية لمساحة عرض التطبيق إلى أن تصبح عملية التحويل في كل من المُحسَّنة والمطلوبة متطابقة، ما يعرض عملية التحويل التي يتم طلبها على سطح Surface(name=Task=7934)/@0x1941191_transition-leash#40670.

  13. تأكَّد من وقت ضبط التحويل لأول مرة والقيمة التي تم ضبطها. يمكنك تصغير المواقع التي تمّت تصفيتها من خلال النقر على الرمز بجانب العنوان:

    تصغير المواقع التي تم اختيارها

    الشكل 18: اضغط على رمز التصغير بجانب المواقع التي تم اختيارها.

  14. انقر على عرض الاختلاف في عرض Proto Dump لتمييز السمات التي يتم تغييرها في هذا الإطار. اكتب transform في حقل البحث النصي لفلترة المواقع:

    عرض الاختلاف

    الشكل 19: عرض الاختلاف

    تم ضبط التحويل من IDENTITY إلى SCALE|TRANSLATE|ROT_270 في هذا الإطار للعنصر transition-leash.

    توضِّح هذه المعلومات أنّ الوميض حدث عند تطبيق التحويل على سلسلة الصور المتحركة لتطبيق "قائمة الاتصال" في وضع تقسيم الشاشة.

    تحديد وميض الشاشة

    الشكل 20: تحديد وميض الشاشة

  15. حدِّد في الرمز سبب ضبط هذا التحويل على قيد انتقال تقسيم الشاشة.