از SQL برای یافتن حالت های خاص در ردیابی های Winscope Perfetto استفاده کنید. از نمایشگر جستجوی جهانی در رابط کاربری Winscope برای اجرای پرس و جوها و تجسم نتایج جدول بندی شده استفاده کنید:
شکل 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
در هر دو نمونه نشان داده می شود.
- نام ویژگی ها در حروف snake هستند، به عنوان مثال
برای ستونهای
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 را روی صفحه کلید خود فشار دهید تا آن را اجرا کنید.
پس از اتمام، جدول نتایج در پانل میانی نشان داده می شود. درخواست شما در زیر کادر جستجو ظاهر می شود، با فیلدی برای ذخیره پرس و جو بین جلسات.
میتوانید با کلیک کردن روی برگه ذخیرهشده در پانل سمت چپ به درخواستهای ذخیرهشده دسترسی داشته باشید و با کلیک کردن روی برگه اخیر به سؤالات اخیراً اجرا شده دسترسی پیدا کنید:
شکل 2. صفحه سمت چپ نمایشگر را جستجو کنید.
نتایج
همه جستارها نتایج جدولبندی شده را برمیگردانند که در یک نمای پیمایشی با رفتار تعاملی شبیه به نمایشگرهای ردیابی مبتنی بر گزارش، مانند Transactions و ProtoLog نشان داده شدهاند:
شکل 3. جستجوی نتایج بیننده.
اگر جدول به دست آمده حاوی یک ستون ts
باشد، مقادیر آن ستون به عنوان مهر زمانی تفسیر شده و به عنوان یک ردیف جدید از ورودی ها به همپوشانی خط زمانی اضافه می شود. روی این ردیف کلیک کنید و از کلیدهای جهت دار چپ و راست برای پیمایش بین ورودی ها استفاده کنید:
شکل 4. جدول زمانی جستجو.