Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Triển khai Sức khỏe 2.0

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Tất cả mã healthd đã được cấu trúc lại thành health@2.0-impl và libhealthservice , sau đó được sửa đổi để triển khai health@2.0 HAL. Hai thư viện này được liên kết tĩnh bởi health@2.0-service, cho phép nó thực hiện công việc mà healthd đã thực hiện trước đó (tức là chạy healthd_mainloop và thực hiện thăm dò). Trong init, health@2.0-service đăng ký việc triển khai giao diện IHealth tới hwservicemanager . Khi nâng cấp thiết bị có hình ảnh nhà cung cấp Android 8.x và khung Android 9, dịch vụ health@2.0 có thể không được hình ảnh nhà cung cấp cung cấp. Điều này được thực thi bởi lịch trình không dùng nữa .

Để giải quyết vấn đề này:

  1. healthd đăng ký IHealth vào hwservicemanager (mặc dù là một daemon hệ thống). IHealth được thêm vào tệp kê khai hệ thống, với tên phiên bản "sao lưu".
  2. Framework và lưu trữ giao tiếp với storaged thông qua healthd hwbinderbinder .
  3. Mã cho khung và được storaged được thay đổi để tìm nạp phiên bản "mặc định" nếu có, sau đó là "sao lưu".
    • Mã ứng dụng C ++ sử dụng logic được định nghĩa trong libhealthhalutils .
    • Mã máy khách Java sử dụng logic được định nghĩa trong HealthServiceWrapper .
  4. Sau khi IHealth / default được phổ biến rộng rãi và hình ảnh của nhà cung cấp Android 8.1 không được dùng nữa, IHealth / backup và healthd có thể không được dùng nữa. Để biết thêm chi tiết, hãy xem Không dùng nữa health@1.0 .

Các biến xây dựng dành riêng cho hội đồng quản trị cho Healthd

BOARD_PERIODIC_CHORES_INTERVAL_* là các biến dành riêng cho bảng được sử dụng để tạo healthd . Là một phần của phân chia xây dựng hệ thống / nhà cung cấp, không thể xác định các giá trị dành riêng cho bo mạch cho các mô-đun hệ thống. Trong health@2.0, nhà cung cấp có thể ghi đè hai giá trị này trong healthd_mode_ops->init (bằng cách loại bỏ sự phụ thuộc libhealthservice trong health@2.0-service.<device> và triển khai lại chức năng này).

Thư viện triển khai tĩnh

Không giống như các thư viện triển khai HAL khác, thư viện triển khai health@2.0-impl là một thư viện tĩnh có liên kết health@2.0-service, bộ sạc, khôi phục và healthd kế thừa.

health@2.0.impl triển khai IHealth như được mô tả ở trên và có nghĩa là bao quanh libbatterymonitorlibhealthd. BOARD . Những người dùng health@2.0-impl này không được sử dụng trực tiếp BatteryMonitor hoặc các chức năng trong libhealthd ; thay vào đó, các cuộc gọi này nên được thay thế bằng các lệnh gọi vào lớp Health , một triển khai của giao diện IHealth . Để khái quát thêm, mã healthd_common cũng được bao gồm trong health@2.0-impl. healthd_common mới chứa phần còn lại của mã chung giữa health@2.0-service, bộ sạc và healthd và các cuộc gọi đến các phương thức IHealth thay vì BatteryMonitor.

Triển khai dịch vụ Health 2.0

Khi triển khai dịch vụ health@2.0 cho một thiết bị, nếu việc triển khai mặc định là:

  • Đủ cho thiết bị, hãy sử dụng trực tiếp android.hardware.health@2.0-service .
  • Không đủ cho thiết bị, hãy tạo tệp thực thi android.hardware.health@2.0-service.(device) và bao gồm:

    #include <health2/service.h>
    int main() { return health_service_main(); }
    

