ב-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_* הם משתנים שספציפיים ללוח ומשמשים ליצירת
healthd. כחלק מהפיצול של הגדרות המערכת והספק, אי אפשר להגדיר ערכים ספציפיים ללוח עבור מודולים של המערכת. בעבר, הערכים האלה הוחלפו בפונקציה שהוצאה משימוש healthd_board_init.
ב-health@2.1, ספקים יכולים לבטל את הערכים של שני מרווחי הזמן האלה של משימות תקופתיות במבנה healthd_config לפני העברה לבונה של מחלקת הטמעת הבריאות. המחלקה health
implementation צריכה לרשת מ-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, עשויים להיות אופציונליים. עם זאת, כדי למנוע התנהגויות שגויות של ה-framework כתוצאה מממשקי ליבה חסרים, מומלץ להשתמש בקוד מהסתעפות אחרת (Cherry-picking) את CL 1398913 לפני שיוצרים את שירות Health HAL 2.1.
בדיקה
Android 11 כולל בדיקות VTS חדשות שנכתבו במיוחד עבור health@2.1 HAL. אם מכשיר מצהיר על health@2.1 HAL במניפסט המכשיר, הוא חייב לעבור את בדיקות ה-VTS המתאימות.
הבדיקות נכתבות גם עבור מופע ברירת המחדל (כדי לוודא שהמכשיר מטמיע את HAL בצורה נכונה) וגם עבור מופע הגיבוי (כדי לוודא ש-healthd ממשיך לפעול בצורה נכונה לפני ההסרה שלו).
דרישות לגבי מידע על הסוללה
ב-HAL של Health 2.0 מוגדרות דרישות מסוימות לממשק HAL, אבל הבדיקות התואמות של VTS לא מחמירות יחסית באכיפת הדרישות האלה. ב-Android 11, נוספו בדיקות VTS חדשות כדי לאכוף את הדרישות הבאות במכשירים שמושקים עם Android מגרסה 11 ואילך:
- יחידות הזרם המיידי והממוצע של הסוללה חייבות להיות מיקרואמפר (μA).
- הסימן של הזרם הרגעי והממוצע של הסוללה חייב להיות נכון.
באופן ספציפי:
- current == 0 כשסטטוס הסוללה הוא
UNKNOWN - הערך הנוכחי > 0 כשסטטוס הסוללה הוא
CHARGING - הערך current <= 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.