aboutsummaryrefslogtreecommitdiff
path: root/en/devices/architecture/hidl/hashing.html
diff options
context:
space:
mode:
Diffstat (limited to 'en/devices/architecture/hidl/hashing.html')
-rw-r--r--en/devices/architecture/hidl/hashing.html165
1 files changed, 165 insertions, 0 deletions
diff --git a/en/devices/architecture/hidl/hashing.html b/en/devices/architecture/hidl/hashing.html
new file mode 100644
index 00000000..e083fd4c
--- /dev/null
+++ b/en/devices/architecture/hidl/hashing.html
@@ -0,0 +1,165 @@
+<html devsite>
+ <head>
+ <title>Interface Hashing</title>
+ <meta name="project_path" value="/_project.yaml" />
+ <meta name="book_path" value="/_book.yaml" />
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>This document describes HIDL interface hashing, a mechanism to prevent
+accidental interface changes and ensure interface changes are thoroughly vetted.
+This mechanism is required because HIDL interfaces are versioned, which means
+that after an interface is released it must not be changed except in an
+Application Binary Interface (ABI) preserving manner (such as a comment
+correction).</p>
+
+<h2 id=layout>Layout</h2>
+<p>Every package root directory (i.e. <code>android.hardware</code> mapping to
+<code>hardware/interfaces</code> or <code>vendor.foo</code> mapping to
+<code>vendor/foo/hardware/interfaces</code>) must contain a
+<code>current.txt</code> file that lists all released HIDL interface files.</p>
+
+<pre class="prettyprint">
+# 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 types.hal 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
+</pre>
+
+<p class=note><strong>Note:</strong> To help keep track of which hashes come
+from where, Google separates HIDL <code>current.txt</code> files into different
+sections: The first section is <em>Released in Android O</em>; the next section
+will be <em>Released in Android O MR1</em>. We strongly recommend using a
+similar layout in your <code>current.txt</code> file.</p>
+
+<h2 id=hidl-gen>Hashing with hidl-gen</h2>
+<p>You can add a hash to a <code>current.txt</code> file manually or by
+using <code>hidl-gen</code>. The following code snippet provides examples of
+commands you can use with <code>hidl-gen</code> to manage a
+<code>current.txt</code> file (hashes have been shortened):</p>
+
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">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</code>
+9626fd18...f9d298a6 vendor.awesome.nfc@1.0::types
+<code class="devsite-terminal">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</code>
+07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc
+<code class="devsite-terminal">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</code>
+9626fd18...f9d298a6 vendor.awesome.nfc@1.0::types
+07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc
+f2fe5442...72655de6 vendor.awesome.nfc@1.0::INfcClientCallback
+<code class="devsite-terminal">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 &gt;&gt; vendor/awesome/hardware/interfaces/current.txt</code>
+</pre>
+
+<p class="warning"><strong>Warning:</strong> Do not replace a hash for a
+previously-released interface. When changing such an interface, add a new hash
+to the end of the <code>current.txt</code> file. For details, refer to
+<a href="#abi-stability">ABI stability</a>.</p>
+
+<p>Every interface definition library generated by <code>hidl-gen</code>
+includes hashes, which can be retrieved by calling
+<code>IBase::getHashChain</code>. When <code>hidl-gen</code> is compiling an
+interface, it checks the <code>current.txt</code> file in the root directory of
+the HAL package to see if the HAL has been changed:</p>
+
+<ul>
+<li>If no hash for the HAL is found, the interface is considered unreleased (in
+development) and compilation proceeds.</li>
+<li>If hashes are found, they are checked against the current interface:
+<ul>
+<li>If the interface does match the hash, compilation proceeds.</li>
+<li>If the interface does not match a hash, compilation is halted as this means a previously-released interface is being changed.
+<ul>
+<li>For an ABI-preserving change (see
+<a href="#abi-stability">ABI stability</a>), the <code>current.txt</code> file
+must be modified before compilation can proceed.</li>
+<li>All other changes should be made in a minor or major version upgrade of the
+interface.</li>
+</ul></li></ul></li></ul>
+
+<h2 id=abi-stability>ABI stability</h2>
+<aside class="key-point"><strong>Key Point:</strong> Please read and understand
+this section carefully.</aside>
+
+<p>An Application Binary Interface (ABI) includes the binary
+linkages/calling conventions/etc. If the ABI/API changes, the interface no
+longer works with a generic <code>system.img</code> that was compiled with
+official interfaces.</p>
+
+<p>Making sure that interfaces are versioned and ABI stable is
+<strong>crucial</strong> for several reasons:</p>
+
+<ul>
+<li>It ensures your implementation can pass the Vendor Test Suite (VTS), which
+puts you on track to being able to do framework-only OTAs.</li>
+<li>As an OEM, it enables you to provide a Board Support Package (BSP) that is
+straightforward to use and compliant.</li>
+<li>It helps you keep track of what interfaces can be released. Consider
+<code>current.txt</code> a map of an interfaces directory that allows you to see
+the history and state of all interfaces being provided in a package root.</li>
+</ul>
+
+<p>When adding a new hash for an interface that already has an entry in
+<code>current.txt</code>, make sure to add only the hashes that represent
+interfaces which maintain ABI stability. Review the following types of changes:
+</p>
+
+<table>
+<tbody>
+
+<tr>
+<th>Changes allowed</th>
+<td>
+<ul>
+<li>Changing a comment (unless this changes the meaning of a method).</li>
+<li>Changing the name of a parameter.</li>
+<li>Changing the name of a return parameter.</li>
+<li>Changing annotations.</li>
+</ul>
+</td>
+</tr>
+
+<tr>
+<th>Changes not allowed</th>
+<td>
+<ul>
+<li>Reordering arguments, methods, etc…</li>
+<li>Adding a method/struct field/etc… anywhere in the interface.</li>
+<li>Anything that would break a C++ vtable.</li>
+<li>etc..</li>
+</ul>
+</td>
+</tr>
+
+</tbody>
+</table>
+
+ </body>
+</html>