Winscope Perfetto ट्रेस में खास स्थितियां ढूंढने के लिए, SQL का इस्तेमाल करें. क्वेरी चलाने और टेबल में दिए गए नतीजों को विज़ुअलाइज़ करने के लिए, Winscope के यूज़र इंटरफ़ेस (यूआई) में ग्लोबल Search व्यूअर का इस्तेमाल करें:
पहली इमेज. 'दर्शक खोजें' टैब.
खोज व्यूअर की मदद से, Perfetto ट्रैस पर कस्टम एसक्यूएल क्वेरी लिखी और चलाई जा सकती हैं. साथ ही, हाल ही में की गई और सेव की गई क्वेरी भी ऐक्सेस की जा सकती हैं. Winscope, SurfaceFlinger, लेन-देन, ट्रांज़िशन, और ViewCapture ट्रेस को खोजने में मदद करने के लिए, खास SQL व्यू उपलब्ध कराता है.
सभी व्यू के लिए, इन नियमों का इस्तेमाल करें:
property
औरflat_property
कॉलम के लिए:- प्रॉपर्टी के नाम स्नेक केस में होते हैं. उदाहरण के लिए,
visible_region
fromLayerProto
. बिंदु वाला नोटेशन, नेस्ट की गई प्रॉपर्टी दिखाता है. उदाहरण के लिए,
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, ट्रैक से जुड़ी टेबल के डेटा को Perfetto args
टेबल के साथ जॉइन करके ये व्यू बनाता है.
इन टेबल से सीधे तौर पर क्वेरी की जा सकती है. 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 के एसक्यूएल व्यू
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
(अल्फा) बदलता है: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 टेबल की पंक्तियों को इस लेयर से जोड़ने के लिए इस्तेमाल किया जाने वाला आईडी |
लेन-देन का एसक्यूएल व्यू
लेन-देन का प्रोटो डेटा, TransactionTraceEntry
फ़ॉर्मैट का इस्तेमाल करता है.
लेन-देन का ट्रैक डेटा खोजने के लिए, transactions_search
व्यू का इस्तेमाल करें. इस व्यू में ये कॉलम शामिल होते हैं:
कॉलम | ब्यौरा |
---|---|
state_id |
उस एंट्री का लाइन आईडी जिससे प्रोटो प्रॉपर्टी जुड़ी है |
ts |
उस एंट्री का टाइमस्टैंप जिससे प्रोटो प्रॉपर्टी जुड़ी है |
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'
डेटा टेबल
लेन-देन का एसक्यूएल व्यू, इन टेबल का इस्तेमाल करके बनाया जाता है.
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 |
प्रोटो मैसेज से लिया गया ट्रांज़ैक्शन पीआईडी |
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
: कोई आर्ग्युमेंट नहीं
ट्रांज़िशन का एसक्यूएल व्यू
ट्रांज़िशन प्रोटो डेटा, ShellTransition
फ़ॉर्मैट का इस्तेमाल करता है.
ट्रांज़िशन डेटा खोजने के लिए, 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
डेटा टेबल
ट्रांज़िशन व्यू, इन टेबल का इस्तेमाल करके बनाया जाता है.
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 |
window_manager_shell_transitions के handler कॉलम में मौजूद वैल्यू से जुड़ा आईडी |
handler_name |
स्ट्रिंग का अनुवाद |
android_window_manager_shell_transition_participants
:
कॉलम | ब्यौरा |
---|---|
transition_id |
रॉ प्रोटो मैसेज से लिया गया ट्रांज़िशन आईडी |
layer_id |
SurfaceFlinger लेयर में हिस्सा लेने वाले व्यक्ति का आईडी |
window_id |
WindowManager कंटेनर में हिस्सा लेने वाले व्यक्ति का आईडी |
ViewCapture का SQL व्यू
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 |
स्टैकट्रैस (अगर उपलब्ध हो) |
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, '%');
क्वेरी चलाना
Search व्यूअर की बाईं ओर मौजूद, ग्लोबल सर्च पैनल का इस्तेमाल करके, खोज क्वेरी की जा सकती हैं.
ग्लोबल सर्च पैनल के साथ पहली बार इंटरैक्ट करने पर, ट्रेस सर्च शुरू हो जाती है और Winscope, हेल्पर SQL व्यू बनाता है. इसमें कुछ सेकंड लगते हैं. ट्रैक खोज शुरू होने के दौरान, टाइमलाइन उपलब्ध नहीं होती.
क्वेरी शुरू करने के लिए, खोज बॉक्स में क्वेरी लिखें और खोज क्वेरी चलाएं पर क्लिक करें या क्वेरी चलाने के लिए, अपने कीबोर्ड पर Enter दबाएं.
प्रोसेस पूरी होने के बाद, नतीजों की टेबल बीच वाले पैनल में दिखती है. आपकी क्वेरी, खोज बॉक्स के नीचे दिखती है. साथ ही, सेशन के बीच क्वेरी को सेव करने के लिए एक फ़ील्ड भी दिखता है.
सेव की गई क्वेरी को ऐक्सेस करने के लिए, बाईं ओर मौजूद पैनल में सेव की गई टैब पर क्लिक करें. साथ ही, हाल ही में चलाई गई क्वेरी को ऐक्सेस करने के लिए, हाल ही में टैब पर क्लिक करें:
दूसरी इमेज. दर्शक के बाएं पैनल में खोजें.
नतीजे
सभी क्वेरी, टेबल में नतीजे दिखाती हैं. ये नतीजे स्क्रोल किए जा सकने वाले व्यू में दिखते हैं. साथ ही, इनमें इंटरैक्टिव व्यवहार होता है. यह व्यवहार, लॉग पर आधारित ट्रैक व्यूअर जैसा होता है. जैसे, लेन-देन और ProtoLog:
तीसरी इमेज. Search Viewer के नतीजे.
अगर नतीजों वाली टेबल में ts
कॉलम है, तो उस कॉलम की वैल्यू को टाइमस्टैंप के तौर पर समझा जाता है और उन्हें टाइमलाइन ओवरले में एंट्री की नई लाइन के तौर पर जोड़ा जाता है. इस पंक्ति पर क्लिक करें और एंट्री के बीच नेविगेट करने के लिए, बाईं और दाईं ओर ऐरो बटन का इस्तेमाल करें:
चौथी इमेज. टाइमलाइन खोजें.