Sağlık 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şi yapmasını sağlar (ör. healthd_mainloop'yi çalıştırma ve anket yapma). Başlangıçta health@2.1-service, hwservicemanager öğesine IHealth arayüzünün 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ı ile zorunlu kılınmıştı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/varsayılan yaygın olarak kullanıma sunulduktan ve Android 8.1 satıcı resimleri desteği sonlandırıldıktan sonra IHealth/yedekleme 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ıyordu.

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.
  • kurtarma. 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'sini araması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.

  • Pil Hizmeti. Android 9 ve sonraki sürümlerde BatteryService, vendor ürününden varsayılan durum hizmeti örneğinin mi yoksa healthd üzerinden yedek durum hizmeti örneğinin mi kullanılacağını belirlemek için HealthServiceWrapper değerini 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. storaged daha sonra 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:

  • file_contexts öğesine android.hardware.health@2.1-service 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'e 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 olarak beyan ediliyorsa 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ğı bağlantısı kesilirse 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 giren akımı gösterir.
    • Değerler mikroamper (μA) cinsinden olmalıdır.
  • Pil voltajının mikrovolt (μV) olarak belirtildiğinden 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 1.000'e böldüğünü ve değerleri milisaniye (mV) cinsinden bildirdiğini unutmayın. @1.0::HealthInfo bölümüne bakın.

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