نظارت بر مصرف فلش مموری

Watchdog استفاده از حافظه فلش را با ردیابی کل مقدار ورودی/خروجی دیسک که توسط همه برنامه‌ها و سرویس‌ها با استفاده از آمار ورودی/خروجی دیسک هر UID که توسط هسته در مکان «/proc/uid_io/stats» در معرض نمایش قرار می‌گیرد، نظارت می‌کند. وقتی یک برنامه یا سرویس از آستانه استفاده بیش از حد ورودی/خروجی دیسک فراتر رود، Watchdog اقداماتی را روی برنامه یا سرویس انجام می‌دهد. آستانه استفاده بیش از حد ورودی/خروجی دیسک و اقدامی که برای استفاده بیش از حد انجام می شود در پیکربندی استفاده بیش از حد از ورودی/خروجی دیسک از پیش تعریف شده است.

آستانه استفاده بیش از حد

  • آستانه استفاده بیش از حد ورودی/خروجی دیسک به صورت روزانه اعمال می‌شود، یعنی همه نوشته‌های ایجاد شده توسط یک برنامه/سرویس از ابتدای روز تقویم فعلی UTC جمع‌آوری می‌شوند و در برابر آستانه‌های تعریف‌شده در تنظیمات استفاده بیش از حد بررسی می‌شوند.
  • هنگامی که یک وسیله نقلیه چندین بار در یک روز مشخص راه اندازی می شود، ماژول Watchdog آمار استفاده از ورودی/خروجی دیسک را در حافظه فلش ذخیره می کند و آنها را از ابتدای روز تقویم فعلی UTC جمع می کند.

اقدامات استفاده بیش از حد

هنگامی که یک برنامه به طور مکرر از آستانه استفاده بیش از حد ورودی/خروجی دیسک تعریف شده فراتر رود، Watchdog اقداماتی را انجام می دهد که در پیکربندی استفاده بیش از حد تعریف شده است.

  • همه برنامه‌ها و سرویس‌های فروشنده برای ثبات کلی سیستم حیاتی در نظر گرفته می‌شوند، بنابراین در استفاده بیش از حد از ورودی/خروجی دیسک پایان نمی‌یابند. با این حال، پیکربندی استفاده بیش از حد می‌تواند فهرستی از برنامه‌ها و سرویس‌های فروشنده را مشخص کند.
  • تمام برنامه های شخص ثالث قابل پایان شدن هستند.

هنگامی که یک برنامه یا سرویس ایمن برای پایان یافتن است، Watchdog برنامه یا سرویس را با وضعیت مؤلفه برنامه PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED غیرفعال می کند.

پیکربندی استفاده بیش از حد

پیکربندی استفاده بیش از حد شامل آستانه ها و اقدامات استفاده بیش از حد ورودی/خروجی دیسک است. تنظیمات پیش‌فرض استفاده بیش از حد در تصاویر سیستم و فروشنده تعریف شده و همراه با ساخت ارسال می‌شوند. فروشندگان می توانند به صورت اختیاری پیکربندی فروشنده را در تصویر فروشنده قرار دهند. هنگامی که پیکربندی فروشنده ارائه نمی شود، پیکربندی سیستم برای برنامه ها و سرویس های فروشنده نیز استفاده می شود.

Watchdog APIهای سیستم را از طریق CarWatchdogManager افشا می‌کند، که به برنامه‌ها یا سرویس‌های فروشندگان اجازه می‌دهد پیکربندی فروشنده را در هر زمان به‌روزرسانی کنند.

تعریف پیکربندی استفاده بیش از حد

پیکربندی استفاده بیش از حد بر اساس نوع مؤلفه تقسیم می شود، به عنوان مثال، سیستم، فروشنده، و شخص ثالث. OEM ها باید فقط پیکربندی مؤلفه فروشنده را به روز کنند.

پیکربندی فروشنده

