ProfilingManager 프로필을 쿼리하는 것은 일반 Perfetto 프로필을 쿼리하는 것과 유사합니다. 따라서 프로필을 쿼리하는 방법에 관한 가이드는 PerfettoSQL 시작하기를 참고하세요.
일반 Perfetto 트레이스와 ProfilingManager 트레이스의 중요한 차이점은 ProfilingManager 트레이스가 트레이스 수정자를 통과한다는 것입니다. 이 수정 도구는 개인 정보 보호를 위해 앱과 관련이 없는 다른 프로세스에 관한 정보를 삭제합니다.
Perfetto 표준 라이브러리의 일부 쿼리는 수정된 트레이스에서 사용할 수 없습니다. ProfilingManager는 다른 프로세스가 아닌 앱의 프로파일링 데이터만 수집하기 때문입니다. 따라서 ProfilingManager와 함께 사용할 수 있는 쿼리는 로컬 Perfetto를 사용하여 기록된 전체 시스템 프로필의 쿼리보다 작은 집합입니다.
쿼리 공간이 줄어들더라도 Perfetto 표준 라이브러리의 많은 PerfettoSQL 쿼리와 테이블을 그대로 사용할 수 있으므로 사용해 보시기 바랍니다.
또한 Android 트레이스 분석을 검토하여 수정 없이 유용한 성능 데이터를 제공하는 바로 사용할 수 있는 쿼리를 찾는 것이 좋습니다.
ProfilingManager 샘플 쿼리
쿼리 여정을 간소화하기 위해 이 섹션에서는 ProfilingManager와 함께 작동하는 쿼리 목록을 제공합니다. 이러한 쿼리를 직접 사용하거나 다른 쿼리를 빌드하는 예로 사용할 수 있습니다.
가장 중복된 슬라이스 찾기
이 쿼리는 트레이스에서 반복되는 슬라이스를 찾아 표시되는 빈도별로 정렬하여 가장 많이 중복된 슬라이스를 먼저 표시합니다.
중복된 작업을 찾는 것은 트레이스에서 불필요한 작업을 찾는 일반적인 방법입니다.
-- You only need to call this once in the session to create the function
DROP TABLE IF EXISTS find_duplicates;
CREATE PERFETTO FUNCTION find_duplicates(pattern STRING) RETURNS
TABLE(name STRING, count_slice LONG) AS SELECT name, COUNT(dur) as count_slice FROM slice WHERE name GLOB $pattern GROUP BY name HAVING COUNT(name) >= 2 ORDER BY count_slice DESC;
-- Subsequent calls can just use the function to find dupes
SELECT * FROM find_duplicates('*Text*')
버벅거림 쿼리
느린 프레임 찾기
이 쿼리는 예상 프레임 속도 60Hz (16.6ms)를 가정하여 앱에서 프레임을 생성하는 데 너무 오래 걸리는 프레임을 찾습니다. Perfetto 테이블의 슬라이스 지속 시간은 나노초로 저장되므로 dur은 16,660,000으로 설정됩니다.
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;
버벅거림을 유발하는 프레임 찾기
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type = 'App Deadline Missed';
이 쿼리는 앱이 프레임을 생성하는 데 너무 오래 걸려 트레이스에서 버벅거림이 발생하는 위치를 찾는 데 유용합니다. 이는 UI 스레드가 프레임을 생성하지 못했음을 의미합니다. 극단적인 상황에서는 ANR이 발생하기 전에 이 문제가 발생할 수 있습니다.
가장 중복된 객체 찾기
힙 덤프와 같은 메모리 관련 프로필을 쿼리하여 더 복잡한 메모리 분석을 실행할 수도 있습니다.
INCLUDE PERFETTO MODULE android.memory.heap_graph.heap_graph_class_aggregation;
SELECT * FROM android_heap_graph_class_aggregation WHERE obj_count >= 2
ORDER BY obj_count DESC LIMIT 100
이 쿼리는 중복된 객체 상위 100개를 반환합니다. 이렇게 하면 여러 번 인스턴스화된 객체를 찾을 수 있으며, 이를 통해 객체를 캐시하거나 의도하지 않은 중복을 식별할 수 있습니다.
콜드 스타트 지연 시간
스타트업을 쿼리할 수도 있습니다. 이 섹션에서는 트레이스에서 콜드 시작 시간을 추정하기 위한 더 자세한 쿼리를 제공합니다.
-- This function finds slices that match the given GLOB $pattern
CREATE OR REPLACE FUNCTION find_slices(pattern STRING) RETURNS
TABLE (name STRING, ts LONG, dur LONG) AS
SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;
-- This function generates a slice that starts at $startSlicePattern and finishes at the slice matched by $endSlicePattern. If $inclusive is true, then the end slice dur will be added, otherwise, the end slice start time will be used.
CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
TABLE(name STRING, ts LONG, dur LONG) AS
SELECT name, ts, MIN(startToEndDur) as dur
FROM
(SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
WHERE startToEndDur > 0)
GROUP BY name, ts;
-- Using these functions we can estimate cold startup time by generating a slice between bindApplication and first frame.
SELECT * from generate_start_to_end_slices('bindApplication','*Choreographer#doFrame [0-9]*', true)
이 쿼리는 콜드 앱 실행 시작 시 일반적으로 발견되는 bindApplication와 첫 번째 Choreographer#doFrame 슬라이스(첫 번째 생성 프레임) 등 시작 시간을 정의하는 두 슬라이스 사이의 시간을 나타내는 슬라이스를 생성합니다. 이 측정항목은 콜드 스타트 TTFF (첫 번째 프레임까지의 시간)를 효과적으로 추정합니다.