Flash bellek kullanımını izleyin

Watchdog, Çekirdek tarafından `/proc/uid_io/stats' konumunda sunulan UID başına disk G/Ç istatistiklerini kullanarak tüm uygulamalar ve hizmetler tarafından yapılan toplam disk G/Ç yazma miktarını izleyerek flash bellek kullanımını izler. Bir uygulama veya hizmet, disk G/Ç aşırı kullanım eşiğini aştığında Watchdog, uygulama veya hizmet üzerinde harekete geçer. Disk G/Ç aşırı kullanım eşikleri ve aşırı kullanım durumunda gerçekleştirilecek eylem, disk G/Ç aşırı kullanım yapılandırmasında önceden tanımlanmıştır.

Aşırı kullanım eşikleri

  • Disk G/Ç aşırı kullanım eşikleri günlük olarak uygulanır; yani bir uygulama/hizmet tarafından yapılan tüm yazma işlemleri, geçerli UTC takvim gününün başlangıcından bu yana toplanır ve aşırı kullanım yapılandırmalarında tanımlanan eşiklere göre kontrol edilir.
  • Bir araç belirli bir günde birden çok kez çalıştırıldığında, Watchdog modülü disk G/Ç kullanım istatistiklerini flash bellekte saklar ve bunları geçerli UTC takvim gününün başlangıcından bu yana toplar.

Aşırı kullanım eylemleri

Bir uygulama, tanımlanan disk G/Ç aşırı kullanım eşiklerini tekrar tekrar aştığında Watchdog, aşırı kullanım yapılandırmasında tanımlanan eylemleri gerçekleştirir.

  • Tüm satıcı uygulamaları ve hizmetleri, genel sistem kararlılığı açısından kritik kabul edilir, dolayısıyla disk G/Ç'nin aşırı kullanımı durumunda sonlandırılmazlar. Ancak aşırı kullanım yapılandırması, sonlandırılması güvenli satıcı uygulamaları ve hizmetlerinin bir listesini tanımlayabilir.
  • Tüm üçüncü taraf uygulamalarının sonlandırılması güvenlidir.

Bir uygulama veya hizmetin sonlandırılması güvenli olduğunda Watchdog, uygulama bileşeni durumu PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED ile uygulamayı veya hizmeti devre dışı bırakır.

Aşırı kullanım yapılandırması

Aşırı kullanım yapılandırması, disk G/Ç aşırı kullanım eşiklerini ve eylemlerini içerir. Varsayılan aşırı kullanım yapılandırmaları sistem ve satıcı görüntülerinde tanımlanır ve yapıyla birlikte gönderilir. Satıcılar isteğe bağlı olarak satıcı yapılandırmasını satıcı görüntüsüne dahil edebilir. Satıcı yapılandırması sağlanmadığında sistem yapılandırması satıcı uygulamaları ve hizmetleri için de kullanılır.

Watchdog, CarWatchdogManager aracılığıyla sistem API'lerini açığa çıkarır; bu, satıcı uygulamalarının veya hizmetlerinin satıcı yapılandırmasını istedikleri zaman güncellemesine olanak tanır.

Aşırı kullanım konfigürasyonu tanımı

Aşırı kullanım yapılandırması, sistem, satıcı ve üçüncü taraf gibi bileşen türüne göre bölünür. OEM'ler yalnızca satıcı bileşeni yapılandırmasını güncellemelidir.

Satıcı yapılandırması

Satıcı yapılandırması, tüm satıcı uygulamaları ve hizmetleri ile tüm haritalar ve medya uygulamaları için disk G/Ç aşırı kullanım eşiklerini ve eylemlerini tanımlar. Yapılandırma aşağıdaki yapılandırma alanlarını içerir.

  • Vendor package prefixes . Satıcı bölümünde kurulu olan tüm paketler satıcı paketleri olarak kabul edilir. Bu paketlere ek olarak satıcılar, paket öneklerini vendor package prefixes önekleri yapılandırmasına ekleyerek önceden kurulmuş paketleri satıcı paketleri olarak sınıflandırabilirler. Bu yapılandırma normal ifadeleri kabul etmiyor.
  • Safe-to-terminate packages . Satıcılar safe-to-terminate packages yapılandırmasına tam paket adlarını ekleyerek hangi satıcı paketlerinin sonlandırılmasının güvenli olduğunu belirtebilir.
  • Application category mappings . Satıcılar herhangi bir paketi (üçüncü taraf paketleri dahil) desteklenen iki uygulama kategorisinden biri olan Harita ve Medya uygulamalarıyla eşleyebilir. Bu eşleme, haritalara ve medya uygulamalarına daha yüksek disk G/Ç aşırı kullanım eşikleri sağlamak için yapılır; çünkü bu uygulamalar, diğer uygulama türlerine göre diske daha fazla veri indirme ve diske yazma eğilimindedir.
  • Component level thresholds . Tüm satıcı paketleri için genel eşikleri tanımlar (yani, Package specific thresholds veya Application category specific thresholds kapsamında olmayan paketler bu eşikleri alır). Satıcılar, disk G/Ç aşırı kullanım yapılandırmasını tanımlarken sıfır olmayan bileşen düzeyi eşiklerini tanımlamalıdır.
  • Package specific thresholds . Satıcılar, belirli satıcı paketleri için özel eşikler tanımlayabilir. Eşlemeler paket adlarının tamamını içermelidir. Bu yapılandırmada tanımlanan eşikler, belirli bir paket için diğer yapılandırmalarda tanımlanan eşiklere göre önceliklidir.
  • Application category specific thresholds . Satıcılar belirli uygulama kategorileri için özel eşikler belirleyebilir. Uygulama kategorileri desteklenen kategorilerden biri olmalıdır: Haritalar ve Medya uygulamaları. Bu yapılandırmada tanımlanan eşikler, Application category mappings kullanılarak belirli paketlerle eşlenir.
  • System-wide thresholds . Satıcılar bu yapılandırmayı belirtmemelidir.

Vendor package prefixes , Safe-to-terminate packages , Component level thresholds ve Package specific thresholds yapılandırmaları yalnızca satıcı uygulamaları ve hizmetleri için satıcı yapılandırması tarafından güncellenebilir. Application category specific thresholds yapılandırması, tüm haritalar ve medya uygulamaları için yalnızca satıcı yapılandırması tarafından güncellenebilir.

Aşırı kullanım eşikleri, sırasında yazılmasına izin verilen bayt miktarını içerir.

  • Arka plan moduna karşı uygulama/hizmet ön plan modu
  • ve sistem garaj modu.

Bu sınıflandırma, kullanıcının ön plandaki uygulamalara/hizmetlere dönük olarak arka plandaki uygulamalara/hizmetlere göre daha fazla veri yazmasına olanak tanır. Garaj modunda uygulamalar ve hizmetler güncellemeleri indirme eğiliminde olduğundan her biri, diğer modlarda çalışan uygulama ve hizmetlerden daha yüksek bir eşiğe ihtiyaç duyar.

Sistem ve üçüncü taraf yapılandırmaları

OEM'ler sistemi ve üçüncü taraf yapılandırmalarını güncellememelidir .

  • Sistem yapılandırması, sistem uygulamaları ve hizmetleri için G/Ç aşırı kullanım eşiklerini ve eylemlerini tanımlar.
    • Bu yapılandırma aynı zamanda Application category mappings de güncelleyebilir. Böylece bu yapılandırma alanı sistem ve satıcı yapılandırmaları arasında paylaşılır.
  • Üçüncü taraf yapılandırması, tüm üçüncü taraf uygulamalar için eşikleri tanımlar. Sisteme önceden yüklenmemiş tüm uygulamalar üçüncü taraf uygulamalardır.
    • Eşikleri satıcı yapılandırması tarafından tanımlanan haritalar ve medya uygulamaları dışında tüm üçüncü taraf uygulamalar aynı eşikleri alır (örneğin, hiçbir üçüncü taraf uygulaması özel eşikler almaz).
    • Aşağıdaki disk G/Ç aşırı kullanım eşikleri, üçüncü taraf uygulamalar için varsayılan eşiklerdir. Bu eşikler sistem görüntüsüyle birlikte gönderilir.
      • Uygulama ön plan modunda 3 GiB yazma.
      • Uygulama arka plan modunda 2 GiB yazma.
      • Sistem garaj modunda 4 GiB yazma.
    • Bunlar temel eşiklerdir. Disk G/Ç kullanımını daha iyi anladığımız için bu eşikler güncellenmektedir.

Yapılandırma XML biçiminin aşırı kullanılması

Varsayılan satıcı yapılandırması, yapı görüntüsündeki /vendor/etc/automotive/watchdog/resource_overuse_configuration.xml konumuna yerleştirilebilir (bu isteğe bağlıdır ). Bu yapılandırma belirtilmediğinde sistem tanımlı yapılandırma, satıcı uygulamaları ve hizmetleri için de uygulanır.

XML dosyası her yapılandırma alanı için yalnızca bir etiket içermelidir. G/Ç aşırı kullanım yapılandırması XML dosyasında tanımlanmalıdır. Tüm eşik değerleri MiB ünitesinde belirtilmelidir.

Aşağıda örnek bir XML yapılandırması verilmiştir:

<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>

Aşırı kullanım yapılandırmasını CarWatchdogManager sistem API'leri aracılığıyla güncelleyin

Yukarıdaki XML yapılandırması yalnızca yapı görüntüsünde sağlanabilir. Bir OEM, bir yapı yayınlandıktan sonra cihaz üzerindeki yapılandırmayı güncellemeyi seçerse, cihaz üzerindeki yapılandırmada değişiklik yapmak için aşağıdaki API'leri kullanabilir.

  • Arayan kişiye Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG iznini verin.
  • Yeni yapılandırmaları güncellemek ve ayarlamak için mevcut yapılandırmaların kullanılması gerekir . Mevcut yapılandırmaları almak için CarWatchdogManager.getResourceOveruseConfigurations API'sini kullanın. Mevcut konfigürasyonlar kullanılmazsa tüm konfigürasyonların (sistem ve üçüncü taraf konfigürasyonları dahil) üzerine yazılır ve bu önerilmez.
  • Mevcut konfigürasyonları delta değişiklikleriyle güncelleyin ve yeni konfigürasyonları ayarlayın. Sistemi ve üçüncü taraf bileşen yapılandırmalarını güncellemeyin .
  • Yeni yapılandırmaları ayarlamak için CarWatchdogManager.setResourceOveruseConfigurations API'sini kullanın.
  • Disk G/Ç aşırı kullanım yapılandırmalarını almak ve ayarlamak için CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO bayrağını kullanın.

Kaynağın aşırı kullanımı yapılandırmalarını güncelleyen örnek bir uygulamayı burada bulabilirsiniz:

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();
}

Kaynakların aşırı kullanımını izleyen uygulamalar

Satıcı ve üçüncü taraf uygulamalar, Watchdog'dan gelen uygulamaya özel kaynak aşırı kullanım bildirimlerini dinleyebilir veya son 30 güne kadar uygulamaya özel kaynak aşırı kullanım istatistikleri için CarWatchdogManager yoklayabilir.

Kaynakların aşırı kullanımı bildirimlerini dinleyin

Uygulamalar, bir kaynak aşırı kullanımı dinleyicisi uygulayabilir ve disk G/Ç aşırı kullanım eşiklerinin %80'ini veya %100'ünü aştığında uygulamaya özel bildirimler almak için dinleyiciyi CarWatchdogManager kaydedebilir. Uygulamalar bu bildirimleri şu amaçlarla kullanabilir:

  • Çevrimdışı analiz için disk G/Ç aşırı kullanım istatistiklerini günlüğe kaydedin. Uygulama geliştiricileri, disk G/Ç'nin aşırı kullanımı sorununu ayıklamak için bu günlüğü kullanabilir.
  • Aşırı kullanım sayaçları sıfırlanana kadar disk G/Ç yazma işlemlerini azaltın.

Java istemcisi

  1. CarWatchdogManager.ResourceOveruseListener devralarak dinleyiciyi uygulayın:
    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);
    }
    
    çağırarak dinleyici örneğini kaydedin.
  3. Uygulama şunu dinlemeyi bitirdiğinde dinleyici örneğinin kaydını kaldırın:
    private void removeResourceOveruseListener() {
        CarWatchdogManager manager =
                (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);
        mCarWatchdogManager.removeResourceOveruseListener(
              mListenerImpl);
    }
    

Yerli Müşteri

  1. carwatchdog_aidl_interface-ndk_platform derleme kuralının shared_libs bağımlılığına ekleyin.

    Android.bp

    cc_binary {
        name: "sample_native_client",
        srcs: [
            "src/*.cpp"
        ],
        shared_libs: [
            "carwatchdog_aidl_interface-ndk_platform",
            "libbinder_ndk",
        ],
        vendor: true,
    }
    
  2. Satıcı hizmet etki alanının bağlayıcıyı ( binder_user makrosu) kullanmasına izin vermek ve satıcı hizmet etki alanını carwatchdog istemci etki alanına (carwatchdog_client_domain macro) eklemek için SELinux politikasını ekleyin. sample_client.te ve file_contexts için aşağıdaki koda bakın.

    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 devralarak kaynak aşırı kullanımı dinleyicisini uygulayın. Kaynak aşırı kullanımı bildirimlerini işlemek için BnResourceOveruseListener::onOveruse geçersiz kılın.

    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. Bir ciltleyici iş parçacığı havuzu başlatın ve kaynağın aşırı kullanımı dinleyicisini izleme sunucusuna kaydedin. Watchdog sunucusu android.automotive.watchdog.ICarWatchdog/default hizmet adı altında kayıtlıdır.

    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);
    }
    

Anket kaynağının aşırı kullanım istatistikleri

Uygulamalar, en son 30 güne ait uygulamaya özel I/O aşırı kullanım istatistikleri ATS için CarWatchdogManager'ı yoklayabilir.

Java istemcisi

Kaynağın aşırı kullanım istatistiklerini almak için CarWatchdogManager.getResourceOveruseStats kullanın. Disk G/Ç aşırı kullanım istatistiklerini almak için CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO bayrağını iletin.

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()
}

Yerli Müşteri

Kaynağın aşırı kullanım istatistiklerini almak için CarWatchdogServer.getResourceOveruseStats kullanın. Disk G/Ç aşırı kullanım istatistiklerini almak için ResourceType.IO numaralandırmasını iletin.

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
      }
}

Kaynakların aşırı kullanımı UX

Uygulama performansı ayarına öncelik verin

Uygulama ayarları sayfasında, kullanıcının bir uygulamanın performansını sistem ve uzun vadeli donanım performansına göre önceliklendirmesine olanak tanıyan Prioritize app performance ayarları (aşağıdaki resme bakın) bulunur. Bu ayar yalnızca kaynağın aşırı kullanımı durumunda sonlandırılması güvenli olan uygulamalar için kullanılabilir. Aksi halde bu ayar gri renkte görünür. Bir uygulama için bu ayar kapatıldığında (varsayılan ayar), kaynakların aşırı kullanımı durumunda uygulama sonlandırılabilir. Aksi halde, kaynağın aşırı kullanımı nedeniyle uygulama sonlandırılmaz.

Kullanıcı bu ayara geçiş yaptığında, aşağıdaki onay iletişim kutusu, ayarın değiştirilmesinin sonuçlarını açıklar.

90 gün sonra bu ayar otomatik olarak varsayılana sıfırlanır. Gün sınırı, watchdogUserPackageSettingsResetDays kullanılarak bir RRO yer paylaşımı uygulamasıyla maksimum 180 güne kadar değiştirilebilir. Daha fazla bilgi edinmek için bkz. Çalışma zamanında bir uygulamanın kaynaklarının değerini değiştirme . Aşağıdaki örnek yer paylaşımı etiketi AndroidManifest.xml dosyasına eklenebilir:

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

res/values/config.xml dosyasında:

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

res/xml/overlays.xml dosyasında:

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

Kullanıcı bildirimi

Bir uygulama veya hizmet belirli bir süre içinde sürekli olarak disk G/Ç'sini aşırı kullandığında (örneğin, diske tanımlanmış eşik değerlerinin ötesinde veri yazdığında) ve aşırı kaynak kullanımı durumunda sonlandırılmanın güvenli olduğu durumlarda, araç izin verilen sürücüye girdikten sonra kullanıcı bilgilendirilir. -dikkat dağıtma durumu.

İlk kullanıcı bildirimi (sürüş sırasında) bir ön bildirim olarak yayınlanır ve diğer bildirimler bildirim merkezinde yayınlanır.

Örneğin, bir uygulama sürekli olarak disk G/Ç'yi aşırı kullandığında kullanıcı aşağıdaki bildirimi alır:

  • Kullanıcı Uygulamaya öncelik ver düğmesini tıkladığında, uygulamanın ayarlar sayfası başlatılır; burada kullanıcı , uygulama performansına öncelik ver ayarını açıp kapatabilir.
  • Kullanıcı Uygulamayı devre dışı bırak düğmesini tıkladığında, kullanıcı uygulamayı başlatana veya uygulamanın ayarlar sayfasında etkinleştirene kadar uygulama devre dışı bırakılır.
  • Kaldırılabilir uygulamalar için, Uygulamayı devre dışı bırak düğmesinin yerini Uygulamayı kaldır düğmesi alır. Kullanıcı Uygulamayı kaldır düğmesine tıkladığında, kullanıcının uygulamayı kaldırabileceği uygulamanın Ayarlar sayfası başlatılır.

Başlatıcı uygulamasına yönelik öneri

Kaynakların aşırı kullanımı nedeniyle uygulamalar devre dışı bırakıldığında, CarService uygulamaların etkin durumunu PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED olarak güncellediği için uygulamalar varsayılan başlatıcı uygulamasından kaybolur. OEM'lerin, bu uygulamaları alışılmadık şekilde görüntüleyecek şekilde yerleşik başlatıcı uygulamasını güncellemesi gerekir; böylece kullanıcılar gerektiğinde bunları kullanabilir. Derleme sürümüne dayalı olarak aşağıdaki önerilere bakın.

Android SC V2 sürümü