پیکربندی فروشنده آستانه‌ها و اقدامات استفاده بیش از حد ورودی/خروجی دیسک را برای همه برنامه‌ها و سرویس‌های فروشنده و همه نقشه‌ها و برنامه‌های رسانه تعریف می‌کند. پیکربندی شامل فیلدهای پیکربندی زیر است.

  • پیشوندهای بسته فروشنده تمام بسته های نصب شده در پارتیشن فروشنده به عنوان بسته های فروشنده در نظر گرفته می شوند. علاوه بر این بسته ها، فروشندگان می توانند بسته های از پیش نصب شده را به عنوان بسته های فروشنده با افزودن پیشوندهای بسته به پیکربندی پیشوندهای بسته فروشنده طبقه بندی کنند. این پیکربندی عبارات منظم را نمی پذیرد.
  • بسته های ایمن تا پایان . فروشندگان می توانند با افزودن نام بسته های کامل به پیکربندی بسته های امن برای پایان، مشخص کنند که کدام بسته های فروشنده ایمن برای پایان دادن هستند.
  • نگاشت دسته بندی برنامه ها فروشندگان می توانند هر بسته (از جمله بسته های شخص ثالث) را به یکی از دو دسته برنامه پشتیبانی شده - نقشه و برنامه های رسانه نگاشت کنند. این نگاشت برای ارائه نقشه‌ها و برنامه‌های رسانه‌ای انجام می‌شود که آستانه استفاده بیش از حد از دیسک ورودی/خروجی بالاتری دارند، زیرا این برنامه‌ها تمایل به دانلود و نوشتن داده‌های بیشتری روی دیسک نسبت به انواع دیگر برنامه‌ها دارند.
  • آستانه های سطح مؤلفه . آستانه‌های عمومی را برای همه بسته‌های فروشنده تعریف می‌کند (یعنی بسته‌هایی که تحت پوشش آستانه‌های خاص بسته یا آستانه‌های خاص دسته‌بندی برنامه نیستند، این آستانه‌ها را دریافت می‌کنند). هنگام تعریف پیکربندی استفاده بیش از حد از ورودی/خروجی دیسک، فروشنده ها باید آستانه های غیرصفری در سطح مؤلفه را تعریف کنند.
  • آستانه های خاص بسته فروشندگان می توانند آستانه های خاصی را برای بسته های فروشنده خاص تعریف کنند. نگاشتها باید شامل نام کامل بسته باشد. آستانه های تعریف شده در این پیکربندی بر آستانه های تعریف شده در تنظیمات دیگر برای یک بسته معین اولویت دارند.
  • آستانه های خاص دسته برنامه . فروشندگان می توانند آستانه های ویژه ای را برای دسته بندی برنامه های خاص مشخص کنند. دسته‌های برنامه باید یکی از دسته‌های پشتیبانی‌شده باشد - برنامه‌های Maps و Media. آستانه های تعریف شده در این پیکربندی با استفاده از نگاشت های دسته برنامه به بسته های خاصی نگاشت می شوند.
  • آستانه های گسترده سیستم فروشندگان نباید این پیکربندی را مشخص کنند.

پیشوندهای بسته فروشنده ، بسته‌های ایمن تا پایان ، آستانه‌های سطح مؤلفه ، و پیکربندی‌های آستانه خاص بسته فقط توسط پیکربندی فروشنده برای برنامه‌ها و سرویس‌های فروشنده قابل به‌روزرسانی هستند. پیکربندی آستانه های خاص دسته برنامه را می توان فقط توسط پیکربندی فروشنده برای همه نقشه ها و برنامه های رسانه به روز کرد.

آستانه های استفاده بیش از حد حاوی مقدار بایت هایی هستند که اجازه نوشتن در طول:

  • حالت پیش‌زمینه برنامه یا سرویس در مقابل حالت پس‌زمینه
  • حالت گاراژ سیستم

