البحث عن عمليات التتبُّع

استخدِم SQL للعثور على حالات معيّنة في عمليات تتبُّع Winscope Perfetto. استخدِم أداة عرض البحث العامة في واجهة مستخدم Winscope لتنفيذ طلبات البحث وعرض النتائج في جداول:

علامة التبويب "المشاهدون الذين بحثوا عن محتوى مشابه"

الشكل 1. علامة التبويب "البحث في العارض"

يتيح لك عارض البحث كتابة طلبات بحث SQL مخصّصة وتنفيذها على عمليات تتبُّع Perfetto، بالإضافة إلى الوصول إلى طلبات البحث الأخيرة والمحفوظة. توفّر أداة Winscope طرق عرض SQL متخصّصة للمساعدة في البحث عن عمليات تتبُّع SurfaceFlinger والمعاملات وعمليات الانتقال وViewCapture.

استخدِم الاصطلاحات التالية لجميع طرق العرض:

  • بالنسبة إلى العمودَين property وflat_property:

    • تكون أسماء السمات بتنسيق snake case، مثل visible_region من LayerProto.
    • تمثّل صيغة النقطة المواقع المدمجة، على سبيل المثال، visible_region.rect.

    • يتم تمييز الحقول المتكرّرة في property باستخدام أقواس مربّعة:

      على سبيل المثال، ضمن مثيلَين من الحقل المتكرّر visible_region.rect، يتم تمثيل الحقل top بالقيمتَين visible_region.rect[0].top وvisible_region.rect[1].top.

    • الحقول المتكرّرة في flat_property غير قابلة للتمييز:

      على سبيل المثال، ضمن مثيلَين من الحقل المتكرّر visible_region.rect، يتم تمثيل الحقل top بواسطة visible_region.rect.top في كلا المثيلَين.

  • بالنسبة إلى العمودَين value وprevious_value، يتم تمثيل القيم المنطقية بالرمز 0 (False) أو 1 (True).

ينشئ Winscope هذه العروض من خلال ربط البيانات من الجداول الخاصة بالتتبُّع بجدول Perfettoargs. يمكنك الاستعلام عن هذه الجداول مباشرةً. في جدول args، يتشابه العمود key والعمود flat_key والعمود display_value مع أعمدة العرض property وflat_property وvalue على التوالي.

جدول args:

العمود الوصف
arg_set_id تُستخدَم لربط مجموعة من الوسيطات
flat_key اسم السمة من رسالة النموذج الأوّلي، بدون احتساب الحقول المتكرّرة
key اسم الموقع من رسالة proto، مع مراعاة الحقول المتكرّرة
value_type نوع قيمة الموقع
int_value قيمة السمة إذا كان نوع القيمة عددًا صحيحًا
string_value قيمة السمة إذا كان نوع القيمة سلسلة
real_value قيمة السمة إذا كان نوع القيمة حقيقيًا
display_value تحويل قيمة السمة إلى سلسلة

طرق عرض SQL في SurfaceFlinger

تستخدم بيانات SurfaceFlinger الأولية التنسيقات التالية:

  • تكون بيانات الطبقة بالتنسيق LayerProto.

  • تكون بيانات جذر التسلسل الهرمي بالتنسيق LayersSnapshotProto.

للبحث في بيانات الطبقة، استخدِم العرض sf_layer_search. تتضمّن طريقة العرض هذه الأعمدة التالية:

العمود الوصف
state_id رقم تعريف الصف للإدخال الذي تنتمي إليه الطبقة
ts الطابع الزمني للإدخال الذي تنتمي إليه الطبقة
layer_id رقم تعريف الطبقة
parent_id رقم تعريف الطبقة الرئيسية
layer_name اسم الطبقة
property اسم السمة التي تتضمّن حقولاً متكرّرة
flat_property اسم الموقع لا يراعي الحقول المتكرّرة
value قيمة السمة بتنسيق السلسلة
previous_value قيمة السمة من الإدخال السابق بتنسيق السلسلة

للبحث عن بيانات جذر التدرّج الهرمي، استخدِم العرض sf_hierarchy_root_search. يتضمّن هذا العرض الأعمدة التالية:

العمود الوصف
state_id معرّف الصف للإدخال
ts الطابع الزمني للإدخال
property اسم السمة التي تتضمّن حقولاً متكرّرة
flat_property اسم الموقع لا يراعي الحقول المتكرّرة
value قيمة السمة بتنسيق السلسلة
previous_value قيمة السمة من الإدخال السابق بتنسيق السلسلة

نماذج طلبات بحث

  • ابحث عن جميع اللقطات التي تحتوي فيها الطبقة IME على حدود شاشة صالحة:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND property='screen_bounds.bottom'
      AND value<='24000'
    
  • ابحث عن جميع اللقطات التي تتغيّر فيها Taskbar الطبقة color.a (قناة ألفا):

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'Taskbar%'
      AND property='color.a'
      AND value!=previous_value
    
  • ابحث عن جميع اللقطات التي يكون فيها الحد الأدنى Wallpaper أقل من أو يساوي 2400:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name LIKE 'Wallpaper%'
      AND property='bounds.bottom'
      AND cast_int!(value) <= 2400
    
  • أدرِج جميع السمات الخاصة بالشاشات التي تتضمّن حزمة طبقات صالحة:

    SELECT STATE.* FROM sf_hierarchy_root_search STATE_WITH_DISPLAY_ON
    INNER JOIN sf_hierarchy_root_search STATE
      ON STATE.state_id = STATE_WITH_DISPLAY_ON.state_id
      AND STATE_WITH_DISPLAY_ON.flat_property='displays.layer_stack'
      AND STATE_WITH_DISPLAY_ON.value!='4294967295'
      AND STATE.property LIKE CONCAT(
        SUBSTRING(
            STATE_WITH_DISPLAY_ON.property,
            0,
            instr(STATE_WITH_DISPLAY_ON.property, ']')
        ),
        '%'
      )
    
  • العثور على جميع اللقطات التي تظهر فيها إيماءة التمرير السريع للرجوع

    SELECT DISTINCT STATE.ts FROM sf_layer_search STATE
      WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
    

جداول البيانات

يتم إنشاء طرق عرض SurfaceFlinger باستخدام الجداول الأساسية التالية.

surfaceflinger_layers_snapshot:

العمود الوصف
id معرّف الصف للإدخال
ts الطابع الزمني للإدخال
arg_set_id المعرّف المستخدَم لربط الصفوف من الجدول args بهذا الإدخال

surfaceflinger_layer:

العمود الوصف
id معرّف الصف للطبقة
snapshot_id معرّف الصف للإدخال من surfaceflinger_layers_snapshot الذي تنتمي إليه الطبقة
arg_set_id المعرّف المستخدَم لربط الصفوف من الجدول args بهذه الطبقة

طريقة عرض SQL للمعاملات

تستخدم بيانات بروتوكول المعاملات التنسيق TransactionTraceEntry.

للبحث في بيانات تتبُّع المعاملات، استخدِم طريقة العرض transactions_search. يتضمّن هذا العرض الأعمدة التالية:

العمود الوصف
state_id معرّف الصف للإدخال الذي تنتمي إليه السمة الأولية
ts الطابع الزمني للإدخال الذي تنتمي إليه السمة الأولية
transaction_id معرّف المعاملة إذا كان متاحًا
property اسم السمة التي تتضمّن حقولاً متكرّرة
flat_property اسم الموقع لا يراعي الحقول المتكرّرة
value قيمة السمة بتنسيق السلسلة

نماذج طلبات بحث

  • ابحث عن الإطار الذي تم فيه تطبيق معاملة لتغيير موضع الطبقة x إلى -54.0:

    SELECT ts, transaction_id, value FROM transactions_search
      WHERE flat_property='transactions.layer_changes.x'
      AND value='-54.0'
    
  • ابحث عن الإطار الذي تمت إضافة طبقة ImeContainer إليه:

    SELECT ts FROM transactions_search
      WHERE flat_property='added_layers.name'
      AND value='ImeContainer'
    

جداول البيانات

يتم إنشاء طريقة عرض SQL للمعاملات باستخدام الجداول الأساسية التالية.

surfaceflinger_transactions:

العمود الوصف
id معرّف الصف للإدخال
ts الطابع الزمني للإدخال
arg_set_id المعرّف المستخدَم لربط الصفوف من الجدول args بهذا الإدخال
vsync_id معرّف VSync المرتبط بجميع المعاملات في هذا الإدخال

android_surfaceflinger_transaction:

