Tìm kiếm dấu vết

Sử dụng SQL để tìm các trạng thái cụ thể trong dấu vết Winscope Perfetto. Sử dụng trình xem Tìm kiếm chung trong giao diện người dùng Winscope để chạy các truy vấn và trực quan hoá kết quả dạng bảng:

thẻ người xem tìm kiếm

Hình 1. Thẻ Tìm kiếm người xem.

Trình xem Tìm kiếm cho phép bạn viết và chạy các truy vấn SQL tuỳ chỉnh trên dấu vết Perfetto, cũng như truy cập vào các truy vấn gần đây và đã lưu. Winscope cung cấp các khung hiển thị SQL chuyên biệt để hỗ trợ việc tìm kiếm các dấu vết SurfaceFlinger, Giao dịch, Chuyển đổi và ViewCapture.

Hãy sử dụng các quy ước sau cho tất cả các khung hiển thị:

  • Đối với cột propertyflat_property:

    • Tên thuộc tính ở dạng snake case, ví dụ: visible_region từ LayerProto.
    • Ký hiệu dấu chấm biểu thị các thuộc tính lồng nhau, ví dụ: visible_region.rect.

    • Các trường lặp lại trong property được phân biệt bằng dấu ngoặc vuông:

      Ví dụ: trong hai thực thể của trường lặp lại visible_region.rect, trường top được biểu thị bằng visible_region.rect[0].topvisible_region.rect[1].top.

    • Các trường lặp lại trong flat_property không phân biệt được:

      Ví dụ: trong hai thực thể của trường lặp lại visible_region.rect, trường top được biểu thị bằng visible_region.rect.top trong cả hai thực thể.

  • Đối với các cột valueprevious_value, các giá trị boolean được biểu thị bằng 0 (False) hoặc 1 (True).

Winscope tạo các khung hiển thị này bằng cách kết hợp dữ liệu từ các bảng dành riêng cho dấu vết với bảng Perfetto args. Bạn có thể truy vấn trực tiếp các bảng này. Trong bảng args, các cột key, flat_keydisplay_value tương tự như các cột trong chế độ xem property, flat_propertyvalue tương ứng.

args bảng:

Cột Mô tả
arg_set_id Được dùng để liên kết một nhóm đối số
flat_key Tên thuộc tính từ thông báo proto, không tính đến các trường lặp lại
key Tên thuộc tính trong thông báo giao thức, tính đến các trường lặp lại
value_type Loại giá trị thuộc tính
int_value Giá trị thuộc tính nếu loại giá trị là số nguyên
string_value Giá trị thuộc tính nếu loại giá trị là một chuỗi
real_value Giá trị thuộc tính nếu loại giá trị là số thực
display_value Giá trị thuộc tính được truyền đến chuỗi

Các chế độ xem SQL của SurfaceFlinger

Dữ liệu proto SurfaceFlinger sử dụng các định dạng sau:

Để tìm kiếm dữ liệu lớp, hãy sử dụng chế độ xem sf_layer_search. Chế độ xem này bao gồm các cột sau:

Cột Mô tả
state_id Mã hàng của mục mà lớp thuộc về
ts Dấu thời gian của mục mà lớp thuộc về
layer_id Mã lớp
parent_id Mã lớp của lớp mẹ
layer_name Tên lớp
property Tên tài sản tính đến các trường lặp lại
flat_property Tên thuộc tính không tính đến các trường lặp lại
value Giá trị thuộc tính ở định dạng chuỗi
previous_value Giá trị thuộc tính của mục nhập trước ở định dạng chuỗi

Để tìm kiếm dữ liệu gốc của hệ phân cấp, hãy sử dụng chế độ xem sf_hierarchy_root_search. Chế độ xem này bao gồm các cột sau:

Cột Mô tả
state_id Mã hàng của mục
ts Dấu thời gian của mục nhập
property Tên tài sản tính đến các trường lặp lại
flat_property Tên thuộc tính không tính đến các trường lặp lại
value Giá trị thuộc tính ở định dạng chuỗi
previous_value Giá trị thuộc tính của mục nhập trước ở định dạng chuỗi

