Watchdog monitoruje wykorzystanie pamięci flash, śledząc łączną ilość operacji wejścia-wyjścia dysku zapisy generowane przez wszystkie aplikacje i usługi korzystające ze statystyk wejścia-wyjścia dla poszczególnych dysków UID ujawnione przez jądro w lokalizacji `/proc/uid_io/stats`. Gdy aplikacja lub usługa przekroczy próg przeciążenia dysku wejścia-wyjścia, Watchdog podejmuje działania aplikacji lub usługi. Progi przeciążenia dysku wejścia-wyjścia oraz działania, jakie należy podjąć, w przypadku przeciążenia jest wstępnie zdefiniowany w konfiguracji wejścia-wyjścia dysku.
Progi przeciążenia
- Progi przeciążenia dysku I/O są egzekwowane codziennie, czyli wszystkie zapisy dokonane przez aplikację/usługę są agregowane od początku bieżącego dnia kalendarzowego UTC i sprawdzić pod kątem progów zdefiniowanych w nadużywania konfiguracji.
- Jeśli pojazd zostanie uruchomiony wiele razy w danym dniu, moduł Watchdog przechowuje statystyki wykorzystania wejścia-wyjścia dysku w pamięci flash i agreguje je od momentu, od początku bieżącego dnia kalendarzowego w strefie czasowej UTC.
Nadużywanie działań
Gdy aplikacja wielokrotnie przekracza zdefiniowane nadużycie wejścia/wyjścia dysku progów, Watchdog podejmuje działania zdefiniowane w konfiguracji nadużywania.
- Wszystkie aplikacje i usługi dostawców są uznawane za krytyczne ogólną stabilność systemu, dzięki czemu nie są przerywane w przypadku nadmiernego obciążenia dysku. Pamiętaj jednak: konfiguracja nadużywania może zdefiniować listę bezpiecznych do zamknięcia aplikacji dostawcy i usług.
- Możesz bezpiecznie zamknąć wszystkie aplikacje innych firm.
Gdy można bezpiecznie zamknąć aplikację lub usługę, Watchdog wyłącza ją wraz z nią.
stan komponentu
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
Konfiguracja nadużywania
Konfiguracja przeciążenia zawiera progi nadmiarowego obciążenia dysku I/O oraz . Domyślne konfiguracje nadużywania są zdefiniowane w systemie i dostawcy które są wysyłane razem z kompilacją. Dostawcy mogą opcjonalnie dodać dostawcę konfiguracji w obrazie dostawcy. Gdy konfiguracja dostawcy jest inna niż jeśli zostanie udostępniony, konfiguracja systemu będzie używana na potrzeby aplikacji dostawcy, usług Google.
Watchdog ujawnia systemowe interfejsy API za pomocą interfejsu CarWatchdogManager
, co pozwala
aplikacje lub usługi dostawców aktualizują konfigurację dostawcy,
w każdej chwili.
Definicja konfiguracji nadużywania
Konfiguracja nadużywania jest dzielona według typu komponentu, np. system, dostawca, i firm zewnętrznych. OEM może aktualizować tylko konfigurację komponentu dostawcy.
Konfiguracja dostawcy
Konfiguracja dostawcy określa progi nadużywania wejścia/wyjścia dysku i działania dla wszystkie aplikacje i usługi dostawców oraz wszystkie aplikacje z mapami i multimediami. Konfiguracja zawiera poniższe pola konfiguracji.
- Prefiksy pakietu dostawców. Wszystkie pakiety zainstalowane w partycja dostawcy jest uznawana za pakiety dostawców. Oprócz tego Dostawcy mogą klasyfikować wstępnie zainstalowane pakiety jako pakiety dostawcy, dodając prefiksy pakietu do konfiguracji prefiksów pakietów dostawców. Ta konfiguracja nie akceptuje wyrażeń regularnych.
- Bezpieczne zamykanie przesyłek. Dostawcy mogą określić, pakiety można bezpiecznie zakończyć, dodając ich pełne nazwy do safe-to-terminate.
- Mapowanie kategorii aplikacji. Dostawcy mogą mapować dowolne pakiety (w tym pakietów innych firm) na jedną z dwóch obsługiwanych aplikacji. kategorie – Mapy i multimedia. Odwzorowanie to ma na celu udostępnienie map aplikacji do multimediów i aplikacji do multimediów wyższe progi przeciążenia dysku aplikacje pobierają i zapisują na dysku więcej danych niż inne .
- Progi na poziomie komponentu. Określa ogólne progi dla wszystkich pakiety dostawcy (czyli pakiety, których nie obejmuje pakiet wartości progowe lub progi dla kategorii aplikacji, te progi). Gdy dostawcy muszą zdefiniować progi na poziomie niezerowym, przez zdefiniowanie konfiguracji nadmiarowego wykorzystania operacji wejścia-wyjścia dysku.
- Progi dla konkretnego pakietu. Dostawcy mogą określić specjalne dla określonych pakietów dostawców. Mapowanie powinno zawierać parametr i pełnych nazw pakietów. Progi określone w tej konfiguracji mają pierwszeństwo przekracza progi zdefiniowane w innych konfiguracjach danego pakietu.
- Progi dla poszczególnych kategorii aplikacji. Dostawcy mogą określić specjalne progi dla określonych kategorii aplikacji. Aplikacja Należy wybrać jedną z obsługiwanych kategorii – Mapy i Media aplikacji. Progi określone w tej konfiguracji są zmapowane na określone pakietów za pomocą mapowań kategorii aplikacji.
- Progi w całym systemie. Dostawcy nie mogą określać tej konfiguracji.
Prefiksy pakietów dostawców, Bezpieczne zamykanie pakietów, Progi na poziomie komponentu i Progi dla poszczególnych pakietów konfiguracji progów można zaktualizować tylko przez konfigurację dostawcy dla aplikacje i usługi dostawców. Zależnie od kategorii aplikacji konfigurację progów można zaktualizować tylko przez konfigurację dostawcy dla wszystkich aplikacje z mapami i multimediami.
Progi przeciążenia określają liczbę bajtów, które można zapisać podczas:
- Aplikacja lub usługa w trybie na pierwszym planie a tryb w tle
- Tryb garażu systemowego
Ta klasyfikacja umożliwia aplikacjom i usługom skierowanym do użytkowników na pierwszym planie zapisywać więcej danych niż aplikacje i usługi działające w tle. W trybie garażowym aplikacje i usługi zwykle pobierają aktualizacje, więc każde z nich wymaga wyższego progu niż aplikacje i usługi działające w innych trybach.
Konfiguracje systemu i innych firm
OEM nie powinien aktualizować konfiguracji systemu ani innych firm.
- Konfiguracja systemu definiuje progi nadużywania wejścia-wyjścia i działania dla
aplikacji i usług systemowych.
- Ta konfiguracja może również zaktualizować kategorię aplikacji . Dzięki temu to pole konfiguracji jest wspólne dla systemu i dostawcy konfiguracji.
- Konfiguracja firmy zewnętrznej definiuje progi dla wszystkich
aplikacji. Wszystkie aplikacje, które nie są wstępnie zainstalowane w systemie,
aplikacje innych firm.
- Wszystkie aplikacje innych firm otrzymują te same progi (np. brak aplikacja innej firmy otrzymuje specjalne progi), z wyjątkiem map i multimediów aplikacji, których progi są określone w konfiguracji dostawcy.
- Poniższe progi przeciążenia dysku wejścia-wyjścia to domyślne progi dla
aplikacje innych firm. Progi te są wysyłane z obrazem systemu.
- 3 GiB zapisu w trybie pierwszego planu aplikacji.
- 2 GiB zapisu w trybie aplikacji w tle.
- 4 GiB zapisu w trybie garażu systemu.
- To są progi podstawowe. Te progi są aktualizowane w miarę uzyskiwania coraz większej ilości informacji o operacjach wejścia-wyjścia dysku i ich wykorzystaniu.
Nadużywanie formatu XML konfiguracji
Domyślną konfigurację dostawcy można umieścić (są to opcjonalne) w lokalizacji.
/vendor/etc/automotive/watchdog/resource_overuse_configuration.xml
w obrazie kompilacji. Jeśli ta konfiguracja nie jest określona, definiowany przez system
jest stosowana również w przypadku aplikacji i usług dostawców.
Plik XML powinien zawierać tylko 1 tag na każde pole konfiguracji. Nadużywanie wejścia/wyjścia konfigurację należy zdefiniować w pliku XML. Wszystkie wartości progowe powinny określona w jednostce MiB.
Przykładowa konfiguracja XML:
<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>
Zaktualizuj konfigurację nadmiarowego wykorzystania za pomocą systemowych interfejsów API CarWatchdogManager
Powyższą konfigurację XML można podać tylko w obrazie kompilacji. Jeśli OEM decyduje się zaktualizować konfigurację na urządzeniu po opublikowaniu kompilacji. mogą używać poniższych interfejsów API, aby wprowadzać zmiany w konfiguracji na urządzeniu.
- Przyznaj uprawnienie
Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG
. - Musi użyć istniejących konfiguracji, aby zaktualizować i ustawić
nowe konfiguracje. Korzystanie z interfejsu API
CarWatchdogManager.getResourceOveruseConfigurations
, aby uzyskać istniejące konfiguracje. Jeśli istniejące konfiguracje nie są używane, wszystkie konfiguracje (w tym konfiguracje systemu i innych firm) są co nie jest zalecane. - Zaktualizuj istniejące konfiguracje o zmiany delta i ustaw nowe konfiguracji. Nie aktualizuj systemu ani komponentu innej firmy. konfiguracji.
- Użyj interfejsu API
CarWatchdogManager.setResourceOveruseConfigurations
aby ustawić nowe konfiguracje. - Aby pobrać i ustawić nadmiarowe operacje wejścia-wyjścia dysku, użyj flagi
CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO
Oto przykładowa implementacja, która aktualizuje konfiguracje nadużywania zasobów:
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(); }
Aplikacje monitorujące nadmiarowe zasoby
Aplikacje dostawcy i innych firm mogą nasłuchiwać zasobów związanych z aplikacją
nadużywanie powiadomień z usługi Watchdog lub ankiety CarWatchdogManager
dotyczącej aplikacji
statystyki nadużywania określonych zasobów z ostatnich 30 dni.
Wykrywaj powiadomienia o nadmiarowym wykorzystaniu zasobów
Aplikacje mogą implementować detektor nadmiarowego wykorzystania zasobów i rejestrować
detektor z CarWatchdogManager
, aby otrzymywać powiadomienia z określonej aplikacji,
przekroczenie 80% lub 100% progów przeciążenia dysku. Aplikacje mogą używać:
te powiadomienia, aby:
- Rejestruj statystyki nadużywania wejścia/wyjścia dysku na potrzeby analizy offline. Promująca aplikację deweloperzy mogą korzystać z tego rejestrowania do debugowania problemu z nadużywaniem wejścia/wyjścia dysku.
- Ogranicz liczbę operacji wejścia-wyjścia dysku, dopóki liczniki nadużywania nie zostaną zresetowane.
Klient Java
- Zaimplementuj detektor, stosując dziedziczenie
CarWatchdogManager.ResourceOveruseListener
: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() } } }
- Rejestrowanie instancji odbiornika przez wywołanie
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); }
- Wyrejestruj instancję detektora, gdy aplikacja zakończy nasłuchiwanie:
private void removeResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); mCarWatchdogManager.removeResourceOveruseListener( mListenerImpl); }
Klient natywny
- Uwzględnij
carwatchdog_aidl_interface-ndk_platform
wshared_libs
zależność reguły kompilacji.Android.bp
cc_binary { name: "sample_native_client", srcs: [ "src/*.cpp" ], shared_libs: [ "carwatchdog_aidl_interface-ndk_platform", "libbinder_ndk", ], vendor: true, }
- Dodaj zasadę SELinux, aby umożliwić domenie usługi dostawcy używanie segregatora
(makro
binder_user
) i dodaj domenę usługi dostawcy do polacarwatchdog
domena klienta(carwatchdog_client_domain macro)
. Zobacz poniższy kod dlasample_client.te
orazfile_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
- Wdróż detektor nadmiarowego wykorzystania zasobów przez dziedziczenie
BnResourceOveruseListener
ZastąpBnResourceOveruseListener::onOveruse
, aby zapobiec nadużywaniu zasobów powiadomienia.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(); }
- Uruchom pulę wątków Binder i zarejestruj detektor nadmiarowego wykorzystania zasobów
z serwerem watchdoga. Serwer watchdog jest zarejestrowany pod nazwą usługi
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); }
Statystyki przeciążenia zasobów ankiety
Aplikacje mogą sondować usługę CarWatchdogManager pod kątem przeciążenia wejścia-wyjścia w danej aplikacji. statystyki ATS z ostatnich 30 dni.
Klient Java
Użyj kodu CarWatchdogManager.getResourceOveruseStats
, aby uzyskać
statystyki nadużywania zasobów. Miń CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO
flagę, aby pobrać statystyki przeciążenia dysku.
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() }
Klient natywny
Użyj kodu CarWatchdogServer.getResourceOveruseStats
, aby uzyskać
statystyki nadużywania zasobów. Przekaż enum ResourceType.IO
, aby pobrać nadużywanie wejścia/wyjścia dysku
statystyk.
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 } }
Nadużywanie zasobów – wrażenia użytkowników
W sekcjach poniżej opisano wrażenia użytkowników w przypadku nadużywania zasobów.
Ustawienie priorytetu wydajności aplikacji
Strona Ustawienia aplikacji zawiera ustawienia aplikacji Prioritize app performance
(zobacz ilustrację poniżej), która pozwala użytkownikom priorytetowo traktować wydajność aplikacji względem działania systemu
długoterminową wydajność sprzętu. To ustawienie jest dostępne tylko w przypadku aplikacji, które można bezpiecznie
zakończone w przypadku nadmiarowego wykorzystania zasobów. W przeciwnym razie ustawienie jest wyłączone. Gdy to ustawienie jest
wyłączone (ustawienie domyślne) dla aplikacji, aplikacja może zostać zamknięta w przypadku nadużywania zasobów.
W przeciwnym razie aplikacja nie zostanie zamknięta w przypadku nadużywania zasobów.
Gdy użytkownik włączy to ustawienie, w oknie potwierdzenia zobaczysz opis konsekwencje przełączenia ustawienia:
Po 90 dniach to ustawienie jest automatycznie resetowane do wartości domyślnych. Limit dzienny może być
zmodyfikowane za pomocą nakładki RRO za pomocą watchdogUserPackageSettingsResetDays
,
maksymalnie 180 dni. Więcej informacji:
Zmień wartość zasobów aplikacji w czasie działania
w AndroidManifest.xml
można umieścić następujący przykładowy tag nakładki:
<overlay android:priority="<insert-value>" android:targetPackage="com.android.car.updatable" android:targetName="CarServiceCustomization" android:resourcesMap="@xml/overlays" />
W aplikacji res/values/config.xml
:
<resources> <integer name="watchdogUserPackageSettingsResetDays">value</integer> </resources>
W aplikacji res/xml/overlays.xml
:
<overlay> <item target="integer/watchdogUserPackageSettingsResetDays" value="@integer/watchdogUserPackageSettingsResetDays" /> </overlay>
Ustawienie „Aplikacje wpływające na wydajność”
Aplikacja Ustawienia zawiera sekcję Aplikacje wpływające na wydajność. (zobacz ilustrację 1). Po kliknięciu pojawi się lista aplikacji, które zostały zablokowane ze względu na pamięć flash które mają negatywny wpływ na wydajność systemu. Te informacje są następujące Wymagania CD 3.5.1 [C-1-1].
Rysunek 1. Aplikacje wpływające na wydajność.
Tutaj znajdziesz listę aplikacji zamkniętych z powodu nadużywania zasobów (zobacz ilustrację 2). Wymienione aplikacje mogą być traktowane priorytetowo. Więcej informacji: Nadawanie priorytetów ustawieniom wydajności aplikacji.
Rysunek 2. Lista aplikacji zamkniętych z powodu nadużywania zasobów.
Powiadomienie użytkownika
Gdy aplikacja lub usługa wielokrotnie nadużywa operacji wejścia-wyjścia dysku (np. zapisuje danych na dysk powyżej zdefiniowanych progów) w określonym czasie i jest bezpieczny zostanie zakończone w przypadku nadmiernego wykorzystania zasobów, użytkownik zostanie powiadomiony, gdy pojazd wjedzie na stan allow-driver-distraction.
Pierwsze powiadomienie dla użytkownika (podczas jazdy) jest publikowane jako ostrzeżenie. i pozostałe powiadomienia znajdziesz na nim pomocy.
Jeśli na przykład aplikacja wielokrotnie nadużywa operacji wejścia-wyjścia dysku, użytkownik otrzymuje to powiadomienie:
- Gdy użytkownik kliknie przycisk Nadaj priorytet aplikacji, otwiera stronę ustawień aplikacji, gdzie użytkownik może włączyć lub wyłączyć Nadaj priorytet wydajności aplikacji.
- Gdy użytkownik kliknie przycisk Wyłącz aplikację, jest wyłączona, dopóki użytkownik nie uruchomi aplikacji lub nie włączy jej ustawień.
- W przypadku aplikacji, które można odinstalować, przycisk Wyłącz aplikację jest zastąpiono przyciskiem Odinstaluj aplikację. Gdy użytkownik kliknie Odinstaluj aplikację, otworzy się strona Ustawienia aplikacji, z którego użytkownik może odinstalować aplikację.
Zalecenie dotyczące implementacji programu uruchamiającego
Gdy aplikacje są wyłączane z powodu nadużywania zasobów, aplikacje znikają
domyślną aplikacją uruchamiającą, bo CarService aktualizuje stan włączenia:
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
OEM musi zaktualizować implementację wbudowanego programu uruchamiającego, by wyświetlać te aplikacje jako nietypowe,
aby użytkownicy mogli
w razie potrzeby korzystać z nich. Zapoznaj się z zaleceniami przedstawionymi poniżej w zależności od wersji kompilacji.
Wersja Androida SC V2
- Implementacja programu uruchamiającego powinna używać funkcji
MATCH_DISABLED_UNTIL_USED_COMPONENTS
flagę tego typu podczas pobierania listy pakietów wyświetlanych w programie uruchamiającym. - Gdy użytkownik kliknie aplikację znajdującą się w
Stan
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
, program uruchamiający Aplikacja musi włączyć aplikację, ustawiając stan włączenia na: