ดึงข้อมูลและอัปโหลดโปรไฟล์

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

ดึงข้อมูลโปรไฟล์จากอุปกรณ์

ส่วนนี้จะอธิบายตำแหน่งที่ 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