کلاس ها و آیتم های ConfigStore را اضافه کنید

شما می‌توانید آیتم‌های جدید ConfigStore (یعنی متدهای رابط) را برای یک کلاس رابط موجود اضافه کنید. اگر کلاس رابط تعریف نشده باشد، قبل از اینکه بتوانید یک آیتم ConfigStore برای آن کلاس اضافه کنید، باید یک کلاس جدید اضافه کنید. در این بخش از مثال یک آیتم پیکربندی disableInitBlank برای healthd که به کلاس رابط IChargerConfigs اضافه می‌شود، استفاده می‌شود.

اضافه کردن کلاس‌های رابط

اگر هیچ کلاس رابطی برای متد رابطی که می‌خواهید اضافه کنید تعریف نشده باشد، قبل از اینکه بتوانید آیتم‌های مرتبط با ConfigStore را اضافه کنید، باید کلاس رابط را اضافه کنید.

  1. یک فایل رابط HAL ایجاد کنید. نسخه ConfigStore برابر با ۱.۰ است، بنابراین رابط‌های ConfigStore را در hardware/interfaces/configstore/1.0 تعریف کنید. برای مثال، در hardware/interfaces/configstore/1.0/IChargerConfigs.hal :
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Android.bp و Android.mk را برای کتابخانه مشترک ConfigStore و فایل‌های هدر به‌روزرسانی کنید تا رابط کاربری جدید HAL را شامل شوند. برای مثال:
    hidl-gen -o hardware/interfaces/configstore/1.0/default -Lmakefile -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
    hidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
    
    این دستورات Android.bp و Android.mk را در hardware/interfaces/configstore/1.0 به‌روزرسانی می‌کنند.
  3. برای پیاده‌سازی کد سرور، stub مربوط به ++C را ایجاد کنید. برای مثال:
    hidl-gen -o hardware/interfaces/configstore/1.0/default -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
    
    این دستور دو فایل ChargerConfigs.h و ChargerConfigs.cpp را در hardware/interfaces/configstore/1.0/default ایجاد می‌کند.
  4. فایل‌های پیاده‌سازی .h ‎ و .cpp ‎ را باز کنید و کد مربوط به HIDL_FETCH_ name را حذف کنید (برای مثال، HIDL_FETCH_IChargerConfigs ). این تابع برای حالت عبور HIDL مورد نیاز است، که توسط ConfigStore استفاده نمی‌شود.
  5. پیاده‌سازی را در سرویس ConfigStore ثبت کنید. برای مثال، در hardware/interfaces/configstore/1.0/default/service.cpp :
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include "ChargerConfigs.h"
    
    using android::hardware::configstore::V1_0::IChargerConfigs;
    using android::hardware::configstore::V1_0::implementation::ChargerConfigs;
    
    int main() {
        ... // other code
        sp<IChargerConfigs> chargerConfigs = new ChargerConfigs;
        status = chargerConfigs->registerAsService();
        LOG_ALWAYS_FATAL_IF(status != OK, "Could not register IChargerConfigs");
        ... // other code
    }
    
  6. فایل Android.mk را طوری تغییر دهید که فایل پیاده‌سازی ( modulename Configs.cpp ) به LOCAL_SRC_FILES اضافه شود و پرچم‌های ساخت (build flags) به تعاریف ماکرو نگاشت شوند. برای مثال، در hardware/interfaces/configstore/1.0/default/Android.mk :
    LOCAL_SRC_FILES += ChargerConfigs.cpp
    
    ifeq ($(strip $(BOARD_CHARGER_DISABLE_INIT_BLANK)),true)
    LOCAL_CFLAGS += -DCHARGER_DISABLE_INIT_BLANK
    endif
    
  7. (اختیاری) یک ورودی مانیفست اضافه کنید. اگر وجود ندارد، به طور پیش‌فرض نام نمونه "پیش‌فرض" ConfigStore را در نظر بگیرید. برای مثال، در device/google/marlin/manifest.xml :
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. در صورت نیاز (یعنی اگر کلاینت مجوزهای لازم برای فراخوانی hwbinder به hal_configstore را ندارد) قانون sepolicy را اضافه کنید. برای مثال، در system/sepolicy/private/healthd.te :
    ... // other rules
    binder_call(healthd, hal_configstore)
    

اضافه کردن آیتم‌های جدید ConfigStore

برای افزودن یک آیتم جدید ConfigStore:

  1. فایل HAL را باز کنید و متد رابط مورد نیاز برای آیتم را اضافه کنید. (فایل‌های .hal برای ConfigStore در hardware/interfaces/configstore/1.0 قرار دارند.) برای مثال، در hardware/interfaces/configstore/1.0/IChargerConfigs.hal :
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. متد را در فایل‌های پیاده‌سازی HAL رابط مربوطه ( .h و .cpp ) پیاده‌سازی کنید. پیاده‌سازی‌های پیش‌فرض را در hardware/interfaces/configstore/1.0/default قرار دهید. برای مثال، در hardware/interfaces/configstore/1.0/default/ChargerConfigs.h :
    struct ChargerConfigs : public IChargerConfigs {
        ... // Other interfaces
        Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override;
    };
    
    و در hardware/interfaces/configstore/1.0/default/ChargerConfigs.cpp :
    Return<void> ChargerConfigs::disableInitBlank(disableInitBlank_cb _hidl_cb) {
        bool value = false;
    #ifdef CHARGER_DISABLE_INIT_BLANK
        value = true;
    #endif
        _hidl_cb({true, value});
        return Void();
    }
    

استفاده از آیتم‌های ConfigStore

برای استفاده از یک آیتم ConfigStore:

  1. فایل‌های هدر مورد نیاز را اضافه کنید. برای مثال، در system/core/healthd/healthd.cpp :
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. با استفاده از تابع الگوی مناسب در android.hardware.configstore-utils به آیتم ConfigStore دسترسی پیدا کنید. برای مثال، در system/core/healthd/healthd.cpp :
    using namespace android::hardware::configstore;
    using namespace android::hardware::configstore::V1_0;
    
    static int64_t disableInitBlank = getBool<
            IChargerConfigs,
            &IChargerConfigs::disableInitBlank>(false);
    
    در این مثال، آیتم ConfigStore disableInitBlank بازیابی و در یک متغیر ذخیره می‌شود (این مورد زمانی مفید است که نیاز باشد چندین بار به متغیر دسترسی پیدا شود). مقدار بازیابی شده از ConfigStore در داخل تابع الگوی نمونه‌سازی شده ذخیره می‌شود تا بتوان آن را به سرعت از مقدار ذخیره شده بدون تماس با سرویس ConfigStore برای فراخوانی‌های بعدی تابع الگوی نمونه‌سازی شده بازیابی کرد.
  3. وابستگی به ConfigStore و کتابخانه configstore-utils را در Android.mk یا Android.bp اضافه کنید. برای مثال، در system/core/healthd/Android.mk :
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \