در 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 را اجرا کند و نظرسنجی کند. در init، health@2.1-service پیادهسازی میانای IHealth را در hwservicemanager ثبت میکند. هنگام ارتقا دادن
دستگاههای دارای تصویر فروشنده Android 8.x یا 9
و چارچوب Android 11،
ممکن است تصویر فروشنده سرویس health@2.1 را ارائه ندهد. برنامه زمانی منسوخ شدن سازگاری با نسخه قدیمی تصاویر فروشنده را اعمال میکند.
برای اطمینان از سازگاری با نسخههای قدیمی:
-
healthdبااینکه یک دیمون سیستم است،IHealthرا درhwservicemanagerثبت میکند. IHealthبه مانیفست سیستم اضافه میشود، با نام نمونه «backup». - چارچوب و
storagedازطریقhwbinderبهجایbinderباhealthdارتباط برقرار میکنند. - کد چارچوب و
storagedتغییر کرده است تا نمونه «پیشفرض» را درصورت وجود، و سپس «پشتیبان» را واکشی کند.- کد مشتری C++ از منطق تعریفشده در
libhealthhalutilsاستفاده میکند. - کد کارخواه Java از منطق تعریفشده در
HealthServiceWrapperاستفاده میکند.
- کد مشتری C++ از منطق تعریفشده در
- پساز اینکه IHealth/default بهطور گسترده دردسترس قرار گرفت و تصاویر فروشنده Android 8.1 منسوخ شد، IHealth/backup و
healthdمیتوانند منسوخ شوند.
متغیرهای ساخت مخصوص برد برای healthd
BOARD_PERIODIC_CHORES_INTERVAL_* متغیرهای مختص برد هستند که برای ساختن
healthd استفاده میشوند. بهعنوان بخشی از تقسیم ساخت سیستم/فروشنده، مقادیر خاص برد
نمیتواند برای واحدهای سیستم تعریف شود. این مقادیر قبلاً در تابع منسوخشده healthd_board_init ملغی میشد.
در health@2.1، فروشندگان میتوانند
این دو مقدار فاصله کارهای دورهای را در ساختار healthd_config قبلاز
گذراندن به سازنده کلاس پیادهسازی سلامت ملغی کنند. کلاس پیادهسازی سلامت باید از
android::hardware::health::V2_1::implementation::Health ارث ببرد.
پیادهسازی سرویس 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(int id)تنها مشتریIBatteryPropertiesRegistrar.getPropertyبود. IBatteryPropertiesRegistrar.getPropertyتوسطhealthdارائه شده است و/sys/class/power_supplyمستقیماً آن را میخواند.بهدلیل ملاحظات امنیتی، برنامهها مجاز نیستند مستقیماً با لایه انتزاع سختافزار سلامت تماس بگیرند. در Android 9 و بالاتر، سرویس پیونددهنده
IBatteryPropertiesRegistrarبهجایhealthdتوسطBatteryServiceارائه میشود.BatteryServiceتماس را به HAL سلامت واگذار میکند تا اطلاعات درخواستی را بازیابی کند.BatteryService. در Android 9 و بالاتر،
BatteryServiceازHealthServiceWrapperاستفاده میکند تا تعیین کند از نمونه سرویس سلامت پیشفرض ازvendorاستفاده کند یا از نمونه سرویس سلامت پشتیبان ازhealthdاستفاده کند. سپسBatteryServiceازطریقIHealth.registerCallbackبه رویدادهای سلامتی گوش میدهد.ذخیرهشده. در Android 9 و بالاتر،
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(در «سلامت» نسخه ۲.۱ اضافه شده است) /sys/class/power_supply/*/capacity/sys/class/power_supply/*/charge_counter/sys/class/power_supply/*/charge_full-
/sys/class/power_supply/*/charge_full_design(در «سلامت» نسخه ۲.۱ اضافه شده است) /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(در «سلامت» نسخه ۲.۱ اضافه شده است) /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، ممکن است اختیاری باشند. بااینحال، برای جلوگیری از عملکرد نادرست چارچوب ناشی از نبود واسطهای هسته، توصیه میشود
CL 1398913
را قبلاز ساختن سرویس Health HAL 2.1 انتخاب کنید.
آزمایش
Android 11 شامل
آزمایشهای VTS
جدیدی است که بهطور خاص برای health@2.1 HAL نوشته شده است. اگر دستگاهی
health@2.1 HAL را در مانیفست دستگاه اعلام کند، باید آزمونهای VTS مربوطه را با موفقیت بگذراند.
آزمایشها هم برای نمونه پیشفرض (برای اطمینان از اینکه دستگاه
«لایه انتزاع سختافزار» را بهدرستی پیادهسازی میکند) و هم برای نمونه پشتیبان (برای اطمینان از اینکه healthd
قبلاز برداشته شدن همچنان بهدرستی کار میکند) نوشته میشوند.
الزامات اطلاعات باتری
Health 2.0 HAL مجموعهای از الزامات را در رابط HAL بیان میکند، اما آزمایشهای VTS مربوطه در اجرای آنها نسبتاً آسانگیر هستند. در Android 11، آزمایشهای VTS جدیدی اضافه شده است تا الزامات زیر را در دستگاههایی که با Android 11 و بالاتر راهاندازی میشوند اعمال کند:
- واحد جریان باتری لحظهای و میانگین باید میکروآمپر (μA) باشد.
- علامت جریان باتری لحظهای و متوسط باید صحیح باشد.
بهطور مشخص:
- وقتی وضعیت باتری
UNKNOWNاست، مقدار فعلی برابر با ۰ است - جریان > ۰ وقتی وضعیت باتری
CHARGINGاست - وقتی وضعیت باتری
NOT_CHARGINGاست، جریان <= ۰ است - وقتی وضعیت باتری
DISCHARGINGاست، جریان < ۰ است - وقتی وضعیت باتری
FULLباشد اعمال نمیشود
- وقتی وضعیت باتری
- وضعیت باتری باید با متصل بودن یا نبودن منبع برق مطابقت داشته باشد. بهطور خاص:
- وضعیت باتری باید یکی از
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 مراجعه کنید.
برای جزئیات، کلاس منبع تغذیه Linux را ببینید.