تمت إعادة هيكلة جميع أكواد 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 بواسطة صورة البائع. يتم فرض ذلك من خلال جدول الإهمال .
لحل هذه المشكلة:
- يقوم
healthd
بتسجيلIHealth
فيhwservicemanager
(على الرغم من كونه برنامجًا خفيًا للنظام). تتم إضافةIHealth
إلى بيان النظام، باسم المثيل"backup"
. - يتواصل إطار العمل
storaged
معhealthd
من خلالhwbinder
بدلاً منbinder
. - يتم تغيير التعليمات البرمجية الخاصة بإطار العمل
storaged
لجلب المثيل"default"
إذا كان متاحًا، ثم"backup"
.- يستخدم كود عميل C++ المنطق المحدد في
libhealthhalutils
. - يستخدم رمز عميل Java المنطق المحدد في
HealthServiceWrapper
.
- يستخدم كود عميل C++ المنطق المحدد في
- بعد إتاحة 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 .
عملاء الصحة
راجع عملاء الصحة لـ Health 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 لـ Health 2.1 HAL .
اختبارات
يتضمن Android 9 اختبارات VTS جديدة مكتوبة خصيصًا لـ health@2.0 HAL. إذا أعلن الجهاز عن توفير health@2.0 HAL في بيان الجهاز، فيجب أن يجتاز اختبارات VTS المقابلة. تتم كتابة الاختبارات لكل من المثيل الافتراضي (للتأكد من أن الجهاز ينفذ HAL بشكل صحيح) والمثيل الاحتياطي (للتأكد من استمرار healthd
في العمل بشكل صحيح قبل إزالته).
متطلبات معلومات البطارية
راجع متطلبات معلومات البطارية .