adb कमांड की मदद से ट्रेस कैप्चर करना

Winscope के ट्रैक, डीबग बिल्ड (userdebug और eng बिल्ड) पर adb कमांड लाइन की मदद से इकट्ठा किए जा सकते हैं. adb की मदद से Winscope के ट्रेस इकट्ठा करने से पहले, adb root चलाएं.

Android 15 से, Winscope ट्रैस को Perfetto में इंटिग्रेट किया गया है. साथ ही, इन्हें Perfetto कमांड लाइन का इस्तेमाल करके इकट्ठा किया जाता है. हर Winscope ट्रेस, Perfetto का एक डेटा सोर्स होता है, जिसमें अपना कॉन्फ़िगरेशन होता है. कॉन्फ़िगरेशन को अलग-अलग या एक ट्रैकिंग सेशन में चालू किया जा सकता है.

Android 14 और उससे पहले के वर्शन में, हर Winscope ट्रेस के लिए अलग-अलग कमांड होता है. साथ ही, हर ट्रेस को अलग से इकट्ठा किया जा सकता है. ज़्यादा जानकारी के लिए, Android 14 और उससे पहले के वर्शन में ट्रैक रिकॉर्ड करना देखें.

WindowManager

इस तरह के ट्रेस के लिए, डेटा सोर्स का नाम android.windowmanager इस्तेमाल करें.

कॉन्फ़िगरेशन के विकल्प

  • लॉग लेवल (log_level): इससे लॉग में दी गई जानकारी के बारे में पता चलता है. इस्तेमाल की जा सकने वाली वैल्यू:

    • LOG_LEVEL_VERBOSE: ज़्यादा से ज़्यादा जानकारी वाले सभी एलिमेंट को लॉग करता है.
    • LOG_LEVEL_DEBUG: सभी एलिमेंट को लॉग करता है, लेकिन सभी कॉन्फ़िगरेशन डेटा को नहीं लिखता.
    • LOG_LEVEL_CRITICAL: सिर्फ़ दिखने वाले एलिमेंट को लॉग करता है. इससे परफ़ॉर्मेंस पर कम से कम असर पड़ता है.
  • लॉग करने की फ़्रीक्वेंसी (log_frequency): इससे यह तय होता है कि आइटम कितनी बार लॉग किए जाएंगे:

    • LOG_FREQUENCY_FRAME: फ़्रेम को कमिट करने पर, स्टेटस के स्नैपशॉट को ट्रैक करता है.
    • LOG_FREQUENCY_TRANSACTION: हर बार लेन-देन होने पर, स्टेटस के स्नैपशॉट को ट्रैक करता है.
    • LOG_FREQUENCY_SINGLE_DUMP: डेटा सोर्स शुरू होने पर, एक स्टेटस के स्नैपशॉट को ट्रैक करता है.

कॉन्फ़िगरेशन वैल्यू के बारे में जानकारी के लिए, WindowManager देखें.

उदाहरण

यहां adb के लिए WindowManager ट्रैक टाइप का उदाहरण दिया गया है:

$ adb shell -t perfetto \
     -c - --txt \
     -o /data/misc/perfetto-traces/trace \
   <<EOF
   unique_session_name: "my_custom_session"
   buffers: {
       size_kb: 63488
       fill_policy: RING_BUFFER
   }
   data_sources: {
       config {
           name: "android.windowmanager"
           windowmanager_config: {
              log_level: LOG_LEVEL_VERBOSE
              log_frequency: LOG_FREQUENCY_TRANSACTION
           }
       }
   }
EOF

ProtoLog

इस तरह के ट्रेस के लिए, डेटा सोर्स का नाम android.protolog इस्तेमाल करें.

कॉन्फ़िगरेशन के विकल्प

ट्रैकिंग मोड (tracing_mode): यह तय करता है कि किस लॉग कॉन्फ़िगरेशन का इस्तेमाल करना है:

  • DEFAULT: सिर्फ़ group_overrides में बताए गए लॉग ग्रुप और लेवल को ट्रैक करता है.
  • ENABLE_ALL: सभी लॉग ग्रुप और लेवल को ट्रैक करता है. हालांकि, ऐसा तब तक नहीं होता, जब तक कि group_overrides में इसके लिए कोई निर्देश न दिया गया हो.

लॉग का कम से कम लेवल (default_log_from_level): अगर यह सेट है, तो इस लेवल या इससे ज़्यादा के लॉग लेवल वाले किसी भी मैसेज को तब तक ट्रैक किया जाता है, जब तक कि ग्रुप के लिए कोई बदलाव नहीं किया जाता. उदाहरण के लिए, इसका इस्तेमाल सभी लॉग को चालू किए बिना, सभी चेतावनियों और गड़बड़ियों को लॉग करने के लिए किया जाता है. इन वैल्यू का इस्तेमाल किया जा सकता है:

  • PROTOLOG_LEVEL_DEBUG
  • PROTOLOG_LEVEL_VERBOSE
  • PROTOLOG_LEVEL_INFO
  • PROTOLOG_LEVEL_WARN
  • PROTOLOG_LEVEL_ERROR
  • PROTOLOG_LEVEL_WTF

ग्रुप बदलाव (group_overrides): हर ProtoLog ग्रुप के लिए, लॉग लेवल को मैन्युअल तरीके से कॉन्फ़िगर करने की सुविधा चालू करता है. हर ग्रुप में ये शामिल हैं:

  • name: ProtoLog ग्रुप का नाम, जिसका इस्तेमाल Android सोर्स कोड में किया जाता है.
  • log_from: default_log_from_level जैसा ही, लेकिन सिर्फ़ मौजूदा ग्रुप के लिए तय किया गया.
  • collect_stacktrace: true पर सेट होने पर, ट्रैक किए जा रहे ग्रुप में मौजूद हर ProtoLog मैसेज के लिए स्टैक ट्रेस इकट्ठा करता है.

उदाहरण

यहां adb के लिए ProtoLog ट्रैक टाइप का उदाहरण दिया गया है:

$ adb shell -t perfetto \
     -c - --txt \
     -o /data/misc/perfetto-traces/trace \
   <<EOF
   unique_session_name: "my_custom_session"
   buffers: {
       size_kb: 63488
       fill_policy: RING_BUFFER
   }
   data_sources: {
       config {
           name: "android.protolog"
           protolog_config: {
              tracing_mode: DEFAULT
              default_log_from_level: PROTOLOG_LEVEL_WARN
              group_overrides: {
                 group_name: "WM_SHELL_STARTING_WINDOW"
                 log_from: PROTOLOG_LEVEL_DEBUG
                 collect_stacktrace: true
              }
           }
       }
   }
EOF

टेक्स्ट लिखो

इस तरह के ट्रेस के लिए, डेटा सोर्स का नाम android.input.inputevent इस्तेमाल करें.

कॉन्फ़िगरेशन के विकल्प

ट्रैक मोड (trace_mode): इससे यह तय होता है कि निजता बनाए रखने के नियमों का इस्तेमाल करके इनपुट ट्रैक शुरू किया जाना चाहिए या सभी इनपुट इवेंट रिकॉर्ड किए जाने चाहिए:

  • TRACE_MODE_TRACE_ALL: सिस्टम से प्रोसेस किए गए सभी इनपुट इवेंट को रिकॉर्ड करता है. इससे कोई फ़र्क़ नहीं पड़ता कि इन्हें किस संदर्भ में प्रोसेस किया गया था.
  • TRACE_MODE_USE_RULES: यह इस कॉन्फ़िगरेशन में बताए गए ट्रैकिंग नियमों का इस्तेमाल करके, यह तय करता है कि किन इवेंट को ट्रैक करना है. ट्रैक के नियमों के बारे में ज़्यादा जानने के लिए, android_input_event_config.proto देखें.

उदाहरण

adb के लिए इनपुट ट्रेस टाइप का उदाहरण यहां दिया गया है:

