Мониторинг использования флэш-памяти

Watchdog отслеживает использование флэш-памяти, отслеживая общий объем операций ввода-вывода на диск, выполненных всеми приложениями и службами, используя статистику ввода-вывода диска для каждого UID, предоставляемую ядром в расположении `/proc/uid_io/stats`. Когда приложение или служба превышает порог чрезмерного использования дискового ввода-вывода, Watchdog предпринимает действия в отношении приложения или службы. Пороговые значения чрезмерного использования дискового ввода-вывода и действия, предпринимаемые в случае чрезмерного использования, заранее определены в конфигурации чрезмерного использования дискового ввода-вывода.

Пороги чрезмерного использования

  • Пороговые значения чрезмерного использования дискового ввода-вывода применяются ежедневно, то есть все операции записи, выполняемые приложением или службой, суммируются с начала текущего календарного дня по всемирному координированному времени и проверяются на соответствие пороговым значениям, определенным в конфигурациях чрезмерного использования.
  • Когда автомобиль запускается несколько раз в определенный день, модуль Watchdog сохраняет статистику использования дискового ввода-вывода во флэш-памяти и суммирует ее с начала текущего календарного дня UTC.

Действия по злоупотреблению

Когда приложение неоднократно превышает определенные пороговые значения чрезмерного использования дискового ввода-вывода, Watchdog предпринимает действия, определенные в конфигурации чрезмерного использования.

  • Все приложения и службы поставщиков считаются критически важными для общей стабильности системы, поэтому их работа не прекращается из-за чрезмерного использования дискового ввода-вывода. Однако конфигурация чрезмерного использования может определить список приложений и служб поставщика, которые можно безопасно завершить.
  • Все сторонние приложения можно безопасно закрыть.

Когда приложение или службу можно безопасно завершить, Watchdog отключает приложение или службу с помощью состояния компонента приложения PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED .

Конфигурация чрезмерного использования

Конфигурация чрезмерного использования содержит пороговые значения и действия по превышению дискового ввода-вывода. Конфигурации чрезмерного использования по умолчанию определены в образах системы и поставщика и поставляются вместе со сборкой. Поставщики могут дополнительно включить конфигурацию поставщика в образ поставщика. Если конфигурация поставщика не указана, конфигурация системы также используется для приложений и служб поставщика.

Watchdog предоставляет системные API через CarWatchdogManager , который позволяет приложениям или службам поставщиков обновлять конфигурацию поставщика в любое время.

Определение конфигурации чрезмерного использования

Конфигурация чрезмерного использования разделяется по типу компонента, например, система, поставщик или третья сторона. OEM-производители должны обновлять только конфигурацию компонентов поставщика.

Конфигурация поставщика

Конфигурация поставщика определяет пороговые значения и действия по чрезмерному использованию дискового ввода-вывода для всех приложений и служб поставщика, а также всех карт и мультимедийных приложений. Конфигурация содержит приведенные ниже поля конфигурации.

  • Vendor package prefixes . Все пакеты, установленные в разделе поставщика, считаются пакетами поставщика. В дополнение к этим пакетам поставщики могут классифицировать предустановленные пакеты как пакеты поставщиков, добавляя префиксы пакетов в конфигурацию vendor package prefixes . Эта конфигурация не принимает регулярные выражения.
  • Safe-to-terminate packages . Поставщики могут указать, какие пакеты поставщиков можно безопасно завершить, добавив полные имена пакетов в конфигурацию safe-to-terminate packages .
  • Application category mappings . Поставщики могут сопоставить любой пакет (включая пакеты сторонних производителей) с одной из двух поддерживаемых категорий приложений — приложениями «Карта» и «Мультимедиа». Такое сопоставление сделано для того, чтобы обеспечить картам и мультимедийным приложениям более высокие пороги чрезмерного использования дискового ввода-вывода, поскольку эти приложения имеют тенденцию загружать и записывать на диск больше данных, чем другие типы приложений.
  • Component level thresholds . Определяет общие пороговые значения для всех пакетов поставщиков (то есть пакеты, на которые не распространяются Package specific thresholds или Application category specific thresholds получают эти пороговые значения). Поставщики должны определить ненулевые пороговые значения на уровне компонентов при определении конфигурации чрезмерного использования дискового ввода-вывода.
  • Package specific thresholds . Поставщики могут определять специальные пороговые значения для пакетов конкретных поставщиков. Сопоставления должны содержать полные имена пакетов. Пороги, определенные в этой конфигурации, имеют приоритет над порогами, определенными в других конфигурациях для данного пакета.
  • Application category specific thresholds . Поставщики могут указать специальные пороговые значения для определенных категорий приложений. Категории приложений должны быть одной из поддерживаемых категорий — «Карты» и «Мультимедиа». Пороговые значения, определенные в этой конфигурации, сопоставляются с конкретными пакетами с помощью Application category mappings .
  • System-wide thresholds . Поставщики не должны указывать эту конфигурацию.

Vendor package prefixes , Safe-to-terminate packages , Component level thresholds и конфигурации Package specific thresholds обновляются только конфигурацией поставщика для приложений и служб поставщика. Конфигурация Application category specific thresholds может быть обновлена ​​только конфигурацией поставщика для всех карт и мультимедийных приложений.

Пороги чрезмерного использования содержат количество байт, которое разрешено записать во время

  • Передний режим приложения/службы и фоновый режим
  • и системный гаражный режим.

Эта классификация позволяет пользователю, работающему с приложениями/службами переднего плана, записывать больше данных, чем фоновые приложения/службы. В режиме «Гараж» приложения и службы обычно загружают обновления, поэтому для каждого из них требуется более высокий порог, чем для приложений и служб, работающих в других режимах.

Системные и сторонние конфигурации

OEM-производители не должны обновлять системы и конфигурации сторонних производителей.

  • Конфигурация системы определяет пороговые значения чрезмерного использования ввода-вывода и действия для системных приложений и служб.
    • Эта конфигурация также может обновлять Application category mappings . Таким образом, это поле конфигурации является общим для конфигураций системы и поставщика.
  • Сторонняя конфигурация определяет пороговые значения для всех сторонних приложений. Все приложения, которые не предустановлены в системе, являются сторонними.
    • Все сторонние приложения получают одинаковые пороговые значения (например, ни одно стороннее приложение не получает специальных пороговых значений), за исключением карт и мультимедийных приложений, пороговые значения которых определяются конфигурацией поставщика.
    • Приведенные ниже пороговые значения чрезмерного использования дискового ввода-вывода являются пороговыми значениями по умолчанию для сторонних приложений. Эти пороговые значения поставляются с образом системы.
      • 3 ГиБ записи в режиме переднего плана приложения.
      • 2 ГиБ записи в фоновом режиме приложения.
      • 4 ГиБ пишутся в режиме системного гаража.
    • Это базовые пороги. Эти пороговые значения обновляются по мере того, как мы лучше понимаем использование дискового ввода-вывода.

Злоупотребление форматом XML конфигурации

Конфигурацию поставщика по умолчанию можно разместить (это необязательно ) в папке /vendor/etc/automotive/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-клиент

  1. Реализуйте прослушиватель, наследующий 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()
                }
          }
    }
    
  2. Зарегистрируйте экземпляр прослушивателя, вызвав 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. Отмените регистрацию экземпляра прослушивателя, когда приложение завершит прослушивание:
    private void removeResourceOveruseListener() {
        CarWatchdogManager manager =
                (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);
        mCarWatchdogManager.removeResourceOveruseListener(
              mListenerImpl);
    }
    

Родной клиент

  1. Включите carwatchdog_aidl_interface-ndk_platform в shared_libs правила сборки.

    Android.bp

    cc_binary {
        name: "sample_native_client",
        srcs: [
            "src/*.cpp"
        ],
        shared_libs: [
            "carwatchdog_aidl_interface-ndk_platform",
            "libbinder_ndk",
        ],
        vendor: true,
    }
    
  2. Добавьте политику SELinux, чтобы разрешить домену службы поставщика использовать связующее ( binder_user ), и добавьте домен службы поставщика в клиентский домен carwatchdog (carwatchdog_client_domain macro) . См. код ниже для sample_client.te и 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. Реализуйте прослушиватель чрезмерного использования ресурсов, унаследовав BnResourceOveruseListener . Переопределить BnResourceOveruseListener::onOveruse для обработки уведомлений о чрезмерном использовании ресурсов.

    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. Запустите пул потоков связывания и зарегистрируйте прослушиватель чрезмерного использования ресурсов на сторожевом сервере. Сервер Watchdog зарегистрирован под именем службы 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);
    }
    

Статистика чрезмерного использования ресурсов опроса

Приложения могут опрашивать 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
      }
}

UX чрезмерного использования ресурсов

Приоритизация настроек производительности приложения

На странице настроек приложения есть настройки 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>

Уведомление пользователя

Когда приложение или служба неоднократно чрезмерно использует дисковый ввод-вывод (например, записывает данные на диск сверх определенных пороговых значений) в течение определенного периода и может быть безопасно прекращено при чрезмерном использовании ресурсов, пользователь уведомляется после того, как транспортное средство войдет в режим разрешенного драйвера. -состояние отвлечения.

Первое уведомление пользователя (во время поездки) публикуется как всплывающее уведомление, а остальные уведомления размещаются в центре уведомлений.

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

  • Когда пользователь нажимает кнопку «Приоритизировать приложение» , открывается страница настроек приложения, на которой пользователь может включать или выключать параметр «Приоритизировать производительность приложения» .
  • Когда пользователь нажимает кнопку «Отключить приложение» , приложение отключается до тех пор, пока пользователь не запустит его или не включит его на странице настроек приложения.
  • Для неустанавливаемых приложений кнопка «Отключить приложение» заменяется кнопкой «Удалить приложение» . Когда пользователь нажимает кнопку «Удалить приложение» , открывается страница настроек приложения, с которой пользователь может удалить приложение.

Рекомендации по внедрению лаунчера

Когда приложения отключены из-за чрезмерного использования ресурсов, они исчезают из приложения запуска по умолчанию, поскольку CarService обновляет включенное состояние приложений как PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED . OEM-производители должны обновить встроенную реализацию средства запуска, чтобы эти приложения отображались как необычные, чтобы пользователи могли использовать их при необходимости. См. следующие рекомендации, основанные на выпуске сборки.

Выпуск Android SC V2