Cụm từ tìm kiếm mẫu

  • Tìm tất cả khung hình mà lớp IME có ranh giới hợp lệ trên màn hình:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND property='screen_bounds.bottom'
      AND value<='24000'
    
  • Tìm tất cả khung hình có lớp Taskbar color.a (alpha) thay đổi:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'Taskbar%'
      AND property='color.a'
      AND value!=previous_value
    
  • Tìm tất cả khung hình có giới hạn dưới Wallpaper nhỏ hơn hoặc bằng 2400:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name LIKE 'Wallpaper%'
      AND property='bounds.bottom'
      AND cast_int!(value) <= 2400
    
  • Liệt kê tất cả các thuộc tính cho màn hình có ngăn xếp lớp hợp lệ:

    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, ']')
        ),
        '%'
      )
    
  • Tìm tất cả các khung hình có cử chỉ vuốt về sau

    SELECT DISTINCT STATE.ts FROM sf_layer_search STATE
      WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
    

Bảng dữ liệu

Các khung hiển thị SurfaceFlinger được tạo bằng các bảng cơ bản sau.

surfaceflinger_layers_snapshot:

Cột Mô tả
id Mã hàng của mục
ts Dấu thời gian của mục nhập
arg_set_id Mã nhận dạng dùng để liên kết các hàng trong bảng args với mục này

surfaceflinger_layer:

Cột Mô tả
id Mã hàng của lớp
snapshot_id Mã hàng của mục trong surfaceflinger_layers_snapshot mà lớp thuộc về
arg_set_id Mã dùng để liên kết các hàng trong bảng args với lớp này

Chế độ xem SQL về giao dịch

Dữ liệu proto giao dịch sử dụng định dạng TransactionTraceEntry.

Để tìm kiếm dữ liệu dấu vết Giao dịch, hãy sử dụng chế độ xem transactions_search. Chế độ xem này bao gồm các cột sau:

Cột Mô tả
state_id Mã hàng của mục mà thuộc tính giao thức thuộc về
ts Dấu thời gian của mục mà thuộc tính giao thức thuộc về
transaction_id Mã giao dịch (nếu có)
property Tên tài sản tính đến các trường lặp lại
flat_property Tên thuộc tính không tính đến các trường lặp lại
value Giá trị thuộc tính ở định dạng chuỗi

Cụm từ tìm kiếm mẫu

  • Tìm khung hình mà một giao dịch được áp dụng để thay đổi vị trí x của lớp thành -54.0:

    SELECT ts, transaction_id, value FROM transactions_search
      WHERE flat_property='transactions.layer_changes.x'
      AND value='-54.0'
    
  • Tìm khung hình mà bạn đã thêm lớp ImeContainer:

    SELECT ts FROM transactions_search
      WHERE flat_property='added_layers.name'
      AND value='ImeContainer'
    

Bảng dữ liệu

Khung hiển thị SQL về giao dịch được tạo bằng các bảng cơ bản sau.

surfaceflinger_transactions:

Cột Mô tả
id Mã hàng của mục
ts Dấu thời gian của mục nhập
arg_set_id Mã nhận dạng dùng để liên kết các hàng trong bảng args với mục này
vsync_id Mã VSync được liên kết với tất cả giao dịch trong mục này

android_surfaceflinger_transaction:

Cột Mô tả
id Mã hàng của giao dịch
snapshot_id Mã hàng của mục trong surfaceflinger_transactions mà giao dịch thuộc về
arg_set_id Mã nhận dạng dùng để liên kết các hàng trong bảng args với giao dịch này
transaction_id Mã giao dịch lấy từ thông báo giao thức
pid PID giao dịch lấy từ thông báo giao thức
uid UID giao dịch lấy từ thông báo proto
layer_id Mã nhận dạng của lớp được liên kết với giao dịch (nếu có)
display_id Mã nhận dạng của màn hình liên kết với giao dịch (nếu có)
flags_id Mã nhận dạng dùng để truy xuất các cờ liên kết từ android_surfaceflinger_transaction_flag
transaction_type Loại giao dịch

android_surfaceflinger_transaction_flag:

Cột Mô tả
flags_id Tương ứng với giá trị trong một hàng trong android_surfaceflinger_transaction
flag Chuỗi cờ được dịch

Các giao dịch riêng lẻ được thêm vào bảng args từ các định dạng thông báo proto khác nhau dựa trên loại giao dịch:

  • LAYER_ADDED: Định dạng LayerCreationArgs
  • LAYER_CHANGED: Định dạng LayerState
  • DISPLAY_ADDED: Định dạng DisplayState
  • DISPLAY_CHANGED: Định dạng DisplayState
  • LAYER_DESTROYED: Không có đối số
  • LAYER_HANDLE_DESTROYED: Không có đối số
  • DISPLAY_REMOVED: Không có đối số
  • NOOP: Không có đối số

Chuyển đổi chế độ xem SQL

Dữ liệu proto chuyển đổi sử dụng định dạng ShellTransition.

Để tìm kiếm dữ liệu về Chuyển đổi, hãy sử dụng chế độ xem transitions_search. Chế độ xem này bao gồm các cột sau:

Cột Mô tả
ts Thời gian gửi hàng; chuyển về thời gian gửi nếu có, nếu không thì là 0
transition_id Mã nhận dạng chuyển đổi lấy từ thông báo giao thức
property Tên tài sản tính đến các trường lặp lại
flat_property Tên thuộc tính không tính đến các trường lặp lại
value UID giao dịch lấy từ thông báo proto

Cụm từ tìm kiếm mẫu

Tìm các thuộc tính của hiệu ứng chuyển cảnh do DefaultMixedHandler xử lý:

  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

Bảng dữ liệu

Khung hiển thị Chuyển đổi được tạo bằng các bảng cơ bản sau.

window_manager_shell_transitions:

Cột Mô tả
id Mã hàng cho quá trình chuyển đổi
ts Thời gian gửi hàng; chuyển về thời gian gửi nếu có, nếu không thì là 0
transition_id Mã nhận dạng chuyển đổi lấy từ thông báo giao thức
arg_set_id Mã nhận dạng dùng để liên kết các hàng trong bảng args với quá trình chuyển đổi này
transition_type Loại chuyển đổi lấy từ thông báo proto
send_time_ns Thời gian gửi chuyển đổi lấy từ thông báo giao thức
dispatch_time_ns Thời gian chuyển đổi được lấy từ thông báo giao thức
duration_ns Thời lượng chuyển đổi (nếu có thời gian bắt đầu và kết thúc)
handler Trình xử lý chuyển đổi: truy xuất bản dịch từ window_manager_shell_transition_handlers
status Trạng thái chuyển đổi: played, merged hoặc aborted
flags Cờ chuyển đổi lấy từ thông báo giao thức

window_manager_shell_transition_handlers:

Cột Mô tả
handler_id Mã nhận dạng tương ứng với giá trị trong cột handler của window_manager_shell_transitions
handler_name Dịch chuỗi

android_window_manager_shell_transition_participants:

Cột Mô tả
transition_id Mã nhận dạng chuyển đổi lấy từ thông báo proto thô
layer_id Mã nhận dạng của người tham gia lớp SurfaceFlinger
window_id Mã nhận dạng của người tham gia vùng chứa WindowManager

Khung hiển thị ViewCapture SQL

Dữ liệu proto ViewCapture sử dụng định dạng View.

Để tìm kiếm dữ liệu ViewCapture, hãy sử dụng chế độ xem viewcapture_search. Chế độ xem này bao gồm các cột sau:

Cột Mô tả
state_id Mã nhận dạng hàng của trạng thái mà khung hiển thị thuộc về
ts Dấu thời gian của trạng thái mà khung hiển thị thuộc về
package_name Tên gói
window_name Tên cửa sổ
class_name Xem tên lớp học
property Tên tài sản tính đến các trường lặp lại
flat_property Tên thuộc tính không tính đến các trường lặp lại
value Giá trị thuộc tính ở định dạng chuỗi
previous_value Giá trị thuộc tính từ trạng thái trước ở định dạng chuỗi