$ adb shell -t perfetto \
     -c - --txt \
     -o /data/misc/perfetto-traces/trace \
   <<EOF
   unique_session_name: "my_custom_session"
   buffers: {
       size_kb: 63488
       fill_policy: RING_BUFFER
   }
   data_sources: {
       config {
           name: "android.input.inputevent"
           android_input_event_config: {
              mode: TRACE_MODE_TRACE_ALL
           }
       }
   }
EOF

SurfaceFlinger (लेयर)

इस तरह के ट्रेस के लिए, डेटा सोर्स का नाम android.surfaceflinger.layers इस्तेमाल करें.

कॉन्फ़िगरेशन के विकल्प

ट्रैकिंग मोड (mode): इससे यह तय होता है कि आइटम कितनी फ़्रीक्वेंसी पर लॉग किए जाएं:

  • MODE_ACTIVE: लेयर के स्नैपशॉट को ट्रैक करता है. लेयर में हर बार बदलाव होने पर, एक स्नैपशॉट लिया जाता है.
  • MODE_GENERATED: SurfaceFlinger के इंटरनल रिंग बफ़र में रखे गए लेन-देन से लेयर के स्नैपशॉट जनरेट करता है. लेयर के स्नैपशॉट जनरेट होने की प्रोसेस, इस डेटा सोर्स के फ़्लश होने पर शुरू होती है.
  • MODE_DUMP: एक लेयर के स्नैपशॉट को ट्रैक करता है.
  • MODE_GENERATED_BUGREPORT_ONLY: यह MODE_GENERATED जैसा ही है, लेकिन यह सिर्फ़ गड़बड़ी की शिकायत होने पर लेयर के स्नैपशॉट जनरेशन को ट्रिगर करता है, न कि ट्रैक फ़्लश होने पर.

ट्रैस फ़्लैग (trace_flags):

  • TRACE_FLAG_INPUT: अगर प्लैटफ़ॉर्म पर इनपुट डेटा मौजूद है, तो इनपुट विंडो की जानकारी ट्रैक की जाती है.
  • TRACE_FLAG_COMPOSITION: कॉम्पोज़िशन टाइप और दिखने वाले हिस्से को ट्रैक करता है.
  • TRACE_FLAG_EXTRA: स्क्रीन के अतिरिक्त मेटाडेटा को ट्रैक करता है. इसमें स्क्रीन से बाहर की लेयर भी शामिल हैं.

  • TRACE_FLAG_HWC: बिना स्ट्रक्चर वाले अन्य हार्डवेयर कंपोजर मेटाडेटा को ट्रैक करता है.

  • TRACE_FLAG_BUFFERS: SurfaceFlinger को कॉन्फ़िगर करता है, ताकि वह स्क्रीन पर बफ़र में हुए सभी बदलावों को ट्रैक कर सके. डिफ़ॉल्ट रूप से, SurfaceFlinger सिर्फ़ तब नई स्थिति का पता लगाता है, जब ज्यामिति में बदलाव होता है.

  • TRACE_FLAG_VIRTUAL_DISPLAYS: ट्रेस में वर्चुअल डिसप्ले लेयर शामिल करता है.

उदाहरण

यहां adb के लिए, SurfaceFlinger ट्रैक टाइप का उदाहरण दिया गया है:

$ adb shell -t perfetto \
     -c - --txt \
     -o /data/misc/perfetto-traces/trace \
   <<EOF
   unique_session_name: "my_custom_session"
   buffers: {
       size_kb: 63488
       fill_policy: RING_BUFFER
   }
   data_sources: {
       config {
           name: "android.surfaceflinger.layers"
           surfaceflinger_layers_config: {
              mode: MODE_ACTIVE
              trace_flags: TRACE_FLAG_INPUT
              trace_flags: TRACE_FLAG_COMPOSITION
              trace_flags: TRACE_FLAG_HWC
              trace_flags: TRACE_FLAG_BUFFERS
              trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
           }
       }
   }
EOF

अलग-अलग कॉन्फ़िगरेशन वैल्यू के मतलब के बारे में जानकारी के लिए, SurfaceFlinger देखें.

शेल ट्रांज़िशन

इस ट्रैस टाइप के लिए, डेटा सोर्स के नाम com.android.wm.shell.transition का इस्तेमाल करें.

कॉन्फ़िगरेशन के विकल्प

इस तरह के ट्रैक के लिए, कॉन्फ़िगरेशन के विकल्प नहीं होते.

उदाहरण

adb के लिए, शेल ट्रांज़िशन ट्रैक टाइप का एक उदाहरण यहां दिया गया है:

$ adb shell -t perfetto \
     -c - --txt \
     -o /data/misc/perfetto-traces/trace \
   <<EOF
   unique_session_name: "my_custom_session"
   buffers: {
       size_kb: 63488
       fill_policy: RING_BUFFER
   }
   data_sources: {
       config {
           name: "com.android.wm.shell.transition"
       }
   }
EOF

SurfaceFlinger (लेन-देन)

इस तरह के ट्रैस के लिए, डेटा सोर्स के नाम android.surfaceflinger.transactions का इस्तेमाल करें.

कॉन्फ़िगरेशन के विकल्प

ट्रैकिंग मोड (mode): इससे यह तय होता है कि आइटम कितनी फ़्रीक्वेंसी पर लॉग किए जाएं:

  • MODE_CONTINUOUS: हर बार डेटा सोर्स फ़्लश होने पर, SurfaceFlinger लेन-देन के अपने इंटरनल रिंग बफ़र को लिखता है. रिंग बफ़र में, SurfaceFlinger की शुरुआती स्थिति और हाल ही के लेन-देन शामिल होते हैं.

  • MODE_ACTIVE: SurfaceFlinger, शुरुआती स्थिति और फिर डेटा सोर्स के बंद होने तक, हर आने वाले लेन-देन को रिकॉर्ड करता है.

उदाहरण

यहां adb के लिए, SurfaceFlinger लेन-देन के ट्रैक टाइप का उदाहरण दिया गया है.

$ adb shell -t perfetto \
     -c - --txt \
     -o /data/misc/perfetto-traces/trace \
   <<EOF
   unique_session_name: "my_custom_session"
   buffers: {
       size_kb: 63488
       fill_policy: RING_BUFFER
   }
   data_sources: {
       config {
           name: "android.surfaceflinger.transactions"
           surfaceflinger_transactions_config: {
              mode: MODE_ACTIVE
           }
       }
   }
EOF

IME

इस तरह के ट्रेस के लिए, डेटा सोर्स के नाम: android.inputmethod का इस्तेमाल करें.

कॉन्फ़िगरेशन के विकल्प

इस तरह के ट्रैक के लिए, कॉन्फ़िगरेशन के विकल्प नहीं होते.

उदाहरण

यहां adb के लिए IME ट्रैक टाइप का उदाहरण दिया गया है:

$ adb shell -t perfetto \
     -c - --txt \
     -o /data/misc/perfetto-traces/trace \
   <<EOF
   unique_session_name: "my_custom_session"
   buffers: {
       size_kb: 63488
       fill_policy: RING_BUFFER
   }
   data_sources: {
       config {
           name: "android.inputmethod"
       }
   }
EOF

ViewCapture

इस तरह के ट्रेस के लिए, डेटा सोर्स का नाम android.viewcapture इस्तेमाल करें.

कॉन्फ़िगरेशन के विकल्प

इस तरह के ट्रैक के लिए, कॉन्फ़िगरेशन के विकल्प नहीं होते.

उदाहरण

यहां adb के लिए ViewCapture ट्रैक टाइप का उदाहरण दिया गया है:

$ adb shell -t perfetto \
     -c - --txt \
     -o /data/misc/perfetto-traces/trace \
   <<EOF
   unique_session_name: "my_custom_session"
   buffers: {
       size_kb: 63488
       fill_policy: RING_BUFFER
   }
   data_sources: {
       config {
           name: "android.viewcapture"
       }
   }
EOF

पूरा उदाहरण

Perfetto की मदद से, एक ही कॉन्फ़िगरेशन में कई सोर्स से डेटा इकट्ठा किया जा सकता है. एक ही निर्देश से, Winscope के सभी ट्रेस इकट्ठा किए जा सकते हैं:

