Flash bellek kullanımını izleme

Watchdog, toplam disk G/Ç miktarını izleyerek flash bellek kullanımını izler UID başına disk G/Ç istatistiklerini kullanarak tüm uygulamalar ve hizmetler tarafından yapılan yazma işlemleri Kernel tarafından "/proc/uid_io/stats" konumunda gösterilir. Uygulama veya hizmet disk G/Ç aşırı kullanım eşiğini aşarsa Watchdog uygulama veya hizmet. Disk G/Ç aşırı kullanım eşikleri ve yapılacak işlem on aşırı kullanımda, 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 yazmalar, uygulamanın başlangıcından geçerli UTC takvim gününde ve aşırı kullanım yapılandırmaları.
  • Bir araç belirli bir günde birden çok kez çalıştırıldığında, Watchdog modülü disk G/O kullanım istatistiklerini flash bellekte saklar ve geçerli UTC takvim gününün başlangıcı.

Aşırı kullanım işlemleri

Bir uygulama, tanımlanan disk G/Ç aşırı kullanımını sürekli olarak aştığında takip etmek istemiyorsanız Watchdog, aşırı kullanım yapılandırmasında belirtilen işlemleri gerçekleştirir.

  • Tedarikçi firma uygulamaları ve hizmetlerinin tümü dolayısıyla disk G/Ç aşırı kullanımında sonlandırılmazlar. Ancak, Aşırı kullanım yapılandırması, sonlandırması güvenli tedarikçi uygulamalarının listesini tanımlayabilir ve hizmetler.
  • Tüm üçüncü taraf uygulamaları güvenle feshedilebilir.

Bir uygulamanın veya hizmetin feshedilmesi güvenli olduğunda, Watchdog uygulamayı veya hizmeti uygulama ile devre dışı bırakır bileşen durumu PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED

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

Aşırı kullanım yapılandırması, disk G/Ç aşırı kullanım eşiklerini ve işlemlerdir. Varsayılan aşırı kullanım yapılandırmaları sistemde ve satıcıda tanımlanmıştır resimleri ve yapıyla birlikte gönderilir. Tedarikçiler isteğe bağlı olarak yapılandırmaya değineceğiz. Tedarikçi firma yapılandırması sağlandığında sistem yapılandırması tedarikçinin uygulamaları ve ayarlayabilirsiniz.

Watchdog, sistem API'lerini CarWatchdogManager üzerinden kullanıma sunarak tedarikçi firma uygulamaları veya hizmetleri tedarikçi firma yapılandırmasını güncelleme devam edebilir.

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

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

Tedarikçi firma yapılandırması

Tedarikçi firma yapılandırması, aşağıdakiler için disk G/Ç aşırı kullanım eşiklerini ve işlemlerini tanımlar tüm tedarikçi firma uygulamaları ile hizmetleri ve haritalar ile medya uygulamaları dahil. İlgili içeriği oluşturmak için kullanılan yapılandırması aşağıdaki yapılandırma alanlarını içerir.

  • Tedarikçi firma paketi önekleri. tedarikçi bölümü, tedarikçi firma paketleri olarak kabul edilir. Bunlara ek olarak birlikte, tedarikçiler önceden yüklenmiş paketleri tedarikçi firma paketleri olarak sınıflandırıp sağlayıcı paketi önekleri yapılandırmasına paket önekleri ekleyerek. Bu yapılandırmada normal ifadeler kabul edilmiyor.
  • Sonlandırması güvenli paketler. Tedarikçiler hangi tedarikçinin paketlerin sonlandırılmasının güvenli olup olmadığını, paket adlarının tamamını güvenli sonlandırma paketleri yapılandırmasını içerir.
  • Uygulama kategorisi eşlemeleri. Tedarikçiler herhangi bir paketi eşleyebilir (üçüncü taraf paketleri dahil), desteklenen iki uygulamadan birine Haritalar ve Medya uygulamaları. Bu eşleme, Google Haritalar'daki daha yüksek disk G/Ç aşırı kullanım eşikleri uygulamalar, diğer uygulamalara kıyasla diske daha fazla veri indirip yazma eğiliminde bulunur.
  • Bileşen düzeyinde eşikler. Tümü için genel eşikler tanımlar Pakete özel eşikler veya Uygulama kategorisine özel eşikler alın söz konusu eşikler). Tedarikçi firmalar aşağıdaki durumlarda sıfır olmayan bileşen düzeyinde eşikler tanımlamalıdır: disk G/Ç aşırı kullanım yapılandırmasını tanımlıyor.
  • Pakete özgü eşikler. Tedarikçiler özel olarak eşiklerini geçmeye çalışır. Eşlemeler tam paket isimleri. Bu yapılandırmada tanımlanan eşikler önceliklidir eşik değerinin üzerinde çalışır.
  • Uygulama kategorisine özel eşikler. Tedarikçi firmalar, Belirli uygulama kategorileri için özel eşikler. Uygulama kategoriler desteklenen kategorilerden biri olmalıdır - Haritalar ve Medya Bu yapılandırmada tanımlanan eşikler, belirli bir Uygulama kategorisi eşlemelerini kullanarak paket paketlerini yeniden gönderebilirsiniz.
  • Sistem genelindeki eşikler. Tedarikçi firmalar bu yapılandırmayı belirtmemelidir.

