Bạn có thể truy vấn hồ sơ ProfilingManager bằng PerfettoSQL và các mô-đun trong Thư viện chuẩn Perfetto. Vì ProfilingManager loại bỏ dấu vết hệ thống để chỉ bao gồm dữ liệu quy trình của ứng dụng, nên các truy vấn thư viện chuẩn trên toàn hệ thống phụ thuộc vào các quy trình khác sẽ không được hỗ trợ. Tuy nhiên, hầu hết các truy vấn trong phạm vi ứng dụng và mô-đun thư viện chuẩn đều hoạt động mà không cần sửa đổi. Để biết thêm các truy vấn có sẵn, hãy xem phần Phân tích dấu vết Android.
Truy vấn mẫu của ProfilingManager
Sử dụng trực tiếp các truy vấn mẫu sau đây hoặc làm mẫu cho bản phân tích PerfettoSQL của riêng bạn.
Tìm các lát cắt trùng lặp nhiều nhất
Các lát cắt lặp lại thường cho thấy công việc thừa. Để biết thông tin chi tiết về cú pháp hàm, hãy xem phần Xác định hàm trong PerfettoSQL. Truy vấn sau đây xác định một hàm PerfettoSQL có thể sử dụng lại, giúp tìm các lát cắt khớp với mẫu GLOB và sắp xếp các lát cắt đó theo tần suất:
-- You only need to call this once in the session to create or update the function
CREATE OR REPLACE 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*')
Cụm từ tìm kiếm về hiện tượng giật
Sử dụng các truy vấn sau để xác định khung hình chậm hoặc giật trong dấu vết hệ thống.
Tìm khung hình chậm
Truy vấn này tìm các khung hình mất hơn 16,6 mili giây (60 Hz) để kết xuất. Vì Perfetto lưu trữ thời lượng của lát cắt theo nano giây, nên dur được so sánh với 16660000:
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;
Tìm khung hình gây ra hiện tượng giật
Truy vấn này sử dụng mô-đun dòng thời gian khung để tìm các khung hình mà ứng dụng đã bỏ lỡ thời hạn kết xuất theo tốc độ làm mới của thiết bị:
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type GLOB '*App Deadline Missed*';
Tìm các đối tượng trùng lặp nhiều nhất
Trong tệp báo lỗi vùng nhớ khối xếp Java, truy vấn này trả về 100 lớp hàng đầu có hai hoặc nhiều thực thể để giúp bạn phát hiện các bản sao ngoài ý muốn hoặc cơ hội lưu vào bộ nhớ đệm:
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
Độ trễ khởi động nguội
Truy vấn này ước tính thời gian khởi động nguội đến khung hình đầu tiên (TTFF) bằng cách đo lường
khoảng thời gian giữa bindApplication và lát cắt Choreographer#doFrame đầu tiên:
-- This function finds slices that match the given GLOB $pattern
CREATE OR REPLACE PERFETTO 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)