ভিউক্যাপচার একটি সফটওয়্যার টুল যা কোনো উইন্ডোর সাথে সংযুক্ত ভিউগুলোর বৈশিষ্ট্য (যেমন অবস্থান, আকার, স্কেল এবং দৃশ্যমানতা) ধারণ করে। ভিউক্যাপচার একটি উইন্ডোর ভেতরের বিভিন্ন ভিউ এবং তাদের বৈশিষ্ট্য সম্পর্কে তথ্য সংগ্রহ করে, যার ফলে আপনি নির্দিষ্ট মুহূর্তে ব্যবহারকারীর অভিজ্ঞতার অবস্থা জানতে পারেন এবং সময়ের সাথে সাথে পরিবর্তনগুলো ট্র্যাক করতে পারেন।
স্ক্রিন রেকর্ডিং একটি নির্দিষ্ট সময়ে কোনো ভিউ-এর অবস্থা দেখাতে পারে এবং এর পরিবর্তনও প্রদর্শন করতে পারে, কিন্তু এগুলোর জন্য উল্লেখযোগ্য পরিমাণে সিপিইউ রিসোর্সের প্রয়োজন হয় এবং এটি পারফরম্যান্সে প্রভাব ফেলতে পারে। ভিউক্যাপচার টুলের রিসোর্স ব্যবহার কম এবং এটি আরও ঘন ঘন চালু করা যায়। এছাড়াও, ভিউক্যাপচার ভিউ লেভেলে ফ্রেম বাই ফ্রেম ভিজ্যুয়ালাইজেশন প্রদর্শন করে, ফলে স্ক্রিন রেকর্ডিংয়ের তুলনায় নির্দিষ্ট মুহূর্তে ভিউ-এর অবস্থা পর্যবেক্ষণ করা আরও সহজ হয়।
এই পৃষ্ঠায় সিস্টেম অ্যাপে ভিউক্যাপচার যুক্ত করার পদ্ধতি বর্ণনা করা হয়েছে।
ব্যবহার
ViewCapture.java onDrawListener এর একটি ইনস্ট্যান্স ইমপ্লিমেন্ট করে এবং ড্রয়িং প্রক্রিয়া চলাকালীন একটি ViewCapture ট্রেস সংগ্রহ করে। প্রতিটি ফ্রেম রিড্র উইন্ডোর রুট ভিউ থেকে শুরু করে ভিউ ট্রি হায়ারার্কির একটি ট্রাভার্সাল ট্রিগার করে। উন্নত পারফরম্যান্সের জন্য, ViewCapture একটি ব্যাকগ্রাউন্ড থ্রেডে ভ্যালু ফেচ এবং কপি করতে পাবলিক View.java গেটার মেথড ব্যবহার করে। ViewCapture ইমপ্লিমেন্টেশনটি captureViewTree ব্যবহার করে কোনো ভিউ ডার্টি বা ইনভ্যালিডেটেড কিনা তা পরীক্ষা করে এই প্রক্রিয়াটিকে অপ্টিমাইজ করে, যার ফলে সম্পূর্ণ ভিউ হায়ারার্কির ট্রাভার্সাল এড়ানো যায়। captureViewTree শুধুমাত্র সিস্টেম অ্যাপের জন্য উপলব্ধ এবং এটি UnsupportedAppUsage API-এর একটি অংশ। এই API-এর ব্যবহার শুধুমাত্র তাদের টার্গেট SDK ভার্সনের উপর ভিত্তি করে তৈরি অ্যাপের মধ্যেই সীমাবদ্ধ।
সীমাবদ্ধতা
এই অংশে ভিউক্যাপচারের পারফরম্যান্স এবং মেমরি সংক্রান্ত সীমাবদ্ধতা বর্ণনা করা হয়েছে।
কর্মক্ষমতা
ViewCapture পারফরম্যান্সের জন্য গড় প্রধান থ্রেড ওভারহেড হলো ১৯৫ মাইক্রোসেকেন্ড। তবে, সবচেয়ে খারাপ পরিস্থিতিতে, এতে প্রায় ৫ মিলিসেকেন্ড সময় লাগতে পারে। Perfetto ট্রেসের vc#onDraw অংশটি দেখুন।
উপরিব্যয় প্রধানত নিম্নলিখিত কার্যক্রমগুলোর কারণে হয়ে থাকে:
- ছাঁটাই করার পরেও, স্তরবিন্যাসটি অতিক্রম করতে ৫০ মাইক্রোসেকেন্ড সময় লাগে।
- ভিউ প্রোপার্টিগুলোর অনুলিপি সংরক্ষণের জন্য একটি ফ্রিলিস্ট অ্যালোকেটর থেকে অবজেক্ট টানতে ২০ মাইক্রোসেকেন্ড সময় লাগে।
- গেটার ফাংশনের মাধ্যমে প্রতিটি প্রপার্টির মান ফেচ করার ফলে প্রতি ভিউতে অনেকগুলো অতিরিক্ত ফাংশন কল হয়, যাতে ১১০ মাইক্রোসেকেন্ড সময় লাগে।
সুতরাং, অলওয়েজ অন-ট্রেসিং (AOT) মোডে ভিউক্যাপচার চালু করলে তা সিস্টেমের পারফরম্যান্সে নেতিবাচক প্রভাব ফেলে এবং জ্যাঙ্ক (jank) সৃষ্টি করে। এই পারফরম্যান্স এবং মেমরি সীমাবদ্ধতার কারণে, এই পদ্ধতিটি AOT-এর জন্য প্রস্তুত নয়। আমরা শুধুমাত্র ল্যাব এবং লোকাল ডিবাগিংয়ের জন্য ভিউক্যাপচার ব্যবহারের পরামর্শ দিই।
স্মৃতি
অতিরিক্ত মেমরি ব্যবহার রোধ করতে, পারফেটোর ভিউক্যাপচার ট্রেসের পদ্ধতিটি একটি পূর্বনির্ধারিত মেমরি ফুটপ্রিন্টসহ একটিমাত্র রিং বাফার ব্যবহার করে। এই পদ্ধতিটি প্রতিটি উইন্ডোর জন্য আলাদা রিং বাফার ব্যবহার না করে অতিরিক্ত মেমরি খরচ প্রতিরোধ করে। তবে, এটি পারফেটোতে প্রতিটি ফ্রেমের জন্য প্রতিটি স্টেটের সম্পূর্ণ ভিউ হায়ারার্কি সংরক্ষণের সমস্যাটির সমাধান করে না। নেক্সাসলঞ্চারের মতো একটিমাত্র উইন্ডো রেকর্ড করলে, একটি ১০ মেগাবাইট বাফারে ৩০ সেকেন্ডেরও বেশি ভিউক্যাপচার ডেটা তৈরি হতে পারে। সিস্টেম UI থেকে ৩০টির বেশি উইন্ডো ক্যাপচার করার জন্য হয় একটি বড় বাফার অথবা উল্লেখযোগ্যভাবে কম রেকর্ডিং সময়ের প্রয়োজন হয়।
নির্দেশাবলী
সিস্টেম অ্যাপে 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 ইনস্ট্যান্সটি বন্ধ করুন, যেমনটি নিম্নলিখিত উদাহরণগুলিতে দেখানো হয়েছে: