הטמעת Health 2.0

כל הקוד של 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 framework, יכול להיות שהשירות health@2.0 לא יסופק על ידי קובץ האימג' של הספק. לוח הזמנים להוצאה משימוש אוכף את המדיניות הזו.

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

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

משתני build ספציפיים ללוח ל-healthd

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,‏ charger,‏ recovery ו-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, Charger ו-healthd, והשיחות לשיטות IHealth במקום אל BudgetMonitor.

הטמעת שירות 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 בתהליך השחזור על ידי התקנת הטמעה של העברה ללא שינוי בקובץ האימג' של השחזור. דוגמה:

    // 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 ל-Health 2.1 HAL

שינויים ב-SELinux

ה-HAL החדש של health@2.0 כולל את השינויים הבאים ב-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.

ממשקי ליבה

ממשקי ליבה ל-HAL של Health 2.1

בדיקה

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

דרישות לגבי פרטי הסוללה

הדרישות לגבי פרטי הסוללה