Health 2.1'i uygulama

Android 11'de tüm healthd kodu libhealthloop ve libhealth2impl olarak yeniden yapılandırılır, ardından health@2.1 HAL'i uygulamak için değiştirilir. Bu iki kitaplık, Health 2.1'in geçişli uygulaması olan health@2.0-impl-2.1 tarafından statik olarak bağlanır. Statik olarak bağlanmış kitaplıklar, health@2.0-impl-2.1'ün healthd ile aynı işlemleri (ör. healthd_mainloop'yi çalıştırma ve anket yapma) yapmasını sağlar. health@2.1-service, init içinde IHealth arayüzünün hwservicemanager'ye bir uygulamasını kaydeder. Android 8.x veya 9 tedarikçi firma resmi ve Android 11 çerçevesi yüklü cihazlar yükseltilirken tedarikçi firma resmi, health@2.1 hizmetini sağlamayabilir. Eski tedarikçi firma resimleriyle geriye dönük uyumluluk, destek sonu programı tarafından zorunlu kılınmaktadır.

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

  1. healthd, sistem hizmet programı olmasına rağmen IHealth'yi hwservicemanager'ye kaydeder. IHealth, "yedek" örnek adıyla sistem manifest dosyasına 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" örneğini, yoksa "yedek" ö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/default yaygın olarak kullanıma sunulduktan ve Android 8.1 satıcı resimleri desteği sonlandırıldıktan sonra IHealth/backup ve healthd desteği de sonlandırılabilir. Daha fazla bilgi için health@1.0 desteğinin sonlandırılması başlıklı makaleyi inceleyin.

healthd için kart özelinde derleme değişkenleri

BOARD_PERIODIC_CHORES_INTERVAL_*, healthd oluşturmak için kullanılan panoya özgü değişkenlerdir. Sistem/tedarikçi derleme bölme işlemi kapsamında, sistem modülleri için kart özel değerleri tanımlanamaz. Bu değerler, kullanımdan kaldırılan healthd_board_init işlevinde geçersiz kılınırdı.

health@2.1 sürümünde tedarikçi firmalar, sağlık uygulama sınıfı kurucusuna geçmeden önce healthd_config yapısındaki bu iki düzenli ev işi aralığı değerini geçersiz kılabilir. Sağlık uygulama 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ını inceleyin.

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

health@2.x aşağıdaki istemcileri içerir:

  • şarj cihazı. libbatterymonitor ve healthd_common kodunun kullanımı health@2.0-impl içine yerleştirilir.
  • recovery. libbatterymonitor bağlantısı health@2.0-impl içine yerleştirilir. BatteryMonitor için yapılan tüm çağrılar, Health uygulama sınıfına yapılan çağrılarla değiştirilir.
  • BatteryManager. BatteryManager.queryProperty(int id), IBatteryPropertiesRegistrar.getProperty'nin tek müşterisiydi. IBatteryPropertiesRegistrar.getProperty, healthd tarafından sağlandı ve doğrudan /sys/class/power_supply tarafından okundu.

    Güvenlik nedeniyle uygulamaların doğrudan sağlık HAL'ini çağırmasına izin verilmez. Android 9 ve sonraki 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'ine devreder.

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

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

Kendi uygulamalarını kullanan cihazlarda bazı tedarikçi SELinux değişiklikleri gerekebilir. Ö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 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'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 (Sağlık 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 (Sağlık 2.1'de eklendi)
  • /sys/class/power_supply/*/type
  • /sys/class/power_supply/*/voltage_max
  • /sys/class/power_supply/*/voltage_now

libbatterymonitor kullanan cihaza özgü tüm sağlık HAL uygulamaları, sağlık uygulaması sınıfı kurucusunda geçersiz kılınmadığı sürece varsayılan olarak bu çekirdek arayüzlerine erişir.

Bu dosyalar eksikse veya healthd'ten ya da varsayılan hizmetten erişilemezse (örneğin, dosya yanlış yapılandırılmış SELinux politikası nedeniyle erişimi reddeden tedarikçiye özgü bir klasörün sembolik bağlantısıysa) düzgün çalışmayabilir. Bu nedenle, varsayılan uygulama kullanılsa bile tedarikçiye özgü 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, çekirdek arayüzlerinin eksik olmasından kaynaklanan yanlış çerçeve davranışlarını önlemek için Health HAL 2.1 hizmetini oluşturmadan önce CL 1398913'ü seçmeniz önerilir.

Test

Android 11, health@2.1 HAL için özel olarak yazılmış yeni VTS testleri içerir. Bir cihaz, cihaz manifest dosyasında health@2.1 HAL'i belirtiyorsa 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

Health 2.0 HAL, HAL arayüzünde bir dizi şart belirtir ancak ilgili VTS testleri, bu şartların uygulanması konusunda nispeten gevşektir. Android 11'de, Android 11 ve sonraki sürümlerin yüklü olduğu cihazlarda aşağıdaki şartların uygulanmasını sağlamak için yeni VTS testleri eklendi:

  • Anlık ve ortalama pil akımının 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 mevcut <= 0
    • Pil durumu DISCHARGING olduğunda akım < 0
    • Pil durumu FULL olduğunda uygulanmaz
  • Pil durumu, güç kaynağının bağlı olup olmadığına göre doğru olmalıdır. Ayrıntılı olarak:
    • Pil durumu, yalnızca güç kaynağı bağlıysa CHARGING, NOT_CHARGING veya FULL olmalıdır;
    • Yalnızca güç kaynağının bağlantısı kesildiğinde pil durumu DISCHARGING olmalıdır.

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

  • Pil akımının doğru işaret ve birimlerle raporlandığından emin olun. Buna aşağıdaki sysfs düğümleri dahildir:
    • /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. Buna aşağıdaki sysfs düğümleri dahildir:
    • /sys/class/power_supply/*/voltage_max
    • /sys/class/power_supply/*/voltage_now
    • Varsayılan HAL uygulamasının voltage_now değerini 1000'e böldüğünü ve değerleri milivolt (mV) cinsinden raporladığını unutmayın. @1.0::HealthInfo konusuna bakın.

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