Systrace ابزاری برای ردیابی سیستمی اندروید است که دادههایی درباره عملکرد هسته لینوکس، پردازنده، شتابدهنده گرافیکی و تمام فرآیندهای سیستم در یک بازه زمانی کوتاه جمعآوری میکند. برخلاف Traceview که روی متدهای داخل برنامه تمرکز دارد، Systrace تصویر سیستمی را نشان میدهد: بار هر هسته CPU، کار SurfaceFlinger، فراخوانیهای Binder و چرخههای GC. به گفته Google، 2024، این ابزار برای تشخیص فریمهای از دست رفته، جمعآوری زباله مکرر و ناهنجاریهای رشته UI ضروری است.
نکات کلیدی
Systrace ابزاری خط فرمان از Android SDK است که دادهها را از چندین منبع ردیابی هسته (ftrace) و فضای کاربر (atrace) ضبط کرده و در یک گزارش HTML واحد ترکیب میکند. این ابزار در اندروید ۴.۱ (Jelly Bean) به عنوان جایگزینی برای ابزار قدیمی traceview برای پروفایلگیری سیستمی ظاهر شد و مدت طولانی به عنوان ابزار استاندارد تشخیص عملکرد در پلتفرم اندروید باقی ماند.
Systrace بر ftrace تکیه دارد — مکانیزم ردیابی هسته لینوکس که از اندروید ۴.۱ در دسترس است. هنگام اجرا، Systrace دستهبندیهای مشخصی از ردیابیها را فعال میکند: sched (زمانبند وظایف)، freq (فرکانس CPU)، idle (حالتهای بیکاری)، workq (صفهای کاری)، binder، gfx و غیره. دادهها در بافر حلقوی هسته جمعآوری میشوند و پس از توقف dumping در یک فایل trace.html ترکیب میشوند که در هر مرورگری باز میشود.
از Android Studio 3.1، Systrace در CPU Profiler تعبیه شده است. در حالت “Trace System Calls” پروفایلر Systrace را روی دستگاه متصل اجرا میکند و نتایج را مستقیماً در پنجره Android Studio نمایش میدهد. این کار نیاز به کار با خط فرمان را برای موارد پایه برطرف میکند، در عین حال عملکرد کامل — همه دستهبندیهای ردیابی، فیلتر کردن و timeline تعاملی — را حفظ میکند. عملکرد دستگاه در طول ردیابی به میزان کمی کاهش مییابد، زیرا ftrace برای سربار حداقلی طراحی شده است.
Systrace از دو مکانیزم جمعآوری داده استفاده میکند: ftrace در سطح هسته برای رویدادهای سیستمی و atrace در فضای کاربر برای برچسبهای مخصوص اندروید. ftrace جابهجاییهای زمینه (sched_switch)، تغییرات فرکانس CPU (cpu_frequency)، وقفهها (irq_handler_entry) و رویدادهای دیگر را ثبت میکند. atrace برچسبهایی از فریمورک اندروید اضافه میکند — شروع و پایان رندر فریم، فراخوانیهای SurfaceFlinger و تراکنشهای Binder.
قابلیت کلیدی Systrace — تجسم زنجیره رندر هر فریم: برنامه → BufferQueue → SurfaceFlinger → HWC (composer) → Display. اگر در هر مرحله تأخیری رخ دهد، Systrace علت دقیق را نشان میدهد: برنامه نتوانست بافر را آماده کند، SurfaceFlinger منتظر VSync ماند یا HWC نتوانست لایهها را ترکیب کند. چرخه عمر فریم در timeline بر اساس وضعیتها رنگبندی میشود: سبز (به موقع)، زرد (تأخیر)، قرمز (افتادن). این تجسم ابزار اصلی برای بهینهسازی عملکرد UI است.
Systrace بیش از ۲۰ دستهبندی ردیابی را پشتیبانی میکند که هر کدام شامل مجموعهای از رویدادهای مرتبط هستند. دستهبندیهای مهم: gfx (رندر گرافیک)، input (پردازش ورودی)، view (سیستم View)، webview (WebView)، power (مصرف انرژی)، hal (انتزاع سختافزار). برای پروفایلگیری بازیها، دستهبندی gfx با جزئیات تا دستورات GPU از طریق AGI (Android GPU Inspector) مفید است.
Systrace مجموعهای منحصربهفرد از قابلیتها را برای اندروید فراهم میکند که در سایر پروفایلرها در دسترس نیست: timeline سیستمی، معیارهای سطح هسته و تشخیص خودکار مشکلات.
گزارش HTML Systrace شامل یک timeline چندسطحی است که هر مسیر مربوط به یک فرآیند یا رشته است. میتوان مقیاس زمانی را بزرگ و کوچک کرد، روی رویدادها کلیک کرد تا جزئیات را مشاهده کرد (مدت زمان، فرآیند آغازگر، آرگومانهای اضافی). کدگذاری رنگی به جهتیابی سریع کمک میکند: بلوکهای سبز — کار فرآیند، آبی — انتظار، نارنجی — وقفه، سفید — بیکاری.
Systrace به طور خودکار ردیابی را تحلیل کرده و پیامهای Alert را با نشان دادن مکانهای مشکلدار نمایش میدهد. به عنوان مثال: “Buffer underrun — SurfaceFlinger نتوانست بافر را قبل از VSync دریافت کند” یا “Long Binder transaction — 42 ms در رشته Binder_1”. هر alert حاوی پیوندی به بخش مربوطه از timeline و توصیهای برای رفع مشکل است. این کار ساعتها تحلیل دستی را صرفهجویی کرده و یکی از دلایل اصلی استفاده از Systrace به جای لاگگیری دستی است.
توسعهدهنده میتواند برچسبهای سفارشی خود را از طریق API Trace.beginSection و Trace.endSection به ردیابی Systrace اضافه کند. این امکان ردیابی اجرای بخشهای بحرانی کد را مستقیماً روی timeline سیستمی فراهم میکند — مثلاً علامتگذاری شروع و پایان بارگذاری داده یا محاسبه طرح. برچسبها به عنوان بلوکهای جداگانه روی مسیر برنامه نمایش داده میشوند و در کنار رویدادهای سیستمی قابل مشاهده هستند.
| دستهبندی | دادهها | کاربرد معمول |
|---|---|---|
| sched | جابهجاییهای زمینه، حالتهای بیکاری | قفلشدگی رشتهها، contention |
| gfx | VSync، آمادهسازی بافر، HWC | افت فریم، jank |
| binder | تراکنشهای Binder، تأخیر | تأخیر IPC، فراخوانیهای از راه دور |
| freq | فرکانس CPU، scaling governor | Throttling، مصرف انرژی |
| gfx + AGI | دستورات GPU، شیدرها | عملکرد بازی |
اجرای Systrace به دو روش امکانپذیر است: از طریق Android Studio CPU Profiler (حالت “Trace System Calls”) یا از طریق خط فرمان با استفاده از اسکریپت python systrace.py از پوشه platform-tools. هر روش سناریوهای کاربری خاص خود را دارد.
دستگاه را متصل کنید، Profiler را باز کنید (View → Tool Windows → Profiler)، فرآیند خود را انتخاب کنید، به برگه CPU بروید، حالت “Trace System Calls” را انتخاب کرده و Record را بزنید. پس از ۵–۳۰ ثانیه Stop را بزنید — Android Studio Systrace را روی دستگاه اجرا میکند، منتظر اتمام میماند و نتیجه را بارگذاری میکند. محدودیت: ضبط تنها زمانی که Profiler باز است امکانپذیر است که برای سناریوهای طولانی یا خودکارسازی ناخوشایند است.
برای کنترل انعطافپذیرتر از اسکریپت systrace.py استفاده کنید. دستهبندیهای ردیابی، مدت زمان و نام فایل خروجی را مشخص کنید. مثال: ضبط دادههای gfx، input و sched به مدت ۱۰ ثانیه. برای اجرا نیاز به Python 2.7+ و دستگاه متصل با USB debugging است. در اندروید ۱۲+ Systrace با Perfetto جایگزین شده است — دستور همان است، اما اسکریپت فراخوانیها را به perfetto هدایت میکند.
# اجرای پایه systrace به مدت ۱۰ ثانیه
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# فقط دستهبندی gfx برای تحلیل UI
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
برای اینکه کد شما در timeline Systrace ظاهر شود، بخش بحرانی را در Trace.beginSection / Trace.endSection قرار دهید. مهم است که beginSection و endSection به طور دقیق جفت شوند — در غیر این صورت Systrace timeline نادرستی نشان میدهد. در Kotlin استفاده از inline-extension برای تضمین بسته شدن بخش حتی در صورت استثنا راحت است.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// استفاده در کد
traceSection("load_screen_data") {
fetchData()
updateUI()
}
گزارش Systrace یک فایل HTML مستقل است که میتوان در Chrome، Edge یا Firefox باز کرد. این گزارش شامل timeline تعاملی، پنل انتخاب فرآیند، لیست پیامهای alert و معیارهای کلیدی (نرخ فریم، مصرف CPU، تراکنشهای Binder) است. درک ساختار گزارش مهارت کلیدی برای پروفایلگیری مؤثر است.
Timeline زمان را از چپ به راست نمایش میدهد. هر فرآیند و رشته — یک مسیر جداگانه. کلیدهای W/S بزرگ/کوچک میکنند، A/D در زمان حرکت میکنند. برای بزرگنمایی یک بخش، ناحیه را با ماوس انتخاب کنید. خطوط VSync مرزهای فریم را نشان میدهند (هر ۱۶.۶ ms در ۶۰ FPS). اگر بین دو خط VSync یک چرخه کامل رندر جا نشود — فریم افتاده است. به مسیر SurfaceFlinger توجه کنید: اگر طولانی مشغول باشد (بلوک نارنجی)، به این معنی است که ترکیب لایهها رندر کلی را کند میکند.
پنل Alerts در سمت چپ گزارش شامل مشکلات کشف شده به طور خودکار است. هر alert قابل کلیک است — با کلیک، timeline به لحظه مشکلدار میرود. رایجترین alertها: “Long Sync” (همگامسازی طولانی رشته)، “Scheduling Delay” (تأخیر زمانبند)، “Buffer Overrun” (سرریز بافر SurfaceFlinger). اگر alert مقدار حدود ۱۰۰ ms را برای Scheduling Delay نشان دهد، این مستقیماً به این معنی است که رشته UI به دلیل بار پسزمینه منتظر CPU مانده است — باید محاسبات سنگین را به Worker Thread منتقل کرد.
برای تحلیل فریمهای افتاده، مسیرهای SurfaceFlinger و app.gfx را فعال کنید. هر فریم به صورت یک مستطیل نمایش داده میشود: سبز (≤۱۶ ms)، زرد (۱۶–۳۲ ms)، قرمز (>۳۲ ms). اگر یک مستطیل قرمز در مسیر برنامه میبینید، روی آن کلیک کنید — Systrace نشان میدهد کدام متد (یا فراخوانی سیستمی) از حد مجاز فراتر رفته است. به گفته Google (Android Performance Patterns، ۲۰۲۳)، ۷۰٪ مشکلات jank ناشی از onBindViewHolder طولانی یا GC مکرر است.
Perfetto جانشین Systrace است که توسط Google در اندروید ۹ (Pie) به عنوان یک ابزار آزمایشی معرفی شد و از اندروید ۱۲ به ابزار اصلی تبدیل شد. Perfetto از فرمت مدرن پروتوبافر استفاده میکند، از جلسات طولانی (ساعتها به جای ثانیهها) پشتیبانی کرده و دارای Web UI برای مشاهده ردیابیها است. تفاوتهای کلیدی دو سیستم را بررسی میکنیم.
| معیار | Systrace | Perfetto |
|---|---|---|
| فرمت | گزارش HTML (trace.html) | پروتوبافر (.trace / .perfetto-trace) |
| مدت زمان | تا ۶۰ ثانیه | ساعتها، گیگابایت داده |
| رابط کاربری | HTML داخلی | Web UI (ui.perfetto.dev) |
| دستهبندیها | ثابت (ftrace + atrace) | قابل توسعه (پرسشهای SQL روی ردیابی) |
| قابلیت حمل | فقط اندروید | اندروید، لینوکس، Chrome، ویندوز |
با وجود انتقال به Perfetto، مهارت کار با Systrace همچنان مرتبط است: در دستگاههای تا اندروید ۱۱ به طور پیشفرض استفاده میشود و Perfetto سازگاری معکوس با دستهبندیهای Systrace را حفظ میکند. Android Studio CPU Profiler از Perfetto برای دستگاههای جدید و Systrace برای دستگاههای قدیمی استفاده میکند — به صورت شفاف برای کاربر. برای CI/CD توصیه میشود از Perfetto استفاده شود زیرا فرمت آن برای پردازش خودکار از طریق Python و SQL مناسب است.
برای تسلط عملی بر Systrace، دو سناریو را بررسی میکنیم: یافتن علت فریمهای افتاده هنگام اسکرول و تشخیص GC مکرر که رشته UI را مسدود میکند.
Systrace را با دستهبندی gfx به مدت ۱۰ ثانیه اجرا کنید، لیست را در برنامه اسکرول کنید. در گزارش بخشهای دارای فریمهای قرمز را پیدا کنید. روی فریم مشکلدار کلیک کنید و به مسیر app نگاه کنید — اگر بلوک “inflateLayout” یا “onBindViewHolder” با عرض >۱۶ ms وجود دارد، مشکل در باد کردن طرح یا اتصال داده است. راهحل: طرح را بهینهسازی کنید (کاهش عمق ViewGroup، ViewStub)، بارگذاری تصاویر را با Glide در onAttachedToWindow انجام دهید.
Systrace با دستهبندی freq و sched امکان مشاهده تعداد دفعاتی که چرخههای GC رشته UI را کنار میزنند فراهم میکند. مسیر برنامه را در timeline پیدا کنید — اگر بلوکهای دورهای با مدت ۲۰–۵۰ ms با نام “Concurrent GC” میبینید، به این معنی است که جمعآوریکننده زباله بیش از حد کار میکند. دستهبندی “dalvik” را برای تحلیل دقیق اضافه کنید. راهحل: Bitmap را به ByteBuffer تبدیل کنید، از ObjectPool برای تخصیصهای مکرر استفاده کنید، fragmentation heap را با آرگومان ART کاهش دهید.
# اجرا با دستهبندیها برای تحلیل UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# ضبط با مدت ۳۰ ثانیه برای تست قابل تکرار
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
سوالات متداول
بله، برای اجرای Systrace دسترسی root لازم نیست. این ابزار از atrace استفاده میکند که در هر دستگاهی با USB debugging فعال در دسترس است. برخی دستهبندیها (power, freq) ممکن است نیاز به امضای سیستم داشته باشند، اما دستهبندیهای اصلی (gfx, sched, input) روی همه دستگاهها کار میکنند.
محدودیت ۶۰ ثانیه به حجم بافر حلقوی ftrace مربوط است — در ضبط طولانی، بافر بازنویسی میشود. Perfetto این محدودیت را برطرف میکند: میتوان ساعتها ضبط کرد و ردیابیهایی با اندازه چند گیگابایت با انتقال از طریق USB یا ضبط جریانی روی دیسک دریافت کرد.
دلایل احتمالی: برنامه به حالت debuggable منتقل نشده است، پرچم android:debuggable=”true” در مانیفست اضافه نشده است، یا از بیلد release استفاده میشود. همچنین بررسی کنید که در دستهبندیها --app=com.example.app مشخص شده است — در غیر این صورت Systrace فقط فرآیندهای سیستمی را ضبط میکند.
برای C++ از ATRACE_BEGIN و ATRACE_END از کتابخانه libcutils استفاده کنید. فایل هدر را include کرده و بخش مورد نظر را محصور کنید. برچسب در Systrace روی مسیر فرآیند شما ظاهر میشود که به ویژه برای تحلیل موتورهای بازی (Unity, Unreal) مفید است.
در اندروید ۱۲ و بالاتر از Perfetto استفاده کنید. عامل perfetto را روی دستگاه از طریق ADB نصب کنید، ضبط را در فرمت JSON شروع کنید. برای مشاهده سریع از Perfetto Web UI (ui.perfetto.dev) و برای CI از خروجی دستوری با TraceProcessor در پایتون استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید