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

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

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

ממשקי ליבה

ראה ממשקי ליבה עבור בריאות 2.1 HAL .

בדיקה

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

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

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