הטמעת 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_* משתנים ספציפיים ללוח שמשמשים ליצירת 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.

    מטעמי אבטחה, לאפליקציות אסור להתקשר ישירות ל-HAL של Health. ב-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 ממשיך לפעול בצורה נכונה לפני שהוא מוסר).

דרישות לגבי מידע על הסוללה

ב-HAL גרסה 2.0 של Health מוגדרות דרישות לגבי ממשק HAL, אבל הבדיקות התואמות של VTS לא מחמירות יחסית באכיפת הדרישות האלה. ב-Android 11, נוספו בדיקות VTS חדשות כדי לאכוף את הדרישות הבאות במכשירים שמושקים עם Android מגרסה 11 ואילך:

  • יחידות הזרם המיידי והממוצע של הסוללה חייבות להיות מיקרואמפר (μA).
  • הסימן של הזרם הרגעי והממוצע של הסוללה חייב להיות נכון. באופן ספציפי:
    • הערך הנוכחי הוא 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.