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

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

search viewer tab

شکل ۱. برگه نمایشگر جستجو.

نمایشگر جستجو به شما امکان می‌دهد کوئری‌های SQL سفارشی را روی ردپاهای Perfetto بنویسید و اجرا کنید. همچنین می‌توانید به کوئری‌های اخیر و ذخیره شده دسترسی داشته باشید. Winscope نماهای SQL تخصصی را برای کمک به شما در جستجوی ردپاهای SurfaceFlinger، Transactions، Transitions و 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 این نماها را با اتصال داده‌ها از جداول مخصوص ردیابی با جدول args به Perfetto ایجاد می‌کند. می‌توانید مستقیماً از این جداول پرس‌وجو کنید. در جدول args ، ستون‌های key ، flat_key و display_value به ترتیب مشابه ستون‌های view property ، flat_property و value هستند.

جدول args :

ستون توضیحات
arg_set_id برای مرتبط کردن مجموعه‌ای از آرگومان‌ها استفاده می‌شود.
flat_key نام ویژگی از پیام اولیه، بدون در نظر گرفتن فیلدهای تکراری
key نام ویژگی از پیام اولیه، با در نظر گرفتن فیلدهای تکراری
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 نام لایه
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 (alpha) تغییر می‌کند، پیدا کنید:

    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 شناسه ردیف ورودی که ویژگی proto به آن تعلق دارد
ts مهر زمانی ورودی که ویژگی proto به آن تعلق دارد
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 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 مربوط به Transitionها

داده‌های اولیه‌ی transitions از فرمت ShellTransition استفاده می‌کنند.

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

ستون توضیحات
ts زمان ارسال؛ در صورت موجود بودن، به زمان ارسال برمی‌گردد، در غیر این صورت 0
transition_id شناسه انتقال از پیام اولیه گرفته شده است
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

جداول داده

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

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

نمای SQL ViewCapture

داده‌های اولیه ViewCapture از فرمت View استفاده می‌کنند.

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

ستون توضیحات
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 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, '%');
    

نمای SQL در WindowManager

داده‌های اولیه‌ی WindowManager از قالب سلسله مراتبی 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 با این نما استفاده شده است

اجرای کوئری‌ها

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

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

برای شروع یک پرس‌وجو، یک پرس‌وجو در کادر جستجو بنویسید و روی اجرای پرس‌وجوی جستجو کلیک کنید یا کلید Enter را روی صفحه کلید خود فشار دهید تا آن را اجرا کنید.

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

شما می‌توانید با کلیک روی تب Saved در پنل سمت چپ، به کوئری‌های ذخیره شده دسترسی پیدا کنید و با کلیک روی تب Recent به کوئری‌های اخیراً اجرا شده دسترسی پیدا کنید:

search viewer left panel

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

نتایج

همه پرس‌وجوها نتایج جدول‌بندی‌شده‌ای را برمی‌گردانند که در یک نمای قابل اسکرول با رفتار تعاملی مشابه نمایشگرهای ردیابی مبتنی بر لاگ، مانند Transactions و ProtoLog، نشان داده می‌شوند:

search viewer results

شکل ۳. نتایج نمایش جستجو.

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

search timeline

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