Watchdog отслеживает использование флэш-памяти, контролируя общий объем операций записи на диск, выполняемых всеми приложениями и службами, используя статистику дискового ввода-вывода для каждого UID, предоставляемую ядром по адресу `/proc/uid_io/stats`. Когда приложение или служба превышает пороговое значение перегрузки дискового ввода-вывода, Watchdog предпринимает действия в отношении этого приложения или службы. Пороговые значения перегрузки дискового ввода-вывода и действия, которые необходимо предпринять при перегрузке, предварительно определены в конфигурации перегрузки дискового ввода-вывода.
Пороги чрезмерного использования
- Пороговые значения перегрузки дискового ввода-вывода применяются ежедневно, то есть все операции записи, выполненные приложением/сервисом с начала текущего календарного дня по UTC, суммируются и проверяются на соответствие пороговым значениям, определенным в настройках перегрузки.
- Когда автомобиль запускается несколько раз в течение дня, модуль Watchdog сохраняет статистику использования дискового ввода-вывода во флэш-памяти и суммирует ее с начала текущего календарного дня по UTC.
чрезмерное использование действий
Когда приложение неоднократно превышает заданные пороговые значения перегрузки дискового ввода-вывода, Watchdog предпринимает действия, определенные в конфигурации перегрузки.
- Все приложения и службы сторонних поставщиков считаются критически важными для общей стабильности системы, поэтому их работа не завершается при чрезмерном использовании дискового ввода-вывода. Однако в конфигурации защиты от чрезмерного использования можно определить список приложений и служб сторонних поставщиков, которые можно безопасно завершить.
- Все сторонние приложения можно безопасно закрыть.
Когда приложение или служба готовы к безопасному завершению, Watchdog отключает приложение или службу, сохраняя состояние компонента приложения PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED .
конфигурация чрезмерного использования
Настройки перегрузки содержат пороговые значения и действия по перегрузке дискового ввода-вывода. Настройки перегрузки по умолчанию определены в образах системы и поставщика и поставляются вместе со сборкой. Поставщики могут дополнительно включить конфигурацию поставщика в образ поставщика. Если конфигурация поставщика не предоставлена, для приложений и служб поставщика также используется конфигурация системы.
Watchdog предоставляет доступ к системным API через CarWatchdogManager , что позволяет приложениям или сервисам поставщиков обновлять конфигурацию поставщика в любое время.
Определение конфигурации для случаев чрезмерного использования
Избыточное использование конфигурации подразделяется по типу компонента, например, системный, от производителя и от стороннего поставщика. Производителям оборудования необходимо обновлять только конфигурацию компонентов от производителя.
Конфигурация поставщика
В конфигурации поставщика определяются пороговые значения и действия по превышению допустимого использования дискового ввода-вывода для всех приложений и служб поставщика, а также для всех картографических и медиаприложений. Конфигурация содержит следующие поля.
- Префиксы пакетов поставщика . Все пакеты, установленные в разделе поставщика, считаются пакетами поставщика. Помимо этих пакетов, поставщики могут классифицировать предустановленные пакеты как пакеты поставщика, добавив префиксы пакетов в конфигурацию префиксов пакетов поставщика . Эта конфигурация не принимает регулярные выражения.
- Пакеты, которые можно безопасно завершить . Производители могут указать, какие пакеты производителя можно безопасно завершить, добавив полные имена пакетов в конфигурацию пакетов, которые можно безопасно завершить .
- Сопоставление категорий приложений . Производители могут сопоставлять любой пакет (включая пакеты сторонних разработчиков) с одной из двух поддерживаемых категорий приложений — картографическими и мультимедийными. Это сопоставление выполняется для того, чтобы обеспечить картографическим и мультимедийным приложениям более высокие пороговые значения перегрузки дискового ввода-вывода, поскольку эти приложения, как правило, загружают и записывают на диск больше данных, чем другие типы приложений.
- Пороговые значения на уровне компонентов . Определяет общие пороговые значения для всех пакетов поставщика (то есть, эти пороговые значения применяются к пакетам, не охваченным пороговыми значениями, специфичными для пакета , или пороговыми значениями, специфичными для категории приложения ). Поставщики должны определять ненулевые пороговые значения на уровне компонентов при определении конфигурации перегрузки дискового ввода-вывода.
- Пороговые значения для конкретных пакетов . Производители могут определять специальные пороговые значения для конкретных пакетов. Сопоставления должны содержать полные имена пакетов. Пороговые значения, определенные в этой конфигурации, имеют приоритет над пороговыми значениями, определенными в других конфигурациях для данного пакета.
- Пороговые значения, специфичные для категорий приложений . Производители могут указывать специальные пороговые значения для конкретных категорий приложений. Категории приложений должны соответствовать одной из поддерживаемых категорий — «Карты» и «Медиа». Пороговые значения, определенные в этом файле конфигурации, сопоставляются с конкретными пакетами с помощью сопоставления категорий приложений .
- Системные пороговые значения . Производителям запрещено указывать эту конфигурацию.
Конфигурации префиксов пакетов поставщика , пакетов, безопасных для завершения , пороговых значений на уровне компонентов и пороговых значений для конкретных пакетов могут быть обновлены только в конфигурации поставщика для приложений и служб поставщика. Конфигурации пороговых значений для конкретных категорий приложений могут быть обновлены только в конфигурации поставщика для всех картографических и медиаприложений.
Пороговые значения превышения лимита содержат объем байтов, разрешенный для записи в течение:
- Режим работы приложения или сервиса на переднем плане и фоновый режим
- Режим гаража системы
Эта классификация позволяет приложениям и службам, работающим в фоновом режиме и взаимодействующим с пользователем, записывать больше данных, чем фоновым приложениям и службам. В режиме «Гараж» приложения и службы, как правило, загружают обновления, поэтому каждому из них требуется более высокий порог, чем приложениям и службам, работающим в других режимах.
Системные и сторонние конфигурации
Производителям оборудования не следует обновлять системные и сторонние конфигурации.
- Системная конфигурация определяет пороговые значения перегрузки ввода-вывода и действия для системных приложений и служб.
- Эта конфигурация также может обновлять сопоставления категорий приложений . Таким образом, это поле конфигурации используется совместно системными и заводскими конфигурациями.
- В настройках сторонних приложений задаются пороговые значения для всех сторонних приложений. Все приложения, не предустановленные в системе, являются сторонними приложениями.
- Для всех сторонних приложений установлены одинаковые пороговые значения (например, ни одно стороннее приложение не получает специальных пороговых значений), за исключением картографических и медиаприложений, для которых пороговые значения определяются конфигурацией поставщика.
- Приведенные ниже пороговые значения перегрузки дискового ввода-вывода являются значениями по умолчанию для сторонних приложений. Эти пороговые значения поставляются вместе с образом системы.
- Запись 3 ГиБ в режиме переднего плана приложения.
- Запись 2 ГиБ в фоновом режиме приложения.
- Запись 4 ГиБ в режиме системного хранилища.
- Это базовые пороговые значения. Эти пороговые значения обновляются по мере получения дополнительной информации об использовании дискового ввода-вывода.
Формат XML конфигурации для предотвращения чрезмерного использования
Дополнительно: В Android 16 и выше вы можете разместить конфигурацию поставщика по умолчанию в /vendor/etc/io-watchdog/resource_overuse_configuration.xml в образе сборки.
В Android 15 и более ранних версиях конфигурацию поставщика по умолчанию можно разместить в файле /vendor/etc/watchdog/resource_overuse_configuration.xml в образе сборки. Если эта конфигурация не указана, для приложений и служб поставщика также применяется конфигурация, определенная системой.
XML-файл должен содержать только один тег для каждого поля конфигурации. Конфигурация перегрузки ввода-вывода должна быть определена в XML-файле. Все пороговые значения должны быть указаны в единицах МиБ.
Ниже приведён пример 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>
Обновление конфигурации перегрузки через системные API CarWatchdogManager
Приведенная выше XML-конфигурация может быть предоставлена только в образе сборки. Если OEM-производитель решит обновить конфигурацию на устройстве после выпуска сборки, он может использовать следующие API для внесения изменений в конфигурацию на устройстве.
- Предоставьте вызывающей стороне разрешение
Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG. - Для обновления и установки новых конфигураций необходимо использовать существующие настройки. Для получения существующих конфигураций используйте API
CarWatchdogManager.getResourceOveruseConfigurations. Если существующие конфигурации не используются, все конфигурации (включая системные и сторонние) будут перезаписаны, что не рекомендуется. - Обновите существующие конфигурации с учетом внесенных изменений и установите новые параметры. Не обновляйте конфигурации системы и сторонних компонентов.
- Используйте API
CarWatchdogManager.setResourceOveruseConfigurationsдля установки новых параметров конфигурации. - Для получения и установки параметров перегрузки дискового ввода-вывода используйте флаг
CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO.
Вот пример реализации, обновляющий настройки перегрузки ресурсов:
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(); }
Приложения, отслеживающие чрезмерное использование ресурсов.
Приложения от поставщиков и сторонних разработчиков могут отслеживать уведомления о чрезмерном использовании ресурсов конкретными приложениями от Watchdog или запрашивать у CarWatchdogManager статистику чрезмерного использования ресурсов конкретными приложениями за последние 30 дней.
Отслеживайте уведомления о чрезмерном использовании ресурсов.
Приложения могут реализовать обработчик превышения лимита использования ресурсов и зарегистрировать его в CarWatchdogManager , чтобы получать уведомления, специфичные для приложения, когда оно превышает 80% или 100% от порогового значения превышения лимита использования дискового ввода-вывода. Приложения могут использовать эти уведомления для:
- Записывайте статистику перегрузки дискового ввода-вывода для анализа в автономном режиме. Разработчики приложений могут использовать эти записи для отладки проблемы перегрузки дискового ввода-вывода.
- Уменьшите количество операций записи на диск до тех пор, пока счетчики перегрузки не сбросятся.
Java-клиент
- Реализуйте слушатель, унаследовав его от класса
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() } } }
- Зарегистрируйте экземпляр слушателя, вызвав метод
CarWatchdogManager.addResourceOveruseListenerprivate 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); } - Отмените регистрацию экземпляра слушателя, когда приложение завершит прослушивание:
private void removeResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); mCarWatchdogManager.removeResourceOveruseListener( mListenerImpl); }
Нативный клиент
- Включите
carwatchdog_aidl_interface-ndk_platformв зависимостьshared_libsправила сборки.Android.bpcc_binary { name: "sample_native_client", srcs: [ "src/*.cpp" ], shared_libs: [ "carwatchdog_aidl_interface-ndk_platform", "libbinder_ndk", ], vendor: true, } - Добавьте политику SELinux, разрешающую домену службы поставщика использовать binder (макрос
binder_user), и добавьте домен службы поставщика в домен клиентаcarwatchdog(carwatchdog_client_domain macro). См. код ниже дляsample_client.teиfile_contexts.sample_client.tetype 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. ПереопределитеBnResourceOveruseListener::onOveruseдля обработки уведомлений о переиспользовании ресурсов.ResourceOveruseListenerImpl.hclass 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.cppndk::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(); }
- Создайте пул потоков Binder и зарегистрируйте прослушиватель переиспользования ресурсов на сервере сторожевого таймера. Сервер сторожевого таймера регистрируется под именем службы
android.automotive.watchdog.ICarWatchdog/default.main.cppint 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.cppvoid 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); }
Статистика чрезмерного использования ресурсов опроса
Приложения могут запрашивать у CarWatchdogManager статистику использования ввода-вывода для конкретного приложения (ATS) за последние 30 дней.
Java-клиент
Используйте CarWatchdogManager.getResourceOveruseStats для получения статистики по переиспользованию ресурсов. Передайте флаг CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO , чтобы получить статистику по переиспользованию дискового ввода-вывода.
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()
}Нативный клиент
Используйте CarWatchdogServer.getResourceOveruseStats для получения статистики по переиспользованию ресурсов. Передайте перечисление ResourceType.IO для получения статистики по переиспользованию дискового ввода-вывода.
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 } }
пользовательский опыт, связанный с чрезмерным использованием ресурсов
В следующих разделах описывается пользовательский опыт при чрезмерном использовании ресурсов.
Приоритизация настроек производительности приложения
На странице настроек приложения находятся параметры « Prioritize app performance (см. изображение ниже), которые позволяют пользователям отдавать приоритет производительности приложения над производительностью системы и долговременной производительностью оборудования. Этот параметр доступен только для приложений, которые можно безопасно завершить при перегрузке ресурсов. В противном случае этот параметр отключен. Если этот параметр отключен (настройка по умолчанию) для приложения, приложение может быть завершено при перегрузке ресурсов. В противном случае приложение не завершается при перегрузке ресурсов.

Когда пользователь включает этот параметр, появляется следующее диалоговое окно подтверждения, описывающее последствия включения параметра:

Через 90 дней этот параметр автоматически сбрасывается до значения по умолчанию. Ограничение по количеству дней можно изменить с помощью приложения-оверлея RRO, используя watchdogUserPackageSettingsResetDays , максимум до 180 дней. Для получения дополнительной информации см. раздел «Изменение значения ресурсов приложения во время выполнения» . Следующий пример тега оверлея можно включить в AndroidManifest.xml :
<overlay android:priority="<insert-value>" android:targetPackage="com.android.car.updatable" android:targetName="CarServiceCustomization" android:resourcesMap="@xml/overlays" />
В файле res/values/config.xml :
<resources> <integer name="watchdogUserPackageSettingsResetDays">value</integer> </resources>
В res/xml/overlays.xml :
<overlay> <item target="integer/watchdogUserPackageSettingsResetDays" value="@integer/watchdogUserPackageSettingsResetDays" /> </overlay>
настройки приложений, влияющих на производительность
В приложении «Настройки» есть раздел «Приложения, влияющие на производительность» (см. рис. 1). При нажатии на него отображается список приложений, использование которых было ограничено из-за чрезмерного использования флэш-памяти и которые негативно влияют на производительность системы. Это соответствует требованиям CDD 3.5.1 [C-1-1] .

Рисунок 1. Приложения, влияющие на производительность.
Здесь перечислены приложения, работа которых была прекращена из-за чрезмерного использования ресурсов (см. Рисунок 2). Приложениям из этого списка можно присвоить приоритет. Для получения дополнительной информации см. Настройка приоритета производительности приложений .

Рисунок 2. Список приложений, удаленных из-за чрезмерного использования ресурсов.
Уведомление пользователя
Когда приложение или служба неоднократно чрезмерно используют дисковый ввод-вывод (например, записывают данные на диск сверх установленных пороговых значений) в течение определенного периода времени и могут быть безопасно завершены при перегрузке ресурсов, пользователь получает уведомление после того, как транспортное средство переходит в состояние, разрешающее отвлечение водителя.
Первое уведомление для пользователя (во время поездки) отображается в виде предварительного уведомления, а остальные уведомления — в центре уведомлений.
Например, когда приложение неоднократно чрезмерно использует дисковый ввод-вывод, пользователь получает следующее уведомление:
- Когда пользователь нажимает на кнопку «Приоритизировать приложение» , открывается страница настроек приложения, где он может включить или выключить параметр «Приоритизировать производительность приложения» .
- Когда пользователь нажимает кнопку «Отключить приложение» , приложение отключается до тех пор, пока пользователь не запустит приложение или не включит его в настройках приложения.
- Для приложений, которые можно удалить, кнопка «Отключить приложение» заменяется кнопкой «Удалить приложение» . При нажатии на кнопку «Удалить приложение» открывается страница настроек приложения, с которой пользователь может удалить приложение.


Рекомендации по реализации пусковой установки
Когда приложения отключаются из-за чрезмерного использования ресурсов, они исчезают из стандартного приложения запуска, поскольку CarService обновляет состояние включения приложений как PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED . Производителям оборудования необходимо обновить встроенную реализацию приложения запуска, чтобы отображать эти приложения как обычно, чтобы пользователи могли использовать их при необходимости. См. следующие рекомендации, основанные на версии сборки.
Выпуск Android SC V2
- При получении списка пакетов для отображения в панели запуска следует использовать флаг
MATCH_DISABLED_UNTIL_USED_COMPONENTSв реализации средства запуска. - Когда пользователь щелкает по приложению, находящемуся в состоянии
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, приложение-лаунчер должно включить это приложение, установив для него состояние включения следующим образом: