از 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'پیدا کردن همه قابهایی که در آنها لایه
Taskbarcolor.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: قالبLayerStateDISPLAY_ADDED: قالبDisplayStateDISPLAY_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 را جستجو کنید، ازجمله:
DisplayContentProtoDisplayAreaProtoTaskProtoActivityRecordProtoWindowTokenProtoWindowStateProtoTaskFragmentProtoWindowContainerProto
برای جستجوی دادههای 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 باشد، مقادیر آن ستون بهعنوان مُهر زمان تفسیر میشوند و بهعنوان ردیف جدیدی از ورودیها به رونهاد خط زمان اضافه میشوند. روی این ردیف کلیک کنید و از کلیدهای راستبر و چپبر برای پیمایش
بین ورودیها استفاده کنید:
شکل ۴. جستجوی خط زمان.