نمایه‌های Query ProfilingManager

پرس‌وجو کردن نمایه‌های 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*')

پُرسمان‌های نامربوط

پیدا کردن قاب‌های آهسته

این پُرسمان قاب‌هایی را پیدا می‌کند که در آن‌ها برنامه شما زمان زیادی برای تولید قاب صرف می‌کند، با فرض اینکه نرخ فریم موردانتظار ۶۰ هرتز (۱۶٫۶ میلی‌ثانیه) باشد. 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';

این پُرسمان برای پیدا کردن مکان‌هایی که در ردگیری دچار لرزش می‌شوند مفید است زیرا برنامه برای تولید فریم زمان زیادی صرف می‌کند. این یعنی رشته میانای کاربر نتوانسته است فریم تولید کند. در شرایط حاد، این امر می‌تواند پیش‌از 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

این پُرسمان ۱۰۰ شیء تکراری برتر را برمی‌گرداند. این کار می‌تواند به شما کمک کند اشیایی را که چندین بار نمونه‌سازی شده‌اند پیدا کنید، که ممکن است فرصت‌هایی را برای ذخیره آن‌ها در حافظه پنهان یا شناسایی موارد تکراری ناخواسته نشان دهد.

تأخیر راه‌اندازی سرد

همچنین می‌توانید برای شرکت‌های نوپا پُرسمان کنید. این بخش پُرسمان دقیق‌تری برای برآورد زمان راه‌اندازی سرد در ردگیری ارائه می‌دهد.

-- 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 (زمان تا اولین فریم) راه‌اندازی سرد را برآورد می‌کند.