Almacén de configuración HAL

En Android 10, ConfigStore HAL usa indicadores de compilación para almacenar valores de configuración en la partición vendor , y un servicio en la partición del system accede a esos valores usando HIDL (esto también es cierto en Android 9). Sin embargo, debido al alto consumo de memoria y al uso difícil, ConfigStore HAL ha quedado obsoleto.

ConfigStore HAL permanece en AOSP para admitir particiones de proveedores heredadas. En dispositivos con Android 10 o posterior, surfaceflinger lee primero las propiedades del sistema; Si no se define ninguna propiedad del sistema para un elemento de configuración en `SurfaceFlingerProperties.sysprop`, `surfaceflinger` recurre a ConfigStore HAL.

Android 8.0 divide el sistema operativo Android monolítico en particiones genéricas ( system.img ) y específicas del hardware ( vendor.img y odm.img ). Como resultado de este cambio, se debe eliminar la compilación condicional de los módulos instalados en la partición del sistema y dichos módulos deben determinar la configuración del sistema en tiempo de ejecución (y comportarse de manera diferente según esa configuración).

ConfigStore HAL proporciona un conjunto de API para acceder a elementos de configuración de solo lectura utilizados para configurar el marco de Android. Esta página describe el diseño de ConfigStore HAL (y por qué no se utilizaron las propiedades del sistema para este propósito); Otras páginas de esta sección detallan la interfaz HAL , la implementación del servicio y el uso del lado del cliente , todo ello utilizando surfaceflinger como ejemplo. Para obtener ayuda con las clases de interfaz de ConfigStore, consulte Agregar clases y elementos de interfaz .

¿Por qué no utilizar las propiedades del sistema?

Consideramos el uso de propiedades del sistema, pero encontramos varios problemas fundamentales, entre ellos:

  • Límites de longitud de los valores. Las propiedades del sistema tienen límites estrictos en la longitud de sus valores (92 bytes). Además, como estos límites han sido expuestos directamente a las aplicaciones de Android como macros C, aumentar la longitud puede causar problemas de compatibilidad con versiones anteriores.
  • Sin soporte de tipo. Todos los valores son esencialmente cadenas y las API simplemente analizan la cadena en un int o bool . Los clientes deben codificar/decodificar otros tipos de datos compuestos (por ejemplo, matriz y estructura) (por ejemplo, "aaa,bbb,ccc" se puede codificar como una matriz de tres cadenas).
  • Sobrescribe. Debido a que las propiedades del sistema de solo lectura se implementan como propiedades de una sola escritura, los proveedores/ODM que deseen anular los valores de solo lectura definidos por AOSP deben importar sus propios valores de solo lectura antes de los valores de solo lectura definidos por AOSP. Esto, a su vez, da como resultado que los valores reescribibles definidos por el proveedor sean anulados por valores definidos por AOSP.
  • Requerimientos de espacio para direcciones. Las propiedades del sistema ocupan una cantidad relativamente grande de espacio de direcciones en cada proceso. Las propiedades del sistema se agrupan en unidades prop_area con un tamaño fijo de 128 KB, todo lo cual se asigna a un espacio de direcciones de proceso incluso si solo se accede a una única propiedad del sistema. Esto puede causar problemas en dispositivos de 32 bits donde el espacio de direcciones es valioso.

Intentamos superar estas limitaciones sin sacrificar la compatibilidad, pero seguíamos preocupados de que las propiedades del sistema no estuvieran diseñadas para admitir el acceso a elementos de configuración de solo lectura. Finalmente, decidimos que las propiedades del sistema son más adecuadas para compartir algunos elementos actualizados dinámicamente en todo Android en tiempo real, y que existía la necesidad de un nuevo sistema dedicado a acceder a elementos de configuración de solo lectura.

Diseño HAL de ConfigStore

El diseño básico es simple:

Diseño HAL del almacén de configuración

Figura 1. Diseño HAL de ConfigStore

  • Describir los indicadores de compilación (utilizados actualmente para compilar condicionalmente el marco) en HIDL.
  • Los proveedores y OEM proporcionan valores específicos de dispositivos y SoC para indicadores de compilación mediante la implementación del servicio HAL.
  • Modifique el marco para utilizar el servicio HAL para encontrar el valor de un elemento de configuración en tiempo de ejecución.

Los elementos de configuración a los que actualmente hace referencia el marco se incluyen en un paquete HIDL versionado ( android.hardware.configstore@1.0 ). Los proveedores/OEM proporcionan valores a los elementos de configuración mediante la implementación de interfaces en este paquete, y el marco utiliza las interfaces cuando necesita obtener un valor para un elemento de configuración.

Consideraciones de Seguridad

Los indicadores de compilación definidos en la misma interfaz se ven afectados por la misma política de SELinux. Si uno o más indicadores de compilación deben tener políticas SELinux diferentes, se deben separar en otra interfaz . Esto puede requerir una revisión importante del android.hardware.configstore package ya que las interfaces separadas ya no son compatibles con versiones anteriores.