ProfilingManager 會將追蹤記錄儲存在裝置本機。雖然您可以使用 ADB 擷取這些檔案進行本機偵錯,但收集現場資料需要將檔案上傳至伺服器。
追蹤記錄檔可能很大 (通常有幾 MB)。為避免對使用者體驗造成負面影響或耗用行動數據,您應排定上傳作業在背景執行,最好是在裝置連上非計量付費網路 (Wi-Fi)、充電且閒置時進行。
設定 WorkManager 上傳工作
ProfilingManager 與雲端無關,您可以將追蹤記錄上傳至所選的任何基礎架構。以下範例說明如何使用 WorkManager 排定上傳工作,避免干擾使用者。
設定上傳工作的程式碼範例
以下範例說明如何設定工作,將追蹤記錄上傳至伺服器,且不會干擾使用者。
新增 WorkManager 依附元件
除了現有的 ProfilingManager 依附元件,請在 build.gradle.kts 檔案中加入這些 Jetpack 程式庫。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的TraceUploadWorker類別。使用偏好的後端 SDK 或 HTTP 用戶端,實作doWork()方法來處理實際的檔案上傳邏輯。要求剖析:使用
SystemTraceRequestBuilder設定追蹤記錄 (時間長度、緩衝區政策),並使用Profiling.requestProfiling啟動追蹤記錄。安排工作時間:
為工作人員建立
OneTimeWorkRequest。設定限制:使用
setRequiredNetworkType(NetworkType.UNMETERED)、setRequiresDeviceIdle(true)和setRequiresCharging(true),確保只有在使用者連上 Wi-Fi、正在充電且未使用裝置時,才會上傳檔案。這項措施可避免上傳作業中斷,影響使用者體驗。傳遞資料:使用
setInputData將追蹤路徑傳遞至 worker。加入佇列:呼叫
WorkManager#enqueue,將要求提交至 WorkManager。
後續步驟
上傳追蹤記錄後,您可以個別分析,也可以大量分析追蹤記錄。如要瞭解如何設定可擴充的分析管道,請參閱「在 Kubernetes 上部署 Bigtrace」。