العمود الوصف
id معرّف الصف للمعاملة
snapshot_id معرّف الصف للإدخال من surfaceflinger_transactions الذي تنتمي إليه المعاملة
arg_set_id المعرّف المستخدَم لربط الصفوف من جدول args بهذه المعاملة
transaction_id معرّف المعاملة مأخوذ من رسالة النموذج الأوّلي
pid معرّف المنتج الدائم للمعاملة مأخوذ من رسالة النموذج الأولي
uid معرّف UID للمعاملة مأخوذ من رسالة النموذج الأوّلي
layer_id معرّف الطبقة المرتبطة بالمعاملة، إذا كان ذلك منطبقًا
display_id معرّف الشاشة المرتبط بالمعاملة، إذا كان ذلك منطبقًا
flags_id المعرّف المستخدَم لاسترداد العلامات المرتبطة من android_surfaceflinger_transaction_flag
transaction_type نوع المعاملة

android_surfaceflinger_transaction_flag:

العمود الوصف
flags_id تتوافق مع القيمة في أحد الصفوف في android_surfaceflinger_transaction
flag سلسلة العلامات المترجَمة

تتم إضافة المعاملات الفردية إلى جدول args من تنسيقات مختلفة لرسائل proto استنادًا إلى نوع المعاملة:

  • LAYER_ADDED: LayerCreationArgs التنسيق
  • LAYER_CHANGED: LayerState التنسيق
  • DISPLAY_ADDED: DisplayState التنسيق
  • DISPLAY_CHANGED: DisplayState التنسيق
  • LAYER_DESTROYED: ما مِن وسيطات
  • LAYER_HANDLE_DESTROYED: ما مِن وسيطات
  • DISPLAY_REMOVED: ما مِن وسيطات
  • NOOP: ما مِن وسيطات

طريقة عرض SQL لعناصر الانتقال

تستخدم بيانات بروتوكول الانتقالات التنسيق ShellTransition.

للبحث في بيانات "عمليات الانتقال"، استخدِم العرض transitions_search. يتضمّن هذا العرض الأعمدة التالية:

العمود الوصف
ts وقت الإرسال، أو وقت الإرسال إذا كان متاحًا، وإلا 0
transition_id رقم تعريف الانتقال مأخوذ من رسالة النموذج الأوّلي
property اسم السمة التي تتضمّن حقولاً متكرّرة
flat_property اسم الموقع لا يراعي الحقول المتكرّرة
value معرّف UID للمعاملة مأخوذ من رسالة النموذج الأوّلي

نماذج طلبات بحث

ابحث عن خصائص عمليات الانتقال التي يتم التعامل معها من خلال DefaultMixedHandler:

  SELECT
    PROPS.ts,
    PROPS.transition_id,
    PROPS.property,
    PROPS.value
  FROM transitions_search HANDLER_MATCH
  INNER JOIN transitions_search PROPS
    ON HANDLER_MATCH.transition_id = PROPS.transition_id
  WHERE HANDLER_MATCH.property = 'handler'
    AND HANDLER_MATCH.value LIKE "%DefaultMixedHandler"
  ORDER BY PROPS.transition_id, PROPS.property

جداول البيانات

يتم إنشاء طريقة العرض "عمليات الانتقال" باستخدام الجداول الأساسية التالية.

window_manager_shell_transitions:

العمود الوصف
id معرّف الصف لعملية النقل
ts وقت الإرسال، أو وقت الإرسال إذا كان متاحًا، وإلا 0
transition_id رقم تعريف الانتقال مأخوذ من رسالة النموذج الأوّلي
arg_set_id المعرّف المستخدَم لربط الصفوف من جدول args بهذا الانتقال
transition_type نوع الانتقال مأخوذ من رسالة النموذج الأوّلي
send_time_ns وقت إرسال الانتقال مأخوذ من رسالة النموذج الأوّلي
dispatch_time_ns وقت إرسال الانتقال مأخوذ من رسالة النموذج الأوّلي
duration_ns مدة الانتقال، إذا كان وقت البدء ووقت الانتهاء متاحَين
handler معالج الانتقال: استرداد الترجمة من window_manager_shell_transition_handlers
status حالة الانتقال: played أو merged أو aborted
flags علامات الانتقال مأخوذة من رسالة النموذج الأوّلي

window_manager_shell_transition_handlers:

العمود الوصف
handler_id المعرّف الذي يتوافق مع القيمة في العمود handler من window_manager_shell_transitions
handler_name ترجمة السلاسل

android_window_manager_shell_transition_participants:

العمود الوصف
transition_id معرّف الانتقال مأخوذ من رسالة النموذج الأوّلي الأولية
layer_id معرّف المشارك في طبقة SurfaceFlinger
window_id معرّف المشارك في حاوية WindowManager

طريقة عرض ViewCapture SQL

تستخدم بيانات ViewCapture الأولية التنسيق View.

