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

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

অত্যধিক ব্যবহার থ্রেশহোল্ড

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

অতিরিক্ত ব্যবহার কর্ম

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

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

যখন একটি অ্যাপ বা পরিষেবা নিরাপদে বন্ধ করা হয়, তখন ওয়াচডগ অ্যাপের উপাদান অবস্থা PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED সহ অ্যাপ বা পরিষেবাটিকে অক্ষম করে।

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

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

ওয়াচডগ CarWatchdogManager এর মাধ্যমে সিস্টেম API-গুলি প্রকাশ করে, যা বিক্রেতাদের অ্যাপ বা পরিষেবাগুলিকে যে কোনও সময় বিক্রেতা কনফিগারেশন আপডেট করতে দেয়৷

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

অতিরিক্ত ব্যবহার কনফিগারেশন উপাদান প্রকার দ্বারা বিভক্ত করা হয়, উদাহরণস্বরূপ, সিস্টেম, বিক্রেতা, এবং তৃতীয় পক্ষ। OEMs শুধুমাত্র বিক্রেতা উপাদান কনফিগারেশন আপডেট করা আবশ্যক.

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

ভেন্ডর কনফিগারেশন ডিস্ক I/O অত্যধিক ব্যবহার থ্রেশহোল্ড এবং সমস্ত বিক্রেতা অ্যাপ এবং পরিষেবা এবং সমস্ত মানচিত্র এবং মিডিয়া অ্যাপের জন্য অ্যাকশন সংজ্ঞায়িত করে। কনফিগারেশনে নিচের কনফিগারেশন ক্ষেত্র রয়েছে।

  • Vendor package prefixes । ভেন্ডর পার্টিশনে ইনস্টল করা সমস্ত প্যাকেজ ভেন্ডর প্যাকেজ হিসাবে বিবেচিত হয়। এই প্যাকেজগুলি ছাড়াও, বিক্রেতারা বিক্রেতা প্যাকেজ vendor package prefixes হিসাবে পূর্বে ইনস্টল করা প্যাকেজগুলিকে শ্রেণিবদ্ধ করতে পারে। এই কনফিগারেশন রেগুলার এক্সপ্রেশন গ্রহণ করে না।
  • Safe-to-terminate packagessafe-to-terminate packages কনফিগারেশনে সম্পূর্ণ প্যাকেজের নাম যোগ করে বিক্রেতারা নির্দিষ্ট করতে পারেন কোন ভেন্ডর প্যাকেজগুলো বন্ধ করা নিরাপদ।
  • Application category mappings । বিক্রেতারা যেকোন প্যাকেজ (তৃতীয়-পক্ষের প্যাকেজ সহ) দুটি সমর্থিত অ্যাপ বিভাগের একটিতে ম্যাপ করতে পারে - মানচিত্র এবং মিডিয়া অ্যাপ। এই ম্যাপিংটি মানচিত্র এবং মিডিয়া অ্যাপগুলিকে উচ্চতর ডিস্ক I/O অত্যধিক ব্যবহার থ্রেশহোল্ড প্রদান করার জন্য করা হয় কারণ এই অ্যাপগুলি অন্যান্য অ্যাপের প্রকারের তুলনায় ডিস্কে বেশি ডেটা ডাউনলোড এবং লিখতে থাকে।
  • Component level thresholds সমস্ত বিক্রেতা প্যাকেজের জন্য জেনেরিক থ্রেশহোল্ড সংজ্ঞায়িত করে (অর্থাৎ, Package specific thresholds বা Application category specific thresholds এই থ্রেশহোল্ডগুলি পায়)। ডিস্ক I/O অত্যধিক ব্যবহার কনফিগারেশন সংজ্ঞায়িত করার সময় বিক্রেতাদের অবশ্যই নন-জিরো কম্পোনেন্ট-লেভেল থ্রেশহোল্ড সংজ্ঞায়িত করতে হবে।
  • Package specific thresholds । বিক্রেতারা নির্দিষ্ট বিক্রেতা প্যাকেজের জন্য বিশেষ থ্রেশহোল্ড সংজ্ঞায়িত করতে পারেন। ম্যাপিংগুলিতে সম্পূর্ণ প্যাকেজের নাম থাকা উচিত। এই কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলি একটি প্রদত্ত প্যাকেজের জন্য অন্যান্য কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলির চেয়ে অগ্রাধিকার নেয়।
  • Application category specific thresholds । বিক্রেতারা নির্দিষ্ট অ্যাপ বিভাগের জন্য বিশেষ থ্রেশহোল্ড নির্দিষ্ট করতে পারেন। অ্যাপের বিভাগগুলি অবশ্যই সমর্থিত বিভাগগুলির মধ্যে একটি হতে হবে - মানচিত্র এবং মিডিয়া অ্যাপ৷ এই কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলি Application category mappings ব্যবহার করে নির্দিষ্ট প্যাকেজে ম্যাপ করা হয়।
  • System-wide thresholds । বিক্রেতাদের এই কনফিগারেশন নির্দিষ্ট করা উচিত নয়.

Vendor package prefixes , Safe-to-terminate packages , Component level thresholds , এবং Package specific thresholds কনফিগারেশনগুলি শুধুমাত্র ভেন্ডর অ্যাপস এবং পরিষেবাগুলির জন্য ভেন্ডর কনফিগারেশন দ্বারা আপডেট করা যায়৷ Application category specific thresholds কনফিগারেশন শুধুমাত্র সমস্ত মানচিত্র এবং মিডিয়া অ্যাপের জন্য বিক্রেতা কনফিগারেশন দ্বারা আপডেট করা যেতে পারে।

অত্যধিক ব্যবহারের থ্রেশহোল্ডে লেখার সময় অনুমোদিত বাইটের পরিমাণ থাকে

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

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

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

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

  • সিস্টেম কনফিগারেশন I/O অত্যধিক ব্যবহারের থ্রেশহোল্ড এবং সিস্টেম অ্যাপ এবং পরিষেবাগুলির জন্য ক্রিয়াগুলিকে সংজ্ঞায়িত করে।
    • এই কনফিগারেশনটি Application category mappings আপডেট করতে পারে। সুতরাং, এই কনফিগারেশন ক্ষেত্রটি সিস্টেম এবং বিক্রেতা কনফিগারেশনের মধ্যে ভাগ করা হয়।
  • তৃতীয় পক্ষের কনফিগারেশন সমস্ত তৃতীয় পক্ষের অ্যাপের জন্য থ্রেশহোল্ড সংজ্ঞায়িত করে। সিস্টেমে প্রি-ইন্সটল করা নয় এমন সমস্ত অ্যাপই থার্ড-পার্টি অ্যাপ।
    • সমস্ত থার্ড-পার্টি অ্যাপ একই থ্রেশহোল্ড পায় (উদাহরণস্বরূপ, কোনও থার্ড-পার্টি অ্যাপ বিশেষ থ্রেশহোল্ড পায় না) ম্যাপ এবং মিডিয়া অ্যাপ ছাড়া, যার থ্রেশহোল্ড ভেন্ডর কনফিগারেশন দ্বারা সংজ্ঞায়িত করা হয়।
    • নীচের ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ডগুলি তৃতীয় পক্ষের অ্যাপগুলির জন্য ডিফল্ট থ্রেশহোল্ড৷ এই থ্রেশহোল্ড সিস্টেম ইমেজ সঙ্গে পাঠানো হয়.
      • 3 GiB অ্যাপ ফোরগ্রাউন্ড মোডে লিখুন।
      • 2 GiB অ্যাপের ব্যাকগ্রাউন্ড মোডে লিখুন।
      • সিস্টেম গ্যারেজ মোডে 4 GiB লিখুন।
    • এগুলি বেস থ্রেশহোল্ড। এই থ্রেশহোল্ডগুলি আপডেট করা হয়েছে কারণ আমরা ডিস্ক I/O ব্যবহার ভালভাবে বুঝতে পারি।

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

বিল্ড ইমেজে /vendor/etc/automotive/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
  • নতুন কনফিগারেশন আপডেট এবং সেট করতে বিদ্যমান কনফিগারেশন ব্যবহার করতে হবে । বিদ্যমান কনফিগারেশন পেতে API CarWatchdogManager.getResourceOveruseConfigurations ব্যবহার করুন। বিদ্যমান কনফিগারেশন ব্যবহার না করা হলে, সমস্ত কনফিগারেশন (সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন সহ) ওভাররাইট করা হয়, যা সুপারিশ করা হয় না।
  • ডেল্টা পরিবর্তনের সাথে বিদ্যমান কনফিগারেশন আপডেট করুন এবং নতুন কনফিগারেশন সেট করুন। সিস্টেম এবং তৃতীয় পক্ষের উপাদান কনফিগারেশন আপডেট করবেন না
  • নতুন কনফিগারেশন সেট করতে API CarWatchdogManager.setResourceOveruseConfigurations ব্যবহার করুন।
  • ডিস্ক 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();
}

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

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

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

অ্যাপগুলি একটি রিসোর্স অত্যধিক ব্যবহার শ্রোতাকে প্রয়োগ করতে পারে এবং শ্রোতাকে তাদের ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ডের 80% বা 100% অতিক্রম করলে অ্যাপ নির্দিষ্ট বিজ্ঞপ্তিগুলি পেতে 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);
    }
    

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

অ্যাপগুলি সাম্প্রতিক 30 দিনের জন্য অ্যাপ-নির্দিষ্ট 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
      }
}

রিসোর্স অত্যধিক ব্যবহার UX

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

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

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

90 দিন পরে, এই সেটিংটি স্বয়ংক্রিয়ভাবে ডিফল্টে রিসেট হয়৷ watchdogUserPackageSettingsResetDays ব্যবহার করে RRO ওভারলে অ্যাপের মাধ্যমে দিনের সীমা পরিবর্তন করা যেতে পারে, সর্বোচ্চ 180 দিন পর্যন্ত। আরও জানতে, রানটাইমে অ্যাপের সম্পদের মান পরিবর্তন দেখুন। নিম্নলিখিত উদাহরণ ওভারলে ট্যাগটি 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>

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

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

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

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

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

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

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

Android SC V2 রিলিজ

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

    PackageManager.COMPONENT_ENABLED_STATE_ENABLED