Việc truy vấn hồ sơ ProfilingManager tương tự như việc truy vấn hồ sơ Perfetto thông thường. Do đó, hãy xem bài viết Bắt đầu sử dụng PerfettoSQL để biết hướng dẫn về
cách truy vấn hồ sơ.
Một điểm khác biệt quan trọng giữa dấu vết Perfetto thông thường và dấu vết ProfilingManager là dấu vết ProfilingManager đi qua một trình biên tập dấu vết. Trình biên tập này sẽ xoá thông tin về các quy trình khác không liên quan đến ứng dụng của bạn vì lý do quyền riêng tư.
Một số truy vấn từ thư viện tiêu chuẩn Perfetto không dùng được trên dấu vết đã biên tập. Lý do là vì ProfilingManager chỉ thu thập dữ liệu phân tích cho ứng dụng của bạn, chứ không phải các quy trình khác. Do đó, các truy vấn mà bạn có thể sử dụng với ProfilingManager là một tập hợp nhỏ hơn so với các truy vấn cho hồ sơ hệ thống đầy đủ được ghi lại bằng Perfetto cục bộ.
Mặc dù không gian truy vấn bị giảm, nhưng bạn vẫn có thể sử dụng nhiều truy vấn và bảng PerfettoSQL từ Thư viện tiêu chuẩn Perfetto như hiện tại. Vì vậy, chúng tôi khuyến khích bạn thử các truy vấn và bảng này.
Bạn cũng nên xem bài viết Phân tích dấu vết Android để tìm các truy vấn sẵn sàng sử dụng, cung cấp dữ liệu hiệu suất hữu ích mà không cần sửa đổi.
Truy vấn mẫu ProfilingManager
Để đơn giản hoá hành trình truy vấn, phần này cung cấp danh sách các truy vấn hoạt động với ProfilingManager. Bạn có thể sử dụng trực tiếp các truy vấn này hoặc dùng làm ví dụ để tạo các truy vấn khác.
Tìm các lát cắt bị trùng lặp nhiều nhất
Truy vấn này tìm các lát cắt lặp lại trong một dấu vết và sắp xếp theo tần suất xuất hiện, hiển thị các lát cắt bị trùng lặp nhiều nhất trước.
Tìm công việc bị trùng lặp là một cách phổ biến để tìm công việc không cần thiết trong một dấu vết.
-- 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*')
Truy vấn giật
Tìm khung hình chậm
Truy vấn này tìm các khung hình mà ứng dụng của bạn mất quá nhiều thời gian để tạo một khung hình, giả sử tốc độ khung hình dự kiến là 60 Hz (16,6 ms). dur được đặt thành 16.660.000 vì thời lượng lát cắt trong bảng Perfetto được lưu trữ theo nano giây.
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
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type = 'App Deadline Missed';
Truy vấn này hữu ích để tìm các vị trí xảy ra hiện tượng giật trong dấu vết vì ứng dụng mất quá nhiều thời gian để tạo một khung hình. Điều này có nghĩa là luồng giao diện người dùng không tạo được khung hình. Trong những trường hợp cực đoan, điều này có thể xảy ra trước khi ANR.
Tìm các đối tượng bị trùng lặp nhiều nhất
Bạn cũng có thể truy vấn các hồ sơ liên quan đến bộ nhớ, chẳng hạn như tệp báo lỗi, để thực hiện phân tích bộ nhớ phức tạp hơn.
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
Truy vấn này trả về 100 đối tượng bị trùng lặp hàng đầu. Điều này có thể giúp bạn tìm thấy các đối tượng được khởi tạo nhiều lần, có thể tiết lộ cơ hội lưu vào bộ nhớ đệm hoặc xác định các bản sao không mong muốn.
Độ trễ khi khởi động nguội
Bạn cũng có thể truy vấn để khởi động. Phần này cung cấp một truy vấn chi tiết hơn để ước tính thời gian khởi động nguội trong một dấu vết.
-- 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)
Truy vấn này tạo một lát cắt đại diện cho thời gian giữa hai lát cắt xác định thời gian khởi động: bindApplication (thường thấy khi bắt đầu khởi chạy ứng dụng nguội) và lát cắt Choreographer#doFrame đầu tiên (khung hình được tạo đầu tiên). Chỉ số này ước tính hiệu quả TTFF (thời gian đến khung hình đầu tiên) khi khởi động nguội.