כל הקוד של healthd
הועלה מחדש ל-health@2.0-impl ול-libhealthservice
, ואז שונה כדי להטמיע את Health@2.0 HAL. שתי הספריות האלה מקושרות באופן סטטי על ידי health@2.0-service, ומאפשרות לו לבצע את העבודה שבעבר בוצעה על ידי healthd
(כלומר, להריץ את healthd_mainloop
ולבצע סקרים). ב-init, השירות health@2.0 רושם הטמעה של הממשק IHealth
ל-hwservicemanager
. כשמשדרגים מכשירים עם קובץ אימג' של ספק עם Android 8.x ו-Android 9 framework, יכול להיות שהשירות health@2.0 לא יסופק על ידי קובץ האימג' של הספק. לוח הזמנים להוצאה משימוש אוכף את המדיניות הזו.
כדי לפתור את הבעיה:
healthd
רושם אתIHealth
ל-hwservicemanager
(למרות שהוא דימון (daemon)).IHealth
מתווסף למניפסט המערכת, עם שם המכונה"backup"
.- Framework ו-
storaged
מתקשרים עםhealthd
דרךhwbinder
במקוםbinder
. - הקוד של המסגרת ושל
storaged
משתנה כדי לאחזר את המכונה"default"
אם היא זמינה, ואז את"backup"
.- קוד הלקוח ב-C++ משתמש בלוגיקה שמוגדרת ב-
libhealthhalutils
. - קוד הלקוח ב-Java משתמש בלוגיקה שהוגדרה ב-
HealthServiceWrapper
.
- קוד הלקוח ב-C++ משתמש בלוגיקה שמוגדרת ב-
- אחרי שהאפליקציה IHealth/default זמינה לכולם, ותמונות של ספקי Android 8.1 הוצאו משימוש, אפשר להוציא את IHealth/backup ו-
healthd
. לפרטים נוספים, ראו Deprecatinghealth@1.0.
משתני build ספציפיים ללוח ל-healthd
BOARD_PERIODIC_CHORES_INTERVAL_*
הם משתנים ספציפיים ללוח המשמשים ליצירת healthd
. כחלק מהחלוקה של גרסאות build למערכת ולספק, אי אפשר להגדיר ערכים ספציפיים ללוח למודול המערכת. ב-health@2.0, ספקים יכולים לשנות את שני הערכים האלה ב-healthd_mode_ops->init
(על ידי הסרת התלות ב-libhealthservice
ב-health@2.0-service.<device>
והטמעה מחדש של הפונקציה הזו).
ספריית הטמעה סטטית
בניגוד לספריות הטמעה אחרות של HAL, ספריית ההטמעה health@2.0-impl היא ספרייה סטטית שמקושרות אליה health@2.0-service, charger, recovery ו-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 במקום אל BudgetMonitor.
הטמעת שירות 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
באופן סטטי.
- מוגדרים, יוצרים
אם המכשיר:
- אם מטמיעים את ממשקי ה-API
getStorageInfo
ו-getDiskStats
, צריך לספק את ההטמעה בפונקציותget_storage_info
ו-get_disk_stats
. - לא צריך להטמיע את ממשקי ה-API האלה, צריך לקשר ל-
libstoragehealthdefault
באופן סטטי.
- אם מטמיעים את ממשקי ה-API
מעדכנים את ההרשאות הנדרשות של 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>
פרטים נוספים זמינים בקובץ hardware/interfaces/health/2.0/README.md.
לקוחות בתחום הבריאות
לקוחות Health ל-Health 2.1 HAL
שינויים ב-SELinux
ה-HAL החדש של health@2.0 כולל את השינויים הבאים ב-SELinux:
- הוספת health@2.0-service אל
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.
ממשקי ליבה
ממשקי ליבה ל-HAL של Health 2.1
בדיקה
Android 9 כולל בדיקות VTS חדשות שנכתבו במיוחד עבור ה-HAL של health@2.0. אם מכשיר מצהיר במניפסט שלו שהוא מספק HAL של health@2.0, הוא חייב לעבור את בדיקות ה-VTS המתאימות.
הבדיקה נכתבת גם למכונה שמוגדרת כברירת מחדל (כדי לוודא שהמכשיר מטמיע את HAL בצורה נכונה) וגם למכונה לגיבוי (כדי לוודא ש-healthd
ממשיך לפעול בצורה תקינה לפני שהוא מוסר).