設定用於上傳設定檔的工作人員

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());
}

程式碼逐步操作說明

程式碼會執行下列作業:

  • 定義工作者:建立擴充 WorkerTraceUploadWorker 類別。使用偏好的後端 SDK 或 HTTP 用戶端,實作 doWork() 方法來處理實際的檔案上傳邏輯。

  • 要求剖析:使用 SystemTraceRequestBuilder 設定追蹤記錄 (時間長度、緩衝區政策),並使用 Profiling.requestProfiling 啟動追蹤記錄。

  • 安排工作時間

    • 為工作人員建立 OneTimeWorkRequest

    • 設定限制:使用 setRequiredNetworkType(NetworkType.UNMETERED)setRequiresDeviceIdle(true)setRequiresCharging(true),確保只有在使用者連上 Wi-Fi、正在充電且未使用裝置時,才會上傳檔案。這項措施可避免上傳作業中斷,影響使用者體驗。

    • 傳遞資料:使用 setInputData 將追蹤路徑傳遞至 worker。

    • 加入佇列:呼叫 WorkManager#enqueue,將要求提交至 WorkManager。

後續步驟

上傳追蹤記錄後,您可以個別分析,也可以大量分析追蹤記錄。如要瞭解如何設定可擴充的分析管道,請參閱「在 Kubernetes 上部署 Bigtrace」。