این طبقه‌بندی به کاربر اجازه می‌دهد تا برنامه‌ها و سرویس‌های پیش‌زمینه اطلاعات بیشتری را نسبت به برنامه‌ها و سرویس‌های پس‌زمینه بنویسد. در حالت Garage، برنامه‌ها و سرویس‌ها تمایل دارند به‌روزرسانی‌ها را دانلود کنند، بنابراین هر کدام به آستانه بالاتری نسبت به برنامه‌ها و سرویس‌هایی که در حالت‌های دیگر اجرا می‌شوند نیاز دارند.

تنظیمات سیستم و شخص ثالث

OEM ها نباید سیستم و پیکربندی های شخص ثالث را به روز کنند.

  • پیکربندی سیستم آستانه‌ها و اقدامات استفاده بیش از حد ورودی/خروجی را برای برنامه‌ها و سرویس‌های سیستم تعریف می‌کند.
    • این پیکربندی همچنین می‌تواند نگاشت‌های دسته برنامه را به‌روزرسانی کند. بنابراین، این فیلد پیکربندی بین پیکربندی های سیستم و فروشنده به اشتراک گذاشته می شود.
  • پیکربندی شخص ثالث آستانه هایی را برای همه برنامه های شخص ثالث تعریف می کند. همه برنامه هایی که از قبل در سیستم نصب نشده اند، برنامه های شخص ثالث هستند.
    • همه برنامه‌های شخص ثالث آستانه‌های یکسانی را دریافت می‌کنند (به عنوان مثال، هیچ برنامه شخص ثالث آستانه‌های خاصی را دریافت نمی‌کند) به جز نقشه‌ها و برنامه‌های رسانه‌ای که آستانه‌های آن‌ها توسط پیکربندی فروشنده تعریف می‌شوند.
    • آستانه‌های استفاده بیش از حد ورودی/خروجی دیسک زیر آستانه‌های پیش‌فرض برای برنامه‌های شخص ثالث هستند. این آستانه ها همراه با تصویر سیستم ارسال می شوند.
      • 3 گیگابایت در حالت پیش زمینه برنامه بنویسید.
      • 2 گیگابایت در حالت پس‌زمینه برنامه بنویسید.
      • 4 گیگابایت در حالت گاراژ سیستم بنویسید.
    • اینها آستانه های پایه هستند. این آستانه ها با یادگیری بیشتر در مورد استفاده از ورودی/خروجی دیسک به روز می شوند.

استفاده بیش از حد از پیکربندی قالب XML

پیکربندی پیش فرض فروشنده را می توان (این اختیاری است) در مکان /vendor/etc/automotive/watchdog/resource_overuse_configuration.xml در تصویر ساخت قرار داد. وقتی این پیکربندی مشخص نشده باشد، پیکربندی تعریف شده توسط سیستم برای برنامه‌ها و سرویس‌های فروشنده نیز اعمال می‌شود.

فایل XML باید فقط یک تگ برای هر فیلد پیکربندی داشته باشد. پیکربندی استفاده بیش از حد I/O باید در فایل XML تعریف شود. تمام مقادیر آستانه باید در واحد MiB مشخص شود.

نمونه پیکربندی 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 درصد آستانه استفاده بیش از حد دیسک ورودی/خروجی خود فراتر می‌روند، اعلان‌های خاص برنامه را دریافت کنند. برنامه‌ها می‌توانند از این اعلان‌ها برای موارد زیر استفاده کنند:

  • آمار استفاده بیش از حد ورودی/خروجی دیسک را برای تجزیه و تحلیل آفلاین ثبت کنید. توسعه دهندگان برنامه می توانند از این گزارش برای رفع اشکال مشکل استفاده بیش از حد ورودی/خروجی دیسک استفاده کنند.
  • نوشتن ورودی/خروجی دیسک را تا زمانی که شمارنده های استفاده بیش از حد بازنشانی شوند، کاهش دهید.

کلاینت جاوا

  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 (ماکرو 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 ثبت کنید. سرور 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 روز اخیر نظرسنجی کنند.

کلاینت جاوا

برای دریافت آمار استفاده بیش از حد از منابع، از CarWatchdogManager.getResourceOveruseStats استفاده کنید. پرچم CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO را پاس کنید تا آمار استفاده بیش از حد دیسک ورودی/خروجی را دریافت کنید.

private void getResourceOveruseStats() {
      CarWatchdogManager manager =
            (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE);

      // Returns resource overuse stats with I/O overuse stats for the past
      // 7 days. Stats are available for up to the past 30 days.
      ResourceOveruseStats resourceOveruseStats =
            mCarWatchdogManager.getResourceOveruseStats(
                  CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO,
                  CarWatchdogManager.STATS_PERIOD_PAST_7_DAYS);

      IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats();
      // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime()
      //   + ioOveruseStats.getDurationInSeconds()]
      // Total I/O overuses - ioOveruseStats.getTotalOveruses()
      // Total bytes written - ioOveruseStats.getTotalBytesWritten()
      // Remaining write bytes for the UTC calendar day -
      //    ioOveruseStats.getRemainingWriteBytes()
}

مشتری بومی

برای دریافت آمار استفاده بیش از حد از منابع، از CarWatchdogServer.getResourceOveruseStats استفاده کنید. برای واکشی آمار استفاده بیش از حد دیسک ورودی/خروجی، فهرست ResourceType.IO را ارسال کنید.

void getResourceOveruseStats() {
      ndk::SpAIBinder binder(AServiceManager_getService(
            "android.automotive.watchdog.ICarWatchdog/default"));
      std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder);
      // Returns the stats only for the current UTC calendar day.
      const std::vector<ResourceOveruseStats> resourceOveruseStats;
      ndk::ScopedAStatus status = server.getResourceOveruseStats(
            std::vector<int>{ResourceType.IO}, &resourceOveruseStats);
      if (!status.isOk()) {
            // Failed to get the resource overuse stats.
            return;
      }

      for (const auto& stats : resourceOveruseStats) {
            if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) {
                  continue;
            }
            const IoOveruseStats& ioOveruseStats = stats.get();
            // Stats period - [ioOveruseStats.startTime,
            //   ioOveruseStats.startTime + ioOveruseStats.durationInSeconds]
            // Total I/O overuses - ioOveruseStats.totalOveruses
            // Total bytes written - ioOveruseStats.writtenBytes
            // Remaining write bytes for the current UTC calendar day -
            //   ioOveruseStats.remainingWriteBytes
      }
}

استفاده بیش از حد از منابع تجربه کاربری

بخش‌های زیر تجربه کاربر در هنگام استفاده بیش از حد از منابع را شرح می‌دهند.

تنظیمات عملکرد برنامه را اولویت بندی کنید

صفحه تنظیمات برنامه حاوی تنظیماتی برای Prioritize app performance است (تصویر زیر را ببینید)، که به کاربران اجازه می‌دهد عملکرد برنامه را نسبت به سیستم و عملکرد سخت‌افزار بلندمدت اولویت‌بندی کنند. این تنظیم فقط برای برنامه‌هایی در دسترس است که در صورت استفاده بیش از حد از منابع قابل پایان هستند. در غیر این صورت، این تنظیم غیرفعال است. هنگامی که این تنظیم برای یک برنامه غیرفعال می شود (تنظیم پیش فرض)، برنامه می تواند در صورت استفاده بیش از حد از منابع خاتمه یابد. در غیر این صورت، برنامه با استفاده بیش از حد از منابع خاتمه نمی یابد.

هنگامی که کاربر این تنظیم را تغییر می دهد، گفتگوی تأیید زیر پیامدهای تغییر روی تنظیمات را توضیح می دهد:

