تطبيق Health 2.0

تمت إعادة هيكلة جميع أكواد healthd إلى health@2.0-impl و libhealthservice ، ثم تعديلها لتطبيق health@2.0 HAL. ترتبط هاتان المكتبتان بشكل ثابت بواسطة health@2.0-service، مما يمكنها من القيام بالعمل الذي تم إنجازه مسبقًا بواسطة healthd (أي تشغيل healthd_mainloop وإجراء الاستقصاء). في init، تسجل خدمة health@2.0-service تنفيذ الواجهة IHealth إلى hwservicemanager . عند ترقية الأجهزة التي تحتوي على صورة البائع Android 8.x وإطار عمل Android 9، قد لا يتم توفير خدمة health@2.0 بواسطة صورة البائع. يتم فرض ذلك من خلال جدول الإهمال .

لحل هذه المشكلة:

  1. يقوم healthd بتسجيل IHealth في hwservicemanager (على الرغم من كونه برنامجًا خفيًا للنظام). تتم إضافة IHealth إلى بيان النظام، باسم المثيل "النسخ الاحتياطي".
  2. يتواصل إطار العمل storaged مع healthd عبر hwbinder بدلاً من binder .
  3. يتم تغيير التعليمات البرمجية الخاصة بإطار العمل storaged لجلب المثيل "الافتراضي" إذا كان متاحًا، ثم "النسخ الاحتياطي".
    • يستخدم كود عميل C++ المنطق المحدد في libhealthhalutils .
    • يستخدم رمز عميل Java المنطق المحدد في HealthServiceWrapper .
  4. بعد إتاحة IHealth/default على نطاق واسع وإهمال صور بائعي Android 8.1، يمكن إهمال IHealth/backup و healthd . لمزيد من التفاصيل، راجع إهمال health@1.0 .

متغيرات البناء الخاصة باللوحة لـ healthd

BOARD_PERIODIC_CHORES_INTERVAL_* هي متغيرات خاصة باللوحة تُستخدم لإنشاء healthd . كجزء من تقسيم بناء النظام/المورد، لا يمكن تحديد القيم الخاصة باللوحة لوحدات النظام. في health@2.0، يمكن للبائعين تجاوز هاتين القيمتين في healthd_mode_ops->init (عن طريق إسقاط تبعية libhealthservice في health@2.0-service.<device> وإعادة تنفيذ هذه الوظيفة).

مكتبة التنفيذ الثابتة

على عكس مكتبات تنفيذ HAL الأخرى، فإن مكتبة التنفيذ health@2.0-impl هي مكتبة ثابتة ترتبط بها health@2.0-service، وcharger، وrecovery، وlegacy healthd.

health@2.0.impl يطبق IHealth كما هو موضح أعلاه والمقصود منه هو الالتفاف حول libbatterymonitor و libhealthd. BOARD . يجب على مستخدمي health@2.0-impl عدم استخدام BatteryMonitor أو الوظائف الموجودة في libhealthd مباشرة؛ بدلاً من ذلك، يجب استبدال هذه الاستدعاءات باستدعاءات إلى فئة Health ، وهو تطبيق لواجهة IHealth . لمزيد من التعميم، تم أيضًا تضمين كود healthd_common في health@2.0-impl. يحتوي healthd_common الجديد على بقية التعليمات البرمجية المشتركة بين health@2.0-service وcharger و healthd ويستدعي أساليب IHealth بدلاً من BatteryMonitor.

تنفيذ خدمة الصحة 2.0

عند تنفيذ خدمة health@2.0 لجهاز، إذا كان التنفيذ الافتراضي هو:

  • يكفي للجهاز، استخدم android.hardware.health@2.0-service مباشرة.
  • لا يكفي للجهاز، قم بإنشاء android.hardware.health@2.0-service.(device) القابل للتنفيذ ويتضمن:

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

ثم:

  • إذا كانت libhealthd:

    • موجودة، قم بربطها.
    • غير موجود، قم بتوفير تطبيقات فارغة لوظائف healthd_board_init و healthd_board_battery_update .
  • إذا كانت متغيرات BOARD_PERIODIC_CHORES_INTERVAL_* الخاصة باللوحة:

    • تم تعريفها وإنشاء HealthServiceCommon.cpp خاص بالجهاز (منسوخ من hardware/interfaces/health/2.0/utils/libhealthservice ) وتخصيصه في healthd_mode_service_2_0_init .
    • لم يتم تعريفها، قم بالارتباط بـ libhealthservice بشكل ثابت.
  • إذا كان الجهاز:

    • يجب تنفيذ واجهات برمجة تطبيقات getStorageInfo و getDiskStats ، وتوفير التنفيذ في وظائف get_storage_info و get_disk_stats .
    • لا ينبغي تنفيذ واجهات برمجة التطبيقات هذه، قم بالارتباط بـ libstoragehealthdefault بشكل ثابت.
  • قم بتحديث أذونات SELinux الضرورية.

  • قم بتنفيذ HAL في الاسترداد عن طريق تثبيت تطبيق العبور على صورة الاسترداد. مثال:

    // 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>
    

للحصول على التفاصيل، راجع الأجهزة/interfaces/health/2.0/README.md .

عملاء الصحة

راجع عملاء الصحة من أجل الصحة 2.1 HAL .

تغييرات SELinux

يتضمن health@2.0 HAL الجديد تغييرات SELinux التالية:

  • يضيف خدمة health@2.0 إلى file_contexts .
  • يسمح system_server storaged باستخدام hal_health .
  • يسمح لخادم system_server ( BatteryService ) بتسجيل batteryproperties_service ( IBatteryPropertiesRegistrar ).
  • يسمح healthd بتوفير hal_health .
  • يزيل القواعد التي تسمح لـ system_server / storaged بالاتصال بـ healthd عبر Binder.
  • يزيل القواعد التي تسمح لـ healthd بتسجيل batteryproperties_service ( IBatteryPropertiesRegistrar ).

بالنسبة للأجهزة التي لها تطبيق خاص بها، قد تكون بعض تغييرات SELinux الخاصة بالمورد ضرورية. مثال:

# 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.

واجهات النواة

راجع واجهات Kernel للصحة 2.1 HAL .

اختبارات

يتضمن Android 9 اختبارات VTS جديدة مكتوبة خصيصًا لـ health@2.0 HAL. إذا أعلن الجهاز عن توفير health@2.0 HAL في بيان الجهاز، فيجب أن يجتاز اختبارات VTS المقابلة. تتم كتابة الاختبارات لكل من المثيل الافتراضي (للتأكد من أن الجهاز ينفذ HAL بشكل صحيح) والمثيل الاحتياطي (للتأكد من استمرار healthd في العمل بشكل صحيح قبل إزالته).

متطلبات معلومات البطارية

راجع متطلبات معلومات البطارية .