Memantau penggunaan memori flash

Watchdog memantau penggunaan memori flash dengan melacak jumlah total operasi tulis I/O disk yang dilakukan oleh semua aplikasi dan layanan menggunakan statistik I/O disk per UID yang ditampilkan oleh Kernel di lokasi `/proc/uid_io/stats`. Jika aplikasi atau layanan melebihi nilai minimum penggunaan I/O disk, Watchdog akan mengambil tindakan pada aplikasi atau layanan tersebut. Batas penggunaan berlebihan I/O disk dan tindakan untuk mengambil penggunaan berlebihan telah ditentukan dalam konfigurasi penggunaan berlebihan I/O disk.

Batas penggunaan berlebihan

  • Batas penggunaan berlebihan I/O disk diterapkan setiap hari, yaitu, semua operasi tulis yang dilakukan oleh aplikasi/layanan digabungkan sejak awal hari kalender UTC saat ini dan diperiksa terhadap batas yang ditentukan dalam konfigurasi penggunaan berlebihan.
  • Saat kendaraan dinyalakan beberapa kali pada hari tertentu, modul Watchdog akan menyimpan statistik penggunaan I/O disk di memori flash dan menggabungkannya sejak awal hari kalender UTC saat ini.

Tindakan penggunaan berlebihan

Jika aplikasi berulang kali melampaui batas penggunaan I/O disk yang ditentukan, Watchdog akan mengambil tindakan yang ditentukan dalam konfigurasi penggunaan berlebih.

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

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

Konfigurasi penggunaan berlebihan

Konfigurasi penggunaan berlebih berisi tindakan dan nilai minimum penggunaan berlebih I/O disk. Konfigurasi penggunaan berlebihan default ditentukan dalam image sistem dan vendor, dan dikirimkan dengan build. Vendor dapat menyertakan konfigurasi vendor secara opsional dalam image vendor. Jika konfigurasi vendor tidak disediakan, konfigurasi sistem juga akan digunakan untuk aplikasi dan layanan vendor.

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

Definisi konfigurasi yang berlebihan

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

Konfigurasi vendor

Konfigurasi vendor menentukan tindakan dan nilai minimum penggunaan I/O disk untuk semua aplikasi dan layanan vendor, serta semua aplikasi peta dan media. Konfigurasi berisi kolom konfigurasi di bawah.

  • Awalan paket vendor. Semua paket yang diinstal di partisi vendor dianggap sebagai paket vendor. Selain paket ini, vendor dapat mengklasifikasikan paket yang telah diinstal sebelumnya sebagai paket vendor dengan menambahkan awalan paket ke konfigurasi awalan paket vendor. Konfigurasi ini tidak menerima ekspresi reguler.
  • Paket yang aman untuk dihentikan. Vendor dapat menentukan paket vendor mana yang aman untuk dihentikan dengan menambahkan nama paket lengkap ke konfigurasi paket yang aman untuk dihentikan.
  • Pemetaan kategori aplikasi. Vendor dapat memetakan paket apa pun (termasuk paket pihak ketiga) ke salah satu dari dua kategori aplikasi yang didukung, yaitu aplikasi Peta dan Media. Pemetaan ini dilakukan untuk memberikan aplikasi peta dan media nilai minimum penggunaan I/O disk yang lebih tinggi karena aplikasi ini cenderung mendownload dan menulis lebih banyak data ke disk daripada jenis aplikasi lainnya.
  • Batas tingkat komponen. Menentukan nilai minimum umum untuk semua paket vendor (yaitu, paket yang tidak tercakup dalam Nilai minimum khusus paket atau Nilai minimum khusus kategori aplikasi akan mendapatkan nilai minimum ini). Vendor harus menentukan nilai minimum tingkat komponen yang bukan nol saat menentukan konfigurasi penggunaan berlebihan I/O disk.
  • Batas khusus paket. Vendor dapat menentukan nilai minimum khusus untuk paket vendor tertentu. Pemetaan harus berisi nama paket lengkap. Batas yang ditentukan dalam konfigurasi ini lebih diutamakan daripada batas yang ditentukan dalam konfigurasi lain untuk paket tertentu.
  • Batas khusus kategori aplikasi. Vendor dapat menentukan nilai minimum khusus untuk kategori aplikasi tertentu. Kategori aplikasi harus berupa salah satu kategori yang didukung - aplikasi Peta dan Media. Batas yang ditentukan dalam konfigurasi ini dipetakan ke paket tertentu menggunakan Pemetaan kategori aplikasi.
  • Batas di seluruh sistem. Vendor tidak boleh menentukan konfigurasi ini.

Awalan paket vendor, Paket yang aman untuk dihentikan, Batas tingkat komponen, dan konfigurasi Batas khusus paket hanya dapat diperbarui oleh konfigurasi vendor untuk aplikasi dan layanan vendor. Konfigurasi Batas khusus kategori aplikasi hanya dapat diperbarui oleh konfigurasi vendor untuk semua aplikasi peta dan media.

Batas penggunaan berlebih berisi jumlah byte yang diizinkan untuk ditulis selama:

  • Mode latar depan aplikasi atau layanan versus mode latar belakang
  • Mode garasi sistem

Klasifikasi ini memungkinkan aplikasi dan layanan latar depan yang ditampilkan kepada pengguna menulis lebih banyak data daripada aplikasi dan layanan latar belakang. Dalam mode Garasi, aplikasi dan layanan cenderung mendownload update, sehingga setiap aplikasi dan layanan memerlukan nilai minimum yang lebih tinggi daripada aplikasi dan layanan yang berjalan dalam mode lain.

Konfigurasi sistem dan pihak ketiga

OEM tidak boleh mengupdate konfigurasi sistem dan pihak ketiga.

  • Konfigurasi sistem menentukan tindakan dan batas penggunaan I/O yang berlebihan untuk aplikasi dan layanan sistem.
    • Konfigurasi ini juga dapat memperbarui Pemetaan kategori aplikasi. Dengan demikian, kolom konfigurasi ini digunakan bersama oleh konfigurasi sistem dan vendor.
  • Konfigurasi pihak ketiga menentukan nilai minimum untuk semua aplikasi pihak ketiga. Semua aplikasi yang tidak diinstal sebelumnya di sistem adalah aplikasi pihak ketiga.
    • Semua aplikasi pihak ketiga menerima nilai minimum yang sama (misalnya, tidak ada aplikasi pihak ketiga yang menerima nilai minimum khusus) kecuali aplikasi peta dan media, yang nilai minimumnya ditentukan oleh konfigurasi vendor.
    • Batas penggunaan berlebihan I/O disk di bawah ini adalah batas default untuk aplikasi pihak ketiga. Batas ini dikirimkan dengan image sistem.
      • Operasi tulis 3 GiB dalam mode latar depan aplikasi.
      • Operasi tulis 2 GiB dalam mode latar belakang aplikasi.
      • Tulis 4 GiB dalam mode garasi sistem.
    • Ini adalah nilai minimum dasar. Batas ini diperbarui seiring dengan informasi lebih lanjut tentang penggunaan I/O disk.

Format XML konfigurasi yang digunakan secara berlebihan

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

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

Contoh konfigurasi XML diberikan 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>

Memperbarui konfigurasi penggunaan berlebihan melalui API sistem CarWatchdogManager

Konfigurasi XML di atas hanya dapat diberikan di image build. Jika OEM memilih untuk mengupdate konfigurasi di perangkat setelah build dirilis, OEM dapat menggunakan API berikut untuk melakukan perubahan pada konfigurasi di perangkat.

  • Berikan izin Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG kepada pemanggil.
  • Harus menggunakan konfigurasi yang ada untuk mengupdate dan menetapkan 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, yang tidak direkomendasikan.
  • Perbarui konfigurasi yang ada dengan perubahan delta dan tetapkan konfigurasi baru. Jangan perbarui konfigurasi sistem dan komponen pihak ketiga.
  • Gunakan API CarWatchdogManager.setResourceOveruseConfigurations untuk menetapkan konfigurasi baru.
  • Untuk mendapatkan dan menetapkan konfigurasi penggunaan berlebihan I/O disk, gunakan flag CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO.

Berikut adalah contoh implementasi yang memperbarui konfigurasi penggunaan resource 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 yang memantau penggunaan resource yang berlebihan

Aplikasi vendor dan pihak ketiga dapat memproses notifikasi penggunaan resource tertentu aplikasi dari Watchdog atau melakukan polling CarWatchdogManager untuk statistik penggunaan resource tertentu aplikasi hingga 30 hari terakhir.

Memproses notifikasi penggunaan resource yang berlebihan

Aplikasi dapat menerapkan pemroses penggunaan berlebihan resource dan mendaftarkan pemroses tersebut dengan CarWatchdogManager untuk menerima notifikasi khusus aplikasi saat melebihi 80% atau 100% batas penggunaan berlebihan I/O disk. Aplikasi dapat menggunakan notifikasi ini untuk:

  • Catat statistik penggunaan I/O disk yang berlebihan untuk analisis offline. Developer aplikasi dapat menggunakan logging ini untuk men-debug masalah penggunaan I/O disk yang berlebihan.
  • Kurangi operasi tulis I/O disk hingga penghitung penggunaan berlebihan direset.

Klien Java

  1. Implementasikan pemroses 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 pemroses 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 pemroses saat aplikasi selesai memproses:
    private void removeResourceOveruseListener() {
        CarWatchdogManager manager =
                (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);
        mCarWatchdogManager.removeResourceOveruseListener(
              mListenerImpl);
    }
    

Klien native

  1. Sertakan carwatchdog_aidl_interface-ndk_platform dalam dependensi shared_libs 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 binder (makro binder_user) dan tambahkan 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 berlebihan resource dengan mewarisi BnResourceOveruseListener. Ganti BnResourceOveruseListener::onOveruse untuk menangani notifikasi penggunaan resource 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 binder dan daftarkan pemroses yang menggunakan berlebihan resource ke server watchdog. 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);
    }
    

