הטמעת תקינות 2.1

ב-Android 11, כל הקוד של healthd עובר ארגון מחדש את libhealthloop ואת libhealth2impl, ואז שונתה כדי להטמיע את Health@2.1 HAL. שתי הספריות האלה מקושרות באופן סטטי על ידי health@2.0-impl-2.1, הטמעת ההעברה של Health 2.1. הספריות המקושרות באופן סטטי לאפשר ל-health@2.0-impl-2.1 לבצע את אותן העבודה כמו healthd, למשל healthd_mainloop וסקרים. באתחול, health@2.1-service רושם של הממשק IHealth עד hwservicemanager. בזמן השדרוג מכשירים עם Android מגרסה 8.x או 9 תמונה של הספק ו-framework של Android 11 יכול להיות שתמונת הספק לא מספקת את השירות Health@2.1. אחורה תאימות לתמונות ישנות של ספק לוח הזמנים להוצאה משימוש.

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

  1. healthd מבצע רישום של IHealth ל-hwservicemanager למרות שהוא מערכת דימון. IHealth מתווסף למניפסט של המערכת, עם שם המכונה 'גיבוי'.
  2. פלטפורמת ה-framework ו-storaged מתקשרים עם healthd באמצעות hwbinder במקום binder.
  3. הקוד של framework ו-storaged משתנים כדי לאחזר את המכונה 'ברירת מחדל' אם זמין, ואז 'גיבוי'.
    • קוד הלקוח של C++ משתמש בלוגיקה שהוגדרה ב-libhealthhalutils.
    • קוד הלקוח של Java משתמש בלוגיקה שהוגדרה ב-HealthServiceWrapper.
  4. אחרי שהגישה ל-IHealth/ברירת המחדל היא רחבה, ותמונות של ספקי Android 8.1 זמינות הוצאו משימוש, אפשר לצאת משימוש ב-IHealth/backup וב-healthd. לקבלת מידע נוסף פרטים נוספים זמינים במאמר הוצאה משימוש של Health@1.0.

משתני build ספציפיים ללוח עבור תקינות

BOARD_PERIODIC_CHORES_INTERVAL_* הם משתנים ספציפיים ללוח שמשמשים לפיתוח healthd. כחלק מחלוקת ה-build של המערכת/הספק, ערכים ספציפיים ללוח לא ניתן להגדיר למודולים של המערכת. בעבר הערכים האלה בוטלו בפונקציה healthd_board_init שהוצאה משימוש.

ב-Health@2.1, ספקים יכולים לשנות שני הערכים התקופתיים של מרווחי המטלות במבנה healthd_config לפני מועברים ל-constructor של סיווג ההטמעה בתחום הבריאות. הבריאות סוג ההטמעה אמור לקבל בירושה 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.
  • סוללה Manager. BatteryManager.queryProperty(int id) היה היחיד לקוח של IBatteryPropertiesRegistrar.getProperty. סופק על ידי IBatteryPropertiesRegistrar.getProperty על ידי healthd ונקרא ישירות את /sys/class/power_supply.

    מטעמי אבטחה, אסור לאפליקציות להפעיל HAL בתחום הבריאות ישירות. ב-Android מגרסה 9 ואילך, קלסר השירות IBatteryPropertiesRegistrar מסופק על ידי BatteryService במקום healthd. BatteryService הוענקה גישה לשיחה ל-HAL בתחום הבריאות כדי לאחזר את המידע המבוקש.

  • סוללה. ב-Android מגרסה 9 ואילך, האפליקציה BatteryService משתמשת בפונקציה HealthServiceWrapper כדי לקבוע אם להשתמש ברירת המחדל למופע של שירות הבריאות מ-vendor או להשתמש בגיבוי אירוע של שירותי בריאות מ-healthd. לאחר מכן BatteryService מקשיבים למשך אירועי בריאות דרך IHealth.registerCallback.

  • מאוחסן. ב-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.

ממשקי ליבה

הדימון (daemon) של 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 ניגש לממשקי הליבה האלה כברירת מחדל, אלא אם מבטלים אותו בהגדרות התקינות וה-constructor של סיווג ההטמעה.

אם הקבצים האלה חסרים או שלא ניתן לגשת אליהם דרך healthd או דרך שירות ברירת המחדל (לדוגמה, הקובץ הוא קישור סימבולי לתיקייה ספציפית לספק). שדוחה גישה בגלל מדיניות SELinux שאינה מוגדרת כראוי), ייתכן שהם לא לא פועלות כראוי. לכן, ייתכן שהשינויים הנוספים ב-SELinux ספציפיים לספק הכרחי, למרות שנעשה שימוש בהטמעת ברירת המחדל.

חלק מממשקי הליבה שמשמשים ב-Health 2.1, כמו /sys/class/power_supply/*/capacity_level והקבוצה /sys/class/power_supply/*/time_to_full_now, עשוי להיות אופציונלי. אבל, כדי למנוע התנהגות שגויה של framework כתוצאה מחסרים ממשקי ליבה (kernel), מומלץ לבחור בקפידה 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).
  • הסימן של טעינה מיידית וממוצעת של הסוללה חייב להיות נכון. ספציפית:
    • הערך הנוכחי = 0 כשסטטוס הסוללה הוא UNKNOWN
    • נוכחי > 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.