Watchdog giám sát mức sử dụng bộ nhớ flash bằng cách theo dõi tổng số lượt ghi I/O trên ổ đĩa do tất cả ứng dụng và dịch vụ thực hiện bằng cách sử dụng số liệu thống kê I/O trên ổ đĩa theo UID do Kernel hiển thị tại vị trí `/proc/uid_io/stats`. Khi một ứng dụng hoặc dịch vụ vượt quá ngưỡng sử dụng quá nhiều I/O trên ổ đĩa, Watchdog sẽ thực hiện các hành động đối với ứng dụng hoặc dịch vụ đó. Ngưỡng sử dụng quá nhiều I/O trên ổ đĩa và hành động cần thực hiện khi sử dụng quá nhiều được xác định trước trong cấu hình sử dụng quá nhiều I/O trên ổ đĩa.
Ngưỡng sử dụng quá nhiều
- Ngưỡng sử dụng quá nhiều I/O trên ổ đĩa được thực thi hằng ngày, tức là tất cả lượt ghi do một ứng dụng/dịch vụ thực hiện đều được tổng hợp kể từ đầu ngày hiện tại theo giờ UTC và được kiểm tra dựa trên các ngưỡng được xác định trong cấu hình sử dụng quá nhiều.
- Khi một chiếc xe được khởi động nhiều lần trong một ngày nhất định, mô-đun Watchdog sẽ lưu trữ số liệu thống kê về mức sử dụng I/O trên ổ đĩa trong bộ nhớ flash và tổng hợp các số liệu đó kể từ đầu ngày hiện tại theo giờ UTC.
Hành động khi sử dụng quá nhiều
Khi một ứng dụng liên tục vượt quá ngưỡng sử dụng quá nhiều I/O trên ổ đĩa đã xác định, Watchdog sẽ thực hiện các hành động được xác định trong cấu hình sử dụng quá nhiều.
- Tất cả ứng dụng và dịch vụ của nhà cung cấp đều được coi là quan trọng đối với sự ổn định tổng thể của hệ thống, vì vậy, chúng không bị chấm dứt khi sử dụng quá nhiều I/O trên ổ đĩa. Tuy nhiên, cấu hình sử dụng quá nhiều có thể xác định danh sách các ứng dụng của nhà cung cấp và dịch vụ an toàn để chấm dứt.
- Tất cả ứng dụng bên thứ ba đều an toàn để chấm dứt.
Khi một ứng dụng hoặc dịch vụ an toàn để chấm dứt, Watchdog sẽ tắt ứng dụng hoặc dịch vụ đó với trạng thái thành phần ứng dụng
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
.
Cấu hình sử dụng quá nhiều
Cấu hình sử dụng quá nhiều chứa ngưỡng và hành động khi sử dụng quá nhiều I/O trên ổ đĩa. Cấu hình sử dụng quá nhiều mặc định được xác định trong hình ảnh hệ thống và nhà cung cấp, đồng thời được cung cấp cùng với bản dựng. Nhà cung cấp có thể tuỳ ý đưa cấu hình của nhà cung cấp vào hình ảnh của nhà cung cấp. Khi không có cấu hình của nhà cung cấp, cấu hình hệ thống cũng được sử dụng cho các ứng dụng và dịch vụ của nhà cung cấp.
Watchdog hiển thị các API hệ thống thông qua CarWatchdogManager, cho phép các ứng dụng hoặc dịch vụ của nhà cung cấp cập nhật cấu hình của nhà cung cấp bất cứ lúc nào.
Định nghĩa cấu hình sử dụng quá nhiều
Cấu hình sử dụng quá nhiều được chia theo loại thành phần, ví dụ: hệ thống, nhà cung cấp và bên thứ ba. Nhà sản xuất thiết bị gốc (OEM) chỉ được cập nhật cấu hình thành phần của nhà cung cấp.
Cấu hình của nhà cung cấp
Cấu hình của nhà cung cấp xác định ngưỡng và hành động khi sử dụng quá nhiều I/O trên ổ đĩa cho tất cả ứng dụng và dịch vụ của nhà cung cấp, cũng như tất cả ứng dụng bản đồ và ứng dụng đa phương tiện. Cấu hình này chứa các trường cấu hình bên dưới.
- Tiền tố gói của nhà cung cấp. Tất cả gói được cài đặt trong phân vùng của nhà cung cấp đều được coi là gói của nhà cung cấp. Ngoài các gói này, nhà cung cấp có thể phân loại các gói được cài đặt sẵn là gói của nhà cung cấp bằng cách thêm tiền tố gói vào cấu hình tiền tố gói của nhà cung cấp. Cấu hình này không chấp nhận biểu thức chính quy.
- Gói an toàn để chấm dứt. Nhà cung cấp có thể chỉ định những gói nào của nhà cung cấp an toàn để chấm dứt bằng cách thêm tên gói đầy đủ vào cấu hình gói an toàn để chấm dứt.
- Mối liên kết danh mục ứng dụng. Nhà cung cấp có thể liên kết bất kỳ gói nào (bao gồm cả gói của bên thứ ba) với một trong hai danh mục ứng dụng được hỗ trợ – Ứng dụng bản đồ và ứng dụng đa phương tiện. Việc liên kết này được thực hiện để cung cấp ngưỡng sử dụng quá nhiều I/O trên ổ đĩa cao hơn cho các ứng dụng bản đồ và ứng dụng đa phương tiện vì các ứng dụng này có xu hướng tải xuống và ghi nhiều dữ liệu hơn vào ổ đĩa so với các loại ứng dụng khác.
- Ngưỡng ở cấp thành phần. Xác định ngưỡng chung cho tất cả gói của nhà cung cấp (tức là các gói không thuộc Ngưỡng dành riêng cho gói hoặc Ngưỡng dành riêng cho danh mục ứng dụng sẽ nhận được các ngưỡng này). Nhà cung cấp phải xác định ngưỡng ở cấp thành phần khác 0 khi xác định cấu hình sử dụng quá nhiều I/O trên ổ đĩa.
- Ngưỡng dành riêng cho gói. Nhà cung cấp có thể xác định ngưỡng đặc biệt cho các gói cụ thể của nhà cung cấp. Các mối liên kết phải chứa tên gói đầy đủ. Ngưỡng được xác định trong cấu hình này sẽ được ưu tiên hơn ngưỡng được xác định trong các cấu hình khác cho một gói nhất định.
- Ngưỡng dành riêng cho danh mục ứng dụng. Nhà cung cấp có thể chỉ định ngưỡng đặc biệt cho các danh mục ứng dụng cụ thể. Danh mục ứng dụng phải là một trong các danh mục được hỗ trợ – Ứng dụng bản đồ và ứng dụng đa phương tiện. Ngưỡng được xác định trong cấu hình này được liên kết với các gói cụ thể bằng cách sử dụng Mối liên kết danh mục ứng dụng.
- Ngưỡng trên toàn hệ thống. Nhà cung cấp không được chỉ định cấu hình này.
Chỉ cấu hình của nhà cung cấp mới có thể cập nhật các cấu hình tiền tố gói của nhà cung cấp, gói an toàn để chấm dứt, ngưỡng ở cấp thành phần, và ngưỡng dành riêng cho gói cho các ứng dụng và dịch vụ của nhà cung cấp. Chỉ cấu hình của nhà cung cấp mới có thể cập nhật cấu hình ngưỡng dành riêng cho danh mục ứng dụng cho tất cả ứng dụng bản đồ và ứng dụng đa phương tiện.
Ngưỡng sử dụng quá nhiều chứa số byte được phép ghi trong:
- Chế độ nền trước so với chế độ nền của ứng dụng hoặc dịch vụ
- Chế độ nhà để xe của hệ thống
Việc phân loại này cho phép các ứng dụng và dịch vụ ở nền trước hướng đến người dùng ghi nhiều dữ liệu hơn các ứng dụng và dịch vụ ở nền. Ở chế độ Nhà để xe, các ứng dụng và dịch vụ có xu hướng tải bản cập nhật xuống, vì vậy, mỗi ứng dụng và dịch vụ cần có ngưỡng cao hơn các ứng dụng và dịch vụ chạy ở các chế độ khác.
Cấu hình hệ thống và bên thứ ba
Nhà sản xuất thiết bị gốc (OEM) không được cập nhật cấu hình hệ thống và bên thứ ba.
- Cấu hình hệ thống xác định ngưỡng và hành động khi sử dụng quá nhiều I/O cho
các ứng dụng và dịch vụ hệ thống.
- Cấu hình này cũng có thể cập nhật Mối liên kết danh mục ứng dụng. Do đó, trường cấu hình này được chia sẻ giữa cấu hình hệ thống và cấu hình của nhà cung cấp.
- Cấu hình bên thứ ba xác định ngưỡng cho tất cả ứng dụng bên thứ ba. Tất cả ứng dụng không được cài đặt sẵn trong hệ thống đều là
ứng dụng bên thứ ba.
- Tất cả ứng dụng bên thứ ba đều nhận được cùng một ngưỡng (ví dụ: không có ứng dụng bên thứ ba nào nhận được ngưỡng đặc biệt) ngoại trừ ứng dụng bản đồ và ứng dụng đa phương tiện. Ngưỡng của các ứng dụng này được xác định theo cấu hình của nhà cung cấp.
- Ngưỡng sử dụng quá nhiều I/O trên ổ đĩa bên dưới là ngưỡng mặc định cho các ứng dụng bên thứ ba. Các ngưỡng này được cung cấp cùng với hình ảnh hệ thống.
- Ghi 3 GiB ở chế độ nền trước của ứng dụng.
- Ghi 2 GiB ở chế độ nền của ứng dụng.
- Ghi 4 GiB ở chế độ nhà để xe của hệ thống.
- Đây là các ngưỡng cơ sở. Các ngưỡng này được cập nhật khi bạn tìm hiểu thêm về mức sử dụng I/O trên ổ đĩa.
Định dạng XML của cấu hình sử dụng quá nhiều
Không bắt buộc: Trong Android 16 trở lên, bạn có thể đặt cấu hình mặc định của nhà cung cấp trong /vendor/etc/io-watchdog/resource_overuse_configuration.xml trong hình ảnh bản dựng.
Trong Android 15 trở xuống, bạn có thể đặt cấu hình mặc định của nhà cung cấp trong /vendor/etc/watchdog/resource_overuse_configuration.xml trong hình ảnh bản dựng. Khi không chỉ định cấu hình này, cấu hình do hệ thống xác định cũng được áp dụng cho các ứng dụng và dịch vụ của nhà cung cấp.
Tệp XML chỉ được chứa một thẻ cho mỗi trường cấu hình. Bạn phải xác định cấu hình sử dụng quá nhiều I/O trong tệp XML. Tất cả giá trị ngưỡng phải được chỉ định theo đơn vị MiB.
Dưới đây là cấu hình XML mẫu:
<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>
Cập nhật cấu hình sử dụng quá nhiều thông qua API hệ thống CarWatchdogManager
Bạn chỉ có thể cung cấp cấu hình XML ở trên trong hình ảnh bản dựng. Nếu chọn cập nhật cấu hình trên thiết bị sau khi phát hành bản dựng, nhà sản xuất thiết bị gốc (OEM) có thể sử dụng các API sau để thay đổi cấu hình trên thiết bị.
- Cấp quyền
Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIGcho trình gọi. - Phải sử dụng các cấu hình hiện có để cập nhật và thiết lập các cấu hình mới. Sử dụng API
CarWatchdogManager.getResourceOveruseConfigurationsđể nhận các cấu hình hiện có. Nếu không sử dụng các cấu hình hiện có, tất cả cấu hình (bao gồm cả cấu hình hệ thống và bên thứ ba) sẽ bị ghi đè. Bạn không nên làm như vậy. - Cập nhật các cấu hình hiện có bằng các thay đổi delta và thiết lập cấu hình mới. Không cập nhật cấu hình thành phần hệ thống và bên thứ ba.
- Sử dụng API
CarWatchdogManager.setResourceOveruseConfigurationsđể thiết lập cấu hình mới. - Để nhận và thiết lập cấu hình sử dụng quá nhiều I/O trên ổ đĩa, hãy sử dụng cờ
CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO.
Dưới đây là mẫu triển khai cập nhật cấu hình sử dụng quá nhiều tài nguyên:
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(); }
Ứng dụng giám sát việc sử dụng quá nhiều tài nguyên
Ứng dụng của nhà cung cấp và bên thứ ba có thể nghe thông báo sử dụng quá nhiều tài nguyên dành riêng cho ứng dụng từ Watchdog hoặc thăm dò CarWatchdogManager để biết số liệu thống kê sử dụng quá nhiều tài nguyên dành riêng cho ứng dụng trong tối đa 30 ngày qua.
Nghe thông báo sử dụng quá nhiều tài nguyên
Các ứng dụng có thể triển khai trình nghe sử dụng quá nhiều tài nguyên và đăng ký trình nghe với CarWatchdogManager để nhận thông báo dành riêng cho ứng dụng khi vượt quá 80% hoặc 100% ngưỡng sử dụng quá nhiều I/O trên ổ đĩa. Các ứng dụng có thể sử dụng những thông báo này để:
- Ghi lại số liệu thống kê sử dụng quá nhiều I/O trên ổ đĩa để phân tích ngoại tuyến. Nhà phát triển ứng dụng có thể sử dụng tính năng ghi nhật ký này để gỡ lỗi sự cố sử dụng quá nhiều I/O trên ổ đĩa.
- Giảm số lượt ghi I/O trên ổ đĩa cho đến khi bộ đếm sử dụng quá nhiều được đặt lại.
Ứng dụng Java
- Triển khai trình nghe bằng cách kế thừa
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() } } }
- Đăng ký thực thể trình nghe bằng cách gọi
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); } - Huỷ đăng ký thực thể trình nghe khi ứng dụng đã hoàn tất việc nghe:
private void removeResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); mCarWatchdogManager.removeResourceOveruseListener( mListenerImpl); }
Native Client
- Đưa
carwatchdog_aidl_interface-ndk_platformvào phần phụ thuộcshared_libscủa quy tắc bản dựng.Android.bpcc_binary { name: "sample_native_client", srcs: [ "src/*.cpp" ], shared_libs: [ "carwatchdog_aidl_interface-ndk_platform", "libbinder_ndk", ], vendor: true, } - Thêm chính sách SELinux để cho phép miền dịch vụ của nhà cung cấp sử dụng trình liên kết
(
binder_usermacro) và thêm miền dịch vụ của nhà cung cấp vàocarwatchdogmiền ứng dụng(carwatchdog_client_domain macro). Hãy xem mã bên dưới để biếtsample_client.tevà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
- Triển khai trình nghe sử dụng quá nhiều tài nguyên bằng cách kế thừa
BnResourceOveruseListener. Ghi đèBnResourceOveruseListener::onOveruseđể xử lý thông báo sử dụng quá nhiều tài nguyên.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(); }
- Khởi động nhóm luồng trình liên kết và đăng ký trình nghe sử dụng quá nhiều tài nguyên
với máy chủ giám sát. Máy chủ giám sát được đăng ký theo tên dịch vụ
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); }
Thăm dò số liệu thống kê sử dụng quá nhiều tài nguyên
Các ứng dụng có thể thăm dò CarWatchdogManager để biết số liệu thống kê sử dụng quá nhiều I/O dành riêng cho ứng dụng trong 30 ngày gần đây nhất.
Ứng dụng Java
Sử dụng CarWatchdogManager.getResourceOveruseStats để nhận số liệu thống kê sử dụng quá nhiều tài nguyên. Truyền cờ CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO để nhận số liệu thống kê sử dụng quá nhiều I/O trên ổ đĩa.
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()
}Native Client
Sử dụng CarWatchdogServer.getResourceOveruseStats để nhận số liệu thống kê sử dụng quá nhiều tài nguyên. Truyền enum ResourceType.IO để tìm nạp số liệu thống kê sử dụng quá nhiều I/O trên ổ đĩa.
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 } }
Trải nghiệm người dùng khi sử dụng quá nhiều tài nguyên
Các phần sau đây mô tả trải nghiệm người dùng khi sử dụng quá nhiều tài nguyên.
Chế độ cài đặt Ưu tiên hiệu suất của ứng dụng
Trang Cài đặt của ứng dụng chứa các chế độ cài đặt choPrioritize app performance
(xem hình bên dưới), cho phép người dùng ưu tiên hiệu suất của ứng dụng so với hiệu suất của hệ thống và
phần cứng dài hạn. Chế độ cài đặt này chỉ áp dụng cho các ứng dụng an toàn để
chấm dứt khi sử dụng quá nhiều tài nguyên. Nếu không, chế độ cài đặt này sẽ bị tắt. Khi chế độ cài đặt này được
chuyển sang tắt (chế độ cài đặt mặc định) cho một ứng dụng, ứng dụng đó có thể bị chấm dứt khi sử dụng quá nhiều tài nguyên.
Nếu không, ứng dụng sẽ không bị chấm dứt khi sử dụng quá nhiều tài nguyên.

Khi người dùng bật chế độ cài đặt này, hộp thoại xác nhận sau đây sẽ mô tả những hệ quả khi bật chế độ cài đặt này:

Sau 90 ngày, chế độ cài đặt này sẽ tự động được đặt lại về mặc định. Bạn có thể sửa đổi giới hạn ngày bằng ứng dụng lớp phủ RRO bằng cách sử dụng watchdogUserPackageSettingsResetDays,
tối đa là 180 ngày. Để tìm hiểu thêm, hãy xem
Thay đổi giá trị của tài nguyên ứng dụng trong thời gian chạy. Bạn có thể đưa thẻ lớp phủ ví dụ sau vào AndroidManifest.xml:
<overlay android:priority="<insert-value>" android:targetPackage="com.android.car.updatable" android:targetName="CarServiceCustomization" android:resourcesMap="@xml/overlays" />
Trong res/values/config.xml:
<resources> <integer name="watchdogUserPackageSettingsResetDays">value</integer> </resources>
Trong res/xml/overlays.xml:
<overlay> <item target="integer/watchdogUserPackageSettingsResetDays" value="@integer/watchdogUserPackageSettingsResetDays" /> </overlay>
Chế độ cài đặt Ứng dụng ảnh hưởng đến hiệu suất
Ứng dụng Cài đặt chứa phần Ứng dụng ảnh hưởng đến hiệu suất (xem Hình 1). Khi bạn nhấn vào, một danh sách các ứng dụng bị hạn chế do sử dụng quá nhiều bộ nhớ flash và ảnh hưởng tiêu cực đến hiệu suất hệ thống sẽ xuất hiện. Điều này tuân theo yêu cầu CDD 3.5.1 [C-1-1].

Hình 1. Ứng dụng ảnh hưởng đến hiệu suất.
Các ứng dụng bị chấm dứt do sử dụng quá nhiều tài nguyên được liệt kê tại đây (xem Hình 2). Bạn có thể ưu tiên các ứng dụng được liệt kê. Để tìm hiểu thêm, hãy xem phần Chế độ cài đặt Ưu tiên hiệu suất của ứng dụng.

Hình 2. Danh sách các ứng dụng bị chấm dứt do sử dụng quá nhiều tài nguyên.
Thông báo cho người dùng
Khi một ứng dụng hoặc dịch vụ liên tục sử dụng quá nhiều I/O trên ổ đĩa (ví dụ: ghi dữ liệu vào ổ đĩa vượt quá ngưỡng đã xác định) trong một khoảng thời gian nhất định và an toàn để chấm dứt khi sử dụng quá nhiều tài nguyên, người dùng sẽ được thông báo sau khi xe chuyển sang trạng thái cho phép người lái mất tập trung.
Thông báo đầu tiên cho người dùng (trong khi lái xe) được đăng dưới dạng thông báo quan trọng và các thông báo khác được đăng trên trung tâm thông báo.
Ví dụ: khi một ứng dụng liên tục sử dụng quá nhiều I/O trên ổ đĩa, người dùng sẽ nhận được thông báo sau:
- Khi người dùng nhấp vào nút Ưu tiên ứng dụng, trang cài đặt của ứng dụng sẽ khởi chạy. Tại đây, người dùng có thể bật hoặc tắt chế độ cài đặt Ưu tiên hiệu suất của ứng dụng.
- Khi người dùng nhấp vào nút Tắt ứng dụng, ứng dụng sẽ bị tắt cho đến khi người dùng khởi chạy ứng dụng hoặc bật ứng dụng đó trên trang cài đặt của ứng dụng.
- Đối với các ứng dụng không gỡ cài đặt được, nút Tắt ứng dụng sẽ
được thay thế bằng nút Gỡ cài đặt ứng dụng. Khi người dùng nhấp vào nút
Gỡ cài đặt ứng dụng, trang Cài đặt của ứng dụng sẽ khởi chạy.
Tại đây, người dùng có thể gỡ cài đặt ứng dụng.


Đề xuất triển khai trình chạy
Khi các ứng dụng bị tắt do sử dụng quá nhiều tài nguyên, các ứng dụng đó sẽ biến mất khỏi
ứng dụng trình chạy mặc định vì CarService cập nhật trạng thái đã bật của các ứng dụng thành
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED.
Nhà sản xuất thiết bị gốc (OEM) phải cập nhật quá trình triển khai trình chạy tích hợp để hiển thị các ứng dụng này như bình thường, để người dùng có thể sử dụng nếu cần. Hãy xem các đề xuất sau đây dựa trên bản phát hành bản dựng.
Bản phát hành Android SC V2
- Quá trình triển khai trình chạy phải sử dụng cờ
MATCH_DISABLED_UNTIL_USED_COMPONENTSkhi truy xuất danh sách các gói để hiển thị trên trình chạy. - Khi người dùng nhấp vào một ứng dụng ở trạng thái
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, ứng dụng trình chạy phải bật ứng dụng đó bằng cách thiết lập trạng thái đã bật như sau: