تشخیص انحراف رابط کاربری

اندروید با تولید یک فریم از برنامه شما و نمایش آن روی صفحه، رابط کاربری را رندر می‌کند. اگر برنامه شما از رندر کند رابط کاربری رنج می‌برد، سیستم مجبور می‌شود فریم‌ها را رد کند. وقتی این اتفاق می‌افتد، کاربر یک لرزش مکرر روی صفحه نمایش خود احساس می‌کند که به آن jank می‌گویند.

وقتی jank رخ می‌دهد، معمولاً به دلیل کاهش سرعت یا مسدود شدن فراخوانی ناهمگام در نخ رابط کاربری (در اکثر برنامه‌ها، نخ اصلی) است. می‌توانید از ردیابی‌های سیستم برای شناسایی محل مشکل استفاده کنید.

اگر از Jetpack Compose استفاده می‌کنید، بهترین راه برای بررسی عملکرد رندرینگ در ردیابی، فعال کردن ردیابی ترکیب است. برای مطالعه در مورد مشکلات رایج عملکرد Compose، به عملکرد Jetpack Compose مراجعه کنید.

برای برنامه‌های Compose، در صورت نیاز به یک نمای کلی از برنامه خود، از مراحل این راهنما استفاده کنید. ردیابی‌های سیستمی معرفی شده در اینجا به شما کمک می‌کنند تا jank ناشی از مشکلات سطح سیستم که باعث مسدود شدن نخ اصلی می‌شوند، مانند I/O سنگین دیسک، جمع‌آوری زباله تهاجمی یا تنگناهای رندر GPU را شناسایی کنید. اگر jank را به لایه UI خود جدا کرده‌اید، از راهنمای عملکرد Jetpack Compose استفاده کنید. این راهنما به شما کمک می‌کند تا ناکارآمدی‌های خاص Compose مانند ترکیب‌های بیش از حد، حالت خواندن در فاز اشتباه یا استفاده از پارامترهای ناپایدار را برطرف کنید.

تشخیص فایل‌های بی‌ارزش در اندروید ۱۲ و بالاتر

برای دستگاه‌هایی که از اندروید ۱۲ (سطح API ۳۱) یا بالاتر استفاده می‌کنند، یک رد ثبت‌شده در مسیر فریم‌های Janky در زیر پنل Display در CPU Profiler نشان داده می‌شود.

برای تشخیص هرزگی،

  1. در اندروید استودیو، View > Tool Windows > Profiler را انتخاب کنید یا روی Profile کلیک کنید. در نوار ابزار.

    اگر در پنجره‌ی «انتخاب هدف استقرار» از شما پرسیده شد، دستگاهی را که می‌خواهید برنامه‌تان برای پروفایلینگ روی آن مستقر شود، انتخاب کنید. اگر دستگاهی را از طریق USB متصل کرده‌اید اما آن را در فهرست نمی‌بینید، مطمئن شوید که اشکال‌زدایی USB را فعال کرده‌اید .

  2. برای باز کردن CPU Profiler، روی هر قسمتی از جدول زمانی CPU کلیک کنید.

  3. از منوی پیکربندی در CPU Profiler، گزینه System Trace را انتخاب کرده و روی Record کلیک کنید. پس از پایان تعامل با برنامه، روی Stop کلیک کنید.

  4. شما باید مسیر فریم‌های Janky را در زیر Display ببینید. به طور پیش‌فرض، Profiler فقط فریم‌های Janky را به عنوان کاندید برای بررسی نشان می‌دهد. در هر فریم Janky، قسمت قرمز مدت زمانی را که فریم از مهلت رندر خود گذشته است، برجسته می‌کند. تصویری از آهنگ Janky frames

  5. وقتی یک فریم خراب پیدا کردید، روی آن کلیک کنید؛ به صورت اختیاری، می‌توانید M را فشار دهید تا بزرگنمایی را تنظیم کنید تا روی فریم انتخاب شده تمرکز شود. رویدادهای مربوطه در این رشته‌ها برجسته شده‌اند: رشته اصلی، RenderThread و تکمیل GPU . تصویر نمایه‌ساز که فریم‌های Janky و رشته‌های اصلی را نشان می‌دهد

  6. شما می‌توانید به صورت اختیاری، با فعال کردن تیک گزینه‌های «همه فریم‌ها» و «چرخه عمر» ، تمام فریم‌ها یا خلاصه‌ای از زمان رندر را مشاهده کنید. تصویر پروفایلر مانند بالا اما با تیک زدن تمام فریم‌ها و کادرهای انتخاب چرخه حیات

تشخیص فایل‌های بی‌ارزش در اندروید ۱۱

برای دستگاه‌هایی که از اندروید ۱۱ (سطح API 30) استفاده می‌کنند، یک رد ثبت‌شده در بخش چرخه عمر فریم در CPU Profiler نشان داده می‌شود.

بخش چرخه عمر فریم با مسیرهای مختلف

بخش چرخه حیات فریم شامل نام لایه و چهار مسیر است. هر مسیر نشان دهنده یک مرحله در خط لوله رندر فریم است. عناصر چرخه حیات فریم به شرح زیر است:

  1. چرخه حیات فریم (نام لایه) : عنوان بخش شامل نام لایه در داخل پرانتز است. یک لایه یک واحد ترکیبی است.
  2. Application : این مسیر، زمان بین زمانی که بافر توسط برنامه از صف خارج شده تا زمانی که دوباره در صف قرار گرفته را نشان می‌دهد. این معمولاً مربوط به رویدادهای ردیابی در RenderThread است.
  3. منتظر ماندن برای GPU : این مسیر نشان می‌دهد که چه مدت بافر متعلق به GPU بوده است. این مدت زمان از زمانی است که بافر به GPU ارسال می‌شود تا زمانی که GPU کار خود را روی بافر تمام می‌کند. این نشان نمی‌دهد که GPU در این مدت فقط روی این بافر کار می‌کرده است. برای اطلاعات دقیق در مورد اینکه GPU در یک زمان معین روی چه چیزی کار می‌کند، می‌توانید از Android GPU Inspector استفاده کنید.
  4. ترکیب : این مسیر، زمان شروع از زمانی که SurfaceFlinger به بافر متصل می‌شود و آن را برای ترکیب ارسال می‌کند، تا زمانی که بافر به صفحه نمایش ارسال می‌شود را نشان می‌دهد.
  5. فریم‌های نمایش داده شده : این مسیر نشان می‌دهد که فریم چه مدت روی صفحه بوده است.

بخش چرخه عمر فریم، نحوه جابجایی یک بافر فریم بین مراحل مختلف خط لوله رندر را نشان می‌دهد. فریم‌ها بر اساس شماره فریم، کدگذاری رنگی شده‌اند تا ردیابی یک فریم خاص آسان‌تر شود.

اندروید استودیو همچنین تمام فریم‌های موجود در مسیر را در قالب جدولی در تب «همه فریم‌ها» نشان می‌دهد.

جدولی از تمام فریم‌های موجود در مسیر در تب «همه فریم‌ها»

ستون‌های Frame # ، Application ، Wait for GPU و Composition همان داده‌های Trackهای بخش Frame Lifecycle که در بالا ذکر شد را نشان می‌دهند. ستون Frame Duration نشان‌دهنده زمان از شروع Application تا شروع Frames on Display است. این اساساً مدت زمانی است که طول می‌کشد تا یک فریم از ابتدا تا انتها رندر شود.

شما می‌توانید جدول فریم‌ها را بر اساس هر ستونی مرتب کنید تا به سرعت کوتاه‌ترین یا طولانی‌ترین فریم را پیدا کنید. این جدول همچنین از کنترل‌های صفحه‌بندی پشتیبانی می‌کند که به شما کمک می‌کند تا در میان صدها فریم حرکت کنید.

برای شناسایی و بررسی برنامه‌های ناخواسته در اندروید ۱۱، این مراحل را دنبال کنید:

  1. جدول «تمام فریم‌ها» را بر اساس ستون «کاربرد» به ترتیب نزولی مرتب کنید، به طوری که فریم‌هایی که طولانی‌ترین زمان را دارند، اول ظاهر شوند.

    ستون برنامه به ترتیب نزولی مرتب شده است

  2. طولانی‌ترین فریم‌های در حال اجرا را پیدا کنید و ردیف جدول را انتخاب کنید. این کار باعث می‌شود فریم انتخاب شده در نمای تایم‌لاین سمت چپ بزرگنمایی شود.

    نمای تایم‌لاین در کنار جدول فریم‌ها

  3. به دنبال موضوعات مرتبط در بخش‌های چرخه عمر فریم و موضوعات باشید.

    بخش‌های چرخه عمر فریم و نخ‌ها

تشخیص فایل‌های بی‌ارزش در اندروید ۱۰ و پایین‌تر

برای دستگاه‌هایی که از اندروید ۱۰ (سطح API ۲۹) و پایین‌تر استفاده می‌کنند، اطلاعات مربوط به خط لوله گرافیکی سیستم عامل در یک بخش واحد در ردپای سیستم CPU Profiler به نام Display نمایش داده می‌شود.

پنجره رابط کاربری نمایشگر

  • فریم‌ها : این بخش رویدادهای ردیابی UI thread و RenderThread را در برنامه شما نشان می‌دهد. رویدادهایی که بیش از ۱۶ میلی‌ثانیه طول می‌کشند، با رنگ قرمز مشخص می‌شوند تا فریم‌های بالقوه بی‌نظم را برجسته کنند، زیرا از مهلت رندر ۶۰ فریم در ثانیه (fps) فراتر می‌روند.
  • SurfaceFlinger : این بخش نشان می‌دهد که SurfaceFlinger چه زمانی بافرهای فریم را پردازش می‌کند. SurfaceFlinger یک فرآیند سیستمی است که مسئول ارسال بافرها برای نمایش است.
  • VSYNC : این بخش VSYNC را نمایش می‌دهد، سیگنالی که خط لوله نمایش را همگام‌سازی می‌کند. این مسیر سیگنال VSYNC-app را نمایش می‌دهد که نشان می‌دهد چه زمانی برنامه شما خیلی دیر شروع می‌شود. معمولاً این اتفاق می‌افتد زیرا رشته رابط کاربری مشغول است. این باعث می‌شود که در طول یک انیمیشن، یک سوسو زدن قابل مشاهده روی صفحه نمایش شما ظاهر شود و تأخیر ورودی اضافی را تا زمان تکمیل انیمیشن یا پیمایش اضافه کند. این امر به ویژه برای مشاهده نمایشگرهای با نرخ تازه‌سازی بالا مهم است، زیرا ممکن است بیشتر از 60 بار در ثانیه یا با نرخ متغیر رخ دهند.
  • BufferQueue : این بخش نشان می‌دهد که چه تعداد بافر فریم در صف قرار گرفته‌اند و منتظر مصرف توسط SurfaceFlinger هستند. برای برنامه‌هایی که روی دستگاه‌هایی با اندروید ۹ (سطح API ۲۸) یا بالاتر اجرا می‌شوند، این مسیر تعداد بافر BufferQueue سطح برنامه ( 0 ، 1 یا 2 ) را نشان می‌دهد. BufferQueue می‌تواند به شما در درک وضعیت بافرهای تصویر هنگام جابجایی بین اجزای گرافیکی اندروید کمک کند. به عنوان مثال، مقدار 2 به این معنی است که برنامه در حال حاضر بافر سه‌گانه دارد که منجر به تأخیر ورودی اضافی می‌شود.

بخش Display سیگنال‌های مفیدی برای تشخیص خطاهای احتمالی ارائه می‌دهد - برای مثال، زمانی که UI thread یا RenderThread بیش از 16 میلی‌ثانیه طول می‌کشد. برای بررسی جزئیات دقیق علت خطا، می‌توانید بخش Threads را بررسی کنید که Threadهای مربوط به رندر UI را نشان می‌دهد.

بخش موضوعات (Threads) در زیر بخش نمایش (Display)

در شکل بالا، بخش Threads ، نخ رابط کاربری ( java.com.google.samples.apps.ioschedRenderThread و نخ GPU completion را نشان می‌دهد. اینها نخ‌هایی هستند که مربوط به رندر رابط کاربری هستند و ممکن است در jank نقش داشته باشند.

برای شناسایی فایل‌های ناخواسته در اندروید ۱۰ یا پایین‌تر، این مراحل را دنبال کنید:

  1. به مسیر فریم‌ها در بخش نمایش نگاه کنید. فریم‌های قرمز، کاندیدهایی برای بررسی هستند.

    بخش فریم‌ها در زیر بخش نمایش

  2. وقتی یک فریم احتمالاً مشکل‌دار پیدا کردید، با فشار دادن W یا چرخاندن چرخ ماوس هنگام نگه داشتن Control (در macOS، Command ) بزرگنمایی کنید. بزرگنمایی را ادامه دهید تا زمانی که شروع به دیدن رویدادهای ردیابی در UI thread و RenderThread .

    ردیابی رویدادها در UI thread و RenderThread

    در شکل بالا، Choreographer#doFrame نشان می‌دهد که چه زمانی رشته رابط کاربری (UI thread) Choreographer را برای هماهنگی انیمیشن، طرح‌بندی نما، ترسیم تصویر و فرآیندهای مرتبط فراخوانی می‌کند. DrawFrames نشان می‌دهد که چه زمانی RenderThread دستورات ترسیم واقعی را تشکیل داده و به GPU صادر می‌کند.

  3. اگر یک رویداد ردیابی طولانی مدت در نخ اصلی مشاهده کردید، بزرگنمایی کنید تا ببینید کدام کامپوننت رابط کاربری یا تابع قابل ترکیب، فریم را به تأخیر می‌اندازد.

تحقیقات پیشرفته با Perfetto

وظیفه پروفایل ردیابی سیستم اندروید استودیو توسط Perfetto پشتیبانی می‌شود. اگر با مسائل رندرینگ پیچیده سر و کار دارید و به کوئری‌های SQL سفارشی یا پیمایش پیشرفته تایم‌لاین نیاز دارید، می‌توانید تجزیه و تحلیل ردیابی خود را خارج از IDE انجام دهید.

با کلیک روی آیکون Export trace در پنل Profiler، ردیابی سیستم خود را از اندروید استودیو استخراج کنید، سپس فایل حاصل را به رابط کاربری مبتنی بر وب Perfetto بکشید. این یک محیط اختصاصی برای تجزیه و تحلیل عملکرد در سطح سیستم فراهم می‌کند. برای اطلاعات در مورد نحوه تفسیر جزئیات خط لوله گرافیکی سیستم عامل، مانند VSYNC، SurfaceFlinger و مسیرهای Frame Timeline، به مستندات رسمی Perfetto مراجعه کنید.

بیشتر بدانید

برای کسب اطلاعات بیشتر در مورد چگونگی کاهش jank، به منابع رایج jank مراجعه کنید.