Health 2.0'ı uygulama

.

Tüm healthd kodları, Health@2.0-impl ve libhealthservice, daha sonrahealth@2.0 HAL'yi uygulamak üzere değiştirildi. Bu ikisi kitaplıklar, Health@2.0-service tarafından statik olarak bağlanarak daha önce healthd tarafından yapılan iştir (yani, healthd_mainloop komutunu çalıştırın ve yoklama) saptar. Init özelliğinde, Health@2.0-hizmeti, IHealth ile hwservicemanager arayüzü arasında. Cihazları yeni sürüme geçirirken Android 8.x tedarikçi görüntüsü ve Android 9 çerçevesi, Health@2.0 hizmeti, tedarikçi firma görüntüsü tarafından sağlanmıyor olabilir. Zorunlu kılınır tarafından kullanımdan kaldırma programı hakkında daha fazla bilgi edinin.

Bu sorunu çözmek için:

  1. healthd, IHealth adresini hwservicemanager örneğine kaydediyor (sistem olmasına rağmen) arka plan programı) ekleyebilirsiniz. IHealth, örnek adıyla birlikte sistem manifestine eklendi "backup".
  2. Çerçeve ve storaged, hwbinder üzerinden healthd ile iletişim kurar (binder yerine)
  3. Çerçevenin kodu ve storaged, örneği getirmek için değiştirildi Varsa "default", ardından "backup".
    • C++ istemci kodu, libhealthhalutils bölümünde tanımlanan mantığı kullanır.
    • Java istemci kodu, HealthServiceWrapper bölümünde tanımlanan mantığı kullanır.
  4. IHealth/default'tan sonra yaygın olarak kullanıma sunulduğundan ve Android 8.1 tedarikçi görüntüleri IHealth/backup ve healthd desteği sonlandırılabilir. Daha fazla kullanımdan kaldırma@1.0 bölümüne bakın.

Durumlu kullanımlar için panoya özel derleme değişkenleri

BOARD_PERIODIC_CHORES_INTERVAL_*, reklam öğesi oluşturmak için kullanılan panoya özel değişkenlerdir healthd. Sistem/tedarikçi firma derleme bölmesinin bir parçası olarak panoya özel değerler sistem modülleri için tanımlanamaz. Health@2.0'da tedarikçiler bu iki değer healthd_mode_ops->init içinde (libhealthservice health@2.0-service.<device> bağımlılığı ve bu işlevin yeniden uygulanması).

Statik uygulama kitaplığı

Diğer HAL uygulama kitaplıklarının aksine, sağlık@2.0-impl, sağlık@2.0-service, şarj cihazının, kurtarma ve eski durum bağlantısı.

Health@2.0.impl, yukarıda açıklandığı gibi IHealth öğesini uygular ve sarmalama amaçlıdır. yaklaşık libbatterymonitor ve libhealthd.BOARD civarında. Bu Health@2.0-impl kullanıcıları, BatteryMonitor veya Doğrudan libhealthd; bu çağrıların yerine, IHealth arayüzünün bir uygulaması olan Health sınıfı. Genelleştirmek için Ayrıca, Health@2.0-impl'e healthd_common kodu da dahildir. Yeni healthd_common, saglik@2.0-hizmeti ve şarj cihazı ve healthd ile BatteryMonitor yerine IHealth yöntemlerine çağrı.

Health 2.0 hizmetini uygulayın

Bir cihaz için Health@2.0 hizmetini kullanırken varsayılan uygulama şununla eşleşir:

  • Cihaz için yeterli, android.hardware.health@2.0-service kullanın doğrudan ekleyebilirsiniz.
  • Cihaz için yeterli değil. android.hardware.health@2.0-service.(device) yürütülebilir ve şunları içerir:

    #include <health2/service.h>
    int main() { return health_service_main(); }
    

Ardından:

  • Panoya özgü ise libhealthd:

    • Varsa ona bağlantı verin.
    • Mevcut değil, healthd_board_init için boş uygulamalar sağlayın ve healthd_board_battery_update işlev.
  • Panele özel BOARD_PERIODIC_CHORES_INTERVAL_* değişkenleri:

    • Tanımlanmışsa cihaza özel bir HealthServiceCommon.cpp (kopyalanmış) oluşturun kalkış: hardware/interfaces/health/2.0/utils/libhealthservice) ve healthd_mode_service_2_0_init içinde özelleştirebilirsiniz.
    • Tanımlanmamış, libhealthservice hizmetine statik olarak bağlantı oluşturun.
  • Cihaz:

    • getStorageInfo ve getDiskStats API'lerini uygulamalı, get_storage_info ve get_disk_stats işlevlerinde uygulama.
    • Bu API'ler uygulanmamalıdır, libstoragehealthdefault ile bağlantı oluşturun statik olarak.
  • Gerekli SELinux izinlerini güncelleyin.

  • kurtarma görüntüsü Örnek:

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

Ayrıntılı bilgi için donanım/arayüzler/sağlık/2.0/BENİOKU.md.

Sağlık hizmeti müşterileri

Health 2.1 HAL için sağlık istemcileri başlıklı makaleyi inceleyin.

SELinux değişiklikleri

Yeni Health@2.0 HAL, aşağıdaki SELinux değişikliklerini içerir:

  • file_contexts hesabına sağlık@2.0-hizmeti ekler.
  • system_server ve storaged uygulamalarının hal_health kullanmasına izin verir.
  • system_server (BatteryService) adlı kullanıcının kaydolmasına izin verir batteryproperties_service (IBatteryPropertiesRegistrar).
  • healthd uygulamasının, hal_health öğesini sağlamasına izin verir.
  • system_server ve storaged adlı kullanıcıların şuraya telefon etmesine izin veren kuralları kaldırır: healthd.
  • healthd uygulamasının batteryproperties_service dosyasını kaydetmesine izin veren kuralları kaldırır (IBatteryPropertiesRegistrar).

Kendi uygulaması olan cihazlarda, tedarikçinin bazı SELinux değişiklikleri gerekir. Örnek:

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

Çekirdek arayüzleri

Health 2.1 HAL için çekirdek arayüzleri başlıklı makaleyi inceleyin.

Test

Android 9'a yeni VTS testleri dahildir sağlık@2.0 HAL için özel olarak yazılmıştır. Bir cihaz Health@2.0 HAL olarak değiştirirseniz ilgili VTS testlerini geçmelidir. Hem varsayılan örnek için testler yazılır (cihazın HAL'yi doğru şekilde uyguladığından) ve yedek örneği (healthd kaldırılmadan önce doğru şekilde çalışmaya devam eder).

Pil bilgisiyle ilgili gereksinimler

Pil bilgisi gereksinimleri bölümüne bakın.