ViewCapture هي أداة برمجية تسجّل خصائص طرق العرض (مثل الموقع الجغرافي والحجم والمقياس وإمكانية الظهور) المرفقة بالنوافذ التي تم ربطها بها. تسجّل ViewCapture معلومات حول طرق العرض المختلفة ضمن نافذة وخصائصها، ما يتيح لك معرفة حالة تجربة المستخدم في لحظات معيّنة من الوقت وتتبُّع التغييرات بمرور الوقت.
يمكن أن توضّح تسجيلات الشاشة حالة العرض في وقت معيّن وتُظهر كيفية تغيُّرها، ولكنّها تتطلّب موارد كبيرة من وحدة المعالجة المركزية ويمكن أن تؤثّر في الأداء. تتطلّب أداة ViewCapture موارد أقل ويمكن تفعيلها بشكل متكرّر. بالإضافة إلى ذلك، يعرض ViewCapture العناصر المرئية إطارًا تلو الآخر على مستوى العرض، ما يسهّل فحص حالة العرض في لحظات معيّنة مقارنةً بتسجيلات الشاشة.
توضّح هذه الصفحة كيفية إعداد ViewCapture في تطبيقات النظام.
استخدام
تنفّذ ViewCapture.java مثيلاً من onDrawListener وتجمع عملية تتبُّع ViewCapture أثناء عملية الرسم. تؤدي إعادة رسم كل إطار إلى بدء عملية اجتياز لتسلسل هرمي لشجرة العرض من عرض النافذة الجذر.
تستخدم ViewCapture طرق View.java
getter العامة لجلب القيم ونسخها إلى سلسلة
تعليمات برمجية في الخلفية لتحسين الأداء. تعمل عملية تنفيذ ViewCapture على تحسين هذه العملية من خلال التحقّق مما إذا كان العرض غير صالح أو تم إبطاله باستخدام captureViewTree، وبالتالي تجنُّب اجتياز التسلسل الهرمي للعرض بالكامل. تتوفّر captureViewTree لتطبيقات النظام فقط وهي جزء من واجهة برمجة التطبيقات UnsupportedAppUsage.
يقتصر استخدام واجهة برمجة التطبيقات هذه على التطبيقات استنادًا إلى إصدار حزمة تطوير البرامج (SDK) المستهدَف.
القيود
يوضّح هذا القسم قيود الأداء والذاكرة في ViewCapture.
الأداء
يبلغ متوسّط الحمل الزائد لسلسلة المحادثات الرئيسية في أداء ViewCapture 195 ميكرو ثانية. ومع ذلك، في أسوأ الحالات، يمكن أن يستغرق ذلك حوالي 5 مللي ثانية. راجِع شريحة vc#onDraw في تتبُّع Perfetto.
ترجع التكاليف الإضافية بشكل أساسي إلى الإجراءات التالية:
- يستغرق اجتياز التسلسل الهرمي 50 ميكرو ثانية، حتى عند تقليصه.
- يستغرق استرداد العناصر من أداة تخصيص قائمة حرة لتخزين نُسخ من سمات العرض 20 ميكرو ثانية.
- يؤدي استرداد قيمة كل سمة من خلال دالة getter إلى العديد من استدعاءات الدوال الإضافية لكل عرض، ما يكلّف 110 ميكرو ثانية.
وبالتالي، يؤدي تفعيل ViewCapture في ميزة "التتبُّع دائمًا" (AOT) إلى التأثير سلبًا في أداء النظام وإحداث تشوّش. وبسبب هذه القيود المتعلقة بالأداء والذاكرة، لا يمكن استخدام هذا الأسلوب مع AOT. ننصح باستخدام ViewCapture فقط لتصحيح الأخطاء في المختبر وعلى الجهاز.
الذاكرة
تستخدم طريقة ViewCapture في Perfetto مخزنًا مؤقتًا حلقيًا واحدًا مع مساحة ذاكرة محددة مسبقًا لمنع الاستخدام المفرط للذاكرة. يمنع هذا الأسلوب الاستهلاك المفرط للذاكرة من خلال تجنُّب استخدام مخازن مؤقتة منفصلة لكل نافذة. ومع ذلك، لا يحلّ ذلك مشكلة تخزين التسلسل الهرمي الكامل للعرض لكل حالة في Perfetto لكل إطار. يمكن أن يؤدي تسجيل نافذة واحدة، مثل NexusLauncher، إلى إنشاء أكثر من 30 ثانية من بيانات ViewCapture في مخزن مؤقت بسعة 10 ميغابايت. يتطلّب تسجيل أكثر من 30 نافذة من واجهة مستخدم النظام إما مخزنًا مؤقتًا أكبر أو وقت تسجيل أقصر بكثير.
التعليمات
لإتاحة استخدام ViewCapture في تطبيقات النظام، اتّبِع التعليمات التالية:
- أضِف التبعية إلى ملف - Android.bp، كما هو موضّح في رمز مشغّل التطبيقات.- android_library { name: "YourLib", static_libs: [ ... "//frameworks/libs/systemui:view_capture", ... ], platform_apis: true, privileged: true, }
- أنشئ مثيلاً من ViewCapture عند إنشاء نافذتك، على سبيل المثال: - 
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"); } ... }
 
- 
- أغلِق مثيل ViewCapture عند إغلاق النافذة، كما هو موضّح في الأمثلة التالية: