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 عند إغلاق النافذة، كما هو موضّح في الأمثلة التالية: