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を拡張するTraceUploadWorkerクラスを作成します。doWork()メソッドを実装して、任意のバックエンド SDK または HTTP クライアントを使用して実際のファイル アップロード ロジックを処理します。プロファイリングをリクエストする:
SystemTraceRequestBuilderを使用してトレース(期間、バッファ ポリシー)を構成し、Profiling.requestProfilingを使用してトレースを開始します。作業のスケジュールを設定する:
ワーカーの
OneTimeWorkRequestを作成します。制約を設定する:
setRequiredNetworkType(NetworkType.UNMETERED)、setRequiresDeviceIdle(true)、setRequiresCharging(true)を使用して、ユーザーが Wi-Fi に接続しており、充電中で、デバイスをアクティブに使用していない場合にのみアップロードが行われるようにします。これは、アップロード ジョブでユーザーの操作を中断しないようにするために重要です。データを渡す:
setInputDataを使用して、トレースパスをワーカーに渡します。キューに追加:
WorkManager#enqueueを呼び出して、WorkManager にリクエストを送信します。
次のステップ
トレースをアップロードしたら、個別に分析することも、一括トレース分析を実行することもできます。スケーラブルな分析パイプラインの設定方法については、Kubernetes への Bigtrace のデプロイをご覧ください。