Android 9 כולל את android.hardware.health
HAL 2.0, שדרוג של גרסה ראשית מ-health@1.0 HAL. ל-HAL החדש יש את היתרונות הבאים:
- צריכה להיות הפרדה ברורה יותר בין ה-framework לבין קוד הספק.
- הוצאה משימוש של הדימון הלא הכרחי
healthd
. - יותר דרגות חופש להתאמה אישית של ספקים בדוחות של מידע רפואי.
- יותר מידע על תקינות המכשיר מאשר רק הסוללה.
Android 11 כולל את android.hardware.health
HAL 2.1, שדרוג של גרסה משנית מ-health@2.0 HAL. ל-HAL החדש יש את היתרונות הבאים:
- קל יותר להטמיע
- תאימות טובה יותר לממשקי HAL API קיימים בגרסה 2.0
- הפרדה טובה יותר של תדרי הצליל הגבוהים בקוד הטעינה במצב כבוי
- תמיכה טובה יותר במסגרת כדי לציין את תקינות הסוללה של המכשיר
מערכת Android 13 כוללת את android.hardware.health
AIDL HAL,
המרה מ-health@2.1 HAL. ל-HAL החדש יש את היתרונות הבאים:
- הסרת ממשקי API שקשורים למטענים שאינם בשימוש
- הסרת
StorageAttribute
שלא בשימוש ושדות קשורים - תמיכה בטעינה באביזר עגינה.
הדרישות
מכשירים עם Android 9 ו-Android 10
במכשירים שיושקו עם Android 9 חייבים לספק את ה-HAL מגרסה 2.x (אסור לספק את ה-HAL מגרסה 1.0) או את ה-HAL של AIDL. במכשירים שלא יושקו עם Android 9 אבל מתוכנן לעדכן את קובץ האימג' של הספק למטריצה של תאימות מסגרת היעד בגרסה 3 (שפורסמה ב-Android 9), צריך להסיר את הטמעות ה-HAL הקיימות של 1.0 ולספק את ה-HAL של 2.x או את ה-HAL של AIDL.
AOSP כולל כמה ספריות עזר שנועדו לעזור לכם להטמיע את HAL 2.0 ולעבור מ-HAL 1.0 הישן.
במכשירים עם Android 11 ו-Android 12
במכשירים שיושקו עם Android 11 צריך לספק את ה-HAL בגרסה 2.1 (אסור לספק את ה-HAL בגרסה 1.0 או 2.0) או את ה-HAL של AIDL. במכשירים שלא יושקו עם Android 11 אבל מתוכנן לעדכן את קובץ האימג' של הספק לטבלת התאימות של מסגרת היעד (Target Framework Compatibility Matrix) בגרסה 5 (שפורסמה ב-Android 11), צריך להסיר את הטמעות ה-HAL הקיימות של 2.0 ולספק את ה-HAL של 2.1 או את ה-HAL של AIDL. מומלץ גם לספק את HAL בגרסה 2.1 במכשירים שלא יושקו עם Android 11 ולא מתכננים לעדכן את קובץ האימג' של הספק.
AOSP כולל כמה ספריות עזר שנועדו לעזור לכם להטמיע את HAL 2.1 ואת המעבר מ-HAL 1.0 הישן.
במכשירים עם Android מגרסה 13 ואילך
במכשירים שיושקו עם Android 13 חייב להיות HAL של AIDL (אסור לספק HAL של HIDL). במכשירים שלא יושקעו עם Android 13 אבל מתוכנן לעדכן את קובץ האימג' של הספק למטריצה של תאימות מסגרת היעד (Target Framework Compatibility Matrix) בגרסה 7 (שפורסמה ב-Android 13), צריך להסיר את ההטמעות הקיימות של HIDL HAL ולספק את AIDL HAL. מומלץ גם לספק את AIDL HAL במכשירים שלא יושקו עם Android 13 ולא מתכננים לעדכן את קובץ האימג' של הספק.
אסור למכשירים לספק את HIDL 1.0 HAL.
AOSP כולל כמה ספריות עזר שנועדו לעזור לכם להטמיע את AIDL HAL ואת המעבר מ-HIDL HALs הישן.
טרמינולוגיה
- health@1.0: קיצור של
android.hardware.health@1.0
. מתייחסת ל-health HIDL HAL בגרסה 1.0 שפורסמה ב-Android 8.0. - health@2.0: קיצור של
android.hardware.health@2.0
. מתייחסת ל-health HIDL HAL בגרסה 2.0 שפורסמה ב-Android 9. - health@2.1: קיצור של
android.hardware.health@2.1
. מתייחסת ל-health HIDL HAL בגרסה 2.1 שפורסמה ב-Android 11. - health AIDL HAL: קיצור של
android.hardware.health
.- גרסה 1 זמינה ב-Android 13.
- Charger: קובץ הפעלה שפועל בטעינה לא במצב שבו מוצגת האנימציה של טעינת הטלפון.
- recovery: קובץ הפעלה שפועל במצב שחזור שצריך לאחזר את פרטי הסוללה.
- healthd: דימון מדור קודם שפועל ב-Android, מאחזר מידע שקשור לבריאות ומספק אותו למסגרת.
- storaged: דימון (daemon) שפועל ב-Android שמאחזר את פרטי האחסון ומספק אותם ל-framework.
אפליקציית Health ב-Android 8.x
ב-Android 8.x, רכיב הבריאות פועל כפי שמתואר בתרשים הבא:
איור 1. בריאות ב-Android 8.x.
בתרשים הזה:
- המסגרת משתמשת בקריאה אחת ל-binder ובקריאה אחת ל-hwbinder כדי לתקשר עם החומרה.
healthd
מקושר באופן סטטי אלlibhealthd_android
,libbatterymonitor
ו-libbatteryservice
.- health@1.0-impl מקשר באופן סטטי אל
libhealthd.BOARD
.
לכל לוח אפשר להתאים אישית libhealthd.BOARD
שונה. בשלב ה-build נקבע לאילו קבצים libhealthd.BOARD
, health@1.0-impl ו-recovery יקשרו.
במצבים אחרים:
איור 2. אפליקציית Health ב-Android 8.x, טעינה במצב כבוי ומצב שחזור.
- charger מקשר באופן סטטי אל
libhealthd.BOARD
,libhealthd_charger
ו-libbatterymonitor
. - recovery מקושר באופן סטטי אל
libhealthd.BOARD
ו-libbatterymonitor
.
אפליקציית Health ב-Android 9
ב-Android 9, רכיב הבריאות פועל כפי שמתואר בתרשים הבא:
איור 3. אפליקציית Health ב-Android מגרסה 9.
המסגרת מנסה לאחזר את השירות health@2.0 מ-hwservicemanager
.
אם הפעולה נכשלת, היא שולחת קריאה אל Health@1.0 (ב-Android 8.x). נתיב הקוד הקודם נשמר כדי שתמונת המערכת של Android 9 תהיה תואמת לתמונת הספק של Android 8.x. תוכנת ה-framework לא מאחזרת מידע משני תהליכי HAL כי במכשיר יכולה להיות רק גרסת שירות אחת (1.0 או 2.0).
במצבים אחרים:
איור 4. אפליקציית Health ב-Android 9, טעינה במצב כבוי ומצב שחזור.
בריאות ב-Android 11
ב-Android 11, רכיב הבריאות פועל כפי שמפורט בתרשים הבא:
[system]
| getService()
V
[health@2.1-service]
| getService(stub=true)
V
[ health@2.0-impl-2.1-<device>.so ]
| | (device-dependent linkage)
V V
+---------Helper libs for impl--------+ [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl) ] |
| [libbatterymonitor (battery) ] |
+-------------------------------------+
אם ההטמעה של health 2.1 לא קיימת, המערכת חוזרת לנתיב הקוד הקודם כפי שמתואר בקטעים הקודמים
במצבים אחרים:
[ charger ]
| getService() | (legacy code path)
V +-------------------------------------------------+
[health@2.1-service] |
| getService(stub=true) |
V |
[ health@2.0-impl-2.1-<device>.so ] |
| | (device-dependent linkage) |
V V |
+---------Helper libs for impl--------+ [libhealthd.device] |
| [libhealthloop (uevent, wakealarm)] | |
| [libhealth2impl (IHealth impl) ] | <---------------------------------+
| [libbatterymonitor (battery) ] |
+-------------------------------------+
[recovery]
| getService() w/o hwservicemanager
V
[ health@2.0-impl-2.1-<device>.so ]
| | (device-dependent linkage)
V V
+---------Helper libs for impl--------+ [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl) ] |
| [libbatterymonitor (battery) ] |
+-------------------------------------+
בתרשים הפשוט הבא מפורטים המצבים השונים:
איור 5. תשתית Health HAL 2.1.
אפליקציית Health ב-Android 13
ב-Android 13 אנחנו משיקים את AIDL HAL בתחום הבריאות. רכיב הבריאות פועל באופן שמתואר בתרשים הבא:
איור 6. תשתית HAL של Health AIDL.
ממשק HIDL HAL 2.0
ה-HAL של health@2.0 מספק ל-Framework את אותה פונקציונליות כמו הדימון הישן של healthd. הוא גם מספק ממשקי API שדומים לממשקים ש-healthd סיפק בעבר כשירות קישור (למשל, IBatteryPropertiesRegistrar).
הממשק הראשי, IHealth, מספק את הפונקציות הבאות:
registerCallback
, כדי להחליף אתIBatteryPropertiesRegistrar.registerListener
unregisterCallback
, כדי להחליף אתIBatteryPropertiesRegistrar.unregisterListener
update
, כדי להחליף אתIBatteryPropertiesRegistrar.scheduleUpdate
IBatteryPropertiesRegistrar.getProperties
מוחלפים בערכים הבאים:getChargeCounter
getCurrentNow
getCurrentAverage
getCapacity
getEnergyCounter
getChargeStatus
getHealthInfo
בנוסף, IHealth
מספק את ממשקי ה-API החדשים הבאים ל-storaged
כדי לאחזר מידע שקשור לאחסון ספציפי לספק:
getStorageInfo
getDiskStats
מבנה חדש, @2.0::HealthInfo
, מוחזר באמצעות פונקציות קריאה חוזרת (callbacks) ו-getHealthInfo
.
המבנה הזה מכיל את כל המידע על תקינות המכשיר שזמין דרך ה-HAL של health@2.0, כולל:
- פרטי הטעינה (AC/USB/אלחוטי, זרם, מתח וכו')
- מידע על הסוללה (נוכחות, רמת הטעינה, זרם, מתח, טעינה, טכנולוגיה וכו')
- מידע על האחסון (פרטי התקן האחסון, נתונים סטטיסטיים של הדיסק)
למידע על הטמעת Health 2.0, ראו הטמעת Health 2.0.
ממשק HIDL HAL 2.1
ה-HAL של health@2.1 תומך בטעינה במצב כבוי ומספק מידע נוסף על הסוללה.
בממשק הראשי, IHealth, יש את הפונקציות הנוספות הבאות:
getHealthConfig
: כדי לאחזר את התצורה של ה-HAL הזהgetHealthInfo_2_1
: שדרוג לגרסה משניתgetHealthInfo
shouldKeepScreenOn
: כדי לקבוע אם המסך יישאר דלוק במצב טעינה
בנוסף, ההטמעה של @2.1::IHealth
צריכה לתמוך ב-@2.1::IHealthInfoCallback
עבור הפונקציות שעברו בירושה registerCallback
ו-unregisterCallback
. ממשק הקריאה החוזרת החדש מחזיר ללקוח מידע רפואי ובריאותי באמצעות הפונקציה healthInfoChanged_2_1
שלו, במקום באמצעות הפונקציה healthInfoChanged
שעברה בירושה.
מבנה חדש, @2.1::HealthInfo
, מוחזר באמצעות קריאות חוזרות (callback) ו-getHealthInfo_2_1
. המבנה הזה מכיל מידע נוסף על בריאות המכשיר שזמין דרך health@2.0 HAL, כולל:
- רמת קיבולת הסוללה
- זמן הטעינה של הסוללה עד טעינה מלאה (בשניות)
- קיבולת תכנון של סוללה בטעינה מלאה (ב-μAh)
בתרשים ה-UML הבא מפורטות הכיתות ששימושיות להטמעת HAL של בריאות:
איור 7. תרשים UML של Health HAL 2.1.
למידע על הטמעת שירות Health 2.1, ראו הטמעת Health 2.1.
ממשק AIDL HAL בגרסה 1
שינויים ב-API
ה-HAL של AIDL בגרסה 1 תומך בממשקי API דומים לאלה של ה-HAL של HIDL 2.1. בהשוואה לממשק HIDL 2.1, השינויים הבאים בוצעו ב-API:
- ממשקי API שקשורים למטענים ב-HIDL HAL 2.1 לא מועברים ל-AIDL HAL. מאחר שהפונקציונליות של הטעינה במצב כבוי נמצאת רק במחיצה
/vendor
, אין צורך ב-API בממשק הספק. כדי להטמיע טעינה במצב כבוי בצורה נכונה, קראו את הקטע מטען בהמשך. - הסוג
StorageAttribute
והשדות הקשורים אליו יוסרו כי הם לא בשימוש. chargerDockOnline
מתווסף ל-HealthInfo
כדי לתמוך בטעינה במעמד.
הטמעה
בתרשים ה-UML הבא מפורטות הכיתות ששימושיות להטמעת HAL של בריאות:
איור 8. תרשים Health AIDL HAL UML.
מידע נוסף על הטמעת שירות ה-Health AIDL זמין במאמר הטמעת Health AIDL HAL.
שחזור
ב-Android 13 יש תמיכה ב-binder בתהליך השחזור. התקנת שירות Health AIDL לתהליך השחזור מאפשרת להפעיל אותו במצב שחזור.
למידע על התקנת שירות AIDL לבריאות בתהליך השחזור, תוכלו לקרוא את המאמרים הבאים:
מטען
הפונקציונליות של הטעינה במצב כבוי הועברה מ-/system
ל-/vendor
. במכשירים שיושקו עם Android 13, אם הם תומכים בטעינה במצב כבוי, קובץ ה-binary של שירות HAL חייב לתמוך במצב מטען. כדי לעשות זאת, תוכלו לעיין במאמר הטמעת מטען.
מאפייני המערכת של המטען
המאפיינים ro.charger.*
כבר לא ניתנים לקריאה על ידי הקובץ הבינארי charger
ב-/vendor
. אם במכשיר מוגדרים מאפייני מערכת מתוך ro.charger.*
, תוכלו לעיין במאמר מאפייני מערכת למטען.