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:建立擴充
Worker的TraceUploadWorker類別。使用偏好的後端 SDK 或 HTTP 用戶端,實作doWork()方法來處理實際的檔案上傳邏輯。要求剖析:使用
SystemTraceRequestBuilder設定追蹤記錄 (持續時間、緩衝區政策),並使用Profiling.requestProfiling啟動追蹤記錄。排定工作:
為 worker 建立
OneTimeWorkRequest。設定限制:使用
setRequiredNetworkType(NetworkType.UNMETERED)、setRequiresDeviceIdle(true)和setRequiresCharging(true),確保只有在使用者連上 Wi-Fi、充電中且未主動使用裝置時,才會上傳資料。這點很重要,可避免上傳工作干擾使用者。傳遞資料:使用
setInputData將追蹤路徑傳遞給 worker。Enqueue:呼叫
WorkManager#enqueue,將要求提交至 WorkManager。
後續步驟
上傳追蹤記錄後,您可以個別分析,也可以執行大量追蹤記錄分析。如需設定可擴充分析管道的指南,請參閱「在 Kubernetes 上部署 Bigtrace」。