Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

HAL disponibles dinámicamente

Android 9 admite el apagado dinámico de los subsistemas de hardware de Android cuando no están en uso o no se necesitan. Por ejemplo, cuando un usuario no está usando Wi-Fi, los subsistemas de Wi-Fi no deberían consumir memoria, energía u otros recursos del sistema. En versiones anteriores de Android, los HAL / controladores se mantenían abiertos en los dispositivos Android durante todo el tiempo que se iniciaba un teléfono Android.

La implementación del apagado dinámico implica conectar los flujos de datos y ejecutar procesos dinámicos como se detalla en las siguientes secciones.

Cambios en las definiciones de HAL

El apagado dinámico requiere información sobre qué procesos sirven a qué interfaces HAL (esta información también puede ser útil más adelante en otros contextos), así como no iniciar procesos en el inicio y no reiniciarlos (hasta que se soliciten nuevamente) cuando salen.

# some init.rc script associated with the HAL
service vendor.some-service-name /vendor/bin/hw/some-binary-service
    # init language extension, provides information of what service is served
    # if multiple interfaces are served, they can be specified one on each line
    interface android.hardware.light@2.0::ILight default
    # restarted if hwservicemanager dies
    # would also cause the hal to start early during boot if disabled wasn't set
    class hal
    # will not be restarted if it exits until it is requested to be restarted
    oneshot
    # will only be started when requested
    disabled
    # ... other properties

Cambios en init y hwservicemanager

Dinámica de apagado también requiere que el hwservicemanager a contar init para iniciar los servicios solicitados. En Android 9, init incluye tres mensajes de control adicionales (por ejemplo ctl.start ): ctl.interface_start , ctl.interface_stop , y ctl.interface_restart . Estos mensajes pueden ser usados para señalar init para subir y bajar las interfaces de hardware específicos. Cuando se solicita un servicio y no se ha registrado, hwservicemanager pide que se ha iniciado el servicio. Sin embargo, los HAL dinámicos no requieren el uso de ninguno de estos.

Determinando la salida de HAL

En Android 9, la salida de HAL debe determinarse manualmente. Para Android 10 y superior, también se puede determinar con ciclos de vida automáticas .

El apagado dinámico requiere varias políticas para decidir cuándo iniciar una HAL y cuándo apagar una HAL. Si un HAL decide salir por cualquier motivo, automáticamente se reiniciará cuando se necesita de nuevo utilizando la información proporcionada en la definición HAL y la infraestructura proporcionada por los cambios en init y hwservicemanager . Esto podría involucrar un par de estrategias diferentes, que incluyen:

  • Un HAL podría optar por llamar a exit en sí mismo si alguien llama a una API de cierre o similar. Este comportamiento debe especificarse en la interfaz HAL correspondiente.
  • Los HAL pueden apagarse cuando se completa su tarea (documentado en el archivo HAL).

Ciclos de vida automáticos

Android 10 añade más apoyo para el núcleo y hwservicemanager , que permite a HAL para apagar automáticamente siempre que no tienen clientes. Para utilizar esta función, hacer todos los pasos en cambios a las definiciones de HAL , así como:

  • Registrar el servicio en C ++ con LazyServiceRegistrar en lugar de la función miembro, registerAsService , por ejemplo:
    // only one instance of LazyServiceRegistrar per process
    LazyServiceRegistrar registrar;
    registrar.registerAsService(myHidlService /* , "default" */);
  • Compruebe que el cliente HAL mantiene una referencia a la HAL de nivel superior (la interfaz certificada con hwservicemanager ) sólo cuando está en uso. Para evitar retrasos si esta referencia se deja caer sobre un hilo hwbinder que continúa ejecutando, el cliente también debe llamar IPCThreadState::self()->flushCommands() después de dejar la referencia para asegurar que el conductor ligante es notificado de la cuenta de referencia asociada cambios.