از SQL برای یافتن حالتهای خاص در ردپاهای Winscope Perfetto استفاده کنید. نمایشگر جستجوی سراسری در رابط کاربری Winscope به شما امکان میدهد پرسوجوها را اجرا کنید و نتایج جدولبندی شده را تجسم کنید:
شکل ۱. برگه نمایشگر جستجو.
نمایشگر جستجو به شما امکان میدهد کوئریهای 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
نمایش داده میشود.
- نام ویژگیها به صورت حروف کوچک (snake case) است، برای مثال
برای ستونهای
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 را جستجو کنید، از جمله:
-
DisplayContentProto
-
DisplayAreaProto
-
TaskProto
-
ActivityRecordProto
-
WindowTokenProto
-
WindowStateProto
-
TaskFragmentProto
-
WindowContainerProto
برای جستجوی دادههای 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 به کوئریهای اخیراً اجرا شده دسترسی پیدا کنید:
شکل ۲. پنل سمت چپ نمایشگر جستجو.
نتایج
همه پرسوجوها نتایج جدولبندیشدهای را برمیگردانند که در یک نمای قابل اسکرول با رفتار تعاملی مشابه نمایشگرهای ردیابی مبتنی بر لاگ، مانند Transactions و ProtoLog، نشان داده میشوند:
شکل ۳. نتایج نمایش جستجو.
اگر جدول حاصل شامل یک ستون ts
باشد، مقادیر موجود در آن ستون به عنوان مهرهای زمانی تفسیر میشوند و به عنوان یک ردیف جدید از ورودیها به پوشش جدول زمانی اضافه میشوند. روی این ردیف کلیک کنید و از کلیدهای جهت چپ و راست خود برای حرکت بین ورودیها استفاده کنید:
شکل ۴. جدول زمانی جستجو.