Sistem uygulamalarında Görüntü yakalama

ViewCapture, bağlandığı pencerelere bağlı görünümlerin özelliklerini (konum, boyut, ölçek ve görünürlük gibi) yakalayan bir yazılım aracıdır. ViewCapture, bir penceredeki çeşitli görünümler ve bunların özellikleri hakkında bilgi toplayarak belirli anlardaki kullanıcı deneyiminin durumunu öğrenmenize ve zaman içindeki değişiklikleri izlemenize olanak tanır.

Ekran kayıtları, belirli bir zamandaki bir görünümün durumunu görselleştirebilir ve bu durumun nasıl değiştiğini gösterebilir ancak önemli miktarda CPU kaynağı gerektirir ve performansı etkileyebilir. Görüntü yakalama aracı, kaynakları daha az etkiler ve daha sık etkinleştirilebilir. Ayrıca ViewCapture, görselleştirmeleri görünüm düzeyinde kare kare gösterir. Bu sayede, ekran kayıtlarına kıyasla belirli anlardaki görünüm durumunu daha kolay inceleyebilirsiniz.

Bu sayfada, ViewCapture'ın sistem uygulamalarında nasıl kullanılacağı açıklanmaktadır.

Kullan

ViewCapture.java, onDrawListener örneğini uygular ve çizim işlemi sırasında bir ViewCapture izlemesi toplar. Her karenin yeniden çizilmesi, pencerenin kök görünümünden başlayarak görünüm ağacı hiyerarşisinin taranmasını tetikler. ViewCapture, performansı artırmak için değerleri alıp arka plan iş parçacığına kopyalamak üzere herkese açık View.java alıcı yöntemleri kullanır. ViewCapture uygulaması, captureViewTree kullanarak bir görünümün kirli olup olmadığını veya geçersiz kılınıp kılınmadığını kontrol ederek bu süreci optimize eder. Böylece görünüm hiyerarşisinin tamamının taranması önlenir. captureViewTree yalnızca sistem uygulamaları için kullanılabilir ve UnsupportedAppUsage API'nin bir parçasıdır. Bu API'nin kullanımı, hedef SDK sürümlerine göre uygulamalarla sınırlıdır.

Sınırlamalar

Aşağıdaki bölümlerde, ViewCapture'ı çalıştırırken karşılaşılan performans ve bellek sınırlamaları açıklanmaktadır.

Performans

ViewCapture performansı için ortalama ana ileti dizisi yükü 195 μs.'dir. Ancak en kötü senaryoda bu işlem yaklaşık 5 ms sürebilir. Perfetto izlemesindeki vc#onDraw dilimlerine bakın.

Genel giderler temel olarak aşağıdaki işlemlerden kaynaklanır:

  1. Düzenleme yapılsa bile hiyerarşiyi taramak 50 μs sürer.
  2. Görüntüleme mülklerinin kopyalarını depolamak için bir serbest liste ayırıcıdan nesne çekmek 20 μs sürer.
  3. Her mülk değerini bir alıcı işlevi aracılığıyla almak, görünüm başına birçok ek işlev çağrısına neden olur ve 110 μs sürer.

Bu nedenle, ViewCapture'ın her zaman açık izlemede (AOT) etkinleştirilmesi sistem performansını olumsuz etkiler ve takılmalara 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 izlemeleri için kullandığı yöntem, aşırı bellek kullanımını önlemek amacıyla önceden tanımlanmış bir bellek ayak izine sahip tek bir halka arabelleği kullanır. Bu yaklaşım, her pencere için ayrı halka arabellekleri kullanmaktan kaçınarak aşırı bellek tüketimini önler ancak her çerçeve için her durumun görüntü hiyerarşisinin tamamını Perfetto'da depolama sorununu çözmez. NexusLauncher gibi tek bir pencerenin kaydedilmesi, 10 MB'lık bir arabellekte 30 saniyeden uzun bir ViewCapture verisi oluşturabilir. Ancak sistem kullanıcı 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 aralığı gerekir.

Talimatlar

ViewCapture'ı sistem uygulamalarında kullanmak için aşağıdaki talimatları uygulayın:

  1. Bağımlılığı, Başlatıcı kodunda gösterildiği gibi Android.bp dosyanıza ekleyin.

    android_library {
        name: "YourLib",
        static_libs: [
              ...
            "//frameworks/libs/systemui:view_capture",
              ...
        ],
        platform_apis: true,
        privileged: true,
    }
    
  2. Pencerenizi oluştururken bir ViewCapture örneği oluşturun. Örneğin:

    • 1. örnek:

      private SafeCloseable mViewCapture;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        ...
        mViewCapture = ViewCaptureFactory.getInstance(this).startCapture(getWindow());
      }
      
    • 2. örnek:

      private SafeCloseable mViewCapture;
      
      @Override
      protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (enableViewCaptureTracing()) {
            mViewCaptureCloseable = ViewCaptureFactory.getInstance(getContext())
              .startCapture(getRootView(), ".NotificationShadeWindowView");
        }
        ...
      }
      
  3. Pencerenizi yok ederken ViewCapture örneğini kapatın. Aşağıdaki örneklerde gösterildiği gibi:

    • 1. örnek:

      @Override
      public void onDestroy() {
        ...
        if (mViewCapture != null) mViewCapture.close();
      }
      
    • 2. örnek:

      @Override
      protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mViewCaptureCloseable != null) {
            mViewCaptureCloseable.close();
       }
        ...
      }