O Android 8.0 divide o SO Android monolítico em partições genéricas ( system.img
) e específicas de hardware ( vendor.img
e odm.img
). Como resultado dessa alteração, a compilação condicional deve ser removida dos módulos instalados na partição do sistema e esses 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 do 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 , todos usando o surfaceflinger
como exemplo. Para obter ajuda com as 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 nos 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 tipo de suporte. Todos os valores são essencialmente strings, e as APIs simplesmente analisam a string em um
int
oubool
. 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 um array 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 em valores regraváveis definidos pelo fornecedor sendo substituídos por valores definidos pelo AOSP.
- Requisitos de espaço de endereç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 a um espaço de endereço de processo, mesmo que apenas uma única propriedade do sistema esteja sendo acessada. Isso 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 dar suporte ao acesso a itens de configuração somente leitura. Eventualmente, 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:
Figura 1. Projeto HAL do ConfigStore
- Descreva os sinalizadores de compilação (atualmente usados para compilar condicionalmente a estrutura) em HIDL.
- Fornecedores e OEMs fornecem valores específicos de SoC e de dispositivo para sinalizadores de compilaçã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 com versão ( android.hardware.configstore@1.0
). Os fornecedores/OEMs fornecem valores aos 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 compilação definidos na mesma interface são afetados pela mesma política do SELinux. Se um ou mais sinalizadores de compilação devem ter políticas SELinux diferentes, eles devem 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.