Sistem uygulamalarında Görüntü yakalama

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 arka plan iş parçacığına getirmek ve 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 ve böylece tüm görünüm hiyerarşisinin geçişini önler. 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'ın 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 gider maliyetleri temel olarak aşağıdaki işlemlerden kaynaklanır:

  1. Budanmış olsa bile hiyerarşide gezinmek 50 μsn sürer.
  2. Görünüm özelliklerinin kopyalarını depolamak için ücretsiz liste ayırıcısından nesne çekmek 20 μsn sürer.
  3. 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 takılmaya 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öntemde, aşırı bellek kullanımını önlemek amacıyla önceden tanımlanmış bir bellek alanı olan tek bir halka arabellek kullanılır. Bu yaklaşım, her pencere için ayrı halka arabellekleri oluşturmayı önleyerek aşırı bellek tüketimini engeller. Ancak bu, her bir kare için Perfetto'da her durumun tüm görünüm hiyerarşisini depolama sorununu çözmez. NexusLauncher gibi tek bir pencerenin kaydedilmesi, 10 MB'lık bir arabellekte 30 saniyeden uzun ViewCapture verileri oluşturabilir. 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 gerekir.

Talimatlar

ViewCapture'ı sistem uygulamalarına dahil etmek için aşağıdaki talimatları uygulayın:

  1. Bağımlılığı Android.bp dosyanıza ekleyin. Bu işlem, Başlatıcı kodunda gösterildiği şekilde yapılır.

    android_library {
        name: "YourLib",
        static_libs: [
              ...
            "//frameworks/libs/systemui:view_capture",
              ...
        ],
        platform_apis: true,
        privileged: true,
    }
    
  2. Pencerenizi oluştururken 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 bu durum gösterilmektedir:

    • 1. örnek:

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

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