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 \