Sau đó:

  • Nếu libhealthd:

    • Có tồn tại, liên kết với nó.
    • Không tồn tại, hãy cung cấp các triển khai trống cho các healthd_board_inithealthd_board_battery_update .
  • Nếu các biến BOARD_PERIODIC_CHORES_INTERVAL_* dành riêng cho bảng:

    • Được xác định, tạo HealthServiceCommon.cpp dành riêng cho thiết bị (được sao chép từ hardware/interfaces/health/2.0/utils/libhealthservice ) và tùy chỉnh nó trong healthd_mode_service_2_0_init .
    • Không được xác định, liên kết tĩnh với libhealthservice .
  • Nếu thiết bị:

    • Nên triển khai các API getStorageInfogetDiskStats , cung cấp triển khai trong các get_storage_infoget_disk_stats .
    • Không nên triển khai các API đó, hãy liên kết tĩnh đến libstoragehealthdefault .
  • Cập nhật các quyền cần thiết của SELinux.

  • Triển khai HAL trong khôi phục bằng cách cài đặt triển khai truyền vào hình ảnh khôi phục. Ví dụ:

    // Android.bp
    cc_library_shared {
        name: "android.hardware.health@2.0-impl-<device>",
        recovery_available: true,
        relative_install_path: "hw",
        static_libs: [
            "android.hardware.health@2.0-impl",
            "libhealthd.<device>"
            // Include the following or implement device-specific storage APIs
            "libhealthstoragedefault",
        ],
        srcs: [
            "HealthImpl.cpp",
        ],
        overrides: [
            "android.hardware.health@2.0-impl-default",
        ],
    }
    
    // HealthImpl.cpp
    #include <health2/Health.h>
    #include <healthd/healthd.h>
    using android::hardware::health::V2_0::IHealth;
    using android::hardware::health::V2_0::implementation::Health;
    extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) {
        const static std::string providedInstance{"default"};
        if (providedInstance != name) return nullptr;
        return Health::initInstance(&gHealthdConfig).get();
    }
    
    # device.mk
    PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
    

Để biết chi tiết, hãy tham khảo phần cứng / giao diện / sức khỏe / 2.0 / README.md .

Khách hàng sức khỏe

Xem Khách hàng sức khỏe để biết sức khỏe 2.1 HAL .

SELinux thay đổi

Health@2.0 HAL mới bao gồm các thay đổi SELinux sau:

  • Thêm health@2.0-service vào file_contexts .
  • Cho phép system_serverstoraged trữ sử dụng hal_health .
  • Cho phép system_server ( BatteryService ) đăng ký batteryproperties_service ( IBatteryPropertiesRegistrar ).
  • Cho phép healthd cung cấp hal_health .
  • Loại bỏ các quy tắc cho phép system_server / storaged gọi vào healthd thông qua chất kết dính.
  • Loại bỏ các quy tắc cho phép healthd đăng ký batteryproperties_service ( IBatteryPropertiesRegistrar ).

Đối với các thiết bị có triển khai riêng, một số thay đổi SELinux của nhà cung cấp có thể là cần thiết. Ví dụ:

# device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
/vendor/bin/hw/android\.hardware\.health@2\.0-service.<device> u:object_r:hal_health_default_exec:s0

# device/<manufacturer>/<device>/sepolicy/vendor/hal_health_default.te
# Add device specific permissions to hal_health_default domain, especially
# if it links to board-specific libhealthd or implements storage APIs.

Giao diện hạt nhân

Xem giao diện Kernel về sức khỏe 2.1 HAL .

Thử nghiệm

Android 9 bao gồm các bài kiểm tra VTS mới được viết riêng cho health@2.0 HAL. Nếu một thiết bị tuyên bố cung cấp health@2.0 HAL trong bảng kê khai thiết bị, thiết bị đó phải vượt qua các bài kiểm tra VTS tương ứng. Các bài kiểm tra được viết cho cả phiên bản mặc định (để đảm bảo rằng thiết bị triển khai HAL một cách chính xác) và phiên bản sao lưu (để đảm bảo rằng healthd tiếp tục hoạt động chính xác trước khi nó bị xóa).

Yêu cầu về thông tin pin

Xem Yêu cầu về thông tin pin .