Profil yükleme için bir çalışan ayarlama

ProfilingManager, izleri cihazda yerel olarak kaydeder. Bu dosyaları yerel hata ayıklama için ADB'yi kullanarak alabilirsiniz ancak alan verilerini toplamak için dosyaların bir sunucuya yüklenmesi gerekir.

İzleme dosyaları büyük olabilir (genellikle birkaç MB). Kullanıcı deneyimini olumsuz etkilememek veya mobil veri tüketmemek için yüklemeleri arka planda gerçekleşecek şekilde planlamanız gerekir. Tercihen cihaz sınırsız bir ağa (kablosuz) bağlıyken, şarj olurken ve boşta kaldığında yükleme yapın.

WorkManager yükleme işi ayarlama

ProfilingManager, bulut platformundan bağımsızdır. İzleri istediğiniz altyapıya yükleyebilirsiniz. Aşağıdaki örnekte, kullanıcıların işlerini aksatmayacak bir yükleme işi planlamak için WorkManager nasıl kullanılacağı gösterilmektedir.

Yükleme işi oluşturma kodu örneği

Aşağıda, kullanıcının işini aksatmayacak şekilde sunucunuza iz yükleme işi ayarlama ile ilgili bir örnek verilmiştir.

WorkManager bağımlılıklarını ekleme

Mevcut ProfilingManager bağımlılıklarınıza ek olarak bu Jetpack kitaplıklarını build.gradle.kts dosyanıza ekleyin. WorkManager bunları gerektirir.

Kotlin

   dependencies {
       implementation("androidx.work:work-runtime:2.11.0")
   }
   

Groovy

   dependencies {
       implementation 'androidx.work:work-runtime:2.11.0'
   }
   

Kod snippet'i

Bu kodda, iz yükleme işinin nasıl ayarlanacağı gösterilmektedir. İş, uygulamanız tarafından ProfilingResult alındığında ayarlanmalıdır. Bu bölümde profil oluşturma bölümü atlanmıştır ancak Sistem izi kaydetme bölümünde bir örnek bulabilirsiniz.

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

Kod incelemesi

Kod şu işlemleri yapar:

  • Çalışanı tanımlayın: TraceUploadWorker sınıfını genişleten bir Worker sınıfı oluşturun. Tercih ettiğiniz arka uç SDK'sını veya HTTP istemcisini kullanarak gerçek dosya yükleme mantığını işlemek için doWork() yöntemini uygulayın.

  • İstek profil oluşturma: İzlemeyi (süre, arabellek politikası) yapılandırmak için SystemTraceRequestBuilder, izlemeyi başlatmak için Profiling.requestProfiling kullanın.

  • Çalışmayı planlama:

    • Çalışanınız için bir OneTimeWorkRequest oluşturun.

    • Kısıtlamalar ayarlayın: Yüklemenin yalnızca kullanıcı kablosuz ağa bağlıyken, cihazı şarj ederken ve aktif olarak kullanmadığı zamanlarda gerçekleşmesini sağlamak için setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) ve setRequiresCharging(true) simgelerini kullanın. Bu, yükleme işiyle ilgili olarak kullanıcının kesintiye uğramasını önlemek için önemlidir.

    • Veri iletme: İzleme yolunu çalışana iletmek için setInputData öğesini kullanın.

    • Sıraya alma: WorkManager#enqueue işlevini çağırarak isteği WorkManager'a gönderin.

Sonraki Adımlar

İzleri yükledikten sonra tek tek analiz edebilir veya toplu iz analizi yapabilirsiniz. Ölçeklenebilir bir analiz ardışık düzeni oluşturma konusunda yardım almak için Bigtrace'i Kubernetes'e dağıtma başlıklı makaleyi inceleyin.