Este documento descreve o hash da interface HIDL, um mecanismo para evitar mudanças acidentais na interface e garantir que elas sejam analisadas minuciosamente. Esse mecanismo é necessário porque as interfaces HIDL são versionadas, o que significa que, depois que uma interface é lançada, ela não pode ser alterada, exceto de uma maneira que preserve a interface binária do aplicativo (ABI, na sigla em inglês), como uma correção de comentário.
Layout
Todos os diretórios raiz do pacote (por exemplo, mapeamento android.hardware para
hardware/interfaces ou mapeamento vendor.foo para
vendor/foo/hardware/interfaces) precisam conter um
arquivo current.txt que liste todos os arquivos de interface HIDL lançados.
# current.txt files support comments starting with a '#' character # this file, for instance, would be vendor/foo/hardware/interfaces/current.txt # Each line has a SHA-256 hash followed by the name of an interface. # They have been shortened in this doc for brevity but they are # 64 characters in length in an actual current.txt file. d4ed2f0e...995f9ec4 vendor.awesome.foo@1.0::IFoo # comments can also go here # types.hal files are also noted in current.txt files c84da9f5...f8ea2648 vendor.awesome.foo@1.0::types # Multiple hashes can be in the file for the same interface. This can be used # to note how ABI sustaining changes were made to the interface. # For instance, here is another hash for IFoo: # Fixes type where "FooCallback" was misspelled in comment on "FooStruct" 822998d7...74d63b8c vendor.awesome.foo@1.0::IFoo
Observação:para ajudar a acompanhar de onde vêm
os hashes, o Google separa os arquivos current.txt da HIDL em diferentes
seções: a primeira é Lançada no Android 8, e a próxima será
Lançada no Android 8 MR1. Recomendamos o uso de um
layout semelhante no arquivo current.txt.
Hash com hidl-gen
É possível adicionar um hash a um arquivo current.txt manualmente ou
usando hidl-gen. O snippet de código a seguir mostra exemplos de
comandos que podem ser usados com hidl-gen para gerenciar um
arquivo current.txt (os hashes foram encurtados):
hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0::types9626fd18...f9d298a6 vendor.awesome.nfc@1.0::typeshidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0::INfc07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfchidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.09626fd18...f9d298a6 vendor.awesome.nfc@1.0::types 07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc f2fe5442...72655de6 vendor.awesome.nfc@1.0::INfcClientCallbackhidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0 >> vendor/awesome/hardware/interfaces/current.txt
Aviso:não substitua um hash de uma
interface lançada anteriormente. Ao mudar essa interface, adicione um novo hash
ao final do arquivo current.txt. Para mais detalhes, consulte
Estabilidade da ABI.
Todas as bibliotecas de definição de interface geradas por hidl-gen
incluem hashes, que podem ser recuperados chamando
IBase::getHashChain. Quando o hidl-gen está compilando uma
interface, ele verifica o arquivo current.txt no diretório raiz do
pacote HAL para saber se o HAL foi alterado:
- Se nenhum hash para o HAL for encontrado, a interface será considerada não lançada (em desenvolvimento) e a compilação será realizada.
- Se hashes forem encontrados, eles serão verificados na interface atual:
- Se a interface corresponder ao hash, a compilação vai continuar.
- Se a interface não corresponder a um hash, a compilação será interrompida, porque isso significa que uma interface lançada anteriormente está sendo alterada.
- Para uma mudança que preserva a ABI (consulte
Estabilidade da ABI), o arquivo
current.txtprecisa ser modificado antes que a compilação possa continuar. - Todas as outras mudanças precisam ser feitas em um upgrade de versão secundária ou principal da interface.
- Para uma mudança que preserva a ABI (consulte
Estabilidade da ABI), o arquivo
Estabilidade da ABI
Uma ABI inclui os links
binários/convenções de chamada/etc. Se a ABI ou a API mudar, a interface não
vai mais funcionar com um system.img genérico compilado com
interfaces oficiais.
Verificar se as interfaces têm uma versão e se a ABI é estável é crucial por vários motivos:
- Isso garante que sua implementação possa passar no conjunto de testes do fornecedor (VTS, na sigla em inglês), o que coloca você no caminho certo para fazer OTAs somente de framework.
- Como OEM, ele permite que você forneça um pacote de suporte à placa (BSP) que seja simples de usar e compatível.
- Ele ajuda a acompanhar quais interfaces podem ser liberadas. Considere
current.txtum mapa de um diretório de interfaces que permite conferir o histórico e o estado de todas as interfaces fornecidas na raiz de um pacote.
Ao adicionar um novo hash para uma interface que já tem uma entrada em
current.txt, adicione apenas os hashes que representam
as interfaces que mantêm a estabilidade da ABI. Analise os seguintes tipos de mudanças:
| Mudanças permitidas |
|
|---|---|
| Mudanças não permitidas |
|