Os smartphones têm vários processadores, todos otimizados para o desempenho tarefas diferentes. No entanto, o Android só é executado em um processador: os aplicativos (AP, na sigla em inglês). O AP foi ajustado para oferecer um ótimo desempenho para o screenon. como jogos, mas precisa de muita energia para oferecer suporte a recursos que que exigem aumentos rápidos e frequentes de processamento o tempo todo, mesmo quando a tela está desativado. Processadores menores lidam com essas cargas de trabalho com mais eficiência, para realizar tarefas sem afetar visivelmente a duração da bateria. No entanto, ambientes de software nesses processadores de baixo consumo são mais limitados variam muito, o que dificulta o desenvolvimento multiplataforma.
O ambiente de execução do hub de contexto (CHRE, na sigla em inglês) fornece uma plataforma comum para executar aplicativos em um processador de baixo consumo de energia, e fácil de usar. A CHRE facilita o trabalho dos OEMs de dispositivos e dos provedores parceiros a descarregar o processamento do AP, economizar bateria e melhorar vários áreas da experiência do usuário e permitem uma classe de recursos recursos contextuais, especialmente os que envolvem a aplicação de de machine learning para a detecção ambiente.
Principais conceitos
CHRE é o ambiente de software em que pequenos apps nativos, chamados
nanoapps, são executados em um processador de baixo consumo de energia e interagem com os
por meio da API CHRE comum. Para acelerar a implementação adequada do
APIs CHRE, uma implementação de referência multiplataforma de CHRE está incluída no
AOSP. A implementação de referência inclui código comum e abstrações para o
hardware e software subjacentes por meio de uma série de camadas de abstração da plataforma
(PALs). Os nanoapps estão quase sempre vinculados a um ou mais aplicativos clientes em execução no
Android, que interagem com CHRE e nanoapps por meio de acesso restrito
ContextHubManager
APIs do sistema.
De modo geral, é possível traçar paralelos entre a arquitetura do CHRE e o Android como um todo. No entanto, existem algumas distinções importantes:
- O CHRE permite executar apenas nanoapps desenvolvidos em código nativo (C ou C++); Não há suporte para Java.
- Devido a restrições de recursos e limitações de segurança, o CHRE não está aberto para uso por apps Android arbitrários de terceiros. Somente apps confiáveis pelo sistema podem para acessá-lo.
Há também uma diferença importante a ser feita entre o conceito de CHRE e um hub de sensor. Embora seja comum usar o mesmo hardware para implementar a hub do sensor e CHRE, o CHRE em si não fornece os recursos do sensor exigido pelos sensores do Android HAL. A CHRE está vinculada a a HAL do hub de contexto, que atua como cliente de um sensor específico do dispositivo para receber dados do sensor sem envolver o AP.
Figura 1. Arquitetura do framework CHRE
HAL do hub de contexto
A camada de abstração de hardware (HAL) do hub de contexto é a interface entre
framework do Android e a implementação do CHRE do dispositivo, definidos em
hardware/interfaces/contexthub
A HAL do hub de contexto define as APIs usadas pelo framework do Android
descobre hubs de contexto disponíveis e seus nanoapps, interage com esses
nanoapps por meio da transmissão de mensagens, além de permitir que eles sejam carregados e
descarregada. Uma implementação de referência da HAL do hub de contexto que funciona com a
implementação de referência do CHRE está disponível em
system/chre/host
Em caso de conflito entre esta documentação e a definição da HAL, o A definição da HAL tem precedência.
Inicialização
Quando o Android é inicializado,
ContextHubService (link em inglês)
invoca a função HAL getHubs()
para determinar se algum hub de contexto está
disponíveis no dispositivo. Como essa é uma chamada única de bloqueio, ela precisa ser concluída
para evitar atrasos na inicialização e deve retornar um resultado preciso, pois as novas
hubs de contexto não podem ser introduzidos depois.
Carregar e descarregar nanoapps
Um hub de contexto pode incluir um conjunto de nanoapps incluído no dispositivo
e são carregados quando o CHRE é iniciado. Eles são conhecidos como nanoapps pré-carregados,
e precisa ser incluída na primeira resposta possível para queryApps()
.
A HAL do hub de contexto também oferece suporte ao carregamento e descarregamento dinâmico de nanoapps em
ambiente de execução, usando as funções loadNanoApp()
e unloadNanoApp()
. Nanoapps
são fornecidos à HAL em um formato binário específico para o hardware do CHRE e
implementação de software no dispositivo.
Se a implementação de carregamento de um nanoapp envolver a gravação em um
como o armazenamento flash conectado ao processador que executa o CHRE,
A implementação CHRE deve sempre inicializar com esses nanoapps dinâmicos na
desativado. Isso significa que nenhum código do nanoapp é executado até que um
A solicitação enableNanoapp()
é recebida pela HAL. Nanosapps pré-carregados podem
inicializado no estado ativado.
Reinicializações do hub de contexto
Não se espera que o CHRE seja reiniciado durante a operação normal, mas ele
pode ser necessário para se recuperar de condições inesperadas, como uma tentativa de
um endereço de memória não mapeado. Nessas situações, o CHRE reinicia
independente do Android. A HAL notifica o Android sobre isso pela
Evento RESTARTED
, que precisa ser enviado somente depois que o CHRE for reinicializado para
o ponto em que ele pode aceitar novas solicitações, como queryApps()
.
Visão geral do sistema CHRE
O CHRE foi desenvolvido com base em uma arquitetura orientada a eventos, em que a unidade principal
a computação em nuvem é um evento passado para o ponto de entrada de manipulação de eventos de um nanoapp.
o framework CHRE puder ter várias linhas de execução, um determinado nanoapp nunca será executado
várias linhas de execução em paralelo. O framework CHRE interage com um determinado nanoapp.
usando um dos três pontos de entrada do nanoapp (nanoappStart()
,
nanoappHandleEvent()
e nanoappEnd()
) ou por um callback fornecido em um
chamada anterior da API CHRE, e os nanoapps interagem com o framework do CHRE e o
sistema subjacente pela API CHRE. A API CHRE fornece um conjunto de
bem como recursos para acessar sinais contextuais, incluindo
GNSS, Wi-Fi, WWAN e áudio, podendo ser estendida
recursos específicos do fornecedor para uso por nanoapps específicos do fornecedor.
Sistema de build
Embora a HAL do hub de contexto e outros componentes necessários do lado do AP sejam criados junto com o Android, o código executado no CHRE pode ter requisitos para torná-lo incompatíveis com o sistema de compilação do Android, como a necessidade de um conjunto de ferramentas. Portanto, o projeto CHRE no AOSP oferece um build simplificado baseado no GNU Make para compilar nanoapps e, como opção, o em bibliotecas que podem ser integradas ao sistema. Dispositivo os fabricantes que adicionam suporte a CHRE devem integrar o suporte ao sistema de build para os dispositivos de destino para o AOSP.
A API CHRE foi criada no padrão de linguagem C99, e a referência implementação usa um subconjunto restrito do C++11 adequado para recursos limitados apps.
API CHRE
A API CHRE é uma coleção de arquivos de cabeçalho C que definem o software interface entre um nanoapp e o sistema. Ele é projetado para criar nanoapps códigos compatíveis em todos os dispositivos que oferecem suporte a CHRE, o que significa que o código-fonte de um nanoapp não precisa ser modificado para oferecer suporte a um novo dispositivo tipo, embora possa precisar ser recompilado especificamente para o sistema conjunto de instruções do processador ou interface binária de aplicativo (ABI). O CHRE a arquitetura e o design de APIs também garantem que os nanoapps sejam compatíveis com binários em diferentes versões da API CHRE, o que significa que um nanoapp não precisa ser recompilado para ser executado em um sistema que implementa uma versão diferente a API CHRE em comparação com a API de destino para a compilação do nanoapp. Em outras palavras, se um binário nanoapp for executado em um dispositivo com suporte à API CHRE v1.3, e o dispositivo é atualizado para oferecer suporte à API CHRE v1.4, o mesmo nanoapp e o binário continua funcionando. Da mesma forma, o nanoapp pode ser executado na API CHRE v1.2, e pode determinar no ambiente de execução se são necessários recursos da API v1.3 alcançar o uso dela ou se pode operar, potencialmente com degradação de atributos.
Novas versões da API CHRE são lançadas junto com o Android, mas como a API CHRE implementação faz parte implementação do fornecedor, a versão da API CHRE aceita em um dispositivo não está necessariamente vinculada a uma Versão do Android.
Resumo da versão
Como o
Esquema de controle de versão HIDL do Android
a API CHRE segue o controle de versões semântico.
A versão principal indica compatibilidade binária, enquanto a versão secundária indica
incrementada quando recursos compatíveis com versões anteriores são introduzidos. A API CHRE
inclui anotações de código-fonte para identificar qual versão introduziu uma função
ou parâmetro, por exemplo, @since v1.1
.
A implementação do CHRE também expõe uma versão de patch específica da plataforma por meio de
chreGetVersion()
, que indica quando correções de bugs ou atualizações menores são feitas no
a implementação.
Versão 1.0 (Android 7)
Inclui suporte a sensores e recursos essenciais do nanoapp, como eventos e timers.
Versão 1.1 (Android 8)
Introduz recursos de localização por meio de medições brutas e de localização do GNSS, busca por Wi-Fi e informações sobre a rede móvel, além de refinamentos gerais. para permitir a comunicação entre nanoapp e nanoapp e outras melhorias.
Versão 1.2 (Android 9)
Adiciona suporte a dados de microfone de baixo consumo, alcance Wi-Fi RTT, AP notificações de despertar e sono e outras melhorias.
Versão 1.3 (Android 10)
Aprimora os recursos relacionados aos dados de calibração do sensor e adiciona suporte a transferir dados do sensor em lote sob demanda, definir o tipo de sensor de detecção de etapas e estende os eventos de localização do GNSS com campos de precisão adicionais.
Versão 1.4 (Android 11)
Adiciona suporte a informações de célula 5G, despejo de depuração nanoapp e outros melhorias.
Recursos obrigatórios do sistema
As origens de indicadores de contexto, como sensores, são categorizadas como áreas de recurso, algumas funções principais são necessárias em todos os CHREs e implementações. Isso inclui as principais APIs do sistema, como as de configuração timers, enviar e receber mensagens de clientes no processador dos aplicativos, geração de registros e outros. Para mais detalhes, consulte a Cabeçalhos da API.
Além dos principais recursos de sistema codificados na API CHRE, há também recursos obrigatórios no nível do sistema CHRE especificados no nível da HAL do hub de contexto. A o mais significativo deles é a capacidade de carregar e descarregar dinamicamente nanosapps.
Biblioteca C/C++ padrão
Para minimizar o uso de memória e a complexidade do sistema, as implementações CHRE são necessário para oferecer suporte a apenas um subconjunto das bibliotecas C e C++ padrão e recursos de linguagem grandes que exigem suporte de tempo de execução. Seguindo esses princípios, algumas recursos são explicitamente excluídos devido à memória e à amplitude do sistema operacional dependências e outras porque foram substituídas por APIs específicas de CHRE. Embora essa não seja uma lista completa, os itens a seguir que não devem ser disponibilizados para nanoapps:
- Exceções de C++ e informações sobre o tipo de ambiente de execução (RTTI)
- Suporte a multissegmentação da biblioteca padrão, incluindo cabeçalhos C++11
<thread>
,<mutex>
,<atomic>
e<future>
- Bibliotecas de entrada/saída padrão em C e C++
- Biblioteca C++ padrão de modelos (STL, na sigla em inglês)
- Biblioteca C++ padrão de expressões regulares
- Alocação dinâmica de memória usando funções padrão (por exemplo,
malloc
,calloc
,realloc
,free
,operator new
) e outro padrão funções de biblioteca que usam inerentemente a alocação dinâmica, comostd::unique_ptr
- Compatibilidade com localização e caracteres Unicode
- Bibliotecas de data e hora
- Funções que modificam o fluxo normal do programa, incluindo
<setjmp.h>
,<signal.h>
,abort
estd::terminate
- Como acessar o ambiente do host, incluindo
system
,getenv
- POSIX e outras bibliotecas não incluídas na linguagem C99 ou C++11 padrões
Em muitos casos, recursos equivalentes estão disponíveis nas funções da API CHRE
e bibliotecas de utilitários. Por exemplo, chreLog
pode ser usado para depurar a geração de registros
direcionados para o sistema logcat do Android, no qual um programa mais tradicional poderia
use printf
ou std::cout
.
Por outro lado, alguns recursos padrão da biblioteca são necessários. Cabe ao implementação de plataforma para expor usando bibliotecas estáticas para inclusão em um binário nanoapp ou por vínculo dinâmico entre o nanoapp e o sistema. Isso inclui, sem limitação:
- Utilitários de string e matriz:
memcmp
,memcpy
,memmove
,memset
,strlen
Biblioteca Math: funções de ponto flutuante de precisão única usadas frequentemente:
- Operações básicas:
ceilf
,fabsf
,floorf
,fmaxf
,fminf
,fmodf
,roundf
,lroundf
eremainderf
- Funções exponenciais e de potência:
expf
,log2f
,powf
,sqrtf
- Funções trigonométricas e hiperbólicas:
sinf
,cosf
,tanf
,asinf
,acosf
,atan2f
,tanhf
- Operações básicas:
Enquanto algumas plataformas subjacentes suportam recursos adicionais, um nanoapp não é considerado portátil entre implementações CHRE, a menos que restrinja seu dependências externas para funções da API CHRE e biblioteca padrão aprovada .
Recursos opcionais
Para promover o hardware e o software, a API CHRE é dividida em áreas de recursos, que são considerados opcionais do ponto de vista da API. Embora esses recursos podem não ser obrigados a oferecer suporte a uma implementação de CHRE compatível, eles podem ser necessárias para a compatibilidade com um nanoapp específico. Mesmo que uma plataforma não ofereça suporte a uma determinado conjunto de APIs, os nanoaplicativos que fazem referência a essas funções devem ser capazes de criar e carregar.
Sensores
A API CHRE fornece a capacidade de solicitar dados de sensores, incluindo acelerômetro, giroscópio, magnetômetro, sensor de luz ambiente e proximidade. Essas APIs fornecem um conjunto de recursos semelhante ao dos sensores do Android APIs, incluindo suporte para agrupar amostras de sensores para reduzir o consumo de energia. O processamento de dados do sensor no CHRE permite muito menos energia e latência menor. processamento de sinais de movimento em comparação com a execução no AP.
GNSS
A CHRE fornece APIs para solicitar dados de localização de uma navegação global sistema de satélite (GNSS, na sigla em inglês), incluindo GPS e outras constelações de satélites. Isso inclui solicitações de correções periódicas de posição, bem como dados brutos de medição, embora ambos sejam capacidades independentes. Como o CHRE tem um link direto para o GNSS no subsistema, a energia é reduzida em comparação com solicitações GNSS baseadas em AP, porque o AP pode permanecer dormindo durante todo o ciclo de vida de uma sessão de localização.
Wi-Fi
O CHRE permite interagir com o chip de Wi-Fi, principalmente para para fins de localização. Embora o GNSS funcione bem para locais ao ar livre, os resultados do As verificações de Wi-Fi fornecem informações de localização precisas em ambientes fechados e áreas Além de evitar o custo de ativar o AP para uma verificação, o CHRE pode ouvir os resultados das buscas por Wi-Fi realizadas pelo firmware para fins de conectividade, que normalmente não são entregues ao AP por motivos de poder. Usar as verificações de conectividade para fins contextuais ajuda para reduzir o número total de buscas por Wi-Fi realizadas, economizando energia.
Foi adicionado suporte a Wi-Fi na API CHRE v1.1, incluindo a capacidade de monitorar os resultados das verificações e acionar verificações sob demanda. Esses recursos foram estendidos para v1.2, com a capacidade de realizar Tempo de retorno (RTT) medições em relação aos pontos de acesso que dão suporte ao recurso, o que permite a determinação precisa da posição relativa.
WWAN
A API CHRE fornece a capacidade de recuperar informações de identificação de células para a célula de serviço e suas vizinhas, que é normalmente usada para para fins de localização de alta granularidade.
Áudio
O CHRE pode processar lotes de dados de áudio de um microfone de baixo consumo, normalmente aproveita o hardware usado para implementar a HAL SoundTrigger. Processando os dados de áudio no CHRE podem permitir a fusão com outros dados, como movimento ou sensores.
Implementação de referência
O código de referência do framework CHRE está incluído no AOSP no system/chre
implementado em C++11. Embora não seja estritamente obrigatório, é recomendado para
todas as implementações CHRE sejam baseadas nessa base de código, para ajudar a garantir
consistência e acelerar a adoção de novos recursos. Este código pode ser visto
como um análogo ao framework principal do Android, por se tratar de um
implementação de APIs usadas por apps, servindo como referência e padrão
para compatibilidade. Embora possa ser personalizado e estendido com opções específicas de fornecedor,
recursos, a recomendação é manter o código comum o mais próximo
sempre que possível. Semelhante às HALs do Android, a referência CHRE
usa várias abstrações da plataforma para permitir que ela seja adaptada
para qualquer dispositivo que atenda aos requisitos mínimos.
Para ver detalhes técnicos e um guia de portabilidade, consulte o
README
incluídos no projeto system/chre
.