Systrace เป็นเครื่องมือติดตามระบบ Android ที่รวบรวมข้อมูลเกี่ยวกับเคอร์เนล Linux, CPU, GPU และกระบวนการทั้งหมดของระบบในช่วงเวลาสั้น ๆ ซึ่งแตกต่างจาก Traceview ที่เน้นที่เมธอดภายในแอปพลิเคชัน Systrace แสดงภาพรวมของระบบ: โหลดของแต่ละคอร์ CPU, การทำงานของ SurfaceFlinger, การเรียก Binder และรอบ GC ตามข้อมูลของ Google, 2024 เครื่องมือนี้จำเป็นสำหรับการวินิจฉัยเฟรมที่ตก การเก็บขยะบ่อยครั้ง และความผิดปกติในเธรด UI
ประเด็นสำคัญ
Systrace เป็นยูทิลิตี้บรรทัดคำสั่งจาก Android SDK ที่จับภาพและรวมข้อมูลจากหลายแหล่งของการติดตามเคอร์เนล (ftrace) และพื้นที่ผู้ใช้ (atrace) เป็นรายงาน HTML เดียว เครื่องมือนี้ปรากฏใน Android 4.1 (Jelly Bean) เพื่อแทนที่ยูทิลิตี้ traceview เก่าสำหรับการทำโปรไฟล์ระบบและยังคงเป็นเครื่องมือวินิจฉัยประสิทธิภาพมาตรฐานบนแพลตฟอร์ม Android เป็นเวลานาน
Systrace อาศัย ftrace — กลไกการติดตามเคอร์เนล Linux ที่มีใน Android ตั้งแต่เวอร์ชัน 4.1 เมื่อ Systrace เริ่มทำงาน มันจะเปิดใช้งานหมวดหมู่การติดตามที่ระบุ: sched (ตัวกำหนดตารางงาน), freq (ความถี่ CPU), idle (สถานะว่าง), workq (คิวงาน), binder, gfx และอื่น ๆ ข้อมูลจะถูกรวบรวมในบัฟเฟอร์วงแหวนของเคอร์เนลและหลังจากหยุดจะถูกรวมเป็นไฟล์ trace.html เดียวที่สามารถเปิดได้ในเบราว์เซอร์ใดก็ได้
ตั้งแต่ Android Studio 3.1 เป็นต้นไป Systrace ถูกรวมอยู่ใน CPU Profiler ในโหมด “Trace System Calls” โปรไฟเลอร์จะเรียกใช้ Systrace บนอุปกรณ์ที่เชื่อมต่อและแสดงผลลัพธ์โดยตรงในหน้าต่าง Android Studio ซึ่งช่วยลดความจำเป็นในการทำงานกับบรรทัดคำสั่งสำหรับกรณีพื้นฐานในขณะที่ยังคงฟังก์ชันการทำงานทั้งหมด — หมวดหมู่การติดตามทั้งหมด การกรอง และไทม์ไลน์แบบโต้ตอบ ประสิทธิภาพของอุปกรณ์ ในระหว่างการติดตามลดลงเล็กน้อยเนื่องจาก ftrace ออกแบบมาให้มีโอเวอร์เฮดน้อยที่สุด
Systrace ใช้กลไกการรวบรวมข้อมูลสองแบบ: ftrace ที่ระดับเคอร์เนลสำหรับเหตุการณ์ของระบบและ atrace ในพื้นที่ผู้ใช้สำหรับแท็กเฉพาะของ Android ftrace บันทึกการสลับบริบท (sched_switch), การเปลี่ยนแปลงความถี่ CPU (cpu_frequency), การขัดจังหวะ (irq_handler_entry) และเหตุการณ์อื่น ๆ atrace เพิ่มแท็กจากเฟรมเวิร์ก Android — จุดเริ่มต้นและสิ้นสุดของการเรนเดอร์เฟรม, การเรียก SurfaceFlinger และธุรกรรม Binder
คุณสมบัติหลักของ Systrace คือการแสดงภาพไปป์ไลน์การเรนเดอร์ของแต่ละเฟรม: แอปพลิเคชัน → BufferQueue → SurfaceFlinger → HWC (ตัวประกอบ) → จอภาพ หากเกิดความล่าช้าในขั้นตอนใด Systrace จะแสดงสาเหตุที่แน่ชัด: แอปพลิเคชันไม่ได้เตรียมบัฟเฟอร์ทันเวลา SurfaceFlinger กำลังรอ VSync หรือ HWC ไม่สามารถประกอบเลเยอร์ได้ วงจรชีวิตของเฟรม บนไทม์ไลน์จะถูกเข้ารหัสสีตามสถานะ: สีเขียว (ทันเวลา), สีเหลือง (ล่าช้า), สีแดง (ตก) การแสดงภาพนี้เป็นเครื่องมือหลักในการเพิ่มประสิทธิภาพ UI
Systrace รองรับหมวดหมู่การติดตามมากกว่า 20 หมวดหมู่ แต่ละหมวดหมู่รวมถึงชุดของเหตุการณ์ที่เกี่ยวข้อง หมวดหมู่ที่สำคัญได้แก่: gfx (การเรนเดอร์กราฟิก), input (การประมวลผลอินพุต), view (ระบบ View), webview (WebView), power (การใช้พลังงาน), hal (เลเยอร์นามธรรมฮาร์ดแวร์) สำหรับการทำโปรไฟล์เกม หมวดหมู่ gfx พร้อมรายละเอียดคำสั่ง GPU ผ่าน AGI (Android GPU Inspector) มีประโยชน์
Systrace มอบชุดความสามารถที่ไม่เหมือนใครสำหรับ Android ที่ไม่มีในโปรไฟเลอร์อื่น ๆ: ไทม์ไลน์ของระบบ, เมตริกระดับเคอร์เนลและการตรวจจับปัญหาโดยอัตโนมัติ
รายงาน HTML ของ Systrace มีไทม์ไลน์หลายระดับที่แต่ละเลนตรงกับหนึ่งกระบวนการหรือเธรด คุณสามารถซูมเข้าและออกจากสเกลเวลา คลิกที่เหตุการณ์เพื่อดูรายละเอียด (ระยะเวลา กระบวนการเริ่มต้น อาร์กิวเมนต์เพิ่มเติม) การเข้ารหัสสี ช่วยในการนำทางอย่างรวดเร็ว: บล็อกสีเขียว — กระบวนการกำลังทำงาน, สีน้ำเงิน — กำลังรอ, สีส้ม — การขัดจังหวะ, สีขาว — ว่าง
Systrace วิเคราะห์ร่องรอยโดยอัตโนมัติและแสดง ข้อความแจ้งเตือน ที่ระบุพื้นที่ที่มีปัญหา ตัวอย่างเช่น: “Buffer underrun — SurfaceFlinger ไม่ได้รับบัฟเฟอร์ก่อน VSync” หรือ “Long Binder transaction — 42 ms ในเธรด Binder_1” การแจ้งเตือนแต่ละครั้งมีลิงก์ไปยังส่วนที่เกี่ยวข้องของไทม์ไลน์และคำแนะนำในการแก้ไข ซึ่งช่วยประหยัดเวลาการวิเคราะห์ด้วยตนเองหลายชั่วโมงและเป็นหนึ่งในเหตุผลหลักในการใช้ Systrace แทนการบันทึกด้วยตนเอง
นักพัฒนาสามารถเพิ่มแท็กที่กำหนดเองลงในร่องรอย Systrace ผ่าน API Trace.beginSection และ Trace.endSection ซึ่งช่วยให้สามารถติดตามการทำงานของส่วนโค้ดที่สำคัญได้โดยตรงบนไทม์ไลน์ของระบบ — ตัวอย่างเช่น การทำเครื่องหมายจุดเริ่มต้นและสิ้นสุดของการโหลดข้อมูลหรือการคำนวณเลย์เอาต์ แท็กจะปรากฏเป็นบล็อกแยกต่างหากบนเลนของแอปพลิเคชันและมองเห็นได้พร้อมกับเหตุการณ์ของระบบ
| หมวดหมู่ | ข้อมูล | การใช้งานทั่วไป |
|---|---|---|
| sched | การสลับบริบท, สถานะว่าง | การบล็อกเธรด, การแย่งชิง |
| gfx | VSync, การเตรียมบัฟเฟอร์, HWC | เฟรมตก, กระตุก |
| binder | ธุรกรรม Binder, ความหน่วง | ความล่าช้า IPC, การเรียกระยะไกล |
| freq | ความถี่ CPU, ตัวปรับขนาด | การลดความเร็ว, การใช้พลังงาน |
| gfx + AGI | คำสั่ง GPU, เชเดอร์ | ประสิทธิภาพเกม |
การเรียกใช้ Systrace สามารถทำได้สองวิธี: ผ่าน CPU Profiler ของ Android Studio (โหมด “Trace System Calls”) หรือผ่านบรรทัดคำสั่งโดยใช้สคริปต์ Python systrace.py จากโฟลเดอร์ platform-tools แต่ละวิธีมีกรณีการใช้งานของตัวเอง
เชื่อมต่ออุปกรณ์ เปิด Profiler (View → Tool Windows → Profiler) เลือกกระบวนการของคุณ ไปที่แท็บ CPU เลือกโหมด “Trace System Calls” และคลิก Record หลังจาก 5–30 วินาที คลิก Stop — Android Studio จะเรียกใช้ Systrace บนอุปกรณ์ รอให้เสร็จสมบูรณ์และโหลดผลลัพธ์ ข้อจำกัด: การบันทึกสามารถทำได้เฉพาะเมื่อเปิด Profiler ไว้เท่านั้น ซึ่งไม่สะดวกสำหรับสถานการณ์จำลองที่ยาวนานหรือการทำงานอัตโนมัติ
เพื่อการควบคุมที่ยืดหยุ่นมากขึ้น ให้ใช้สคริปต์ systrace.py ระบุหมวดหมู่การติดตาม ระยะเวลา และชื่อไฟล์เอาต์พุต ตัวอย่าง: การจับภาพข้อมูล gfx, input และ sched เป็นเวลา 10 วินาที การเรียกใช้ต้องใช้ Python 2.7+ และอุปกรณ์ที่เชื่อมต่อโดยเปิดการดีบัก USB ไว้ บน Android 12+ Systrace จะถูกแทนที่ด้วย Perfetto — คำสั่งยังคงเหมือนเดิม แต่สคริปต์จะเปลี่ยนเส้นทางการเรียกไปยัง perfetto
# การเรียกใช้ systrace พื้นฐาน 10 วินาที
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# เฉพาะหมวดหมู่ gfx สำหรับการวิเคราะห์ UI
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
เพื่อให้โค้ดของคุณปรากฏบนไทม์ไลน์ Systrace ให้หุ้มส่วนที่สำคัญด้วย Trace.beginSection / Trace.endSection สิ่งสำคัญคือ beginSection และ endSection ต้องจับคู่กันอย่างเคร่งครัด — มิฉะนั้น Systrace จะแสดงไทม์ไลน์ที่ไม่ถูกต้อง ใน Kotlin การใช้ส่วนขยายแบบอินไลน์เพื่อรับประกันการปิดส่วนแม้ในกรณีที่มีข้อยกเว้นนั้นสะดวก
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 ประกอบด้วยไทม์ไลน์แบบโต้ตอบ แผงเลือกกระบวนการ รายการข้อความแจ้งเตือน และเมตริกสำคัญ (อัตราเฟรม การใช้งาน CPU ธุรกรรม Binder) การทำความเข้าใจโครงสร้างรายงานเป็นทักษะสำคัญสำหรับการทำโปรไฟล์ที่มีประสิทธิภาพ
ไทม์ไลน์แสดงเวลาจากซ้ายไปขวา แต่ละกระบวนการและเธรดเป็นเลนแยกกัน ปุ่ม W/S ซูมเข้า/ออก, A/D เคลื่อนที่ตามเวลา เลือกพื้นที่ด้วยเมาส์เพื่อขยายส่วน เส้น VSync แสดงขอบเขตเฟรม (ทุก 16.6 ms ที่ 60 FPS) หากรอบการเรนเดอร์เต็มไม่พอดีระหว่างเส้น VSync สองเส้น — เฟรมจะตก ให้ความสนใจกับเลน SurfaceFlinger: หากมันไม่ว่างเป็นเวลานาน (บล็อกสีส้ม) การประกอบเลเยอร์กำลังทำให้การเรนเดอร์โดยรวมช้าลง
แผงการแจ้งเตือนทางด้านซ้ายของรายงานมีปัญหาที่ตรวจพบโดยอัตโนมัติ การแจ้งเตือนแต่ละครั้งสามารถคลิกได้ — เมื่อคลิก ไทม์ไลน์จะย้ายไปยังช่วงเวลาที่มีปัญหา การแจ้งเตือนที่พบบ่อยที่สุด: “Long Sync” (การซิงค์เธรดยาว), “Scheduling Delay” (ความล่าช้าของตัวกำหนดตาราง), “Buffer Overrun” (บัฟเฟอร์ SurfaceFlinger ล้น) หากการแจ้งเตือนแสดงค่า ~100 ms สำหรับ Scheduling Delay แสดงว่าเธรด UI กำลังรอ CPU เนื่องจากโหลดพื้นหลัง — การคำนวณหนักควรย้ายไปยัง Worker Thread
เพื่อวิเคราะห์เฟรมที่ตก ให้เปิดเลน SurfaceFlinger และ app.gfx แต่ละเฟรมจะแสดงเป็นสี่เหลี่ยมผืนผ้า: สีเขียว (≤16 ms), สีเหลือง (16–32 ms), สีแดง (>32 ms) หากคุณเห็นสี่เหลี่ยมผืนผ้าสีแดงบนเลนแอป ให้คลิกที่มัน — Systrace จะแสดงเมธอดเฉพาะ (หรือการเรียกระบบ) ที่เกินขีดจำกัด ตามข้อมูลของ Google (Android Performance Patterns, 2023) 70% ของปัญหาการกระตุกเกิดจาก onBindViewHolder ที่ช้าหรือ GC บ่อยครั้ง
Perfetto เป็นผู้สืบทอดของ Systrace ที่ Google เปิดตัวใน Android 9 (Pie) ในฐานะเครื่องมือทดลองและกลายเป็นโซลูชันหลักตั้งแต่ Android 12 เป็นต้นไป Perfetto ใช้รูปแบบข้อมูล protobuf ที่ทันสมัย รองรับเซสชันยาว (ชั่วโมงแทนวินาที) และมี Web UI สำหรับดูร่องรอย มาดูความแตกต่างหลักระหว่างสองระบบกัน
| เกณฑ์ | Systrace | Perfetto |
|---|---|---|
| รูปแบบ | รายงาน HTML (trace.html) | Protobuf (.trace / .perfetto-trace) |
| ระยะเวลา | สูงสุด 60 วินาที | ชั่วโมง, ข้อมูลกิกะไบต์ |
| อินเทอร์เฟซ | HTML ในตัว | Web UI (ui.perfetto.dev) |
| หมวดหมู่ | คงที่ (ftrace + atrace) | ขยายได้ (คำสั่ง SQL ไปยังร่องรอย) |
| ความคล่องตัว | Android เท่านั้น | Android, Linux, Chrome, Windows |
แม้จะมีการเปลี่ยนไปใช้ Perfetto ทักษะ Systrace ยังคงมีความเกี่ยวข้อง: บนอุปกรณ์ที่ใช้ Android 11 และต่ำกว่าจะใช้เป็นค่าเริ่มต้น และ Perfetto ยังคงความเข้ากันได้ย้อนหลังกับหมวดหมู่ Systrace ใน CPU Profiler ของ Android Studio จะใช้ Perfetto สำหรับอุปกรณ์ใหม่และ Systrace สำหรับอุปกรณ์เก่า — โปร่งใสสำหรับผู้ใช้ สำหรับ CI/CD แนะนำให้ใช้ Perfetto เนื่องจากรูปแบบของมันสามารถ ประมวลผล โดยอัตโนมัติผ่าน Python และ SQL
เพื่อฝึกฝน Systrace ในทางปฏิบัติ ลองพิจารณาสองสถานการณ์: การหาสาเหตุของเฟรมที่ตกระหว่างการเลื่อนและการวินิจฉัย GC บ่อยครั้งที่บล็อกเธรด UI
เรียกใช้ Systrace ด้วยหมวดหมู่ gfx เป็นเวลา 10 วินาที เลื่อนรายการในแอป ในรายงาน ให้ค้นหาส่วนที่มีเฟรมสีแดง คลิกที่เฟรมที่มีปัญหาและดูเลนแอป — หากมีบล็อก “inflateLayout” หรือ “onBindViewHolder” ที่กว้างกว่า 16 ms ปัญหาอยู่ที่การพองเลย์เอาต์หรือการผูกข้อมูล วิธีแก้ไข: ปรับแต่ง เลย์เอาต์ (ลด ViewGroup ที่ลึก, ViewStub) ย้ายการโหลดรูปภาพไปยัง Glide ด้วย onAttachedToWindow
Systrace ด้วยหมวดหมู่ freq และ sched ช่วยให้เห็นว่า GC cycle เกิดขึ้นบ่อยเพียงใดที่แทรกแซงเธรด UI ค้นหาเลนแอปพลิเคชันบนไทม์ไลน์ — หากคุณเห็นบล็อกเป็นระยะ ๆ 20–50 ms ชื่อ “Concurrent GC” แสดงว่าโปรแกรมเก็บขยะทำงานบ่อยเกินไป เพิ่มหมวดหมู่ “dalvik” สำหรับการวิเคราะห์โดยละเอียด วิธีแก้ไข: แปลง Bitmap เป็น ByteBuffer ใช้พูลอ็อบเจ็กต์ (ObjectPool) สำหรับการจัดสรรบ่อยครั้ง ลดการแตกกระจายของฮีปผ่านอาร์กิวเมนต์ ART
# เรียกใช้ด้วยหมวดหมู่สำหรับการวิเคราะห์ UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# การจับภาพด้วยระยะเวลา 30 วินาทีสำหรับการทดสอบที่ทำซ้ำได้
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
คำถามที่พบบ่อย
ได้ การเรียกใช้ Systrace ไม่จำเป็นต้องมีการเข้าถึง root เครื่องมือใช้ atrace ซึ่งมีอยู่ในอุปกรณ์ใด ๆ ที่เปิดการดีบัก USB ไว้ บางหมวดหมู่ (power, freq) อาจต้องมีการลงนามระบบ แต่หมวดหมู่หลัก (gfx, sched, input) ทำงานบนอุปกรณ์ทั้งหมด
ขีดจำกัด 60 วินาทีเกี่ยวข้องกับความจุของบัฟเฟอร์วงแหวน ftrace — ระหว่างการบันทึกนาน บัฟเฟอร์จะถูกเขียนทับ Perfetto ลบข้อจำกัดนี้: คุณสามารถบันทึกเป็นชั่วโมงและได้รับร่องรอยขนาดสูงสุด หลายกิกะไบต์ ผ่านการถ่ายโอน USB หรือการสตรีมลงดิสก์
สาเหตุที่เป็นไปได้: แอปไม่ได้อยู่ในโหมดดีบัก, ไม่ได้ตั้งค่าแฟล็ก android:debuggable=“true” ใน manifesต์, หรือกำลังใช้บิลด์เผยแพร่ ตรวจสอบว่าคุณระบุ --app=com.example.app ในหมวดหมู่ — มิฉะนั้น Systrace จะจับเฉพาะกระบวนการของระบบเท่านั้น
สำหรับ C++ ให้ใช้ ATRACE_BEGIN และ ATRACE_END จากไลบรารี libcutils รวมไฟล์ส่วนหัวและหุ้มส่วนที่ต้องการ แท็กจะปรากฏใน Systrace บนเลนกระบวนการของคุณ ซึ่งมีประโยชน์โดยเฉพาะสำหรับการวิเคราะห์เอนจินเกม (Unity, Unreal)
บน Android 12 ขึ้นไป ให้ใช้ Perfetto ติดตั้งเอเยนต์ perfetto บนอุปกรณ์ผ่าน ADB เริ่มบันทึกในรูปแบบ JSON สำหรับการดูอย่างรวดเร็ว ให้ใช้ Perfetto Web UI (ui.perfetto.dev) และสำหรับ CI — การส่งออกบรรทัดคำสั่งด้วย TraceProcessor ใน Python
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม