Sağlık 2.1'in Uygulanması

Android 11'de, tüm healthd kodları libhealthloop ve libhealth2impl olarak yeniden düzenlendi ve ardından health@2.1 HAL'yi uygulamak için değiştirildi. Bu iki kitaplık, sağlık 2.1'in geçiş uygulaması olan health@2.0-impl-2.1 ile statik olarak bağlantılıdır. Statik olarak bağlantılı kütüphaneler, health@2.0-impl-2.1 healthd_mainloop çalıştırma ve yoklama gibi healthd ile aynı işi yapmasını sağlar. Başlangıçta, health@2.1-service , IHealth arayüzünün bir uygulamasını hwservicemanager kaydeder. Cihazları Android 8.x veya 9 satıcı görüntüsüne ve Android 11 çerçevesine yükseltirken satıcı görüntüsü health@2.1 hizmetini sağlamayabilir. Eski satıcı görselleriyle geriye dönük uyumluluk, kullanımdan kaldırma planı tarafından zorunlu kılınmaktadır.

Geriye dönük uyumluluğu sağlamak için:

  1. healthd bir sistem arka plan programı olmasına rağmen IHealth hwservicemanager kaydeder. IHealth , sistem bildirimine "backup" örnek adıyla 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 . Bu değerler, kullanımdan kaldırılan healthd_board_init işlevinde geçersiz kılınıyordu.

health@2.1'de satıcılar, sağlık uygulama sınıfı yapıcısına geçmeden önce healthd_config yapısındaki bu iki periyodik görev aralığı değerini geçersiz kılabilir. Sistem durumu uygulama sınıfı android::hardware::health::V2_1::implementation::Health miras almalıdır.

Sağlık 2.1 hizmetinin uygulanması

Sağlık 2.1 hizmetinin uygulanmasına ilişkin bilgi için donanım/arayüzler/health/2.1/README.md adresine bakın.

Sağlık müşterileri

health@2.x aşağıdaki istemcilere sahiptir:

  • şarj cihazı . libbatterymonitor ve healthd_common kodunun kullanımı health@2.0-impl içinde yer almaktadır.
  • iyileşmek . libbatterymonitor bağlantısı health@2.0-impl dosyasına sarılmıştır. BatteryMonitor yapılan tüm çağrılar, Health uygulama sınıfına yapılan çağrılarla değiştirilir.
  • Pil Yöneticisi . BatteryManager.queryProperty(int id) IBatteryPropertiesRegistrar.getProperty tek istemcisiydi. IBatteryPropertiesRegistrar.getProperty , healthd tarafından sağlandı ve doğrudan /sys/class/power_supply okudu.

    Güvenlik nedeniyle uygulamaların sağlık HAL'sini doğrudan aramasına izin verilmez. Android 9 ve üzeri sürümlerde, IBatteryPropertiesRegistrar bağlayıcı hizmeti healthd yerine BatteryService tarafından sağlanır. BatteryService istenen bilgileri almak için çağrıyı sağlık HAL'sine devreder.

  • Pil Servisi . Android 9 ve üzeri sürümlerde, BatteryService vendor varsayılan sistem durumu hizmeti örneğinin mi yoksa healthd yedek sistem durumu hizmeti örneğinin mi kullanılacağını belirlemek için HealthServiceWrapper kullanır. BatteryService daha sonra IHealth.registerCallback aracılığıyla sistem durumu olaylarını dinler.

  • Depolandı . Android 9 ve üzeri sürümlerde, storaged , vendor varsayılan sistem durumu hizmeti örneğinin mi yoksa healthd yedek sistem durumu hizmeti örneğinin mi kullanılacağını belirlemek için libhealthhalutils kullanır. storaged , ardından IHealth.registerCallback aracılığıyla sistem durumu olaylarını dinler ve depolama bilgilerini alır.

SELinux değişiklikleri

health@2.1 HAL, platformda aşağıdaki SELinux değişikliklerini içerir:

  • android.hardware.health@2.1-service dosyasını file_contexts dosyasına ekler.

Kendi uygulamasına sahip cihazlar için bazı satıcı SELinux değişiklikleri gerekli olabilir. Örnek:

# 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

