تشبه عملية طلب بيانات ملفات 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 الأولى (الإطار الأول الذي تم إنشاؤه). يقيس هذا المقياس بشكل فعّال الوقت اللازم لعرض أول إطار عند بدء التشغيل المجرّد.