پرسوجو از پروفایلهای ProfilingManager مشابه پرسوجو از پروفایلهای معمولی Perfetto است. بنابراین، برای راهنمایی در مورد نحوه پرسوجو از پروفایلها، بخش «شروع به کار با PerfettoSQL» را مرور کنید.
یک تمایز مهم بین ردپاهای معمولی Perfetto و ردپاهای ProfilingManager این است که ردپاهای ProfilingManager از یک ویرایشگر ردپا عبور میکنند. این ویرایشگر، اطلاعات مربوط به سایر فرآیندهای غیرمرتبط با برنامه شما را به دلایل حریم خصوصی حذف میکند.
برخی از کوئریهای کتابخانه استاندارد Perfetto در ردپاهای ویرایششده قابل استفاده نیستند. دلیل این امر این است که ProfilingManager فقط دادههای پروفایلینگ را برای برنامه شما جمعآوری میکند، نه سایر فرآیندها. در نتیجه، کوئریهایی که میتوانید با ProfilingManager استفاده کنید، مجموعه کوچکتری نسبت به کوئریهای مربوط به پروفایلهای کامل سیستم هستند که با استفاده از Perfetto محلی ضبط میشوند.
اگرچه فضای پرسوجو کاهش یافته است، اما همچنان میتوانید از بسیاری از پرسوجوها و جداول PerfettoSQL از کتابخانه استاندارد Perfetto به همان شکل استفاده کنید، بنابراین توصیه میکنیم آنها را امتحان کنید.
همچنین توصیه میکنیم برای یافتن کوئریهای آمادهای که دادههای عملکردی مفید را بدون تغییر ارائه میدهند، Analyzing Android Traces را بررسی کنید.
نمونه سوالات 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*')
سوالات جنک
فریمهای کند را پیدا کنید
این کوئری فریمهایی را پیدا میکند که برنامه شما برای تولید یک فریم در آنها زمان زیادی صرف میکند، با فرض نرخ فریم مورد انتظار ۶۰ هرتز (۱۶.۶ میلیثانیه). مقدار dur روی ۱۶,۶۶۰,۰۰۰ تنظیم شده است زیرا مدت زمان برشها در جداول 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';
این کوئری برای یافتن مکانهایی که در ردیابی، خطای jank رخ میدهد مفید است، زیرا برنامه برای تولید فریم خیلی طول میکشد. این بدان معناست که نخ رابط کاربری نتوانسته فریمی تولید کند. در شرایط خاص، این میتواند منجر به ANR شود.
یافتن اشیاء با بیشترین تکرار
همچنین میتوانید از پروفایلهای مرتبط با حافظه، مانند heap dumps، برای انجام تحلیلهای پیچیدهتر حافظه استفاده کنید.
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
این کوئری ۱۰۰ شیء تکراری برتر را برمیگرداند. این میتواند به شما در یافتن اشیایی که چندین بار نمونهسازی شدهاند کمک کند، که ممکن است فرصتهایی را برای ذخیرهسازی آنها یا شناسایی موارد تکراری ناخواسته آشکار کند.
تأخیر راهاندازی سرد
همچنین میتوانید برای راهاندازیها پرسوجو کنید. این بخش پرسوجوی مفصلتری برای تخمین زمان راهاندازی سرد در یک ردیابی ارائه میدهد.
-- 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 راهاندازی سرد (زمان تا اولین فریم) را تخمین میزند.