ProfilingManager 会将跟踪记录保存在设备本地。虽然您可以使用 ADB 检索这些文件以进行本地调试,但收集现场数据需要将这些文件上传到服务器。
跟踪文件可能很大(通常为几 MB)。为避免对用户体验产生负面影响或消耗移动流量,您应安排在后台进行上传,最好是在设备连接到不按流量计费的网络 (Wi-Fi)、正在充电且处于空闲状态时进行。
设置 WorkManager 上传作业
ProfilingManager 与云无关;您可以将跟踪记录上传到您选择的任何基础架构。以下示例演示了如何使用 WorkManager 安排上传作业,以避免干扰用户。
用于设置上传作业的代码示例
以下示例展示了如何设置不会干扰用户将跟踪记录上传到服务器的作业。
添加 WorkManager 依赖项
除了现有的 ProfilingManager 依赖项之外,请将以下 Jetpack 库添加到 build.gradle.kts 文件中。WorkManager 需要这些权限。
Kotlin
dependencies { implementation("androidx.work:work-runtime:2.12.0") }
Groovy
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类。实现doWork()方法,以使用您首选的后端 SDK 或 HTTP 客户端处理实际的文件上传逻辑。请求性能分析:使用
SystemTraceRequestBuilder配置跟踪记录(时长、缓冲区政策),并使用Profiling.requestProfiling启动跟踪记录。安排工作:
为您的 worker 创建
OneTimeWorkRequest。设置限制:使用
setRequiredNetworkType(NetworkType.UNMETERED)、setRequiresDeviceIdle(true)和setRequiresCharging(true),确保仅在用户使用 Wi-Fi、正在充电且未主动使用设备时才进行上传。这对于避免上传作业中断用户体验非常重要。传递数据:使用
setInputData将跟踪路径传递给工作器。加入队列:通过调用
WorkManager#enqueue将请求提交到 WorkManager。
后续步骤
上传跟踪记录后,您可以单独分析它们,也可以执行批量跟踪记录分析。如需了解如何设置可扩缩的分析流水线,请参阅在 Kubernetes 上部署 Bigtrace。