Thêm các lớp và mặt hàng ConfigStore

Bạn có thể thêm các mục ConfigStore mới (tức là các phương thức giao diện) cho một lớp giao diện hiện có. Nếu lớp giao diện không được xác định, bạn phải thêm một lớp mới trước khi có thể thêm mục ConfigStore cho lớp đó. Phần này sử dụng ví dụ về mục cấu hình disableInitBlank để healthd được thêm vào lớp giao diện IChargerConfigs.

Thêm lớp giao diện

Nếu không có lớp giao diện nào được xác định cho phương thức giao diện mà bạn muốn thêm vào, thì bạn phải thêm lớp giao diện trước khi có thể thêm các mục ConfigStore liên kết.

  1. Tạo tệp giao diện HAL. Phiên bản ConfigStore là 1.0, vì vậy, hãy xác định các giao diện ConfigStore trong hardware/interfaces/configstore/1.0. Ví dụ: trong hardware/interfaces/configstore/1.0/IChargerConfigs.hal:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Cập nhật Android.bpAndroid.mk cho các tệp tiêu đề và thư viện chia sẻ ConfigStore để bao gồm HAL giao diện mới. Ví dụ:
    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
    
    Các lệnh này cập nhật Android.bpAndroid.mk trong hardware/interfaces/configstore/1.0.
  3. Tạo mã giả lập C++ để triển khai mã máy chủ. Ví dụ:
    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
    
    Lệnh này tạo hai tệp là ChargerConfigs.hChargerConfigs.cpp trong hardware/interfaces/configstore/1.0/default.
  4. Mở các tệp triển khai .h.cpp rồi xoá mã liên quan đến hàm HIDL_FETCH_name (ví dụ: HIDL_FETCH_IChargerConfigs). Hàm này cần thiết cho chế độ truyền qua HiDL mà ConfigStore không sử dụng.
  5. Đăng ký phương thức triển khai cho dịch vụ ConfigStore. Ví dụ: trong 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. Sửa đổi tệp Android.mk để thêm tệp triển khai (modulenameConfigs.cpp) vào LOCAL_SRC_FILES và ánh xạ cờ bản dựng vào các định nghĩa macro. Ví dụ: trong 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. (Không bắt buộc) Thêm một mục kê khai. Nếu nó không tồn tại, hãy đặt giá trị mặc định là tên thực thể "mặc định" của ConfigStore. Ví dụ: trong device/google/marlin/manifest.xml:
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. Thêm quy tắc sepolicy nếu cần (nghĩa là nếu ứng dụng không có quyền thực hiện lệnh gọi hwbinder đến hal_configstore). Ví dụ: trong system/sepolicy/private/healthd.te:
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Thêm các mục ConfigStore mới

Cách thêm một mục ConfigStore mới:

  1. Mở tệp HAL và thêm phương thức giao diện bắt buộc cho mục. (Các tệp .hal cho ConfigStore nằm trong hardware/interfaces/configstore/1.0.) Ví dụ: trong hardware/interfaces/configstore/1.0/IChargerConfigs.hal:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. Triển khai phương thức này trong các tệp triển khai HAL (Lớp trừu tượng phần cứng) của giao diện tương ứng (.h.cpp). Đặt phương thức triển khai mặc định trong hardware/interfaces/configstore/1.0/default. Ví dụ: trong hardware/interfaces/configstore/1.0/default/ChargerConfigs.h:
    struct ChargerConfigs : public IChargerConfigs {
        ... // Other interfaces
        Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override;
    };
    
    Và trong 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();
    }
    

Sử dụng các mục ConfigStore

Cách sử dụng một mặt hàng trong ConfigStore:

  1. Bao gồm các tệp tiêu đề bắt buộc. Ví dụ: trong system/core/healthd/healthd.cpp:
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. Truy cập vào mục ConfigStore bằng cách sử dụng hàm mẫu thích hợp trong android.hardware.configstore-utils. Ví dụ: trong 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);
    
    Trong ví dụ này, mục ConfigStore disableInitBlank được truy xuất và lưu trữ trong một biến (hữu ích khi biến cần được truy cập nhiều lần). Giá trị truy xuất từ ConfigStore sẽ được lưu vào bộ nhớ đệm bên trong hàm mẫu đã tạo thực thể để có thể nhanh chóng truy xuất từ giá trị đã lưu vào bộ nhớ đệm mà không cần liên hệ với dịch vụ ConfigStore để thực hiện các lệnh gọi sau này đến hàm mẫu đã tạo thực thể.
  3. Thêm phần phụ thuộc trên ConfigStore và thư viện configstore-utils trong Android.mk hoặc Android.bp. Ví dụ: trong system/core/healthd/Android.mk:
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \