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 のデプロイをご覧ください。