$ adb shell -t perfetto \
     -c - --txt \
     -o /data/misc/perfetto-traces/trace \
   <<EOF
   unique_session_name: "my_custom_session"
   buffers: {
       size_kb: 63488
       fill_policy: RING_BUFFER
   }
   data_sources: {
       config {
           name: "android.windowmanager"
           windowmanager_config: {
              log_level: LOG_LEVEL_VERBOSE
              log_frequency: LOG_FREQUENCY_TRANSACTION
           }
       }
   }
   data_sources: {
       config {
           name: "android.protolog"
           protolog_config: {
              tracing_mode: ENABLE_ALL
           }
       }
   }
   data_sources: {
       config {
           name: "android.input.inputevent"
           android_input_event_config: {
              mode: TRACE_MODE_TRACE_ALL
           }
       }
   }
   data_sources: {
       config {
           name: "android.surfaceflinger.layers"
           surfaceflinger_layers_config: {
              mode: MODE_ACTIVE
              trace_flags: TRACE_FLAG_INPUT
              trace_flags: TRACE_FLAG_COMPOSITION
              trace_flags: TRACE_FLAG_HWC
              trace_flags: TRACE_FLAG_BUFFERS
              trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
           }
       }
   }
   data_sources: {
       config {
           name: "com.android.wm.shell.transition"
       }
   }
   data_sources: {
       config {
           name: "android.surfaceflinger.transactions"
           surfaceflinger_transactions_config: {
              mode: MODE_ACTIVE
           }
       }
   }
   data_sources: {
       config {
           name: "android.inputmethod"
       }
   }
   data_sources: {
       config {
           name: "android.viewcapture"
       }
   }
EOF

Android 14 और इससे पहले के वर्शन में ट्रेस कैप्चर करना

नीचे दिए गए हर ट्रैक के लिए, adb shell निर्देश चलाने से पहले adb root चलाएं. ट्रेस करने के बाद, ट्रेस फ़ाइलें /data/misc/wmtrace में उपलब्ध होती हैं. किसी डिवाइस से फ़ाइल या डायरेक्ट्री और उसकी सब-डायरेक्ट्री को कॉपी करने के लिए, किसी डिवाइस पर फ़ाइलें कॉपी करना और उससे कॉपी करना लेख पढ़ें.

WindowManager के ट्रेस

WindowManager के ट्रेस कैप्चर करने के लिए:

  • ट्रेस की सुविधा चालू करना:

    adb shell wm tracing start
    
  • ट्रैकिंग बंद करना:

    adb shell wm tracing stop
    
  • ट्रैक कैप्चर करते समय, लॉगिंग डेटा को फ़ाइल में सेव करना:

    adb shell wm tracing save-for-bugreport
    
  • हर फ़्रेम के लिए एक बार ट्रैक लॉग करें:

    adb shell wm tracing frame
    
  • हर लेन-देन को लॉग करें:

    adb shell wm tracing transaction
    
  • लॉग का ज़्यादा से ज़्यादा साइज़ (केबी में) सेट करें:

    adb shell wm tracing size
    
  • प्रिंट ट्रेस की स्थिति:

    adb shell wm tracing status
    
  • लॉग लेवल को critical (सिर्फ़ कम जानकारी वाली दिखने वाली विंडो), trim (कम जानकारी वाली सभी विंडो) या all (सभी विंडो और जानकारी) पर सेट करें:

    adb shell wm tracing level
    

WindowManager के डंप

WindowManager के डंप कैप्चर करने के लिए:

adb exec-out dumpsys window --proto > window_dump.winscope

ProtoLog

यहां दिए गए निर्देशों का इस्तेमाल, ProtoLog सिस्टम के लिए किया जाता है.