للبحث في بيانات ViewCapture، استخدِم العرض viewcapture_search. يتضمّن هذا العرض الأعمدة التالية:

العمود الوصف
state_id رقم تعريف الصف الخاص بالولاية التي ينتمي إليها العرض
ts الطابع الزمني للحالة التي تنتمي إليها طريقة العرض
package_name اسم الحزمة
window_name اسم النافذة
class_name عرض اسم الصف
property اسم السمة التي تتضمّن حقولاً متكرّرة
flat_property اسم الموقع لا يراعي الحقول المتكرّرة
value قيمة السمة بتنسيق السلسلة
previous_value قيمة السمة من الحالة السابقة بتنسيق السلسلة

نماذج طلبات بحث

ابحث عن جميع الحالات عندما يتحرّك SearchContainerView في الاتجاه y:

  SELECT * FROM viewcapture_search
  WHERE class_name LIKE '%SearchContainerView'
    AND flat_property='translation_y'
    AND value!=previous_value

جداول البيانات

يتم إنشاء طريقة العرض ViewCapture باستخدام الجداول الأساسية التالية.

android_viewcapture:

العمود الوصف
id معرّف الصف للإدخال
ts الطابع الزمني للإدخال
arg_set_id المعرّف المستخدَم لربط الصفوف من الجدول args بهذا الإدخال

android_viewcapture_view:

العمود الوصف
id معرّف الصف للعرض
snapshot_id رقم تعريف الصف للإدخال من android_viewcapture الذي ينتمي إليه العرض
arg_set_id المعرّف المستخدَم لربط الصفوف من جدول args بهذا العرض

جدول SQL الخاص بـ ProtoLog

تستخدم بيانات ProtoLog الأولية التنسيق ProtoLogMessage. تتضمّن طريقة العرض هذه الأعمدة التالية:

العمود الوصف
ts الطابع الزمني للسجلّ
level مستوى السجلّ
tag علامة مجموعة التسجيل
message رسالة السجلّ
stacktrace تتبُّع تسلسل استدعاء الدوال البرمجية (إذا كان متاحًا)
location موقع الرمز الذي تنشأ منه الرسالة

نماذج طلبات بحث

  • للبحث عن جميع السجلّات التي تتضمّن رسالة تحتوي على transition:

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • ابحث عن جميع السجلات التي تحتوي على معرّفات معاملات صالحة:

    CREATE PERFETTO VIEW valid_tx_ids AS
      SELECT DISTINCT transaction_id FROM transactions_search
      WHERE transaction_id IS NOT NULL AND transaction_id != '0';
    
    SELECT TRANS.transaction_id, message FROM valid_tx_ids TRANS
    INNER JOIN protolog LOGS
      ON LOGS.message LIKE CONCAT('%', TRANS.transaction_id, '%');
    

تنفيذ طلبات البحث

يمكنك تنفيذ طلبات بحث باستخدام لوحة البحث العام على يمين عارض البحث.

عندما تتفاعل لأول مرة مع لوحة البحث العام، يتم بدء البحث بالتتبُّع، وينشئ Winscope طرق عرض SQL المساعدة. يستغرق هذا الإجراء بضع ثوانٍ. أثناء تهيئة عملية البحث عن الأخطاء، لا يتوفّر المخطط الزمني.

لبدء طلب بحث، اكتب طلب بحث في مربّع البحث وانقر على تنفيذ طلب البحث أو اضغط على Enter في لوحة المفاتيح لتنفيذه.

عند الانتهاء، يظهر جدول النتائج في اللوحة الوسطى. يظهر طلب البحث أسفل مربّع البحث، مع حقل لحفظ طلب البحث بين الجلسات.

يمكنك الوصول إلى طلبات البحث المحفوظة من خلال النقر على علامة التبويب محفوظة في اللوحة اليمنى، ويمكنك الوصول إلى طلبات البحث التي تم تنفيذها مؤخرًا من خلال النقر على علامة التبويب الأخيرة:

اللوحة اليمنى في عارض البحث

الشكل 2. اللوحة اليمنى في عارض البحث

النتائج

تعرض جميع طلبات البحث نتائج مجدولة، وتظهر في عرض قابل للتمرير مع سلوك تفاعلي مشابه لعارضات التتبّع المستندة إلى السجلّ، مثل "المعاملات" وProtoLog:

نتائج &quot;أداة فحص البحث&quot;

الشكل 3. نتائج "عارض البحث"

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

المخطط الزمني للبحث

الشكل 4 مخطط البحث الزمني