Health 2.0 लागू करें

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

healthd के सभी कोड को Health@2.0-impl में बदल दिया गया है और libhealthservice को लागू किया गया था. इसके बाद, Health@2.0 HAL को लागू करने के लिए इसमें बदलाव किया गया. ये दोनों लाइब्रेरी को Health@2.0-service की मदद से स्टैटिक रूप से लिंक किया जाता है. इससे यह healthd के ज़रिए पहले किए गए काम (यानी, healthd_mainloop चलाकर यह करें पोलिंग). init में, Health@2.0-service, IHealth से hwservicemanager इंटरफ़ेस तक. इसकी मदद से, डिवाइसों को अपग्रेड करते समय Android 8.x वेंडर इमेज और Android 9 फ़्रेमवर्क, Health@2.0 सेवा, वेंडर इमेज से शायद उपलब्ध न हो. यह लागू किया गया है के अनुसार रोकने का शेड्यूल.

इस गड़बड़ी को ठीक करने के लिए:

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

अच्छी सेहत के लिए बोर्ड के हिसाब से बिल्ड वैरिएबल

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

स्टैटिक लागू करने की लाइब्रेरी

एचएएल लागू करने की दूसरी लाइब्रेरी के उलट, इंप्लिमेंटेशन लाइब्रेरी 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 तरीकों का इस्तेमाल करके कॉल करता है.

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 से लिंक करें.
  • अगर डिवाइस:

    • getStorageInfo और getDiskStats एपीआई लागू करना चाहिए, तो get_storage_info और get_disk_stats फ़ंक्शन में लागू किया गया है.
    • इस एपीआई को लागू नहीं करना चाहिए. libstoragehealthdefault से लिंक करें स्टैटिक तरीके से.
  • SELinux की ज़रूरी अनुमतियां अपडेट करें.

  • रिकवरी की प्रक्रिया में एचएएल को लागू करें. इसके लिए, रिकवरी इमेज. उदाहरण:

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

स्वास्थ्य से जुड़े क्लाइंट

Health 2.1 HAL के लिए हेल्थ क्लाइंट देखें.

SELinux बदलाव

नए Health@2.0 HAL में 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.

Kernel इंटरफ़ेस

Health 2.1 HAL के लिए Kernel इंटरफ़ेस देखें.

टेस्ट करना

Android 9 में नए वीटीएस टेस्ट शामिल हैं को खास तौर पर Health@2.0 HAL के लिए लिखा जाता है. अगर डिवाइस यह एलान करता है कि Health@2.0 HAL के साथ काम करता है, तो इसे इससे जुड़े वीटीएस टेस्ट को पास करना होगा. दोनों डिफ़ॉल्ट इंस्टेंस के लिए जांच लिखी जाती हैं (यह पक्का करने के लिए कि डिवाइस HAL और बैकअप इंस्टेंस को सही तरीके से लागू करता है (यह पक्का करने के लिए कि healthd हटाने से पहले, ठीक से काम करता रहता है).

बैटरी की जानकारी से जुड़ी ज़रूरी शर्तें

बैटरी की जानकारी से जुड़ी ज़रूरी शर्तें देखें.