Sağlayıcı paketi önekleri, Sonlandırması güvenli paketler, Bileşen düzeyinde eşikler ve Pakete özel Eşikler yapılandırmalarını yalnızca şunun için tedarikçi firma yapılandırması tarafından güncellenebilir: tedarikçi firma uygulamaları ve hizmetleridir. Uygulama kategorisine özel Eşikler yapılandırması, tüm cihazlar için yalnızca tedarikçi firma yapılandırması haritalar ve medya uyg.

Aşırı kullanım eşikleri, şu kısımlarda yazılmasına izin verilen bayt miktarını içerir:

  • Uygulama veya hizmet ön plan modu ile arka plan modu karşılaştırması
  • Garaj sistemi modu

Bu sınıflandırma, kullanıcılara yönelik ön plan uygulamaları ve hizmetlerinin arka plan uygulamaları ve hizmetlerinden daha fazla veri yazma. Garaj modunda, Uygulama ve hizmetler güncelleme indirme eğiliminde olduğundan her biri için daha yüksek bir eşiğe ihtiyaç vardır diğer modlarda çalışan uygulama ve hizmetlere kıyasla daha fazla.

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

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

  • Sistem yapılandırması, aşağıdakiler için G/Ç aşırı kullanım eşiklerini ve işlemlerini tanımlar sistem uygulamaları ve hizmetleri.
    • Bu yapılandırma, Uygulama kategorisini eşleme öğeleri için de kullanılabilir. Bu nedenle, bu yapılandırma alanı sistem ve tedarikçi firma arasında yapılandırmanın üç yolu vardır.
  • Üçüncü taraf yapılandırması, tüm üçüncü tarafların eşiklerini tanımlar Sisteme önceden yüklenmemiş tüm uygulamalar üçüncü taraf uygulamaları.
    • Tüm üçüncü taraf uygulamaları aynı eşikleri alır (örneğin, Haritalar ve medya hariç olmak üzere üçüncü taraf uygulaması özel eşikler alır.) (Eşikleri tedarikçi firma yapılandırması tarafından tanımlanan uygulamalar)
    • Aşağıdaki disk G/Ç aşırı kullanım eşikleri, üçüncü taraf uygulamaları. Bu eşikler sistem görüntüsüyle birlikte gönderilir.
      • 3 Uygulama ön plan modunda yazma GiB
      • 2 Uygulama arka plan modunda yazma GiB.
      • 4 GiB sistemi, Garaj modunda yazma.
    • Bunlar, taban eşiklerdir. Disk G/Ç hakkında daha fazla bilgi edinildikçe bu eşikler güncellenir bazı yolları da görmüştük.

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

Varsayılan tedarikçi firma yapılandırması, konuma yerleştirilebilir (bu isteğe bağlıdır). /vendor/etc/automotive/watchdog/resource_overuse_configuration.xml tıklayın. Bu yapılandırma belirtilmediğinde, sistem tarafından yapılandırmasının tedarikçi firma uygulamaları ve hizmetleri için de uygulandığını öğrendik.

