Pantau penggunaan memori flash

Watchdog memantau penggunaan memori flash dengan melacak jumlah total penulisan I/O disk yang dilakukan oleh semua aplikasi dan layanan menggunakan statistik I/O disk per-UID yang diekspos oleh Kernel di lokasi `/proc/uid_io/stats`. Ketika aplikasi atau layanan melebihi ambang batas penggunaan I/O disk yang berlebihan, Watchdog akan mengambil tindakan pada aplikasi atau layanan tersebut. Ambang batas penggunaan berlebihan I/O disk dan tindakan yang diambil terhadap penggunaan berlebihan telah ditentukan sebelumnya dalam konfigurasi penggunaan berlebihan I/O disk.

Ambang batas yang terlalu sering digunakan

  • Ambang batas penggunaan berlebihan I/O disk diberlakukan setiap hari, yaitu, semua penulisan yang dilakukan oleh aplikasi/layanan dikumpulkan sejak awal hari kalender UTC saat ini dan diperiksa berdasarkan ambang batas yang ditentukan dalam konfigurasi penggunaan berlebihan.
  • Ketika kendaraan dihidupkan beberapa kali pada hari tertentu, modul Watchdog menyimpan statistik penggunaan I/O disk pada memori flash dan mengagregasinya sejak awal hari kalender UTC saat ini.

Tindakan yang berlebihan

Ketika aplikasi berulang kali melebihi ambang batas penggunaan berlebihan I/O disk yang ditentukan, Watchdog mengambil tindakan yang ditentukan dalam konfigurasi penggunaan berlebihan.

  • Semua aplikasi dan layanan vendor dianggap penting untuk stabilitas sistem secara keseluruhan, sehingga tidak dihentikan karena penggunaan I/O disk yang berlebihan. Namun, konfigurasi yang terlalu sering digunakan dapat menentukan daftar aplikasi dan layanan vendor yang aman untuk dihentikan.
  • Semua aplikasi pihak ketiga aman untuk dihentikan.

Ketika aplikasi atau layanan aman untuk dihentikan, Watchdog menonaktifkan aplikasi atau layanan dengan status komponen aplikasi PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED .

Konfigurasi yang berlebihan

Konfigurasi penggunaan berlebihan berisi ambang batas dan tindakan penggunaan berlebihan I/O disk. Konfigurasi penggunaan berlebihan default ditentukan dalam image sistem dan vendor, dan dikirimkan bersama build. Vendor secara opsional dapat menyertakan konfigurasi vendor dalam gambar vendor. Jika konfigurasi vendor tidak disediakan, konfigurasi sistem juga digunakan untuk aplikasi dan layanan vendor.

Watchdog memaparkan API sistem melalui CarWatchdogManager , yang memungkinkan aplikasi atau layanan vendor memperbarui konfigurasi vendor kapan saja.

Definisi konfigurasi yang terlalu sering digunakan

Konfigurasi penggunaan berlebihan dibagi berdasarkan jenis komponen, misalnya sistem, vendor, dan pihak ketiga. OEM harus memperbarui hanya konfigurasi komponen vendor.

Konfigurasi vendor

Konfigurasi vendor menentukan ambang batas penggunaan I/O disk yang berlebihan dan tindakan untuk semua aplikasi dan layanan vendor, serta semua aplikasi peta dan media. Konfigurasi berisi bidang konfigurasi di bawah ini.

  • Vendor package prefixes . Semua paket yang diinstal di partisi vendor dianggap sebagai paket vendor. Selain paket-paket ini, vendor dapat mengklasifikasikan paket-paket yang telah diinstal sebelumnya sebagai paket-paket vendor dengan menambahkan awalan paket ke konfigurasi vendor package prefixes . Konfigurasi ini tidak menerima ekspresi reguler.
  • Safe-to-terminate packages . Vendor dapat menentukan paket vendor mana yang aman untuk dihentikan dengan menambahkan nama paket lengkap ke konfigurasi safe-to-terminate packages .
  • Application category mappings . Vendor dapat memetakan paket apa pun (termasuk paket pihak ketiga) ke salah satu dari dua kategori aplikasi yang didukung - aplikasi Peta dan Media. Pemetaan ini dilakukan untuk memberikan peta dan aplikasi media ambang penggunaan I/O disk yang lebih tinggi karena aplikasi ini cenderung mengunduh dan menulis lebih banyak data ke disk dibandingkan jenis aplikasi lainnya.
  • Component level thresholds . Mendefinisikan ambang batas umum untuk semua paket vendor (yaitu, paket yang tidak tercakup dalam Package specific thresholds atau Application category specific thresholds mendapatkan ambang batas ini). Vendor harus menentukan ambang batas tingkat komponen bukan nol saat menentukan konfigurasi penggunaan I/O disk yang berlebihan.
  • Package specific thresholds . Vendor dapat menentukan ambang batas khusus untuk paket vendor tertentu. Pemetaan harus berisi nama paket lengkap. Ambang batas yang ditentukan dalam konfigurasi ini lebih diutamakan daripada ambang batas yang ditentukan dalam konfigurasi lain untuk paket tertentu.
  • Application category specific thresholds . Vendor dapat menentukan ambang batas khusus untuk kategori aplikasi tertentu. Kategori aplikasi harus merupakan salah satu kategori yang didukung - Aplikasi Peta dan Media. Ambang batas yang ditentukan dalam konfigurasi ini dipetakan ke paket tertentu menggunakan Application category mappings .
  • System-wide thresholds . Vendor tidak boleh menentukan konfigurasi ini.

Vendor package prefixes , Safe-to-terminate packages , Component level thresholds , dan Konfigurasi Package specific thresholds hanya dapat diperbarui oleh konfigurasi vendor untuk aplikasi dan layanan vendor. Konfigurasi Application category specific thresholds hanya dapat diperbarui oleh konfigurasi vendor untuk semua aplikasi peta dan media.

Ambang batas penggunaan berlebihan berisi jumlah byte yang diizinkan untuk ditulis selama ini

  • Mode latar depan aplikasi/layanan versus mode latar belakang
  • dan mode garasi sistem.

Klasifikasi ini memungkinkan pengguna yang melihat aplikasi/layanan latar depan untuk menulis lebih banyak data daripada aplikasi/layanan latar belakang. Dalam mode Garasi, aplikasi dan layanan cenderung mengunduh pembaruan, sehingga masing-masing memerlukan ambang batas yang lebih tinggi dibandingkan aplikasi dan layanan yang berjalan dalam mode lainnya.

Konfigurasi sistem dan pihak ketiga

OEM tidak boleh memperbarui sistem dan konfigurasi pihak ketiga.

  • Konfigurasi sistem menentukan ambang batas dan tindakan penggunaan I/O yang berlebihan untuk aplikasi dan layanan sistem.
    • Konfigurasi ini juga dapat memperbarui Application category mappings . Dengan demikian, bidang konfigurasi ini dibagi antara konfigurasi sistem dan vendor.
  • Konfigurasi pihak ketiga menentukan ambang batas untuk semua aplikasi pihak ketiga. Semua aplikasi yang tidak diinstal sebelumnya di sistem adalah aplikasi pihak ketiga.
    • Semua aplikasi pihak ketiga menerima ambang batas yang sama (misalnya, tidak ada aplikasi pihak ketiga yang menerima ambang batas khusus) kecuali aplikasi peta dan media, yang ambang batasnya ditentukan oleh konfigurasi vendor.
    • Ambang batas penggunaan I/O disk yang berlebihan di bawah ini adalah ambang batas default untuk aplikasi pihak ketiga. Ambang batas ini dikirimkan bersama citra sistem.
      • 3 GiB menulis dalam mode latar depan aplikasi.
      • 2 GiB menulis dalam mode latar belakang aplikasi.
      • 4 GiB tulis dalam mode garasi sistem.
    • Ini adalah ambang batas dasar. Ambang batas ini diperbarui seiring kami memahami penggunaan I/O disk dengan lebih baik.

Terlalu sering menggunakan format XML konfigurasi

Konfigurasi vendor default dapat ditempatkan (ini opsional ) di lokasi /vendor/etc/automotive/watchdog/resource_overuse_configuration.xml pada gambar build. Jika konfigurasi ini tidak ditentukan, konfigurasi yang ditentukan sistem juga diterapkan untuk aplikasi dan layanan vendor.

File XML harus berisi hanya satu tag untuk setiap bidang konfigurasi. Konfigurasi penggunaan I/O yang berlebihan harus ditentukan dalam file XML. Semua nilai ambang batas harus ditentukan dalam unit MiB.

Contoh konfigurasi XML disediakan di bawah ini:

<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>

Perbarui konfigurasi yang terlalu sering digunakan melalui API sistem CarWatchdogManager

Konfigurasi XML di atas hanya dapat disediakan di gambar build. Jika OEM memilih untuk memperbarui konfigurasi pada perangkat setelah build dirilis, mereka dapat menggunakan API berikut untuk membuat perubahan pada konfigurasi pada perangkat.

  • Berikan izin Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG kepada penelepon.
  • Harus menggunakan konfigurasi yang ada untuk memperbarui dan mengatur konfigurasi baru. Gunakan API CarWatchdogManager.getResourceOveruseConfigurations untuk mendapatkan konfigurasi yang ada. Jika konfigurasi yang ada tidak digunakan, semua konfigurasi (termasuk konfigurasi sistem dan pihak ketiga) akan ditimpa, dan hal ini tidak disarankan.
  • Perbarui konfigurasi yang ada dengan perubahan delta dan atur konfigurasi baru. Jangan perbarui konfigurasi sistem dan komponen pihak ketiga.
  • Gunakan API CarWatchdogManager.setResourceOveruseConfigurations untuk mengatur konfigurasi baru.
  • Untuk mendapatkan dan menyetel konfigurasi I/O disk yang terlalu sering digunakan, gunakan flag CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO .

Berikut ini contoh implementasi yang memperbarui konfigurasi penggunaan sumber daya yang berlebihan:

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();
}

Aplikasi memantau penggunaan sumber dayanya secara berlebihan

Vendor dan aplikasi pihak ketiga dapat mendengarkan pemberitahuan penggunaan sumber daya yang berlebihan pada aplikasi dari Watchdog atau jajak pendapat CarWatchdogManager untuk statistik penggunaan sumber daya yang berlebihan pada aplikasi selama hingga 30 hari terakhir.

Dengarkan pemberitahuan penggunaan sumber daya yang berlebihan

Aplikasi dapat mengimplementasikan pemroses penggunaan sumber daya yang berlebihan dan mendaftarkan pemroses tersebut ke CarWatchdogManager untuk menerima notifikasi spesifik aplikasi ketika melebihi 80% atau 100% ambang batas penggunaan I/O disk yang berlebihan. Aplikasi dapat menggunakan notifikasi ini untuk:

  • Catat statistik I/O disk yang terlalu sering digunakan untuk analisis offline. Pengembang aplikasi dapat menggunakan logging ini untuk men-debug masalah penggunaan I/O disk yang berlebihan.
  • Kurangi penulisan I/O disk hingga penghitung penggunaan berlebihan direset.

klien Jawa

  1. Terapkan pendengar dengan mewarisi 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. Daftarkan instance pendengar dengan memanggil 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. Batalkan pendaftaran instance pendengar ketika aplikasi selesai mendengarkan:
    private void removeResourceOveruseListener() {
        CarWatchdogManager manager =
                (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);
        mCarWatchdogManager.removeResourceOveruseListener(
              mListenerImpl);
    }
    

Klien asli

  1. Sertakan carwatchdog_aidl_interface-ndk_platform dalam ketergantungan shared_libs pada aturan build.

    Android.bp

    cc_binary {
        name: "sample_native_client",
        srcs: [
            "src/*.cpp"
        ],
        shared_libs: [
            "carwatchdog_aidl_interface-ndk_platform",
            "libbinder_ndk",
        ],
        vendor: true,
    }
    
  2. Tambahkan kebijakan SELinux untuk mengizinkan domain layanan vendor menggunakan pengikat ( makro binder_user ) dan menambahkan domain layanan vendor ke domain klien carwatchdog (carwatchdog_client_domain macro) . Lihat kode di bawah untuk sample_client.te dan 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. Terapkan pemroses penggunaan sumber daya yang berlebihan dengan mewarisi BnResourceOveruseListener . Ganti BnResourceOveruseListener::onOveruse untuk menangani notifikasi penggunaan sumber daya yang berlebihan.

    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. Mulai kumpulan thread pengikat dan daftarkan pendengar penggunaan sumber daya yang berlebihan ke server pengawas. Server Watchdog terdaftar dengan nama layanan 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);
    }
    

Statistik penggunaan sumber daya yang berlebihan

