หน้านี้แสดงวิธีบันทึกการติดตามของระบบโดยใช้ ProfilingManager API
ProfilingManager ยังบันทึกโปรไฟล์ประเภทอื่นๆ ได้ด้วย กระบวนการนี้คล้ายกับการบันทึก System Tracing แต่แต่ละประเภทจะใช้ตัวสร้างที่แตกต่างกัน โปรไฟล์ที่รองรับและตัวสร้างของโปรไฟล์มีดังนี้
การติดตามของระบบ: บันทึกโดยใช้
SystemTraceRequestBuilderซึ่ง มีประโยชน์สำหรับการวิเคราะห์เวลาในการตอบสนองและการแก้ไขข้อบกพร่องด้านประสิทธิภาพโดยทั่วไปฮีปดัมป์: บันทึกโดยใช้
JavaHeapDumpRequestBuilderซึ่งมีประโยชน์สำหรับการตรวจหาหน่วยความจำรั่วไหลและการเพิ่มประสิทธิภาพโปรไฟล์ฮีป: บันทึกโดยใช้
HeapProfileRequestBuilderซึ่ง มีประโยชน์สำหรับการเพิ่มประสิทธิภาพหน่วยความจำโปรไฟล์สแต็กการเรียกใช้: บันทึกโดยใช้
StackSamplingRequestBuilder, ซึ่งมีประโยชน์สำหรับการทำความเข้าใจการดำเนินการโค้ดและการวิเคราะห์เวลาในการตอบสนอง
เพิ่มการอ้างอิง
หากต้องการรับประสบการณ์การใช้งานที่ดีที่สุดกับ ProfilingManager API ให้เพิ่มไลบรารี Jetpack ต่อไปนี้ลงในไฟล์ build.gradle.kts
Kotlin
dependencies { implementation("androidx.tracing:tracing:1.3.0") implementation("androidx.core:core:1.18.0") }
ดึงดูด
dependencies { implementation 'androidx.tracing:tracing:1.3.0' implementation 'androidx.core:core:1.18.0' }
บันทึกการติดตามของระบบ
หลังจากเพิ่มการอ้างอิงที่จำเป็นแล้ว ให้ใช้โค้ดต่อไปนี้เพื่อบันทึกการติดตามของระบบ ตัวอย่างนี้แสดงการตั้งค่าพื้นฐานภายใน Activity เพื่อเริ่มและจัดการเซสชันการทำโปรไฟล์
Kotlin
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) fun sampleRecordSystemTrace() { val mainExecutor: Executor = Dispatchers.IO.asExecutor() // Your choice of executor for the callback to occur on. val resultCallback = Consumer<ProfilingResult> { profilingResult -> if (profilingResult.errorCode == ProfilingResult.ERROR_NONE) { Log.d( "ProfileTest", "Received profiling result file=" + profilingResult.resultFilePath ) } else { Log.e( "ProfileTest", "Profiling failed errorcode=" + profilingResult.errorCode + " errormsg=" + profilingResult.errorMessage ) } } val stopSignal = CancellationSignal() val requestBuilder = SystemTraceRequestBuilder() requestBuilder.setCancellationSignal(stopSignal) requestBuilder.setTag("FOO") // Caller supplied tag for identification requestBuilder.setDurationMs(60000) requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER) requestBuilder.setBufferSizeKb(20971520) requestProfiling(applicationContext, requestBuilder.build(), mainExecutor, resultCallback) // Wait some time for profiling to start. Trace.beginSection("MyApp:HeavyOperation") heavyOperation() Trace.endSection() // Once the interesting code section is profiled, stop profile stopSignal.cancel() } fun heavyOperation() { // Computations you want to profile }
Java
void heavyOperation() { // Computations you want to profile } void sampleRecordSystemTrace() { Executor mainExecutor = Executors.newSingleThreadExecutor(); Consumer<ProfilingResult> resultCallback = new Consumer<ProfilingResult>() { @Override public void accept(ProfilingResult profilingResult) { if (profilingResult.getErrorCode() == ProfilingResult.ERROR_NONE) { Log.d( "ProfileTest", "Received profiling result file=" + profilingResult.getResultFilePath()); setupProfileUploadWorker(profilingResult.getResultFilePath()); } else { Log.e( "ProfileTest", "Profiling failed errorcode=" + profilingResult.getErrorCode() + " errormsg=" + profilingResult.getErrorMessage()); } } }; CancellationSignal stopSignal = new CancellationSignal(); SystemTraceRequestBuilder requestBuilder = new SystemTraceRequestBuilder(); requestBuilder.setCancellationSignal(stopSignal); requestBuilder.setTag("FOO"); requestBuilder.setDurationMs(60000); requestBuilder.setBufferFillPolicy(BufferFillPolicy.RING_BUFFER); requestBuilder.setBufferSizeKb(20971520); Profiling.requestProfiling(getApplicationContext(), requestBuilder.build(), mainExecutor, resultCallback); // Wait some time for profiling to start. Trace.beginSection("MyApp:HeavyOperation"); heavyOperation(); Trace.endSection(); // Once the interesting code section is profiled, stop profile stopSignal.cancel(); }
โค้ดตัวอย่างจะตั้งค่าและจัดการเซสชันการทำโปรไฟล์โดยทำตามขั้นตอนต่อไปนี้
ตั้งค่า Executor สร้าง
Executorเพื่อกำหนดเธรดที่จะรับผลการทำโปรไฟล์ การทำโปรไฟล์จะเกิดขึ้นในเบื้องหลัง การใช้ Executor เธรดที่ไม่ใช่ UI จะช่วยป้องกันข้อผิดพลาดแอปพลิเคชันไม่ตอบสนอง (ANR) หากคุณเพิ่มการประมวลผลเพิ่มเติมลงใน Callback ในภายหลังจัดการผลการทำโปรไฟล์ สร้างออบเจ็กต์
Consumer<ProfilingResult>ระบบจะใช้ออบเจ็กต์นี้เพื่อส่งผลการทำโปรไฟล์จากProfilingManagerกลับไปยังแอปสร้างคำขอการทำโปรไฟล์ สร้าง
SystemTraceRequestBuilderเพื่อตั้งค่าเซสชันการทำโปรไฟล์ เครื่องมือสร้างนี้ช่วยให้คุณปรับแต่งการตั้งค่าการติดตามProfilingManagerได้ การปรับแต่งตัวสร้างเป็นตัวเลือก หากคุณไม่ปรับแต่ง ระบบจะใช้การตั้งค่าเริ่มต้น- กำหนดแท็ก ใช้
setTag()เพื่อเพิ่มแท็กลงในชื่อการติดตาม แท็กนี้จะช่วยคุณระบุการติดตาม - ไม่บังคับ: ตั้งค่าระยะเวลา ใช้
setDurationMs()เพื่อระบุระยะเวลาที่จะทำโปรไฟล์เป็นมิลลิวินาที เช่น60000จะตั้งค่าการติดตาม 60 วินาที การติดตามจะสิ้นสุดโดยอัตโนมัติหลังจากระยะเวลาที่ระบุ หากไม่มีการทริกเกอร์CancellationSignalก่อนหน้านั้น - เลือกนโยบายบัฟเฟอร์ ใช้
setBufferFillPolicy()เพื่อกำหนดวิธีจัดเก็บข้อมูลการติดตามBufferFillPolicy.RING_BUFFERหมายความว่าเมื่อบัฟเฟอร์เต็ม ข้อมูลใหม่จะเขียนทับข้อมูลเก่าที่สุด ซึ่งจะบันทึกกิจกรรมล่าสุดอย่างต่อเนื่อง - ตั้งค่าขนาดบัฟเฟอร์ ใช้
setBufferSizeKb()เพื่อระบุขนาดบัฟเฟอร์สำหรับการติดตาม ซึ่งคุณสามารถใช้เพื่อควบคุมขนาดของไฟล์การติดตามเอาต์พุตได้
- กำหนดแท็ก ใช้
ไม่บังคับ: จัดการวงจรชีวิตของเซสชัน สร้าง
CancellationSignalออบเจ็กต์นี้ช่วยให้คุณหยุดเซสชันการทำโปรไฟล์ได้ทุกเมื่อที่ต้องการ ซึ่งจะช่วยให้คุณควบคุมระยะเวลาได้อย่างแม่นยำเริ่มและรับผลลัพธ์ เมื่อคุณเรียก
requestProfiling()ProfilingManagerจะเริ่มเซสชันการทำโปรไฟล์ในเบื้องหลัง เมื่อการทำโปรไฟล์เสร็จสมบูรณ์แล้ว ระบบจะส่งProfilingResultไปยังเมธอดresultCallback#acceptหากการทำโปรไฟล์เสร็จสมบูรณ์ theProfilingResultจะระบุเส้นทางที่บันทึกการติดตามไว้ในอุปกรณ์ ผ่านProfilingResult#getResultFilePathคุณสามารถรับไฟล์นี้ แบบเป็นโปรแกรมหรือโดยการเรียกใช้adb pull <trace_path>จากคอมพิวเตอร์สำหรับการทำโปรไฟล์ในเครื่องเพิ่มจุดการติดตามที่กำหนดเอง คุณสามารถเพิ่มจุดการติดตามที่กำหนดเองในโค้ดของแอปได้ ในตัวอย่างโค้ดก่อนหน้า ระบบจะเพิ่มสไลซ์การติดตามที่ชื่อ
MyApp:HeavyOperationโดยใช้Trace.beginSection()และTrace.endSection()สไลซ์ที่กำหนดเองนี้จะปรากฏในโปรไฟล์ที่สร้างขึ้น โดยจะไฮไลต์การดำเนินการที่เฉพาะเจาะจงภายในแอป