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

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

search viewer tab

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

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

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

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

    • نام ویژگی ها در حروف snake هستند، به عنوان مثال 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 از این فرمت‌ها استفاده می‌کنند:

  • داده های لایه در قالب 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 (alpha) تغییر می کند:

    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 شناسه ردیف ورودی که ویژگی 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'
    

جداول داده ها

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

surfaceflinger_transactions :

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

android_surfaceflinger_transaction :

ستون توضیحات
id شناسه ردیف برای تراکنش
snapshot_id شناسه ردیف ورودی از surfaceflinger_transactions که تراکنش به آن تعلق دارد
arg_set_id شناسه برای مرتبط کردن ردیف‌های جدول args با این تراکنش استفاده می‌شود
transaction_id شناسه تراکنش از پیام پروتو گرفته شده است
pid 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 اضافه می شوند:

  • LAYER_ADDED : قالب LayerCreationArgs
  • LAYER_CHANGED : قالب LayerState
  • DISPLAY_ADDED : فرمت DisplayState
  • DISPLAY_CHANGED : قالب DisplayState
  • LAYER_DESTROYED : بدون آرگ
  • LAYER_HANDLE_DESTROYED : ارگ وجود ندارد
  • DISPLAY_REMOVED : بدون آرگ
  • NOOP : بدون ارگ

نمای SQL انتقال

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

برای جستجوی داده‌های Transitions، از نمای 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

جداول داده ها

نمای 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 Transition 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، از نمای 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 با این نمای استفاده می‌شود

جدول ProtoLog SQL

داده های اولیه 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, '%');
    

کوئری ها را اجرا کنید

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

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

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

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

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

search viewer left panel

شکل 2. صفحه سمت چپ نمایشگر را جستجو کنید.

نتایج

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

search viewer results

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

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

search timeline

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