في Android 11، تمت إعادة صياغة كل رمز healthd
ليصبح
libhealthloop
وlibhealth2impl
، ثم تم تعديله لتطبيق health@2.1
HAL. يتم ربط هاتين المكتبتَين بشكل ثابت من خلال health@2.0-impl-2.1
،
وهي عملية تنفيذ Health 2.1 للنقل. تتيح المكتبات المرتبطة بشكل ثابت
لـ health@2.0-impl-2.1
تنفيذ العمل نفسه الذي يؤديه healthd
، مثل تشغيل
healthd_mainloop
وإجراء الاستطلاعات. في مرحلة الإعداد، يسجِّل health@2.1-service
تنفيذًا لواجهة IHealth
في hwservicemanager
. عند ترقية
الأجهزة التي تعمل بنظام Android 8.x أو 9
باستخدام صورة المورّد وإطار عمل Android 11،
قد لا توفّر صورة المورّد خدمة health@2.1. يتم فرض التوافق مع الإصدارات القديمة
من خلال
الجدول الزمني لإيقاف الميزة نهائيًا.
لضمان التوافق مع الإصدارات السابقة:
- يسجِّل
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
. كجزء من تقسيم الإصدار الخاص بالنظام/المورّد،
لا يمكن تحديد القيم الخاصة باللوحة لوحدات النظام. كان يتم إلغاء هذه القيم
في الدالة المتوقفة نهائيًا healthd_board_init
.
في الإصدار health@2.1، يمكن للمورّدين إلغاء
قيمتَي الفاصل الزمني للمهام الدورية في بنية healthd_config
قبل
إرسالهما إلى دالة الإنشاء لفئة تنفيذ الصحة. يجب أن ترث فئة تنفيذ
health من
android::hardware::health::V2_1::implementation::Health
.
تنفيذ خدمة Health 2.1
للحصول على معلومات عن تنفيذ خدمة Health 2.1، يُرجى الاطّلاع على ملف hardware/interfaces/health/2.1/README.md.
عملاء الخدمات الصحية
يحتوي health@2.x على العملاء التاليين:
- شاحن يتم استخدام رمزَي
libbatterymonitor
وhealthd_common
فيhealth@2.0-impl
. - recovery. تم تضمين الرابط المؤدّي إلى
libbatterymonitor
فيhealth@2.0-impl
. يتم استبدال جميع طلبات البيانات إلىBatteryMonitor
بطلبات بيانات إلى فئة التنفيذHealth
. BatteryManager: كان "
BatteryManager.queryProperty(int id)
" العميل الوحيد لـ "IBatteryPropertiesRegistrar.getProperty
". تم تقديمIBatteryPropertiesRegistrar.getProperty
من قِبلhealthd
وقراءة/sys/class/power_supply
مباشرةً.لأغراض الأمان، لا يُسمح للتطبيقات بالاتصال بواجهة HAL لخدمات الصحة مباشرةً. في الإصدار 9 من Android والإصدارات الأحدث، يوفّر
BatteryService
خدمة الربطIBatteryPropertiesRegistrar
بدلاً منhealthd
.BatteryService
تفوض المكالمة إلى HAL لصحة التطبيقات لاسترداد المعلومات المطلوبة.BatteryService. في الإصدار 9 من نظام التشغيل Android والإصدارات الأحدث، يستخدم
BatteryService
HealthServiceWrapper
لتحديد ما إذا كان سيتم استخدام مثيل الخدمة الصحية التلقائي منvendor
أو استخدام مثيل الخدمة الصحية الاحتياطي منhealthd
. بعد ذلك، يستمعBatteryService
إلى أحداث الصحة من خلالIHealth.registerCallback
.Storaged: في الإصدار 9 من نظام التشغيل Android والإصدارات الأحدث، يستخدم
storaged
libhealthhalutils
لتحديد ما إذا كان سيتم استخدام مثيل الخدمة الصحية التلقائي منvendor
أو استخدام مثيل الخدمة الصحية الاحتياطي منhealthd
. بعد ذلك، يرصدstoraged
أحداث الصحة من خلالIHealth.registerCallback
ويسترجع معلومات التخزين.
تغييرات SELinux
يتضمّن Health@2.1 HAL تغييرات SELinux التالية في النظام الأساسي:
- تضيف
android.hardware.health@2.1-service
إلىfile_contexts
.
بالنسبة إلى الأجهزة التي تستخدم أسلوب التنفيذ الخاص بها، قد يكون من الضروري إجراء بعض التغييرات على SELinux لدى المورّد. مثال:
# 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.
واجهات النواة
يحصل الخادم healthd
والتنفيذ التلقائي
android.hardware.health@2.0-impl-2.1
على واجهات kernel التالية ل retrieving battery information:
/sys/class/power_supply/*/capacity_level
(تمت إضافته في Health 2.1)/sys/class/power_supply/*/capacity
/sys/class/power_supply/*/charge_counter
/sys/class/power_supply/*/charge_full
/sys/class/power_supply/*/charge_full_design
(تمت إضافته في Health 2.1)/sys/class/power_supply/*/current_avg
/sys/class/power_supply/*/current_max
/sys/class/power_supply/*/current_now
/sys/class/power_supply/*/cycle_count
/sys/class/power_supply/*/health
/sys/class/power_supply/*/online
/sys/class/power_supply/*/present
/sys/class/power_supply/*/status
/sys/class/power_supply/*/technology
/sys/class/power_supply/*/temp
/sys/class/power_supply/*/time_to_full_now
(تمت إضافته في Health 2.1)/sys/class/power_supply/*/type
/sys/class/power_supply/*/voltage_max
/sys/class/power_supply/*/voltage_now
إنّ أيّ عملية تنفيذ لـ HAL في مجال الصحة خاصة بالجهاز تستخدِم libbatterymonitor
تتمكّن من الوصول إلى واجهات نظام التشغيل الأساسية هذه تلقائيًا، ما لم يتم إلغاؤها في أداة إنشاء فئة health
implementation.
إذا كانت هذه الملفات غير متوفّرة أو يتعذّر الوصول إليها من healthd
أو من
الخدمة التلقائية (على سبيل المثال، إذا كان الملف رابطًا تشعبيًا ينقل إلى مجلد خاص بالمورّد
يرفض الوصول بسبب خطأ في ضبط سياسة SELinux)، قد لا تعمل
بشكل صحيح. لذلك، قد يكون من الضروري إجراء تغييرات إضافية على SELinux خاصة بالمورّد، حتى في حال استخدام التنفيذ التلقائي.
قد تكون بعض واجهات نظام التشغيل الأساسية المستخدَمة في Health 2.1، مثل
/sys/class/power_supply/*/capacity_level
و
/sys/class/power_supply/*/time_to_full_now
، اختيارية. ومع ذلك، لتجنّب
سلوكيات الإطار غير الصحيحة الناتجة عن عدم توفّر واجهات النواة،
ننصح باختيار
CL 1398913
قبل إنشاء خدمة Health HAL 2.1.
الاختبار
يتضمّن الإصدار 11 من نظام التشغيل Android
اختبارات VTS
جديدة مخصّصة لواجهة HAL في health@2.1. إذا كان الجهاز يعلن عن واجهة برمجة التطبيقات
health@2.1 HAL في بيان الجهاز، يجب أن يجتاز اختبارات VTS المقابلة.
يتم كتابة الاختبارات لكلٍّ من المثيل التلقائي (لضمان أنّ الجهاز
ينفِّذ HAL بشكل صحيح) والمثيل الاحتياطي (لضمان استمرار عمل healthd
بشكل صحيح قبل إزالته).
متطلبات معلومات البطارية
يحدِّد Health 2.0 HAL مجموعة من المتطلبات على واجهة HAL، ولكن اختبارات VTS المقابلة لها تكون متساهلة نسبيًا في فرضها. في Android 11، تمت إضافة اختبارات VTS جديدة لفرض المتطلبات التالية على الأجهزة التي تعمل بالإصدار 11 من Android والإصدارات الأحدث:
- يجب أن تكون وحدات تيار البطارية الفوري والمتوسط بالميكرومللي أمبير (μA).
- يجب أن تكون علامة التيار الفوري والمتوسط للبطارية صحيحة.
على وجه التحديد:
- current == 0 عندما تكون حالة البطارية هي
UNKNOWN
- التيار > 0 عندما تكون حالة البطارية
CHARGING
- current <= 0 عندما تكون حالة البطارية هي
NOT_CHARGING
- current < 0 عندما تكون حالة البطارية هي
DISCHARGING
- لا يتم فرضه عندما تكون حالة البطارية
FULL
- current == 0 عندما تكون حالة البطارية هي
- يجب أن تكون حالة البطارية صحيحة وفقًا لما إذا كان مصدر الطاقة
متصلاً أم لا. على وجه التحديد:
- يجب أن تكون حالة البطارية إحدى الحالات التالية:
CHARGING
أوNOT_CHARGING
أوFULL
في حال الاتصال بمصدر طاقة فقط - يجب أن تكون حالة البطارية
DISCHARGING
في حال عدم اتصال مصدر الطاقة بالجهاز فقط.
- يجب أن تكون حالة البطارية إحدى الحالات التالية:
إذا كنت تستخدم libbatterymonitor
في عملية التنفيذ وتمرير القيم
من واجهات kernel، تأكَّد من أنّ عقد sysfs تُبلغ عن القيم الصحيحة:
- تأكَّد من إدخال رمز التيار الكهربي للبطارية ووحداته بشكل صحيح. ويشمل ذلك
عقد sysfs التالية:
/sys/class/power_supply/*/current_avg
/sys/class/power_supply/*/current_max
/sys/class/power_supply/*/current_now
- تشير القيم الموجبة إلى التيار الوارد إلى البطارية.
- يجب أن تكون القيم بالميكرو أمبير (μA).
- تأكَّد من تسجيل جهد البطارية بالميكروفولت (μV). ويشمل ذلك
العقد التالية في نظام sysfs:
/sys/class/power_supply/*/voltage_max
/sys/class/power_supply/*/voltage_now
- يُرجى العِلم أنّ عملية تنفيذ HAL التلقائية تقسم
voltage_now
على 1000 وتُبلغ عن القيم بالمللي فولت (mV). راجِع @1.0::HealthInfo.
لمعرفة التفاصيل، يُرجى الاطّلاع على فئة وحدة إمداد الطاقة في Linux.