फ़्लैश मेमोरी उपयोग की निगरानी करें

वॉचडॉग `/proc/uid_io/stats` स्थान पर कर्नेल द्वारा उजागर किए गए प्रति-यूआईडी डिस्क I/O आँकड़ों का उपयोग करके सभी ऐप्स और सेवाओं द्वारा किए गए डिस्क I/O लेखन की कुल मात्रा को ट्रैक करके फ़्लैश मेमोरी उपयोग की निगरानी करता है। जब कोई ऐप या सेवा डिस्क I/O अति प्रयोग सीमा से अधिक हो जाती है, तो वॉचडॉग ऐप या सेवा पर कार्रवाई करता है। डिस्क I/O अति प्रयोग सीमाएँ और अति प्रयोग पर की जाने वाली कार्रवाई डिस्क I/O अति प्रयोग कॉन्फ़िगरेशन में पूर्वनिर्धारित है।

सीमा का अति प्रयोग

  • डिस्क I/O अति प्रयोग थ्रेशोल्ड को दैनिक आधार पर लागू किया जाता है, अर्थात, किसी ऐप/सेवा द्वारा किए गए सभी लेखन को वर्तमान यूटीसी कैलेंडर दिवस की शुरुआत से एकत्रित किया जाता है और अति प्रयोग कॉन्फ़िगरेशन में परिभाषित थ्रेशोल्ड के विरुद्ध जांच की जाती है।
  • जब किसी वाहन को किसी दिए गए दिन में कई बार शुरू किया जाता है, तो वॉचडॉग मॉड्यूल फ्लैश मेमोरी पर डिस्क I/O उपयोग आंकड़ों को संग्रहीत करता है और वर्तमान यूटीसी कैलेंडर दिन की शुरुआत से उन्हें एकत्रित करता है।

अति प्रयोग क्रियाएं

जब कोई ऐप बार-बार परिभाषित डिस्क I/O अति-उपयोग सीमा से अधिक हो जाता है, तो वॉचडॉग अति-उपयोग कॉन्फ़िगरेशन में परिभाषित कार्रवाई करता है।

  • सभी विक्रेता ऐप्स और सेवाओं को समग्र सिस्टम स्थिरता के लिए महत्वपूर्ण माना जाता है, इसलिए डिस्क I/O के अति प्रयोग पर उन्हें समाप्त नहीं किया जाता है। हालाँकि, अति प्रयोग कॉन्फ़िगरेशन सुरक्षित-से-समाप्ति विक्रेता ऐप्स और सेवाओं की एक सूची को परिभाषित कर सकता है।
  • सभी तृतीय-पक्ष ऐप्स को समाप्त करना सुरक्षित है।

जब कोई ऐप या सेवा सुरक्षित रूप से समाप्त हो जाती है, तो वॉचडॉग ऐप या सेवा को ऐप घटक स्थिति PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED के साथ अक्षम कर देता है।

कॉन्फ़िगरेशन का अति प्रयोग

अति प्रयोग कॉन्फ़िगरेशन में डिस्क I/O अति प्रयोग थ्रेशोल्ड और क्रियाएं शामिल हैं। डिफ़ॉल्ट अति प्रयोग कॉन्फ़िगरेशन को सिस्टम और विक्रेता छवियों में परिभाषित किया गया है, और बिल्ड के साथ भेजा गया है। विक्रेता वैकल्पिक रूप से विक्रेता छवि में विक्रेता कॉन्फ़िगरेशन शामिल कर सकते हैं। जब विक्रेता कॉन्फ़िगरेशन प्रदान नहीं किया जाता है, तो सिस्टम कॉन्फ़िगरेशन का उपयोग विक्रेता ऐप्स और सेवाओं के लिए भी किया जाता है।

वॉचडॉग CarWatchdogManager के माध्यम से सिस्टम एपीआई को उजागर करता है, जो विक्रेताओं के ऐप्स या सेवाओं को किसी भी समय विक्रेता कॉन्फ़िगरेशन को अपडेट करने देता है।

कॉन्फ़िगरेशन परिभाषा का अति प्रयोग

अति प्रयोग कॉन्फ़िगरेशन को घटक प्रकार से विभाजित किया जाता है, उदाहरण के लिए, सिस्टम, विक्रेता और तृतीय पक्ष। ओईएम को केवल विक्रेता घटक कॉन्फ़िगरेशन को अद्यतन करना होगा।

विक्रेता विन्यास

विक्रेता कॉन्फ़िगरेशन सभी विक्रेता ऐप्स और सेवाओं, और सभी मानचित्रों और मीडिया ऐप्स के लिए डिस्क I/O अति प्रयोग सीमा और कार्रवाइयों को परिभाषित करता है। कॉन्फ़िगरेशन में नीचे दिए गए कॉन्फ़िगरेशन फ़ील्ड शामिल हैं.

  • Vendor package prefixes . विक्रेता विभाजन में स्थापित सभी पैकेज विक्रेता पैकेज माने जाते हैं। इन पैकेजों के अलावा, विक्रेता विक्रेता पैकेज vendor package prefixes कॉन्फ़िगरेशन में पैकेज उपसर्ग जोड़कर पूर्वस्थापित पैकेजों को विक्रेता पैकेज के रूप में वर्गीकृत कर सकते हैं। यह कॉन्फ़िगरेशन नियमित अभिव्यक्तियों को स्वीकार नहीं करता है.
  • Safe-to-terminate packages । विक्रेता safe-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 कॉन्फ़िगरेशन को केवल सभी मानचित्रों और मीडिया ऐप्स के लिए विक्रेता कॉन्फ़िगरेशन द्वारा अपडेट किया जा सकता है।

अति प्रयोग सीमा में लिखने के लिए अनुमत बाइट्स की मात्रा शामिल होती है

  • एक ऐप/सेवा फ़ोरग्राउंड मोड बनाम बैकग्राउंड मोड
  • और सिस्टम गेराज मोड।

यह वर्गीकरण उपयोगकर्ता को अग्रभूमि ऐप्स/सेवाओं का सामना करने पर पृष्ठभूमि ऐप्स/सेवाओं की तुलना में अधिक डेटा लिखने की अनुमति देता है। गैराज मोड में, ऐप्स और सेवाएं अपडेट डाउनलोड करती हैं, इसलिए प्रत्येक को अन्य मोड में चलने वाले ऐप्स और सेवाओं की तुलना में अधिक सीमा की आवश्यकता होती है।

सिस्टम और तृतीय-पक्ष कॉन्फ़िगरेशन

ओईएम को सिस्टम और तृतीय-पक्ष कॉन्फ़िगरेशन को अपडेट नहीं करना चाहिए।

  • सिस्टम कॉन्फ़िगरेशन सिस्टम ऐप्स और सेवाओं के लिए 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 सिस्टम एपीआई के माध्यम से अति प्रयोग कॉन्फ़िगरेशन को अपडेट करें

उपरोक्त XML कॉन्फ़िगरेशन केवल बिल्ड छवि में प्रदान किया जा सकता है। यदि कोई ओईएम बिल्ड जारी होने के बाद ऑन-डिवाइस कॉन्फ़िगरेशन को अपडेट करना चुनता है, तो वे ऑन-डिवाइस कॉन्फ़िगरेशन में बदलाव करने के लिए निम्नलिखित एपीआई का उपयोग कर सकते हैं।

  • कॉल करने वाले को 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 से ऐप विशिष्ट संसाधन अतिउपयोग सूचनाओं को सुन सकते हैं।

संसाधन के अति प्रयोग की सूचनाएं सुनें

ऐप्स एक संसाधन अतिउपयोग श्रोता को कार्यान्वित कर सकते हैं और श्रोता को CarWatchdogManager के साथ पंजीकृत कर सकते हैं ताकि ऐप विशिष्ट सूचनाएं प्राप्त कर सकें जब वे अपनी डिस्क I/O अतिउपयोग सीमा के 80% या 100% से अधिक हो जाएं। ऐप्स इन सूचनाओं का उपयोग इसके लिए कर सकते हैं:

  • ऑफ़लाइन विश्लेषण के लिए डिस्क 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 एनम पास करें।

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 दिनों के बाद, यह सेटिंग स्वचालित रूप से डिफ़ॉल्ट पर रीसेट हो जाती है। दिन की सीमा को अधिकतम 180 दिनों तक watchdogUserPackageSettingsResetDays का उपयोग करके RRO ओवरले ऐप के साथ संशोधित किया जा सकता है। अधिक जानने के लिए, रनटाइम पर ऐप के संसाधनों का मान बदलें देखें। निम्नलिखित उदाहरण ओवरले टैग को 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 के रूप में अपडेट करता है। OEM को इन ऐप्स को असामान्य के रूप में प्रदर्शित करने के लिए अंतर्निहित लॉन्चर कार्यान्वयन को अपडेट करना होगा, ताकि जरूरत पड़ने पर उपयोगकर्ता उनका उपयोग कर सकें। बिल्ड रिलीज़ के आधार पर निम्नलिखित अनुशंसाएँ देखें।

एंड्रॉइड एससी V2 रिलीज़

  • लॉन्चर पर दिखाने के लिए पैकेजों की सूची पुनर्प्राप्त करते समय लॉन्चर कार्यान्वयन को MATCH_DISABLED_UNTIL_USED_COMPONENTS ध्वज का उपयोग करना चाहिए।
  • जब उपयोगकर्ता किसी ऐसे ऐप्स पर क्लिक करता है जो PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED स्थिति में है, तो लॉन्चर ऐप को सक्षम स्थिति को इस प्रकार सेट करके ऐप को सक्षम करना होगा:

    PackageManager.COMPONENT_ENABLED_STATE_ENABLED