system_server प्रोसेस में:

  • ProtoLog शुरू करना:

    adb shell cmd window logging start
    
  • ProtoLog को बंद करना:

    adb shell cmd window logging stop
    
  • दिए गए लॉग ग्रुप के लिए ProtoLog चालू करें:

    adb shell cmd window logging enable [group...]
    
  • दिए गए लॉग ग्रुप के लिए ProtoLog बंद करें:

    adb shell cmd window logging disable [group...]
    
  • दिए गए लॉग ग्रुप के लिए, Logcat लॉगिंग की सुविधा चालू करें:

    adb shell cmd window logging enable-text [group...]
    
  • दिए गए लॉग ग्रुप के लिए, Logcat लॉगिंग की सुविधा बंद करें:

    adb shell cmd window logging disable-text [group...]
    

WMShell में:

  • ProtoLog शुरू करना:

    adb shell dumpsys activity service SystemUIService WMShell
    

SurfaceFlinger ट्रेस (लेयर)

SurfaceFlinger लेयर ट्रैसिंग, कैप्चर के लिए Perfetto ट्रेस का इस्तेमाल करती है. कॉन्फ़िगरेशन की जानकारी के लिए, कॉन्फ़िगरेशन ट्रैक करें देखें.

SurfaceFlinger लेयर ट्रैकिंग के लिए कॉन्फ़िगरेशन का यह उदाहरण देखें:

unique_session_name: "surfaceflinger_layers_active"
buffers: {
    size_kb: 63488
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.layers"
        surfaceflinger_layers_config: {
            mode: MODE_ACTIVE
            trace_flags: TRACE_FLAG_INPUT
            trace_flags: TRACE_FLAG_COMPOSITION
            trace_flags: TRACE_FLAG_HWC
            trace_flags: TRACE_FLAG_BUFFERS
            trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
        }
    }
}

SurfaceFlinger लेयर के लिए ट्रैकिंग जनरेट करने के लिए, यहां दिया गया कमांड उदाहरण देखें:

adb shell -t perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

SurfaceFlinger डंप (लेयर)

SurfaceFlinger के डंप कैप्चर करने के लिए:

adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope

शेल ट्रांज़िशन

ट्रांज़िशन ट्रैकिंग के लिए, इन निर्देशों का इस्तेमाल किया जाता है.

system_server प्रोसेस में:

  • ट्रेस शुरू करने के लिए:

    adb shell cmd window shell tracing start
    
  • ट्रैकिंग बंद करने के लिए:

    adb shell cmd window shell tracing stop
    
  • WMShell में ट्रेस शुरू करने के लिए:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
    
  • WMShell में ट्रैकिंग बंद करने के लिए:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
    

IME

इनपुट के तरीके के संपादक (आईएमई) को ट्रैक करने के लिए, इन निर्देशों का इस्तेमाल किया जाता है:

  • इनपुट के तरीके (आईएम) के क्लाइंट, इनपुट के तरीके की सेवा (आईएमएस), और इनपुट के तरीके के मैनेजमेंट की सेवा (आईएमएमएस) के लिए, IME ट्रैकिंग शुरू करना:

    adb shell ime tracing start
    
  • IME क्लाइंट, IMS, और IMMS को ट्रैक करना शुरू करें:

    adb shell ime tracing stop
    

SurfaceFlinger (लेन-देन)

SurfaceFlinger लेन-देन ट्रैकिंग, कैप्चर करने के लिए Perfetto ट्रेस का इस्तेमाल करती है. कॉन्फ़िगरेशन की जानकारी के लिए, कॉन्फ़िगरेशन ट्रैक करें देखें.

SurfaceFlinger के लिए ऐक्टिव ट्रैकिंग के Perfetto कॉन्फ़िगरेशन का यह उदाहरण देखें:

unique_session_name: "surfaceflinger_transactions_active"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_ACTIVE
        }
    }
}
write_into_file: true
file_write_period_ms: 100

SurfaceFlinger के लिए Perfetto कॉन्फ़िगरेशन का यह उदाहरण देखें, जिसमें लगातार ट्रैकिंग की सुविधा चालू है:

unique_session_name: "surfaceflinger_transactions_continuous"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_CONTINUOUS
        }
    }
}

SurfaceFlinger ट्रांज़ैक्शन के लिए ट्रैकिंग जनरेट करने के लिए, यहां दिया गया उदाहरण देखें:

    adb shell perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \