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

Winscope ट्रेस को डीबग बिल्ड पर adb कमांड लाइन की मदद से इकट्ठा किया जा सकता है. डीबग बिल्ड का मतलब userdebug और eng बिल्ड से है. 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 प्रोसेस में:

  • Start ProtoLog:

    adb shell cmd window logging start
    
  • Stop 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 में:

  • Start 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) ट्रेसिंग के लिए, इन कमांड का इस्तेमाल किया जाता है:

  • इनपुट के तरीके (आईएम) के क्लाइंट, इनपुट के तरीके की सेवा (आईएमएस), और इनपुट के तरीके की मैनेजमेंट सेवा (आईएमएमएस) के लिए, 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 \