Tüm healthd
kodu, health@2.0-impl ve libhealthservice
olarak yeniden yapılandırıldı, ardından health@2.0 HAL'i uygulamak için değiştirildi. Bu iki kitaplık, health@2.0-service tarafından statik olarak bağlanır. Bu sayede, daha önce healthd
tarafından yapılan işi (yani healthd_mainloop
'ü çalıştırma ve anket yapma) yapabilir. Başlatma aşamasında, Health@2.0-hizmeti, IHealth
arayüzünün uygulamasını hwservicemanager
ürününe kaydeder. Android 8.x tedarikçi firma resmi ve Android 9 çerçevesi yüklü cihazlar yükseltilirken health@2.0 hizmeti tedarikçi firma resmi tarafından sağlanmayabilir. Bu, kullanımdan kaldırma programı ile uygulanır.
Bu sorunu çözmek için:
healthd
,IHealth
öğesinihwservicemanager
konumuna kaydeder (sistem arka plan programı olmasına rağmen).IHealth
, sistem manifest dosyasına"backup"
örnek adıyla birlikte eklendi.- Framework ve
storaged
,binder
yerinehwbinder
üzerindenhealthd
ile iletişim kurar. - Çerçeve ve
storaged
için kod, mevcutsa"default"
örneğini, yoksa"backup"
ö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 Deprecating health@1.0 bölümüne bakın.
Durumlu kullanımlar için panoya özel derleme değişkenleri
BOARD_PERIODIC_CHORES_INTERVAL_*
, healthd
oluşturmak için kullanılan panoya özgü değişkenlerdir. Sistem/tedarikçi firma derleme bölmesinin bir parçası olarak, sistem modülleri için panoya özel değerler tanımlanamaz. health@2.0'da tedarikçiler, healthd_mode_ops->init
'teki bu iki değeri geçersiz kılabilir (health@2.0-service.<device>
'de libhealthservice
bağımlılığını bırakarak ve bu işlevi yeniden uygulayarak).
Statik uygulama kitaplığı
Diğer HAL uygulama kitaplıklarının aksine, health@2.0-impl uygulama kitaplığı, health@2.0-service, charger, recovery ve eski healthd'nin bağlandığı statik bir kitaplıktır.
Health@2.0.impl, yukarıda açıklandığı gibi IHealth
öğesini uygular ve uygulamanın libbatterymonitor
ve libhealthd.BOARD
çevresinde kullanılması amaçlanmıştır. health@2.0-impl kullanıcıları BatteryMonitor
veya libhealthd
'daki işlevleri doğrudan kullanmamalıdır. Bunun yerine bu çağrılar, IHealth
arayüzünün bir uygulaması olan Health
sınıfına yapılan çağrılarla değiştirilmelidir. Daha genel bir ifadeyle, healthd_common
kodu health@2.0-impl'e de dahildir. Yeni healthd_common
, health@2.0-service, charger ve healthd
arasındaki ortak kodun geri kalanını içerir ve BatteryMonitor yerine IHealth yöntemlerini çağırır.
Health 2.0 hizmetini uygulama
Bir cihaz için health@2.0 hizmetini uygularken varsayılan uygulama şu şekildeyse:
- Cihaz için yeterlidir, doğrudan
android.hardware.health@2.0-service
kullanın. Cihaz için yeterli değil.
android.hardware.health@2.0-service.(device)
yürütülebilir dosyasını oluşturun ve şunları ekleyin:#include <health2/service.h> int main() { return health_service_main(); }
Ardından:
Panoya özelse
libhealthd:
- Varsa ona bağlantı verin.
- Mevcut değilse
healthd_board_init
vehealthd_board_battery_update
işlevleri için boş uygulamalar sağlayın.
Panele özel
BOARD_PERIODIC_CHORES_INTERVAL_*
değişkenleri:- tanımlanmışsa cihaza özel bir
HealthServiceCommon.cpp
oluşturun (hardware/interfaces/health/2.0/utils/libhealthservice
'dan kopyalanır) vehealthd_mode_service_2_0_init
'de özelleştirin. - Tanımlanmamışsa
libhealthservice
ile statik olarak bağlantı verin.
- tanımlanmışsa cihaza özel bir
Cihaz:
getStorageInfo
vegetDiskStats
API'lerini uygulamalı, uygulamayıget_storage_info
veget_disk_stats
işlevlerinde sağlamalıdır.- Bu API'leri uygulamamalı,
libstoragehealthdefault
bağlantısını statik olarak oluşturmalıdır.
Gerekli SELinux izinlerini güncelleyin.
Kurtarma görüntüsüne geçiş uygulaması yükleyerek HAL'i kurtarma işlemine uygulayın. Örnek:
// Android.bp cc_library_shared { name: "android.hardware.health@2.0-impl-<device>", recovery_available: true, relative_install_path: "hw", static_libs: [ "android.hardware.health@2.0-impl", "libhealthd.<device>" // Include the following or implement device-specific storage APIs "libhealthstoragedefault", ], srcs: [ "HealthImpl.cpp", ], overrides: [ "android.hardware.health@2.0-impl-default", ], }
// HealthImpl.cpp #include <health2/Health.h> #include <healthd/healthd.h> using android::hardware::health::V2_0::IHealth; using android::hardware::health::V2_0::implementation::Health; extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) { const static std::string providedInstance{"default"}; if (providedInstance != name) return nullptr; return Health::initInstance(&gHealthdConfig).get(); }
# device.mk PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
Ayrıntılar için donanım/arayüzler/sağlık/2.0/BENİOKU.md sayfasına bakın.
Sağlık alanındaki müşteriler
Health 2.1 HAL için Health istemcileri başlıklı makaleyi inceleyin.
SELinux değişiklikleri
Yeni Health@2.0 HAL, aşağıdaki SELinux değişikliklerini içerir:
- health@2.0-service öğesini
file_contexts
alanına ekler. system_server
vestoraged
'ninhal_health
kullanmasına izin verir.system_server
(BatteryService
) adlı uygulamanınbatteryproperties_service
(IBatteryPropertiesRegistrar
) kaydetmesine izin verir.healthd
uygulamasının,hal_health
öğesini sağlamasına izin verir.system_server
vestoraged
'nin, bağlayıcı üzerindenhealthd
'ye arama yapmasına izin veren kuralları kaldırır.healthd
'inbatteryproperties_service
'u kaydettirmesine izin veren kuralları kaldırır (IBatteryPropertiesRegistrar
).
Kendi uygulamalarını kullanan cihazlarda bazı tedarikçi SELinux değişiklikleri gerekebilir. Örnek:
# device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
/vendor/bin/hw/android\.hardware\.health@2\.0-service.<device> u:object_r:hal_health_default_exec:s0
# 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
Health 2.1 HAL için çekirdek arayüzleri başlıklı makaleyi inceleyin.
Test
Android 9, health@2.0 HAL için özel olarak yazılmış yeni VTS testleri içerir. Bir cihaz, cihaz manifest dosyasında health@2.0 HAL'i sağladığını beyan ediyorsa 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
Pil bilgileriyle ilgili şartlar başlıklı makaleyi inceleyin.