יישום בריאות 2.1

באנדרואיד 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 ו-polling. ב-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 משתנה כדי להביא את המופע "ברירת מחדל" אם זמין, ואז "גיבוי".
    • קוד לקוח C++ משתמש בלוגיקה המוגדרת ב- libhealthhalutils .
    • קוד לקוח Java משתמש בלוגיקה שהוגדרה ב- HealthServiceWrapper .
  4. לאחר ש-IHealth/ברירת מחדל זמין באופן נרחב ותמונות של ספקי אנדרואיד 8.1 הוצאו משימוש, ניתן לבטל את IHealth/גיבוי ו- healthd . לפרטים נוספים, ראה הוצאה משימוש בריאות@1.0 .

משתני בנייה ספציפיים ללוח עבור healthd

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

ב-health@2.1, הספקים יכולים לעקוף את שני ערכי מרווחי המטלות התקופתיים במבנה healthd_config לפני שהם עוברים לבנאי מחלקות יישום הבריאות. מחלקת יישום הבריאות צריכה לרשת android::hardware::health::V2_1::implementation::Health .

יישום שירות הבריאות 2.1

למידע על הטמעת שירות Health 2.1, ראה חומרה/ממשקים/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 בריאות. באנדרואיד 9 ומעלה, שירות הקלסר IBatteryPropertiesRegistrar מסופק על ידי BatteryService במקום healthd . BatteryService מאציל את השיחה ל-HAL בריאות כדי לאחזר את המידע המבוקש.

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

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

שינויים ב-SELinux

Health@2.1 HAL כולל את השינויים הבאים של 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 לפני בניית שירות HAL 2.1 בריאות.

בדיקה

אנדרואיד 11 כולל בדיקות VTS חדשות שנכתבו במיוחד עבור health@2.1 HAL. אם מכשיר מצהיר על health@2.1 HAL במניפסט המכשיר, עליו לעבור את בדיקות ה-VTS המתאימות. בדיקות נכתבות הן עבור מופע ברירת המחדל (כדי להבטיח שהמכשיר מיישם את ה-HAL בצורה נכונה) והן עבור מופע הגיבוי (כדי להבטיח כי healthd ממשיך לתפקד כהלכה לפני הסרתו).

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

Health 2.0 HAL מציין סט דרישות על ממשק HAL, אך בדיקות ה-VTS המקבילות רגועות יחסית באכיפתן. באנדרואיד 11, בדיקות VTS חדשות מתווספות כדי לאכוף את הדרישות הבאות במכשירים המופעלים עם אנדרואיד 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 ב-1000 ומדווח על ערכים במיליוולט (mV). ראה @1.0::HealthInfo .

לפרטים, ראה מחלקת ספק כוח לינוקס .