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()) }
자바
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클래스를 만듭니다. 선호하는 백엔드 SDK 또는 HTTP 클라이언트를 사용하여 실제 파일 업로드 로직을 처리하는doWork()메서드를 구현합니다.프로파일링 요청:
SystemTraceRequestBuilder를 사용하여 트레이스 (기간, 버퍼 정책)를 구성하고Profiling.requestProfiling를 사용하여 시작합니다.작업 예약:
작업자의
OneTimeWorkRequest를 만듭니다.제약 조건 설정:
setRequiredNetworkType(NetworkType.UNMETERED),setRequiresDeviceIdle(true),setRequiresCharging(true)를 사용하여 사용자가 Wi-Fi에 연결되어 있고, 기기를 충전 중이며, 기기를 적극적으로 사용하지 않을 때만 업로드가 이루어지도록 합니다. 이는 업로드 작업으로 인해 사용자에게 방해가 되지 않도록 하는 데 중요합니다.데이터 전달:
setInputData를 사용하여 추적 경로를 작업자에게 전달합니다.Enqueue:
WorkManager#enqueue를 호출하여 WorkManager에 요청을 제출합니다.
다음 단계
트레이스를 업로드한 후 개별적으로 분석하거나 트레이스 일괄 분석을 실행할 수 있습니다. 확장 가능한 분석 파이프라인 설정에 관한 안내는 Kubernetes에 Bigtrace 배포를 참고하세요.