Flash bellek kullanımını izleme

Watchdog, çekirdek tarafından `/proc/uid_io/stats` konumunda kullanıma sunulan UID başına disk G/Ç istatistiklerini kullanarak tüm uygulamalar ve hizmetler tarafından yapılan toplam disk G/Ç yazma işlemleri 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 işlem yapar. Disk G/Ç aşırı kullanım eşikleri ve aşırı kullanım durumunda yapılacak işlem, disk G/Ç aşırı kullanım yapılandırmasında önceden tanımlanı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, mevcut UTC takvim gününün başından itibaren 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 depolar ve mevcut UTC takvim gününün başlangıcından itibaren bunları toplar.

Aşırı kullanım işlemleri

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 işlemleri gerçekleştirir.

  • Tüm sağlayıcı uygulamaları ve hizmetleri, genel sistem kararlılığı açısından kritik öneme sahip olduğundan disk G/Ç'sinin aşırı kullanılması nedeniyle sonlandırılmaz. Ancak, aşırı kullanım yapılandırması, sonlandırılması güvenli olan satıcı uygulamalarının ve hizmetlerinin bir listesini tanımlayabilir.
  • Tüm üçüncü taraf uygulamaları güvenli bir şekilde sonlandırılabilir.

Bir uygulama veya hizmet güvenli bir şekilde sonlandırılabilir 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 işlemlerini içerir. Varsayılan aşırı kullanım yapılandırmaları sistemde ve satıcı resimlerinde tanımlanır ve derlemeyle birlikte gönderilir. Satıcılar, satıcı yapılandırmasını satıcı resmine isteğe bağlı olarak ekleyebilir. Sağlayıcı yapılandırması sağlanmadığında, sağlayıcı uygulamaları ve hizmetleri için de sistem yapılandırması kullanılır.

Watchdog, sistem API'lerini CarWatchdogManager üzerinden kullanıma sunar. Bu sayede satıcı uygulamaları veya hizmetleri, satıcı yapılandırmasını istedikleri zaman güncelleyebilir.

Aşırı kullanım yapılandırma tanımı

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

Tedarikçi yapılandırması

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

  • Sağlayıcı paket ön ekleri. Tedarikçi bölümüne yüklenen tüm paketler, tedarikçi paketi olarak kabul edilir. Tedarikçiler, bu paketlere ek olarak, paket öneklerini vendor package prefixes yapılandırmasına ekleyerek önceden yüklenmiş paketleri tedarikçi paketi olarak sınıflandırabilir. Bu yapılandırma, normal ifadeleri kabul etmez.
  • Sonlandırılması güvenli paketler. Tedarikçiler, paket adlarının tamamını safe-to-terminate packages yapılandırmasına ekleyerek hangi tedarikçi paketlerinin sonlandırılmasının güvenli olduğunu belirtebilir.
  • Uygulama kategorisi eşlemeleri. Satıcılar, üçüncü taraf paketleri de dahil olmak üzere tüm paketleri desteklenen iki uygulama kategorisinden biriyle (Harita ve Medya uygulamaları) eşleyebilir. Bu eşleme, harita ve medya uygulamalarının diğer uygulama türlerine kıyasla daha fazla veri indirip diske yazdığı için bu uygulamalara daha yüksek disk G/Ç aşırı kullanım eşikleri sağlamak amacıyla yapılır.
  • Bileşen düzeyi eşikleri. Tüm tedarikçi paketleri için genel eşikler tanımlar (yani Pakete özel eşikler veya Uygulama kategorisine özel eşikler kapsamına girmeyen paketler bu eşikleri alır). Tedarikçiler, disk G/Ç aşırı kullanım yapılandırmasını tanımlarken sıfır olmayan bileşen düzeyinde eşikler tanımlamalıdır.
  • Pakete özel eşikler. Tedarikçiler, belirli tedarikçi 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.
  • Uygulama kategorisine özgü eşikler. Sağlayı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, uygulama kategorisi eşlemeleri kullanılarak belirli paketlerle eşlenir.
  • Sistem genelinde eşikler. Tedarikçiler bu yapılandırmayı belirtmemelidir.

Satıcı paketi önekleri, Güvenli sonlandırılabilen paketler, Bileşen düzeyinde eşikler ve Pakete özel eşikler yapılandırmaları yalnızca satıcı uygulamaları ve hizmetleri için satıcı yapılandırmasıyla güncellenebilir. Uygulama kategorisine özel eşikler yapılandırması yalnızca tüm harita ve medya uygulamaları için satıcı yapılandırması tarafından güncellenebilir.

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

  • Uygulama veya hizmetin ön plan modu ile arka plan modu arasındaki fark
  • Sistem garaj modu

Bu sınıflandırma, kullanıcıya yönelik ön plan uygulamalarının ve hizmetlerinin arka plan uygulamalarından ve hizmetlerinden daha fazla veri yazmasına olanak tanır. Garaj modunda uygulamalar ve hizmetler güncellemeleri indirmeye eğilimlidir. Bu nedenle, her birinin diğer modlarda çalışan uygulamalardan ve hizmetlerden daha yüksek bir eşiğe ihtiyacı vardır.

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

OEM'ler sistem 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 işlemlerini tanımlar.
    • Bu yapılandırma, Uygulama kategorisi eşlemelerini de güncelleyebilir. Bu nedenle, bu yapılandırma alanı sistem ve tedarikçi 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 uygulamalarıdır.
    • Tedarikçi yapılandırmasıyla eşikler tanımlanmış olan harita ve medya uygulamaları hariç olmak üzere, tüm üçüncü taraf uygulamaları aynı eşikleri alır (ör. hiçbir üçüncü taraf uygulaması özel eşik 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 GB yazma
      • Uygulama arka plan modunda 2 GB yazma
      • Sistem garaj modunda 4 GB yazma
    • Bunlar temel eşiklerdir. Bu eşikler, disk G/Ç kullanımı hakkında daha fazla bilgi edinildikçe güncellenir.

Aşırı kullanım yapılandırması XML biçimi

Varsayılan satıcı yapılandırması, derleme görüntüsünde /vendor/etc/automotive/watchdog/resource_overuse_configuration.xml konumuna yerleştirilebilir (isteğe bağlıdır). Bu yapılandırma belirtilmediğinde, satıcı uygulamaları ve hizmetleri için de sistem tarafından tanımlanan yapılandırma 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 biriminde belirtilmelidir.

Örnek bir XML yapılandırması aşağıda 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>

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

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

  • Arayana Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG iznini verin.
  • Yeni yapılandırmaları güncellemek ve ayarlamak için mevcut yapılandırmaları kullanmanız gerekir. Mevcut yapılandırmaları almak için API'yi CarWatchdogManager.getResourceOveruseConfigurations kullanın. Mevcut yapılandırmalar kullanılmazsa sistem ve üçüncü taraf yapılandırmaları da dahil olmak üzere tüm yapılandırmaların üzerine yazılır. Bu durum önerilmez.
  • Mevcut yapılandırmaları delta değişiklikleriyle güncelleyin ve yeni yapılandırmaları ayarlayın. Sistemi ve üçüncü taraf bileşen yapılandırmalarını güncellemeyin.
  • Yeni yapılandırmaları ayarlamak için API'yi CarWatchdogManager.setResourceOveruseConfigurations kullanın.
  • Disk G/Ç aşırı kullanım yapılandırmalarını almak ve ayarlamak için CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO işaretini kullanın.

Kaynak aşırı kullanım yapılandırmalarını güncelleyen örnek bir uygulama aşağıda verilmiştir:

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

Sağlayıcı ve üçüncü taraf uygulamaları, Watchdog'dan 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 yoklama yapabilir.

Kaynak aşırı kullanımıyla ilgili bildirimleri dinleme

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

  • Çevrimdışı analiz için disk G/Ç aşırı kullanım istatistiklerini kaydedin. Uygulama geliştiriciler, disk G/Ç'sinin 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 öğesini devralarak işleyiciyi 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 işlevini çağırarak işleyici örneğini kaydedin.
    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. Uygulama dinlemeyi bitirdiğinde dinleyici örneğinin kaydını silin:
    private void removeResourceOveruseListener() {
        CarWatchdogManager manager =
                (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);
        mCarWatchdogManager.removeResourceOveruseListener(
              mListenerImpl);
    }

Yerel istemci

  1. Derleme kuralının shared_libs bağımlılığına carwatchdog_aidl_interface-ndk_platform öğesini ekleyin.

    Android.bp

    cc_binary {
        name: "sample_native_client",
        srcs: [
            "src/*.cpp"
        ],
        shared_libs: [
            "carwatchdog_aidl_interface-ndk_platform",
            "libbinder_ndk",
        ],
        vendor: true,
    }
  2. Tedarikçi hizmet alanının bağlayıcıyı (binder_user makrosu) kullanmasına izin vermek için SELinux politikası ekleyin ve tedarikçi hizmet alanını carwatchdog istemci alanına (carwatchdog_client_domain macro) 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. Kaynak aşırı kullanım dinleyicisini BnResourceOveruseListener öğesini devralarak uygulayın. Kaynak aşırı kullanımıyla ilgili bildirimleri 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. Bağlayıcı iş parçacığı havuzunu başlatın ve kaynak aşırı kullanım dinleyicisini watchdog sunucusuna kaydedin. Watchdog sunucusu, hizmet adı altında kaydedilir 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);
    }

Kaynak aşırı kullanım istatistiklerini yoklama

Uygulamalar, son 30 güne ait uygulamaya özel G/Ç aşırı kullanım istatistikleri için CarWatchdogManager'ı sorgulayabilir.

Java istemcisi

Kaynak aşırı kullanım istatistiklerini almak için CarWatchdogManager.getResourceOveruseStats komutunu kullanın. Disk G/Ç'nin aşırı kullanımıyla ilgili istatistikleri almak için CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO işaretini 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()
}

Yerel istemci

Kaynak aşırı kullanım istatistiklerini almak için CarWatchdogServer.getResourceOveruseStats komutunu kullanın. Disk G/Ç aşırı kullanım istatistiklerini getirmek için ResourceType.IO enum'unu 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
      }
}

Aşırı kaynak kullanımı kullanıcı deneyimi

Aşağıdaki bölümlerde, kaynak aşırı kullanımı gerçekleştiğinde kullanıcı deneyimi açıklanmaktadır.

Uygulama performansı öncelikli ayarı

Uygulama Ayarlar sayfasında, kullanıcıların bir uygulamanın performansına sistem ve uzun vadeli donanım performansından daha fazla öncelik vermesine olanak tanıyan Prioritize app performance ayarları bulunur (aşağıdaki resme bakın). Bu ayar yalnızca kaynakların aşırı kullanılması durumunda sonlandırılması güvenli olan uygulamalar için kullanılabilir. Aksi takdirde bu ayar devre dışı bırakılır. Bu ayar bir uygulama için devre dışı bırakıldığında (varsayılan ayar) uygulama, kaynakların aşırı kullanılması nedeniyle sonlandırılabilir. Aksi takdirde, uygulama kaynak aşırı kullanımı nedeniyle sonlandırılmaz.

Kullanıcı bu ayarı etkinleştirdiğinde, ayarın etkinleştirilmesinin sonuçlarını açıklayan aşağıdaki onay iletişim kutusu gösterilir:

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 değiştirilebilir ve en fazla 180 gün olabilir. Daha fazla bilgi için Çalışma zamanında bir uygulamanın kaynaklarının değerini değiştirme başlıklı makaleyi inceleyin. Aşağıdaki örnek yer paylaşımı etiketi AndroidManifest.xml'ya eklenebilir:

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

res/values/config.xml içinde:

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

res/xml/overlays.xml içinde:

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

Performansı etkileyen uygulamalar ayarı

Ayarlar uygulamasında Performansı etkileyen uygulamalar bölümü bulunur (Şekil 1'e bakın). Dokunulduğunda, flash bellek aşırı kullanımı nedeniyle kısıtlanan ve sistem performansını olumsuz etkileyen uygulamaların listesi gösterilir. Bu, CDD 3.5.1 şartına [C-1-1] uygundur.

Performansı etkileyen uygulamalar

1. şekil. Performansı etkileyen uygulamalar.

Kaynakların aşırı kullanılması nedeniyle sonlandırılan uygulamalar burada listelenir (Şekil 2'ye bakın). Listelenen uygulamalara öncelik verilebilir. Daha fazla bilgi edinmek için Uygulama performansına öncelik verme ayarı başlıklı makaleyi inceleyin.

Kaynakların aşırı kullanımı nedeniyle sonlandırılan uygulamaların listesi

Şekil 2. Kaynakların aşırı kullanılması nedeniyle sonlandırılan uygulamaların listesi.

Kullanıcı bildirimi

Bir uygulama veya hizmet, belirli bir süre içinde disk G/Ç'yi tekrar tekrar aşırı kullandığında (ör. tanımlanan eşiklerin ötesinde diske veri yazdığında) ve kaynak aşırı kullanımı nedeniyle sonlandırılması güvenli olduğunda, araç sürücünün dikkatini dağıtmaya izin verilen duruma girdikten sonra kullanıcıya bildirim gönderilir.

İlk kullanıcı bildirimi (sürüş sırasında) uyarı bildirimi olarak yayınlanır. Diğer bildirimler ise bildirim merkezinde yayınlanır.

Örneğin, bir uygulama disk G/Ç'yi tekrar tekrar 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ı açılır. Kullanıcı bu sayfada Uygulama performansına öncelik ver ayarını etkinleştirebilir veya devre dışı bırakabilir.
  • Kullanıcı Uygulamayı devre dışı bırak düğmesini tıkladığında uygulama, kullanıcı uygulamayı başlatana veya uygulamanın ayarlar sayfasında etkinleştirene kadar devre dışı kalır.
  • Kaldırılamayan uygulamalarda Uygulamayı devre dışı bırak düğmesinin yerini Uygulamayı kaldır düğmesi alır. Kullanıcı Uygulamayı kaldır düğmesini tıkladığında uygulamanın Ayarlar sayfası açılır. Kullanıcı bu sayfadan uygulamayı kaldırabilir.

Başlatıcı uygulamasıyla ilgili öneri

Uygulamalar kaynakların aşırı kullanılması nedeniyle 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ı her zamanki gibi göstermek için yerleşik başlatıcı uygulamasını güncellemesi gerekir. Böylece kullanıcılar, gerektiğinde bu uygulamaları kullanabilir. Derleme sürümüne göre aşağıdaki önerilere göz atın.

Android SC V2 sürümü