Truy vấn hồ sơ ProfilingManager

Truy vấn hồ sơ ProfilingManager tương tự như 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ơ.

Điểm khác biệt quan trọng giữa các dấu vết Perfetto thông thường và dấu vết ProfilingManager là dấu vết ProfilingManager sẽ đi qua một trình biên tập dấu vết. Công cụ chỉnh sửa 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 trong thư viện chuẩn Perfetto không dùng được trên các dấu vết đã được chỉnh sửa. Lý do là ProfilingManager chỉ thu thập dữ liệu lập hồ sơ 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 chuẩn Perfetto như hiện tại. Vì vậy, bạn nên thử các truy vấn và bảng này.

Bạn cũng nên xem 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á quá 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 những 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 dấu vết và sắp xếp chúng theo tần suất xuất hiện, cho thấy các lát cắt trùng lặp nhiều nhất trước tiên.

Tìm công việc 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 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 về hiện tượng giật

Tìm khung hình chậm

Truy vấn này tìm những khung hình mà ứng dụng của bạn mất quá nhiều thời gian để tạo, giả sử tốc độ khung hình dự kiến là 60 Hz (16,6 mili giây). dur được đặt thành 16.660.000 vì thời lượng của các lát trong bảng Perfetto được lưu trữ bằng nano giây.

INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;

Tìm các 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 khi tìm những vị trí xảy ra tình trạ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 trường hợp cực đoan, điều này có thể xảy ra trước lỗi ANR.

Tìm các đối tượng 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 các 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 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, điều này có thể cho thấy cơ hội lưu trữ chúng vào bộ nhớ đệm hoặc xác định các bản sao không mong muốn.

Độ trễ khởi động nguội

Bạn cũng có thể truy vấn các công ty khởi nghiệp. 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 ra một lát cắt biểu thị thời gian giữa hai lát cắt xác định thời gian khởi động: bindApplication (thường xuất hiện khi bắt đầu khởi động ứng dụng từ đầu) 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 hiển thị khung hình đầu tiên) khi khởi động nguội.