Sağlık 2.0'ı Uygulamak

Tüm healthd kodu health@2.0-impl ve içine elden geçirildi libhealthservice ardından health@2.0 HAL uygulamak güncellenmiştir. Bu iki kütüphane daha önce yaptığı işi yapmak sağlayan health@2.0-service tarafından statik olarak bağlanmış healthd (yani çalıştırmak healthd_mainloop ve kamuoyu yoklaması yapmaya). İnit olarak, health@2.0-service arabirimi uygulaması kaydeder IHealth için hwservicemanager . Bir Android 8.x satıcı görüntüsü ve bir Android 9 çerçevesi olan cihazları yükseltirken, sağlayıcı görüntüsü tarafından Health@2.0 hizmeti sağlanmayabilir. Bu tarafından zorlanır kullanımdan kaldırılması programı .

Bu sorunu çözmek için:

  1. healthd kaydeder IHealth için hwservicemanager (bir sistem cini olmasına rağmen). IHealth örneği adı "yedekleme" ile, sistem beyannamesine eklenir.
  2. Çerçeve ve storaged iletişim healthd yoluyla hwbinder yerine binder .
  3. Çerçeve için kod ve storaged örneği "varsayılan" varsa, o zaman "yedek" almaya değiştirilir.
    • C ++ müşteri kodu tanımlanan mantık kullanır libhealthhalutils .
    • Java istemci kodu tanımlanmış mantığı kullanır HealthServiceWrapper .
  4. İHealth sonra / default yaygın olarak kullanılabilir ve Android 8.1 satıcı görüntüleri kullanımdan kaldırılmıştır, iHealth / yedekleme ve healthd kaldırılmış olabilir. Daha fazla ayrıntı için bkz kaldırıyoruz health@1.0 .

Healthd için panoya özgü yapı değişkenleri

BOARD_PERIODIC_CHORES_INTERVAL_* inşa için kullanılan tahta özgü değişkenlerdir healthd . Sistem / satıcı inşa bölünmüş bir parçası olarak, tahta özgü değerler sistemi modülleri için tanımlanamaz. Health@2.0, satıcılar bu iki değeri geçersiz kılabilir healthd_mode_ops->init (bırakarak libhealthservice içinde bağımlılık health@2.0-service.<device> ve bu işlevi yeniden uygulanması).

Statik uygulama kitaplığı

Diğer HAL uygulama kütüphaneleri aksine, uygulama kütüphanesi health@2.0-impl hangi health@2.0-service, şarj cihazı, kurtarma ve eski healthd bağlantısına statik bir kütüphanedir.

health@2.0.impl uygulayan IHealth , yukarıda tarif edilen ve çevresini sarmak üzere ifade edilir libbatterymonitor ve libhealthd. BOARD . Health@2.0-impl Bu kullanıcılar kullanmamalıdır BatteryMonitor veya işlevlerini libhealthd doğrudan; Bunun yerine, bu aramalar içine çağrıları ile değiştirilmesi gerekir Health sınıfının bir uygulamaya IHealth arayüzüne. Ayrıca genelleme için healthd_common kodu da health@2.0-impl dahildir. Yeni healthd_common health@2.0-service, şarj cihazı ve arasındaki ortak kod kalanını içeren healthd yerine BatteryMonitor ait iHealth yöntemlerine içine ve çağrılar.

Sağlık 2.0 hizmetini uygulama

Bir cihaz için sağlık@2.0 hizmetini uygularken varsayılan uygulama şuysa:

  • Cihaz için yeterli, kullanımı android.hardware.health@2.0-service doğrudan.
  • Cihaz için yeterli değildir oluşturmak android.hardware.health@2.0-service.(device) çalıştırılabilir ve aşağıdakileri içerir:

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

Sonra:

  • Tahta özgü Eğer libhealthd:

    • Var mı, ona bağlantı verin.
    • , Mevcut boş uygulamaları sağlamaz healthd_board_init ve healthd_board_battery_update fonksiyonlar.
  • Tahta özgü Eğer BOARD_PERIODIC_CHORES_INTERVAL_* değişkenler:

    • Tanımlanır, cihaza özgü oluşturmak HealthServiceCommon.cpp (kopyalanan hardware/interfaces/health/2.0/utils/libhealthservice ) ve bunu özelleştirmek healthd_mode_service_2_0_init .
    • Tanımlanmamış, bağlantı libhealthservice statik.
  • Eğer cihaz:

    • Uygulamalıdır getStorageInfo ve getDiskStats API'ler, içinde uygulanmasını sağlamak get_storage_info ve get_disk_stats fonksiyonları.
    • Bu API'ler uygulamak gerekmez, bağlantı veren libstoragehealthdefault statik.
  • Gerekli SELinux izinlerini güncelleyin.

  • Kurtarma görüntüsüne bir geçiş uygulaması yükleyerek kurtarma işleminde HAL uygulayın. Ö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>
    

Detaylar için bakınız donanım / arayüzleri / sağlık / 2.0 / README.md .

Sağlık müşterileri

Bkz sağlığı 2.1 HAL Sağlık istemcileri .

SELinux değişiklikleri

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

  • Health@2.0-service ekler file_contexts .
  • Verir system_server ve storaged kullanımı hal_health .
  • Verir system_server ( BatteryService ) kayıt batteryproperties_service ( IBatteryPropertiesRegistrar ).
  • Verir healthd sağlamak hal_health .
  • İzin kaldırır kurallar system_server / storaged içine çağırmak için healthd bağlayıcı aracılığıyla.
  • İzin kaldırır kurallar healthd kayıt batteryproperties_service ( IBatteryPropertiesRegistrar ).

Kendi uygulamalarına sahip cihazlar için, bazı satıcı SELinux değişiklikleri gerekli olabilir. Ö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

Bkz sağlığı 2.1 HAL için çekirdek arayüzleri .

Test yapmak

Android 9 yeni içerir VTS testleri health@2.0 HAL için özel olarak yazılmış. Bir aygıt, aygıt bildiriminde sağlık@2.0 HAL sağladığını bildirirse, ilgili VTS testlerini geçmelidir. Testler her iki varsayılan örneği için yazılır ve yedekleme örneği (sağlamak için (cihaz uygular doğru HAL sağlamak için) healthd o kaldırılmadan önce doğru işlevine devam eder).

Pil bilgisi gereksinimleri

Bkz Pil bilgileri gerekliliklerini .