সিস্টেম অ্যাপে ViewCapture

ViewCapture হল একটি সফ্টওয়্যার টুল যা ভিউয়ের প্রপার্টি (যেমন লোকেশন, সাইজ, স্কেল এবং দৃশ্যমানতা) ক্যাপচার করে। এটি যে উইন্ডোতে হুক করা থাকে সেটির সাথে অ্যাটাচ করা থাকে। ViewCapture উইন্ডোর মধ্যে থাকা বিভিন্ন ভিউ ও তাদের প্রপার্টি সম্পর্কে তথ্য ক্যাপচার করে, এর ফলে আপনি নির্দিষ্ট সময়ে ব্যবহারকারীর অভিজ্ঞতার অবস্থা জানতে পারেন এবং সময়ের সাথে সাথে হওয়া পরিবর্তন ট্র্যাক করতে পারেন।

স্ক্রিন রেকর্ডিং নির্দিষ্ট সময়ে ভিউয়ের অবস্থা ভিজ্যুয়ালাইজ করতে এবং এটি কীভাবে পরিবর্তিত হয় তা দেখাতে পারে, তবে এর জন্য প্রচুর CPU রিসোর্স প্রয়োজন হয় এবং এটি পারফর্ম্যান্সের উপর প্রভাব ফেলতে পারে। ViewCapture টুলের রিসোর্স ইমপ্যাক্ট কম এবং এটি আরও ঘন ঘন চালু করা যেতে পারে। এছাড়াও, ViewCapture ভিউ লেভেলে ফ্রেম বাই ফ্রেম ভিজ্যুয়ালাইজেশন দেখায়, যা স্ক্রিন রেকর্ডিংয়ের তুলনায় নির্দিষ্ট মুহূর্তে ভিউ স্টেটকে আরও সহজভাবে পরিদর্শন করতে সাহায্য করে।

সিস্টেম অ্যাপে কীভাবে ViewCapture অনবোর্ড করতে হয় তা এই পৃষ্ঠায় বর্ণনা করা হয়েছে।

ব্যবহার করুন

ViewCapture.java onDrawListener-এর একটি ইনস্ট্যান্স প্রয়োগ করে এবং ড্রয়িং প্রসেস চলাকালীন ViewCapture ট্রেস সংগ্রহ করে। প্রতিটি ফ্রেম রিড্র করার ফলে উইন্ডোর মূল ভিউ থেকে শুরু করে ভিউ ট্রি হায়ারার্কি ট্রাভার্স করা হয়। ViewCapture উন্নত পারফর্ম্যান্সের জন্য ব্যাকগ্রাউন্ড থ্রেডে ভ্যালু আনতে ও কপি করতে পাবলিক View.java গেটার পদ্ধতি ব্যবহার করে। ViewCapture ইমপ্লিমেন্টেশন captureViewTree ব্যবহার করে কোনও ভিউ ডার্টি বা ইনভ্যালিডেট করা হয়েছে কিনা তা চেক করে এই প্রসেসকে অপ্টিমাইজ করে, এর ফলে সম্পূর্ণ ভিউ হায়ারার্কি ট্রাভার্স করা এড়ানো যায়। captureViewTree শুধুমাত্র সিস্টেম অ্যাপের জন্য উপলভ্য এবং এটি UnsupportedAppUsage API-এর অংশ। এই API-এর ব্যবহার টার্গেট SDK ভার্সনের উপর ভিত্তি করে অ্যাপের মধ্যে সীমাবদ্ধ।

সীমাবদ্ধতা

এই বিভাগে ViewCapture-এর পারফর্ম্যান্স ও মেমরি সংক্রান্ত সীমাবদ্ধতা সম্পর্কে বর্ণনা করা হয়েছে।

পারফর্ম্যান্স

ViewCapture পারফর্ম্যান্সের জন্য গড় প্রধান থ্রেড ওভারহেড হল ১৯৫ μs। তবে, সবচেয়ে খারাপ পরিস্থিতিতে, এটি প্রায় ৫ মিলি সেকেন্ড সময় নিতে পারে। vc#onDraw স্লাইসটি Perfetto ট্রেসে দেখুন।

ওভারহেড খরচ মূলত নিম্নলিখিত অ্যাকশনের কারণে হয়:

  1. হায়ারার্কি ট্রাভার্স করতে ৫০ μs সময় লাগে, এমনকি তা প্রুনিং করা হলেও।
  2. ভিউ প্রপার্টির কপি স্টোর করার জন্য ফ্রিলিস্ট অ্যালোকেটর থেকে অবজেক্ট পুল করা ২০ μs সময় নেয়।
  3. গেটার ফাংশনের মাধ্যমে প্রতিটি প্রপার্টির ভ্যালু ফেচ করলে, প্রতিটি ভিউতে অনেক অতিরিক্ত ফাংশন কল করতে হয়, যার জন্য ১১০ μs সময় লাগে।

তাই, সবসময় অন-ট্রেসিং (AOT)-এ ViewCapture চালু করলে সিস্টেমের পারফর্ম্যান্সের উপর খারাপ প্রভাব পড়ে এবং জ্যাঙ্ক হয়। এই পারফর্ম্যান্স ও মেমরি সংক্রান্ত সীমাবদ্ধতার কারণে, এই পদ্ধতি AOT-এর জন্য প্রস্তুত নয়। আমরা শুধুমাত্র ল্যাব এবং লোকাল ডিবাগিংয়ের জন্য ViewCapture সাজেস্ট করি।

মেমরি

ViewCapture ট্রেসের জন্য Perfetto-এর পদ্ধতি অতিরিক্ত মেমরি ব্যবহার আটকানোর জন্য আগে থেকে নির্ধারিত মেমরি ফুটপ্রিন্ট সহ একটি সিঙ্গেল রিং বাফার ব্যবহার করে। এই পদ্ধতি প্রতিটি উইন্ডোর জন্য আলাদা রিং বাফার এড়িয়ে গিয়ে অতিরিক্ত মেমরি ব্যবহার করা আটকায়। তবে, এটি প্রতিটি ফ্রেমের জন্য Perfetto-তে প্রতিটি স্টেটের জন্য সম্পূর্ণ ভিউ হায়ারার্কি স্টোর করার সমস্যা সমাধান করে না। NexusLauncher-এর মতো একটি উইন্ডো রেকর্ড করলে, ১০ MB বাফারে ৩০ সেকেন্ডের বেশি ViewCapture ডেটা তৈরি হতে পারে। সিস্টেম UI থেকে ৩০টির বেশি উইন্ডো ক্যাপচার করার জন্য আরও বড় বাফার বা উল্লেখযোগ্যভাবে কম রেকর্ডিং সময় প্রয়োজন।

নির্দেশাবলী

সিস্টেম অ্যাপে ViewCapture অনবোর্ড করতে, এইসব নির্দেশাবলী অনুসরণ করুন:

  1. লঞ্চার কোডে দেখানো মতো আপনার Android.bp ফাইলে ডিপেন্ডেন্সি যোগ করুন।

    android_library {
        name: "YourLib",
        static_libs: [
              ...
            "//frameworks/libs/systemui:view_capture",
              ...
        ],
        platform_apis: true,
        privileged: true,
    }
    
  2. আপনার উইন্ডো তৈরি করার সময় 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");
        }
        ...
      }
      
  3. আপনার উইন্ডো নষ্ট করার সময় ViewCapture ইনস্ট্যান্স বন্ধ করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

    • উদাহরণ ১:

      @Override
      public void onDestroy() {
        ...
        if (mViewCapture != null) mViewCapture.close();
      }
      
    • উদাহরণ ২:

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