खोज को ट्रेस करना

Winscope Perfetto ट्रेस में खास स्थितियां ढूंढने के लिए, SQL का इस्तेमाल करें. क्वेरी चलाने और टेबल में दिए गए नतीजों को विज़ुअलाइज़ करने के लिए, Winscope के यूज़र इंटरफ़ेस (यूआई) में ग्लोबल Search व्यूअर का इस्तेमाल करें:

दर्शक टैब खोजें

पहली इमेज. 'दर्शक खोजें' टैब.

खोज व्यूअर की मदद से, Perfetto ट्रैस पर कस्टम एसक्यूएल क्वेरी लिखी और चलाई जा सकती हैं. साथ ही, हाल ही में की गई और सेव की गई क्वेरी भी ऐक्सेस की जा सकती हैं. Winscope, SurfaceFlinger, लेन-देन, ट्रांज़िशन, और ViewCapture ट्रेस को खोजने में मदद करने के लिए, खास SQL व्यू उपलब्ध कराता है.

सभी व्यू के लिए, इन नियमों का इस्तेमाल करें:

  • property और flat_property कॉलम के लिए:

    • प्रॉपर्टी के नाम स्नेक केस में होते हैं. उदाहरण के लिए, visible_region from 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, ट्रैक से जुड़ी टेबल के डेटा को 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 कॉलम है, तो उस कॉलम की वैल्यू को टाइमस्टैंप के तौर पर समझा जाता है और उन्हें टाइमलाइन ओवरले में एंट्री की नई लाइन के तौर पर जोड़ा जाता है. इस पंक्ति पर क्लिक करें और एंट्री के बीच नेविगेट करने के लिए, बाईं और दाईं ओर ऐरो बटन का इस्तेमाल करें:

खोज की टाइमलाइन

चौथी इमेज. टाइमलाइन खोजें.