ViewCapture در برنامه های سیستمی، ViewCapture در برنامه های سیستمی

ViewCapture یک ابزار نرم‌افزاری است که ویژگی‌های نماها (مانند مکان، اندازه، مقیاس و دید) متصل به پنجره‌هایی را که به آن متصل شده است، ثبت می‌کند. ViewCapture اطلاعاتی در مورد نماهای مختلف در یک پنجره و ویژگی های آنها می گیرد و به شما امکان می دهد از وضعیت تجربه کاربر در لحظات خاص در زمان مطلع شوید و تغییرات را در طول زمان پیگیری کنید.

ضبط‌های صفحه می‌توانند وضعیت یک نما را در یک زمان خاص تجسم کنند و نحوه تغییر آن را نشان دهند، اما آنها به منابع CPU قابل توجهی نیاز دارند و می‌توانند بر عملکرد تأثیر بگذارند. ابزار ViewCapture تاثیر کمتری بر منابع دارد و می‌توان آن را بیشتر فعال کرد. علاوه بر این، ViewCapture تجسم‌ها را فریم به فریم در سطح دید نمایش می‌دهد، که بررسی وضعیت دید در لحظات خاص را در مقایسه با ضبط‌های صفحه ساده‌تر می‌کند.

این صفحه نحوه نصب ViewCapture در برنامه های سیستم را شرح می دهد.

استفاده کنید

ViewCapture.java یک نمونه از onDrawListener را پیاده‌سازی می‌کند و یک ردیابی ViewCapture را در طول فرآیند ترسیم جمع‌آوری می‌کند. ترسیم مجدد هر فریم یک پیمایش از سلسله مراتب درخت view را آغاز می کند که از نمای ریشه پنجره شروع می شود. ViewCapture از روش های دریافت کننده View.java عمومی برای واکشی و کپی کردن مقادیر در یک رشته پس زمینه برای بهبود عملکرد استفاده می کند. پیاده‌سازی ViewCapture این فرآیند را با بررسی کثیف یا نامعتبر بودن یک نما با استفاده از captureViewTree بهینه می‌کند، بنابراین از پیمایش کل سلسله‌مراتب view جلوگیری می‌کند. captureViewTree فقط برای برنامه های سیستم در دسترس است و بخشی از UnsupportedAppUsage API است. استفاده از این API محدود به برنامه‌هایی است که بر اساس نسخه SDK هدف آنها هستند.

محدودیت ها

بخش‌های زیر محدودیت‌های عملکرد و حافظه در اجرای ViewCapture را توضیح می‌دهند.

عملکرد

میانگین سربار نخ اصلی برای عملکرد ViewCapture 195 میکرو ثانیه است. با این حال، در بدترین حالت ممکن است حدود 5 میلی ثانیه طول بکشد. به برش vc#onDraw در ردیابی Perfetto مراجعه کنید.

هزینه های سربار در درجه اول ناشی از اقدامات زیر است:

  1. پیمایش سلسله مراتب 50 میکرو ثانیه هزینه دارد، حتی زمانی که هرس شود.
  2. کشیدن اشیا از یک تخصیص دهنده لیست آزاد برای ذخیره کپی از ویژگی های view 20 میکرو ثانیه هزینه دارد.
  3. واکشی هر مقدار ویژگی از طریق تابع دریافت کننده منجر به فراخوانی تابع اضافی در هر نمایش می شود که هزینه آن 110 میکرو ثانیه است.

از این رو، فعال کردن ViewCapture در همیشه در ردیابی (AOT) بر عملکرد سیستم تأثیر منفی می‌گذارد و منجر به jank می‌شود. با توجه به این محدودیت های عملکرد و حافظه، این رویکرد برای AOT آماده نیست. ما ViewCapture را فقط برای اشکال زدایی آزمایشگاهی و محلی توصیه می کنیم.

حافظه

روش Perfetto برای ردیابی ViewCapture از یک بافر حلقه تکی استفاده می کند که دارای ردپای حافظه از پیش تعریف شده برای جلوگیری از استفاده بیش از حد از حافظه است. این رویکرد با اجتناب از استفاده از بافرهای حلقه جداگانه برای هر پنجره، از مصرف بیش از حد حافظه جلوگیری می کند، اما مشکل ذخیره کل سلسله مراتب نمای برای هر حالت در Perfetto برای هر فریم را حل نمی کند. ضبط یک پنجره واحد، مانند NexusLauncher، می تواند بیش از 30 ثانیه داده ViewCapture را در یک بافر 10 مگابایتی تولید کند. با این حال، گرفتن بیش از 30 پنجره از رابط کاربری سیستم نیاز به یک بافر بزرگتر یا یک پنجره زمان ضبط بسیار کوتاهتر دارد.

دستورالعمل ها

برای نصب ViewCapture در برنامه های سیستم، این دستورالعمل ها را دنبال کنید:

  1. همانطور که در کد راه‌انداز نشان داده شده است، وابستگی را به فایل Android.bp خود اضافه کنید.

    android_library {
        name: "YourLib",
        static_libs: [
              ...
            "//frameworks/libs/systemui:view_capture",
              ...
        ],
        platform_apis: true,
        privileged: true,
    }
    
  2. هنگام ایجاد پنجره خود یک نمونه ViewCapture ایجاد کنید، به عنوان مثال:

    • مثال 1 :

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

      private SafeCloseable mViewCapture;
      
      @Override
      protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (enableViewCaptureTracing()) {
            mViewCaptureCloseable = ViewCaptureFactory.getInstance(getContext())
              .startCapture(getRootView(), ".NotificationShadeWindowView");
        }
        ...
      }
      
  3. همانطور که در مثال های زیر نشان داده شده است، هنگام از بین بردن پنجره، نمونه ViewCapture را ببندید:

    • مثال 1 :

      @Override
      public void onDestroy() {
        ...
        if (mViewCapture != null) mViewCapture.close();
      }
      
    • مثال 2 :

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

ViewCapture یک ابزار نرم‌افزاری است که ویژگی‌های نماها (مانند مکان، اندازه، مقیاس و دید) متصل به پنجره‌هایی را که به آن متصل شده است، ثبت می‌کند. ViewCapture اطلاعاتی در مورد نماهای مختلف در یک پنجره و ویژگی های آنها می گیرد و به شما امکان می دهد از وضعیت تجربه کاربر در لحظات خاص در زمان مطلع شوید و تغییرات را در طول زمان پیگیری کنید.

ضبط‌های صفحه می‌توانند وضعیت یک نما را در یک زمان خاص تجسم کنند و نحوه تغییر آن را نشان دهند، اما آنها به منابع CPU قابل توجهی نیاز دارند و می‌توانند بر عملکرد تأثیر بگذارند. ابزار ViewCapture تاثیر کمتری بر منابع دارد و می‌توان آن را بیشتر فعال کرد. علاوه بر این، ViewCapture تجسم‌ها را فریم به فریم در سطح دید نمایش می‌دهد، که بررسی وضعیت دید در لحظات خاص را در مقایسه با ضبط‌های صفحه ساده‌تر می‌کند.

این صفحه نحوه نصب ViewCapture در برنامه های سیستم را شرح می دهد.

استفاده کنید

ViewCapture.java یک نمونه از onDrawListener را پیاده‌سازی می‌کند و یک ردیابی ViewCapture را در طول فرآیند ترسیم جمع‌آوری می‌کند. ترسیم مجدد هر فریم یک پیمایش از سلسله مراتب درخت view را آغاز می کند که از نمای ریشه پنجره شروع می شود. ViewCapture از روش های دریافت کننده View.java عمومی برای واکشی و کپی کردن مقادیر در یک رشته پس زمینه برای بهبود عملکرد استفاده می کند. پیاده‌سازی ViewCapture این فرآیند را با بررسی کثیف یا نامعتبر بودن یک نما با استفاده از captureViewTree بهینه می‌کند، بنابراین از پیمایش کل سلسله‌مراتب view جلوگیری می‌کند. captureViewTree فقط برای برنامه های سیستم در دسترس است و بخشی از UnsupportedAppUsage API است. استفاده از این API محدود به برنامه‌هایی است که بر اساس نسخه SDK هدف آنها هستند.

محدودیت ها

بخش‌های زیر محدودیت‌های عملکرد و حافظه در اجرای ViewCapture را توضیح می‌دهند.

عملکرد

میانگین سربار نخ اصلی برای عملکرد ViewCapture 195 میکرو ثانیه است. با این حال، در بدترین حالت ممکن است حدود 5 میلی ثانیه طول بکشد. به برش vc#onDraw در ردیابی Perfetto مراجعه کنید.

هزینه های سربار در درجه اول ناشی از اقدامات زیر است:

  1. پیمایش سلسله مراتب 50 میکرو ثانیه هزینه دارد، حتی زمانی که هرس شود.
  2. کشیدن اشیا از یک تخصیص دهنده لیست آزاد برای ذخیره کپی از ویژگی های view 20 میکرو ثانیه هزینه دارد.
  3. واکشی هر مقدار ویژگی از طریق تابع دریافت کننده منجر به فراخوانی تابع اضافی در هر نمایش می شود که هزینه آن 110 میکرو ثانیه است.

از این رو، فعال کردن ViewCapture در همیشه در ردیابی (AOT) بر عملکرد سیستم تأثیر منفی می‌گذارد و منجر به jank می‌شود. با توجه به این محدودیت های عملکرد و حافظه، این رویکرد برای AOT آماده نیست. ما ViewCapture را فقط برای اشکال زدایی آزمایشگاهی و محلی توصیه می کنیم.

حافظه

روش Perfetto برای ردیابی ViewCapture از یک بافر حلقه تکی استفاده می کند که دارای ردپای حافظه از پیش تعریف شده برای جلوگیری از استفاده بیش از حد از حافظه است. این رویکرد با اجتناب از استفاده از بافرهای حلقه جداگانه برای هر پنجره، از مصرف بیش از حد حافظه جلوگیری می کند، اما مشکل ذخیره کل سلسله مراتب نمای برای هر حالت در Perfetto برای هر فریم را حل نمی کند. ضبط یک پنجره واحد، مانند NexusLauncher، می تواند بیش از 30 ثانیه داده ViewCapture را در یک بافر 10 مگابایتی تولید کند. با این حال، گرفتن بیش از 30 پنجره از رابط کاربری سیستم نیاز به یک بافر بزرگتر یا یک پنجره زمان ضبط بسیار کوتاهتر دارد.

دستورالعمل ها

برای نصب ViewCapture در برنامه های سیستم، این دستورالعمل ها را دنبال کنید:

  1. همانطور که در کد راه‌انداز نشان داده شده است، وابستگی را به فایل Android.bp خود اضافه کنید.

    android_library {
        name: "YourLib",
        static_libs: [
              ...
            "//frameworks/libs/systemui:view_capture",
              ...
        ],
        platform_apis: true,
        privileged: true,
    }
    
  2. هنگام ایجاد پنجره خود یک نمونه ViewCapture ایجاد کنید، به عنوان مثال:

    • مثال 1 :

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

      private SafeCloseable mViewCapture;
      
      @Override
      protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (enableViewCaptureTracing()) {
            mViewCaptureCloseable = ViewCaptureFactory.getInstance(getContext())
              .startCapture(getRootView(), ".NotificationShadeWindowView");
        }
        ...
      }
      
  3. همانطور که در مثال های زیر نشان داده شده است، هنگام از بین بردن پنجره، نمونه ViewCapture را ببندید:

    • مثال 1 :

      @Override
      public void onDestroy() {
        ...
        if (mViewCapture != null) mViewCapture.close();
      }
      
    • مثال 2 :

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