Depois de criar o middleware e escrever o código personalizado, você pode implantar seus pacotes de serviços como arquivos APEX.
Crie arquivos de configuração do SDV:
Rust
Gere arquivos de configuração do SDV executando:
vsidlc -c /path/to/catalog -o /path/to/output --apexA execução de
vsidlccom a flag--apexgera automaticamente todos os arquivos de configuração necessários, incluindo:- Manifesto do APEX (
apex_manifest.json) - Manifesto de metadados do SDV (
sdv_service_bundles_manifest.textproto) - Configuração do vinculador (
linker.config.json) - Contextos de arquivo SELinux (
file_contexts) - Chaves públicas e privadas (
.avbpubkeye.pem) - Declarações de permissão e configurações de orquestração
- Um arquivo
Android.bpque define todos os módulos Soong necessários.
As configurações geradas podem ser encontradas em:
/path/to/output/apex/e
/path/to/output/configs/- Manifesto do APEX (
C++
Crie um arquivo de manifesto de metadados do SDV,
service_bundle.manifest.textprotocom estes campos de metadados de execução essenciais:- Nome do serviço de acordo com as convenções de nomenclatura
- Representação de números inteiros e strings da versão do pacote de serviços
- Caminho para a biblioteca criada anteriormente
A preparação de metadados essenciais do pacote de serviços é obrigatória para o empacotamento e a implantação.
# proto-file: //system/software_defined_vehicle/core_services/service_bundles_registry/proto/sdv_service_bundles_manifest.proto # proto-message: SdvServiceBundleManifestEntry # SDV service bundle metadata definition with mandatory fields. sdv_service_bundle_metadata { # Service bundle name. name: "ServiceBundleName" # Service bundle integer version. version_number: 42 # Service bundle version as a string. version_name: "42.alpha" # Service bundle library path. native_library_path: "lib64/libservice_bundle.so" }Crie um novo arquivo de configuração do vinculador,
linker.config.json:{ "visible": true }Crie um novo arquivo
apex_manifest.jsoncom estes campos:- Nome exclusivo do pacote SDV de acordo com as convenções de nomenclatura do SDV
- Versão do APEX
- Dependência das bibliotecas de comunicação do SDV
{ "name": "com.sdv.oem.apex_and_module_name", "version": 1, "requireNativeLibs": [ "libsdv_comms_ctx_ffi.so", "libsdv_comms_dt_ffi.so", "libsdv_comms_id_ffi.so", "libsdv_comms_sd_ffi.so" ] }Crie uma chave pública,
apex_name.apex_key.avbpubkeye uma chave privada,apex_name.apex_key.pem.Crie um novo contexto de arquivo SELinux
apex_file_contexts.(/.*)? u:object_r:system_file:s0Para saber mais, consulte Contexto e categorias de segurança.
Crie destinos pré-criados em um arquivo
Android.bpnovo ou existente:// SDV manifest file prebuilt. prebuilt_etc { name: "com.sdv.oem.apex_and_module_name.service_bundles_manifest", // The source filename of the manifest file. src: "service_bundle.manifest.textproto", // The name of the installed file needs be `sdv_service_bundles_manifest.textproto`. filename: "sdv_service_bundles_manifest.textproto", // Disable direct installation of the prebuilt to one of the partitions. // The manifest is used only inside of an apex. installable: false, } // The linker config to allow libraries for the apex to be linkable. linker_config { name: "com.sdv.oem.apex_and_module_name. linker_config", src: "linker.config.json", // Disable direct installation of the prebuilt to one of the partitions. // The linker configuration is used only inside of an apex. installable: false, } // Key to be used for signing the apex. apex_key { name: "apex_name.apex_key", public_key: "apex_name.apex_key.avbpubkey", private_key: "apex_name.apex_key.pem", }Crie um novo módulo APEX em um arquivo
Android.bpnovo ou existente. Use o nome do pacote SDV como o nome do módulo APEX.apex { name: "com.sdv.oem.apex_and_module_name", // The service bundle(s) to be included in the apex. native_shared_libs: [ "libservice_bundle", ], prebuilts: [ // SDV service bundles manifest file. "com.sdv.oem.apex_and_module_name.service_bundles_manifest", // Linker configuration to enable loading library from apex. "com.sdv.oem.apex_and_module_name.linker_config", ], // Json manifest file describes metadata of the APEX package. // The 'name' field from the JSON is used as a mounting point. manifest: "apex_manifest.json", // Setting the security contexts to files in this APEX bundle. file_contexts: "apex_file_contexts", // Name of the apex_key module that provides the private key to sign the APEX bundle. key: "apex_name.apex_key", // Mark apex as non-updatable for now, this might be revisited going forward. updatable: false, // Service bundle package is installed into /product partition. product_specific: true, }
Para incluir o novo makefile em uma imagem SDV, adicione o novo módulo APEX ao
PRODUCT_PACKAGESno makefile do produto. Por exemplo, consultesdv_samples_core_services.mk.Se você estiver usando o Cuttlefish, execute o comando a seguir para iniciar um dispositivo:
sdv-cf create --instance_name=instance1Execute o pacote de serviços quando o sistema for inicializado:
# Grant root access. adb root # Launch the new service bundle. adb shell sdv_service_bundle start \ local-vm:com.sdv.oem.apex_and_module_name.ServiceBundleName/instance-1
Gerenciamento de dependências de pacotes de serviços
Em alguns cenários, é possível usar a vinculação estática das dependências do pacote de serviços para reduzir o tamanho do APEX e o consumo de memória do pacote de serviços, além de melhorar o tempo de inicialização dos pacotes de serviços. Esses cenários incluem APEXs com:
- Pacotes de serviços únicos
- Vários pacotes de serviços que não compartilham muitas dependências comuns
Para ativar a vinculação estática, adicione as seguintes propriedades à definição da biblioteca do pacote de serviços:
// Service bundle library.
rust_ffi_shared {
// See rust_ffi_shared basic template.
...
// uses static linking for the dependencies
prefer_rlib: true,
// needed to correctly resolve commstack deps
ld_flags: ["-Wl,--no-as-needed"],
}
Para cada situação, recomendamos confirmar se a vinculação estática às dependências leva a melhorias no consumo de memória e nos tempos de inicialização dos pacotes de serviços.
Depurar (dumpsys)
O gerenciador de ciclo de vida implementa a interface dumpsys. Essa interface mostra ao usuário a lista de pacotes de serviços que estão no estado created ou started. A interface também mostra o FQIN ou UID do processo do pacote de serviços.
Para conferir o estado atual e os identificadores dos pacotes de serviços, execute:
# Grant root access.
adb root
# Execute dumpsys to see service bundles state
adb shell dumpsys google.sdv.lifecycle.ILifecycleManager/default
A seguir
Para executar vsidlc automaticamente e permitir que o plug-in do ambiente de desenvolvimento integrado funcione com
dependências, consulte Atualizações automáticas do catálogo e integração do LSP.