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:
Workersınıfını genişleten birTraceUploadWorkersı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çindoWork()yöntemini uygulayın.Profil oluşturma isteği: İzlemeyi yapılandırmak için
SystemTraceRequestBuilder, başlatmak içinProfiling.requestProfilingkomutunu kullanın.Çalışmayı planlama:
Çalışanınız için bir
OneTimeWorkRequestoluş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)vesetRequiresCharging(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
setInputDatakullanın.Sıraya ekleme:
WorkManager#enqueueyö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.