SQL을 사용하여 Winscope Perfetto 트레이스에서 특정 상태를 찾습니다. Winscope UI의 글로벌 검색 뷰어를 사용하여 쿼리를 실행하고 표 형식의 결과를 시각화합니다.
그림 1. 시청자 검색 탭
검색 보기를 사용하면 Perfetto 트레이스에서 맞춤 SQL 쿼리를 작성하고 실행하고 최근 쿼리 및 저장된 쿼리에 액세스할 수 있습니다. Winscope는 SurfaceFlinger 및 트랜잭션 트레이스를 검색하는 데 도움이 되는 특수 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
)로 표시됩니다.
- 불리언 값은
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, ']') ), '%' )
거래 SQL 뷰
거래 프로토 데이터는 TransactionTraceEntry
형식을 사용합니다.
거래 데이터를 검색하려면 transactions_search
보기를 사용하세요. 이 뷰에는 다음 열이 포함됩니다.
열 | 설명 |
---|---|
state_id |
proto 속성이 속한 항목의 고유 ID입니다. |
ts |
proto 속성이 속한 항목의 타임스탬프 |
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'
전환 SQL 뷰
전환 프로토 데이터는 ShellTransition
형식을 사용합니다.
전환 데이터를 검색하려면 transitions_search
보기를 사용하세요. 이 뷰에는 다음 열이 포함됩니다.
열 | 설명 |
---|---|
ts |
전송 시간 - 사용 가능한 경우 전송 시간으로 대체되고 그렇지 않으면 0 |
transition_id |
전환 ID |
property |
반복되는 필드를 고려한 속성 이름 |
flat_property |
반복되는 필드를 고려하지 않는 속성 이름 |
value |
문자열 형식의 속성 값 |
쿼리 예시
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
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
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, '%');
쿼리 실행
왼쪽 패널을 사용하면 추적 검색이 시작됩니다. 이 작업은 몇 초 정도 걸립니다. 시작하는 동안에는 타임라인을 사용할 수 없습니다.
트레이스 검색이 초기화되면 검색창에 쿼리를 입력하고 검색 쿼리 실행을 클릭하거나 키보드에서 Enter 키를 눌러 실행합니다.
완료되면 결과 표가 가운데 패널에 표시됩니다. 검색어는 검색창 아래에 표시되며 세션 간에 검색어를 저장할 수 있는 입력란이 있습니다.
왼쪽 패널에서 저장됨 탭을 클릭하여 저장된 쿼리에 액세스하고 최근 탭을 클릭하여 최근에 실행된 쿼리에 액세스할 수 있습니다.
그림 2. 뷰어 왼쪽 패널에서 검색합니다.
결과
모든 쿼리는 표 형식의 결과를 반환하며, 이 결과는 Transactions 및 ProtoLog와 같은 로그 기반 트레이스 뷰어와 유사한 양방향 동작으로 스크롤 가능한 뷰에 표시됩니다.
그림 3. 뷰어 검색 결과
결과 테이블에 ts
열이 포함된 경우 해당 열의 값이 타임스탬프로 해석되어 타임라인 오버레이에 새 항목 행으로 추가됩니다. 이 행을 클릭하고 왼쪽 및 오른쪽 화살표 키를 사용하여 항목 간에 이동합니다.
그림 4. 타임라인을 검색합니다.