اندروید با ایجاد یک فریم از برنامه شما و نمایش آن بر روی صفحه، رابط کاربری را رندر میکند. اگر برنامه شما از رندر آهسته رابط کاربری رنج می برد، سیستم مجبور به رد شدن از فریم ها می شود. هنگامی که این اتفاق می افتد، کاربر یک سوسو زدن مکرر را روی صفحه نمایش خود مشاهده می کند که به آن jank گفته می شود.
هنگامی که jank رخ می دهد، معمولاً به دلیل کاهش سرعت یا مسدود کردن تماس ناهمگام در رشته رابط کاربری است (در اکثر برنامه ها، این موضوع اصلی است). می توانید از ردیابی سیستم برای شناسایی محل مشکل استفاده کنید.
جک را در اندروید 12 و بالاتر شناسایی کنید
برای دستگاههایی که از Android 12 (سطح API 31) یا بالاتر استفاده میکنند، یک ردگیری گرفته شده در مسیر فریمهای Janky در زیر صفحه نمایش در نمایه CPU نشان داده میشود.
برای تشخیص جنک،
در Android Studio، View > Tool Windows > Profiler را انتخاب کنید یا روی Profile کلیک کنید در نوار ابزار
اگر از کادر گفتگوی Select Deployment Target خواسته شد، دستگاهی را انتخاب کنید که برنامه خود را برای نمایه سازی در آن مستقر کنید. اگر دستگاهی را از طریق USB وصل کرده اید اما آن را در لیست نمی بینید، مطمئن شوید که اشکال زدایی USB را فعال کرده اید.
روی هر نقطه از جدول زمانی CPU کلیک کنید تا نمایه CPU باز شود.
System Trace را از منوی تنظیمات در CPU Profiler انتخاب کنید و روی Record کلیک کنید. پس از پایان تعامل با برنامه، روی Stop کلیک کنید.
شما باید تراک فریم های Janky را در زیر نمایشگر ببینید. به طور پیش فرض، Profiler فقط فریم های janky را به عنوان کاندیدای بررسی نشان می دهد. در داخل هر فریم جنکی، قسمت قرمز مدت زمانی را که فریم از مهلت رندر خود می گذراند، برجسته می کند.
هنگامی که یک قاب جنکی پیدا کردید، روی آن کلیک کنید. به صورت اختیاری، می توانید M را فشار دهید تا زوم را برای تمرکز بر فریم انتخاب شده تنظیم کنید. رویدادهای مربوطه در این رشته ها برجسته می شوند: رشته اصلی، RenderThread و تکمیل GPU .
میتوانید بهترتیب با جابهجایی چک باکسهای All Frames و Lifecycle ، همه فریمها یا تفکیک زمان رندر را مشاهده کنید.
جک را در اندروید 11 شناسایی کنید
برای دستگاههایی که از Android 11 (سطح API 30) استفاده میکنند، یک ردیابی ثبت شده در بخش چرخه زندگی فریم در نمایه CPU نشان داده میشود.
بخش Frame Lifecycle شامل نام لایه و چهار آهنگ است. هر مسیر نشان دهنده یک مرحله در خط لوله رندر فریم است. عناصر چرخه حیات فریم به شرح زیر است:
- چرخه حیات قاب (نام لایه) : عنوان بخش حاوی نام لایه در پرانتز است. یک لایه یک واحد ترکیب است.
- Application : این آهنگ از زمانی که بافر توسط برنامه در صف قرار میگیرد تا زمانی که در صف قرار میگیرد را نشان میدهد. این معمولاً با رویدادهای ردیابی در
RenderThread
مطابقت دارد. - Wait for GPU : این آهنگ نشان می دهد که چه مدت بافر متعلق به GPU بوده است. این زمان از زمانی است که بافر به GPU ارسال می شود تا زمانی که GPU کار خود را بر روی بافر تمام می کند. این نشان نمی دهد که GPU در این مدت فقط روی این بافر کار می کرد. برای اطلاعات دقیق در مورد آنچه که GPU در یک زمان معین روی آن کار می کند، ممکن است بخواهید از Android GPU Inspector استفاده کنید.
- ترکیب : این آهنگ زمان شروع از زمانی که SurfaceFlinger به بافر متصل می شود و آن را برای ترکیب ارسال می کند تا زمانی که بافر به نمایشگر ارسال می شود را نشان می دهد.
- قابهای روی صفحه : این آهنگ نشان میدهد که فریم چقدر روی صفحه بوده است.
بخش Frame Lifecycle نحوه حرکت یک فریم بافر بین مراحل مختلف خط لوله رندر را نشان می دهد. قاب ها با شماره قاب کدگذاری شده اند تا ردیابی یک فریم خاص آسان تر باشد.
اندروید استودیو همچنین تمامی فریم های موجود در ردیابی را در قالب جدول در تب All Frames نشان می دهد.
ستونهای Frame # ، Application ، Wait for GPU و Composition همان دادههایی را نشان میدهند که در بخش Frame Lifecycle در بالا وجود دارد. ستون Frame Duration نشان دهنده زمان از شروع برنامه تا شروع Frames on Display است. این اساساً مدت زمانی است که طول می کشد تا یک فریم به صورت انتها به انتها ارائه شود.
میتوانید جدول فریمها را بر اساس هر ستونی مرتب کنید تا کوتاهترین یا طولانیترین فریم را سریع پیدا کنید. این جدول همچنین از کنترل های صفحه بندی پشتیبانی می کند که به شما کمک می کند در میان صدها فریم حرکت کنید.
برای شناسایی و بررسی jank در اندروید 11، این مراحل را دنبال کنید:
جدول All Frames را بر اساس ستون Application به ترتیب نزولی مرتب کنید تا فریم هایی که بیشترین طول را دارند ابتدا ظاهر شوند.
طولانی ترین فریم های در حال اجرا را پیدا کنید و ردیف جدول را انتخاب کنید. این روی قاب انتخابی در نمای خط زمانی سمت چپ بزرگنمایی میکند.
در بخشهای Frame Lifecycle و Threads به دنبال رشتههای مرتبط بگردید.
جک را در اندروید ۱۰ و پایینتر شناسایی کنید
برای دستگاههایی که از Android 10 (سطح API 29) و پایینتر استفاده میکنند، اطلاعات مربوط به خط لوله گرافیکی سیستمعامل در یک بخش در ردیابی سیستم نمایه CPU به نام Display نمایش داده میشود.
- Frames : این بخش رشته UI و رویدادهای ردیابی
RenderThread
را در برنامه شما نشان می دهد. رویدادهایی که بیش از 16 میلیثانیه هستند، قرمز رنگ میشوند تا فریمهای بالقوه janky برجسته شوند، زیرا از مهلت رندر با سرعت 60 فریم در ثانیه (فریم بر ثانیه) فراتر میروند. - SurfaceFlinger : این بخش نشان می دهد که SurfaceFlinger چه زمانی بافرهای فریم را پردازش می کند. SurfaceFlinger یک فرآیند سیستمی است که وظیفه ارسال بافرها برای نمایش را بر عهده دارد.
- VSYNC : این بخش VSYNC را نشان می دهد، سیگنالی که خط لوله نمایش را همگام می کند. آهنگ سیگنال برنامه VSYNC را نشان می دهد، که نشان می دهد برنامه شما خیلی دیر شروع می شود. به طور معمول، این اتفاق می افتد زیرا رشته UI مشغول است. این باعث میشود که یک سوسو زدن قابل مشاهده بر روی صفحه نمایش شما در طول یک انیمیشن ظاهر شود و تا زمانی که انیمیشن یا اسکرول کامل شود، تاخیر ورودی اضافی اضافه میکند. این به ویژه برای نمایشگرهای با نرخ تازه سازی بالا بسیار مهم است، زیرا ممکن است بیشتر از 60 بار در ثانیه یا با نرخ متغیر رخ دهند.
- BufferQueue : این بخش نشان می دهد که چه تعداد بافر فریم در صف قرار گرفته اند و منتظر مصرف SurfaceFlinger هستند. برای برنامههای مستقر در دستگاههای دارای Android 9 (سطح API 28) یا بالاتر، این آهنگ تعداد بافر سطح برنامه BufferQueue (
0
،1
، یا2
) را نشان میدهد. BufferQueue می تواند به شما در درک وضعیت بافرهای تصویر هنگام حرکت بین اجزای گرافیکی اندروید کمک کند. به عنوان مثال، مقدار2
به این معنی است که برنامه در حال حاضر دارای سه بافر است، که منجر به تاخیر ورودی اضافی می شود.
بخش Display سیگنالهای مفیدی را برای تشخیص jank بالقوه ارائه میدهد - به عنوان مثال، زمانی که رشته UI یا RenderThread
بیش از 16 میلیثانیه طول بکشد. برای بررسی جزئیات دقیق آنچه باعث jank شده است، می توانید بخش Threads را بررسی کنید که رشته های مرتبط با رندر UI را نشان می دهد.
در شکل بالا، بخش Threads رشته رابط کاربری ( java.com.google.samples.apps.iosched
)، RenderThread
و رشته GPU completion
را نشان می دهد. اینها موضوعات مرتبط با رندر رابط کاربری هستند و ممکن است به jank کمک کنند.
برای شناسایی jank در Android 10 یا پایین تر، این مراحل را دنبال کنید:
به مسیر Frames در Display نگاه کنید. قاب های قرمز کاندیدای تحقیق هستند.
هنگامی که یک فریم بالقوه عجیب و غریب پیدا کردید، با فشار دادن
W
یا حرکت دادن چرخ ماوس در حالی که Control ( Command در macOS) را نگه دارید، بزرگنمایی کنید. بزرگنمایی را ادامه دهید تا زمانی که ردیابی رویدادها را در رشته UI وRenderThread
ببینید.در شکل بالا،
Choreographer#doFrame
زمانی را نشان میدهد که رشته رابط کاربریChoreographer
برای هماهنگ کردن انیمیشن، نمایش طرحبندی، طراحی تصویر و فرآیندهای مرتبط فرا میخواند.DrawFrames
زمانی را نشان می دهد کهRenderThread
فرم می گیرد و دستورات ترسیم واقعی را به GPU صادر می کند.اگر یک رویداد ردیابی طولانی را مشاهده کردید، می توانید بیشتر بزرگنمایی کنید و ببینید چه چیزی ممکن است در رندر آهسته نقش داشته باشد. شکل بالا
inflate
در رشته UI نشان می دهد، به این معنی که برنامه زمان خود را صرف افزایش طرح بندی می کند. همانطور که در زیر نشان داده شده است، وقتی روی یکی از رویدادهایinflate
زوم می کنید، می توانید دقیقاً متوجه شوید که هر جزء UI چقدر طول می کشد.
بیشتر بدانید
برای کسب اطلاعات بیشتر در مورد نحوه کاهش jank، به منابع رایج jank مراجعه کنید.