Ten dokument opisuje haszowanie interfejsu HIDL, czyli mechanizm zapobiegający przypadkowym zmianom interfejsu i zapewniający, że zmiany interfejsu są dokładnie sprawdzane. Ten mechanizm jest wymagany, ponieważ interfejce HIDL są wersjonowane, co oznacza, że po wydaniu interfejsu nie można go zmieniać, z wyjątkiem sposobów zachowujących interfejs binarny aplikacji (ABI), takich jak poprawka komentarza.
Układ
Każdy katalog główny pakietu (czyli android.hardware mapowany na hardware/interfaces lub vendor.foo mapowany na vendor/foo/hardware/interfaces) musi zawierać plik current.txt z listą wszystkich opublikowanych plików interfejsu HIDL.
# 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
Uwaga: aby ułatwić śledzenie, skąd pochodzą hasze, Google dzieli pliki HIDL current.txt na różne sekcje: pierwsza sekcja to Wydana w Androidzie 8, a następna to Wydana w Androidzie 8 MR1. Zdecydowanie zalecamy użycie podobnego układu w pliku current.txt.
Haszowanie za pomocą hidl-gen
Możesz dodać hasz do pliku current.txt ręcznie lub za pomocą hidl-gen. Ten fragment kodu zawiera przykłady poleceń, których możesz używać z hidl-gen do zarządzania plikiem current.txt (zaszyfrowane wartości zostały skrócone):
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
Ostrzeżenie: nie zastępuj hasha w przypadku wcześniej opublikowanego interfejsu. Podczas zmiany takiego interfejsu dodaj nowy ciąg haszowy na końcu pliku current.txt. Więcej informacji znajdziesz w artykule Stabilność ABI.
Każda biblioteka definicji interfejsu wygenerowana przez hidl-gen zawiera hashe, które można pobrać, wywołując funkcję IBase::getHashChain. Gdy hidl-gen kompiluje interfejs, sprawdza plik current.txt w katalogu głównym pakietu HAL, aby sprawdzić, czy HAL został zmieniony:
- Jeśli nie znajdzie się żadnego hasha dla HAL, interfejs zostanie uznany za nieopublikowany (w trakcie opracowywania) i kompilacja zostanie przeprowadzona.
- Jeśli znajdziemy szyfry, zostaną one sprawdzone w bieżącym interfejsie:- Jeśli interfejs pasuje do hasha, kompilacja jest kontynuowana.
- Jeśli interfejs nie pasuje do hasha, kompilacja zostaje wstrzymana, ponieważ oznacza to, że zmienia się wcześniej opublikowany interfejs.
- W przypadku zmiany, która zachowuje ABI (patrz stabilność ABI), przed rozpoczęciem kompilacji należy zmodyfikować plik current.txt.
- Wszystkie inne zmiany należy wprowadzić w ramach uaktualnienia wersji podrzędnej lub głównej interfejsu.
 
- W przypadku zmiany, która zachowuje ABI (patrz stabilność ABI), przed rozpoczęciem kompilacji należy zmodyfikować plik 
 
stabilność ABI;
Interfejs ABI obejmuje linki binarne, konwencje wywoływania itp. Jeśli interfejs ABI lub API ulegnie zmianie, nie będzie już współpracować z usługą system.img, która została skompilowana z oficjalnymi interfejsami.
Upewnij się, że interfejsy mają wersje, a interfejs ABI jest stabilny. Jest to bardzo ważne z kilku powodów:
- Dzięki temu Twoja implementacja będzie mogła przejść testy dostawcy (VTS), co pozwoli Ci tworzyć OTA tylko dla frameworka.
- Umożliwia to producentom urządzeń OEM udostępnienie pakietu wsparcia płyty głównej (BSP), który jest prosty w użyciu i zgodny z wymaganiami.
- Pomaga śledzić, które interfejsy mogą zostać opublikowane. Rozważ użycie mapy current.txtkatalogu interfejsów, która pozwala zobaczyć historię i stan wszystkich interfejsów udostępnianych w korzenia katalogu pakietu.
Podczas dodawania nowego hasha dla interfejsu, który ma już wpis w pliku current.txt, dodaj tylko te hashe, które reprezentują interfejsy zachowujące stabilność ABI. Zapoznaj się z tymi typami zmian:
| Dozwolone zmiany | 
 | 
|---|---|
| Zmiany niedozwolone | 
 | 
