הטמעת Health 2.0

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

כדי לפתור את הבעיה:

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

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

BOARD_PERIODIC_CHORES_INTERVAL_* הם משתנים ספציפיים ללוח שמשמשים לפיתוח healthd. כחלק מחלוקת ה-build של מערכת/ספק, ערכים ספציפיים ללוח לא ניתן להגדיר למודולים של המערכת. ב-Health@2.0, הספקים יכולים לשנות את ברירת המחדל שני הערכים האלה ב-healthd_mode_ops->init (על ידי שחרור של libhealthservice או התלות ב-health@2.0-service.<device> והטמעה מחדש של הפונקציה).

ספריית הטמעה סטטית

בניגוד לספריות אחרות של הטמעת HAL, ספריית ההטמעה Health@2.0-impl היא ספרייה סטטית שאליה Health@2.0-service, מטען, שחזור וקישור תקין מדור קודם.

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 במקום ל-סוללה Monitor.

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

  • להטמיע HAL בשחזור על ידי התקנה של הטמעה מסוג passthrough קובץ אימג' לשחזור מערכת ההפעלה. דוגמה:

    // 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>
    

פרטים נוספים זמינים במאמר hardware/interfaces/health/2.0/README.md.

לקוחות בתחום הבריאות

למידע נוסף על לקוחות בתחום הבריאות בנוגע ל-Health 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 באמצעות binder.
  • הסרת כללים שמאפשרים ל-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.

בדיקה

Android 9 כולל בדיקות VTS חדשות נכתב במיוחד עבור Health@2.0 HAL. אם מכשיר מצהיר על לספק Health@2.0 HAL במניפסט של המכשיר צריך לעבור את בדיקות ה-VTS המתאימות. הבדיקות נכתבות עבור מופע ברירת המחדל (כדי לוודא שהמכשיר מממשת את ה-HAL בצורה נכונה) ואת המופע של הגיבוי (כדי לוודא ש-healthd ממשיך לפעול כראוי לפני ההסרה).

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

כדאי לעיין בדרישות לגבי מידע על הסוללה.