Traceview — یک ابزار ردیابی گرافیکی داخلی در Android Studio است که اجرای متدهای برنامه را از نظر زمان و منابع CPU ضبط و بصریسازی میکند. برخلاف Systrace که فرآیندهای سیستمی را در سطح هسته نشان میدهد، Traceview بر متدهای Java و Kotlin داخل برنامه تمرکز دارد که از ورودی کاربر تا رندر UI به صورت زنجیرهای فراخوانی میشوند. به گفته Google, 2024، این ابزار امکان یافتن تنگناهای عملکرد در سطح فراخوانیهای جداگانه و بهینهسازی کد قبل از انتشار را فراهم میکند.
نکات کلیدی
Traceview — یک پروفایلر گرافیکی داخلی در Android Studio است که ردهای اجرای متدهای برنامه اندروید را به صورت تایملاین و جدول فراخوانیها نمایش میدهد. این ابزار بخشی از Android SDK است و از Android Studio 3.0 به بعد از طریق Android Profiler و همچنین از طریق ابزار خط فرمان dmtracedump در دسترس است.
وظیفه اصلی Traceview کمک به برنامهنویس برای یافتن متدهایی است که بیشترین زمان CPU را مصرف میکنند. برخلاف لاگگیری ساده، Traceview زمان دقیق ورود و خروج از هر متد را ضبط میکند، Call Chart و درخت Top-Down میسازد که امکان تشخیص بصری ناهنجاریهای عملکرد را فراهم میکند. این ابزار به ویژه در پروفایلسازی نخ UI مفید است، جایی که تأخیر 16 میلیثانیهای منجر به افت فریم میشود.
Traceview در نسخههای اولیه Android SDK به عنوان یک ابزار مستقل برای مشاهده فایلهای .trace ظاهر شد. با انتشار Android Studio 3.0 (2017) بخشی از Android Profiler شد و ادغام با تایملاین زنده CPU، حافظه و شبکه را به دست آورد. به گفته Google I/O 2018، تیم Android Studio به توسعه پروفایلر ادامه میدهد و پشتیبانی از کد بومی را از طریق systrace و perfetto اضافه میکند. در نسخههای فعلی Android Studio، Traceview روی قالب Perfetto کار میکند اما سازگاری معکوس با .trace کلاسیک را حفظ میکند.
Traceview دادهها را از مکانیزم System Tracing در Android Runtime (ART) دریافت میکند. هنگامی که برنامه با ردیابی فعال اجرا میشود، ART زمان شروع و پایان هر متد اجرا شده را در یک بافر مینویسد، از جمله نام کلاس، نام متد و ID نخ.
// شروع tracing در کد برنامه
Debug.startMethodTracing("app_trace")
// بخش حیاتی کد برای پروفایلسازی
loadHeavyData()
// توقف tracing — فایل روی دستگاه ذخیره شد
Debug.stopMethodTracing()
System Tracing در سطح ماشین مجازی ART کار میکند و هر فراخوانی متد را با دقت میکروثانیه ثبت میکند. دادهها در یک بافر حلقوی نوشته میشوند تا تأثیر بر عملکرد خود برنامه به حداقل برسد. پس از توقف ردیابی، بافر در یک فایل .trace در حافظه داخلی دستگاه تخلیه میشود.
فایل .trace شامل یک هدر با نسخه فرمت و زمان شروع است و به دنبال آن رکوردهایی درباره هر فراخوانی: thread ID، method ID، timestamp ورود و timestamp خروج. Android Studio به طور خودکار فایل .trace را بارگیری میکند و دو نمای اصلی میسازد: Timeline Panel برای ترتیب زمانی و Profile Panel برای سلسلهمراتب فراخوانیها. به طور پیشفرض حداکثر اندازه بافر 8 مگابایت است، اما میتوان آن را از طریق Debug.startMethodTracing(filename, maxSize) افزایش داد.
Traceview چندین نمای داده مکمل ارائه میدهد که هر کدام وظیفه خود را در تحلیل عملکرد حل میکند.
Call Chart — یک تایملاین افقی است که در آن هر نخ در یک مسیر جداگانه نمایش داده میشود. متدها به صورت مستطیلهای رنگی نشان داده میشوند: عرض مستطیل متناسب با زمان اجرا است و تودرتو بودن سلسلهمراتب فراخوانیها را منعکس میکند. اگر یک متد متد دیگری را فراخوانی کند، مستطیل فرزند در داخل مستطیل والد رسم میشود. این بصریسازی امکان دیدن فوری اینکه کدام عملیات نخ را مسدود کرده است را فراهم میکند.
درخت Top-Down زمان اجرای متد را با در نظر گرفتن همه فراخوانیهای تودرتوی آن نشان میدهد — Inclusive Time. درخت Bottom-Up برعکس نشان میدهد کدام متدهای والد این متد را فراخوانی کردهاند — برای یافتن منبع یک عملیات سنگین مفید است. تفاوت بین Inclusive و Exclusive Time حیاتی است: یک متد ممکن است خود سریع کار کند اما یک متد فرزند کند را فراخوانی کند و این فقط در Inclusive Time قابل مشاهده است.
Traceview از جستجو بر اساس نام متد، بسته یا کلاس پشتیبانی میکند. نتایج در تایملاین برجسته میشوند و در Profile Panel آمار فقط برای متدهای یافت شده نمایش داده میشود. فیلتر بر اساس نخها نیز در دسترس است — میتوان نمایش نخهای پسزمینه را غیرفعال کرد و روی نخ اصلی (UI) تمرکز کرد، جایی که تأخیرها بحرانیترین هستند.
| معیار | توضیح | واحد |
|---|---|---|
| Inclusive Time | زمان کل متد + تمام فراخوانیهای فرزند آن | µs / ms |
| Exclusive Time | زمان فقط خود متد بدون فراخوانیهای فرزند | µs / ms |
| Calls + Recur | تعداد فراخوانیها با در نظر گرفتن بازگشت | تعداد |
| CPU Time | زمان واقعی صرف شده روی CPU (بدون انتظار) | µs / ms |
| Real Time | زمان تقویمی از ورود تا خروج از متد | µs / ms |
Traceview امکان صادرات ردها را در قالب CSV برای تحلیل بعدی در جداول یا رسم نمودارها فراهم میکند. در Android Studio میتوان یک قطعه انتخاب شده از تایملاین را به عنوان تصویر کپی کرد — برای درج در گزارش باگ یا مستندات. برای CI/CD صادرات در قالب Perfetto از طریق ابزار cmdline-tools در دسترس است.
پروفایلسازی از طریق Traceview به دو روش در دسترس است: از طریق Android Profiler با ضبط زنده و از طریق راهاندازی برنامهریزی شده Debug API. روش اول برای تحلیل ad-hoc مناسب است، روش دوم — برای تستهای عملکرد تکراری.
در Android Studio برگه Profiler را باز کنید (View → Tool Windows → Profiler)، دستگاه و فرآیند برنامه خود را انتخاب کنید. روی بخش CPU کلیک کنید، سپس حالت "Trace Java Methods" را انتخاب کرده و Record را بزنید. پس از تعامل با برنامه، Stop را بزنید — Traceview به طور خودکار رد ضبط شده را باز میکند. مدت زمان ضبط پیشفرض به 30 ثانیه محدود است، اما میتوان حد را در تنظیمات پروفایلر تغییر داد.
برای پروفایلسازی دقیق یک بخش خاص از کد از Debug.startMethodTracing و Debug.stopMethodTracing استفاده کنید. فایل در حافظه خارجی برنامه در مسیری که context.getExternalFilesDir(null) برمیگرداند ذخیره میشود. پس از اتمام، فایل .trace را از طریق Android Studio Device Explorer به کامپیوتر منتقل کنید، سپس از طریق File → Open در Android Studio باز کنید.
Debug.startMethodTracing(
"heavy_computation",
Debug.TRACE_COUNT_ALLOCS
)
processLargeDataset()
Debug.stopMethodTracing()
Debug.startMethodTracing سه پارامتر میگیرد: نام فایل (بدون پسوند)، حداکثر اندازه بافر (پیشفرض 8 مگابایت) و پرچمها. پرچم TRACE_COUNT_ALLOCS شمارش تخصیص اشیاء را اضافه میکند — برای یافتن نشت حافظه مفید است. برای پروفایلسازی کد بومی Traceview مناسب نیست — از SimplePerf یا Perfetto استفاده کنید. برای تستهای طولانی (بیش از 30 ثانیه) توصیه میشود بافر را از طریق پارامتر maxSize به 64–128 مگابایت افزایش دهید.
تایملاین Traceview از دو پنل تشکیل شده است: بالا — Timeline Panel با مستطیلهای رنگی فراخوانیها، پایین — Profile Panel با جدول آمار. Timeline Panel اجرای نخها را از چپ به راست نشان میدهد، جایی که هر مستطیل یک فراخوانی متد است. رنگ مستطیل بر اساس نوع متد کدگذاری میشود: فراخوانیهای سیستم اندروید (سبز)، متدهای کاربردی (آبی)، فراخوانیهای کتابخانه (نارنجی).
در Profile Panel هر سطر یک متد با ستونهای Inclusive Time، Exclusive Time، Calls + Recur و CPU Time است. جدول را بر اساس Inclusive Time (نزولی) مرتب کنید تا ابتدا متدهایی را ببینید که مجموعاً بیشترین زمان را گرفتهاند. اگر یک متد با Inclusive Time بالا دارای Exclusive Time پایین است — مشکل در فراخوانیهای فرزند آن است و باید درخت را باز کنید. به عنوان مثال، ListView.getView ممکن است به دلیل فراخوانی بارگذاری تصویر دارای Inclusive Time بالایی باشد.
به دنبال متدهایی با Real Time غیرعادی بالا و CPU Time پایین باشید — این نشاندهنده مسدود شدن (انتظار I/O، عملیات شبکه، lock contention) است. متدهای با CPU Time بالا نیاز به بهینهسازی الگوریتم دارند. برای نخ UI حیاتی است که هر متد در 16 میلیثانیه جا شود — اگر یک فراخوانی از این حد تجاوز کند، برنامه فریم را از دست میدهد و کاربر لرزش میبیند. طبق توصیههای Google، مجموع زمان همه فراخوانیها در نخ UI برای یک فریم نباید از 8 تا 10 میلیثانیه تجاوز کند و برای عملیاتهای سیستم ذخیره باقی بماند.
اگرچه هر دو Traceview و Systrace جزو ابزارهای ردیابی اندروید هستند، وظایف متفاوتی را حل میکنند و در مراحل مختلف پروفایلسازی استفاده میشوند. تفاوت اصلی سطح جزئیات است: Traceview در سطح متدهای Java/Kotlin کار میکند، Systrace — در سطح فرآیندهای سیستم (CPU، GPU، Binder، SurfaceFlinger).
| معیار | Traceview | Systrace |
|---|---|---|
| سطح | متدها (Java/Kotlin) | فرآیندهای سیستم (CPU/GPU/IO) |
| رابط | Android Studio Profiler | خط فرمان + گزارش HTML |
| داده | Inclusive/Exclusive Time | بار CPU، نرخ فریم |
| مدت | تا 30 ثانیه (Profiler)، نامحدود (API) | تا 60 ثانیه |
| کد بومی | پشتیبانی نمیکند | پشتیبانی از طریق نشانههای atrace |
در عمل هر دو ابزار مکمل یکدیگر هستند: ابتدا Systrace کمک میکند مشخص کند کدام مؤلفه سیستم مشکل ایجاد میکند (مثلاً GC مکرر یا قفلهای Binder)، سپس Traceview امکان بررسی عمیق یک متد خاص در داخل برنامه را فراهم میکند. در Android Studio هر دو ابزار در Android Profiler ترکیب شدهاند — CPU Profiler به طور خودکار حالت ضبط بهینه را انتخاب میکند. در دستگاههای با Android 12+، Systrace و Traceview روی Perfetto کار میکنند که یک قالب داده واحد برای همه انواع پروفایلسازی فراهم میکند.
برای پروفایلسازی مؤثر فقط راهاندازی ردیابی کافی نیست — باید نقاط ضبط را به درستی قرار داد و نتایج را تفسیر کرد. در زیر دو مثال عملی آورده شده است: پروفایلسازی لیست RecyclerView و مقایسه دو الگوریتم در تست عملکرد.
مثال اول — ردیابی مسیر بحرانی هنگام اسکرول لیست. RecyclerView برای هر آیتم قابل مشاهده onBindViewHolder را فراخوانی میکند و اگر این متد بیشتر از 16 میلیثانیه اجرا شود، اسکرول لرزان میشود. ردیابی در اطراف onBindViewHolder نشان میدهد کدام عملیات خاص در داخل آن زمان میبرند.
class MyAdapter : RecyclerView.Adapter<ViewHolder>() {
override fun onBindViewHolder(
holder: ViewHolder,
position: Int
) {
Debug.startMethodTracing("bind_card_$position")
holder.bind(items[position])
Debug.stopMethodTracing()
}
}
مثال دوم — تست A/B سرعت دو پیادهسازی: بارگذاری تصاویر از طریق Glide در مقابل BitmapFactory دستی. چنین ردی امکان مقایسه عینی Inclusive Time هر دو استراتژی و انتخاب بهینه را فراهم میکند. مهم است که هر تست روی دستگاه گرم شده (پس از 3–5 چرخه) و در شرایط یکسان (بار پسزمینه، دما) اجرا شود.
fun compareImageLoadingStrategies() {
// تست A: Glide
Debug.startMethodTracing("glide_test")
loadWithGlide()
Debug.stopMethodTracing()
// تست B: BitmapFactory
Debug.startMethodTracing("bitmap_test")
loadWithBitmapFactory()
Debug.stopMethodTracing()
}
پس از اجرا، هر دو فایل .trace را در Android Studio باز کنید و Inclusive Time را در Profile Panel مقایسه کنید. اگر Glide 3x Inclusive Time کمتری برای همان کار نشان میدهد — این یک مبنای عینی برای انتخاب کتابخانه است. به گفته تونی جان (توسعهدهنده Glide، 2023)، کتابخانه از ذخیرهسازی و استخر نخ استفاده میکند که تا 40٪ صرفهجویی در بارگذاریهای تکراری ایجاد میکند.
سوالات متداول
Traceview — هسته بصریسازی ردها در داخل Android Profiler است. Profiler رابط کاربری اضافی برای شروع و توقف ضبط فراهم میکند، در حالی که Traceview مسئول نمایش تایملاین و آمار متدها است. هر دو از همان قالب داده .trace استفاده میکنند.
بله، Traceview هم روی شبیهساز و هم روی دستگاه فیزیکی اندروید کار میکند. برای این کار اشکالزدایی USB باید فعال باشد و برنامه در حالت debuggable ساخته شود. در دستگاه فیزیکی دادهها دقیقتر هستند زیرا شبیهساز ممکن است زمانها را به دلیل مجازیسازی تحریف کند.
حداکثر اندازه پیشفرض 8 مگابایت است، اما میتوان آن را تا 256 مگابایت از طریق پارامتر maxSize در Debug.startMethodTracing افزایش داد. برای جلسات پروفایلسازی طولانی از Perfetto استفاده کنید که محدودیت سختی برای اندازه رد ندارد.
Traceview در سطح Android Runtime (ART) کار میکند و فقط متدهای مدیریتشده Java و Kotlin را میبیند. برای پروفایلسازی کد بومی (C/C++ از طریق JNI) از SimplePerf یا Perfetto با FTrace استفاده کنید که فراخوانیهای سیستم را در سطح هسته ضبط میکنند.
از ابزار dmtracedump از Android SDK (پوشه platform-tools) استفاده کنید. این ابزار یک گزارش HTML با تایملاین و آمار به صورت جدول تولید میکند. در ویندوز اجرا کنید: dmtracedump -h trace.trace > report.html. جایگزین — Perfetto UI (ui.perfetto.dev) که از قالب .trace پشتیبانی میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید