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 kütüphane, Health 2.1'in doğrudan 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:
-
healthd
bir sistem arka plan programı olmasına rağmenIHealth
hwservicemanager
kaydeder.IHealth
sistem bildirimine "backup" örnek adıyla eklenir. - Çerçeve ve
storaged
healthd
ilebinder
yerinehwbinder
aracılığıyla iletişim kurar. - Ç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.
- C++ istemci kodu
- 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
öğesinden miras almalıdır.
Sağlık 2.1 hizmetini uygulayın
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
vehealthd_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ı hizmetihealthd
yerineBatteryService
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 yoksahealthd
yedek sistem durumu hizmeti örneğinin mi kullanılacağını belirlemek içinHealthServiceWrapper
kullanır.BatteryService
daha sonraIHealth.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 yoksahealthd
yedek sistem durumu hizmeti örneğinin mi kullanılacağını belirlemek içinlibhealthhalutils
kullanır.storaged
daha sonraIHealth.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
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
veya varsayılan hizmetten erişilemiyorsa (örneğin, dosya, yanlış yapılandırılmış SELinux ilkesi nedeniyle erişimi reddeden satıcıya özel bir klasöre giden bir sembolik bağlantıdır), 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 hatalı ç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
- akım == 0, pil durumu
- 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
veyaFULL
olmalıdır; - pil durumu yalnızca bir güç kaynağının bağlantısı kesildiğinde
DISCHARGING
olmalıdır.
- pil durumu, yalnızca bir güç kaynağı bağlıysa
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.