ไม่ว่าคุณจะบันทึกโปรไฟล์ที่ขับเคลื่อนด้วยแอปหรือโปรไฟล์ที่อิงตามทริกเกอร์ ProfilingManager จะบันทึกไฟล์ที่เสร็จสมบูรณ์ไว้ในอุปกรณ์และส่ง ProfilingResult ไปยัง Callback ที่ลงทะเบียนไว้ เรียกใช้ ProfilingResult.getResultFilePath เพื่อรับเส้นทางของโปรไฟล์ที่บันทึกไว้
- ระหว่างการทดสอบในเครื่อง: ดึงไฟล์ไปยังคอมพิวเตอร์โดยใช้
adb - ในเวอร์ชันที่ใช้งานจริง: ส่งเส้นทางไปยังงาน
WorkManagerที่บีบอัดและอัปโหลดโปรไฟล์ไปยังเซิร์ฟเวอร์
ดึงข้อมูลโปรไฟล์จากอุปกรณ์
ส่วนนี้จะอธิบายตำแหน่งที่ ProfilingManager จัดเก็บโปรไฟล์ในอุปกรณ์ วิธีการทำงานของการล้างไฟล์อัตโนมัติ และวิธีดึงไฟล์ในเครื่องโดยใช้ adb
ตำแหน่งไฟล์และรูปแบบการตั้งชื่อ
ProfilingManager จะบันทึกโปรไฟล์ที่ปกปิดข้อมูลไว้ในไดเรกทอรีพื้นที่เก็บข้อมูลเฉพาะแอปที่ /data/user/0/<app>/files/profiling/ รูปแบบชื่อไฟล์จะขึ้นอยู่กับวิธีบันทึกโปรไฟล์ ดังนี้
โปรไฟล์ที่ขับเคลื่อนโดยแอป
profile_<tag>_<datetime>_uid-<uid>.<profile-type-ext>หากไม่ได้ระบุแท็กเมื่อขอโปรไฟล์ ระบบจะไม่รวม
<tag>_ดังนี้profile_<datetime>_uid-<uid>.<profile-type-ext>โปรไฟล์ตามทริกเกอร์:
profile_trigger-type-<trigger_type>_<datetime>_uid-<uid>.<profile-type-ext>
สถานที่:
<app>คือชื่อแพ็กเกจของแอป<tag>คืออักขระที่เป็นตัวอักษรและตัวเลขคละกัน (และขีดกลาง) 20 ตัวแรกของแท็กที่ผู้โทรระบุซึ่งกำหนดค่าด้วยsetTagหรือส่งไปยังrequestProfilingโดยแปลงเป็นตัวพิมพ์เล็กและนำอักขระที่อยู่นอกa-z,0-9และ-ออก<trigger_type>คือรหัสค่าคงที่จำนวนเต็มสำหรับทริกเกอร์จากProfilingTriggerเรียกใช้ProfilingResult.getTriggerTypeในโค้ดเสมอแทนการแยกวิเคราะห์ชื่อไฟล์<datetime>คือวันที่และเวลาที่บันทึกโปรไฟล์ (yyyy-MM-dd-HH-mm-ss-SSS)<uid>คือรหัสผู้ใช้ Linux ของแอป (รวมอยู่ในโมดูลProfilingเวอร์ชันล่าสุด)<profile-type-ext>คือนามสกุลไฟล์สำหรับประเภทโปรไฟล์ที่บันทึกไว้ ดังนี้.perfetto-traceสำหรับการติดตามของระบบ.perfetto-java-heap-dumpสำหรับฮีปดัมป์ของ Java.perfetto-heap-profileสำหรับโปรไฟล์ฮีป.perfetto-stack-sampleสำหรับโปรไฟล์การสุ่มตัวอย่างสแต็ก
พื้นที่เก็บข้อมูลของอุปกรณ์และการล้างข้อมูลในอุปกรณ์
หากต้องการเพิ่มพื้นที่เก็บข้อมูลของอุปกรณ์โดยทันที ให้ลบไฟล์โปรไฟล์แต่ละไฟล์ในเวิร์กเกอร์การอัปโหลดทันทีหลังจากอัปโหลดสำเร็จ (เนื่องจากการล้างข้อมูลอัตโนมัติจะทำงานเมื่อ ProfilingManager ส่งผลลัพธ์ไปยังแอปของคุณเท่านั้น ไฟล์ที่ไม่ได้อัปโหลดจึงอาจยังคงอยู่ในดิสก์หากแอปของคุณหยุดลงทะเบียน Callback หลังจากสิ้นสุดแคมเปญ) เพื่อเป็นทางเลือกสำรองในโมดูล Profiling เวอร์ชันล่าสุด ProfilingManager จะลบไฟล์ที่นำส่งในไดเรกทอรีพื้นที่เก็บข้อมูลเฉพาะแอปที่มีอายุมากกว่า 5 วันโดยอัตโนมัติเมื่อมีการนำส่งผลลัพธ์ใหม่
อัปโหลดโปรไฟล์ในเวอร์ชันที่ใช้งานจริงด้วย WorkManager
เนื่องจากไฟล์โปรไฟล์อาจมีขนาดหลายเมกะไบต์ ให้กำหนดเวลาการอัปโหลดเวอร์ชันที่ใช้งานจริงในเบื้องหลังเมื่ออุปกรณ์อยู่ในเครือข่ายที่ไม่มีการวัดปริมาณอินเทอร์เน็ต (Wi-Fi) กำลังชาร์จ และไม่มีการใช้งาน
ก่อนอัปโหลด ให้บีบอัดไฟล์โปรไฟล์ (เช่น ใช้ GZIPOutputStream หรือ ZipOutputStream) โปรไฟล์ Perfetto protobuf และฮีปดัมพ์ Java จะบีบอัดอย่างมาก ซึ่งช่วยลดแบนด์วิดท์เครือข่ายและค่าใช้จ่ายในการจัดเก็บข้อมูลแบ็กเอนด์
เพิ่มทรัพยากร Dependency ของ WorkManager
ProfilingManager ไม่ขึ้นอยู่กับระบบคลาวด์ คุณจึงกำหนดเวลาการอัปโหลดโปรไฟล์ไปยังแบ็กเอนด์ใดก็ได้โดยใช้ WorkManager เพิ่มไลบรารี WorkManager ลงในไฟล์ build.gradle.kts ดังนี้
Kotlin
dependencies { implementation("androidx.work:work-runtime:2.12.0") }
ดึงดูด
dependencies { implementation 'androidx.work:work-runtime:2.12.0' }
ตั้งเวลางานอัปโหลด
เมื่อแอปของคุณได้รับ ProfilingResult ให้กำหนดเวลางานอัปโหลด ตัวอย่างต่อไปนี้จะละเว้นคำขอการทำโปรไฟล์เริ่มต้น ดูตัวอย่างคำขอที่สมบูรณ์ได้ที่บันทึกการติดตามของระบบ
Kotlin
class TraceUploadWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) { override fun doWork(): Result { // Perform your uploading work here Log.d("ProfileTest", "Uploading trace: " + inputData.getString("PROFILE_PATH")) return Result.success() } } fun setupProfileUploadWorker(profileFilepath: String?) { val workMgr = WorkManager.getInstance(applicationContext) val workRequestBuilder = OneTimeWorkRequest.Builder(TraceUploadWorker::class) val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.UNMETERED) .setRequiresDeviceIdle(true) .setRequiresCharging(true) .build() workRequestBuilder.setConstraints(constraints) val inputDataBuilder = Data.Builder() inputDataBuilder.putString("PROFILE_PATH", profileFilepath) workRequestBuilder.setInputData(inputDataBuilder.build()) workMgr.enqueue(workRequestBuilder.build()) }
Java
public static class TraceUploadWorker extends Worker { public TraceUploadWorker( @androidx.annotation.NonNull Context context, @androidx.annotation.NonNull WorkerParameters workerParams) { super(context, workerParams); } @androidx.annotation.NonNull @Override public Result doWork() { // Perform your uploading work here Log.d("ProfileTest", "Uploading trace: " + getInputData().getString("PROFILE_PATH")); return Result.success(); } } public void setupProfileUploadWorker(String profileFilepath) { WorkManager workMgr = WorkManager.getInstance(getApplicationContext()); OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder( TraceUploadWorker.class); Constraints constraints = new Constraints.Builder() .setRequiredNetworkType(NetworkType.UNMETERED) .setRequiresDeviceIdle(true) .setRequiresCharging(true) .build(); workRequestBuilder.setConstraints(constraints); Data.Builder inputDataBuilder = new Data.Builder(); inputDataBuilder.putString("PROFILE_PATH", profileFilepath); workRequestBuilder.setInputData(inputDataBuilder.build()); workMgr.enqueue(workRequestBuilder.build()); }
คำแนะนำแบบทีละขั้นเกี่ยวกับโค้ด
ตัวอย่างก่อนหน้านี้จะทำตามขั้นตอนต่อไปนี้
- กำหนด Worker: สร้างคลาส
TraceUploadWorkerที่ขยายWorkerใช้doWorkเพื่อยืนยันว่าไฟล์โปรไฟล์ยังคงอยู่ บีบอัดและอัปโหลดไฟล์โดยใช้ SDK แบ็กเอนด์หรือไคลเอ็นต์ HTTP และลบไฟล์ในเครื่องเมื่อการอัปโหลดสำเร็จ - กำหนดเวลางาน
- สร้าง
OneTimeWorkRequestสำหรับผู้ปฏิบัติงาน - ตั้งค่าข้อจำกัด: ใช้
setRequiredNetworkType(NetworkType.UNMETERED),setRequiresDeviceIdle(true)และsetRequiresCharging(true)เพื่อให้อัปโหลดทำงานเฉพาะเมื่ออุปกรณ์เชื่อมต่อ Wi-Fi, กำลังชาร์จ และไม่มีการใช้งาน - ส่งข้อมูล: ใช้
setInputDataเพื่อส่งเส้นทางโปรไฟล์จากgetResultFilePathไปยังผู้ปฏิบัติงาน - Enqueue: ส่งคำขอไปยัง
WorkManagerโดยเรียกใช้WorkManager.enqueue
- สร้าง
ขั้นตอนถัดไป
หลังจากดึงข้อมูลหรืออัปโหลดโปรไฟล์แล้ว ให้แสดงภาพโปรไฟล์ใน Perfetto UI, ค้นหาโปรไฟล์แต่ละรายการด้วย PerfettoSQL, วิเคราะห์การติดตามแบบกลุ่ม หรือวิเคราะห์โปรไฟล์ด้วย AI ดูคำแนะนำเกี่ยวกับการตั้งค่าไปป์ไลน์การวิเคราะห์ฝั่งเซิร์ฟเวอร์ที่ปรับขนาดได้ที่หัวข้อการติดตั้งใช้งาน Bigtrace ใน Kubernetes