Ambiente de tempo de execução do Context Hub (CHRE)

Os smartphones contêm vários processadores, cada um otimizado para executar tarefas diferentes. No entanto, o Android só roda em um processador: o processador de aplicativos (AP). O AP é ajustado para oferecer excelente desempenho para casos de uso de tela, como jogos, mas consome muita energia para oferecer suporte a recursos que exigem rajadas curtas e frequentes de processamento o tempo todo, mesmo quando a tela está desligada. Processadores menores são capazes de lidar com essas cargas de trabalho com mais eficiência, concluindo suas tarefas sem afetar significativamente a duração da bateria. No entanto, os ambientes de software nesses processadores de baixo consumo de energia são mais limitados e podem variar muito, dificultando o desenvolvimento de plataforma cruzada.

O Context Hub Runtime Environment (CHRE) fornece uma plataforma comum para executar aplicativos em um processador de baixo consumo de energia, com uma API simples, padronizada e compatível com a incorporação. O CHRE torna mais fácil para os OEMs de dispositivos e seus parceiros confiáveis ​​descarregar o processamento do ponto de acesso, economizar bateria e melhorar várias áreas da experiência do usuário, além de habilitar uma classe de recursos sempre ativos e com reconhecimento de contexto, especialmente aqueles que envolvem a aplicação de máquinas aprendendo a sentir o ambiente.

Conceitos chave

CHRE é o ambiente de software onde pequenos aplicativos nativos, chamados nanoapps , são executados em um processador de baixo consumo de energia e interagem com o sistema subjacente por meio da API CHRE comum. Para acelerar a implementação adequada das APIs do CHRE, uma implementação de referência de plataforma cruzada do 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 de plataforma (PALs). Nanoapps quase sempre estão vinculados a um ou mais aplicativos clientes em execução no Android, que interagem com CHRE e nanoapps por meio de APIs do sistema ContextHubManager de acesso restrito.

Em alto nível, podem ser traçados paralelos entre a arquitetura do CHRE e o Android como um todo. No entanto, existem algumas distinções importantes:

  • O CHRE suporta a execução apenas de nanoaplicativos desenvolvidos em código nativo (C ou C++); Java não é suportado.
  • Devido a restrições de recursos e limitações de segurança, o CHRE não está aberto para uso por aplicativos Android arbitrários de terceiros. Somente aplicativos confiáveis ​​do sistema podem acessá-lo.

Há também uma distinção importante a ser feita entre o conceito de CHRE e um hub de sensor. Embora seja comum usar o mesmo hardware para implementar o hub do sensor e o CHRE, o próprio CHRE não fornece a funcionalidade do sensor exigida pelo Android Sensors HAL . O CHRE está vinculado ao Context Hub HAL e atua como um cliente de uma estrutura de sensor específica do dispositivo para receber dados do sensor sem envolver o AP.

Arquitetura da estrutura do CHRE

Figura 1. Arquitetura da estrutura do CHRE

Centro de Contexto HAL

A camada de abstração de hardware (HAL) do Context Hub é a interface entre a estrutura do Android e a implementação CHRE do dispositivo, definida em hardware/interfaces/contexthub . O Context Hub HAL define as APIs por meio das quais a estrutura do Android descobre os hubs de contexto disponíveis e seus nanoapps, interage com esses nanoapps por meio da passagem de mensagens e permite que os nanoapps sejam carregados e descarregados. Uma implementação de referência do Context Hub HAL 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 HAL, a definição HAL tem precedência.

Inicialização

Quando o Android inicializa, o ContextHubService invoca a função getHubs() HAL para determinar se algum hub de contexto está disponível no dispositivo. Esta é uma chamada única de bloqueio, portanto, deve ser concluída rapidamente para evitar atrasos na inicialização e deve retornar um resultado preciso, pois novos hubs de contexto não podem ser introduzidos posteriormente.

Carregando e descarregando nanoapps

Um hub de contexto pode incluir um conjunto de nanoapps incluídos na imagem do dispositivo e carregados quando o CHRE é iniciado. Eles são conhecidos como nanoapps pré-carregados e devem ser incluídos na primeira resposta possível a queryApps() .

O Context Hub HAL também oferece suporte para carregar e descarregar nanoapps dinamicamente em tempo de execução, por meio das funções loadNanoApp() e unloadNanoApp() . Os Nanoapps são fornecidos ao HAL em um formato binário específico para a implementação de hardware e software CHRE do dispositivo.

Se a implementação para carregar um nanoapp envolver gravá-lo em memória não volátil, como armazenamento flash anexado ao processador que executa o CHRE, a implementação do CHRE deverá sempre inicializar com esses nanoapps dinâmicos no estado desabilitado. Isso significa que nenhum código do nanoapp é executado até que uma solicitação enableNanoapp() seja recebida por meio do HAL. Nanoapps pré-carregados podem inicializar no estado habilitado.

O hub de contexto é reiniciado

Embora não se espere que o CHRE seja reiniciado durante a operação normal, pode ser necessário se recuperar de condições inesperadas, como uma tentativa de acessar um endereço de memória não mapeado. Nessas situações, o CHRE reinicia independentemente do Android. O HAL notifica o Android disso por meio do evento RESTARTED , que deve ser enviado somente após o CHRE ter sido reinicializado a ponto de poder aceitar novas solicitações, como queryApps() .

Visão geral do sistema CHRE

CHRE é projetado em torno de uma arquitetura orientada a eventos, onde a unidade primária de computação é um evento passado para o ponto de entrada de manipulação de eventos de um nanoapp. Embora a estrutura CHRE possa ser multithread, um determinado nanoapp nunca é executado a partir de vários threads em paralelo. A estrutura CHRE interage com um determinado nanoapp por meio de um dos três pontos de entrada do nanoapp ( nanoappStart() , nanoappHandleEvent() e nanoappEnd() ) ou por meio de um retorno de chamada fornecido em uma chamada de API CHRE anterior, e os nanoapps interagem com a estrutura CHRE e o sistema subjacente por meio da API CHRE. A API CHRE fornece um conjunto de funcionalidades básicas, bem como recursos para acessar sinais contextuais, incluindo sensores, GNSS, Wi-Fi, WWAN e áudio, e pode ser estendido com recursos adicionais específicos do fornecedor para uso por nanoaplicativos específicos do fornecedor .

Construir sistema

Embora o Context Hub HAL e outros componentes necessários do lado do AP sejam criados junto com o Android, o código executado no CHRE pode ter requisitos que o tornam incompatível com o sistema de compilação do Android, como a necessidade de uma cadeia de ferramentas especializada. Portanto, o projeto CHRE em AOSP fornece um sistema de compilação simplificado baseado no GNU Make para compilar nanoapps e, opcionalmente, o framework CHRE em bibliotecas que podem ser integradas ao sistema. Os fabricantes de dispositivos que adicionam suporte para CHRE devem integrar o suporte do sistema de compilação para seus dispositivos de destino no AOSP.

A API CHRE é gravada no padrão de linguagem C99 e a implementação de referência usa um subconjunto restrito de C++11 adequado para aplicativos com recursos limitados.

CHREAPI

A API CHRE é uma coleção de arquivos de cabeçalho C que definem a interface de software entre um nanoapp e o sistema. Ele foi projetado para tornar o código de nanoapps compatível em todos os dispositivos compatíveis com CHRE, o que significa que o código-fonte de um nanoapp não precisa ser modificado para oferecer suporte a um novo tipo de dispositivo, embora possa precisar ser recompilado especificamente para o processador do dispositivo de destino conjunto de instruções ou interface binária de aplicativo (ABI). A arquitetura do CHRE e o design da API também garantem que os nanoaplicativos sejam binários compatíveis em diferentes versões da API do CHRE, o que significa que um nanoaplicativo não precisa ser recompilado para rodar em um sistema que implementa uma versão diferente da API do CHRE em comparação com a API de destino na qual o nanoapp é compilado. Em outras palavras, se um binário nanoapp for executado em um dispositivo compatível com CHRE API v1.3 e esse dispositivo for atualizado para oferecer suporte a CHRE API v1.4, o mesmo binário nanoapp continuará a funcionar. Da mesma forma, o nanoapp pode ser executado no CHRE API v1.2 e pode determinar em tempo de execução se ele requer a funcionalidade do API v1.3 para atingir sua funcionalidade ou se pode operar, potencialmente com degradação normal de recursos.

Novas versões da API CHRE são lançadas junto com o Android, no entanto, como a implementação CHRE faz parte da implementação do fornecedor , a versão da API CHRE suportada em um dispositivo não está necessariamente vinculada a uma versão Android.

Resumo da versão

Assim como o esquema de versão do Android HIDL , a API CHRE segue a versão semântica . A versão principal indica compatibilidade binária, enquanto a versão secundária é 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 CHRE também expõe uma versão de patch específica da plataforma por meio de chreGetVersion() , que indica quando correções de bug ou pequenas atualizações são feitas na implementação.

Versão 1.0 (Android 7)

Inclui suporte para sensores e funcionalidade principal do nanoapp, como eventos e cronômetros.

Versão 1.1 (Android 8)

Apresenta recursos de localização por meio de localização GNSS e medições brutas, varredura Wi-Fi e informações de rede celular, juntamente com refinamentos gerais para permitir a comunicação de nanoaplicativo para nanoaplicativo e outras melhorias.

Versão 1.2 (Android 9)

Adiciona suporte para dados de um microfone de baixa potência, variação de Wi-Fi RTT, notificações de ativação/desativação de AP e outras melhorias.

Versão 1.3 (Android 10)

Aprimora os recursos relacionados aos dados de calibração do sensor, adiciona suporte para liberar dados de sensor em lote sob demanda, define o tipo de sensor de detecção de etapa e estende os eventos de localização GNSS com campos de precisão adicionais.

Versão 1.4 (Android 11)

Adiciona suporte para informações de células 5G, despejo de depuração nanoapp e outras melhorias.

Recursos obrigatórios do sistema

Embora as fontes de sinais contextuais, como sensores, sejam categorizadas em áreas de recursos opcionais, algumas funções principais são necessárias em todas as implementações do CHRE. Isso inclui as principais APIs do sistema, como as de configuração de cronômetros, envio e recebimento de mensagens para clientes no processador de aplicativos, registro em log e outros. Para obter detalhes completos, consulte os cabeçalhos da API .

Além dos recursos principais do sistema codificados na API CHRE, também há recursos obrigatórios no nível do sistema CHRE especificados no nível HAL do Hub de Contexto. O mais significativo deles é a capacidade de carregar e descarregar nanoapps dinamicamente.

Biblioteca padrão C/C++

Para minimizar o uso de memória e a complexidade do sistema, as implementações CHRE são necessárias para suportar apenas um subconjunto das bibliotecas C e C++ padrão e recursos de linguagem que requerem suporte de tempo de execução. Seguindo esses princípios, alguns recursos são explicitamente excluídos devido à sua memória e/ou extensas dependências no nível do sistema operacional, e outros porque são suplantados por APIs específicas do CHRE mais adequadas. Embora não pretenda ser uma lista exaustiva, os seguintes recursos não devem ser disponibilizados para nanoapps:

  • Exceções C++ e informações de tipo de tempo de execução (RTTI)
  • Suporte a multithreading de biblioteca padrão, incluindo cabeçalhos C++11 <thread> , <mutex> , <atomic> , <future>
  • Bibliotecas de entrada/saída padrão C e C++
  • Biblioteca de modelos padrão C++ (STL)
  • Biblioteca de Expressões Regulares Padrão C++
  • Alocação de memória dinâmica por meio de funções padrão (por exemplo, malloc , calloc , realloc , free , operator new ) e outras funções de biblioteca padrão que usam inerentemente a alocação dinâmica, como std::unique_ptr
  • Localização e suporte a caracteres Unicode
  • Bibliotecas de data e hora
  • Funções que modificam o fluxo normal do programa, incluindo <setjmp.h> , <signal.h> , abort , std::terminate
  • Acessando o ambiente do host, incluindo system , getenv
  • POSIX e outras bibliotecas não incluídas nos padrões de linguagem C99 ou C++11

Em muitos casos, a funcionalidade equivalente está disponível nas funções da API do CHRE e/ou nas bibliotecas de utilitários. Por exemplo, chreLog pode ser usado para registro de depuração direcionado ao sistema Android logcat, onde um programa mais tradicional pode usar printf ou std::cout .

Em contraste, algumas funcionalidades de biblioteca padrão são necessárias. Cabe à implementação da plataforma expô-los por meio de bibliotecas estáticas para inclusão em um binário do nanoapp ou pela vinculação dinâmica entre o nanoapp e o sistema. Isso inclui, mas não está limitado a:

  • Utilitários de string/array: memcmp , memcpy , memmove , memset , strlen
  • Biblioteca matemática: funções de ponto flutuante de precisão simples comumente usadas:

    • Operações básicas: ceilf , fabsf , floorf , fmaxf , fminf , fmodf , roundf , lroundf , remainderf
    • Funções exponenciais/potência: expf , log2f , powf , sqrtf
    • Funções trigonométricas/hiperbólicas: sinf , cosf , tanf , asinf , acosf , atan2f , tanhf

Embora algumas plataformas subjacentes ofereçam suporte a funcionalidades adicionais, um nanoapp não é considerado portátil entre as implementações do CHRE, a menos que restrinja suas dependências externas às funções da API do CHRE e às funções de biblioteca padrão aprovadas.

Recursos opcionais

Para promover hardware e software, a API CHRE é dividida em áreas de recursos, que são consideradas opcionais do ponto de vista da API. Embora esses recursos possam não ser necessários para dar suporte a uma implementação CHRE compatível, eles podem ser necessários para dar suporte a um nanoapp específico. Mesmo que uma plataforma não ofereça suporte a um determinado conjunto de APIs, os nanoapps 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 destinam-se a fornecer um conjunto de recursos semelhante às APIs de sensores do Android, incluindo suporte para agrupar amostras de sensores para reduzir o consumo de energia. O processamento de dados do sensor no CHRE permite processamento de sinais de movimento com muito menos energia e menor latência em comparação com a execução no AP.

GNSS

A CHRE fornece APIs para solicitar dados de localização de um sistema global de navegação por satélite (GNSS), incluindo GPS e outras constelações de satélites. Isso inclui solicitações para correções periódicas de posição, bem como dados brutos de medição, embora ambos sejam recursos independentes. Como o CHRE tem um link direto com o subsistema GNSS, a energia é reduzida em comparação com as solicitações GNSS baseadas em AP, porque o AP pode permanecer inativo durante todo o ciclo de vida de uma sessão de localização.

Wi-fi

O CHRE fornece a capacidade de interagir com o chip Wi-Fi, principalmente para fins de localização. Embora o GNSS funcione bem para locais externos, os resultados das varreduras Wi-Fi podem fornecer informações de localização precisas em ambientes internos e em áreas desenvolvidas. Além de evitar o custo de ativar o AP para uma varredura, o CHRE pode ouvir os resultados das varreduras Wi-Fi realizadas pelo firmware Wi-Fi para fins de conectividade, que normalmente não são entregues ao AP por motivos de energia. Aproveitar as varreduras de conectividade para fins contextuais ajuda a reduzir o número total de varreduras de Wi-Fi realizadas, economizando energia.

O suporte para Wi-Fi foi adicionado ao CHRE API v1.1, incluindo a capacidade de monitorar os resultados da varredura e acionar varreduras sob demanda. Esses recursos foram estendidos na versão 1.2 com a capacidade de realizar medições de tempo de ida e volta (RTT) em relação a pontos de acesso compatíveis com o 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élula para a célula servidora e suas vizinhas, que normalmente são usadas para fins de localização granular.

áudio

O CHRE pode processar lotes de dados de áudio de um microfone de baixa potência, que normalmente aproveita o hardware usado para implementar o SoundTrigger HAL. O processamento de dados de áudio no CHRE pode permitir que sejam fundidos com outros dados, como sensores de movimento.

Implementação de referência

O código de referência para o framework CHRE está incluído no AOSP no projeto system/chre , implementado em C++11. Embora não seja estritamente necessário, é recomendável que todas as implementações do CHRE sejam baseadas nessa base de código, para ajudar a garantir a consistência e acelerar a adoção de novos recursos. Esse código pode ser visto como um análogo da estrutura principal do Android, pois é uma implementação de código aberto de APIs que os aplicativos usam, servindo como linha de base e padrão de compatibilidade. Embora possa ser personalizado e estendido com recursos específicos do fornecedor, a recomendação é manter o código comum o mais próximo possível da referência. Semelhante aos HALs do Android, a implementação de referência CHRE usa várias abstrações de plataforma para permitir sua adaptação a qualquer dispositivo que atenda aos requisitos mínimos.

Para obter detalhes técnicos e um guia de portabilidade, consulte o README incluído no projeto system/chre .