healthd arka plan programı ve varsayılan uygulama android.hardware.health@2.0-impl-2.1 pil bilgilerini almak için aşağıdaki çekirdek arayüzlerine erişir:

  • /sys/class/power_supply/*/capacity_level (sağlık 2.1'e eklendi)
  • /sys/class/power_supply/*/capacity
  • /sys/class/power_supply/*/charge_counter
  • /sys/class/power_supply/*/charge_full
  • /sys/class/power_supply/*/charge_full_design (sağlık 2.1'e eklendi)
  • /sys/class/power_supply/*/current_avg
  • /sys/class/power_supply/*/current_max
  • /sys/class/power_supply/*/current_now
  • /sys/class/power_supply/*/cycle_count
  • /sys/class/power_supply/*/health
  • /sys/class/power_supply/*/online
  • /sys/class/power_supply/*/present
  • /sys/class/power_supply/*/status
  • /sys/class/power_supply/*/technology
  • /sys/class/power_supply/*/temp
  • /sys/class/power_supply/*/time_to_full_now (sağlık 2.1'e eklendi)
  • /sys/class/power_supply/*/type
  • /sys/class/power_supply/*/voltage_max
  • /sys/class/power_supply/*/voltage_now

libbatterymonitor kullanan herhangi bir cihaza özgü sistem durumu HAL uygulaması, sistem durumu uygulama sınıfı yapıcısında geçersiz kılınmadığı sürece bu çekirdek arayüzlerine varsayılan olarak erişir.

Bu dosyalar eksikse veya healthd ya da varsayılan hizmetten erişilemiyorsa (örn. dosya, yanlış yapılandırılmış SELinux ilkesi nedeniyle erişimi reddeden satıcıya özel bir klasöre giden bir sembolik bağlantıysa), düzgün çalışmayabilirler. Bu nedenle, varsayılan uygulama kullanılsa bile satıcıya özel ek SELinux değişiklikleri gerekli olabilir.

Health 2.1'de kullanılan /sys/class/power_supply/*/capacity_level ve /sys/class/power_supply/*/time_to_full_now gibi bazı çekirdek arayüzleri isteğe bağlı olabilir. Ancak eksik çekirdek arayüzlerinden kaynaklanan yanlış çerçeve davranışlarını önlemek için sağlık HAL 2.1 hizmetini oluşturmadan önce CL 1398913'ün isteğe göre seçilmesi önerilir.

Test yapmak

Android 11, health@2.1 HAL için özel olarak yazılmış yeni VTS testlerini içerir. Bir cihazın, cihaz bildiriminde sağlık@2.1 HAL olduğunu 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

Sağlık 2.0 HAL, HAL arayüzünde bir dizi gereksinim belirtir, ancak ilgili VTS testleri bunların uygulanması konusunda nispeten esnektir. Android 11'de, Android 11 ve sonraki sürümlerle başlatılan cihazlarda aşağıdaki gereksinimleri zorunlu kılmak için yeni VTS testleri eklenmiştir:

  • Anlık ve ortalama akü akımı birimleri mikroamper (μA) olmalıdır.
  • Anlık ve ortalama akü akımının işareti doğru olmalıdır. Özellikle:
    • akım == 0, pil durumu UNKNOWN olduğunda
    • pil durumu CHARGING olduğunda akım > 0
    • pil durumu NOT_CHARGING olduğunda akım <= 0
    • pil durumu DISCHARGING olduğunda akım < 0
    • Pil durumu FULL olduğunda uygulanmaz
  • Pil durumu, bir güç kaynağının bağlı olup olmamasına göre doğru olmalıdır. Özellikle:
    • pil durumu, yalnızca bir güç kaynağı bağlıysa CHARGING , NOT_CHARGING veya FULL olmalıdır;
    • pil durumu yalnızca bir güç kaynağının bağlantısı kesildiğinde DISCHARGING olmalıdır.

Uygulamanızda libbatterymonitor kullanıyorsanız ve çekirdek arayüzlerinden değerler aktarıyorsanız sysfs düğümlerinin doğru değerleri bildirdiğinden emin olun:

  • Akü akımının doğru işaret ve birimlerle bildirildiğinden emin olun. Bu, aşağıdaki sysfs düğümlerini içerir:
    • /sys/class/power_supply/*/current_avg
    • /sys/class/power_supply/*/current_max
    • /sys/class/power_supply/*/current_now
    • Pozitif değerler aküye gelen akımı gösterir.
    • Değerler mikroamper (μA) cinsinden olmalıdır.
  • Akü voltajının mikrovolt (μV) cinsinden bildirildiğinden emin olun. Bu, aşağıdaki sysfs düğümlerini içerir:
    • /sys/class/power_supply/*/voltage_max
    • /sys/class/power_supply/*/voltage_now
    • Varsayılan HAL uygulamasının, voltage_now 1000'e böldüğünü ve değerleri milivolt (mV) cinsinden bildirdiğini unutmayın. Bkz. @1.0::HealthInfo .

Ayrıntılar için Linux güç kaynağı sınıfına bakın.