الاستعلام عن الملفات الشخصية باستخدام PerfettoSQL

يمكنك الاستعلام عن ملفات ProfilingManager الشخصية باستخدام PerfettoSQL والوحدات من مكتبة Perfetto Standard Library. بما أنّ ProfilingManager يخفي بيانات سجلّات تتبّع النظام لتضمين بيانات عمليات تطبيقك فقط، لا يمكن إجراء طلبات بحث في المكتبة العادية على مستوى النظام والتي تعتمد على عمليات أخرى. ومع ذلك، تعمل معظم طلبات البحث على مستوى التطبيق ووحدات المكتبة العادية بدون تعديل. للحصول على طلبات بحث إضافية جاهزة للاستخدام، يُرجى الاطّلاع على تحليل تتبُّعات Android.

أمثلة على طلبات ProfilingManager

يمكنك استخدام نماذج طلبات البحث التالية مباشرةً أو كنماذج لتحليل PerfettoSQL الخاص بك.

العثور على الشرائح الأكثر تكرارًا

غالبًا ما تشير الشرائح المتكررة إلى عمل مكرر. لمعرفة التفاصيل حول بنية الدوال، يُرجى الاطّلاع على تحديد الدوال في PerfettoSQL. يحدّد طلب البحث التالي دالة PerfettoSQL قابلة لإعادة الاستخدام تعثر على الشرائح التي تتطابق مع نمط GLOB وترتّبها حسب معدّل التكرار:

-- You only need to call this once in the session to create or update the function
CREATE OR REPLACE 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*')

طلبات البحث التي تتضمّن أخطاءً

استخدِم طلبات البحث التالية لتحديد اللقطات البطيئة أو المتقطّعة في سجلّ تتبّع النظام.

العثور على اللقطات البطيئة

يعثر طلب البحث هذا على اللقطات التي يستغرق عرضها أكثر من 16.6 ملي ثانية (60 هرتز). بما أنّ Perfetto تخزّن مُدد الشرائح بالنانو ثانية، تتم مقارنة dur بـ 16660000:

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 GLOB '*App Deadline Missed*';

العثور على العناصر الأكثر تكرارًا

في لقطة لأجزاء من الذاكرة في Java، يعرض طلب البحث هذا أهم 100 فئة تتضمّن مثيلَين أو أكثر لمساعدتك في رصد النُسخ المكرّرة غير المقصودة أو فرص التخزين المؤقت:

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

وقت استجابة التشغيل على البارد

يقدّر طلب البحث هذا وقت التشغيل على البارد حتى عرض الإطار الأول (TTFF) من خلال قياس المدة بين bindApplication وشريحة Choreographer#doFrame الأولى:

-- This function finds slices that match the given GLOB $pattern
CREATE OR REPLACE PERFETTO 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)