در اندروید ۱۱، تمام کدهای healthd به libhealthloop و libhealth2impl تبدیل میشوند، سپس برای پیادهسازی health@2.1 HAL اصلاح میشوند. این دو کتابخانه به صورت ایستا توسط health@2.0-impl-2.1 ، پیادهسازی passthrough از Health 2.1، به هم متصل شدهاند. کتابخانههای متصل ایستا health@2.0-impl-2.1 را قادر میسازند تا همان کار healthd را انجام دهد، مانند اجرای healthd_mainloop و polling. در init، health@2.1-service پیادهسازی رابط IHealth را در hwservicemanager ثبت میکند. هنگام ارتقاء دستگاهها با تصویر فروشنده اندروید ۸.x یا ۹ و چارچوب اندروید ۱۱، تصویر فروشنده ممکن است سرویس health@2.1 را ارائه ندهد. سازگاری معکوس با تصاویر فروشنده قدیمی توسط برنامه منسوخ شده اعمال میشود.
برای اطمینان از سازگاری با نسخههای قبلی:
-
healthdبا وجود اینکهIHealthیک سرویس سیستم است، آن را درhwservicemanagerثبت میکند.IHealthبا نام نمونه "backup" به مانیفست سیستم اضافه میشود. - فریمورک و
storagedبه جایbinderاز طریقhwbinderباhealthdارتباط برقرار میکنند. - کد مربوط به framework و
storagedطوری تغییر داده میشود که در صورت وجود، نمونهی "default" و سپس "backup" را دریافت کند.- کد کلاینت C++ از منطق تعریفشده در
libhealthhalutilsاستفاده میکند. - کد کلاینت جاوا از منطق تعریف شده در
HealthServiceWrapperاستفاده میکند.
- کد کلاینت C++ از منطق تعریفشده در
- پس از اینکه IHealth/default به طور گسترده در دسترس قرار گرفت و ایمیجهای فروشندگان اندروید ۸.۱ منسوخ شدند، IHealth/backup و
healthdنیز میتوانند منسوخ شوند.
متغیرهای ساخت مخصوص برد برای healthd
BOARD_PERIODIC_CHORES_INTERVAL_* متغیرهای مخصوص برد هستند که برای ساخت healthd استفاده میشوند. به عنوان بخشی از تقسیم ساخت سیستم/فروشنده، مقادیر مخصوص برد را نمیتوان برای ماژولهای سیستم تعریف کرد. این مقادیر قبلاً در تابع منسوخشده healthd_board_init بازنویسی میشدند.
در health@2.1، فروشندگان میتوانند این دو مقدار فاصله زمانی دورهای chores را در ساختار healthd_config قبل از ارسال به سازنده کلاس پیادهسازی health، بازنویسی کنند. کلاس پیادهسازی 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قرار داده شده است. - بازیابی. پیوند به
libbatterymonitorدرhealth@2.0-implقرار دارد. تمام فراخوانیهایBatteryMonitorبا فراخوانیهای کلاس پیادهسازیHealthجایگزین میشوند. BatteryManager.BatteryManager.queryProperty
BatteryManager.queryProperty(int id)تنها کلاینتIBatteryPropertiesRegistrar.getPropertyبود.IBatteryPropertiesRegistrar.getPropertyتوسطhealthdارائه شده بود و مستقیماً/sys/class/power_supplyمیخواند.به عنوان یک ملاحظه امنیتی، برنامهها مجاز به فراخوانی مستقیم health HAL نیستند. در اندروید ۹ و بالاتر، سرویس binder به نام
IBatteryPropertiesRegistrarبه جایhealthdتوسطBatteryServiceارائه میشود.BatteryServiceفراخوانی را به health HAL محول میکند تا اطلاعات درخواستی را بازیابی کند.BatteryService. در اندروید ۹ و بالاتر،
BatteryServiceازHealthServiceWrapperبرای تعیین اینکه آیا از نمونه سرویس سلامت پیشفرض ازvendorاستفاده کند یا از نمونه سرویس سلامت پشتیبان ازhealthdاستفاده کند، استفاده میکند. سپسBatteryServiceاز طریقIHealth.registerCallbackبه رویدادهای سلامت گوش میدهد.Storaged. در اندروید ۹ و بالاتر،
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 برای بازیابی اطلاعات باتری به رابطهای هسته زیر دسترسی دارند:
-
/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 استفاده میکند، بهطور پیشفرض به این رابطهای هسته دسترسی دارد، مگر اینکه در سازنده کلاس پیادهسازی سلامت، بازنویسی شده باشد.
اگر این فایلها از دست رفته باشند یا از طریق healthd یا سرویس پیشفرض قابل دسترسی نباشند (برای مثال، فایل یک لینک نمادین به یک پوشه مخصوص فروشنده باشد که به دلیل پیکربندی نادرست سیاست SELinux دسترسی را مسدود میکند)، ممکن است به درستی کار نکنند. بنابراین، حتی با وجود استفاده از پیادهسازی پیشفرض، ممکن است تغییرات اضافی SELinux مخصوص فروشنده لازم باشد.
برخی از رابطهای هسته مورد استفاده در Health 2.1، مانند /sys/class/power_supply/*/capacity_level و /sys/class/power_supply/*/time_to_full_now ، ممکن است اختیاری باشند. با این حال، برای جلوگیری از رفتارهای نادرست چارچوب ناشی از فقدان رابطهای هسته، توصیه میشود قبل از ساخت سرویس Health HAL 2.1، CL 1398913 را انتخاب کنید.
آزمایش
اندروید ۱۱ شامل تستهای VTS جدیدی است که بهطور خاص برای health@2.1 HAL نوشته شدهاند. اگر دستگاهی health@2.1 HAL را در مانیفست دستگاه اعلام کند، باید تستهای VTS مربوطه را با موفقیت پشت سر بگذارد. تستها هم برای نمونه پیشفرض (برای اطمینان از پیادهسازی صحیح HAL توسط دستگاه) و هم برای نمونه پشتیبان (برای اطمینان از ادامه عملکرد صحیح healthd قبل از حذف آن) نوشته شدهاند.
الزامات اطلاعات باتری
Health 2.0 HAL مجموعهای از الزامات را در رابط HAL بیان میکند، اما آزمایشهای VTS مربوطه در مورد اجرای آنها نسبتاً آسانگیر هستند. در اندروید ۱۱، آزمایشهای VTS جدیدی اضافه شدهاند تا الزامات زیر را در دستگاههایی که با اندروید ۱۱ و بالاتر عرضه میشوند، اعمال کنند:
- واحدهای جریان باتری لحظهای و متوسط باید میکروآمپر (μA) باشند.
- علامت جریان لحظهای و متوسط باتری باید صحیح باشد. به طور خاص:
- جریان == 0 وقتی وضعیت باتری
UNKNOWNاست - جریان > 0 وقتی وضعیت باتری
CHARGINGاست - جریان <= 0 وقتی وضعیت باتری
NOT_CHARGINGاست - جریان < 0 وقتی وضعیت باتری
DISCHARGINGاست - وقتی وضعیت باتری
FULLاست، اعمال نمیشود
- جریان == 0 وقتی وضعیت باتری
- وضعیت باتری باید صرف نظر از اینکه منبع تغذیه متصل است یا خیر، صحیح باشد. به طور خاص:
- وضعیت باتری باید یکی از
CHARGING،NOT_CHARGINGیاFULLباشد، اگر و فقط اگر منبع تغذیه متصل باشد؛ - وضعیت باتری باید
DISCHARGINGباشد اگر و فقط اگر منبع تغذیه قطع شده باشد.
- وضعیت باتری باید یکی از
اگر در پیادهسازی خود از libbatterymonitor استفاده میکنید و مقادیر را از رابطهای هسته عبور میدهید، مطمئن شوید که گرههای 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بر ۱۰۰۰ تقسیم میکند و مقادیر را بر حسب میلیولت (mV) گزارش میدهد. به @1.0::HealthInfo مراجعه کنید.
-
برای جزئیات بیشتر، به کلاس منبع تغذیه لینوکس مراجعه کنید.