Penelusuran trace

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:

tab penampil penelusuran

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 dan flat_property:

    • Nama properti menggunakan snake case, misalnya visible_region dari LayerProto.
    • 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, kolom top direpresentasikan oleh visible_region.rect[0].top dan visible_region.rect[1].top.

    • Kolom berulang di flat_property tidak dapat dibedakan:

      Misalnya, dalam dua instance kolom berulang visible_region.rect, kolom top direpresentasikan oleh visible_region.rect.top di kedua instance.

  • Untuk kolom value dan previous_value, nilai boolean diwakili oleh 0 (False) atau 1 (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:

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 lapisan color.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 format
  • LAYER_CHANGED: LayerState format
  • DISPLAY_ADDED: DisplayState format
  • DISPLAY_CHANGED: DisplayState format
  • LAYER_DESTROYED: Tidak ada argumen
  • LAYER_HANDLE_DESTROYED: Tidak ada argumen
  • DISPLAY_REMOVED: Tidak ada argumen
  • NOOP: 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:

panel kiri penampil penelusuran

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:

hasil penelusuran penonton

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:

linimasa penelusuran

Gambar 4. Linimasa penelusuran.