ViewCapture, bağlı olduğu pencerelere eklenen görünümlerin özelliklerini (ör. konum, boyut, ölçek ve görünürlük) yakalayan bir yazılım aracıdır. ViewCapture, bir penceredeki çeşitli görünümler ve bunların özellikleri hakkında bilgi yakalayarak belirli anlardaki kullanıcı deneyiminin durumu hakkında bilgi edinmenizi ve zaman içindeki değişiklikleri izlemenizi sağlar.
Ekran kayıtları, belirli bir zamanda görünümün durumunu görselleştirebilir ve nasıl değiştiğini gösterebilir. Ancak önemli CPU kaynakları gerektirir ve performansı etkileyebilir. ViewCapture aracı daha az kaynak etkisi yaratır ve daha sık etkinleştirilebilir. Ayrıca ViewCapture, görselleştirmeleri görünüm düzeyinde kare kare gösterir. Bu sayede, görünüm durumunu belirli anlarda incelemek ekran kayıtlarına kıyasla daha kolaydır.
Bu sayfada, ViewCapture'ın sistem uygulamalarına nasıl dahil edileceği açıklanmaktadır.
Kullan
ViewCapture.java, onDrawListener örneğini uygular ve çizim işlemi sırasında ViewCapture izi toplar. Her yeniden çizilen kare, pencerenin kök görünümünden başlayarak görünüm ağacı hiyerarşisinin geçişini tetikler.
ViewCapture, performansı artırmak için değerleri getirip arka plan iş parçacığına kopyalamak üzere herkese açık View.java getter yöntemlerini kullanır. ViewCapture uygulaması, captureViewTree kullanarak bir görünümün kirli veya geçersiz kılınmış olup olmadığını kontrol ederek bu süreci optimize eder. Bu sayede, görünüm hiyerarşisinin tamamının geçilmesi önlenir. captureViewTree yalnızca sistem uygulamalarında kullanılabilir ve UnsupportedAppUsage API'nin bir parçasıdır.
Bu API'nin kullanımı, hedef SDK sürümüne göre uygulamalarla sınırlıdır.
Sınırlamalar
Bu bölümde ViewCapture'un performans ve bellek sınırlamaları açıklanmaktadır.
Performans
ViewCapture performansının ortalama ana ileti dizisi ek yükü 195 μsn'dir. Ancak en kötü senaryolarda bu süre yaklaşık 5 ms olabilir. Perfetto izindeki vc#onDraw dilimine bakın.
Genel giderler temel olarak aşağıdaki işlemlerden kaynaklanır:
- Budanmış olsa bile hiyerarşide gezinmek 50 μsn sürer.
- Görünüm özelliklerinin kopyalarını depolamak için ücretsiz liste ayırıcısından nesne çekmek 20 μsn sürer.
- Her özellik değerini bir alıcı işlev aracılığıyla getirmek, görünüm başına birçok ek işlev çağrısına neden olur ve 110 μsn sürer.
Bu nedenle, ViewCapture'ı her zaman izleme (AOT) modunda etkinleştirmek sistem performansını olumsuz etkiler ve duraklamaya neden olur. Bu performans ve bellek sınırlamaları nedeniyle bu yaklaşım, AOT için hazır değildir. ViewCapture'ı yalnızca laboratuvar ve yerel hata ayıklama için öneririz.
Bellek
Perfetto'nun ViewCapture izleri için kullandığı yöntem, aşırı bellek kullanımını önlemek amacıyla önceden tanımlanmış bir bellekte kaplanan yer ile tek bir halka arabellek kullanır. Bu yaklaşım, her pencere için ayrı ayrı halka arabellekleri oluşturulmasını önleyerek aşırı bellek tüketimini engeller. Ancak bu, her kare için Perfetto'da tüm görünüm hiyerarşisinin her durum için depolanması sorununu çözmez. NexusLauncher gibi tek bir pencerenin kaydedilmesi, 10 MB'lık bir arabellekte 30 saniyeden uzun ViewCapture verileri oluşturabilir. Sistem Arayüzünden 30'dan fazla pencere yakalamak için daha büyük bir arabellek veya önemli ölçüde daha kısa bir kayıt süresi gerekir.
Talimatlar
ViewCapture'ı sistem uygulamalarına dahil etmek için aşağıdaki talimatları uygulayın:
Bağımlılığı Başlatıcı kodunda gösterildiği gibi
Android.bpdosyanıza ekleyin.android_library { name: "YourLib", static_libs: [ ... "//frameworks/libs/systemui:view_capture", ... ], platform_apis: true, privileged: true, }Pencerenizi oluştururken ViewCapture örneği oluşturun. Örneğin:
-
private SafeCloseable mViewCapture; @Override protected void onCreate(Bundle savedInstanceState) { ... mViewCapture = ViewCaptureFactory.getInstance(this).startCapture(getWindow()); } -
private SafeCloseable mViewCapture; @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (enableViewCaptureTracing()) { mViewCaptureCloseable = ViewCaptureFactory.getInstance(getContext()) .startCapture(getRootView(), ".NotificationShadeWindowView"); } ... }
-
Pencerenizi yok ederken ViewCapture örneğini kapatın. Aşağıdaki örneklerde bu durum gösterilmektedir: