הטמעת Health 2.1

המסמכים להטמעה של Health 2.1 HAL זמינים כאן.

ב-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.

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