การค้นหาโปรไฟล์ ProfilingManager คล้ายกับการค้นหาโปรไฟล์ Perfetto ปกติ ดังนั้น โปรดดู คู่มือเริ่มต้นใช้งาน PerfettoSQL เพื่อดูคำแนะนำเกี่ยวกับ
วิธีค้นหาโปรไฟล์
ความแตกต่างที่สำคัญระหว่างการติดตาม Perfetto ปกติกับการติดตาม ProfilingManager คือการติดตาม ProfilingManager จะผ่านตัวแก้ไขข้อมูลการติดตาม ตัวแก้ไขนี้จะนำข้อมูลเกี่ยวกับกระบวนการอื่นๆ ที่ไม่เกี่ยวข้องกับแอปของคุณออกด้วยเหตุผลด้านความเป็นส่วนตัว
คุณไม่สามารถใช้การค้นหาบางรายการจากไลบรารีมาตรฐานของ Perfetto กับการติดตามที่แก้ไขแล้ว เนื่องจาก ProfilingManager จะรวบรวมข้อมูลการสร้างโปรไฟล์สำหรับแอปของคุณเท่านั้น ไม่ใช่กระบวนการอื่นๆ ด้วยเหตุนี้ การค้นหาที่คุณใช้กับ ProfilingManager จึงเป็นชุดการค้นหาที่เล็กกว่าการค้นหาสำหรับโปรไฟล์ระบบแบบเต็มที่บันทึกโดยใช้ Perfetto ในเครื่อง
แม้ว่าพื้นที่การค้นหาจะลดลง แต่คุณยังคงใช้การค้นหาและตาราง PerfettoSQL หลายรายการจาก ไลบรารีมาตรฐานของ Perfetto ได้ตามเดิม ดังนั้นเรา ขอแนะนำให้คุณลองใช้
นอกจากนี้ เรายังแนะนำให้คุณอ่านหัวข้อ การวิเคราะห์การติดตาม 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*')
การค้นหา Jank
ค้นหาเฟรมที่ช้า
การค้นหานี้จะค้นหาเฟรมที่แอปใช้เวลานานเกินไปในการสร้างเฟรม โดยสมมติว่าอัตราเฟรมที่คาดไว้คือ 60 Hz (16.6 มิลลิวินาที) ระบบตั้งค่า dur เป็น 16,660,000 เนื่องจากระยะเวลาของสไลซ์ในตาราง Perfetto จะจัดเก็บเป็นนาโนวินาที
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;
ค้นหาเฟรมที่ทำให้เกิด Jank
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type = 'App Deadline Missed';
การค้นหานี้มีประโยชน์ในการค้นหาสถานที่ที่เกิด Jank ในการติดตาม เนื่องจากแอปใช้เวลานานเกินไปในการสร้างเฟรม ซึ่งหมายความว่าเทรด UI สร้างเฟรมไม่สำเร็จ ในสถานการณ์ที่รุนแรง เหตุการณ์นี้อาจเกิดขึ้นก่อน ANR
ค้นหาออบเจ็กต์ที่ซ้ำกันมากที่สุด
นอกจากนี้ คุณยังค้นหาโปรไฟล์ที่เกี่ยวข้องกับหน่วยความจำ เช่น Heap Dump เพื่อทำการวิเคราะห์หน่วยความจำที่ซับซ้อนมากขึ้นได้ด้วย
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 รายการแรก ซึ่งจะช่วยคุณค้นหาออบเจ็กต์ที่สร้างอินสแตนซ์หลายครั้ง ซึ่งอาจเผยให้เห็นโอกาสในการแคชออบเจ็กต์เหล่านั้นหรือระบุรายการที่ซ้ำกันโดยไม่ตั้งใจ
เวลาแฝงในการเริ่มแอปแบบ Cold Start
นอกจากนี้ คุณยังค้นหาการเริ่มแอปได้ด้วย ส่วนนี้มีการค้นหาที่ละเอียดยิ่งขึ้นเพื่อประมาณเวลาในการเริ่มแอปแบบ Cold Start ในการติดตาม
-- 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)
การค้นหานี้จะสร้างสไลซ์ที่แสดงเวลาที่ผ่านไประหว่าง 2 สไลซ์ที่กำหนดเวลาในการเริ่มแอป ได้แก่ bindApplication (โดยปกติจะอยู่ที่จุดเริ่มต้นของการเปิดแอปแบบ Cold Start) และสไลซ์ Choreographer#doFrame แรก (เฟรมแรกที่สร้างขึ้น) เมตริกนี้จะประมาณ TTFF (เวลาในการแสดงเฟรมแรก) ของการเริ่มแอปแบบ Cold Start ได้อย่างมีประสิทธิภาพ