Schnittstellen-Hashing

Dieses Dokument beschreibt HIDL-Schnittstellen-Hashing, einen Mechanismus, der versehentliche Schnittstellenänderungen verhindert und sicherstellt, dass Schnittstellenänderungen gründlich überprüft werden. Dieser Mechanismus ist erforderlich, da HIDL-Schnittstellen versioniert sind. Dies bedeutet, dass eine Schnittstelle nach der Veröffentlichung nicht mehr geändert werden darf, außer in einer ABI-erhaltenden Weise (z. B. durch eine Kommentarkorrektur).

Layout

Jedes Paketstammverzeichnis (z. B. android.hardware Zuordnung zu hardware/interfaces oder vendor.foo Zuordnung zu vendor/foo/hardware/interfaces ) muss eine current.txt Datei enthalten, die alle veröffentlichten HIDL-Schnittstellendateien auflistet.

# 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

Hinweis: Um den Überblick darüber zu behalten, welche Hashes von wo stammen, unterteilt Google die HIDL-Dateien current.txt in verschiedene Abschnitte: Der erste Abschnitt ist „Released in Android O“ ; Der nächste Abschnitt wird in Android O MR1 veröffentlicht . Wir empfehlen dringend, in Ihrer current.txt Datei ein ähnliches Layout zu verwenden.

Hashing mit Hidl-Gen

Sie können einer current.txt Datei manuell oder mithilfe hidl-gen einen Hash hinzufügen. Der folgende Codeausschnitt enthält Beispiele für Befehle, die Sie mit hidl-gen zum Verwalten einer current.txt Datei verwenden können (Hashes wurden gekürzt):

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::types
9626fd18...f9d298a6 vendor.awesome.nfc@1.0::types
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::INfc
07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc
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
9626fd18...f9d298a6 vendor.awesome.nfc@1.0::types
07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc
f2fe5442...72655de6 vendor.awesome.nfc@1.0::INfcClientCallback
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 >> vendor/awesome/hardware/interfaces/current.txt

Warnung: Ersetzen Sie keinen Hash für eine zuvor veröffentlichte Schnittstelle. Wenn Sie eine solche Schnittstelle ändern, fügen Sie am Ende der current.txt Datei einen neuen Hash hinzu. Einzelheiten finden Sie unter ABI-Stabilität .

Jede von hidl-gen generierte Schnittstellendefinitionsbibliothek enthält Hashes, die durch Aufrufen von IBase::getHashChain abgerufen werden können. Wenn hidl-gen eine Schnittstelle kompiliert, überprüft es die Datei current.txt im Stammverzeichnis des HAL-Pakets, um festzustellen, ob die HAL geändert wurde:

  • Wenn kein Hash für die HAL gefunden wird, gilt die Schnittstelle als unveröffentlicht (in Entwicklung) und die Kompilierung wird fortgesetzt.
  • Wenn Hashes gefunden werden, werden sie mit der aktuellen Schnittstelle verglichen:
    • Wenn die Schnittstelle mit dem Hash übereinstimmt, wird die Kompilierung fortgesetzt.
    • Wenn die Schnittstelle nicht mit einem Hash übereinstimmt, wird die Kompilierung angehalten, da dies bedeutet, dass eine zuvor veröffentlichte Schnittstelle geändert wird.
      • Für eine ABI-erhaltende Änderung (siehe ABI-Stabilität ) muss die Datei current.txt geändert werden, bevor die Kompilierung fortgesetzt werden kann.
      • Alle anderen Änderungen sollten in einem Neben- oder Hauptversions-Upgrade der Schnittstelle vorgenommen werden.

ABI-Stabilität

Eine Application Binary Interface (ABI) umfasst die binären Verknüpfungen/Aufrufkonventionen usw. Wenn sich die ABI/API ändert, funktioniert die Schnittstelle nicht mehr mit einer generischen system.img , die mit offiziellen Schnittstellen kompiliert wurde.

Es ist aus mehreren Gründen von entscheidender Bedeutung , sicherzustellen, dass die Schnittstellen versioniert und ABI stabil sind:

  • Es stellt sicher, dass Ihre Implementierung die Vendor Test Suite (VTS) bestehen kann, was Sie auf den richtigen Weg bringt, reine Framework-OTAs durchzuführen.
  • Als OEM können Sie damit ein Board Support Package (BSP) bereitstellen, das einfach zu verwenden und konform ist.
  • Es hilft Ihnen, den Überblick darüber zu behalten, welche Schnittstellen freigegeben werden können. Betrachten Sie current.txt als eine Karte eines Schnittstellenverzeichnisses, die es Ihnen ermöglicht, den Verlauf und den Status aller Schnittstellen anzuzeigen, die in einem Paketstamm bereitgestellt werden.

Wenn Sie einen neuen Hash für eine Schnittstelle hinzufügen, die bereits über einen Eintrag in current.txt verfügt, stellen Sie sicher, dass Sie nur die Hashes hinzufügen, die Schnittstellen darstellen, die die ABI-Stabilität gewährleisten. Überprüfen Sie die folgenden Arten von Änderungen:

Änderungen erlaubt
  • Einen Kommentar ändern (es sei denn, dies ändert die Bedeutung einer Methode).
  • Den Namen eines Parameters ändern.
  • Den Namen eines Rückgabeparameters ändern.
  • Anmerkungen ändern.
Änderungen nicht zulässig
  • Argumente, Methoden usw. neu anordnen
  • Eine Schnittstelle umbenennen oder in ein neues Paket verschieben.
  • Ein Paket umbenennen.
  • Hinzufügen einer Methode/eines Strukturfelds/usw. an einer beliebigen Stelle in der Schnittstelle.
  • Alles, was eine C++-VTable beschädigen würde.
  • usw..