پس از 90 روز، این تنظیم به طور خودکار به حالت پیش فرض بازنشانی می شود. محدودیت روز را می توان با یک برنامه روکش RRO با استفاده از watchdogUserPackageSettingsResetDays ، حداکثر تا 180 روز تغییر داد. برای کسب اطلاعات بیشتر، به تغییر مقدار منابع برنامه در زمان اجرا مراجعه کنید. تگ همپوشانی مثال زیر را می توان در AndroidManifest.xml گنجاند:

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

در res/values/config.xml :

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

در res/xml/overlays.xml :

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

تنظیمات برنامه های تاثیرگذار بر عملکرد

برنامه تنظیمات شامل بخش برنامه‌های تأثیرگذار بر عملکرد است (شکل 1 را ببینید). با ضربه زدن، لیستی از برنامه هایی که به دلیل استفاده بیش از حد از حافظه فلش محدود شده اند و بر عملکرد سیستم تأثیر منفی می گذارد، نمایش داده می شود. این از الزام CDD 3.5.1 پیروی می کند [C-1-1] .

برنامه های تاثیرگذار بر عملکرد

شکل 1. برنامه های تاثیرگذار بر عملکرد.

برنامه هایی که به دلیل استفاده بیش از حد از منابع خاتمه یافته اند در اینجا فهرست شده اند (شکل 2 را ببینید). برنامه های لیست شده را می توان اولویت بندی کرد. برای کسب اطلاعات بیشتر، اولویت بندی تنظیمات عملکرد برنامه را ببینید.

لیست برنامه هایی که به دلیل استفاده بیش از حد از منابع خاتمه یافته اند

شکل 2. لیست برنامه هایی که به دلیل استفاده بیش از حد از منابع خاتمه یافته اند.

اطلاع رسانی کاربر

هنگامی که یک برنامه یا سرویس به طور مکرر از ورودی/خروجی دیسک بیش از حد استفاده می کند (به عنوان مثال، داده ها را فراتر از آستانه های تعریف شده روی دیسک می نویسد) و در صورت استفاده بیش از حد از منابع، امکان خاتمه آن ایمن است، پس از ورود وسیله نقلیه به مجوز راننده، به کاربر اطلاع داده می شود. - حالت حواس پرتی

اولین اعلان کاربر (در حین درایو) به عنوان اعلان سرآغاز و سایر اعلان ها در مرکز اطلاع رسانی ارسال می شود.

به عنوان مثال، هنگامی که یک برنامه به طور مکرر از ورودی/خروجی دیسک بیش از حد استفاده می کند، کاربر اعلان زیر را دریافت می کند:

  • هنگامی که کاربر روی دکمه اولویت برنامه کلیک می کند، صفحه تنظیمات برنامه راه اندازی می شود، جایی که کاربر می تواند تنظیمات عملکرد برنامه اولویت بندی را روشن یا خاموش کند.
  • هنگامی که کاربر روی دکمه غیرفعال کردن برنامه کلیک می کند، برنامه غیرفعال می شود تا زمانی که کاربر برنامه را راه اندازی کند یا آن را در صفحه تنظیمات برنامه فعال کند.
  • برای برنامه های غیر قابل نصب، دکمه Disable app با دکمه Uninstall app جایگزین می شود. هنگامی که کاربر روی دکمه Uninstall app کلیک می کند، صفحه تنظیمات برنامه باز می شود که کاربر می تواند برنامه را حذف نصب کند.

توصیه برای پیاده سازی لانچر

وقتی برنامه‌ها به دلیل استفاده بیش از حد از منابع غیرفعال می‌شوند، برنامه‌ها از برنامه راه‌انداز پیش‌فرض ناپدید می‌شوند زیرا CarService وضعیت فعال برنامه‌ها را به‌عنوان PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED به‌روزرسانی می‌کند.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED. OEM ها باید اجرای لانچر داخلی را به روز کنند تا این برنامه ها را غیرعادی نشان دهند تا در صورت نیاز کاربران بتوانند از آنها استفاده کنند. توصیه‌های زیر را بر اساس نسخه‌ی بیلد مشاهده کنید.

انتشار اندروید SC V2