คำสั่งแก้ไขข้อบกพร่องสำหรับการสร้างโปรไฟล์ในเครื่อง

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

ปิดใช้ตัวจำกัดอัตรา

หากต้องการปิดใช้กระบวนการของแอปและตัวจำกัดอัตราของระบบสำหรับคำขอ requestProfiling ระหว่างการทดสอบในเครื่อง ให้เรียกใช้คำสั่ง device_config ต่อไปนี้

adb shell device_config put profiling_testing rate_limiter.disabled true

เมื่อทดสอบเสร็จแล้ว ให้รีเซ็ต Flag โดยทำดังนี้

adb shell device_config delete profiling_testing rate_limiter.disabled

ดึงโปรไฟล์โดยใช้ ADB

หากต้องการตรวจสอบโปรไฟล์ที่ปกปิดข้อมูลในเครื่องบนอุปกรณ์ที่มีสิทธิ์เข้าถึงระดับรูท ให้เรียกใช้ adb pull พร้อมเส้นทางที่ getResultFilePath แสดงผล:

# Pull a profile
adb pull /data/user/0/<com.example.myapp>/files/profiling/<profile-file-name>

เก็บรักษาผลลัพธ์ชั่วคราวและผลลัพธ์ที่ไม่ได้ปกปิด

เมื่อทดสอบการทำโปรไฟล์ในเครื่อง คุณสามารถเก็บผลลัพธ์ไว้ในไดเรกทอรีชั่วคราวที่ /data/misc/perfetto-traces/profiling/ การเปรียบเทียบการติดตามของระบบที่ไม่ได้ปกปิดข้อมูลกับเวอร์ชันที่ปกปิดข้อมูลจะช่วยให้คุณเข้าใจว่าข้อมูลใดถูกตัดออกระหว่างการปกปิดข้อมูล

วิธีเก็บรักษาผลลัพธ์ชั่วคราวและผลลัพธ์ที่ไม่ได้ปกปิดจะขึ้นอยู่กับเวอร์ชัน Android ที่อุปกรณ์ใช้ ดังนี้

  • Android 16 (ระดับ API 36) ขึ้นไป: คุณสามารถเก็บทั้งผลลัพธ์ที่ไม่ได้ปกปิด (หากมี) และผลลัพธ์ที่ปกปิดไว้ในไดเรกทอรีชั่วคราว ซึ่งได้รับการขยายใน Android 16 ให้เข้าถึงได้โดยใช้ adb pull ในบิลด์ทุกประเภทโดยไม่ต้องมีสิทธิ์เข้าถึงระดับรูท (ขณะที่ Android 15 ต้องมีสิทธิ์เข้าถึงระดับรูทเพื่ออ่าน /data/misc/perfetto-traces/profiling/) หากต้องการป้องกันไม่ให้ระบบลบผลลัพธ์ชั่วคราว ให้เรียกใช้คำสั่งต่อไปนี้

    adb shell device_config put profiling_testing delete_temporary_results.disabled true
    
  • Android 15 (ระดับ API 35): ในไดเรกทอรีชั่วคราว คุณสามารถเก็บเฉพาะผลลัพธ์ที่ไม่ได้ปกปิด ซึ่งเข้าถึงได้ผ่าน adb เฉพาะในบิลด์ที่มีสิทธิ์เข้าถึงระดับรูทเท่านั้น (แอปของคุณยังคงได้รับโปรไฟล์ที่ปกปิดข้อมูลในไดเรกทอรี /data/user/0/<app>/files/profiling/ ของแอปเอง ซึ่งโค้ดแอปสามารถอ่านหรือคัดลอกในบิลด์ใดก็ได้ แม้ว่าการดึงข้อมูลจาก /data/user/0/... โดยตรงด้วย adb pull จะต้องใช้สิทธิ์เข้าถึงระดับรูท หรือ adb shell run-as <app> ในบิลด์ที่แก้ไขข้อบกพร่องได้) หากต้องการป้องกันไม่ให้ระบบลบร่องรอยที่ไม่ได้ปกปิด ให้เรียกใช้คำสั่งต่อไปนี้

    adb shell device_config put profiling_testing delete_unredacted_trace.disabled true
    

