โปรไฟล์ Query ProfilingManager

การค้นหาโปรไฟล์ 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*')

การค้นหาที่กระตุก

ค้นหาเฟรมที่ช้า

คําค้นหานี้จะค้นหาเฟรมที่แอปใช้เวลานานเกินไปในการสร้างเฟรม โดยสมมติว่าอัตราเฟรมที่คาดไว้คือ 60 Hz (16.6 มิลลิวินาที) dur ตั้งค่าเป็น 16,660,000 เนื่องจากระยะเวลาของ Slice ในตาราง Perfetto จะจัดเก็บเป็นหน่วยนาโนวินาที

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

ค้นหาออบเจ็กต์ที่ซ้ำกันมากที่สุด

นอกจากนี้ คุณยังค้นหาโปรไฟล์ที่เกี่ยวข้องกับหน่วยความจำ เช่น 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 Startup

นอกจากนี้ คุณยังค้นหาข้อมูลเกี่ยวกับสตาร์ทอัปได้ด้วย ส่วนนี้จะแสดงการค้นหาที่ซับซ้อนมากขึ้นเพื่อ ประมาณเวลาในการเริ่มแอปแบบ 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)

คําค้นหานี้จะสร้าง Slice ที่แสดงเวลาที่อยู่ระหว่าง 2 Slice ที่กําหนดเวลาเริ่มต้น ได้แก่ bindApplication (โดยปกติจะอยู่ที่จุดเริ่มต้นของการเปิดแอปแบบเย็น) และ Slice Choreographer#doFrame แรก (เฟรมแรกที่สร้างขึ้น) เมตริกนี้จะประมาณค่า TTFF (เวลาจนถึงเฟรมแรก) ของการเริ่มต้นแบบ Cold Start ได้อย่างมีประสิทธิภาพ