โปรไฟล์ Query ProfilingManager

การค้นหาโปรไฟล์ ProfilingManager คล้ายกับการค้นหาโปรไฟล์ Perfetto ปกติ ดังนั้น โปรดอ่านการเริ่มต้นใช้งาน PerfettoSQL เพื่อดูคำแนะนำเกี่ยวกับวิธีค้นหาโปรไฟล์

ความแตกต่างที่สำคัญระหว่างการติดตาม Perfetto ปกติกับการติดตาม ProfilingManager คือการติดตาม ProfilingManager จะผ่านเครื่องมือปกปิดข้อมูลการติดตาม เครื่องมือปกปิดข้อมูลนี้จะนำข้อมูลเกี่ยวกับกระบวนการอื่นๆ ที่ไม่เกี่ยวข้องกับแอปของคุณออกเนื่องด้วยเหตุผลด้านความเป็นส่วนตัว

การสืบค้นบางรายการจากไลบรารีมาตรฐาน Perfetto จะใช้ไม่ได้กับการติดตามที่ถูกปกปิดข้อมูล เนื่องจาก ProfilingManager จะรวบรวมเฉพาะข้อมูลการทำโปรไฟล์สำหรับแอปของคุณเท่านั้น ไม่ใช่กระบวนการอื่นๆ ด้วยเหตุนี้ การค้นหาที่คุณใช้กับ ProfilingManager จึงเป็นชุดที่เล็กกว่าการค้นหาสำหรับโปรไฟล์ระบบแบบเต็มที่บันทึกโดยใช้ Perfetto ในเครื่อง

แม้ว่าพื้นที่การค้นหาจะลดลง แต่คุณยังคงใช้การค้นหาและตาราง PerfettoSQL จำนวนมากจากไลบรารีมาตรฐาน Perfetto ได้ตามที่เป็นอยู่ เราจึงขอแนะนำให้คุณลองใช้

นอกจากนี้ เราขอแนะนำให้อ่านการวิเคราะห์ Android Trace เพื่อค้นหาการค้นหาที่พร้อมใช้งานซึ่งให้ข้อมูลประสิทธิภาพที่เป็นประโยชน์โดยไม่ต้องแก้ไข

ตัวอย่างการค้นหา 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 เนื่องจากระยะเวลาของส่วนในตาราง 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

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

นอกจากนี้ คุณยังค้นหาโปรไฟล์ที่เกี่ยวข้องกับหน่วยความจำ เช่น ฮีปดัมป์ เพื่อทำการวิเคราะห์หน่วยความจำที่ซับซ้อนมากขึ้นได้ด้วย

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 Startup ในการติดตาม

-- 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 Launch) และส่วน Choreographer#doFrame แรก (เฟรมแรกที่สร้างขึ้น) เมตริกนี้จะประมาณ TTFF (เวลาที่ใช้ในการแสดงเฟรมแรก) ของ Cold Startup ได้อย่างมีประสิทธิภาพ