Systrace là một công cụ theo dõi hệ thống Android thu thập dữ liệu về kernel Linux, CPU, GPU và tất cả các tiến trình hệ thống trong một khoảng thời gian ngắn. Không giống Traceview, tập trung vào các phương thức trong ứng dụng, Systrace hiển thị bức tranh toàn hệ thống: tải của từng lõi CPU, hoạt động của SurfaceFlinger, lời gọi Binder và chu kỳ GC. Theo Google, 2024, công cụ này không thể thiếu để chẩn đoán các khung hình bị rơi, thu gom rác thường xuyên và các bất thường trong luồng UI.
Những điểm chính
Systrace là một tiện ích dòng lệnh từ Android SDK chụp và hợp nhất dữ liệu từ nhiều nguồn theo dõi kernel (ftrace) và không gian người dùng (atrace) thành một báo cáo HTML duy nhất. Công cụ xuất hiện trong Android 4.1 (Jelly Bean) như là sự thay thế cho tiện ích traceview cũ để phân tích hệ thống và từ lâu đã là công cụ chẩn đoán hiệu suất tiêu chuẩn trên nền tảng Android.
Systrace dựa trên ftrace — một cơ chế theo dõi kernel Linux có sẵn trong Android từ phiên bản 4.1. Khi Systrace khởi động, nó kích hoạt các danh mục theo dõi được chỉ định: sched (trình lập lịch tác vụ), freq (tần số CPU), idle (trạng thái rảnh), workq (hàng đợi công việc), binder, gfx và các loại khác. Dữ liệu được thu thập trong bộ đệm vòng của kernel và sau khi dừng sẽ được hợp nhất thành một tệp trace.html duy nhất có thể mở trong bất kỳ trình duyệt nào.
Bắt đầu từ Android Studio 3.1, Systrace được tích hợp vào CPU Profiler. Trong chế độ “Trace System Calls”, trình phân tích sẽ chạy Systrace trên thiết bị được kết nối và hiển thị kết quả trực tiếp trong cửa sổ Android Studio. Điều này loại bỏ nhu cầu làm việc với dòng lệnh cho các trường hợp cơ bản trong khi vẫn giữ lại đầy đủ chức năng — tất cả các danh mục theo dõi, lọc và dòng thời gian tương tác. Hiệu suất thiết bị trong quá trình theo dõi giảm không đáng kể vì ftrace được thiết kế với chi phí tối thiểu.
Systrace sử dụng hai cơ chế thu thập dữ liệu: ftrace ở cấp kernel cho các sự kiện hệ thống và atrace trong không gian người dùng cho các thẻ cụ thể của Android. ftrace ghi lại chuyển đổi ngữ cảnh (sched_switch), thay đổi tần số CPU (cpu_frequency), ngắt (irq_handler_entry) và các sự kiện khác. atrace thêm các thẻ từ framework Android — bắt đầu và kết thúc kết xuất khung hình, lời gọi SurfaceFlinger và giao dịch Binder.
Tính năng chính của Systrace là trực quan hóa quy trình kết xuất của từng khung hình: ứng dụng → BufferQueue → SurfaceFlinger → HWC (bộ tổng hợp) → Màn hình. Nếu xảy ra độ trễ ở bất kỳ giai đoạn nào, Systrace sẽ hiển thị nguyên nhân chính xác: ứng dụng không chuẩn bị bộ đệm kịp thời, SurfaceFlinger đang chờ VSync hoặc HWC không thể tổng hợp các lớp. Vòng đời khung hình trên dòng thời gian được mã hóa màu theo trạng thái: xanh lá (đúng thời hạn), vàng (bị trễ), đỏ (bị rơi). Trực quan hóa này là công cụ chính để tối ưu hóa hiệu suất UI.
Systrace hỗ trợ hơn 20 danh mục theo dõi, mỗi danh mục bao gồm một tập hợp các sự kiện liên quan. Các danh mục quan trọng bao gồm: gfx (kết xuất đồ họa), input (xử lý đầu vào), view (hệ thống View), webview (WebView), power (tiêu thụ điện), hal (lớp trừu tượng phần cứng). Để phân tích hiệu suất trò chơi, danh mục gfx với chi tiết lệnh GPU qua AGI (Android GPU Inspector) rất hữu ích.
Systrace cung cấp một tập hợp các khả năng độc đáo cho Android không có sẵn trong các trình phân tích khác: dòng thời gian hệ thống, các chỉ số ở cấp kernel và phát hiện sự cố tự động.
Báo cáo HTML của Systrace chứa một dòng thời gian đa cấp, nơi mỗi làn tương ứng với một tiến trình hoặc luồng. Bạn có thể phóng to và thu nhỏ thang thời gian, nhấp vào các sự kiện để xem chi tiết (thời lượng, tiến trình khởi tạo, đối số bổ sung). Mã hóa màu sắc giúp điều hướng nhanh chóng: khối xanh lá — tiến trình đang chạy, xanh dương — đang chờ, cam — ngắt, trắng — rảnh.
Systrace tự động phân tích dấu vết và hiển thị các thông báo cảnh báo chỉ ra các khu vực có vấn đề. Ví dụ: “Buffer underrun — SurfaceFlinger không nhận được bộ đệm trước VSync” hoặc “Long Binder transaction — 42 ms trong luồng Binder_1”. Mỗi cảnh báo chứa một liên kết đến phần tương ứng của dòng thời gian và đề xuất khắc phục. Điều này tiết kiệm hàng giờ phân tích thủ công và là một trong những lý do chính để sử dụng Systrace thay vì ghi log thủ công.
Nhà phát triển có thể thêm các thẻ tùy chỉnh vào dấu vết Systrace thông qua API Trace.beginSection và Trace.endSection. Điều này cho phép theo dõi việc thực thi các đoạn mã quan trọng trực tiếp trên dòng thời gian hệ thống — ví dụ, đánh dấu bắt đầu và kết thúc tải dữ liệu hoặc tính toán bố cục. Các thẻ xuất hiện dưới dạng các khối riêng biệt trên làn ứng dụng và hiển thị cùng với các sự kiện hệ thống.
| Danh mục | Dữ liệu | Sử dụng điển hình |
|---|---|---|
| sched | Chuyển đổi ngữ cảnh, trạng thái rảnh | Tắc nghẽn luồng, tranh chấp |
| gfx | VSync, chuẩn bị bộ đệm, HWC | Rơi khung hình, giật |
| binder | Giao dịch Binder, độ trễ | Chậm IPC, gọi từ xa |
| freq | Tần số CPU, bộ điều phối tỷ lệ | Throttling, tiêu thụ điện |
| gfx + AGI | Lệnh GPU, trình tô bóng | Hiệu suất trò chơi |
Chạy Systrace có thể thực hiện theo hai cách: thông qua CPU Profiler của Android Studio (chế độ “Trace System Calls”) hoặc thông qua dòng lệnh bằng tập lệnh Python systrace.py từ thư mục platform-tools. Mỗi phương pháp có các trường hợp sử dụng riêng.
Kết nối thiết bị, mở Profiler (View → Tool Windows → Profiler), chọn tiến trình của bạn, chuyển đến tab CPU, chọn chế độ “Trace System Calls” và nhấp Record. Sau 5–30 giây, nhấp Stop — Android Studio sẽ chạy Systrace trên thiết bị, chờ hoàn tất và tải kết quả. Hạn chế: chỉ có thể ghi khi Profiler đang mở, bất tiện cho các kịch bản dài hoặc tự động hóa.
Để kiểm soát linh hoạt hơn, hãy sử dụng tập lệnh systrace.py. Chỉ định các danh mục theo dõi, thời lượng và tên tệp đầu ra. Ví dụ: chụp dữ liệu gfx, input và sched trong 10 giây. Để chạy cần Python 2.7+ và thiết bị được kết nối với bật gỡ lỗi USB. Trên Android 12+, Systrace được thay thế bằng Perfetto — lệnh vẫn giữ nguyên, nhưng tập lệnh chuyển hướng các lời gọi đến perfetto.
# Chạy systrace cơ bản trong 10 giây
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Chỉ danh mục gfx để phân tích UI
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Để mã của bạn xuất hiện trên dòng thời gian Systrace, hãy bọc phần quan trọng bằng Trace.beginSection / Trace.endSection. Điều quan trọng là beginSection và endSection phải được ghép cặp nghiêm ngặt — nếu không Systrace sẽ hiển thị dòng thời gian không chính xác. Trong Kotlin, thật tiện lợi khi sử dụng phần mở rộng inline để đảm bảo đóng phần ngay cả khi có ngoại lệ.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Sử dụng trong mã
traceSection("load_screen_data") {
fetchData()
updateUI()
}
Báo cáo Systrace là một tệp HTML tự chứa có thể mở trong Chrome, Edge hoặc Firefox. Nó chứa một dòng thời gian tương tác, bảng chọn tiến trình, danh sách thông báo cảnh báo và các chỉ số chính (tốc độ khung hình, sử dụng CPU, giao dịch Binder). Hiểu cấu trúc báo cáo là một kỹ năng chính để phân tích hiệu suất hiệu quả.
Dòng thời gian hiển thị thời gian từ trái sang phải. Mỗi tiến trình và luồng là một làn riêng biệt. Phím W/S phóng to/thu nhỏ, A/D di chuyển qua thời gian. Chọn một vùng bằng chuột để phóng to một phần. Các đường VSync hiển thị ranh giới khung hình (cứ 16,6 ms ở 60 FPS). Nếu một chu kỳ kết xuất đầy đủ không vừa giữa hai đường VSync — khung hình bị rơi. Hãy chú ý đến làn SurfaceFlinger: nếu nó bận trong thời gian dài (khối màu cam), việc tổng hợp các lớp đang làm chậm quá trình kết xuất tổng thể.
Bảng Cảnh báo ở phía bên trái của báo cáo chứa các sự cố được phát hiện tự động. Mỗi cảnh báo có thể nhấp được — khi nhấp vào, dòng thời gian sẽ di chuyển đến thời điểm có vấn đề. Các cảnh báo phổ biến nhất: “Long Sync” (đồng bộ luồng dài), “Scheduling Delay” (trễ lịch trình), “Buffer Overrun” (tràn bộ đệm SurfaceFlinger). Nếu một cảnh báo hiển thị giá trị ~100 ms cho Scheduling Delay, điều này trực tiếp cho thấy luồng UI đang chờ CPU do tải nền — các tính toán nặng nên được chuyển sang Worker Thread.
Để phân tích các khung hình bị rơi, hãy bật các làn SurfaceFlinger và app.gfx. Mỗi khung hình được hiển thị dưới dạng hình chữ nhật: xanh lá (≤16 ms), vàng (16–32 ms), đỏ (>32 ms). Nếu bạn thấy một hình chữ nhật màu đỏ trên làn ứng dụng, hãy nhấp vào nó — Systrace sẽ hiển thị phương thức cụ thể (hoặc lời gọi hệ thống) nào đã vượt quá giới hạn. Theo Google (Android Performance Patterns, 2023), 70% sự cố giật là do onBindViewHolder chậm hoặc GC thường xuyên.
Perfetto là người kế nhiệm của Systrace, được Google giới thiệu trong Android 9 (Pie) như một công cụ thử nghiệm và trở thành giải pháp chính bắt đầu từ Android 12. Perfetto sử dụng định dạng dữ liệu protobuf hiện đại, hỗ trợ các phiên dài (hàng giờ thay vì giây) và có giao diện Web để xem dấu vết. Hãy xem xét các khác biệt chính giữa hai hệ thống.
| Tiêu chí | Systrace | Perfetto |
|---|---|---|
| Định dạng | Báo cáo HTML (trace.html) | Protobuf (.trace / .perfetto-trace) |
| Thời lượng | Tối đa 60 giây | Hàng giờ, gigabyte dữ liệu |
| Giao diện | HTML tích hợp | Giao diện Web (ui.perfetto.dev) |
| Danh mục | Cố định (ftrace + atrace) | Có thể mở rộng (truy vấn SQL trên dấu vết) |
| Tính di động | Chỉ Android | Android, Linux, Chrome, Windows |
Mặc dù chuyển sang Perfetto, các kỹ năng về Systrace vẫn còn phù hợp: trên các thiết bị chạy Android 11 trở xuống, nó được sử dụng theo mặc định và Perfetto duy trì khả năng tương thích ngược với các danh mục Systrace. Trong CPU Profiler của Android Studio, Perfetto được sử dụng cho các thiết bị mới và Systrace cho các thiết bị cũ — minh bạch cho người dùng. Đối với CI/CD, Perfetto được khuyến nghị vì định dạng của nó có thể được xử lý tự động qua Python và SQL.
Để thực hành thành thạo Systrace, hãy xem xét hai kịch bản: tìm nguyên nhân rơi khung hình khi cuộn và chẩn đoán GC thường xuyên chặn luồng UI.
Chạy Systrace với danh mục gfx trong 10 giây, cuộn danh sách trong ứng dụng. Trong báo cáo, tìm các phần có khung hình màu đỏ. Nhấp vào khung hình có vấn đề và xem làn ứng dụng — nếu có khối “inflateLayout” hoặc “onBindViewHolder” rộng hơn 16 ms, vấn đề nằm ở việc mở rộng bố cục hoặc liên kết dữ liệu. Giải pháp: tối ưu hóa bố cục (giảm ViewGroup sâu, ViewStub), chuyển việc tải hình ảnh sang Glide với onAttachedToWindow.
Systrace với các danh mục freq và sched cho phép xem tần suất các chu kỳ GC chiếm quyền ưu tiên của luồng UI. Tìm làn ứng dụng trên dòng thời gian — nếu bạn thấy các khối định kỳ kéo dài 20–50 ms có tên “Concurrent GC”, trình thu gom rác đang chạy quá thường xuyên. Thêm danh mục “dalvik” để phân tích chi tiết. Giải pháp: chuyển đổi Bitmap thành ByteBuffer, sử dụng nhóm đối tượng (ObjectPool) cho các cấp phát thường xuyên, giảm phân mảnh heap qua các đối số ART.
# Chạy với danh mục phân tích UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Chụp với thời lượng 30 giây cho kiểm thử có thể tái tạo
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Câu hỏi thường gặp
Có, để chạy Systrace không cần quyền truy cập root. Công cụ sử dụng atrace, có sẵn trên mọi thiết bị đã bật gỡ lỗi USB. Một số danh mục (power, freq) có thể yêu cầu chữ ký hệ thống, nhưng các danh mục chính (gfx, sched, input) hoạt động trên tất cả các thiết bị.
Giới hạn 60 giây liên quan đến dung lượng bộ đệm vòng ftrace — khi ghi dài, bộ đệm bị ghi đè. Perfetto loại bỏ giới hạn này: bạn có thể ghi hàng giờ và nhận được các dấu vết lên đến nhiều gigabyte qua USB hoặc ghi trực tiếp vào đĩa.
Nguyên nhân có thể: ứng dụng không ở chế độ debuggable, cờ android:debuggable=“true” không được đặt trong tệp kê khai, hoặc đang sử dụng bản dựng release. Cũng kiểm tra xem bạn đã chỉ định --app=com.example.app trong các danh mục chưa — nếu không Systrace chỉ chụp các tiến trình hệ thống.
Đối với C++, sử dụng ATRACE_BEGIN và ATRACE_END từ thư viện libcutils. Bao gồm tệp tiêu đề và bọc phần mong muốn. Thẻ sẽ xuất hiện trong Systrace trên làn tiến trình của bạn, đặc biệt hữu ích cho việc phân tích các công cụ trò chơi (Unity, Unreal).
Trên Android 12 trở lên, hãy sử dụng Perfetto. Cài đặt tác nhân perfetto trên thiết bị qua ADB, bắt đầu ghi ở định dạng JSON. Để xem nhanh, sử dụng giao diện Web Perfetto (ui.perfetto.dev), và cho CI — xuất dòng lệnh với TraceProcessor trong Python.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm