تمت إعادة صياغة جميع رموز 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
لجلب المثيل "الافتراضي" إذا كان متاحًا ، ثم "النسخ الاحتياطي".- يستخدم كود العميل C ++ المنطق المحدد في
libhealthhalutils
. - يستخدم كود عميل Java المنطق المحدد في
HealthServiceWrapper
.
- يستخدم كود العميل C ++ المنطق المحدد في
- بعد أن يتوفر 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
. - يسمح
system_server
storaged
باستخدامhal_health
. - يسمح لـ
system_server
(BatteryService
) بتسجيلbatteryproperties_service
(IBatteryPropertiesRegistrar
). - يسمح
healthd
بتوفيرhal_health
. - يزيل القواعد التي تسمح لـ
system_server
/storaged
بالاتصال بـ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
في العمل بشكل صحيح قبل إزالته).
متطلبات معلومات البطارية
انظر متطلبات معلومات البطارية .