XML dosyası, her yapılandırma alanı için yalnızca bir etiket içermelidir. G/Ç aşırı kullanımı XML dosyasında tanımlanmalıdır. Tüm eşik değerleri şöyle olmalıdır: MiB biriminde belirtilir.

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 görüntüsünde sağlanabilir. Bir OEM, bir derleme yayınlandıktan sonra cihaz üzerindeki yapılandırmayı güncellemeyi tercih ederse, cihaz üzerindeki yapılandırmada değişiklik yapmak için aşağıdaki API'leri kullanabilir.

  • Şuna Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG izni verin: arayan
  • Güncellemek ve ayarlamak için mevcut yapılandırmaları kullanmalıdır. yeni yapılandırmalar var. API'yi kullanma CarWatchdogManager.getResourceOveruseConfigurations kazanmak için yapılandırma. Mevcut yapılandırmalar kullanılmıyorsa yapılandırma (sistem ve üçüncü taraf yapılandırmaları dahil) Bu da önerilmez.
  • Mevcut yapılandırmaları delta değişiklikleriyle güncelle ve yeni yapılandırmanın üç yolu vardır. Sistemi ve üçüncü taraf bileşenini güncellemeyin yapılandırmanın üç yolu vardır.
  • CarWatchdogManager.setResourceOveruseConfigurations API'sini kullanma kullanın.
  • Disk G/Ç aşırı kullanım yapılandırmalarını almak ve ayarlamak için işareti kullanın CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO

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ı, uygulamaya özel kaynakları dinleyebilir Uygulama için Watchdog veya CarWatchdogManager anketinden gelen bildirimleri aşırı kullan son 30 güne kadarki belirli kaynak aşırı kullanım istatistikleri.

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

Uygulamalar bir kaynak aşırı kullanım işleyicisi uygulayabilir ve dinleyicileri CarWatchdogManager ile bir araya geldiğinde uygulamaya özel bildirimler %80 veya% 100'ünü aşmış durumda. Uygulamalar, bu bildirimleri:

  • Çevrimdışı analiz için disk G/Ç aşırı kullanım istatistiklerinizi günlüğe kaydedin. Uygulaması geliştiriciler disk G/Ç aşırı kullanımı sorununu gidermek için bu günlük kaydını kullanabilir.
  • Aşırı kullanım sayaçları sıfırlanana kadar disk G/Ç yazmalarını 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. Şu çağrıyı yaparak işleyici örneğini kaydedin: 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. Uygulama, dinlemeyi tamamladığında dinleyici örneğinin kaydını silin:
    private void removeResourceOveruseListener() {
        CarWatchdogManager manager =
                (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);
        mCarWatchdogManager.removeResourceOveruseListener(
              mListenerImpl);
    }
    
    .

Yerel istemci

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

    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ı kullanmasına izin vermek için SELinux politikası ekleme (binder_user makrosu) ve tedarikçi firma hizmet alan adını carwatchdog istemci alanı (carwatchdog_client_domain macro). sample_client.te ve 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. Devralarak kaynak aşırı kullanım işleyicisini uygulama BnResourceOveruseListener Geçersiz kıl Aşırı kaynak kullanımını yönetmek için BnResourceOveruseListener::onOveruse bildirimleri etkinleştirebilirsiniz.

    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ığı havuzu başlatın ve kaynak aşırı kullanım işleyicisini kaydedin ile başlayalım. Watchdog sunucusu, hizmet adı altında kayıtlı 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);
    }
    

Anket kaynaklarının aşırı kullanımı istatistikleri

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

Java istemcisi

CarWatchdogManager.getResourceOveruseStats hareketini kullanarak kaynak kullanımı istatistikleri. CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO paslarını geçin işaretini kaldırın.

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

CarWatchdogServer.getResourceOveruseStats hareketini kullanarak kaynak kullanımı istatistikleri. Disk G/Ç aşırı kullanımını getirmek için ResourceType.IO numaralandırmasını iletin istatistikler.

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, kaynakların aşırı kullanımı gerçekleştiğinde yaşanacak kullanıcı deneyimi açıklanmaktadır.

Uygulama performansı ayarına öncelik ver

Uygulamanın Ayarlar sayfasında Prioritize app performance ile ilgili ayarlar bulunur (aşağıdaki resme bakın) sayesinde kullanıcılar sisteme kıyasla bir uygulamanın performansına ve ne kadar iyi karşıladığını görebileceksiniz. Bu ayar yalnızca kullanılması güvenli olan uygulamalar için kullanılabilir kaynak aşırı kullanımı nedeniyle sonlandırılır. Aksi takdirde bu ayar devre dışı bırakılır. Bu ayar ayarı kapatılırsa (varsayılan ayar), kaynakların aşırı kullanılması durumunda uygulama sonlandırılabilir. Aksi takdirde uygulama, kaynakların aşırı kullanımı nedeniyle sonlandırılmaz.

Kullanıcı bu ayarı etkinleştirdiğinde aşağıdaki onay iletişim kutusunda ayarı açma/kapatmanın etkileri:

90 gün sonra bu ayar otomatik olarak varsayılan değere sıfırlanır. Gün sınırı, watchdogUserPackageSettingsResetDays kullanılarak bir RRO yer paylaşımlı uygulamasıyla değiştirildi, en fazla 180 gün olabilir. Daha fazla bilgi edinmek için bkz. Çalışma zamanında uygulama kaynaklarının değerini değiştirme. İlgili içeriği oluşturmak için kullanılan aşağıdaki örnek yer paylaşımı etiketi AndroidManifest.xml öğesine dahil edilebilir:

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

res/values/config.xml ürününde:

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

res/xml/overlays.xml ürününde:

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

Performansı etkileyen uygulama ayarı

Ayarlar uygulamasında Performansı etkileyen uygulamalar bölümü bulunur (bkz. Şekil 1). Dokunulduğunda, flash bellek nedeniyle kısıtlanan uygulamaların listesi ve sistem performansını olumsuz etkileyen faktörlerin hangileri olduğunu belirtmeniz gerekir. Bu, CDD 3.5.1 şartı [C-1-1].

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 uygulamalar şunları yapabilir: yardımcı olur. Daha fazla bilgi edinmek için bkz. Uygulama performansı ayarına öncelik verin.

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

Şekil 2. Aşırı kaynak kullanımı nedeniyle sonlandırılan uygulamaların listesi.

Kullanıcı bildirimi

Bir uygulama veya hizmet, disk G/Ç'sini sürekli olarak aşırı kullandığında (örneğin, verileri belirli bir süre içinde diske kaydetmesi ve güvenli olması gerekir. kaynak aşırı kullanımı nedeniyle sonlandırılmasını istiyorsanız araç, sisteme girip sürücünün dikkatini dağıtmasına izin verme durumundadır.

İlk kullanıcı bildirimi (sürüş sırasında) uyarı olarak yayınlanır bildirim ve diğer bildirimler bildirimde yayınlanır yardım etmek istiyorum.

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

  • Kullanıcı Uygulamaya öncelik ver düğmesini tıkladığında Kullanıcının, uygulamanın ayarlarını açıp kapatabileceği ayarlar sayfası Uygulama performansına öncelik verin ayarı.
  • Kullanıcı Uygulamayı devre dışı bırak düğmesini tıkladığında uygulama Kullanıcı uygulamayı başlatana veya uygulamada etkinleştirene kadar devre dışı bırakılır ayarlar sayfasına gidin.
ziyaret edin.
  • Kaldırılabilir uygulamalar için Uygulamayı devre dışı bırak düğmesi Uygulamayı kaldır düğmesiyle değiştirilir. Kullanıcı, Uygulamayı kaldır düğmesi, uygulamanın Ayarlar sayfası başlatılır, kaldırabileceği yer.

Başlatıcı uygulama önerisi

Uygulamalar kaynağın aşırı kullanımı nedeniyle devre dışı bırakıldığında birincil başlatıcı uygulamasıdır, çünkü CarService etkin durumu şu şekilde: PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED OEM'ler, bu uygulamaları olağan dışı olarak göstermek için yerleşik başlatıcı uygulamasını güncellemelidir. Böylece kullanıcılar gerekli olduğunda bunları kullanabilir. Derleme sürümüne dayalı olarak aşağıdaki önerileri inceleyin.

Android SC V2 sürümü

ziyaret edin.