ViewCapture एक सॉफ़्टवेयर टूल है. यह उन विंडो से जुड़े व्यू की प्रॉपर्टी कैप्चर करता है जिनसे इसे जोड़ा गया है. जैसे, जगह, साइज़, स्केल, और विज़िबिलिटी. ViewCapture, किसी विंडो में मौजूद अलग-अलग व्यू और उनकी प्रॉपर्टी के बारे में जानकारी कैप्चर करता है. इससे, आपको किसी खास समय पर उपयोगकर्ता अनुभव की स्थिति के बारे में पता चलता है. साथ ही, समय के साथ हुए बदलावों को ट्रैक किया जा सकता है.
स्क्रीन रिकॉर्डिंग की मदद से, किसी खास समय पर व्यू की स्थिति को विज़ुअलाइज़ किया जा सकता है और यह देखा जा सकता है कि उसमें क्या बदलाव हुआ. हालांकि, इसके लिए सीपीयू के ज़्यादा संसाधनों की ज़रूरत होती है और इससे परफ़ॉर्मेंस पर असर पड़ सकता है. ViewCapture टूल का, संसाधन पर कम असर पड़ता है और इसे ज़्यादा बार चालू किया जा सकता है. इसके अलावा, ViewCapture, व्यू लेवल पर विज़ुअलाइज़ेशन को फ़्रेम के हिसाब से दिखाता है. इससे स्क्रीन रिकॉर्डिंग की तुलना में, किसी खास समय पर व्यू की स्थिति की जांच करना आसान हो जाता है.
इस पेज पर, सिस्टम ऐप्लिकेशन में ViewCapture को शामिल करने का तरीका बताया गया है.
इस्तेमाल करें
ViewCapture.java
, onDrawListener
का एक इंस्टेंस लागू करता है और ड्रॉइंग की प्रोसेस के दौरान, ViewCapture ट्रेस इकट्ठा करता है. हर फ़्रेम को फिर से ड्रॉ करने पर, व्यू ट्री हैरारकी को ट्रैवर्स किया जाता है. यह ट्रैवर्स, विंडो के रूट व्यू से शुरू होता है.
ViewCapture, बेहतर परफ़ॉर्मेंस के लिए, वैल्यू को फ़ेच करने और बैकग्राउंड थ्रेड में कॉपी करने के लिए, सार्वजनिक View.java
गेटर तरीकों का इस्तेमाल करता है. ViewCapture लागू करने पर, captureViewTree
का इस्तेमाल करके यह जांच की जाती है कि कोई व्यू गलत है या अमान्य है या नहीं. इससे, पूरी व्यू हैरारकी को ट्रैवल करने से बचा जा सकता है. captureViewTree
सिर्फ़ सिस्टम ऐप्लिकेशन के लिए उपलब्ध है. यह UnsupportedAppUsage API का हिस्सा है.
इस एपीआई का इस्तेमाल, टारगेट किए गए SDK टूल के वर्शन के हिसाब से ऐप्लिकेशन तक ही सीमित है.
सीमाएं
यहां दिए गए सेक्शन में, ViewCapture को चलाने में परफ़ॉर्मेंस और मेमोरी से जुड़ी सीमाओं के बारे में बताया गया है.
परफ़ॉर्मेंस
ViewCapture की परफ़ॉर्मेंस के लिए, मुख्य थ्रेड का औसत ओवरहेड 195 μs है. हालांकि, सबसे खराब स्थिति में, इसमें करीब 5 मिलीसेकंड लग सकते हैं. Perfetto ट्रैस में vc#onDraw
स्लाइस देखें.
ऊपरी खर्च मुख्य रूप से इन वजहों से होते हैं:
- हैरारकी को ट्रैवर्स करने में 50 μs लगते हैं. भले ही, इसे छोटा किया गया हो.
- व्यू प्रॉपर्टी की कॉपी सेव करने के लिए, फ़्रीलिस्ट एलोकेटर से ऑब्जेक्ट खींचने में 20 μs लगते हैं.
- हर प्रॉपर्टी वैल्यू को गेट्टर फ़ंक्शन की मदद से फ़ेच करने पर, हर व्यू के लिए कई अतिरिक्त फ़ंक्शन कॉल होते हैं. इन कॉल में 110 μs लगते हैं.
इसलिए, हमेशा चालू रहने वाली ट्रैकिंग (एओटी) में ViewCapture को चालू करने से, सिस्टम की परफ़ॉर्मेंस पर बुरा असर पड़ता है और ऐप्लिकेशन में रुकावट आती है. परफ़ॉर्मेंस और मेमोरी से जुड़ी इन सीमाओं की वजह से, यह तरीका एओटी के लिए तैयार नहीं है. हमारा सुझाव है कि ViewCapture का इस्तेमाल सिर्फ़ लैब और स्थानीय डीबगिंग के लिए करें.
मेमोरी
ViewCapture ट्रैस के लिए Perfetto का तरीका, एक रिंग बफ़र का इस्तेमाल करता है. इसमें मेमोरी के ज़्यादा इस्तेमाल को रोकने के लिए, पहले से तय मेमोरी फ़ुटप्रिंट होता है. इस तरीके से, हर विंडो के लिए अलग-अलग रिंग बफ़र का इस्तेमाल करने से बचा जाता है. इससे, ज़्यादा मेमोरी खर्च होने से रोका जा सकता है. हालांकि, इससे हर फ़्रेम के लिए Perfetto में हर स्टेटस की पूरी व्यू हैरारकी को स्टोर करने की समस्या हल नहीं होती. NexusLauncher जैसी किसी एक विंडो को रिकॉर्ड करने पर, 10 एमबी के बफ़र में 30 सेकंड से ज़्यादा का ViewCapture डेटा जनरेट हो सकता है. हालांकि, System UI से 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 इंस्टेंस को बंद करें, जैसा कि यहां दिए गए उदाहरणों में दिखाया गया है:
-
@Override public void onDestroy() { ... if (mViewCapture != null) mViewCapture.close(); }
-
@Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mViewCaptureCloseable != null) { mViewCaptureCloseable.close(); } ... }
-