设置用于上传个人资料的工作器

ProfilingManager 会将轨迹记录保存在设备本地。虽然您可以使用 ADB 检索这些文件以进行本地调试,但收集现场数据需要将这些文件上传到服务器。

轨迹文件可能很大(通常为数 MB)。为避免对用户体验造成负面影响或消耗移动数据流量,您应安排在后台进行上传,最好是在设备连接到不按流量计费的网络 (Wi-Fi)、正在充电且处于空闲状态时进行。

设置 WorkManager 上传作业

ProfilingManager 与云无关;您可以将轨迹上传到您选择的任何基础架构。以下示例演示了如何使用 WorkManager 安排上传作业,以避免中断用户操作。

用于设置上传作业的代码示例

以下示例展示了如何设置不会对用户造成干扰的作业,以将轨迹上传到您的服务器。

添加 WorkManager 依赖项

除了现有的 ProfilingManager 依赖项之外,还将以下 Jetpack 库添加到 build.gradle.kts 文件中。WorkManager 需要这些信息。

Kotlin

   dependencies {
       implementation("androidx.work:work-runtime:2.11.0")
   }
   

Groovy

   dependencies {
       implementation 'androidx.work:work-runtime:2.11.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:创建一个扩展 WorkerTraceUploadWorker 类。使用您偏好的后端 SDK 或 HTTP 客户端实现 doWork() 方法,以处理实际的文件上传逻辑。

  • 请求分析:使用 SystemTraceRequestBuilder 配置轨迹(时长、缓冲区政策),并使用 Profiling.requestProfiling 启动轨迹。

  • 安排工作

    • 为工作器创建 OneTimeWorkRequest

    • 设置限制:使用 setRequiredNetworkType(NetworkType.UNMETERED)setRequiresDeviceIdle(true)setRequiresCharging(true) 确保仅在用户连接到 Wi-Fi、正在充电且未主动使用设备时才进行上传。这一点非常重要,可避免上传作业中断用户操作。

    • 传递数据:使用 setInputData 将轨迹路径传递给工作器。

    • 加入队列:通过调用 WorkManager#enqueue 将请求提交给 WorkManager。

后续步骤

上传轨迹后,您可以单独分析轨迹,也可以执行批量轨迹分析。如需有关设置可扩缩分析流水线的指南,请参阅在 Kubernetes 上部署 Bigtrace