วิธีจับภาพโปรไฟล์

หน้านี้แสดงวิธีบันทึกการติดตามระบบโดยใช้ ProfilingManager API

เพิ่มทรัพยากร Dependency

หากต้องการประสบการณ์การใช้งาน ProfilingManager API ที่ดีที่สุด ให้เพิ่มไลบรารี Jetpack ต่อไปนี้ลงในไฟล์ build.gradle.kts

Kotlin

   dependencies {
       implementation("androidx.tracing:tracing:1.3.0")
       implementation("androidx.core:core:1.16.0")
   }
   

Groovy

   dependencies {
       implementation 'androidx.tracing:tracing:1.3.0'
       implementation 'androidx.core:core:1.16.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());
          } 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();
}

โค้ดตัวอย่างจะตั้งค่าและจัดการเซสชันการทำโปรไฟล์โดยทำตาม ขั้นตอนต่อไปนี้

  1. ตั้งค่าผู้ดำเนินการ สร้าง Executor เพื่อกำหนดเธรดที่จะ รับผลลัพธ์การทำโปรไฟล์ การทำโปรไฟล์จะเกิดขึ้นในเบื้องหลัง การใช้ ตัวเรียกใช้เธรดที่ไม่ใช่ UI จะช่วยป้องกันข้อผิดพลาดแอปพลิเคชันไม่ตอบสนอง (ANR) หากคุณเพิ่มการประมวลผลลงในแฮนเดิลการเรียกกลับในภายหลัง

  2. จัดการผลการทำโปรไฟล์ สร้างออบเจ็กต์ Consumer<ProfilingResult> ระบบใช้ออบเจ็กต์นี้เพื่อส่งผลลัพธ์การสร้างโปรไฟล์จาก ProfilingManager กลับไปยังแอปของคุณ

  3. สร้างคำขอการจัดทำโปรไฟล์ สร้าง SystemTraceRequestBuilder เพื่อตั้งค่า เซสชันการจัดทำโปรไฟล์ เครื่องมือสร้างนี้ช่วยให้คุณปรับแต่ง ProfilingManagerการตั้งค่าการติดตามได้ การปรับแต่งเครื่องมือสร้างเป็นตัวเลือก คุณไม่จำเป็นต้องปรับแต่งหากไม่ต้องการ ระบบจะใช้การตั้งค่าเริ่มต้น

    • กำหนดแท็ก ใช้ setTag() เพื่อเพิ่มแท็กในชื่อการติดตาม แท็กนี้ช่วยให้คุณระบุการติดตามได้
    • ไม่บังคับ: กำหนดระยะเวลา ใช้ setDurationMs() เพื่อระบุระยะเวลา ในการทำโปรไฟล์เป็นมิลลิวินาที เช่น 60000 จะตั้งค่าการติดตามเป็น 60 วินาที การติดตามจะสิ้นสุดโดยอัตโนมัติหลังจากระยะเวลาที่ระบุ หาก CancellationSignal ไม่ได้ทริกเกอร์ก่อนหน้านั้น
    • เลือกนโยบายบัฟเฟอร์ ใช้ setBufferFillPolicy() เพื่อกำหนดวิธีจัดเก็บข้อมูลการติดตาม BufferFillPolicy.RING_BUFFER หมายความว่าเมื่อบัฟเฟอร์เต็ม ข้อมูลใหม่จะเขียนทับข้อมูลที่เก่าที่สุด ทำให้บันทึกกิจกรรมล่าสุดอย่างต่อเนื่อง
    • ตั้งค่าขนาดบัฟเฟอร์ ใช้ setBufferSizeKb() เพื่อระบุขนาดบัฟเฟอร์ สำหรับการติดตาม ซึ่งคุณใช้เพื่อควบคุมขนาดของการติดตามเอาต์พุต ได้
  4. ไม่บังคับ: จัดการวงจรเซสชัน สร้าง CancellationSignal ออบเจ็กต์นี้ช่วยให้คุณหยุดเซสชันการทำโปรไฟล์ได้ทุกเมื่อที่ต้องการ ซึ่งจะช่วยให้คุณควบคุมระยะเวลาของเซสชันได้อย่างแม่นยำ

  5. เริ่มและรับผลลัพธ์ เมื่อคุณโทรหา requestProfiling() ProfilingManager จะเริ่มเซสชันการสร้างโปรไฟล์ในเบื้องหลัง เมื่อ การสร้างโปรไฟล์เสร็จสมบูรณ์แล้ว ระบบจะส่ง ProfilingResult ไปยังเมธอด resultCallback#accept หากการสร้างโปรไฟล์เสร็จสมบูรณ์ ProfilingResult จะระบุเส้นทางที่บันทึกการติดตามไว้ในอุปกรณ์ ผ่าน ProfilingResult#getResultFilePath คุณสามารถรับไฟล์นี้ได้ โดยใช้โปรแกรม หรือหากต้องการสร้างโปรไฟล์ในเครื่อง ให้เรียกใช้ adb pull <trace_path> จากคอมพิวเตอร์

  6. เพิ่มจุดติดตามที่กำหนดเอง คุณเพิ่มจุดติดตามที่กำหนดเองในโค้ดของแอปได้ ในตัวอย่างโค้ดก่อนหน้า มีการเพิ่มส่วนย่อยของการติดตามชื่อ MyApp:HeavyOperationโดยใช้ Trace.beginSection() และ Trace.endSection() Slice ที่กำหนดเองนี้จะปรากฏในโปรไฟล์ที่สร้างขึ้น โดยไฮไลต์การดำเนินการที่เฉพาะเจาะจงภายในแอป