ফ্ল্যাশ মেমরি ব্যবহার মনিটর

ওয়াচডগ, কার্নেল কর্তৃক `/proc/uid_io/stats` লোকেশনে প্রকাশিত প্রতি-ইউআইডি ডিস্ক আই/ও পরিসংখ্যান ব্যবহার করে সমস্ত অ্যাপ এবং পরিষেবা দ্বারা সম্পাদিত মোট ডিস্ক আই/ও রাইটের পরিমাণ ট্র্যাক করার মাধ্যমে ফ্ল্যাশ মেমরির ব্যবহার নিরীক্ষণ করে। যখন কোনো অ্যাপ বা পরিষেবা ডিস্ক আই/ও অতিরিক্ত ব্যবহারের সীমা অতিক্রম করে, তখন ওয়াচডগ সেই অ্যাপ বা পরিষেবার বিরুদ্ধে ব্যবস্থা গ্রহণ করে। ডিস্ক আই/ও অতিরিক্ত ব্যবহারের সীমা এবং অতিরিক্ত ব্যবহারের ক্ষেত্রে কী ব্যবস্থা নেওয়া হবে, তা ডিস্ক আই/ও অতিরিক্ত ব্যবহার কনফিগারেশনে পূর্বনির্ধারিত থাকে।

অতিরিক্ত ব্যবহারের সীমা

  • ডিস্ক I/O অতিরিক্ত ব্যবহারের সীমা দৈনিক ভিত্তিতে প্রয়োগ করা হয়; অর্থাৎ, বর্তমান UTC ক্যালেন্ডার দিনের শুরু থেকে কোনো অ্যাপ/পরিষেবা দ্বারা করা সমস্ত রাইট একত্রিত করা হয় এবং অতিরিক্ত ব্যবহারের কনফিগারেশনে সংজ্ঞায়িত সীমার সাথে মিলিয়ে দেখা হয়।
  • কোনো নির্দিষ্ট দিনে একটি যানবাহন একাধিকবার চালু করা হলে, ওয়াচডগ মডিউলটি ফ্ল্যাশ মেমরিতে ডিস্ক I/O ব্যবহারের পরিসংখ্যান সংরক্ষণ করে এবং বর্তমান UTC ক্যালেন্ডার দিনের শুরু থেকে সেগুলোকে একত্রিত করে।

অতিরিক্ত ব্যবহারের ক্রিয়া

যখন কোনো অ্যাপ বারবার নির্ধারিত ডিস্ক I/O অতিরিক্ত ব্যবহারের সীমা অতিক্রম করে, তখন ওয়াচডগ অতিরিক্ত ব্যবহার কনফিগারেশনে সংজ্ঞায়িত ব্যবস্থা গ্রহণ করে।

  • সিস্টেমের সার্বিক স্থিতিশীলতার জন্য সমস্ত ভেন্ডর অ্যাপ এবং সার্ভিসকে গুরুত্বপূর্ণ বলে মনে করা হয়, তাই ডিস্ক I/O-এর অতিরিক্ত ব্যবহারের কারণে সেগুলোকে বন্ধ করা হয় না। তবে, ওভারইউজ কনফিগারেশনে নিরাপদে বন্ধ করা যায় এমন ভেন্ডর অ্যাপ এবং সার্ভিসের একটি তালিকা নির্ধারণ করা যেতে পারে।
  • সকল থার্ড-পার্টি অ্যাপ নিরাপদে বন্ধ করা যায়।

যখন কোনো অ্যাপ বা পরিষেবা নিরাপদে বন্ধ করার জন্য প্রস্তুত হয়, তখন Watchdog অ্যাপ কম্পোনেন্টের স্টেট PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED ব্যবহার করে অ্যাপ বা পরিষেবাটিকে নিষ্ক্রিয় করে দেয়।

অতিরিক্ত ব্যবহারের কনফিগারেশন

ওভারইউজ কনফিগারেশনে ডিস্ক I/O ওভারইউজ থ্রেশহোল্ড এবং অ্যাকশন অন্তর্ভুক্ত থাকে। ডিফল্ট ওভারইউজ কনফিগারেশনগুলো সিস্টেম এবং ভেন্ডর ইমেজে সংজ্ঞায়িত করা থাকে এবং বিল্ডের সাথে পাঠানো হয়। ভেন্ডররা ঐচ্ছিকভাবে ভেন্ডর ইমেজে ভেন্ডর কনফিগারেশন অন্তর্ভুক্ত করতে পারেন। যখন ভেন্ডর কনফিগারেশন সরবরাহ করা হয় না, তখন ভেন্ডর অ্যাপস এবং সার্ভিসগুলোর জন্যও সিস্টেম কনফিগারেশন ব্যবহৃত হয়।

ওয়াচডগ, CarWatchdogManager মাধ্যমে সিস্টেম এপিআই উন্মুক্ত করে, যা ভেন্ডর অ্যাপ বা সার্ভিসগুলোকে যেকোনো সময় ভেন্ডর কনফিগারেশন আপডেট করার সুযোগ দেয়।

অতিরিক্ত ব্যবহারের কনফিগারেশন সংজ্ঞা

অতিরিক্ত ব্যবহৃত কনফিগারেশনকে কম্পোনেন্টের ধরন অনুযায়ী ভাগ করা হয়, যেমন—সিস্টেম, ভেন্ডর এবং থার্ড পার্টি। OEM-দের অবশ্যই শুধুমাত্র ভেন্ডর কম্পোনেন্টের কনফিগারেশন আপডেট করতে হবে।

বিক্রেতার কনফিগারেশন

ভেন্ডর কনফিগারেশন সমস্ত ভেন্ডর অ্যাপ ও পরিষেবা এবং সমস্ত ম্যাপ ও মিডিয়া অ্যাপের জন্য ডিস্ক I/O অতিরিক্ত ব্যবহারের সীমা এবং তার উপর করণীয় পদক্ষেপ নির্ধারণ করে। এই কনফিগারেশনে নিম্নলিখিত ফিল্ডগুলো থাকে।

  • ভেন্ডর প্যাকেজ প্রিফিক্স । ভেন্ডর পার্টিশনে ইনস্টল করা সমস্ত প্যাকেজকে ভেন্ডর প্যাকেজ হিসেবে গণ্য করা হয়। এই প্যাকেজগুলো ছাড়াও, ভেন্ডররা 'ভেন্ডর প্যাকেজ প্রিফিক্স কনফিগ'-এ প্যাকেজ প্রিফিক্স যোগ করে আগে থেকে ইনস্টল করা প্যাকেজগুলোকেও ভেন্ডর প্যাকেজ হিসেবে শ্রেণীবদ্ধ করতে পারে। এই কনফিগটি রেগুলার এক্সপ্রেশন গ্রহণ করে না।
  • নিরাপদে বন্ধ করা যায় এমন প্যাকেজসমূহ । ভেন্ডররা ‘safe-to-terminate packages’ কনফিগে সম্পূর্ণ প্যাকেজের নাম যোগ করে নির্দিষ্ট করতে পারেন যে কোন ভেন্ডর প্যাকেজগুলো নিরাপদে বন্ধ করা যাবে।
  • অ্যাপ্লিকেশন ক্যাটাগরি ম্যাপিং । ভেন্ডররা যেকোনো প্যাকেজকে (থার্ড-পার্টি প্যাকেজ সহ) দুটি সমর্থিত অ্যাপ ক্যাটাগরির একটিতে ম্যাপ করতে পারেন - ম্যাপ এবং মিডিয়া অ্যাপ। এই ম্যাপিংটি করা হয় ম্যাপ এবং মিডিয়া অ্যাপগুলোকে উচ্চতর ডিস্ক I/O ওভারইউজ থ্রেশহোল্ড প্রদান করার জন্য, কারণ এই অ্যাপগুলো অন্যান্য ধরনের অ্যাপের তুলনায় ডিস্কে বেশি ডেটা ডাউনলোড এবং রাইট করে থাকে।
  • কম্পোনেন্ট স্তরের থ্রেশহোল্ড । সমস্ত ভেন্ডর প্যাকেজের জন্য সাধারণ থ্রেশহোল্ড নির্ধারণ করে (অর্থাৎ, যে প্যাকেজগুলি প্যাকেজ-নির্দিষ্ট থ্রেশহোল্ড বা অ্যাপ্লিকেশন ক্যাটাগরি-নির্দিষ্ট থ্রেশহোল্ডের আওতায় পড়ে না, সেগুলিও এই থ্রেশহোল্ডগুলি পায়)। ডিস্ক I/O ওভারইউজ কনফিগারেশন নির্ধারণ করার সময় ভেন্ডরদের অবশ্যই অশূন্য কম্পোনেন্ট-স্তরের থ্রেশহোল্ড নির্ধারণ করতে হবে।
  • প্যাকেজ-নির্দিষ্ট থ্রেশহোল্ড । ভেন্ডররা নির্দিষ্ট ভেন্ডর প্যাকেজের জন্য বিশেষ থ্রেশহোল্ড নির্ধারণ করতে পারেন। ম্যাপিংগুলিতে সম্পূর্ণ প্যাকেজের নাম থাকতে হবে। একটি নির্দিষ্ট প্যাকেজের জন্য, এই কনফিগে নির্ধারিত থ্রেশহোল্ড অন্যান্য কনফিগে নির্ধারিত থ্রেশহোল্ডের চেয়ে অগ্রাধিকার পাবে।
  • অ্যাপ্লিকেশন ক্যাটাগরি-ভিত্তিক থ্রেশহোল্ড । ভেন্ডররা নির্দিষ্ট অ্যাপ ক্যাটাগরির জন্য বিশেষ থ্রেশহোল্ড নির্ধারণ করতে পারেন। অ্যাপ ক্যাটাগরিগুলো অবশ্যই সমর্থিত ক্যাটাগরিগুলোর মধ্যে একটি হতে হবে – যেমন ম্যাপস এবং মিডিয়া অ্যাপস। এই কনফিগে সংজ্ঞায়িত থ্রেশহোল্ডগুলো অ্যাপ্লিকেশন ক্যাটাগরি ম্যাপিং ব্যবহার করে নির্দিষ্ট প্যাকেজগুলোতে ম্যাপ করা হয়।
  • সিস্টেম-ব্যাপী সীমা । বিক্রেতারা এই কনফিগারেশনটি নির্দিষ্ট করতে পারবে না।

ভেন্ডর অ্যাপস এবং সার্ভিসগুলোর জন্য ভেন্ডর প্যাকেজ প্রিফিক্স , সেফ-টু-টার্মিনেট প্যাকেজ , কম্পোনেন্ট লেভেল থ্রেশহোল্ড এবং প্যাকেজ-নির্দিষ্ট থ্রেশহোল্ড কনফিগারেশন শুধুমাত্র ভেন্ডর কনফিগারেশন দ্বারা আপডেট করা যায়। সমস্ত ম্যাপ এবং মিডিয়া অ্যাপগুলোর জন্য অ্যাপ্লিকেশন ক্যাটাগরি-নির্দিষ্ট থ্রেশহোল্ড কনফিগারেশন শুধুমাত্র ভেন্ডর কনফিগারেশন দ্বারা আপডেট করা যায়।

অতিরিক্ত ব্যবহারের সীমাগুলিতে নিম্নলিখিত সময়ে লেখার জন্য অনুমোদিত বাইটের পরিমাণ অন্তর্ভুক্ত থাকে:

  • একটি অ্যাপ বা পরিষেবার ফোরগ্রাউন্ড মোড বনাম ব্যাকগ্রাউন্ড মোড
  • সিস্টেম গ্যারেজ মোড

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

সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন

OEM-দের সিস্টেম এবং থার্ড-পার্টি কনফিগারেশন আপডেট করা উচিত নয়

  • সিস্টেম কনফিগারেশন সিস্টেম অ্যাপ এবং সার্ভিসগুলোর জন্য I/O অতিরিক্ত ব্যবহারের সীমা এবং করণীয় পদক্ষেপ নির্ধারণ করে।
    • এই কনফিগারেশনটি অ্যাপ্লিকেশন ক্যাটাগরি ম্যাপিংগুলোও আপডেট করতে পারে। সুতরাং, এই কনফিগারেশন ফিল্ডটি সিস্টেম এবং ভেন্ডর কনফিগারেশনের মধ্যে শেয়ার করা হয়।
  • থার্ড-পার্টি কনফিগারেশন সমস্ত থার্ড-পার্টি অ্যাপের জন্য সীমা নির্ধারণ করে দেয়। যেসব অ্যাপ সিস্টেমে আগে থেকে ইনস্টল করা নেই, সেগুলোই থার্ড-পার্টি অ্যাপ।
    • ম্যাপ এবং মিডিয়া অ্যাপ ছাড়া অন্য সব থার্ড-পার্টি অ্যাপ একই থ্রেশহোল্ড পায় (উদাহরণস্বরূপ, কোনো থার্ড-পার্টি অ্যাপ বিশেষ থ্রেশহোল্ড পায় না), কারণ এই অ্যাপগুলোর থ্রেশহোল্ড ভেন্ডর কনফিগারেশন দ্বারা নির্ধারিত হয়।
    • নিম্নোক্ত ডিস্ক I/O অতিরিক্ত ব্যবহারের সীমাগুলো হলো থার্ড-পার্টি অ্যাপগুলোর জন্য ডিফল্ট সীমা। এই সীমাগুলো সিস্টেম ইমেজের সাথে সরবরাহ করা হয়।
      • অ্যাপের ফোরগ্রাউন্ড মোডে ৩ জিবি লেখা হয়েছে।
      • অ্যাপের ব্যাকগ্রাউন্ড মোডে ২ জিবি লেখা হয়েছে।
      • সিস্টেম গ্যারেজ মোডে ৪ জিবি লেখা হয়েছে।
    • এগুলো হলো ভিত্তি সীমা। ডিস্ক I/O ব্যবহার সম্পর্কে আরও তথ্য জানার সাথে সাথে এই সীমাগুলো হালনাগাদ করা হয়।

অতিরিক্ত ব্যবহারের কনফিগারেশন XML ফরম্যাট

ঐচ্ছিক: অ্যান্ড্রয়েড ১৬ এবং এর পরবর্তী সংস্করণগুলোতে, আপনি বিল্ড ইমেজের মধ্যে থাকা /vendor/etc/io-watchdog/resource_overuse_configuration.xml ফাইলে ডিফল্ট ভেন্ডর কনফিগারেশনটি রাখতে পারেন।

অ্যান্ড্রয়েড ১৫ এবং এর নিচের সংস্করণগুলোতে, আপনি বিল্ড ইমেজের /vendor/etc/watchdog/resource_overuse_configuration.xml ফাইলে ডিফল্ট ভেন্ডর কনফিগারেশন রাখতে পারেন। যখন এই কনফিগারেশনটি নির্দিষ্ট করা থাকে না, তখন ভেন্ডর অ্যাপ এবং সার্ভিসগুলোর জন্যও সিস্টেম-সংজ্ঞায়িত কনফিগারেশন প্রয়োগ করা হয়।

XML ফাইলে প্রতিটি কনফিগারেশন ফিল্ডের জন্য শুধুমাত্র একটি ট্যাগ থাকা উচিত। I/O ওভারইউজ কনফিগারেশন অবশ্যই XML ফাইলে সংজ্ঞায়িত করতে হবে। সমস্ত থ্রেশহোল্ড মান MiB এককে উল্লেখ করতে হবে।

নীচে একটি নমুনা XML কনফিগারেশন দেওয়া হল:

