ב-Android 11, כל קוד 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
וביצוע סקרים. ב-init, health@2.1-service
רושם הטמעה של הממשק IHealth
ב-hwservicemanager
. כשמשדרגים מכשירים עם תמונת ספק של Android 8.x או 9 ומסגרת של Android 11, יכול להיות שתמונת הספק לא תספק את השירות health@2.1. לוח הזמנים להוצאה משימוש מחייב תאימות לאחור עם תמונות ישנות של ספקים.
כדי להבטיח תאימות לאחור:
-
healthd
נרשםIHealth
ל-hwservicemanager
למרות שהוא דמון של המערכת. IHealth
נוסף למניפסט המערכת, עם שם המופע 'גיבוי'. - המסגרת ו-
storaged
מתקשרות עםhealthd
באמצעותhwbinder
במקוםbinder
. - הקוד של המסגרת ושל
storaged
משתנה כדי לאחזר את המופע default אם הוא זמין, ואז את המופע backup.- קוד הלקוח של C++ משתמש בלוגיקה שמוגדרת ב-
libhealthhalutils
. - קוד לקוח Java משתמש בלוגיקה שמוגדרת ב-
HealthServiceWrapper
.
- קוד הלקוח של C++ משתמש בלוגיקה שמוגדרת ב-
- אחרי ש-iHealth/default יהיה זמין באופן נרחב ותמונות הספקים של Android 8.1 יצאו משימוש, אפשר יהיה להוציא משימוש את iHealth/backup ואת
healthd
.
משתני build ספציפיים ללוח עבור healthd
BOARD_PERIODIC_CHORES_INTERVAL_*
הם משתנים ספציפיים ללוח שמשמשים ליצירת
BOARD_PERIODIC_CHORES_INTERVAL_*
.healthd
כחלק מהפיצול של בניית המערכת/הספק, אי אפשר להגדיר ערכים ספציפיים ללוח עבור מודולים של המערכת. בעבר, הערכים האלה הוחלפו בפונקציה שהוצאה משימוש healthd_board_init
.
ב-health@2.1, ספקים יכולים לבטל את הערכים של שני מרווחי הזמן האלה של משימות תקופתיות במבנה 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(int id)
היה הלקוח היחיד שלIBatteryPropertiesRegistrar.getProperty
. המידע עלIBatteryPropertiesRegistrar.getProperty
סופק על ידיhealthd
ונקרא ישירות על ידי/sys/class/power_supply
.מטעמי אבטחה, לאפליקציות אסור להתקשר ישירות אל Health HAL. ב-Android מגרסה 9 ואילך, שירות ה-binder
IBatteryPropertiesRegistrar
מסופק על ידיBatteryService
במקום על ידיhealthd
. BatteryService
מעבירה את הקריאה ל-HAL של הבריאות כדי לאחזר את המידע המבוקש.BatteryService. ב-Android בגרסה 9 ואילך,
BatteryService
משתמש ב-HealthServiceWrapper
כדי לקבוע אם להשתמש במופע של שירות הבריאות שמוגדר כברירת מחדל מ-vendor
או במופע של שירות הבריאות שמוגדר כגיבוי מ-healthd
. BatteryService
ואז מאזין לאירועים שקשורים לבריאות דרךIHealth.registerCallback
.Storaged. ב-Android בגרסה 9 ואילך,
storaged
משתמש ב-libhealthhalutils
כדי לקבוע אם להשתמש במופע של שירות הבריאות שמוגדר כברירת מחדל מ-vendor
או במופע של שירות הבריאות שמוגדר כגיבוי מ-healthd
. storaged
ואז מאזין לאירועים שקשורים לבריאות דרךIHealth.registerCallback
ומאחזר מידע על האחסון.
שינויים ב-SELinux
HAL health@2.1 כולל את השינויים הבאים ב-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
, עשויים להיות אופציונליים. עם זאת, כדי למנוע התנהגויות שגויות של המסגרת כתוצאה מממשקי ליבה חסרים, מומלץ לבחור את CL 1398913 לפני שיוצרים את שירות Health HAL 2.1.
בדיקה
Android 11 כולל בדיקות VTS חדשות שנכתבו במיוחד עבור health@2.1 HAL. אם מכשיר מצהיר על health@2.1 HAL במניפסט המכשיר, הוא חייב לעבור את בדיקות ה-VTS המתאימות.
הבדיקות נכתבות גם עבור מופע ברירת המחדל (כדי לוודא שהמכשיר מטמיע את HAL בצורה נכונה) וגם עבור מופע הגיבוי (כדי לוודא ש-healthd
ממשיך לפעול בצורה נכונה לפני שהוא מוסר).
דרישות לגבי מידע על הסוללה
ב-Health 2.0 HAL מוגדרות דרישות לגבי ממשק HAL, אבל בדיקות VTS התואמות לא מחמירות יחסית באכיפת הדרישות האלה. ב-Android 11, נוספו בדיקות VTS חדשות כדי לאכוף את הדרישות הבאות במכשירים שמופעלת בהם מערכת Android מגרסה 11 ואילך:
- יחידות הזרם המיידי והממוצע של הסוללה חייבות להיות מיקרואמפר (μA).
- הסימן של הזרם הרגעי והממוצע של הסוללה חייב להיות נכון.
באופן ספציפי:
- current == 0 כשסטטוס הסוללה הוא
UNKNOWN
- הערך של current > 0 כשמצב הסוללה הוא
CHARGING
- הערך הנוכחי <= 0 כשמצב הסוללה הוא
NOT_CHARGING
- הערך הנוכחי < 0 כשמצב הסוללה הוא
DISCHARGING
- לא נאכף כשמצב הסוללה הוא
FULL
- current == 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
ב-1,000 ומדווחת על ערכים במיליוולט (mV). למידע נוסף: @1.0::HealthInfo
לפרטים נוספים, אפשר לעיין במאמר בנושא ספק כוח מסוג Linux.