स्वास्थ्य 2.0 लागू करना

सभी healthd कोड को हेल्थ@2.0-इम्प्ल और libhealthservice में दोबारा तैयार किया गया है, फिर हेल्थ@2.0 एचएएल को लागू करने के लिए संशोधित किया गया है। ये दोनों लाइब्रेरी हेल्थ@2.0-सर्विस द्वारा स्थिर रूप से जुड़ी हुई हैं, जो इसे healthd द्वारा पहले किए गए कार्य करने में सक्षम बनाती हैं (यानी healthd_mainloop चलाएं और मतदान करें)। Init में, health@2.0-service इंटरफ़ेस IHealth के कार्यान्वयन को hwservicemanager में पंजीकृत करता है। एंड्रॉइड 8.x विक्रेता छवि और एंड्रॉइड 9 फ्रेमवर्क के साथ उपकरणों को अपग्रेड करते समय, विक्रेता छवि द्वारा हेल्थ@2.0 सेवा प्रदान नहीं की जा सकती है। यह बहिष्करण अनुसूची द्वारा लागू किया गया है।

इस समस्या को हल करने के लिए:

  1. healthd IHealth hwservicemanager में पंजीकृत करता है (सिस्टम डेमॉन होने के बावजूद)। IHealth को सिस्टम मेनिफ़ेस्ट में जोड़ा गया है, उदाहरण के लिए नाम "बैकअप"।
  2. फ़्रेमवर्क और storaged binder के बजाय hwbinder के माध्यम से healthd के साथ संचार करते हैं।
  3. यदि उपलब्ध हो तो "डिफ़ॉल्ट", फिर "बैकअप" उदाहरण लाने के लिए फ्रेमवर्क और storaged के लिए कोड बदल दिए जाते हैं।
    • C++ क्लाइंट कोड libhealthhalutils में परिभाषित तर्क का उपयोग करता है।
    • जावा क्लाइंट कोड HealthServiceWrapper में परिभाषित तर्क का उपयोग करता है।
  4. IHealth/default के व्यापक रूप से उपलब्ध होने और Android 8.1 विक्रेता छवियों के अप्रचलित होने के बाद, IHealth/बैकअप और healthd अप्रचलित किया जा सकता है। अधिक जानकारी के लिए, Deprecating health@1.0 देखें।

स्वास्थ्य के लिए बोर्ड-विशिष्ट बिल्ड वैरिएबल

BOARD_PERIODIC_CHORES_INTERVAL_* बोर्ड-विशिष्ट चर हैं जिनका उपयोग healthd बनाने के लिए किया जाता है। सिस्टम/विक्रेता बिल्ड स्प्लिट के भाग के रूप में, सिस्टम मॉड्यूल के लिए बोर्ड-विशिष्ट मानों को परिभाषित नहीं किया जा सकता है । हेल्थ@2.0 में, विक्रेता इन दो मानों को healthd_mode_ops->init में ओवरराइड कर सकते हैं ( health@2.0-service.<device> में libhealthservice निर्भरता को हटाकर और इस फ़ंक्शन को फिर से कार्यान्वित करके)।

स्थैतिक कार्यान्वयन पुस्तकालय

अन्य एचएएल कार्यान्वयन पुस्तकालयों के विपरीत, कार्यान्वयन पुस्तकालय हेल्थ@2.0-इम्पल एक स्थिर पुस्तकालय है जिससे हेल्थ@2.0-सेवा, चार्जर, रिकवरी और लीगेसी हेल्थ लिंक होता है।

जैसा कि ऊपर वर्णित है, health@2.0.impl IHealth लागू करता है और इसका उद्देश्य libbatterymonitor और libhealthd. BOARD । हेल्थ@2.0-इम्प्ल के इन उपयोगकर्ताओं को सीधे BatteryMonitor या libhealthd में फ़ंक्शन का उपयोग नहीं करना चाहिए; इसके बजाय, इन कॉलों को Health क्लास में कॉल के साथ प्रतिस्थापित किया जाना चाहिए, जो IHealth इंटरफ़ेस का कार्यान्वयन है। आगे सामान्यीकरण के लिए, healthd_common कोड को healthy@2.0-impl में भी शामिल किया गया है। नए healthd_common हेल्थ@2.0-सर्विस, चार्जर और healthd के बीच बाकी सामान्य कोड शामिल हैं और बैटरी मॉनिटर के बजाय आईहेल्थ तरीकों में कॉल करता है।

स्वास्थ्य 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 से लिंक करें।
  • यदि उपकरण:

    • getStorageInfo और getDiskStats API को लागू करना चाहिए, get_storage_info और get_disk_stats फ़ंक्शंस में कार्यान्वयन प्रदान करना चाहिए।
    • उन एपीआई को लागू नहीं करना चाहिए, 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>
    

विवरण के लिए, हार्डवेयर/इंटरफ़ेस/हेल्थ/2.0/README.md देखें।

स्वास्थ्य ग्राहक

स्वास्थ्य 2.1 एचएएल के लिए स्वास्थ्य ग्राहक देखें।

SELinux बदलता है

नए हेल्थ@2.0 एचएएल में निम्नलिखित SELinux परिवर्तन शामिल हैं:

  • file_contexts में health@2.0-service जोड़ता है।
  • 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 एचएएल के लिए कर्नेल इंटरफ़ेस देखें।

परिक्षण

एंड्रॉइड 9 में विशेष रूप से हेल्थ@2.0 एचएएल के लिए लिखे गए नए वीटीएस परीक्षण शामिल हैं। यदि कोई डिवाइस डिवाइस मेनिफेस्ट में हेल्थ@2.0 एचएएल प्रदान करने की घोषणा करता है, तो उसे संबंधित वीटीएस परीक्षण पास करना होगा। परीक्षण डिफ़ॉल्ट इंस्टेंस (यह सुनिश्चित करने के लिए कि डिवाइस एचएएल को सही ढंग से कार्यान्वित करता है) और बैकअप इंस्टेंस (यह सुनिश्चित करने के लिए कि हटाए जाने से पहले healthd सही ढंग से काम करता रहे) दोनों के लिए लिखे गए हैं।

बैटरी सूचना आवश्यकताएँ

बैटरी सूचना आवश्यकताएँ देखें।