Aplikasi dapat melakukan polling pada CarWatchdogManager untuk statistik I/O yang terlalu sering menggunakan ATS selama 30 hari terakhir.

klien Jawa

Gunakan CarWatchdogManager.getResourceOveruseStats untuk mendapatkan statistik penggunaan sumber daya yang berlebihan. Berikan tanda CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO untuk mendapatkan statistik penggunaan I/O disk yang berlebihan.

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()
}

Klien asli

Gunakan CarWatchdogServer.getResourceOveruseStats untuk mendapatkan statistik penggunaan sumber daya yang berlebihan. Berikan enum ResourceType.IO untuk mengambil statistik I/O disk yang terlalu sering digunakan.

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 yang terlalu sering menggunakan sumber daya

Prioritaskan pengaturan kinerja aplikasi

Halaman pengaturan aplikasi memiliki pengaturan Prioritize app performance (lihat gambar di bawah), yang memungkinkan pengguna untuk memprioritaskan kinerja aplikasi dibandingkan sistem dan kinerja perangkat keras jangka panjang. Pengaturan ini hanya tersedia untuk aplikasi yang aman untuk dihentikan karena penggunaan sumber daya yang berlebihan. Jika tidak, pengaturan ini akan berwarna abu-abu. Jika pengaturan ini dinonaktifkan (pengaturan default) untuk suatu aplikasi, aplikasi dapat dihentikan karena penggunaan sumber daya yang berlebihan. Jika tidak, aplikasi tidak akan dihentikan karena penggunaan sumber daya yang berlebihan.

Saat pengguna mengaktifkan pengaturan ini, dialog konfirmasi berikut menjelaskan implikasi dari pengalihan pengaturan tersebut.

Setelah 90 hari, pengaturan ini secara otomatis diatur ulang ke default. Batas hari dapat diubah dengan aplikasi overlay RRO menggunakan watchdogUserPackageSettingsResetDays , hingga maksimum 180 hari. Untuk mempelajari lebih lanjut, lihat Mengubah nilai sumber daya aplikasi saat runtime . Contoh tag overlay berikut dapat disertakan dalam AndroidManifest.xml :

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

Di res/values/config.xml :

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

Di res/xml/overlays.xml :

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

Pemberitahuan pengguna

Ketika aplikasi atau layanan berulang kali menggunakan I/O disk secara berlebihan (misalnya, menulis data ke disk melebihi ambang batas yang ditentukan) dalam jangka waktu tertentu dan aman untuk dihentikan karena penggunaan sumber daya yang berlebihan, pengguna akan diberi tahu setelah kendaraan memasuki izin-pengemudi -keadaan gangguan.

Notifikasi pengguna pertama (selama berkendara) diposting sebagai notifikasi pendahuluan dan notifikasi lainnya diposting di pusat notifikasi.

Misalnya, saat aplikasi berulang kali menggunakan I/O disk secara berlebihan, pengguna akan menerima notifikasi berikut:

  • Saat pengguna mengklik tombol Prioritaskan aplikasi , halaman pengaturan aplikasi akan diluncurkan, tempat pengguna dapat mengaktifkan atau menonaktifkan pengaturan Prioritaskan kinerja aplikasi .
  • Saat pengguna mengklik tombol Nonaktifkan aplikasi , aplikasi akan dinonaktifkan hingga pengguna meluncurkan aplikasi atau mengaktifkannya di halaman pengaturan aplikasi.
  • Untuk aplikasi yang dapat di-uninstall, tombol Nonaktifkan aplikasi diganti dengan tombol Uninstall aplikasi . Saat pengguna mengeklik tombol Uninstall app , halaman Pengaturan aplikasi akan diluncurkan, dan dari sana pengguna dapat meng-uninstall aplikasi tersebut.

Rekomendasi untuk penerapan peluncur

Ketika aplikasi dinonaktifkan karena penggunaan sumber daya yang berlebihan, aplikasi tersebut akan hilang dari aplikasi peluncur default karena CarService memperbarui status aktif aplikasi sebagai PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED . OEM harus memperbarui penerapan peluncur bawaan untuk menampilkan aplikasi ini sebagai aplikasi yang tidak biasa, sehingga pengguna dapat menggunakannya jika diperlukan. Lihat rekomendasi berikut berdasarkan rilis build.

Rilis Android SC V2