إنّ الاستعلام عن ملفات 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 هرتز (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';
يُعدّ طلب البحث هذا مفيدًا للعثور على المواقع التي يحدث فيها تقطُّع في التتبُّع لأنّ التطبيق يستغرق وقتًا طويلاً لإنشاء إطار. وهذا يعني أنّ سلسلة واجهة المستخدم تعذّر عليها إنشاء إطار. في الحالات القصوى، قد يسبق ذلك حدوث خطأ 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 عنصر مكرّر. يمكن أن يساعدك ذلك في العثور على العناصر التي تم إنشاء مثيل لها عدة مرات، ما قد يكشف عن فرص لتخزينها مؤقتًا أو تحديد النُسخ المكرّرة غير المقصودة.
وقت استجابة التشغيل على البارد
يمكنك أيضًا الاستعلام عن الشركات الناشئة. يقدّم هذا القسم طلب بحث أكثر تفصيلاً لتقدير وقت التشغيل على البارد في عملية تتبُّع.
-- 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)
ينشئ هذا الطلب شريحة تمثّل الوقت بين شريحتَين تحدّدان وقت بدء التشغيل: bindApplication (تظهر عادةً في بداية تشغيل التطبيق على البارد) وأول شريحة Choreographer#doFrame (أول لقطة يتم إنشاؤها). يقدّر هذا المقياس بشكل فعّال وقت عرض الإطار الأول (TTFF) للتشغيل على البارد.