Cụm từ tìm kiếm mẫu

Tìm tất cả các trạng thái khi SearchContainerView di chuyển theo hướng y:

  SELECT * FROM viewcapture_search
  WHERE class_name LIKE '%SearchContainerView'
    AND flat_property='translation_y'
    AND value!=previous_value

Bảng dữ liệu

Khung hiển thị ViewCapture được tạo bằng các bảng cơ bản sau.

android_viewcapture:

Cột Mô tả
id Mã hàng của mục
ts Dấu thời gian của mục nhập
arg_set_id Mã nhận dạng dùng để liên kết các hàng trong bảng args với mục này

android_viewcapture_view:

Cột Mô tả
id Mã hàng cho khung hiển thị
snapshot_id Mã hàng của mục trong android_viewcapture mà khung hiển thị thuộc về
arg_set_id Mã nhận dạng dùng để liên kết các hàng trong bảng args với khung hiển thị này

Bảng SQL ProtoLog

Dữ liệu proto ProtoLog sử dụng định dạng ProtoLogMessage. Chế độ xem này bao gồm các cột sau:

Cột Mô tả
ts Dấu thời gian của nhật ký
level Cấp độ nhật ký
tag Thẻ nhóm ghi nhật ký
message Thông điệp nhật ký
stacktrace Dấu vết ngăn xếp (nếu có)
location Vị trí mã nơi thông báo bắt nguồn

Cụm từ tìm kiếm mẫu

  • Tìm tất cả nhật ký có thông báo chứa transition:

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • Tìm tất cả nhật ký có mã giao dịch hợp lệ:

    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, '%');
    

Chạy truy vấn

Bạn có thể chạy các cụm từ tìm kiếm bằng bảng TÌM KIẾM TOÀ CẦU ở bên trái trình xem Tìm kiếm.

Khi bạn tương tác lần đầu với bảng điều khiển GLOBAL SEARCH (TÌM KIẾM TOÀN CẦU), tính năng tìm kiếm dấu vết sẽ khởi động và Winscope sẽ tạo các khung hiển thị SQL trợ giúp. Quá trình này mất vài giây. Dòng thời gian sẽ không hoạt động trong khi tính năng tìm kiếm dấu vết đang khởi động.

Để bắt đầu một truy vấn, hãy viết truy vấn vào hộp tìm kiếm rồi nhấp vào Chạy truy vấn tìm kiếm hoặc nhấn phím Enter trên bàn phím để chạy truy vấn đó.

Khi hoàn tất, bảng kết quả sẽ xuất hiện trong bảng điều khiển ở giữa. Cụm từ tìm kiếm của bạn xuất hiện bên dưới hộp tìm kiếm, cùng với một trường để lưu cụm từ tìm kiếm giữa các phiên.

Bạn có thể truy cập vào các truy vấn đã lưu bằng cách nhấp vào thẻ Đã lưu trong bảng điều khiển bên trái và truy cập vào các truy vấn đã chạy gần đây bằng cách nhấp vào thẻ Gần đây:

bảng điều khiển bên trái của người xem tìm kiếm

Hình 2. Tìm kiếm trong bảng điều khiển bên trái của trình xem.

Kết quả

Tất cả các truy vấn đều trả về kết quả dạng bảng, xuất hiện trong một khung hiển thị có thể cuộn với hành vi tương tác tương tự như các trình xem dấu vết dựa trên nhật ký, chẳng hạn như Giao dịch và ProtoLog:

kết quả tìm kiếm người xem

Hình 3. Kết quả tìm kiếm của người xem.

Nếu bảng kết quả chứa một cột ts, các giá trị trong cột đó sẽ được diễn giải dưới dạng dấu thời gian và được thêm vào lớp phủ dòng thời gian dưới dạng một hàng mới gồm các mục. Nhấp vào hàng này rồi dùng phím mũi tên trái và phải để di chuyển giữa các mục:

dòng thời gian tìm kiếm

Hình 4. Tìm kiếm dòng thời gian.