Sağlık 2.0'ı Uygulamak

Tüm healthd kodlar, health@2.0-impl ve libhealthservice olarak yeniden düzenlendi, ardından Health@2.0 HAL'ı uygulamak için değiştirildi. Bu iki kitaplık statik olarak Health@2.0-service ile bağlantılıdır, bu da daha önce healthd tarafından yapılan işi yapmasına olanak tanır (yani, healthd_mainloop çalıştırın ve yoklama yapın). Init'te, Health@2.0-service, IHealth arabiriminin bir uygulamasını IHealth 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, kullanımdan kaldırma planı tarafından zorunlu kılınır.

Bu sorunu çözmek için:

  1. healthd , IHealth hwservicemanager (bir sistem arka plan programı olmasına rağmen). IHealth , sistem bildirimine "yedekleme" örnek adıyla eklenir.
  2. Çerçeve ve storaged , sağlık ile hwbinder yerine healthd aracılığıyla iletişim binder .
  3. Çerçeve ve storaged kodu, varsa "varsayılan", ardından "yedekleme" örneğini alacak şekilde 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/default yaygın olarak kullanılabilir hale geldikten ve Android 8.1 satıcı resimleri kullanımdan kaldırıldıktan sonra, IHealth/backup ve healthd kullanımdan kaldırılabilir. Daha fazla ayrıntı için, Health@1.0'ı kullanımdan kaldırma konusuna bakın.

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

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

Statik uygulama kitaplığı

Diğer HAL uygulama kitaplıklarından farklı olarak, sağlık@2.0-impl uygulama kitaplığı, sağlık@2.0-hizmet, şarj cihazı, kurtarma ve eski sağlıklı bağlantıya sahip statik bir kitaplıktır.

Health@2.0.impl, IHealth yukarıda açıklandığı gibi uygular ve libbatterymonitor ve libhealthd. BOARD . Bu Health@2.0-impl kullanıcıları, BatteryMonitor veya libhealthd işlevleri doğrudan kullanmamalıdır; bunun yerine, bu çağrılar, IHealth arabiriminin bir uygulaması olan Health sınıfına yapılan çağrılarla değiştirilmelidir. Daha fazla genelleştirmek için, healthd_common kodu da health@2.0-impl'ye dahil edilmiştir. Yeni healthd_common , health@2.0-service, şarj cihazı ve healthd arasındaki ortak kodun geri kalanını içerir ve BatteryMonitor yerine IHealth yöntemlerine çağrı yapar.

Sağlık 2.0 hizmetini uygulama

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

  • Cihaz için yeterli, 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(); }
    

O zamanlar:

  • Panoya özgü libhealthd:

    • Var mı, ona bağlantı verin.
    • Mevcut değil, healthd_board_init ve healthd_board_battery_update işlevleri için boş uygulamalar sağlayın.
  • Panoya özgü BOARD_PERIODIC_CHORES_INTERVAL_* değişkenleri ise:

    • Tanımlanmış, cihaza özel HealthServiceCommon.cpp ( hardware/interfaces/health/2.0/utils/libhealthservice ) oluşturun ve bunu healthd_mode_service_2_0_init içinde özelleştirin.
    • Tanımlı değil, statik olarak libhealthservice bağlantı.
  • Eğer 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ı, statik olarak libstoragehealthdefault .
  • 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();
    }
    
    -yer tutucu3 l10n-yer
    # device.mk
    PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
    

Ayrıntılar için Hardware/interfaces/health/2.0/README.md adresine bakın .

sağlık müşterileri

Sistem durumu 2.1 HAL için Sağlık istemcileri konusuna bakın.

SELinux değişiklikleri

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

  • file_contexts öğesine file_contexts ekler.
  • system_server ve storaged hal_health kullanmasına izin verir.
  • batteryproperties_service ( IBatteryPropertiesRegistrar ) system_server ( BatteryService ) kaydetmesine izin verir.
  • hal_health healthd sağlamasına izin verir.
  • system_server / storaged binder aracılığıyla healthd çağrı yapmasına izin veren kuralları kaldırır.
  • IBatteryPropertiesRegistrar batteryproperties_service ( healthd ) kaydetmesine izin veren kuralları kaldırır.

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

Sağlık 2.1 HAL için Çekirdek arabirimlerine bakın.

Test yapmak

Android 9, özellikle health@2.0 HAL için yazılmış yeni VTS testleri içerir. Bir aygıt, aygıt bildiriminde sağlık@2.0 HAL sağladığını bildirirse, ilgili VTS testlerini geçmelidir. Testler hem varsayılan örnek (aygıtın HAL'ı doğru şekilde uyguladığından emin olmak için) hem de yedek örnek için (sağlıklı'nın kaldırılmadan önce doğru şekilde healthd devam etmesini sağlamak için) yazılır.

Pil bilgisi gereksinimleri

Pil bilgisi gereksinimlerine bakın.