تطبيق 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 إلى بيان النظام ، مع اسم المثيل "backup".
  2. يتواصل الإطار healthd storaged hwbinder بدلاً من binder .
  3. يتم تغيير رمز الإطار storaged لجلب المثيل "الافتراضي" إذا كان متاحًا ، ثم "النسخ الاحتياطي".
    • يستخدم كود العميل C ++ المنطق المحدد في libhealthhalutils .
    • يستخدم كود عميل Java المنطق المحدد في HealthServiceWrapper .
  4. بعد أن يتوفر IHealth / default على نطاق واسع ويتم إهمال صور بائع Android 8.1 ، يمكن إهمال IHealth / backup و healthd . لمزيد من التفاصيل ، راجع Deprecating 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- الخدمة والشاحن والاسترداد ورابط 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 ، والشاحن ، و healthd ، ويدعو إلى طرق IHealth بدلاً من BatteryMonitor.

تطبيق خدمة Health 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>
    

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

عملاء الصحة

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

تغييرات SELinux

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

  • يضيف health@2.0- خدمة إلى file_contexts .
  • يسمح لخادم hal_health storaged system_server .
  • يسمح system_server ( BatteryService ) بتسجيل batteryproperties_service ( IBatteryPropertiesRegistrar ).
  • يسمح healthd بتوفير hal_health .
  • يزيل القواعد التي تسمح لخادم النظام / storaged بالاتصال بـ system_server عبر healthd .
  • يزيل القواعد التي تسمح لـ 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

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

اختبارات

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

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

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