Schnittstellen-Hashing

In diesem Dokument wird das HIDL-Schnittstellen-Hashing beschrieben, ein Mechanismus, unbeabsichtigte Änderungen der Benutzeroberfläche vornehmen und sicherstellen, dass Änderungen der Benutzeroberfläche gründlich überprüft werden. Dieser Mechanismus ist erforderlich, da HIDL-Schnittstellen versioniert sind, was bedeutet, dass eine Schnittstelle nach der Veröffentlichung nicht mehr geändert werden darf, außer in einem Anwendung binary Interface (ABI) erhalten (z. B. in einem Kommentar Korrektur)

Layout

Jedes Paketstammverzeichnis (d.h. die android.hardware-Zuordnung zu Zuordnung von hardware/interfaces oder vendor.foo zu vendor/foo/hardware/interfaces) muss ein current.txt-Datei, in der alle veröffentlichten HIDL-Schnittstellendateien aufgeführt sind.

# 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:Damit Sie besser im Auge behalten können, welche Hashes wo HIDL current.txt-Dateien von Google in verschiedene Abschnitten: Der erste Abschnitt stammt in Android 8 veröffentlicht. zum nächsten Abschnitt werden in Android 8 MR1 veröffentlicht. Wir empfehlen dringend die Verwendung eines ähnliches Layout in der Datei current.txt.

Hash mit „hidl-gen“

Sie können einer current.txt-Datei manuell oder folgendermaßen einen Hash hinzufügen: mit hidl-gen. Das folgende Code-Snippet enthält Beispiele für Befehle, mit denen Sie mit hidl-gen Folgendes verwalten können: current.txt-Datei (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 nicht den Hashwert für für die zuvor veröffentlichte Benutzeroberfläche. Wenn Sie eine solche Schnittstelle ändern, fügen Sie einen neuen Hashwert am Ende der Datei current.txt hinzu. Weitere Informationen finden Sie unter ABI-Stabilität:

Jede von hidl-gen generierte Schnittstellendefinitionsbibliothek enthält Hashes, die durch Aufrufen von IBase::getHashChain. Wenn hidl-gen ein wird die Datei current.txt im Stammverzeichnis des das HAL-Paket, um zu sehen, ob der HAL geändert wurde:

  • Wenn kein Hash für den HAL gefunden wird, gilt die Schnittstelle als nicht freigegeben (in Entwicklung) und die Kompilierung.
  • Wenn Hashes gefunden werden, werden sie mit der aktuellen Schnittstelle abgeglichen: <ph type="x-smartling-placeholder">
      </ph>
    • Wenn die Schnittstelle mit dem Hash übereinstimmt, wird die Kompilierung fortgesetzt.
    • Wenn die Schnittstelle nicht mit einem Hash übereinstimmt, wird die Kompilierung angehalten, da eine zuvor veröffentlichte Schnittstelle geändert wird.
      • Für eine ABI-erhaltende Änderung (siehe ABI-Stabilität), die Datei current.txt muss geändert werden, bevor die Kompilierung fortgesetzt werden kann.
      • Alle anderen Änderungen sollten in einem Neben- oder Hauptversions-Upgrade des .

ABI-Stabilität

Ein ABI enthält das Binärprogramm Verknüpfungen/Aufrufkonventionen/usw. Wenn sich das ABI oder die API ändert, funktioniert länger mit einer generischen system.img, die mit offiziellen Benutzeroberflächen.

Sicherstellen, dass Schnittstellen versioniert sind und ABI stabil ist aus verschiedenen Gründen wichtig:

  • Es stellt sicher, dass Ihre Implementierung die Vendor Test Suite (VTS) bestehen kann, die bringt dich auf den besten Weg, exklusive Framework-OTAs zu erstellen.
  • Als OEM können Sie ein Board Support Package (BSP) bereitstellen, einfach zu verwenden und konform sind.
  • Es hilft Ihnen dabei, den Überblick darüber zu behalten, welche Oberflächen freigegeben werden können. Erwägen Sie current.txt ist eine Zuordnung eines Interfaces-Verzeichnisses, in dem Sie Folgendes sehen können: Verlauf und Status aller Schnittstellen, die in einem Stammpaket bereitgestellt werden.

Wenn Sie einen neuen Hash für eine Schnittstelle hinzufügen, die bereits einen Eintrag in current.txt, achten Sie darauf, nur die Hashes hinzuzufügen, die für die die ABI-Stabilität aufrechterhalten. Überprüfen Sie die folgenden Arten von Änderungen:

Änderungen zugelassen
  • Änderung eines Kommentars (es sei denn, dadurch ändert sich die Bedeutung einer Methode).
  • Ändern des Namens eines Parameters.
  • Ändern des Namens eines Rückgabeparameters.
  • Anmerkungen ändern
Änderungen nicht zulässig
  • Argumente, Methoden usw. neu ordnen
  • Schnittstelle umbenennen oder in ein neues Paket verschieben
  • Paket umbenennen
  • Hinzufügen eines method/struct-Felds/usw. irgendwo auf der Benutzeroberfläche.
  • Alles, was eine C++ Vtable zerstören würde.
  • usw.