جستجوی ردیابی

از SQL برای یافتن وضعیت‌های خاص در ردپاهای Winscope Perfetto استفاده کنید. نمای کلی جستجو در میانای کاربری Winscope به شما امکان می‌دهد پرسمان‌ها را اجرا کنید و نتایج جدول‌بندی‌شده را تجسم کنید:

زبانه جستجوی بیننده

شکل ۱. برگه نظاره‌گر جستجو.

بیننده جستجو به شما امکان می‌دهد پُرسمان‌های SQL سفارشی را روی ردهای Perfetto بنویسید و اجرا کنید. همچنین می‌توانید به پُرسمان‌های اخیر و ذخیره‌شده دسترسی داشته باشید. Winscope نماهای SQL تخصصی ارائه می‌دهد تا به شما در جستجوی ردگیری‌های SurfaceFlinger،‏ Transactions،‏ Transitions، و ViewCapture کمک کند.

برای همه نماها از قراردادهای زیر استفاده کنید:

  • برای property و flat_property ستون:

    • نام‌های دارایی به‌صورت نگارش ماری است، برای مثال 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 این نماها را با پیوستن داده‌ها از جدول‌های ردیابی خاص با جدول args Perfetto ایجاد می‌کند. می‌توانید مستقیماً این جدول‌ها را پُرسمان کنید. در جدول args، ستون‌های key، flat_key، و display_value به‌ترتیب مشابه ستون‌های نمای property، flat_property، و value هستند.

جدول args:

ستون شرح
arg_set_id برای مرتبط کردن مجموعه‌ای از آرگومان‌ها استفاده می‌شود
flat_key نام دارایی از پیام اولیه، بدون درنظر گرفتن فیلدهای تکراری
key نام دارایی از پیام اولیه، با درنظر گرفتن فیلدهای تکراری
value_type نوع مقدار دارایی
int_value مقدار دارایی اگر نوع مقدار عدد صحیح باشد
string_value مقدار دارایی اگر نوع مقدار رشته باشد
real_value مقدار دارایی اگر نوع مقدار حقیقی باشد
display_value مقدار دارایی به رشته تبدیل شد

نماهای SurfaceFlinger SQL

داده‌های SurfaceFlinger proto از این قالب‌ها استفاده می‌کند:

  • داده‌های لایه در قالب LayerProto است.
  • داده‌های ریشه سلسله‌مراتب در قالب LayersSnapshotProto است.

برای جستجوی داده‌های لایه، از نمای sf_layer_search استفاده کنید. این نما شامل این ستون‌ها است:

ستون شرح
state_id شناسه ردیف ورودی‌ای که لایه به آن تعلق دارد
ts مُهر زمان ورودی که لایه به آن تعلق دارد
layer_id شناسه لایه
parent_id شناسه لایه ولی
layer_name نام لایه
is_visible رؤیت‌پذیری لایه
property نام دارایی برای فیلدهای تکراری درنظر گرفته می‌شود
flat_property نام دارایی برای فیلدهای تکراری درنظر گرفته نشده است
value مقدار دارایی در قالب رشته
previous_value مقدار دارایی از ورودی قبلی در قالب رشته

برای جستجوی داده‌های ریشه سلسله‌مراتب، از نمای sf_hierarchy_root_search استفاده کنید. این نمای شامل این ستون‌ها است:

ستون شرح
state_id شناسه ردیف ورودی
ts مُهر زمان ورودی
property نام دارایی برای فیلدهای تکرارشونده
flat_property نام دارایی برای فیلدهای تکراری درنظر گرفته نشده است
value مقدار دارایی در قالب رشته
previous_value مقدار دارایی از ورودی قبلی در قالب رشته

نمونه پُرسمان‌ها

  • پیدا کردن همه قاب‌هایی که لایه IME در آن‌ها نمایان است:

    SELECT DISTINCT ts, layer_id, layer_name FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND is_visible=1
    
  • پیدا کردن همه قاب‌هایی که لایه 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 کمتر یا مساوی با ۲۴۰۰ است:

    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 را به -۵۴٫۰ تغییر دهد:

    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 ‫PID تراکنش از پیام پروتکل گرفته شد
uid «شناسه یکتای تراکنش» از پیام پروتکل گرفته شد
layer_id شناسه لایه منسوب به تراکنش، درصورت وجود
display_id شناسه نمایشگر مرتبط با تراکنش، درصورت وجود
flags_id شناسه استفاده‌شده برای بازیابی پرچم‌های مرتبط از android_surfaceflinger_transaction_flag
transaction_type نوع تراکنش

android_surfaceflinger_transaction_flag:

ستون شرح
flags_id مطابق با مقدار در ردیفی در android_surfaceflinger_transaction
flag رشته پرچم‌گذاری ترجمه‌شده

تراکنش‌های فردی براساس نوع تراکنش از قالب‌های مختلف پیام اولیه به جدول args اضافه می‌شوند:

  • ‫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 شناسه انتقال از پیام proto گرفته شده است
property نام دارایی برای فیلدهای تکرارشونده
flat_property نام دارایی برای فیلدهای تکراری درنظر گرفته نمی‌شود
value «شناسه یکتای تراکنش» از پیام پروتکل گرفته شد

پُرسمان‌های نمونه

خصوصیت‌های انتقال‌های انجام‌شده توسط 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 نوع گذار از پیام proto گرفته شده است
send_time_ns زمان ارسال انتقال از پیام proto گرفته شده است
dispatch_time_ns زمان اعزام انتقال از پیام اولیه گرفته شد
duration_ns مدت زمان گذار، درصورت دردسترس بودن زمان شروع و پایان
handler Transition handler: retrieve translation from 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 proto از قالب 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 proto از قالب 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, '%');
    

نمای WindowManager SQL

داده‌های WindowManager proto از قالب WindowManagerServiceDumpProto سلسله‌مراتبی استفاده می‌کند. می‌توانید ویژگی‌های هر محفظه WindowManager را جستجو کنید، ازجمله:

برای جستجوی داده‌های WindowManager، از نمای wm_search استفاده کنید. این نما شامل این ستون‌ها است:

ستون شرح
state_id شناسه ردیف ایالتی که ظرف به آن تعلق دارد
ts مُهر زمان وضعیت متعلق به محتوی
title عنوان محتوی
token داده‌واحد محتوی
parent_token کد محتوی ولی
is_visible رؤیت‌پذیری محتوی
property نام دارایی برای فیلدهای تکراری درنظر گرفته می‌شود
flat_property نام دارایی برای فیلدهای تکراری درنظر گرفته نشده است
value مقدار دارایی در قالب رشته
previous_value مقدار خصوصیت از وضعیت قبلی در قالب رشته

نمونه پُرسمان‌ها

  • همه ایالت‌هایی را که LauncherActivity در آن‌ها نمایان است پیدا کنید:

    SELECT DISTINCT ts, title, token FROM wm_search
      WHERE title like '%LauncherActivity%'
      AND is_visible=1
    
  • همه ایالت‌هایی را که سطح Wallpaper در آن‌ها درحال حرکت است پیدا کنید:

    SELECT ts, value, previous_value FROM wm_search
      WHERE title like '%Wallpaper%'
      AND property like '%surface_position%'
      AND value != previous_value
    

جدول‌های داده

نمای WindowManager بااستفاده از جدول‌های زیرین زیر ایجاد می‌شود.

android_windowmanager:

ستون شرح
id شناسه ردیف برای ورودی
ts مُهر زمان ورودی
arg_set_id شناسه استفاده‌شده برای مرتبط کردن ردیف‌های جدول args با این ورودی

android_windowmanager_windowcontainer:

ستون شرح
id شناسه ردیف برای محتوی
snapshot_id شناسه ردیف ورودی از android_windowmanager که محفظه به آن تعلق دارد
arg_set_id شناسه استفاده‌شده برای مرتبط کردن ردیف‌های جدول args با این نما

اجرای پُرسمان‌ها

می‌توانید بااستفاده از پانل جستجوی سراسری در سمت چپ نمایشگر جستجو، پرسمان‌های جستجو را اجرا کنید.

وقتی برای اولین‌بار با پانل جستجوی سراسری تعامل برقرار می‌کنید، جستجوی ردگیری مقداردهی اولیه می‌شود و Winscope نماهای SQL کمکی را ایجاد می‌کند. این کار چند ثانیه طول می‌کشد. تا زمانی که جستجوی ردیابی درحال مقداردهی اولیه است، خط زمان دردسترس نیست.

برای شروع یک پُرسمان، پُرسمانی را در چارگوش جستجو بنویسید و روی اجرای پُرسمان جستجو کلیک کنید یا کلید Enter را روی صفحه‌کلید فشار دهید تا اجرا شود.

پس‌از اتمام، جدول نتایج در پانل میانی نشان داده می‌شود. پرسمان شما در زیر چارگوش جستجو نشان داده می‌شود و فیلدی برای ذخیره کردن پرسمان بین جلسه‌ها وجود دارد.

با کلیک کردن روی برگه ذخیره‌شده در پانل سمت راست، می‌توانید به پُرسمان‌های ذخیره‌شده دسترسی پیدا کنید، و با کلیک کردن روی برگه اخیر، می‌توانید به پُرسمان‌هایی که اخیراً اجرا شده‌اند دسترسی پیدا کنید:

پانل سمت راست نمایشگر جستجو

شکل ۲. جستجوی پانل سمت راست نمایشگر.

نتایج

همه پُرسمان‌ها نتایج جدول‌بندی‌شده را برمی‌گردانند که در نمای پیمایشی با رفتار تعاملی مشابه با نمایشگرهای ردیابی مبتنی بر گزارش، مانند «تراکنش‌ها» و ProtoLog، نشان داده می‌شود:

نتایج نمایشگر جستجو

شکل ۳. نتایج جستجوی بیننده.

اگر جدول حاصل حاوی ستون ts باشد، مقادیر آن ستون به‌عنوان مُهر زمان تفسیر می‌شوند و به‌عنوان ردیف جدیدی از ورودی‌ها به رونهاد خط زمان اضافه می‌شوند. روی این ردیف کلیک کنید و از کلیدهای راست‌بر و چپ‌بر برای پیمایش بین ورودی‌ها استفاده کنید:

خط زمان جستجو

شکل ۴. جستجوی خط زمان.