Flash bellek kullanımını izleme

Watchdog, Kernel'in "/proc/uid_io/stats" konumunda gösterdiği UID başına disk G/Ç istatistiklerini kullanarak tüm uygulamalar ve hizmetler tarafından yapılan disk G/Ç yazmalarının toplam 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 I/O 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şından itibaren toplanır ve aşırı kullanım yapılandırmalarında tanımlanan eşiklerle karşılaştırılır.
  • 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 geçerli UTC takvim gününün başlangıcından itibaren toplar.

Aşırı kullanım işlemleri

Bir uygulama, tanımlanan disk I/O 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 tedarikçi firma uygulamaları ve hizmetleri, genel sistem kararlılığı açısından kritik öneme sahiptir. Bu nedenle, disk G/Ç aşırı kullanımında sonlandırılmazlar. Ancak aşırı kullanım yapılandırması, sonlandırılabilecek tedarikçi firma uygulama ve hizmetlerinin bir listesini tanımlayabilir.
  • Tüm üçüncü taraf uygulamaları güvenli bir şekilde sonlandırılabilir.

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 I/O aşırı kullanım eşiklerini ve işlemlerini içerir. Varsayılan aşırı kullanım yapılandırmaları sistem ve tedarikçi firma resimlerinde tanımlanır ve derlemeyle birlikte gönderilir. Tedarikçiler isteğe bağlı olarak tedarikçi yapılandırmasını tedarikçi resmine ekleyebilir. Tedarikçi firma yapılandırması sağlanmadığında sistem yapılandırması, tedarikçi firma uygulamaları ve hizmetleri için de kullanılır.

Watchdog, tedarikçi firma uygulamalarının veya hizmetlerinin tedarikçi firma yapılandırmasını her zaman güncellemesine olanak tanıyan sistem API'lerini CarWatchdogManager üzerinden sunar.

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

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

Tedarikçi firma yapılandırması

Tedarikçi firma yapılandırması, tüm tedarikçi firma uygulamaları ve hizmetleri ile tüm haritalar ve medya uygulamaları için disk I/O'nun aşırı kullanımıyla ilgili eşikleri ve işlemleri tanımlar. Yapılandırma, aşağıdaki yapılandırma alanlarını içerir.

  • Sağlayıcı paket ön ekleri. Satıcı bölümüne yüklenen tüm paketler satıcı paketleri olarak kabul edilir. Tedarikçi firmalar, bu paketlere ek olarak tedarikçi firma paketi ön ekleri yapılandırmasına paket ön ekleriyle birlikte önceden yüklenmiş paketleri de ekleyerek tedarikçi firma paketleri olarak sınıflandırabilir. Bu yapılandırma normal ifadeleri kabul etmez.
  • Sonlandırması güvenli paketler. Tedarikçi firmalar, safe-to-terminate packages yapılandırmasına paket adlarının tamamını ekleyerek hangi tedarikçi firma paketlerinin kapatılmasının güvenli olduğunu belirtebilir.
  • Uygulama kategorisi eşlemeleri. Tedarikçi firmalar, herhangi bir paketi (üçüncü taraf paketleri dahil) desteklenen iki uygulama kategorisinden biri olan Harita ve Medya uygulamalarıyla eşleyebilir. Bu eşleme, harita ve medya uygulamalarına daha yüksek disk I/O aşırı kullanımı eşikleri sağlamak için yapılır. Bu uygulamalar, diğer uygulama türlerine kıyasla diske daha fazla veri indirip yazma eğilimindedir.
  • Bileşen düzeyinde eşikler. Tüm tedarikçi paketleri için genel eşikler tanımlar (yani Pakete özgü eşikler veya Uygulama kategorisine özgü eşikler kapsamında olmayan paketler bu eşikleri alır). Tedarikçi firmalar, disk I/O'nun 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 özgü eşikler. Tedarikçi firmalar, belirli tedarikçi firma 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 özel eşikler. Tedarikçiler belirli uygulama kategorileri için özel eşikler belirleyebilir. Uygulama kategorileri, Haritalar ve Medya uygulamaları gibi desteklenen kategorilerden biri olmalıdır. Bu yapılandırmada tanımlanan eşikler, uygulama kategorisi eşlemeleri kullanılarak belirli paketlerle eşlenir.
  • Sistem genelinde eşikler. Tedarikçi firmalar bu yapılandırmayı belirtmemelidir.

