En Android 11, todo el código healthd
se refactoriza en
libhealthloop
y libhealth2impl
, luego, modificados para implementar health@2.1
HAL. Estas dos bibliotecas están vinculadas estáticamente por health@2.0-impl-2.1
,
la implementación de transferencia de Health 2.1. Las bibliotecas vinculadas estáticamente
Permite que health@2.0-impl-2.1
realice el mismo trabajo que healthd
, como ejecutar
healthd_mainloop
y sondeos. En init, health@2.1-service
registra un
implementación de la interfaz IHealth
en hwservicemanager
. Al realizar la actualización
con Android 8.x o 9
del proveedor y un framework de Android 11,
es posible que la imagen del proveedor no proporcione el servicio health@2.1. Hacia atrás
la compatibilidad con las imágenes de proveedores anteriores se implementa
cronograma de baja.
Para garantizar la retrocompatibilidad:
healthd
registraIHealth
enhwservicemanager
a pesar de ser un sistema daemon. Se agregaIHealth
al manifiesto del sistema, con el nombre de la instancia. “copia de seguridad”.- El framework y
storaged
se comunican conhealthd
a través dehwbinder
en lugar debinder
. - Se cambia el código del framework y
storaged
para recuperar la instancia “predeterminado” si está disponible, selecciona “copia de seguridad”.- El código del cliente C++ usa la lógica definida en
libhealthhalutils
. - El código de cliente de Java usa la lógica definida en
HealthServiceWrapper
.
- El código del cliente C++ usa la lógica definida en
- Después de que IHealth/default esté ampliamente disponible y las imágenes de proveedores de Android 8.1 se
IHealth/backup, y
healthd
pueden quedar obsoletos. Para ver más más detallados, consulta health@1.0 dejó de estar disponible.
Variables de compilación específicas de la placa para Healthd
BOARD_PERIODIC_CHORES_INTERVAL_*
son variables específicas de la placa que se usan para compilar
healthd
Como parte de la división de compilación entre sistemas y proveedores, los valores específicos del tablero
no se puede definir para los módulos del sistema. Estos valores solían anularse
en la función obsoleta healthd_board_init
.
En health@2.1, los proveedores pueden anular
estos dos tareas periódicas: valores de intervalo en el struct healthd_config
antes
y lo pasa al constructor de la clase de implementación de Health. La salud
de implementación de la clase de implementación
android::hardware::health::V2_1::implementation::Health
Implementa el servicio Health 2.1
Para obtener información sobre la implementación del servicio Health 2.1, consulta hardware/interfaces/health/2.1/README.md:
Clientes de atención médica
health@2.x tiene los siguientes clientes:
- cargador. El uso de los códigos
libbatterymonitor
yhealthd_common
es envuelto enhealth@2.0-impl
. - recuperación. La vinculación con
libbatterymonitor
está unidahealth@2.0-impl
Todas las llamadas aBatteryMonitor
se reemplazan por llamadas a la clase de implementación deHealth
. BatteryManager.
BatteryManager.queryProperty(int id)
fue el único cliente deIBatteryPropertiesRegistrar.getProperty
.IBatteryPropertiesRegistrar.getProperty
fue proporcionada porhealthd
y leyeron directamente/sys/class/power_supply
.Como consideración de seguridad, las apps no pueden llamar a la HAL de estado. directamente. En Android 9 y versiones posteriores, Binder el servicio
IBatteryPropertiesRegistrar
es proporcionado porBatteryService
en lugar dehealthd
.BatteryService
delega la llamada a la HAL de estado. para recuperar la información solicitada.BateríaService. En Android 9 y versiones posteriores,
BatteryService
usaHealthServiceWrapper
para determinar si debe usar la Instancia de servicio de salud default devendor
o para usar la copia de seguridad de servicio de salud dehealthd
.BatteryService
luego escucha eventos de salud medianteIHealth.registerCallback
.Almacenado. En Android 9 y versiones posteriores,
storaged
usalibhealthhalutils
para determinar si debe usar la Instancia de servicio de salud default devendor
o para usar la copia de seguridad de servicio de salud dehealthd
.storaged
, luego, escucha eventos de salud medianteIHealth.registerCallback
y recupera la información de almacenamiento.
Cambios de SELinux
La HAL de health@2.1 incluye los siguientes cambios de SELinux en la plataforma:
- Se agregó
android.hardware.health@2.1-service
afile_contexts
.
En el caso de los dispositivos con su propia implementación, es posible que se apliquen algunos cambios de SELinux de los proveedores. necesario. Ejemplo:
# 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.
Interfaces de kernel
El daemon healthd
y la implementación predeterminada
android.hardware.health@2.0-impl-2.1
accede a las siguientes interfaces del kernel para
recuperar la información sobre la batería:
/sys/class/power_supply/*/capacity_level
(agregado en Salud 2.1)/sys/class/power_supply/*/capacity
/sys/class/power_supply/*/charge_counter
/sys/class/power_supply/*/charge_full
/sys/class/power_supply/*/charge_full_design
(agregado en Salud 2.1)/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
(agregado en Salud 2.1)/sys/class/power_supply/*/type
/sys/class/power_supply/*/voltage_max
/sys/class/power_supply/*/voltage_now
Cualquier implementación de HAL de estado específica del dispositivo que use libbatterymonitor
accede a estas interfaces del kernel de forma predeterminada, a menos que se anule en el estado
de clase de implementación.
Si faltan estos archivos o no se puede acceder a ellos desde healthd
o desde la
servicio predeterminado (por ejemplo, el archivo es un symlink a una carpeta específica del proveedor
que deniega el acceso debido a una política SELinux mal configurada), es posible que no
funcionen correctamente. Por lo tanto, es posible que se apliquen cambios adicionales de SELinux
es necesario, incluso
aunque se use la implementación predeterminada.
Algunas interfaces de kernel que se usan en Health 2.1, como
/sys/class/power_supply/*/capacity_level
y
/sys/class/power_supply/*/time_to_full_now
(puede ser opcional). Sin embargo, para
evitar comportamientos incorrectos del framework debido a la falta de interfaces de kernel
se recomienda cosechar los mejores
CL 1398913
antes de compilar el servicio HAL de Health 2.1.
Prueba
Android 11 incluye nuevos
Pruebas de VTS
escritas específicamente para la HAL de health@2.1. Si un dispositivo declara
Health@2.1 HAL en el manifiesto del dispositivo, esta debe pasar las pruebas de VTS correspondientes.
Las pruebas se escriben tanto para la instancia predeterminada (para garantizar que el dispositivo
implementa la HAL correctamente) y la instancia de copia de seguridad (para garantizar que healthd
siga funcionando correctamente antes de que se quite).
Requisitos de la información sobre la batería
La HAL de Health 2.0 establece un conjunto de requisitos en la interfaz de la HAL, pero la las pruebas de VTS correspondientes son relativamente flexibilizadas respecto de su aplicación. En Android 11, se agregan nuevas pruebas de VTS para aplicar las los siguientes requisitos para los dispositivos que se lanzan con Android 11 y versiones posteriores:
- Las unidades de corriente instantánea y promedio de la batería deben ser microamperios (μA).
- El signo de corriente instantánea y promedio de la batería debe ser correcto.
Más precisamente, sucederá lo siguiente:
- Current == 0 cuando el estado de la batería es
UNKNOWN
- actual > 0 cuando el estado de la batería es
CHARGING
- actual <= 0 cuando el estado de la batería es
NOT_CHARGING
- actual < 0 cuando el estado de la batería es
DISCHARGING
- No se aplica de manera forzosa cuando el estado de la batería es
FULL
- Current == 0 cuando el estado de la batería es
- El estado de la batería debe ser correcto respecto de si la fuente de alimentación
conectado. Más precisamente, sucederá lo siguiente:
- el estado de la batería debe ser
CHARGING
,NOT_CHARGING
oFULL
si y solo si hay una fuente de alimentación conectada. - el estado de la batería debe ser
DISCHARGING
siempre y cuando la fuente de alimentación sea desconectado.
- el estado de la batería debe ser
Si usas libbatterymonitor
en tu implementación y pasas valores
desde las interfaces del kernel, asegúrate de que los nodos sysfs informen valores correctos:
- Asegúrate de que la corriente de la batería se indique con el signo y las unidades correctos. Esta
incluye los siguientes nodos sysfs:
/sys/class/power_supply/*/current_avg
/sys/class/power_supply/*/current_max
/sys/class/power_supply/*/current_now
- Los valores positivos indican corriente entrante a la batería.
- Los valores deben estar en microamperios (μA).
- Asegúrate de que el voltaje de la batería se informe en microvoltios (μV). Esto incluye las
Los siguientes nodos sysfs:
/sys/class/power_supply/*/voltage_max
/sys/class/power_supply/*/voltage_now
- Ten en cuenta que la implementación predeterminada de HAL divide
voltage_now
por 1,000. e informa los valores en milivoltios (mV). Consulta @1.0::HealthInfo.
Para obtener más información, consulta Clase de fuente de alimentación de Linux: