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:
healthd
, sistem hizmet programı olmasına rağmenIHealth
'yihwservicemanager
'ye kaydeder.IHealth
, "yedek" örnek adıyla sistem manifest dosyasına eklenir.- Çerçeve ve
storaged
,binder
yerinehwbinder
üzerindenhealthd
ile iletişim kurar. - Ç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.
- C++ istemci kodu,
- 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
vehealthd_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ı hizmetihealthd
yerineBatteryService
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 yoksahealthd
üzerinden yedek durum hizmeti örneğinin mi kullanılacağını belirlemek içinHealthServiceWrapper
değerini kullanır.BatteryService
daha sonraIHealth.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 yoksahealthd
'deki yedek sağlık hizmeti örneğinin mi kullanılacağını belirlemek içinlibhealthhalutils
'ü kullanır.storaged
daha sonraIHealth.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
öğesineandroid.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
- 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
veyaFULL
olmalıdır; - yalnızca güç kaynağı bağlantısı kesilirse pil durumu
DISCHARGING
olmalıdır.
- Pil durumu, yalnızca güç kaynağı bağlıysa
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.