כל הקודים healthd
שוחזרו לתוך health@2.0-impl ו- libhealthservice
, ולאחר מכן שונה ליישום health@2.0 HAL. שתי הספריות הללו מקושרות באופן סטטי על ידי health@2.0-service, מה שמאפשר לה לבצע את העבודה שנעשתה בעבר על ידי healthd
(כלומר, להפעיל את healthd_mainloop
ולבצע סקר). ב-init, השירות health@2.0 רושם יישום של הממשק IHealth
ל- hwservicemanager
. בעת שדרוג מכשירים עם תמונת ספק Android 8.x ומסגרת Android 9, ייתכן ששירות health@2.0 לא יסופק על ידי תמונת הספק. זה נאכף על ידי לוח הזמנים של הוצאה משימוש .
כדי לפתור בעיה זו:
-
healthd
רושםIHealth
ל-hwservicemanager
(למרות היותו דמון מערכת).IHealth
מתווסף למניפסט המערכת, עם שם המופע"backup"
. - מסגרת
storaged
מתקשרים עםhealthd
דרךhwbinder
במקוםbinder
. - הקוד למסגרת
storaged
משתנה כדי להביא את המופע"default"
אם זמין, ואז"backup"
.- קוד לקוח C++ משתמש בלוגיקה המוגדרת ב-
libhealthhalutils
. - קוד לקוח Java משתמש בלוגיקה שהוגדרה ב-
HealthServiceWrapper
.
- קוד לקוח C++ משתמש בלוגיקה המוגדרת ב-
- לאחר ש-IHealth/default זמין באופן נרחב ותמונות של ספקי אנדרואיד 8.1 הוצאו משימוש, ניתן להוציא משימוש IHealth/גיבוי ו-
healthd
. לפרטים נוספים, ראה הוצאה משימוש בריאות@1.0 .
משתני בנייה ספציפיים ללוח עבור healthd
BOARD_PERIODIC_CHORES_INTERVAL_*
הם משתנים ספציפיים ללוח המשמשים לבניית healthd
. כחלק מפיצול בניית מערכת/ספק, לא ניתן להגדיר ערכים ספציפיים ללוח עבור מודולי מערכת. ב-health@2.0, הספקים יכולים לעקוף את שני הערכים הללו ב- healthd_mode_ops->init
(על ידי ביטול התלות libhealthservice
ב- health@2.0-service.<device>
ויישום מחדש של פונקציה זו).
ספריית יישום סטטית
שלא כמו ספריות יישום אחרות של HAL, ספריית היישום health@2.0-impl היא ספרייה סטטית שאליה מקשר health@2.0-service, מטען, שחזור ו-Health Healthd מדור קודם.
health@2.0.impl מיישם IHealth
כמתואר לעיל ונועד לעטוף את libbatterymonitor
ו- libhealthd. BOARD
. למשתמשים אלה של health@2.0-impl אסור להשתמש ישירות BatteryMonitor
או בפונקציות ב- libhealthd
; במקום זאת, יש להחליף שיחות אלו בקריאות למחלקת Health
, יישום של ממשק IHealth
. כדי להכליל יותר, קוד healthd_common
כלול גם ב- health@2.0-impl. ה- healthd_common
החדש מכיל את שאר הקוד הנפוץ בין health@2.0-service, מטען ו- healthd
וקורא לשיטות IHealth במקום BatteryMonitor.
הטמעת שירות בריאות 2.0
בעת הטמעת שירות health@2.0 עבור מכשיר, אם יישום ברירת המחדל הוא:
- מספיק למכשיר, השתמש ישירות
android.hardware.health@2.0-service
. לא מספיק עבור המכשיר, צור את קובץ ההפעלה
android.hardware.health@2.0-service.(device)
וכלול:#include <health2/service.h> int main() { return health_service_main(); }
לאחר מכן:
אם
libhealthd:
- קיים, קישור אליו.
- לא קיים, ספק יישומים ריקים עבור פונקציות
healthd_board_init
ו-healthd_board_battery_update
.
אם משתני
BOARD_PERIODIC_CHORES_INTERVAL_*
ספציפיים ללוח:- מוגדרים, צור
HealthServiceCommon.cpp
ספציפי למכשיר (הועתק מ-hardware/interfaces/health/2.0/utils/libhealthservice
) והתאם אותו אישית ב-healthd_mode_service_2_0_init
. - אינם מוגדרים, קישור ל-
libhealthservice
באופן סטטי.
- מוגדרים, צור
אם מכשיר:
- צריך ליישם ממשקי API של
getStorageInfo
ו-getDiskStats
, ספק את המימוש בפונקציותget_storage_info
ו-get_disk_stats
. - לא צריך ליישם את ממשקי ה-API האלה, קישור ל-
libstoragehealthdefault
באופן סטטי.
- צריך ליישם ממשקי API של
עדכן את ההרשאות הדרושות של SELinux.
הטמעת HAL בשחזור על ידי התקנת מימוש מעבר לתמונת השחזור. דוגמא:
// Android.bp cc_library_shared { name: "android.hardware.health@2.0-impl-<device>", recovery_available: true, relative_install_path: "hw", static_libs: [ "android.hardware.health@2.0-impl", "libhealthd.<device>" // Include the following or implement device-specific storage APIs "libhealthstoragedefault", ], srcs: [ "HealthImpl.cpp", ], overrides: [ "android.hardware.health@2.0-impl-default", ], }
// HealthImpl.cpp #include <health2/Health.h> #include <healthd/healthd.h> using android::hardware::health::V2_0::IHealth; using android::hardware::health::V2_0::implementation::Health; extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) { const static std::string providedInstance{"default"}; if (providedInstance != name) return nullptr; return Health::initInstance(&gHealthdConfig).get(); }
# device.mk PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
לפרטים, עיין בחומרה/ממשקים/health/2.0/README.md .
לקוחות בריאות
ראה לקוחות בריאות עבור בריאות 2.1 HAL .
שינויים ב-SELinux
Health@2.0 HAL החדש כולל את השינויים הבאים ב-SELinux:
- מוסיף health@2.0-service ל-
file_contexts
. - מאפשר
system_server
ו-storaged
להשתמשhal_health
. - מאפשר
system_server
(BatteryService
) לרשוםbatteryproperties_service
(IBatteryPropertiesRegistrar
). - מאפשר
healthd
לספקhal_health
. - מסיר כללים המאפשרים
system_server
ול-storaged
להתקשר אלhealthd
דרך קלסר. - מסיר כללים המאפשרים ל-
healthd
לרשוםbatteryproperties_service
(IBatteryPropertiesRegistrar
).
עבור מכשירים עם יישום משלהם, ייתכן שיהיה צורך בשינויים מסוימים ב-SELinux של הספק. דוגמא:
# device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
/vendor/bin/hw/android\.hardware\.health@2\.0-service.<device> u:object_r:hal_health_default_exec:s0
# 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.
ממשקי ליבה
ראה ממשקי ליבה עבור Health 2.1 HAL .
בדיקה
אנדרואיד 9 כולל בדיקות VTS חדשות שנכתבו במיוחד עבור health@2.0 HAL. אם מכשיר מצהיר שהוא מספק health@2.0 HAL במניפסט המכשיר, עליו לעבור את בדיקות ה-VTS המתאימות. בדיקות נכתבות הן עבור מופע ברירת המחדל (כדי להבטיח שהמכשיר מיישם את ה-HAL בצורה נכונה) והן עבור מופע הגיבוי (כדי להבטיח כי healthd
ממשיך לתפקד כהלכה לפני הסרתו).
דרישות מידע על הסוללה
ראה דרישות מידע על הסוללה .