Health 2.0'ı uygulama

Tüm healthd kodu, health@2.0-impl ve libhealthservice olarak yeniden yapılandırıldı, ardından health@2.0 HAL'i uygulamak için değiştirildi. Bu iki kitaplık, health@2.0-service tarafından statik olarak bağlanır. Bu sayede, daha önce healthd tarafından yapılan işi (yani healthd_mainloop'ü çalıştırma ve anket yapma) yapabilir. Başlatma aşamasında, Health@2.0-hizmeti, IHealth arayüzünün uygulamasını hwservicemanager ürününe kaydeder. Android 8.x tedarikçi firma resmi ve Android 9 çerçevesi yüklü cihazlar yükseltilirken health@2.0 hizmeti tedarikçi firma resmi tarafından sağlanmayabilir. Bu, kullanımdan kaldırma programı ile uygulanır.

Bu sorunu çözmek için:

  1. healthd, IHealth öğesini hwservicemanager konumuna kaydeder (sistem arka plan programı olmasına rağmen). IHealth, sistem manifest dosyasına "backup" örnek adıyla birlikte eklendi.
  2. Framework ve storaged, binder yerine hwbinder üzerinden healthd ile iletişim kurar.
  3. Çerçeve ve storaged için kod, mevcutsa "default" örneğini, yoksa "backup" örneğini getirmek üzere değiştirilir.
    • C++ istemci kodu, libhealthhalutils içinde tanımlanan mantığı kullanır.
    • Java istemci kodu, HealthServiceWrapper içinde tanımlanan mantığı kullanır.
  4. IHealth/varsayılan yaygın olarak kullanıma sunulduktan ve Android 8.1 satıcı resimleri desteği sonlandırıldıktan sonra IHealth/yedekleme ve healthd desteği de sonlandırılabilir. Daha fazla bilgi için Deprecating health@1.0 bölümüne bakın.

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

BOARD_PERIODIC_CHORES_INTERVAL_*, healthd oluşturmak için kullanılan panoya özgü değişkenlerdir. Sistem/tedarikçi firma derleme bölmesinin bir parçası olarak, sistem modülleri için panoya özel değerler tanımlanamaz. health@2.0'da tedarikçiler, healthd_mode_ops->init'teki bu iki değeri geçersiz kılabilir (health@2.0-service.<device>'de libhealthservice bağımlılığını bırakarak ve bu işlevi yeniden uygulayarak).

Statik uygulama kitaplığı

Diğer HAL uygulama kitaplıklarının aksine, health@2.0-impl uygulama kitaplığı, health@2.0-service, charger, recovery ve eski healthd'nin bağlandığı statik bir kitaplıktır.

Health@2.0.impl, yukarıda açıklandığı gibi IHealth öğesini uygular ve uygulamanın libbatterymonitor ve libhealthd.BOARD çevresinde kullanılması amaçlanmıştır. health@2.0-impl kullanıcıları BatteryMonitor veya libhealthd'daki işlevleri doğrudan kullanmamalıdır. Bunun yerine bu çağrılar, IHealth arayüzünün bir uygulaması olan Health sınıfına yapılan çağrılarla değiştirilmelidir. Daha genel bir ifadeyle, healthd_common kodu health@2.0-impl'e de dahildir. Yeni healthd_common, health@2.0-service, charger ve healthd arasındaki ortak kodun geri kalanını içerir ve BatteryMonitor yerine IHealth yöntemlerini çağırır.

Health 2.0 hizmetini uygulama

Bir cihaz için health@2.0 hizmetini uygularken varsayılan uygulama şu şekildeyse:

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

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

Ardından:

  • Panoya özelse libhealthd:

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

    • tanımlanmışsa cihaza özel bir HealthServiceCommon.cpp oluşturun (hardware/interfaces/health/2.0/utils/libhealthservice'dan kopyalanır) ve healthd_mode_service_2_0_init'de özelleştirin.
    • Tanımlanmamışsa libhealthservice ile statik olarak bağlantı verin.
  • Cihaz:

    • getStorageInfo ve getDiskStats API'lerini uygulamalı, uygulamayı get_storage_info ve get_disk_stats işlevlerinde sağlamalıdır.
    • Bu API'leri uygulamamalı, libstoragehealthdefaultbağlantısını statik olarak oluşturmalıdır.
  • Gerekli SELinux izinlerini güncelleyin.

  • Kurtarma görüntüsüne geçiş uygulaması yükleyerek HAL'i kurtarma işlemine 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>
    

Ayrıntılar için donanım/arayüzler/sağlık/2.0/BENİOKU.md sayfasına bakın.

Sağlık alanındaki müşteriler

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

SELinux değişiklikleri

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

  • health@2.0-service öğesini file_contexts alanına ekler.
  • system_server ve storaged'nin hal_health kullanmasına izin verir.
  • system_server (BatteryService) adlı uygulamanın batteryproperties_service (IBatteryPropertiesRegistrar) kaydetmesine izin verir.
  • healthd uygulamasının, hal_health öğesini sağlamasına izin verir.
  • system_server ve storaged'nin, bağlayıcı üzerinden healthd'ye arama yapmasına izin veren kuralları kaldırır.
  • healthd'in batteryproperties_service'u kaydettirmesine izin veren kuralları kaldırır (IBatteryPropertiesRegistrar).

Kendi uygulamalarını kullanan cihazlarda bazı tedarikçi SELinux değişiklikleri gerekebilir. Ö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, health@2.0 HAL için özel olarak yazılmış yeni VTS testleri içerir. Bir cihaz, cihaz manifest dosyasında health@2.0 HAL'i sağladığını beyan ediyorsa ilgili VTS testlerini geçmelidir. Testler hem varsayılan örnek (cihazın HAL'i doğru şekilde uyguladığından emin olmak için) hem de yedek örnek (healthd'ın kaldırılmadan önce düzgün şekilde çalışmaya devam etmesini sağlamak için) için yazılır.

Pil bilgileriyle ilgili şartlar

Pil bilgileriyle ilgili şartlar başlıklı makaleyi inceleyin.