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:创建一个扩展
Worker的TraceUploadWorker类。使用您偏好的后端 SDK 或 HTTP 客户端实现doWork()方法,以处理实际的文件上传逻辑。请求分析:使用
SystemTraceRequestBuilder配置轨迹(时长、缓冲区政策),并使用Profiling.requestProfiling启动轨迹。安排工作:
为工作器创建
OneTimeWorkRequest。设置限制:使用
setRequiredNetworkType(NetworkType.UNMETERED)、setRequiresDeviceIdle(true)和setRequiresCharging(true)确保仅在用户连接到 Wi-Fi、正在充电且未主动使用设备时才进行上传。这一点非常重要,可避免上传作业中断用户操作。传递数据:使用
setInputData将轨迹路径传递给工作器。加入队列:通过调用
WorkManager#enqueue将请求提交给 WorkManager。
后续步骤
上传轨迹后,您可以单独分析轨迹,也可以执行批量轨迹分析。如需有关设置可扩缩分析流水线的指南,请参阅在 Kubernetes 上部署 Bigtrace。