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
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() } } }
CarWatchdogManager.addResourceOveruseListener
çağrısını yaparak dinleyici örneğini kaydedinprivate 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); }
- 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
- Derleme kuralının
shared_libs
bağımlılıklarınacarwatchdog_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, }
- 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
vefile_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
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çinBnResourceOveruseListener::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(); }
- 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.
Ş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.
Ş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ü
- Başlatıcı uygulaması, başlatıcıda gösterilecek paketlerin listesini alırken
MATCH_DISABLED_UNTIL_USED_COMPONENTS
işaretini kullanmalıdır. - Kullanıcı
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
durumundaki bir uygulamayı tıkladığında, başlatıcı uygulaması etkin durumu şu şekilde ayarlayarak uygulamayı etkinleştirmelidir: