Exemplos de código principais

Os exemplos de código dos serviços principais do SDV em /system/software_defined_vehicle/samples permitem que você comece a criar seus serviços. Cada amostra contém um arquivo README que descreve o caso de uso.

Visão geral do diretório de amostras

A tabela a seguir lista os diretórios de amostra de referência em system/software_defined_vehicle/samples e os guias de documentação correspondentes:

Diretório de amostra Descrição Guia de documentação
system/software_defined_vehicle/samples/quickstart Exemplo de pacote de serviço Rust de ponta a ponta que demonstra a publicação, a assinatura e a RPC do VSIDL entre os pacotes Manager e Monitor. Guia de início rápido: criar e executar pacotes de serviços de SDV
system/software_defined_vehicle/samples/vsidl Consulte o catálogo VSIDL, as definições de protobuf e os padrões de implementação do pacote de serviços. Implementar a lógica de negócios
system/software_defined_vehicle/samples/concal Exemplo de cliente para ler e atualizar parâmetros de configuração e calibração de veículos. Configuração e calibração
system/software_defined_vehicle/samples/health Pacote de serviços com monitoramento de integridade e amostras de monitoramento de qualidade de serviço (QoS). Monitoramento de integridade
system/software_defined_vehicle/samples/oem_partition_update_client Exemplo de serviço que usa o crate sdv_oem_updater para acionar e reverter atualizações de partição /oem_ab. Atualizações de partição AB do OEM
system/software_defined_vehicle/samples/sdv_gateway Apps de exemplo de IVI nativos e em Java (NativeSdvGatewayTestApp e SdvCarMonitorTestApp) que se comunicam com os serviços principais do SDV pelo gateway do SDV. Usar o gateway de SDV no IVI
system/software_defined_vehicle/samples/telemetry Fonte de dados de telemetria no dispositivo e amostras de simulador. Fontes de dados

Usar a API Logging

Para saber mais sobre as instruções fornecidas, consulte:

Exemplo de registro básico

logging.cpp apresenta a gravação nos buffers main, system e radio. Para ler uma breve descrição dos buffers de registro disponíveis, consulte Acessar buffers de registro alternativos.

  • Para executar o exemplo sem os registros condicionais, como ALOGI_IF:

    logging_sdv_sample
    
  • Para executar o exemplo e imprimir os registros condicionais, como ALOGI_IF:

    LOGIF=1 logging_sdv_sample
    

Exemplo de geração de registros estruturados

Arquivo de exemplo: structured_logging.cpp

  • Para executar o exemplo, que grava registros no buffer de registros events:

    structured_logging_sdv_sample
    

Os buffers de registro event, security e stats contêm dados estruturados, em vez de texto livre.

Os dados estruturados são registrados usando a API de lista de eventos, que sempre é registrada com a prioridade INFO e o ID numérico da tag.

Um arquivo .logtags pode ser definido com um atributo logtags em Android.bp.. Quando fornecido, o logcat usa isso para derivar o nome da tag do ID numérico da tag. O nome da tag pode ser usado para filtrar registros estruturados. Para detalhes e uma descrição do formato do arquivo, consulte o comentário no arquivo logcat event.logtags.

Durante o processo de build, todos os arquivos logtags são mesclados e colocados no arquivo /system/etc/event-log-tags na imagem do sistema Android.

Compilar uma amostra de filtragem de registro de tempo

Arquivo de exemplo: compile_time_log_filtering.cpp

Este exemplo contém macros que podem ser ajustadas para remover alguns registros do executável. Consulte o código-fonte para mais detalhes.

Exemplo de filtragem de registros: log_filtering.cpp

  • Para executar o exemplo, defina a prioridade mínima de registro como WARN:

    LOGLEVEL=WARN log_filtering_sdv_sample
    

A filtragem de registros é afetada pelas propriedades do sistema. Para todos os registros com :

  • log.tag.<tag>
  • persist.log.tag.<tag>

Para todos os registros no sistema:

  • log.tag
  • persist.log.tag

Para selecionar o nível de registro escolhido, que é verificado em ordem, cada valor pode ser definido como V, D, I, W ou E.

O nível de registro efetivo é o nível definido na primeira propriedade do sistema que tem um valor, que pode ser menor ou maior que o nível de registro definido pelo app com uma chamada __android_log_set_minimum_priority. Quando nenhuma das propriedades é definida, o nível configurado com __android_log_set_minimum_priority é aplicado.

Para mais detalhes, consulte a visão geral do sistema do Logging.

  • Execute o exemplo, definindo a tag de registro padrão como example_tag:

    LOGTAG=example_tag log_filtering_sdv_sample
    

O exemplo também contém uma definição de macro LOG_TAG comentada que pode ser usada para definir a tag de registro para todas as mensagens de registro. A tag definida dessa maneira substitui a tag definida no ambiente de execução com __android_log_set_default_tag.

Se a macro LOG_TAG não estiver definida e o app não chamar __android_log_set_default_tag, a tag padrão será o resultado de getprogname(). Por exemplo, o nome do executável.