SQL을 사용하여 Winscope Perfetto 트레이스에서 특정 상태를 찾습니다. Winscope UI에서 전역 검색 뷰어를 사용하여 쿼리를 실행하고 표로 작성된 결과를 시각화합니다.
그림 1. 검색 뷰어 탭
검색 뷰어를 사용하면 Perfetto 트레이스에서 맞춤 SQL 쿼리를 작성하고 실행할 수 있으며 최근 쿼리와 저장된 쿼리에 액세스할 수 있습니다. Winscope는 SurfaceFlinger, 트랜잭션, 전환, ViewCapture 트레이스 검색을 지원하는 전문 SQL 뷰를 제공합니다.
모든 뷰에 다음 규칙을 사용하세요.
property
및flat_property
열의 경우:- 속성 이름은 스네이크 표기법입니다(예:
LayerProto
의visible_region
). 점 표기는 중첩된 속성을 나타냅니다(예:
visible_region.rect
).property
의 반복 필드는 대괄호로 구분됩니다.예를 들어 반복 필드
visible_region.rect
의 두 인스턴스 내에서top
필드는visible_region.rect[0].top
및visible_region.rect[1].top
로 표시됩니다.flat_property
의 반복 필드는 구분할 수 없습니다.예를 들어 반복 필드
visible_region.rect
의 두 인스턴스 내에서top
필드는 두 인스턴스 모두에서visible_region.rect.top
로 표시됩니다.
- 속성 이름은 스네이크 표기법입니다(예:
value
및previous_value
열의 경우 불리언 값은0
(False
) 또는1
(True
)로 표시됩니다.
Winscope는 추적별 테이블의 데이터를 Perfetto args
테이블과 조인하여 이러한 뷰를 만듭니다.
이러한 테이블을 직접 쿼리할 수 있습니다. args
테이블에서 key
, flat_key
, display_value
열은 각각 property
, flat_property
, value
뷰 열과 유사합니다.
args
표:
열 | 설명 |
---|---|
arg_set_id |
일련의 인수를 연결하는 데 사용됩니다. |
flat_key |
반복 필드를 고려하지 않은 프로토 메시지의 속성 이름 |
key |
반복 필드를 고려한 프로토 메시지의 속성 이름 |
value_type |
속성 값 유형 |
int_value |
값 유형이 정수인 경우 속성 값 |
string_value |
값 유형이 문자열인 경우 속성 값 |
real_value |
값 유형이 실수인 경우 속성 값 |
display_value |
문자열로 변환된 속성 값 |
SurfaceFlinger SQL 뷰
SurfaceFlinger 프로토 데이터는 다음 형식을 사용합니다.
레이어 데이터는
LayerProto
형식입니다.계층 구조 루트 데이터는
LayersSnapshotProto
형식입니다.
레이어 데이터를 검색하려면 sf_layer_search
뷰를 사용합니다. 이 뷰에는 다음 열이 포함됩니다.
열 | 설명 |
---|---|
state_id |
레이어가 속한 항목의 행 ID |
ts |
레이어가 속한 항목의 타임스탬프 |
layer_id |
레이어 ID |
parent_id |
상위의 레이어 ID |
layer_name |
레이어 이름 |
property |
반복되는 필드를 고려한 속성 이름 |
flat_property |
반복 필드를 고려하지 않는 속성 이름 |
value |
문자열 형식의 속성 값 |
previous_value |
이전 항목의 속성 값(문자열 형식) |
계층 구조 루트 데이터를 검색하려면 sf_hierarchy_root_search
보기를 사용하세요. 이 뷰에는 다음 열이 포함됩니다.
열 | 설명 |
---|---|
state_id |
항목의 행 ID |
ts |
항목의 타임스탬프 |
property |
반복되는 필드를 고려한 속성 이름 |
flat_property |
반복 필드를 고려하지 않는 속성 이름 |
value |
문자열 형식의 속성 값 |
previous_value |
이전 항목의 속성 값(문자열 형식) |
쿼리 예
IME
레이어에 유효한 화면 경계가 있는 모든 프레임을 찾습니다.SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name like 'IME%' AND property='screen_bounds.bottom' AND value<='24000'
Taskbar
레이어color.a
(알파)가 변경되는 모든 프레임을 찾습니다.SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name like 'Taskbar%' AND property='color.a' AND value!=previous_value
Wallpaper
하한이 2400 이하인 모든 프레임을 찾습니다.SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name LIKE 'Wallpaper%' AND property='bounds.bottom' AND cast_int!(value) <= 2400
유효한 레이어 스택이 있는 디스플레이의 모든 속성을 나열합니다.
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, ']') ), '%' )
뒤로 스와이프 동작이 표시되는 모든 프레임 찾기
SELECT DISTINCT STATE.ts FROM sf_layer_search STATE WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
데이터 표
SurfaceFlinger 뷰는 다음 기본 테이블을 사용하여 생성됩니다.
surfaceflinger_layers_snapshot
:
열 | 설명 |
---|---|
id |
항목의 행 ID |
ts |
항목의 타임스탬프 |
arg_set_id |
args 테이블의 행을 이 항목과 연결하는 데 사용되는 ID입니다. |
surfaceflinger_layer
:
열 | 설명 |
---|---|
id |
레이어의 행 ID |
snapshot_id |
레이어가 속한 surfaceflinger_layers_snapshot 의 항목 행 ID |
arg_set_id |
args 테이블의 행을 이 레이어와 연결하는 데 사용되는 ID입니다. |
트랜잭션 SQL 뷰
트랜잭션 proto 데이터는 TransactionTraceEntry
형식을 사용합니다.
트랜잭션 추적 데이터를 검색하려면 transactions_search
보기를 사용합니다. 이 뷰에는 다음 열이 포함됩니다.
열 | 설명 |
---|---|
state_id |
프로토 속성이 속한 항목의 행 ID |
ts |
프로토 속성이 속한 항목의 타임스탬프 |
transaction_id |
거래 ID(있는 경우) |
property |
반복되는 필드를 고려한 속성 이름 |
flat_property |
반복 필드를 고려하지 않는 속성 이름 |
value |
문자열 형식의 속성 값 |
쿼리 예
트랜잭션이 적용되어 레이어 x 위치가 -54.0으로 변경된 프레임을 찾습니다.
SELECT ts, transaction_id, value FROM transactions_search WHERE flat_property='transactions.layer_changes.x' AND value='-54.0'
ImeContainer
레이어가 추가된 프레임을 찾습니다.SELECT ts FROM transactions_search WHERE flat_property='added_layers.name' AND value='ImeContainer'
데이터 표
Transactions SQL 뷰는 다음 기본 테이블을 사용하여 생성됩니다.
surfaceflinger_transactions
:
열 | 설명 |
---|---|
id |
항목의 행 ID |
ts |
항목의 타임스탬프 |
arg_set_id |
args 테이블의 행을 이 항목과 연결하는 데 사용되는 ID입니다. |
vsync_id |
이 항목의 모든 트랜잭션과 연결된 VSync ID |
android_surfaceflinger_transaction
:
열 | 설명 |
---|---|
id |
거래의 행 ID |
snapshot_id |
거래가 속한 surfaceflinger_transactions 의 항목 행 ID |
arg_set_id |
args 테이블의 행을 이 거래와 연결하는 데 사용되는 ID입니다. |
transaction_id |
프로토 메시지에서 가져온 거래 ID |
pid |
프로토 메시지에서 가져온 트랜잭션 PID |
uid |
프로토 메시지에서 가져온 트랜잭션 UID |
layer_id |
거래와 연결된 레이어의 ID(해당하는 경우) |
display_id |
거래와 연결된 디스플레이의 ID입니다(해당하는 경우). |
flags_id |
android_surfaceflinger_transaction_flag 에서 연결된 플래그를 검색하는 데 사용되는 ID입니다. |
transaction_type |
거래 유형 |
android_surfaceflinger_transaction_flag
:
열 | 설명 |
---|---|
flags_id |
android_surfaceflinger_transaction 의 행에 있는 값에 해당합니다. |
flag |
번역된 플래그 문자열 |
개별 거래는 거래 유형에 따라 다양한 프로토 메시지 형식에서 args 표에 추가됩니다.
LAYER_ADDED
:LayerCreationArgs
형식LAYER_CHANGED
:LayerState
형식DISPLAY_ADDED
:DisplayState
형식DISPLAY_CHANGED
:DisplayState
형식LAYER_DESTROYED
: 인수 없음LAYER_HANDLE_DESTROYED
: 인수 없음DISPLAY_REMOVED
: 인수 없음NOOP
: 인수 없음
트랜지션 SQL 뷰
트랜지션 프로토 데이터는 ShellTransition
형식을 사용합니다.
Transitions 데이터를 검색하려면 transitions_search
뷰를 사용하세요. 이 뷰에는 다음 열이 포함됩니다.
열 | 설명 |
---|---|
ts |
발송 시간입니다. 사용 가능한 경우 전송 시간으로 대체되고, 그렇지 않으면 0 입니다. |
transition_id |
프로토 메시지에서 가져온 전환 ID |
property |
반복되는 필드를 고려한 속성 이름 |
flat_property |
반복 필드를 고려하지 않는 속성 이름 |
value |
프로토 메시지에서 가져온 트랜잭션 UID |
쿼리 예
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
데이터 표
전환 뷰는 다음 기본 테이블을 사용하여 생성됩니다.
window_manager_shell_transitions
:
열 | 설명 |
---|---|
id |
전환의 행 ID |
ts |
발송 시간입니다. 사용 가능한 경우 전송 시간으로 대체되고, 그렇지 않으면 0 입니다. |
transition_id |
프로토 메시지에서 가져온 전환 ID |
arg_set_id |
args 테이블의 행을 이 전환과 연결하는 데 사용되는 ID입니다. |
transition_type |
프로토 메시지에서 가져온 전환 유형 |
send_time_ns |
프로토 메시지에서 가져온 전환 전송 시간 |
dispatch_time_ns |
프로토 메시지에서 가져온 전환 디스패치 시간 |
duration_ns |
시작 시간과 종료 시간을 사용할 수 있는 경우 전환 기간 |
handler |
전환 핸들러: window_manager_shell_transition_handlers 에서 번역 가져오기 |
status |
전환 상태: played , merged 또는 aborted |
flags |
프로토 메시지에서 가져온 전환 플래그 |
window_manager_shell_transition_handlers
:
열 | 설명 |
---|---|
handler_id |
window_manager_shell_transitions 의 handler 열에 있는 값에 해당하는 ID |
handler_name |
문자열 번역 |
android_window_manager_shell_transition_participants
:
열 | 설명 |
---|---|
transition_id |
원시 프로토 메시지에서 가져온 전환 ID |
layer_id |
SurfaceFlinger 레이어 참여자의 ID |
window_id |
WindowManager 컨테이너 참여자의 ID |
ViewCapture SQL 뷰
ViewCapture 프로토 데이터는 View
형식을 사용합니다.
ViewCapture 데이터를 검색하려면 viewcapture_search
보기를 사용하세요. 이 뷰에는 다음 열이 포함됩니다.
열 | 설명 |
---|---|
state_id |
뷰가 속한 상태의 행 ID |
ts |
뷰가 속한 상태의 타임스탬프 |
package_name |
패키지 이름 |
window_name |
창 이름 |
class_name |
수업 이름 보기 |
property |
반복되는 필드를 고려한 속성 이름 |
flat_property |
반복 필드를 고려하지 않는 속성 이름 |
value |
문자열 형식의 속성 값 |
previous_value |
이전 상태의 속성 값(문자열 형식) |
쿼리 예
SearchContainerView
가 y 방향으로 이동할 때의 모든 상태를 찾습니다.
SELECT * FROM viewcapture_search
WHERE class_name LIKE '%SearchContainerView'
AND flat_property='translation_y'
AND value!=previous_value
데이터 표
ViewCapture 뷰는 다음 기본 테이블을 사용하여 생성됩니다.
android_viewcapture
:
열 | 설명 |
---|---|
id |
항목의 행 ID |
ts |
항목의 타임스탬프 |
arg_set_id |
args 테이블의 행을 이 항목과 연결하는 데 사용되는 ID입니다. |
android_viewcapture_view
:
열 | 설명 |
---|---|
id |
뷰의 행 ID |
snapshot_id |
뷰가 속한 android_viewcapture 의 항목 행 ID |
arg_set_id |
args 테이블의 행을 이 뷰와 연결하는 데 사용되는 ID입니다. |
ProtoLog SQL 테이블
ProtoLog 프로토 데이터는 ProtoLogMessage
형식을 사용합니다. 이 뷰에는 다음 열이 포함됩니다.
열 | 설명 |
---|---|
ts |
로그의 타임스탬프 |
level |
로그 수준 |
tag |
로깅 그룹 태그 |
message |
로그 메시지 |
stacktrace |
스택 트레이스 (있는 경우) |
location |
메시지가 시작된 코드 위치 |
쿼리 예
transition
가 포함된 메시지가 있는 모든 로그를 찾습니다.SELECT ts, message, location FROM protolog WHERE message LIKE '%transition%'
유효한 트랜잭션 ID가 포함된 모든 로그를 찾습니다.
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, '%');
쿼리 실행
검색 뷰어의 왼쪽에 있는 전역 검색 패널을 사용하여 검색어를 실행할 수 있습니다.
전역 검색 패널과 처음 상호작용하면 추적 검색이 초기화되고 Winscope에서 도우미 SQL 뷰를 만듭니다. 몇 초 정도 걸립니다. 트레이스 검색이 초기화되는 동안에는 타임라인을 사용할 수 없습니다.
쿼리를 시작하려면 검색창에 쿼리를 작성하고 검색 쿼리 실행을 클릭하거나 키보드에서 Enter 키를 눌러 실행합니다.
완료되면 결과 표가 가운데 패널에 표시됩니다. 검색창 아래에 쿼리가 표시되며 세션 간에 쿼리를 저장할 수 있는 필드가 있습니다.
왼쪽 패널에서 저장됨 탭을 클릭하여 저장된 쿼리에 액세스하고 최근 탭을 클릭하여 최근에 실행한 쿼리에 액세스할 수 있습니다.
그림 2. 뷰어 왼쪽 패널을 검색합니다.
결과
모든 쿼리는 표 형식의 결과를 반환하며, 이 결과는 스크롤 가능한 뷰에 표시됩니다. 이 뷰는 트랜잭션 및 ProtoLog와 같은 로그 기반 트레이스 뷰어와 유사한 대화형 동작을 제공합니다.
그림 3. 시청자 결과를 검색합니다.
결과 테이블에 ts
열이 포함된 경우 해당 열의 값은 타임스탬프로 해석되어 타임라인 오버레이에 새 항목 행으로 추가됩니다. 이 행을 클릭하고 왼쪽 및 오른쪽 화살표 키를 사용하여 항목 간에 이동합니다.
그림 4. 타임라인을 검색합니다.