Tüm healthd
kodları, health@2.0-impl ve libhealthservice
olarak yeniden düzenlendi ve ardından health@2.0 HAL'i uygulayacak şekilde değiştirildi. Bu iki kütüphane, health@2.0-service ile statik olarak bağlantılı olup, daha önce healthd
tarafından yapılan işi yapmasına olanak tanır (yani, healthd_mainloop
çalıştırın ve yoklama yapın). Başlangıçta, health@2.0-service, IHealth
arayüzünün bir uygulamasını hwservicemanager
kaydeder. Android 8.x satıcı görüntüsüne ve Android 9 çerçevesine sahip cihazları yükseltirken, satıcı görüntüsü tarafından health@2.0 hizmeti sağlanamayabilir. Bu, kullanımdan kaldırma planı tarafından uygulanır.
Bu sorunu çözmek için:
-
healthd
IHealth
hwservicemanager
kaydeder (bir sistem arka plan programı olmasına rağmen).IHealth
"backup"
örnek adıyla sistem bildirimine eklenir. - Çerçeve ve
storaged
healthd
ilebinder
yerinehwbinder
aracılığıyla iletişim kurar. - Çerçeve ve
storaged
kodu, varsa"default"
örneğini ve ardından"backup"
ö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 . health@2.0'da, satıcılar healthd_mode_ops->init
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 kütüphanesi
Diğer HAL uygulama kitaplıklarının aksine, health@2.0-impl uygulama kitaplığı, health@2.0-service, şarj cihazı, kurtarma ve eski healthd bağlantısının yapıldığı statik bir kitaplıktır.
health@2.0.impl, yukarıda açıklandığı gibi IHealth
uygular ve libbatterymonitor
ve libhealthd. BOARD
. Health@2.0-impl'in bu kullanıcıları, BatteryMonitor
veya libhealthd
işlevleri doğrudan kullanmamalıdır; bunun yerine bu çağrıların, IHealth
arayüzünün bir uygulaması olan Health
sınıfına yapılan çağrılarla değiştirilmesi gerekir. Daha da genelleştirmek gerekirse, health@2.0-impl'de healthd_common
kodu da bulunmaktadır. Yeni healthd_common
health@2.0-service, Charger ve healthd
arasındaki ortak kodun geri kalanını içerir ve BatteryMonitor yerine IHealth yöntemlerine çağrı yapar.
Sağlık 2.0 hizmetini uygulayın
Bir cihaz için health@2.0 hizmetini uygularken, varsayılan uygulama şu şekildeyse:
- Cihaz için yeterli, 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(); }
Daha sonra:
Kurula özel
libhealthd:
- Var mı, 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 varsa:- Tanımlandıktan sonra, cihaza özel bir
HealthServiceCommon.cpp
oluşturun (hardware/interfaces/health/2.0/utils/libhealthservice
adresinden kopyalanmıştır) ve bunuhealthd_mode_service_2_0_init
içinde özelleştirin. - Tanımlanmadı,
libhealthservice
statik olarak bağlantı verin.
- Tanımlandıktan sonra, cihaza özel bir
Eğer cihaz:
-
getStorageInfo
vegetDiskStats
API'lerini uygulamalı,get_storage_info
veget_disk_stats
işlevlerinde uygulamayı sağlamalıdır. - Bu API'leri uygulamamalı,
libstoragehealthdefault
statik olarak bağlanmalıdır.
-
Gerekli SELinux izinlerini güncelleyin.
Kurtarma görüntüsüne bir geçiş uygulaması yükleyerek kurtarmada HAL'yi 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 hardware/interfaces/health/2.0/README.md adresine bakın.
Sağlık müşterileri
Sağlık 2.1 HAL için Sağlık istemcilerine bakın.
SELinux değişiklikleri
Yeni health@2.0 HAL aşağıdaki SELinux değişikliklerini içerir:
-
file_contexts
health@2.0-service'i ekler. -
system_server
vestoraged
hal_health
kullanmasına izin verir. -
system_server
(BatteryService
)batteryproperties_service
(IBatteryPropertiesRegistrar
) kaydetmesine izin verir. -
healthd
hal_health
sağlamasını sağlar. -
system_server
vestoraged
binder aracılığıylahealthd
çağrı yapmasına izin veren kuralları kaldırır. -
healthd
batteryproperties_service
(IBatteryPropertiesRegistrar
) kaydetmesine izin veren kuralları kaldırır.
Kendi uygulamasına sahip cihazlar için bazı satıcı SELinux değişiklikleri gerekli olabilir. Ö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
Sağlık 2.1 HAL için Çekirdek arayüzlerine bakın.
Test yapmak
Android 9, health@2.0 HAL için özel olarak yazılmış yeni VTS testlerini içerir. Bir cihazın, cihaz bildiriminde health@2.0 HAL sağladığını 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
Bkz. Pil bilgisi gereksinimleri .