Health 2.1'i uygulama

Android 11'de tüm healthd kodu libhealthloop ve libhealth2impl olarak yeniden düzenlenir, ardından health@2.1 HAL'yi uygulamak için değiştirilir. Bu iki kitaplık, Health 2.1'in geçiş uygulaması olan health@2.0-impl-2.1 ile statik olarak bağlanır. Statik olarak bağlanmış kitaplıklar, health@2.0-impl-2.1'nın healthd ile aynı işi yapmasını sağlar. Örneğin, healthd_mainloop çalıştırma ve yoklama. init işlevinde health@2.1-service, IHealth arayüzünün bir uygulamasını hwservicemanager'ye kaydeder. Android 8.x veya 9 satıcı görüntüsü ve Android 11 çerçevesi içeren cihazlar yükseltilirken satıcı görüntüsü health@2.1 hizmetini sağlamayabilir. Eski tedarikçi resimleriyle geriye dönük uyumluluk, desteği sonlandırma planı ile zorunlu kılınır.

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

  1. healthd, sistem arka plan programı olmasına rağmen hwservicemanager için IHealth kaydeder. IHealth, "backup" örnek adıyla sistem manifestine eklenir.
  2. Çerçeve ve storaged, binder yerine hwbinder üzerinden healthd ile iletişim kurar.
  3. Çerçeve ve storaged için kod, varsa "varsayılan", ardından "yedek" örneğini getirecek ş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 desteği sonlandırıldıktan sonra IHealth/backup ve healthd desteği sonlandırılabilir.

healthd için karta özel derleme değişkenleri

BOARD_PERIODIC_CHORES_INTERVAL_*, healthd oluşturmak için kullanılan, kartlara özgü değişkenlerdir. Sistem/satıcı derleme ayrımı kapsamında, sistem modülleri için karta özel 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 tedarikçiler, bu iki periyodik görev aralığı değerini healthd_config yapısında, sağlık uygulama sınıfı oluşturucusuna geçirmeden önce geçersiz kılabilir. Health implementation sınıfı, android::hardware::health::V2_1::implementation::Health sınıfından devralınmalıdır.

Health 2.1 hizmetini uygulama

Health 2.1 hizmetini uygulama hakkında bilgi edinmek için hardware/interfaces/health/2.1/README.md dosyasına bakın.

Sağlık müşterileri

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

  • şarj cihazı libbatterymonitor ve healthd_common kodunun kullanımı health@2.0-impl ile sarmalanır.
  • recovery. libbatterymonitor ile bağlantı health@2.0-impl içine alınır. BatteryMonitor ile yapılan tüm aramalar, Health uygulama sınıfına yapılan aramalarla değiştirilir.
  • BatteryManager. BatteryManager.queryProperty(int id), IBatteryPropertiesRegistrar.getProperty şirketinin tek müşterisiydi. IBatteryPropertiesRegistrar.getProperty, healthd tarafından sağlanmış ve doğrudan /sys/class/power_supply okunmuştur.

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

  • BatteryService. Android 9 ve sonraki sürümlerde, BatteryService, vendor'deki varsayılan sağlık hizmeti örneğinin mi yoksa healthd'daki yedek sağlık hizmeti örneğinin mi kullanılacağını belirlemek için HealthServiceWrapper'yi kullanır. BatteryService, IHealth.registerCallback aracılığıyla sağlık etkinliklerini dinler.

  • Storaged. Android 9 ve sonraki sürümlerde, storaged, vendor'deki varsayılan sağlık hizmeti örneğinin mi yoksa healthd'daki yedek sağlık hizmeti örneğinin mi kullanılacağını belirlemek için libhealthhalutils'yi kullanır. storaged ardından IHealth.registerCallback aracılığıyla sağlık etkinliklerini 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 öğesini file_contexts listesine ekler.

Kendi uygulaması olan cihazlarda, 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 daemon'ı ve varsayılan uygulama, pil bilgilerini almak için aşağıdaki çekirdek arayüzlerine android.hardware.health@2.0-impl-2.1 erişir:

  • /sys/class/power_supply/*/capacity_level (Health 2.1'de 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 (Health 2.1'de 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 (Health 2.1'de eklendi)
  • /sys/class/power_supply/*/type
  • /sys/class/power_supply/*/voltage_max
  • /sys/class/power_supply/*/voltage_now

libbatterymonitor kullanan cihaza özel tüm sağlık HAL uygulamaları, sağlık uygulama sınıfı oluşturucusunda 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 (ör. dosya, yanlış yapılandırılmış SELinux politikası nedeniyle erişimi reddeden, tedarikçiye özel bir klasöre yönelik sembolik bağlantıysa) erişilemiyorsa doğru şekilde çalışmayabilir. Bu nedenle, varsayılan uygulama kullanılsa bile satıcıya özel ek SELinux değişiklikleri gerekebilir.

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

Test

Android 11, özellikle health@2.1 HAL için yazılmış yeni VTS testleri içerir. Bir cihaz, cihaz manifestinde health@2.1 HAL'yi bildiriyorsa ilgili VTS testlerini geçmelidir. Testler hem varsayılan örnek (cihazın HAL'yi doğru şekilde uyguladığından emin olmak için) hem de yedek örnek (healthd kaldırılmadan önce doğru şekilde çalışmaya devam ettiğinden emin olmak için) için yazılır.

Pil bilgilerine ilişkin şartlar

Health 2.0 HAL, HAL arayüzüyle ilgili bir dizi şart belirtir ancak ilgili VTS testleri, bu şartların uygulanması konusunda nispeten esnektir. Android 11'de, Android 11 ve sonraki sürümlerle kullanıma sunulan cihazlarda aşağıdaki şartların uygulanması için yeni VTS testleri eklenmiştir:

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

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

  • Pil 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, pile gelen akımı gösterir.
    • Değerler mikroamper (μA) cinsinden olmalıdır.
  • Pil voltajının mikrovolt (μV) cinsinden raporlandığından emin olun. Bu kapsamda aşağıdaki sysfs düğümleri yer alır:
    • /sys/class/power_supply/*/voltage_max
    • /sys/class/power_supply/*/voltage_now
    • Varsayılan HAL uygulamasının voltage_now değerini 1.000'e böldüğünü ve değerleri milivolt (mV) cinsinden bildirdiğini unutmayın. @1.0::HealthInfo sayfasına bakın.

Ayrıntılı bilgi için Linux güç kaynağı sınıfı başlıklı makaleyi inceleyin.