Sağlık 2.0'ı Uygulamak

Tüm healthd kodları, health@2.0-impl ve libhealthservice olarak yeniden düzenlendi ve ardından health@2.0 HAL'i uygulayacak şekilde değiştirildi. Bu iki kütüphane, health@2.0-service ile statik olarak bağlantılı olup, 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). Başlangıçta, health@2.0-service, IHealth arayüzünün bir uygulamasını hwservicemanager kaydeder. Android 8.x satıcı görüntüsüne ve Android 9 çerçevesine sahip cihazları yükseltirken, satıcı görüntüsü tarafından health@2.0 hizmeti sağlanamayabilir. Bu, kullanımdan kaldırma planı tarafından uygulanır.

Bu sorunu çözmek için:

  1. healthd , IHealth hwservicemanager kaydeder (bir sistem arka plan programı olmasına rağmen). IHealth , "backup" örnek adıyla sistem bildirimine eklenir.
  2. Çerçeve ve storaged healthd ile binder yerine hwbinder aracılığıyla iletişim kurar.
  3. Çerçeve ve storaged kodu, varsa "varsayılan" örneği ve ardından "yedekleme" örneğini getirecek şekilde değiştirilir.
    • C++ istemci kodu libhealthhalutils tanımlanan mantığı kullanır.
    • Java istemci kodu HealthServiceWrapper tanımlanan mantığı kullanır.
  4. IHealth/default yaygın olarak kullanılabilir hale geldikten ve Android 8.1 satıcı görselleri kullanımdan kaldırıldıktan sonra, IHealth/backup ve healthd kullanımdan kaldırılabilir. Daha fazla ayrıntı için bkz . health@1.0'ın kullanımdan kaldırılması .

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ı yapısı ayrımının bir parçası olarak, sistem modülleri için karta özgü değerler tanımlanamaz . health@2.0'da, satıcılar healthd_mode_ops->init 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 kütüphanesi

Diğer HAL uygulama kitaplıklarının aksine, health@2.0-impl uygulama kitaplığı, health@2.0-service, şarj cihazı, kurtarma ve eski healthd bağlantısının yapıldığı statik bir kitaplıktır.

health@2.0.impl, yukarıda açıklandığı gibi IHealth uygular ve libbatterymonitor ve libhealthd. BOARD . Health@2.0-impl'in bu kullanıcıları BatteryMonitor veya libhealthd işlevleri doğrudan kullanmamalıdır; bunun yerine bu çağrıların, IHealth arayüzünün bir uygulaması olan Health sınıfına yapılan çağrılarla değiştirilmesi gerekir. Daha da genelleştirmek gerekirse, health@2.0-impl'de healthd_common kodu da bulunmaktadır. Yeni healthd_common health@2.0-service, Charger 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 hizmetinin uygulanması

Bir cihaz için health@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(); }
    

Daha sonra:

  • Kurula özel libhealthd:

    • Var mı, 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 varsa:

    • Tanımlandıktan sonra cihaza özel bir HealthServiceCommon.cpp oluşturun ( hardware/interfaces/health/2.0/utils/libhealthservice adresinden kopyalanmıştır) ve bunu healthd_mode_service_2_0_init içinde özelleştirin.
    • Tanımlanmadı, libhealthservice statik olarak bağlantı verin.
  • Eğer cihaz:

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

  • Kurtarma görüntüsüne bir geçiş uygulaması yükleyerek kurtarmada HAL'yi 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 hardware/interfaces/health/2.0/README.md adresine bakın.

Sağlık müşterileri

Bkz. Sağlık için Sağlık müşterileri 2.1 HAL .

SELinux değişiklikleri

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

  • file_contexts health@2.0-service'i ekler.
  • system_server ve storaged hal_health kullanmasına izin verir.
  • system_server ( BatteryService ) batteryproperties_service ( IBatteryPropertiesRegistrar ) kaydetmesine izin verir.
  • healthd hal_health sağlamasını sağlar.
  • system_server / storaged binder aracılığıyla healthd çağrı yapmasına izin veren kuralları kaldırır.
  • healthd batteryproperties_service ( IBatteryPropertiesRegistrar ) kaydetmesine izin veren kuralları kaldırır.

Kendi uygulaması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

Sistem durumu 2.1 HAL için Çekirdek arayüzlerine bakın.

Test yapmak

Android 9, health@2.0 HAL için özel olarak yazılmış yeni VTS testlerini içerir. Bir cihazın, cihaz bildiriminde health@2.0 HAL sağladığını beyan etmesi durumunda ilgili VTS testlerini geçmesi gerekir. Testler hem varsayılan örnek (cihazın HAL'yi doğru şekilde uyguladığından emin olmak için) hem de yedekleme örneği ( healthd kaldırılmadan önce doğru şekilde çalışmaya devam etmesini sağlamak için) için yazılır.

Pil bilgisi gereksinimleri

Bkz. Pil bilgisi gereksinimleri .