プロファイルのアップロード用のワーカーを設定する

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 を拡張する TraceUploadWorker クラスを作成します。doWork() メソッドを実装して、任意のバックエンド SDK または HTTP クライアントを使用して実際のファイル アップロード ロジックを処理します。

  • リクエストのプロファイリング: SystemTraceRequestBuilder を使用してトレース(期間、バッファ ポリシー)を構成し、Profiling.requestProfiling を使用してトレースを開始します。

  • 作業のスケジュールを設定する:

    • ワーカーの OneTimeWorkRequest を作成します。

    • 制約を設定する: setRequiredNetworkType(NetworkType.UNMETERED)setRequiresDeviceIdle(true)setRequiresCharging(true) を使用して、ユーザーが Wi-Fi に接続し、充電中で、デバイスをアクティブに使用していない場合にのみアップロードが行われるようにします。これは、アップロード ジョブでユーザーが中断されないようにするために重要です。

    • データを渡す: setInputData を使用して、トレースパスをワーカーに渡します。

    • キューに追加: WorkManager#enqueue を呼び出して、WorkManager にリクエストを送信します。

次の手順

トレースをアップロードした後、個別に分析するか、トレースの一括分析を実行できます。スケーラブルな分析パイプラインの設定については、Kubernetes への Bigtrace のデプロイをご覧ください。