<resourceOveruseConfiguration version="1.0">
      <componentType>VENDOR</componentType>

      <!-- List of safe to kill vendor packages. -->
      <safeToKillPackages>
            <package>com.vendor.package.A</package>
            <package>com.vendor.package.B</package>
      </safeToKillPackages>

      <!-- List of vendor package prefixes. -->
      <vendorPackagePrefixes>
            <packagePrefix>com.vendor.package</packagePrefix>
      </vendorPackagePrefixes>

      <!-- List of unique package names to app category mappings. -->
      <packagesToAppCategoryTypes>
            <packageAppCategory type="MEDIA">com.vendor.package.A</packageAppCategory>
            <packageAppCategory type="MAPS">com.google.package.B</packageAppCategory>
            <packageAppCategory type="MEDIA">com.third.party.package.C</packageAppCategory>
      </packagesToAppCategoryTypes>

      <ioOveruseConfiguration>
        <!-- Thresholds in MiB for all vendor packages that don't have package specific thresholds. -->
            <componentLevelThresholds>
                  <state id="foreground_mode">1024</state>
                  <state id="background_mode">512</state>
                  <state id="garage_mode">3072</state>
            </componentLevelThresholds>

            <packageSpecificThresholds>
                  <!-- IDs must be unique -->
                  <perStateThreshold id="com.vendor.package.C">
                    <state id="foreground_mode">400</state>
                    <state id="background_mode">100</state>
                    <state id="garage_mode">200</state>
                  </perStateThreshold>

                  <perStateThreshold id="com.vendor.package.D">
                    <state id="foreground_mode">1024</state>
                    <state id="background_mode">500</state>
                    <state id="garage_mode">2048</state>
                  </perStateThreshold>
            </packageSpecificThresholds>

            <!-- Application category specific thresholds. -->
            <appCategorySpecificThresholds>
                  <!-- One entry per supported application category -->
                  <perStateThreshold id="MEDIA">
                    <state id="foreground_mode">600</state>
                    <state id="background_mode">700</state>
                    <state id="garage_mode">1024</state>
                  </perStateThreshold>

                  <perStateThreshold id="MAPS">
                    <state id="foreground_mode">800</state>
                    <state id="background_mode">900</state>
                    <state id="garage_mode">2048</state>
                  </perStateThreshold>
            </appCategorySpecificThresholds>
      </ioOveruseConfiguration>
</resourceOveruseConfiguration>

CarWatchdogManager সিস্টেম API-এর মাধ্যমে অতিরিক্ত ব্যবহারের কনফিগারেশন আপডেট করুন

উপরের XML কনফিগারেশনটি শুধুমাত্র বিল্ড ইমেজে প্রদান করা যেতে পারে। যদি কোনো OEM একটি বিল্ড প্রকাশের পর ডিভাইসের কনফিগারেশন আপডেট করতে চায়, তবে তারা ডিভাইসের কনফিগারেশনে পরিবর্তন আনার জন্য নিম্নলিখিত API-গুলো ব্যবহার করতে পারে।

  • কলারকে Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG অনুমতিটি প্রদান করুন।
  • নতুন কনফিগারেশন আপডেট ও সেট করার জন্য অবশ্যই বিদ্যমান কনফিগারেশনগুলো ব্যবহার করতে হবে। বিদ্যমান কনফিগারেশনগুলো পেতে CarWatchdogManager.getResourceOveruseConfigurations API-টি ব্যবহার করুন। যদি বিদ্যমান কনফিগারেশনগুলো ব্যবহার করা না হয়, তাহলে সমস্ত কনফিগারেশন (সিস্টেম এবং থার্ড-পার্টি কনফিগারেশন সহ) ওভাররাইট হয়ে যাবে, যা কাম্য নয়।
  • ডেল্টা পরিবর্তনগুলো দিয়ে বিদ্যমান কনফিগারেশনগুলো আপডেট করুন এবং নতুন কনফিগারেশনগুলো সেট করুন। সিস্টেম এবং থার্ড-পার্টি কম্পোনেন্টের কনফিগারেশন আপডেট করবেন না
  • নতুন কনফিগারেশনগুলো সেট করতে CarWatchdogManager.setResourceOveruseConfigurations API-টি ব্যবহার করুন।
  • ডিস্ক I/O ওভারইউজ কনফিগারেশন পেতে ও সেট করতে CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO ফ্ল্যাগটি ব্যবহার করুন।

এখানে একটি নমুনা বাস্তবায়ন দেওয়া হলো যা রিসোর্সের অতিরিক্ত ব্যবহারের কনফিগারেশনগুলো আপডেট করে:

void updateResourceOveruseConfigurations() {
    CarWatchdogManager manager =
        (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);

    List<ResourceOveruseConfiguration> resourceOveruseConfigurations =
        manager.getResourceOveruseConfigurations(
            CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO);

    List<ResourceOveruseConfiguration> newResourceOveruseConfigurations =
            new List<>();
    ResourceOveruseConfiguration vendorConfiguration;
    for(ResourceOveruseConfiguration config : resourceOveruseConfigurations) {
        // Do not update the configurations of the system and third-party component types.
        if (config.getComponentType()
            != ResourceOveruseConfiguration.COMPONENT_TYPE_VENDOR) {
            newResourceOveruseConfigurations.add(config);
            continue;
        }
        vendorConfiguration = config;
    }

    if (vendorConfiguration == null) {
        ResourceOveruseConfiguration.Builder vendorConfigBuilder =
            new ResourceOveruseConfiguration.Builder();
        initializeConfig(vendorConfigBuilder);
        newResourceOveruseConfigurations.add(vendorConfigBuilder.build());
    } else {
        ResourceOveruseConfiguration newVendorConfig =
            updateConfig(vendorConfiguration);
        newResourceOveruseConfigurations.add(newVendorConfig);
    }
    int result = manager.setResourceOveruseConfigurations(
        newResourceOveruseConfigurations,

    if (result != CarWatchdogManager.RETURN_CODE_SUCCESS) {
        // Failed to set the resource overuse configurations.
    }
}

/** Sets the delta between the old configuration and the new configuration. */
ResourceOveruseConfiguration updateConfig(
    ResourceOveruseConfiguration oldConfiguration) {
    // Replace com.vendor.package.A with com.vendor.package.B in the safe-to-kill list.
    List<String> safeToKillPackages = oldConfiguration.getSafeToKillPackages();
    safeToKillPackages.remove("com.vendor.package.A");
    safeToKillPackages.add("com.vendor.package.B");

    ResourceOveruseConfiguration.Builder configBuilder =
        new ResourceOveruseConfiguration.Builder(
            oldConfiguration.getComponentType(),
            safeToKillPackages,
            oldConfiguration.getVendorPackagePrefixes(),
            oldConfiguration.getPackagesToAppCategoryTypes());

    configBuilder.addVendorPackagePrefixes("com.vendor.");
    configBuilder.addPackagesToAppCategoryTypes("com.vendor.package.B",
        ResourceOveruseConfiguration.APPLICATION_CATEGORY_TYPE_MAPS);

    IoOveruseConfiguration oldIoConfiguration = oldConfiguration.getIoOveruseConfiguration();
    IoOveruseConfiguration.Builder ioConfigBuilder =
        new IoOveruseConfiguration.Builder(
            oldIoConfiguration.getComponentLevelThresholds(),
            oldIoConfiguration.getPackageSpecificThresholds(),
            oldIoConfiguration.getAppCategorySpecificThresholds(),
            oldIoConfiguration.getSystemWideThresholds());

    // Define the amount of bytes based on the flash memory specification, expected lifetime,
    // and estimated average amount of bytes written by a package during different modes.
    ioConfigBuilder.addPackageSpecificThresholds("com.vendor.package.B",
        new PerStateBytes(/* foregroundModeBytes= */ 2 * 1024 * 1024 * 1024,
                          /* backgroundModeBytes= */ 500 * 1024 * 1024,
                          /* garageModeBytes= */ 3 * 1024 * 1024 * 1024));


    return configBuilder.setIoOveruseConfiguration(ioConfigBuilder.build()).build();
}

অ্যাপগুলি তাদের সম্পদের অতিরিক্ত ব্যবহার পর্যবেক্ষণ করছে

ভেন্ডর এবং থার্ড-পার্টি অ্যাপগুলো ওয়াচডগ থেকে অ্যাপ-নির্দিষ্ট রিসোর্স অতিরিক্ত ব্যবহারের নোটিফিকেশন শুনতে পারে অথবা বিগত ৩০ দিন পর্যন্ত অ্যাপ-নির্দিষ্ট রিসোর্স অতিরিক্ত ব্যবহারের পরিসংখ্যানের জন্য CarWatchdogManager -কে পোল করতে পারে।

সম্পদের অতিরিক্ত ব্যবহারের বিজ্ঞপ্তিগুলির জন্য শুনুন

অ্যাপগুলি তাদের ডিস্ক I/O ওভারইউজ থ্রেশহোল্ডের ৮০% বা ১০০% অতিক্রম করলে অ্যাপ-নির্দিষ্ট নোটিফিকেশন পাওয়ার জন্য একটি রিসোর্স ওভারইউজ লিসেনার প্রয়োগ করতে পারে এবং CarWatchdogManager সাথে লিসেনারটি রেজিস্টার করতে পারে। অ্যাপগুলি এই নোটিফিকেশনগুলি ব্যবহার করতে পারে:

  • অফলাইন বিশ্লেষণের জন্য ডিস্ক I/O অতিরিক্ত ব্যবহারের পরিসংখ্যান লগ করুন। অ্যাপ ডেভেলপাররা ডিস্ক I/O অতিরিক্ত ব্যবহারের সমস্যা ডিবাগ করতে এই লগিং ব্যবহার করতে পারেন।
  • ওভারইউজ কাউন্টারগুলো রিসেট না হওয়া পর্যন্ত ডিস্ক I/O রাইট কমিয়ে দিন।

জাভা ক্লায়েন্ট

  1. CarWatchdogManager.ResourceOveruseListener ইনহেরিট করে লিসেনার ইমপ্লিমেন্ট করুন:
    class ResourceOveruseListenerImpl implements
          CarWatchdogManager.ResourceOveruseListener {
                @Override
                public void onOveruse(
                      @NonNull ResourceOveruseStats resourceOveruseStats) {
                      // 1. Log/Upload resource overuse metrics.
                      // 2. Reduce writes until the counters reset.
    
                      IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats();
                      // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime()
                      //   + ioOveruseStats.getDurationInSeconds()]
                      // Total I/O overuses - ioOveruseStats.getTotalOveruses()
                      // Total bytes written - ioOveruseStats.getTotalBytesWritten()
                      // Remaining write bytes for the current UTC calendar day -
                      //    ioOveruseStats.getRemainingWriteBytes()
                }
          }
    }
  2. CarWatchdogManager.addResourceOveruseListener কল করে লিসেনার ইনস্ট্যান্সটি রেজিস্টার করুন।
    private void addResourceOveruseListener() {
          CarWatchdogManager manager =
                (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);
          // Choose a proper executor to handle resource overuse notifications.
          Executor executor = mContext.getMainExecutor();
          manager.addResourceOveruseListener(
                executor, CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO,
                mListenerImpl);
    }
  3. অ্যাপটি শোনা শেষ করলে লিসেনার ইনস্ট্যান্সটি অনিবন্ধিত করুন:
    private void removeResourceOveruseListener() {
        CarWatchdogManager manager =
                (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);
        mCarWatchdogManager.removeResourceOveruseListener(
              mListenerImpl);
    }

স্থানীয় ক্লায়েন্ট

  1. বিল্ড রুলের shared_libs ডিপেন্ডেন্সিতে carwatchdog_aidl_interface-ndk_platform অন্তর্ভুক্ত করুন।

    Android.bp

    cc_binary {
        name: "sample_native_client",
        srcs: [
            "src/*.cpp"
        ],
        shared_libs: [
            "carwatchdog_aidl_interface-ndk_platform",
            "libbinder_ndk",
        ],
        vendor: true,
    }
  2. ভেন্ডর সার্ভিস ডোমেইনকে বাইন্ডার ( binder_user ম্যাক্রো) ব্যবহারের অনুমতি দিতে SELinux পলিসি যোগ করুন এবং ভেন্ডর সার্ভিস ডোমেইনটিকে carwatchdog ক্লায়েন্ট ডোমেইনে (carwatchdog_client_domain macro) যুক্ত করুন। sample_client.te এবং file_contexts জন্য নিচের কোডটি দেখুন।

    sample_client.te

    type sample_client, domain;
    type sample_client_exec, exec_type, file_type, vendor_file_type;
    
    carwatchdog_client_domain(sample_client)
    
    init_daemon_domain(sample_client)
    binder_use(sample_client)

    file_contexts

    /vendor/bin/sample_native_client  u:object_r:sample_client_exec:s0
  3. BnResourceOveruseListener থেকে ইনহেরিট করে রিসোর্স ওভারইউজ লিসেনারটি ইমপ্লিমেন্ট করুন। রিসোর্স ওভারইউজ নোটিফিকেশন হ্যান্ডেল করার জন্য BnResourceOveruseListener::onOveruse ওভাররাইড করুন।

    ResourceOveruseListenerImpl.h

    class ResourceOveruseListenerImpl : public BnResourceOveruseListener {
    public:
        ndk::ScopedAStatus onOveruse(
            ResourceOveruseStats resourceOveruseStats) override;
    
    private:
        void initialize();
        void terminate();
    
        std::shared_ptr<ICarWatchdog> mWatchdogServer;
        std::shared_ptr<IResourceOveruseListener> mListener;
    }

    ResourceOveruseListenerImpl.cpp

    ndk::ScopedAStatus ResourceOveruseListenerImpl::onOveruse(
          ResourceOveruseStats resourceOveruseStats) {
    
          // 1. Log/Upload resource overuse metrics.
          // 2. Reduce writes until the counters reset.
    
          if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) {
                // Received resourceOveruseStats doesn't contain I/O overuse stats.
          }
    
          const IoOveruseStats& ioOveruseStats = stats.get();
          // Stats period - [ioOveruseStats.startTime,
          //   ioOveruseStats.startTime + ioOveruseStats.durationInSeconds]
          // Total I/O overuses - ioOveruseStats.totalOveruses
          // Total bytes written - ioOveruseStats.writtenBytes
          // Remaining write bytes for the current UTC calendar day -
          //    ioOveruseStats.remainingWriteBytes
    
          return ndk::ScopedAStatus::ok();
    }
  4. একটি বাইন্ডার থ্রেড পুল চালু করুন এবং ওয়াচডগ সার্ভারের সাথে রিসোর্স ওভারইউজ লিসেনারটি রেজিস্টার করুন। ওয়াচডগ সার্ভারটি android.automotive.watchdog.ICarWatchdog/default সার্ভিস নামের অধীনে রেজিস্টার করা হয়।

    main.cpp

    int main(int argc, char** argv) {
        ABinderProcess_setThreadPoolMaxThreadCount(1);
        ABinderProcess_startThreadPool();
        std::shared_ptr<ResourceOveruseListenerImpl> listener =
            ndk::SharedRefBase::make<ResourceOveruseListenerImpl>();
    
        // The listener is added in initialize().
        listener->initialize();
    
        ... Run service ...
    
        // The listener is removed in terminate().
        listener->terminate();
    }

    ResourceOveruseListenerImpl.cpp

    void ResourceOveruseListener::initialize() {
        ndk::SpAIBinder binder(AServiceManager_getService(
                "android.automotive.watchdog.ICarWatchdog/default"));
        std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder);
        mWatchdogServer = server;
    
        std::shared_ptr<IResourceOveruseListener> listener =
            IResourceOveruseListener::fromBinder(this->asBinder());
        mWatchdogServer->addResourceOveruseListener(
          std::vector<int>{ResourceType.IO}, listener);
        mListener = listener;
    }
    
    void ResourceOveruseListener::terminate() {
        mWatchdogServer->removeResourceOveruseListener(mListener);
    }

জরিপ সম্পদের অতিরিক্ত ব্যবহারের পরিসংখ্যান

অ্যাপগুলি গত ৩০ দিনের জন্য অ্যাপ-নির্দিষ্ট I/O অতিরিক্ত ব্যবহারের পরিসংখ্যানের ATS জানতে CarWatchdogManager-কে পোল করতে পারে।

জাভা ক্লায়েন্ট

রিসোর্সের অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogManager.getResourceOveruseStats ব্যবহার করুন। ডিস্ক I/O-এর অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO ফ্ল্যাগটি পাস করুন।

private void getResourceOveruseStats() {
      CarWatchdogManager manager =
            (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);

      // Returns resource overuse stats with I/O overuse stats for the past
      // 7 days. Stats are available for up to the past 30 days.
      ResourceOveruseStats resourceOveruseStats =
            mCarWatchdogManager.getResourceOveruseStats(
                  CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO,
                  CarWatchdogManager.STATS_PERIOD_PAST_7_DAYS);

      IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats();
      // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime()
      //   + ioOveruseStats.getDurationInSeconds()]
      // Total I/O overuses - ioOveruseStats.getTotalOveruses()
      // Total bytes written - ioOveruseStats.getTotalBytesWritten()
      // Remaining write bytes for the UTC calendar day -
      //    ioOveruseStats.getRemainingWriteBytes()
}

স্থানীয় ক্লায়েন্ট

রিসোর্সের অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogServer.getResourceOveruseStats ব্যবহার করুন। ডিস্ক I/O-এর অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে ResourceType.IO enum-টি পাস করুন।

void getResourceOveruseStats() {
      ndk::SpAIBinder binder(AServiceManager_getService(
            "android.automotive.watchdog.ICarWatchdog/default"));
      std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder);
      // Returns the stats only for the current UTC calendar day.
      const std::vector<ResourceOveruseStats> resourceOveruseStats;
      ndk::ScopedAStatus status = server.getResourceOveruseStats(
            std::vector<int>{ResourceType.IO}, &resourceOveruseStats);
      if (!status.isOk()) {
            // Failed to get the resource overuse stats.
            return;
      }

      for (const auto& stats : resourceOveruseStats) {
            if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) {
                  continue;
            }
            const IoOveruseStats& ioOveruseStats = stats.get();
            // Stats period - [ioOveruseStats.startTime,
            //   ioOveruseStats.startTime + ioOveruseStats.durationInSeconds]
            // Total I/O overuses - ioOveruseStats.totalOveruses
            // Total bytes written - ioOveruseStats.writtenBytes
            // Remaining write bytes for the current UTC calendar day -
            //   ioOveruseStats.remainingWriteBytes
      }
}

সম্পদের অতিরিক্ত ব্যবহারের ব্যবহারকারীর অভিজ্ঞতা

নিম্নলিখিত বিভাগগুলিতে সম্পদের অতিরিক্ত ব্যবহার ঘটলে ব্যবহারকারীর অভিজ্ঞতা বর্ণনা করা হয়েছে।

অ্যাপের পারফরম্যান্স সেটিংকে অগ্রাধিকার দিন

অ্যাপের সেটিংস পৃষ্ঠায় Prioritize app performance (নিচের ছবিটি দেখুন) এর জন্য সেটিংস রয়েছে, যা ব্যবহারকারীদের সিস্টেম এবং দীর্ঘমেয়াদী হার্ডওয়্যার পারফরম্যান্সের চেয়ে একটি অ্যাপের পারফরম্যান্সকে অগ্রাধিকার দেওয়ার সুযোগ দেয়। এই সেটিংটি শুধুমাত্র সেইসব অ্যাপের জন্য উপলব্ধ, যেগুলো রিসোর্স অতিরিক্ত ব্যবহারের কারণে নিরাপদে বন্ধ করা যায়। অন্যথায়, এই সেটিংটি নিষ্ক্রিয় থাকে। যখন কোনো অ্যাপের জন্য এই সেটিংটি বন্ধ করা থাকে (যা ডিফল্ট সেটিং), তখন রিসোর্স অতিরিক্ত ব্যবহারের কারণে অ্যাপটি বন্ধ করা যেতে পারে। অন্যথায়, রিসোর্স অতিরিক্ত ব্যবহারের কারণে অ্যাপটি বন্ধ করা হয় না।

যখন ব্যবহারকারী এই সেটিংটি চালু করেন, তখন নিম্নলিখিত নিশ্চিতকরণ ডায়ালগটি সেটিংটি চালু করার ফলাফল বর্ণনা করে:

৯০ দিন পর, এই সেটিংটি স্বয়ংক্রিয়ভাবে ডিফল্টে রিসেট হয়ে যায়। একটি RRO ওভারলে অ্যাপের মাধ্যমে watchdogUserPackageSettingsResetDays ব্যবহার করে দিনের সীমা পরিবর্তন করা যেতে পারে, যা সর্বোচ্চ ১৮০ দিন পর্যন্ত হতে পারে। আরও জানতে, রানটাইমে একটি অ্যাপের রিসোর্সের মান পরিবর্তন দেখুন। নিম্নলিখিত উদাহরণ ওভারলে ট্যাগটি AndroidManifest.xml এ অন্তর্ভুক্ত করা যেতে পারে:

<overlay android:priority="<insert-value>"
      android:targetPackage="com.android.car.updatable"
      android:targetName="CarServiceCustomization"
      android:resourcesMap="@xml/overlays" />

res/values/config.xml এ:

<resources>
  <integer name="watchdogUserPackageSettingsResetDays">value</integer>
</resources>

res/xml/overlays.xml এ:

<overlay>
  <item target="integer/watchdogUserPackageSettingsResetDays" value="@integer/watchdogUserPackageSettingsResetDays" />
</overlay>

পারফরম্যান্স-প্রভাবিত অ্যাপ সেটিং

সেটিংস অ্যাপে একটি ‘পারফরম্যান্স-প্রভাবিত অ্যাপস’ বিভাগ রয়েছে (চিত্র ১ দেখুন)। এটিতে ট্যাপ করলে, ফ্ল্যাশ মেমরির অতিরিক্ত ব্যবহারের কারণে সীমাবদ্ধ করা এবং সিস্টেমের পারফরম্যান্সে নেতিবাচক প্রভাব ফেলে এমন অ্যাপগুলির একটি তালিকা প্রদর্শিত হয়। এটি CDD 3.5.1-এর আবশ্যকতা [C-1-1] অনুসরণ করে।

কর্মক্ষমতা-প্রভাবিত অ্যাপ

চিত্র ১. কর্মক্ষমতাকে প্রভাবিত করে এমন অ্যাপসমূহ।

অতিরিক্ত রিসোর্স ব্যবহারের কারণে বন্ধ হয়ে যাওয়া অ্যাপগুলো এখানে তালিকাভুক্ত করা হয় (চিত্র ২ দেখুন)। তালিকাভুক্ত অ্যাপগুলোকে অগ্রাধিকার দেওয়া যেতে পারে। আরও জানতে, ‘অ্যাপ পারফরম্যান্সের অগ্রাধিকার নির্ধারণ’ সেটিংটি দেখুন।

অতিরিক্ত রিসোর্স ব্যবহারের কারণে বন্ধ করে দেওয়া অ্যাপগুলোর তালিকা

চিত্র ২. অতিরিক্ত সম্পদ ব্যবহারের কারণে বন্ধ করে দেওয়া অ্যাপগুলোর তালিকা।

ব্যবহারকারী বিজ্ঞপ্তি

যখন কোনো অ্যাপ বা পরিষেবা একটি নির্দিষ্ট সময়ের মধ্যে বারবার ডিস্ক I/O-এর অতিরিক্ত ব্যবহার করে (উদাহরণস্বরূপ, নির্ধারিত সীমার বাইরে ডিস্কে ডেটা লেখে) এবং রিসোর্সের অতিরিক্ত ব্যবহারের কারণে সেটিকে বন্ধ করে দেওয়া নিরাপদ হয়, তখন যানটি 'ড্রাইভারের মনোযোগ-বিচ্যুতির অনুমতি' অবস্থায় প্রবেশ করার পর ব্যবহারকারীকে অবহিত করা হয়।

(গাড়ি চালানোর সময়) প্রথম ব্যবহারকারী বিজ্ঞপ্তিটি একটি হেডস-আপ বিজ্ঞপ্তি হিসেবে পোস্ট করা হয় এবং অন্যান্য বিজ্ঞপ্তিগুলো নোটিফিকেশন সেন্টারে পোস্ট করা হয়।

উদাহরণস্বরূপ, যখন কোনো অ্যাপ বারবার ডিস্ক I/O অতিরিক্ত ব্যবহার করে, তখন ব্যবহারকারী নিম্নলিখিত বিজ্ঞপ্তিটি পান:

  • যখন ব্যবহারকারী 'Prioritize app' বোতামে ক্লিক করেন, তখন অ্যাপটির সেটিংস পৃষ্ঠা চালু হয়, যেখানে ব্যবহারকারী 'Prioritize app performance' সেটিংটি চালু বা বন্ধ করতে পারেন।
  • যখন ব্যবহারকারী 'Disable app' বোতামে ক্লিক করেন, তখন অ্যাপটি নিষ্ক্রিয় হয়ে যায় যতক্ষণ না তিনি অ্যাপটি পুনরায় চালু করেন বা অ্যাপের সেটিংস পৃষ্ঠা থেকে এটি সক্রিয় করেন।
  • যেসব অ্যাপ আনইনস্টল করা যায়, সেগুলোর ক্ষেত্রে 'Disable app' বাটনটির পরিবর্তে 'Uninstall app' বাটনটি থাকে। ব্যবহারকারী যখন 'Uninstall app' বাটনটিতে ক্লিক করেন, তখন অ্যাপটির 'Settings' পেজটি চালু হয়, যেখান থেকে ব্যবহারকারী অ্যাপটি আনইনস্টল করতে পারেন।

লঞ্চার বাস্তবায়নের জন্য সুপারিশ

যখন অতিরিক্ত রিসোর্স ব্যবহারের কারণে অ্যাপগুলি নিষ্ক্রিয় করা হয়, তখন সেগুলি ডিফল্ট লঞ্চার অ্যাপ থেকে অদৃশ্য হয়ে যায়, কারণ CarService অ্যাপগুলির সক্রিয় অবস্থা PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED হিসেবে আপডেট করে। OEM-দের অবশ্যই বিল্ট-ইন লঞ্চার ইমপ্লিমেন্টেশন আপডেট করতে হবে যাতে এই অ্যাপগুলি স্বাভাবিকভাবে প্রদর্শিত হয় এবং ব্যবহারকারীরা প্রয়োজনে সেগুলি ব্যবহার করতে পারেন। বিল্ড রিলিজের উপর ভিত্তি করে নিম্নলিখিত সুপারিশগুলি দেখুন।

অ্যান্ড্রয়েড এসসি ভি২ রিলিজ

  • লঞ্চারে দেখানোর জন্য প্যাকেজের তালিকা সংগ্রহ করার সময়, লঞ্চার ইমপ্লিমেন্টেশনে MATCH_DISABLED_UNTIL_USED_COMPONENTS ফ্ল্যাগটি ব্যবহার করা উচিত।
  • যখন ব্যবহারকারী PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED অবস্থায় থাকা কোনো অ্যাপে ক্লিক করেন, তখন লঞ্চার অ্যাপটিকে অবশ্যই অ্যাপটির এনাবলড স্টেট নিম্নরূপে সেট করে সেটিকে এনাবল করতে হবে:

    PackageManager.COMPONENT_ENABLED_STATE_ENABLED .