หลังจากบันทึกโปรไฟล์แล้ว ให้ดึงไฟล์ที่เก็บไว้ออกจากไดเรกทอรีชั่วคราว โดยทำดังนี้

# Pull a retained redacted profile (Android 16 and higher)
adb pull /data/misc/perfetto-traces/profiling/<trace-name>.<profile-type-ext>

# Pull an unredacted system trace
adb pull /data/misc/perfetto-traces/profiling/<trace-name>.perfetto-trace-unredacted

ในคำสั่งเหล่านี้ <trace-name> คือชื่อไฟล์ฐาน (ไม่มีนามสกุล) จากเส้นทางที่ ProfilingResult.getResultFilePath แสดงผล และสำเนาการติดตามของระบบที่ไม่ได้ปกปิดจะเพิ่ม -unredacted ต่อท้ายนามสกุล .perfetto-trace ดูรายละเอียดเกี่ยวกับโครงสร้างชื่อไฟล์และค่า <profile-type-ext> ได้ที่หัวข้อตำแหน่งไฟล์และรูปแบบการตั้งชื่อ

adb shell device_config delete profiling_testing delete_temporary_results.disabled
adb shell device_config delete profiling_testing delete_unredacted_trace.disabled

บังคับให้เปิดใช้การติดตามเบื้องหลังสำหรับการทดสอบทริกเกอร์

เนื่องจากการติดตามเบื้องหลังของระบบจะทำงานตามช่วงเวลาแบบสุ่มในเวอร์ชันที่ใช้งานจริง การทดสอบการทำโปรไฟล์ตามทริกเกอร์ในเครื่องจึงอาจทำได้ยาก หากต้องการบังคับให้ระบบเรียกใช้การติดตามในเบื้องหลังอย่างต่อเนื่องและข้ามตัวจำกัดอัตราคำขอระดับระบบสำหรับทริกเกอร์ของแอป ให้ตั้งค่า system_triggered_profiling.testing_package_name ดังนี้

adb shell device_config put profiling_testing system_triggered_profiling.testing_package_name <com.example.myapp>

ระยะเวลาพักการใช้งานต่อทริกเกอร์ที่กำหนดค่าด้วย setRateLimitingPeriodHours จะยังคงมีผลอยู่ เนื่องจากโหมดนี้จะทำงานอย่างต่อเนื่องจนกว่าคุณจะล้างข้อมูล ให้ลบแฟล็กเมื่อทดสอบเสร็จแล้ว

adb shell device_config delete profiling_testing system_triggered_profiling.testing_package_name

คำสั่งการแก้ไขข้อบกพร่องที่มีประโยชน์

ใน Android 16 (API ระดับ 36) ขึ้นไปที่มีเวอร์ชันโมดูล Profiling ล่าสุด คุณสามารถใช้เครื่องมือ cmd profiling_service ผ่าน adb เพื่อเปิดใช้การบันทึกแบบละเอียด เรียกใช้คอลเล็กชันโปรไฟล์แบบออนดีมานด์ และทดสอบทริกเกอร์ได้โดยตรงจากบรรทัดคำสั่ง

เปิดใช้การบันทึกแก้ไขข้อบกพร่องแบบละเอียด

หากต้องการเปิดใช้บันทึก ProfilingService โดยละเอียดใน logcat และวิเคราะห์การจัดการและการส่งคำขอ ให้เรียกใช้คำสั่งต่อไปนี้

adb shell cmd profiling_service enable-logs true

ขอการรวบรวมโปรไฟล์แบบออนดีมานด์

หากต้องการเริ่มจับภาพโปรไฟล์ทันทีสำหรับแพ็กเกจที่เฉพาะเจาะจงจากบรรทัดคำสั่ง ให้เรียกใช้คำสั่งต่อไปนี้

adb shell cmd profiling_service request-profiling <profiling_type> <com.example.myapp> [--user <user_id>] [--duration <duration_ms>] [--sources <sources>]

ในคำสั่งนี้ <profiling_type> คือค่าคงที่จำนวนเต็มจาก ProfilingManager (1 สำหรับฮีปดัมป์ของ Java, 2 สำหรับโปรไฟล์ฮีป, 3 สำหรับการสุ่มตัวอย่างสแต็ก หรือ 4 สำหรับการติดตามของระบบ) กระบวนการของแอปเป้าหมายต้องทำงานสำหรับโปรไฟล์หน่วยความจำและสแต็ก คำขอจะขึ้นอยู่กับตัวจำกัดอัตราเว้นแต่จะปิดใช้ และ ProfilingResult ที่เสร็จสมบูรณ์จะส่งไปยัง Listener ทั่วโลกที่ลงทะเบียนกับ registerForAllProfilingResults เท่านั้น

ลงทะเบียนและจำลองทริกเกอร์

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

adb shell cmd profiling_service add-trigger <trigger_type> <com.example.myapp> [--user <user_id>]
adb shell cmd profiling_service trigger <trigger_type> <com.example.myapp> [--user <user_id>]

ในคำสั่งเหล่านี้ <trigger_type> คือค่าคงที่จำนวนเต็มจาก ProfilingTrigger (เช่น 1 สำหรับ TRIGGER_TYPE_APP_FULLY_DRAWN, 2 สำหรับ TRIGGER_TYPE_ANR หรือ 7 สำหรับ TRIGGER_TYPE_OOM) การเรียกใช้ add-trigger จะลงทะเบียนทริกเกอร์ด้วยระยะเวลาพัก 0 ชั่วโมง ซึ่งจะลบล้างการลงทะเบียนที่มีอยู่สำหรับทริกเกอร์ประเภทนั้น การจำลองทริกเกอร์ที่บันทึกภาพรวมของการติดตามเบื้องหลัง (เช่น 1 หรือ 2) ต้องใช้การติดตามเบื้องหลังที่ใช้งานอยู่ (ดูบังคับให้เปิดใช้การติดตามเบื้องหลังสำหรับการทดสอบทริกเกอร์)

รวบรวมสถานะ ProfilingManager โดยรวม

ใน Android 16 (API ระดับ 36) ขึ้นไปที่มีโมดูล Profiling เวอร์ชันล่าสุด คุณสามารถเรียกใช้ dumpsys กับ profiling_service เพื่อวินิจฉัยปัญหาและตรวจสอบสถานะปัจจุบันของ ProfilingManager ได้ ดังนี้

adb shell dumpsys profiling_service

เอาต์พุต dumpsys profiling_service มีไว้เพื่อวัตถุประสงค์ในการให้ข้อมูลและการแก้ไขข้อบกพร่องเท่านั้น และรูปแบบอาจมีการเปลี่ยนแปลง ซึ่งจะแสดงภาพรวมของสถานะภายในของบริการ ซึ่งรวมถึงข้อมูลต่อไปนี้

  • การควบคุมปริมาณที่ใช้งานอยู่และสถานะตัวจำกัดอัตรา
  • การกำหนดค่าอุปกรณ์ที่ใช้งานอยู่
  • ทริกเกอร์แอปที่ลงทะเบียนและระยะเวลาคูลดาวน์ของการจำกัดอัตราคำขอ
  • เซสชันการทำโปรไฟล์ที่ใช้งานอยู่และอยู่ในคิว
  • คำขอการทำโปรไฟล์ล่าสุด เหตุการณ์ทริกเกอร์ และเหตุการณ์การส่งผลลัพธ์