Mengambil sampel statistik penggunaan berlebihan resource

Aplikasi dapat melakukan polling CarWatchdogManager untuk statistik ATS penyalahgunaan I/O khusus aplikasi selama 30 hari terakhir.

Klien Java

Gunakan CarWatchdogManager.getResourceOveruseStats untuk mendapatkan statistik penggunaan resource yang berlebihan. Teruskan flag 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 native

Gunakan CarWatchdogServer.getResourceOveruseStats untuk mendapatkan statistik penggunaan resource yang berlebihan. Teruskan enum ResourceType.IO untuk mengambil statistik penggunaan I/O disk yang berlebihan.

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

Pengalaman pengguna terkait penggunaan resource yang berlebihan

Bagian berikut menjelaskan pengalaman pengguna saat terjadi penggunaan resource yang berlebihan.

Prioritaskan setelan performa aplikasi

Halaman Setelan aplikasi berisi setelan untukPrioritize app performance (lihat gambar di bawah), yang memungkinkan pengguna memprioritaskan performa aplikasi daripada sistem dan performa hardware jangka panjang. Setelan ini hanya tersedia untuk aplikasi yang aman untuk dihentikan saat terjadi penggunaan resource yang berlebihan. Jika tidak, setelan ini akan dinonaktifkan. Jika setelan ini dinonaktifkan (setelan default) untuk aplikasi, aplikasi dapat dihentikan karena penggunaan resource yang berlebihan. Jika tidak, aplikasi tidak akan dihentikan karena penggunaan resource yang berlebihan.

Saat pengguna mengaktifkan setelan ini, dialog konfirmasi berikut akan menjelaskan implikasi terkait mengaktifkan setelan:

Setelah 90 hari, setelan ini akan otomatis direset ke setelan default. Batas hari dapat diubah dengan aplikasi overlay RRO menggunakan watchdogUserPackageSettingsResetDays, hingga maksimum 180 hari. Untuk mempelajari lebih lanjut, lihat Mengubah nilai resource 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>

Setelan aplikasi yang memengaruhi performa

Aplikasi Setelan berisi bagian Aplikasi yang memengaruhi performa (lihat Gambar 1). Saat diketuk, daftar aplikasi yang telah dibatasi karena penggunaan memori flash yang berlebihan dan berdampak negatif pada performa sistem akan ditampilkan. Hal ini sesuai dengan persyaratan CDD 3.5.1 [C-1-1].

Aplikasi yang memengaruhi performa

Gambar 1. Aplikasi yang memengaruhi performa.

Aplikasi yang dihentikan karena penggunaan resource yang berlebihan tercantum di sini (lihat Gambar 2). Aplikasi yang tercantum dapat diprioritaskan. Untuk mempelajari lebih lanjut, lihat Memprioritaskan setelan performa aplikasi.

Daftar aplikasi yang dihentikan karena penggunaan resource yang berlebihan

Gambar 2. Daftar aplikasi yang dihentikan karena penggunaan resource yang berlebihan.

Notifikasi pengguna

Jika aplikasi atau layanan berulang kali menggunakan I/O disk secara berlebihan (misalnya, menulis data ke disk di luar nilai minimum yang ditentukan) dalam jangka waktu tertentu dan aman untuk dihentikan saat penggunaan resource berlebihan, pengguna akan diberi tahu setelah kendaraan memasuki status izinkan gangguan pengemudi.

Notifikasi pengguna pertama (selama perjalanan) diposting sebagai notifikasi pra-peringatan dan notifikasi lainnya diposting di pusat notifikasi.

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

  • Saat pengguna mengklik tombol Prioritaskan aplikasi, halaman setelan aplikasi akan diluncurkan, tempat pengguna dapat mengaktifkan atau menonaktifkan setelan Prioritaskan performa aplikasi.
  • Saat pengguna mengklik tombol Nonaktifkan aplikasi, aplikasi akan dinonaktifkan hingga pengguna meluncurkan aplikasi atau mengaktifkannya di halaman setelan aplikasi.
  • Untuk aplikasi yang dapat di-uninstal, tombol Nonaktifkan aplikasi diganti dengan tombol Uninstal aplikasi. Saat pengguna mengklik tombol Uninstal aplikasi, halaman Setelan aplikasi akan diluncurkan, tempat pengguna dapat meng-uninstal aplikasi.

Rekomendasi untuk penerapan peluncur

Jika aplikasi dinonaktifkan karena penggunaan resource yang berlebihan, aplikasi akan hilang dari aplikasi peluncur default karena CarService mengupdate status aktif aplikasi sebagai PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED. OEM harus mengupdate implementasi peluncur bawaan untuk menampilkan aplikasi ini sebagai tidak biasa, sehingga pengguna dapat menggunakannya jika diperlukan. Lihat rekomendasi berikut berdasarkan rilis build.

Rilis Android SC V2