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

ProfilingManager, izleri cihazda yerel olarak kaydeder. Yerel hata ayıklama için ADB'yi kullanarak bu dosyaları alabilirsiniz ancak alan verilerini toplamak için dosyaları bir sunucuya yüklemeniz 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, tercihen cihazın kullanımda olmadığı, şarj edildiği ve tarifesiz bir ağa (kablosuz) bağlı olduğu zamanlarda gerçekleşecek şekilde planlamanız gerekir.

WorkManager yükleme işi oluşturma

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'ın nasıl kullanılacağı gösterilmektedir.

Yükleme işi oluşturmak için kod örneği

İzleri sunucunuza yüklemek için kullanıcıyı rahatsız etmeyecek bir işi nasıl ayarlayabileceğinize dair bir örneği aşağıda bulabilirsiniz.

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

Mevcut ProfilingManager bağımlılıklarınızın yanı sıra bu Jetpack kitaplıklarını build.gradle.kts dosyanıza ekleyin. WorkManager bu bilgilere ihtiyaç duyuyor.

Kotlin

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

Modern

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

Kod snippet'i

Bu kodda, izleri yüklemek için bir işin nasıl ayarlanacağı gösterilmektedir. İş, uygulamanız ProfilingResult değerini aldığında ayarlanmalıdır. Profil oluşturma bölümü bu bölümde 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ımlama: Worker sınıfını genişleten bir TraceUploadWorker 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.

  • Profil oluşturma isteği: İzlemeyi yapılandırmak için SystemTraceRequestBuilder, başlatmak için Profiling.requestProfiling komutunu 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) öğelerini kullanın. Bu, yükleme işiyle ilgili olarak kullanıcının kesintiye uğramasını önlemek için önemlidir.

    • Verileri iletme: İzleme yolunu çalışana iletmek için setInputData kullanın.

    • Sıraya ekleme: WorkManager#enqueue yöntemini çağırarak isteği WorkManager'a gönderin.

Sonraki adımlar

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