ConfigStore HAL

No Android 10, o ConfigStore HAL usa sinalizadores de compilação para armazenar valores de configuração na partição vendor , e um serviço na partição system acessa esses valores usando HIDL (isso também é verdade no Android 9). No entanto, devido ao alto consumo de memória e ao uso difícil, o ConfigStore HAL foi descontinuado.

O ConfigStore HAL permanece no AOSP para suportar partições de fornecedores legados. Em dispositivos com Android 10 ou posterior, surfaceflinger lê primeiro as propriedades do sistema; se nenhuma propriedade do sistema for definida para um item de configuração em `SurfaceFlingerProperties.sysprop`, `surfaceflinger` volta para o HAL do ConfigStore.

O Android 8.0 divide o sistema operacional Android monolítico em partições genéricas ( system.img ) e específicas de hardware ( vendor.img e odm.img ). Como resultado desta mudança, a compilação condicional deve ser removida dos módulos instalados na partição do sistema e tais módulos devem determinar a configuração do sistema em tempo de execução (e se comportar de maneira diferente dependendo dessa configuração).

O ConfigStore HAL fornece um conjunto de APIs para acessar itens de configuração somente leitura usados ​​para configurar a estrutura Android. Esta página descreve o design do ConfigStore HAL (e por que as propriedades do sistema não foram usadas para essa finalidade); outras páginas nesta seção detalham a interface HAL , a implementação do serviço e o uso do lado do cliente , todas usando surfaceflinger como exemplo. Para obter ajuda com classes de interface do ConfigStore, consulte Adicionando classes e itens de interface .

Por que não usar as propriedades do sistema?

Consideramos o uso de propriedades do sistema, mas encontramos vários problemas fundamentais, incluindo:

  • Limites de comprimento em valores. As propriedades do sistema têm limites rígidos no comprimento de seus valores (92 bytes). Além disso, como esses limites foram expostos diretamente aos aplicativos Android como macros C, aumentar o comprimento pode causar problemas de compatibilidade com versões anteriores.
  • Nenhum suporte de tipo. Todos os valores são essencialmente strings, e as APIs simplesmente analisam a string em um int ou bool . Outros tipos de dados compostos (por exemplo, array e struct) devem ser codificados/decodificados pelos clientes (por exemplo, "aaa,bbb,ccc" pode ser codificado como uma matriz de três strings).
  • Substitui. Como as propriedades do sistema somente leitura são implementadas como propriedades de gravação única, os fornecedores/ODMs que desejam substituir os valores somente leitura definidos pelo AOSP devem importar seus próprios valores somente leitura antes dos valores somente leitura definidos pelo AOSP. Isso, por sua vez, resulta na substituição de valores regraváveis ​​definidos pelo fornecedor por valores definidos pelo AOSP.
  • Aborde os requisitos de espaço. As propriedades do sistema ocupam uma quantidade relativamente grande de espaço de endereço em cada processo. As propriedades do sistema são agrupadas em unidades prop_area com um tamanho fixo de 128 KB, todas alocadas para um espaço de endereço do processo, mesmo que apenas uma única propriedade do sistema esteja sendo acessada. Isto pode causar problemas em dispositivos de 32 bits onde o espaço de endereço é precioso.

Tentamos superar essas limitações sem sacrificar a compatibilidade, mas continuamos preocupados com o fato de as propriedades do sistema não terem sido projetadas para oferecer suporte ao acesso a itens de configuração somente leitura. Por fim, decidimos que as propriedades do sistema são mais adequadas para compartilhar alguns itens atualizados dinamicamente em todo o Android em tempo real e que existia a necessidade de um novo sistema dedicado ao acesso a itens de configuração somente leitura.

Projeto HAL do ConfigStore

O design básico é simples:

Projeto HAL do Configstore

Figura 1. Projeto HAL do ConfigStore

  • Descreva os sinalizadores de construção (atualmente usados ​​para compilar condicionalmente a estrutura) em HIDL.
  • Fornecedores e OEMs fornecem SoC e valores específicos do dispositivo para sinalizadores de construção implementando o serviço HAL.
  • Modifique a estrutura para usar o serviço HAL para localizar o valor de um item de configuração em tempo de execução.

Os itens de configuração atualmente referenciados pela estrutura estão incluídos em um pacote HIDL versionado ( android.hardware.configstore@1.0 ). Fornecedores/OEMs fornecem valores para os itens de configuração implementando interfaces neste pacote, e a estrutura usa as interfaces quando precisa obter um valor para um item de configuração.

Considerações de segurança

Os sinalizadores de construção definidos na mesma interface são afetados pela mesma política SELinux. Se um ou mais sinalizadores de construção tiverem políticas SELinux diferentes, eles deverão ser separados para outra interface . Isso pode exigir uma revisão importante do android.hardware.configstore package , pois as interfaces separadas não são mais compatíveis com versões anteriores.