Gunakan SQL untuk menemukan status tertentu dalam rekaman aktivitas Winscope Perfetto. Gunakan penampil Penelusuran global di UI Winscope untuk menjalankan kueri dan memvisualisasikan hasil dalam bentuk tabel:
Gambar 1. Tab penampil penelusuran.
Penampil Penelusuran memungkinkan Anda menulis dan menjalankan kueri SQL kustom pada rekaman aktivitas Perfetto, serta mengakses kueri terbaru dan tersimpan. Winscope menyediakan tampilan SQL khusus untuk membantu penelusuran rekaman aktivitas SurfaceFlinger, Transaksi, Transisi, dan ViewCapture.
Gunakan konvensi berikut untuk semua tampilan:
Untuk kolom
property
danflat_property
:- Nama properti menggunakan snake case, misalnya
visible_region
dariLayerProto
. Notasi titik merepresentasikan properti bertingkat, misalnya,
visible_region.rect
.Kolom berulang di
property
dibedakan dengan tanda kurung siku:Misalnya, dalam dua instance kolom berulang
visible_region.rect
, kolomtop
direpresentasikan olehvisible_region.rect[0].top
danvisible_region.rect[1].top
.Kolom berulang di
flat_property
tidak dapat dibedakan:Misalnya, dalam dua instance kolom berulang
visible_region.rect
, kolomtop
direpresentasikan olehvisible_region.rect.top
di kedua instance.
- Nama properti menggunakan snake case, misalnya
Untuk kolom
value
danprevious_value
, nilai boolean diwakili oleh0
(False
) atau1
(True
).
Winscope membuat tampilan ini dengan menggabungkan data dari tabel khusus rekaman aktivitas dengan
tabel args
Perfetto.
Anda dapat membuat kueri tabel ini secara langsung. Dalam tabel args
, kolom key
, flat_key
, dan display_value
serupa dengan kolom tampilan property
, flat_property
, dan value
.
Tabel args
:
Kolom | Deskripsi |
---|---|
arg_set_id |
Digunakan untuk mengaitkan sekumpulan argumen |
flat_key |
Nama properti dari pesan proto, tidak memperhitungkan kolom berulang |
key |
Nama properti dari pesan proto, yang memperhitungkan kolom berulang |
value_type |
Jenis nilai properti |
int_value |
Nilai properti jika jenis nilai adalah bilangan bulat |
string_value |
Nilai properti jika jenis nilai adalah string |
real_value |
Nilai properti jika jenis nilai adalah bilangan riil |
display_value |
Nilai properti ditransmisikan ke string |
Tampilan SQL SurfaceFlinger
Data proto SurfaceFlinger menggunakan format berikut:
Data lapisan dalam format
LayerProto
.Data root hierarki berada dalam format
LayersSnapshotProto
.
Untuk menelusuri data lapisan, gunakan tampilan sf_layer_search
. Tampilan ini mencakup kolom berikut:
Kolom | Deskripsi |
---|---|
state_id |
ID baris entri tempat lapisan berada |
ts |
Stempel waktu entri tempat lapisan berada |
layer_id |
ID Lapisan |
parent_id |
ID lapisan induk |
layer_name |
Nama lapisan |
property |
Nama properti yang memperhitungkan kolom berulang |
flat_property |
Nama properti tidak memperhitungkan kolom berulang |
value |
Nilai properti dalam format string |
previous_value |
Nilai properti dari entri sebelumnya dalam format string |
Untuk menelusuri data root hierarki, gunakan tampilan sf_hierarchy_root_search
. Tampilan ini mencakup kolom berikut:
Kolom | Deskripsi |
---|---|
state_id |
ID baris entri |
ts |
Stempel waktu entri |
property |
Nama properti yang memperhitungkan kolom berulang |
flat_property |
Nama properti tidak memperhitungkan kolom berulang |
value |
Nilai properti dalam format string |
previous_value |
Nilai properti dari entri sebelumnya dalam format string |
Contoh kueri
Temukan semua frame tempat lapisan
IME
memiliki batas layar yang valid:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name like 'IME%' AND property='screen_bounds.bottom' AND value<='24000'
Temukan semua frame tempat
Taskbar
lapisancolor.a
(alfa) berubah:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name like 'Taskbar%' AND property='color.a' AND value!=previous_value
Temukan semua frame yang batas bawah
Wallpaper
-nya kurang dari atau sama dengan 2400:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name LIKE 'Wallpaper%' AND property='bounds.bottom' AND cast_int!(value) <= 2400
Mencantumkan semua properti untuk tampilan dengan stack lapisan yang valid:
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, ']') ), '%' )
Menemukan semua frame tempat gestur kembali menggeser terlihat
SELECT DISTINCT STATE.ts FROM sf_layer_search STATE WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
Tabel data
Tampilan SurfaceFlinger dibuat menggunakan tabel pokok berikut.
surfaceflinger_layers_snapshot
:
Kolom | Deskripsi |
---|---|
id |
ID Baris untuk entri |
ts |
Stempel waktu entri |
arg_set_id |
ID yang digunakan untuk mengaitkan baris dari tabel args dengan entri ini |
surfaceflinger_layer
:
Kolom | Deskripsi |
---|---|
id |
ID baris untuk lapisan |
snapshot_id |
ID baris entri dari surfaceflinger_layers_snapshot yang menjadi bagian dari lapisan |
arg_set_id |
ID yang digunakan untuk mengaitkan baris dari tabel args dengan lapisan ini |
Tampilan SQL transaksi
Data proto transaksi menggunakan format
TransactionTraceEntry
.
Untuk menelusuri data rekaman aktivitas Transaksi, gunakan tampilan transactions_search
. Tampilan ini
mencakup kolom berikut:
Kolom | Deskripsi |
---|---|
state_id |
ID baris entri tempat properti proto berada |
ts |
Stempel waktu entri yang memiliki properti proto |
transaction_id |
ID Transaksi jika tersedia |
property |
Nama properti yang memperhitungkan kolom berulang |
flat_property |
Nama properti tidak memperhitungkan kolom berulang |
value |
Nilai properti dalam format string |
Contoh kueri
Temukan frame tempat transaksi diterapkan untuk mengubah posisi x lapisan menjadi -54.0:
SELECT ts, transaction_id, value FROM transactions_search WHERE flat_property='transactions.layer_changes.x' AND value='-54.0'
Temukan frame tempat lapisan
ImeContainer
ditambahkan:SELECT ts FROM transactions_search WHERE flat_property='added_layers.name' AND value='ImeContainer'
Tabel data
Tampilan SQL Transaksi dibuat menggunakan tabel pokok berikut.
surfaceflinger_transactions
:
Kolom | Deskripsi |
---|---|
id |
ID Baris untuk entri |
ts |
Stempel waktu entri |
arg_set_id |
ID yang digunakan untuk mengaitkan baris dari tabel args dengan entri ini |
vsync_id |
ID VSync yang terkait dengan semua transaksi dalam entri ini |
android_surfaceflinger_transaction
:
Kolom | Deskripsi |
---|---|
id |
ID Baris untuk transaksi |
snapshot_id |
ID baris entri dari surfaceflinger_transactions yang menjadi tempat transaksi berada |
arg_set_id |
ID yang digunakan untuk mengaitkan baris dari tabel args dengan transaksi ini |
transaction_id |
ID transaksi diambil dari pesan proto |
pid |
PID transaksi diambil dari pesan proto |
uid |
UID transaksi diambil dari pesan proto |
layer_id |
ID lapisan yang terkait dengan transaksi, jika ada |
display_id |
ID tampilan yang terkait dengan transaksi, jika ada |
flags_id |
ID yang digunakan untuk mengambil flag terkait dari android_surfaceflinger_transaction_flag |
transaction_type |
Jenis transaksi |
android_surfaceflinger_transaction_flag
:
Kolom | Deskripsi |
---|---|
flags_id |
Sesuai dengan nilai dalam baris di android_surfaceflinger_transaction |
flag |
String tanda yang diterjemahkan |
Transaksi individual ditambahkan ke tabel argumen dari format pesan proto yang berbeda berdasarkan jenis transaksinya:
LAYER_ADDED
:LayerCreationArgs
formatLAYER_CHANGED
:LayerState
formatDISPLAY_ADDED
:DisplayState
formatDISPLAY_CHANGED
:DisplayState
formatLAYER_DESTROYED
: Tidak ada argumenLAYER_HANDLE_DESTROYED
: Tidak ada argumenDISPLAY_REMOVED
: Tidak ada argumenNOOP
: Tidak ada argumen
Tampilan SQL transisi
Data proto transisi menggunakan format
ShellTransition
.
Untuk menelusuri data Transisi, gunakan tampilan transitions_search
. Tampilan ini
mencakup kolom berikut:
Kolom | Deskripsi |
---|---|
ts |
Waktu pengiriman; kembali ke waktu pengiriman jika tersedia, jika tidak 0 |
transition_id |
ID transisi yang diambil dari pesan proto |
property |
Nama properti yang memperhitungkan kolom berulang |
flat_property |
Nama properti tidak memperhitungkan kolom berulang |
value |
UID transaksi diambil dari pesan proto |
Contoh kueri
Menemukan properti transisi yang ditangani oleh 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
Tabel data
Tampilan Transisi dibuat menggunakan tabel pokok berikut.
window_manager_shell_transitions
:
Kolom | Deskripsi |
---|---|
id |
ID baris untuk transisi |
ts |
Waktu pengiriman; kembali ke waktu pengiriman jika tersedia, jika tidak 0 |
transition_id |
ID transisi yang diambil dari pesan proto |
arg_set_id |
ID yang digunakan untuk mengaitkan baris dari tabel args dengan transisi ini |
transition_type |
Jenis transisi yang diambil dari pesan proto |
send_time_ns |
Waktu pengiriman transisi diambil dari pesan proto |
dispatch_time_ns |
Waktu pengiriman transisi diambil dari pesan proto |
duration_ns |
Durasi transisi, jika waktu mulai dan berakhir tersedia |
handler |
Penanganan transisi: mengambil terjemahan dari window_manager_shell_transition_handlers |
status |
Status transisi: played , merged , atau aborted |
flags |
Bendera transisi diambil dari pesan proto |
window_manager_shell_transition_handlers
:
Kolom | Deskripsi |
---|---|
handler_id |
ID yang sesuai dengan nilai di kolom handler pada window_manager_shell_transitions |
handler_name |
Terjemahan string |
android_window_manager_shell_transition_participants
:
Kolom | Deskripsi |
---|---|
transition_id |
ID transisi yang diambil dari pesan proto mentah |
layer_id |
ID peserta lapisan SurfaceFlinger |
window_id |
ID peserta penampung WindowManager |
Tampilan SQL ViewCapture
Data proto ViewCapture menggunakan format
View
.
Untuk menelusuri data ViewCapture, gunakan tampilan viewcapture_search
. Tampilan ini
mencakup kolom berikut:
Kolom | Deskripsi |
---|---|
state_id |
ID baris status tempat tampilan berada |
ts |
Stempel waktu status yang dimiliki tampilan |
package_name |
Nama paket |
window_name |
Nama jendela |
class_name |
Melihat nama kelas |
property |
Nama properti yang memperhitungkan kolom berulang |
flat_property |
Nama properti tidak memperhitungkan kolom berulang |
value |
Nilai properti dalam format string |
previous_value |
Nilai properti dari status sebelumnya dalam format string |
Contoh kueri
Temukan semua status saat SearchContainerView
dipindahkan ke arah y:
SELECT * FROM viewcapture_search
WHERE class_name LIKE '%SearchContainerView'
AND flat_property='translation_y'
AND value!=previous_value
Tabel data
Tampilan ViewCapture dibuat menggunakan tabel pokok berikut.
android_viewcapture
:
Kolom | Deskripsi |
---|---|
id |
ID Baris untuk entri |
ts |
Stempel waktu entri |
arg_set_id |
ID yang digunakan untuk mengaitkan baris dari tabel args dengan entri ini |
android_viewcapture_view
:
Kolom | Deskripsi |
---|---|
id |
ID baris untuk tampilan |
snapshot_id |
ID baris entri dari android_viewcapture yang menjadi milik tampilan |
arg_set_id |
ID yang digunakan untuk mengaitkan baris dari tabel args dengan tampilan ini |
Tabel SQL ProtoLog
Data proto ProtoLog menggunakan format
ProtoLogMessage
. Tampilan ini mencakup kolom berikut:
Kolom | Deskripsi |
---|---|
ts |
Stempel waktu log |
level |
Level log |
tag |
Tag grup logging |
message |
Pesan log |
stacktrace |
Stacktrace (jika tersedia) |
location |
Lokasi kode asal pesan |
Contoh kueri
Temukan semua log dengan pesan yang berisi
transition
:SELECT ts, message, location FROM protolog WHERE message LIKE '%transition%'
Temukan semua log yang berisi ID transaksi yang valid:
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, '%');
Menjalankan kueri
Anda dapat menjalankan kueri penelusuran menggunakan panel PENELUSURAN GLOBAL di sebelah kiri penampil Penelusuran.
Saat Anda pertama kali berinteraksi dengan panel GLOBAL SEARCH, penelusuran aktivitas akan diinisialisasi dan Winscope akan membuat tampilan SQL helper. Proses ini memerlukan waktu beberapa detik. Saat penelusuran rekaman aktivitas sedang diinisialisasi, linimasa tidak tersedia.
Untuk memulai kueri, tulis kueri di kotak penelusuran dan klik Jalankan Kueri Penelusuran atau tekan Enter di keyboard untuk menjalankannya.
Setelah selesai, tabel hasil akan ditampilkan di panel tengah. Kueri Anda akan muncul di bawah kotak penelusuran, dengan kolom untuk menyimpan kueri di antara sesi.
Anda dapat mengakses kueri tersimpan dengan mengklik tab Tersimpan di panel kiri, dan mengakses kueri yang baru saja dijalankan dengan mengklik tab Terbaru:
Gambar 2. Panel kiri penampil penelusuran.
Hasil
Semua kueri menampilkan hasil dalam bentuk tabel, yang ditampilkan dalam tampilan yang dapat di-scroll dengan perilaku interaktif yang mirip dengan pelihat rekaman aktivitas berbasis log, seperti Transaksi dan ProtoLog:
Gambar 3. Hasil penampil penelusuran.
Jika tabel yang dihasilkan berisi kolom ts
, nilai dalam kolom tersebut akan ditafsirkan sebagai stempel waktu dan ditambahkan ke overlay linimasa sebagai baris baru entri. Klik baris ini dan gunakan tombol panah kiri dan kanan untuk berpindah
di antara entri:
Gambar 4. Linimasa penelusuran.