Satıcı paketi ön ekleri, Sona erdirilebilecek paketler, Bileşen düzeyi eşikler ve Pakete özgü eşikler yapılandırmaları yalnızca satıcı uygulamaları ve hizmetleri için satıcı yapılandırması tarafından güncellenebilir. Uygulama kategorisine özel eşikler yapılandırması, tüm harita ve medya uygulamaları için yalnızca tedarikçi 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 hizmet ön plan modu ile arka plan modu karşılaştırması
  • Sistem garaj modu

Bu sınıflandırma, kullanıcılara 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 genellikle güncellemeleri indirir. Bu nedenle her biri, diğer modlarda çalışan uygulama ve hizmetlerden daha yüksek 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 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.
    • Üçüncü taraf uygulamaların tümü aynı eşikleri alır (ör. hiçbir üçüncü taraf uygulaması özel eşikler almaz). Harita ve medya uygulamaları ise eşikleri tedarikçi firma yapılandırması tarafından tanımlanır.
    • Aşağıdaki disk I/O 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, taban eşiklerdir. Disk G/Ç kullanımı hakkında daha fazla bilgi edinildikçe bu eşikler güncellenir.

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

Varsayılan tedarikçi firma yapılandırması, derleme görüntüsünün /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 tarafından tanımlanan yapılandırma, tedarikçi firma 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 biriminde 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>

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 resminde sağlanabilir. Bir OEM, bir derleme 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ı Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG iznini verin.
  • Yeni yapılandırmaları güncellemek ve ayarlamak için mevcut yapılandırmaları kullanmalıdır. Mevcut yapılandırmaları almak için CarWatchdogManager.getResourceOveruseConfigurations API'yi kullanın. Mevcut yapılandırmalar kullanılmazsa tüm yapılandırmaların (sistem ve üçüncü taraf yapılandırmaları dahil) üzerine yazılır. Bu işlem önerilmez.
  • Mevcut yapılandırmaları delta değişiklikleriyle güncelleyin ve yeni yapılandırmaları ayarlayın. Sistem 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 I/O aşırı kullanımı yapılandırmalarını almak ve ayarlamak için CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO işaretini kullanın.

Aşağıda, kaynakların aşırı kullanımı yapılandırmalarını güncelleyen bir örnek uygulama 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

Tedarikçi firma ve üçüncü taraf uygulamaları, Watchdog'tan uygulamaya özgü kaynak kullanımının aşırı olmasıyla ilgili bildirimleri dinleyebilir veya son 30 güne kadar uygulamaya özgü kaynak kullanımının aşırı olmasıyla ilgili istatistikler için CarWatchdogManager'ü sorgulayabilir.

Kaynak aşırı kullanımı bildirimlerini dinle

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

  • Çevrimdışı analiz için disk I/O aşırı kullanımı istatistiklerini günlüğe kaydedin. Uygulama geliştiriciler, disk I/O'nun aşırı kullanımıyla ilgili sorunları gidermek için bu günlük kaydını kullanabilir.
  • Aşırı kullanım sayaçları sıfırlanana kadar disk I/O 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 çağrısını yaparak dinleyici ö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 aşağıdakileri 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ıklarına carwatchdog_aidl_interface-ndk_platform 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 firma hizmet alanının binder'ı (binder_user makrosu) kullanmasına izin vermek için SELinux politikası ekleyin ve tedarikçi firma 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. BnResourceOveruseListener öğesini devralarak kaynak kullanımının aşırı olması dinleyicisini uygulayın. Kaynakların aşırı kullanımına dair bildirimleri yönetmek için BnResourceOveruseListener::onOveruse değerini 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 bağlayıcı iş parçacığı havuzu başlatın ve kaynak kullanımının aşırı olması dinleyicisini gözetmen sunucuya kaydedin. Watchdog sunucusu, android.automotive.watchdog.ICarWatchdog/default hizmet adıyla kayıtlı.

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

Kaynakların aşırı kullanımıyla ilgili anket istatistikleri

Uygulamalar, son 30 gün içinde uygulamaya özgü I/O aşırı kullanımı istatistikleri ATS için CarWatchdogManager'ı sorgulayabilir.

Java istemcisi

Kaynakların aşırı kullanımıyla ilgili istatistikleri almak için CarWatchdogManager.getResourceOveruseStats seçeneğini kullanın. Disk G/Ç aşırı kullanım istatistiklerini almak için CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO işaretini geçin.

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

Kaynakların aşırı kullanımıyla ilgili istatistikleri almak için CarWatchdogServer.getResourceOveruseStats seçeneğini kullanın. Disk G/Ç aşırı kullanım istatistiklerini getirmek için ResourceType.IO derecelendirmesini 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
      }
}

Kullanıcı deneyimini kaynakların aşırı kullanması

Aşağıdaki bölümlerde, kaynak kullanımının aşırı olduğu durumlarda kullanıcı deneyimi açıklanmaktadır.

Uygulama performansına öncelik verme ayarı

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

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

Bu ayar 90 gün sonra otomatik olarak varsayılan ayarlara sıfırlanır. Gün sınırı, watchdogUserPackageSettingsResetDays kullanılarak en fazla 180 gün olacak şekilde bir RRO yer paylaşımı uygulamasıyla değiştirilebilir. Daha fazla bilgi için Uygulama kaynaklarının değerini çalışma zamanında değiştirme başlıklı makaleyi inceleyin. Aşağıdaki örnek yer paylaşımı etiketi AndroidManifest.xml içine dahil edilebilir:

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

res/values/config.xml'te:

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

res/xml/overlays.xml'te:

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

Performansı etkileyen uygulamalar ayarı

Ayarlar uygulamasında Performansı etkileyen uygulamalar bölümü bulunur (bkz. Şekil 1). Bu simgeye dokunduğunuzda, flash belleğin aşırı kullanımı nedeniyle kısıtlanmış ve sistem performansını olumsuz yönde etkileyen uygulamaların listesi gösterilir. Bu, CDD 3.5.1 koşuluna [C-1-1] uygundur.

Performansı etkileyen uygulamalar

Şekil 1. Performansı etkileyen uygulamalar

Kaynakların aşırı kullanımı nedeniyle sonlandırılan uygulamalar burada listelenmiştir (bkz. Şekil 2). Listelenen uygulamalara öncelik verilebilir. Daha fazla bilgi için Uygulama performansı ayarına öncelik verme bölümüne bakın.

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

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

Kullanıcı bildirimi

Bir uygulama veya hizmet, belirli bir süre içinde disk G/Ç'sini tekrar tekrar aşırı kullandığında (örneğin, verileri tanımlanan eşiklerin ötesinde diske yazdığında) ve kaynakların aşırı kullanımı durumunda sonlandırılma açısından güvenli olduğunda, araç sürücünün dikkatini dağıtmaya izin verme durumuna geçtikten sonra kullanıcı bilgilendirilir.

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

Örneğin, bir uygulama disk G/Ç'yi sürekli olarak 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. Burada kullanıcı, 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ı tarafından başlatılana veya uygulamanın ayarlar sayfasından etkinleştirilene kadar devre dışı bırakılır.
  • Kaldırılabilir 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ının uygulanmasıyla ilgili öneri

Uygulamalar kaynak kullanımının aşırı olması nedeniyle devre dışı bırakıldığında CarService, uygulamaların etkin durumunu PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED olarak güncellediğinden uygulamalar varsayılan başlatıcı uygulamasından kaybolur. OEM'ler, bu uygulamaların gerektiğinde kullanıcılar tarafından kullanılabilmesi için yerleşik başlatıcı uygulamasını bu uygulamaları sıra dışı olarak gösterecek şekilde güncellemelidir. Derleme sürümüne göre aşağıdaki önerileri inceleyin.

Android SC V2 sürümü