blob: 1c17b692d24595b33db64bb7bd24f27679d35991 [file] [log] [blame]
<html devsite><head>
<title>蓝牙</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.
-->
<img style="float: right; margin: 0px 15px 15px 15px;" src="/devices/bluetooth/images/ape_fwk_hal_bluetooth.png" alt="Android 蓝牙 HAL 图标"/>
<p>
Android 提供支持经典蓝牙和蓝牙低功耗的默认蓝牙堆栈。借助蓝牙,Android 设备可以创建个人区域网络,以便通过附近的蓝牙设备发送和接收数据。
</p>
<p>
在 Android 4.3 及更高版本中,Android 蓝牙堆栈可提供实现蓝牙低功耗 (BLE) 的功能。要充分利用 BLE API,请遵循 <a href="/devices/bluetooth/hci_requirements.html">Android 蓝牙 HCI 要求</a>。具有合格芯片组的 Android 设备可以实现经典蓝牙或同时实现经典蓝牙和 BLE。BLE 不能向后兼容较旧版本的蓝牙芯片组。
</p>
<p>
在 Android 8.0 中,原生蓝牙堆栈完全符合蓝牙 5 的要求。要使用可用的蓝牙 5 功能,该设备需要具有符合蓝牙 5 要求的芯片组。
</p>
<aside class="note"><strong>注意</strong>:Android 8.0 及以前版本之间的原生蓝牙堆栈的最大变化是使用<a href="/devices/architecture/treble.html">高音</a>。Android 8.0 中的供应商实现必须使用 HIDL 而不是 <code>libbt-vendor</code></aside>
<h2 id="architecture-android-80">Android 8.0 架构</h2>
<p>
蓝牙应用通过 Binder 与蓝牙进程进行通信。蓝牙进程使用 JNI 与蓝牙堆栈通信,并向开发者提供对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构:
</p>
<img src="/devices/bluetooth/images/fluoride_architecture.png" alt="Android 8.0 蓝牙架构" id="figure1"/>
<p class="img-caption">
<strong>图 1</strong> Android 8.0 蓝牙架构
</p>
<dl>
<dt>应用框架</dt>
<dd>
处于应用框架级别的是应用代码,它使用 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> API 与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。
</dd>
<dt>蓝牙系统服务</dt>
<dd>
蓝牙系统服务(位于 <code>packages/apps/Bluetooth</code> 中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。此应用通过 JNI 调用原生蓝牙堆栈。</dd>
<dt>JNI</dt>
<dd>
与 android.bluetooth 相关联的 JNI 代码位于 <code>packages/apps/Bluetooth/jni</code> 中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用蓝牙堆栈。
</dd>
<dt>蓝牙堆栈</dt>
<dd>
系统在 AOSP 中提供了默认蓝牙堆栈,它位于 <code>system/bt</code> 中。该堆栈会实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。
</dd>
<dt>供应商实现</dt>
<dd>
供应商设备使用硬件接口设计语言 (HIDL) 与蓝牙堆栈交互。
</dd>
</dl>
<h3 id="hidl">HIDL</h3>
<p>
<a href="/devices/architecture/hidl.html">HIDL</a> 定义了蓝牙堆栈和供应商实现之间的接口。要生成蓝牙 HIDL 文件,请将蓝牙接口文件传递到 HIDL 生成工具中。接口文件位于 <code>hardware/interfaces/bluetooth</code> 下。
</p>
<h3 id="bluetooth-stack-development">蓝牙堆栈开发</h3>
<p>
Android 8.0 蓝牙堆栈是一个完全限定的蓝牙堆栈。限定列表位于蓝牙 SIG 网站上的 <a href="https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=35890">QDID 97584</a> 下。
</p>
<p>
核心蓝牙堆栈位于 <code><a href="https://android.googlesource.com/platform/system/bt/+/master">
system/bt</a></code> 下。开发工作在 AOSP 中进行,欢迎贡献内容。
</p>
<h2 id="architecture-android-7x-and-earlier">Android 7.x 及更早版本的架构</h2>
<p>蓝牙系统服务通过 JNI 与蓝牙堆栈进行通信,并通过 Binder IPC 与应用通信。系统服务向开发者提供了对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构:
</p>
<img src="/devices/bluetooth/images/ape_fwk_bluetooth.png" alt="Android 蓝牙架构" id="figure2"/>
<p class="img-caption">
<strong>图 2.</strong> Android 7.x 及更早版本的蓝牙架构
</p>
<dl>
<dt>应用框架</dt>
<dd>处于应用框架级别的是应用代码,它利用 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> API 与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。
</dd>
<dt>蓝牙系统服务</dt>
<dd>蓝牙系统服务(位于 <code>packages/apps/Bluetooth</code> 中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。
该应用通过 JNI 调用 HAL 层。
</dd>
<dt>JNI</dt>
<dd><a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> 相关联的 JNI 代码位于 <code>packages/apps/Bluetooth/jni</code> 中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用 HAL 层并从 HAL 接收回调。
</dd>
<dt>HAL</dt>
<dd>硬件抽象层定义了 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> API 和蓝牙进程会调用的标准接口,并且您必须实现该接口才能使蓝牙硬件正常工作。蓝牙 HAL 的头文件是 <code>hardware/libhardware/include/hardware/bluetooth.h</code>
另外,请查看所有 <code>hardware/libhardware/include/hardware/bt_*.h</code> 文件。
</dd>
<dt>蓝牙堆栈</dt>
<dd>系统为您提供了默认蓝牙堆栈(位于 <code>system/bt</code> 中)。该堆栈会实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。
</dd>
<dt>供应商扩展程序</dt>
<dd>要添加自定义扩展程序和用于跟踪的 HCI 层,您可以创建一个 libbt-vendor 模块并指定这些组件。
</dd>
</dl>
<h3 id="implementing-the-hal">实现 HAL</h3>
<p>蓝牙 HAL 位于 <code>/hardware/libhardware/include/hardware/bluetooth.h</code> 中。
<code>bluetooth.h</code> 文件包含蓝牙堆栈的基本接口,而且您必须实现其功能。</p>
<p>特定于配置文件的文件位于同一目录下。有关详情,请参阅 <a href="/reference/hal/dir_6b11132f1a015b03f2670f21bef1d871.html">HAL 文件参考</a>
</p>
</body></html>