ตั้งค่า Worker สำหรับการอัปโหลดโปรไฟล์

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

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

ตั้งค่างานอัปโหลด WorkManager

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

ตัวอย่างโค้ดเพื่อตั้งค่างานอัปโหลด

ต่อไปนี้คือตัวอย่างวิธีตั้งค่างานที่ไม่รบกวนผู้ใช้ในการอัปโหลดการติดตามไปยังเซิร์ฟเวอร์

เพิ่มทรัพยากร Dependency ของ WorkManager

นอกเหนือจากทรัพยากร Dependency ProfilingManager ที่มีอยู่แล้ว ให้เพิ่มไลบรารี Jetpack เหล่านี้ลงในไฟล์ build.gradle.kts WorkManager ต้องใช้ข้อมูลเข้าสู่ระบบ

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)
      .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 ที่คุณต้องการ

  • Request profiling: ใช้ SystemTraceRequestBuilder เพื่อกำหนดค่าการติดตาม (ระยะเวลา, นโยบายบัฟเฟอร์) และ Profiling.requestProfiling เพื่อเริ่มการติดตาม

  • กำหนดเวลางาน

    • สร้าง OneTimeWorkRequest สำหรับผู้ปฏิบัติงาน

    • ตั้งค่าข้อจำกัด: ใช้ setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) และ setRequiresCharging(true) เพื่อให้มั่นใจว่าการอัปโหลดจะเกิดขึ้นเมื่อผู้ใช้เชื่อมต่อ Wi-Fi, ชาร์จอุปกรณ์ และไม่ได้ใช้งานอุปกรณ์อยู่เท่านั้น ซึ่งเป็นสิ่งสำคัญเพื่อหลีกเลี่ยงการรบกวนผู้ใช้ด้วยงานอัปโหลด

    • ส่งข้อมูล: ใช้ setInputData เพื่อส่งเส้นทางการติดตามไปยังผู้ปฏิบัติงาน

    • จัดคิว: ส่งคำขอไปยัง WorkManager โดยเรียกใช้ WorkManager#enqueue

ขั้นตอนถัดไป

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