הטמעת Health 2.1

ב-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. לוח הזמנים להוצאה משימוש מחייב תאימות לאחור עם תמונות ישנות של ספקים.

כדי להבטיח תאימות לאחור:

  1. healthd נרשם IHealth ל-hwservicemanager למרות שהוא דמון של המערכת. ‫IHealth נוסף למניפסט המערכת, עם שם המופע 'גיבוי'.
  2. המסגרת ו-storaged מתקשרות עם healthd באמצעות hwbinder במקום binder.
  3. הקוד של המסגרת ושל storaged משתנה כדי לאחזר את המופע default אם הוא זמין, ואז את המופע backup.
    • קוד הלקוח של C++‎ משתמש בלוגיקה שמוגדרת ב-libhealthhalutils.
    • קוד לקוח Java משתמש בלוגיקה שמוגדרת ב-HealthServiceWrapper.
  4. אחרי ש-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
  • סטטוס הסוללה צריך להיות נכון בהתאם לשאלה אם מקור מתח מחובר או לא. באופן ספציפי:
    • סטטוס הסוללה חייב להיות אחד מהערכים 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.