| BlueZ for Android | |
| ***************** | |
| Since Android 4.2 there exists a well standardized HAL interface that the | |
| Bluetooth stack is expected to provide and which enables the easy replacement | |
| of the stack of choice on Android. Android BlueZ is intended as a drop-in | |
| replacement to Android provided Bluetooth stack. | |
| More details about BlueZ for Android architecture and components can be found | |
| in android/hal-ipc-api.txt file. | |
| Supported Android version: 4.4 KitKat and 5.0, 5.1 Lollipop | |
| Building and running on Android | |
| =============================== | |
| Steps needed to build and run Android Open Source Project with integrated BlueZ. | |
| Build requirements | |
| ------------------ | |
| - GLib - Android 4.2 or later don't provide GLib and one must provide it in | |
| 'external/bluetooth/glib' folder of Android tree. Sample Android GLib port | |
| is available at https://github.com/bluez-android/glib | |
| - SBC - A2DP code requires SBC library (version 1.2 or higher) present in | |
| 'external/bluetooth/sbc' directory. Library is build from Android.mk provided | |
| by BlueZ. SBC code is available at git://git.kernel.org/pub/scm/bluetooth/sbc | |
| - Bionic support - Android 5.0 provides all required functionality. Running | |
| BlueZ on Android 4.4 requires backporting missing features (epoll_create1 and | |
| ppoll calls). Sample Bionic for Android 4.4 with all required features | |
| backported is available at | |
| https://github.com/bluez-android/aosp_platform_bionic | |
| Runtime requirements | |
| -------------------- | |
| BlueZ HAL library requires 'bluetoothd' and 'bluetoothd-snoop' services to be | |
| available on Android system. Some permissions settings are also required. | |
| This can be done by importing init.bluetooth.rc file in init.rc file of targeted | |
| board: | |
| import init.bluetooth.rc | |
| For convenience examples are provided at: | |
| https://github.com/bluez-android/aosp_device_lge_mako (Nexus 4) | |
| https://github.com/bluez-android/aosp_device_lge_hammerhead (Nexus 5) | |
| https://github.com/bluez-android/aosp_device_asus_flo (Nexus 7 2013) | |
| Security-Enhanced Linux in Android | |
| ---------------------------------- | |
| Since 5.0 release Android moved to full enforcement of SELinux. This requires | |
| proper policy to be provided for all BlueZ for Android services (and services | |
| interacting with BlueZ). Policies should be placed in external/selinux/ path. | |
| Required policy files are provided at: | |
| bluetoothd.te | |
| bluetoothd_snoop.te | |
| For convenience sepolicy.git with all required policies is available at: | |
| https://github.com/bluez-android/aosp_platform_external_sepolicy | |
| Downloading and building | |
| ------------------------ | |
| Building for Android requires full Android AOSP source tree. Sample Android tree | |
| with all required components present is available at | |
| https://github.com/bluez-android | |
| This tree provides support for Nexus4 (mako), Nexus 5 (hammerhead) and | |
| Nexus 7 2013 (flo, deb). Tree does not provide binary blobs needed to run | |
| Android on supported devices. Those can be obtained from | |
| https://developers.google.com/android/nexus/drivers. Binary blobs needs to be | |
| unpacked (EULA acceptance required) into 'vendor' directory of Android tree. | |
| Downloading: | |
| Android 5.0 - 'lollipop' branch | |
| Android 4.4 - 'kitkat' branch | |
| repo init -u https://github.com/bluez-android/aosp_platform_manifest \ | |
| -b lollipop | |
| repo sync | |
| Building: | |
| source build/envsetup.sh | |
| lunch aosp_<target>-userdebug | |
| make -j8 | |
| Flashing: | |
| adb reboot bootloader | |
| fastboot flashall -w | |
| After full build is done it is possible to rebuild only BlueZ: | |
| 'cd external/bluetooth/bluez/android/' | |
| 'mm' (or 'mm -B' to force rebuilding of all files) | |
| 'adb sync' to update target device. | |
| Downloading and building for Intel devices | |
| ------------------------------------------ | |
| Sample Android tree with all required components for Intel devices based on | |
| Intel reference image (https://01.org/android-ia) can be reconstructed following | |
| instructions below. | |
| This tree provides support for Dell XPS12, Minnowboard MAX, Intel NUC, | |
| Acer Iconia W700 and other devices mentioned in: | |
| https://01.org/android-ia/guides/devices | |
| Downloading: | |
| repo init -u https://github.com/01org/android-bluez-manifest.git -b android-ia \ | |
| -m topic/bluez | |
| repo sync | |
| Building: | |
| source build/envsetup.sh | |
| lunch haswell_generic-eng | |
| make -j8 | |
| Installing: | |
| Live and Install image is $OUT/live.img | |
| Flash live.img to USB flash and boot from it. More instructions here: | |
| https://01.org/android-ia/guides/developers/build-and-install | |
| Linux Kernel requirements | |
| ------------------------- | |
| BlueZ for Android uses Linux Bluetooth subsystem and it must be enabled in | |
| kernel. Minimal required version of management interface is 1.3. This | |
| corresponds to Linux 3.9 but latest available version is recommended. Other | |
| requirements include UHID and network bridge support. | |
| Following kernel options should be enabled: | |
| CONFIG_BT | |
| CONFIG_BT_RFCOMM | |
| CONFIG_BT_RFCOMM_TTY | |
| CONFIG_BT_BNEP | |
| CONFIG_BT_BNEP_MC_FILTER | |
| CONFIG_BT_BNEP_PROTO_FILTER | |
| CONFIG_BRIDGE | |
| CONFIG_UHID | |
| CONFIG_CRYPTO_CMAC | |
| CONFIG_CRYPTO_USER_API | |
| CONFIG_CRYPTO_USER_API_HASH | |
| CONFIG_CRYPTO_USER_API_SKCIPHER | |
| Also BT chip driver needs to be enabled e.g: | |
| CONFIG_BT_HCIBTUSB | |
| If it is not possible to use new enough Linux kernel one can use updated | |
| bluetooth subsystem from Backports project. More information about Backports can | |
| be found at https://backports.wiki.kernel.org. Sample kernels using backports | |
| for running BlueZ on Android are available at https://github.com/bluez-android. | |
| Running with Valgrind | |
| --------------------- | |
| BlueZ for Android is preconfigured to be easily run under Valgrind memcheck. | |
| Appropriate configuration and required modules are automatically included when | |
| building either userdebug or eng variant of Android platform. | |
| Valgrind can be enabled in runtime by setting "persist.sys.bluetooth.valgrind" | |
| property to either literal "true" or any numeric value >0. For example: | |
| adb root | |
| adb shell setprop persist.sys.bluetooth.valgrind true | |
| After changing property value Bluetooth need to be restarted to apply changes | |
| (this can be done using UI, just disable and enable it again). Property is | |
| persistent, i.e. there's no need to enable Valgrind again after reboot. | |
| It's recommended to have unstripped libglib.so installed which will enable | |
| complete backtraces in Valgrind output. Otherwise, in many cases backtrace | |
| will break at e.g. g_free() function without prior callers. It's possible to | |
| have proper library installed automatically by appropriate entry in Android.mk, | |
| see https://github.com/bluez-android/glib for an example. | |
| When running with valgrind SElinux needs to be set into permissive mode. This | |
| can be done by executing 'setenforce 0' from root shell. | |
| Enabling BlueZ debugs | |
| --------------------- | |
| BlueZ debug logs can be enabled in runtime by setting | |
| "persist.sys.bluetooth.debug" property to either literal "true" or any | |
| numeric value >0. For example: | |
| adb root | |
| adb shell setprop persist.sys.bluetooth.debug 1 | |
| After changing property value Bluetooth needs to be restarted to apply changes. | |
| There is also a possibility to enable mgmt debug logs which also enables debugs | |
| as above. To enable it proceed in the same way as described above but use | |
| system properties called: persist.sys.bluetooth.mgmtdbg | |
| Note: Debugs are only available on NON USER build variants | |
| Customization | |
| ------------- | |
| It is possible to customize BlueZ for Android through Android system properties. | |
| This may include enabling extra profiles or features inside HALs implementation | |
| These properties are read on Bluetooth stack startup only and require stack | |
| restart if changed. All customization properties names start with | |
| "persist.sys.bluetooth." or "ro.bluetooth." followed by specific HAL name e.g. | |
| "persist.sys.bluetooth.handsfree". If both are present "persist.sys.bluetooth." | |
| takes precedence. This allows for read only properties to be set during build | |
| leaving enough flexibility for developing or debugging purposes. | |
| This section list available customization options. | |
| Property Value Description | |
| ------------------------------------------- | |
| mode bredr Enable BlueZ in BR/EDR mode | |
| le Enable BlueZ in LE mode | |
| <none> Enable BlueZ in default mode - enable BR/EDR/LE | |
| if available. | |
| handsfree hfp Enable Handsfree Profile (HFP) with narrowband | |
| speech only | |
| hfp_wbs Enable Handsfree Profile (HFP) with narrowband | |
| and wideband speech support | |
| <none> Don't enable Handsfree Profile (HFP) | |
| vendor <any> Set vendor name in DIS. If not set fallback to | |
| "ro.product.manufacturer". | |
| model <any> Set model name used as default adapter name. | |
| If not set fallback to "ro.product.model". | |
| name <any> Set model number in DIS. If not set fallback to | |
| "ro.product.name". | |
| serialno <any> Set serial number in DIS. If not set fallback to | |
| "ro.serialno". | |
| systemid <uint64> Set system ID in DIS. Hex string encoded uint64. | |
| pnpid <any> PnP information used in DIS and DID profiles. | |
| Required format: "Source:VID:PID:Version". | |
| Source must be either "bluetooth" or "usb". | |
| VID, PID and Version are uint16. Version is | |
| optional. | |
| fwrev <any> Firmware revision in DIS. If not set fallback to | |
| "ro.build.version.release". | |
| hwrew <any> Hardware revision in DIS. If not set fallback to | |
| "ro.board.platform". | |
| Building and running on Linux | |
| ----------------------------- | |
| It is possible to build and test BlueZ for Android daemon on Linux (eg. PC). | |
| Simply follow instructions available at README file in BlueZ top directory. | |
| Android daemon binary is located at android/bluetoothd. See next section on | |
| how to test Android daemon on Linux. | |
| Testing tool | |
| ------------ | |
| BT HAL test tools located in android/haltest is provided for HAL level testing | |
| of both Android daemon and HAL library. Start it with '-n' parameter and type | |
| 'bluetooth init' in prompt to initialize HAL library. Running without parameter | |
| will make haltest try to initialize all services after start. On Android | |
| required bluetoothd service will be started automatically. On Linux it is | |
| required to start android/bluetoothd manually before init command timeout or | |
| use provided android/system-emulator, which takes care of launching daemon | |
| automatically on HAL library initialization. To deinitialize HAL library and | |
| stop daemon type 'bluetooth cleanup'. Type 'help' for more information. Tab | |
| completion is also supported. | |
| Implementation status | |
| ===================== | |
| Summary of HALs implementation status. | |
| complete - implementation is feature complete and Android Framework is able | |
| to use it normally | |
| partial - implementation is in progress and not all required features are | |
| present, Android Framework is able to use some of features | |
| initial - only initial implementations is present, Android Framework is | |
| able to initialize but most likely not able to use it | |
| not started - no implementation, Android Framework is not able to initialize it | |
| Profile ID HAL header 4.4 Status 5.0 status | |
| ------------------------------------------------------------- | |
| core bluetooth.h complete partial | |
| a2dp bt_av.h complete complete | |
| gatt bt_gatt.h complete partial | |
| bt_gatt_client.h complete partial | |
| bt_gatt_server.h complete partial | |
| handsfree bt_hf.h complete complete | |
| hidhost bt_hh.h complete complete | |
| health bt_hl.h complete complete | |
| pan bt_pan.h complete complete | |
| avrcp bt_rc.h complete complete | |
| socket bt_sock.h complete partial | |
| handsfree_client bt_hf_client.h N/A complete | |
| map_client bt_mce.h N/A complete | |
| a2dp_sink bt_av.h N/A partial | |
| avrcp_ctrl bt_rc.h N/A partial | |
| Implementation shortcomings | |
| =========================== | |
| It is possible that some of HAL functionality (although being marked as | |
| complete) is missing implementation due to reasons like feature feasibility or | |
| necessity for latest Android Framework. This sections provides list of such | |
| deficiencies. Note that HAL library is always expected to fully implement HAL | |
| API so missing implementation might happen only in daemon. | |
| HAL Bluetooth | |
| ------------- | |
| methods: | |
| dut_mode_send never called from Android Framework | |
| le_test_mode never called from Android Framework | |
| callbacks: | |
| dut_mode_recv_cb empty JNI implementation | |
| le_test_mode_cb empty JNI implementation | |
| properties: | |
| BT_PROPERTY_SERVICE_RECORD not supported for adapter, for device this | |
| property is returned as a response to | |
| get_remote_service_record call | |
| BT_PROPERTY_REMOTE_VERSION_INFO information required by this property (LMP | |
| information) are not accessible from mgmt | |
| interface, also marking this property as | |
| settable is probably a typo in HAL header | |
| HAL Socket | |
| ---------- | |
| Support only for BTSOCK_RFCOMM socket type. | |
| HAL AVRCP | |
| --------- | |
| methods: | |
| list_player_app_attr_rsp never called from Android Framework | |
| list_player_app_value_rsp never called from Android Framework | |
| get_player_app_value_rsp never called from Android Framework | |
| get_player_app_attr_text_rsp never called from Android Framework | |
| get_player_app_value_text_rsp never called from Android Framework | |
| set_player_app_value_rsp never called from Android Framework | |
| callbacks: | |
| list_player_app_attr_cb NULL JNI implementation | |
| list_player_app_values_cb NULL JNI implementation | |
| get_player_app_value_cb NULL JNI implementation | |
| get_player_app_attrs_text_cb NULL JNI implementation | |
| get_player_app_values_text_cb NULL JNI implementation | |
| set_player_app_value_cb NULL JNI implementation | |
| HAL GATT | |
| -------- | |
| methods: | |
| client->set_adv_data missing kernel support for vendor data | |
| client->connect is_direct parameter is ignored | |
| Audio SCO HAL | |
| ============= | |
| When Bluetooth chip's audio is not wired directly to device audio, Audio SCO | |
| HAL is used to enable SCO support. It needs to be loaded by AudioFlinger | |
| following audio_policy.conf configuration. Example of configuration is shown | |
| below: | |
| ... | |
| sco { | |
| outputs { | |
| sco { | |
| sampling_rates 8000|44100 | |
| channel_masks AUDIO_CHANNEL_OUT_STEREO | |
| formats AUDIO_FORMAT_PCM_16_BIT | |
| devices AUDIO_DEVICE_OUT_ALL_SCO | |
| } | |
| } | |
| inputs { | |
| sco { | |
| sampling_rates 8000|44100 | |
| channel_masks AUDIO_CHANNEL_IN_MONO | |
| formats AUDIO_FORMAT_PCM_16_BIT | |
| devices AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET | |
| } | |
| } | |
| } | |
| ... | |
| Known Android issues | |
| ==================== | |
| It is possible that BlueZ is triggering bugs on Android Framework that could | |
| affect qualification or user experience. This section provides list of | |
| recommended Android fixes that are not part of latest AOSP release supported by | |
| BlueZ. | |
| For Android 5.1 Lollipop: | |
| https://android-review.googlesource.com/177314 | |
| For Android 5.0 Lollipop: | |
| https://android-review.googlesource.com/99761 | |
| https://android-review.googlesource.com/100297 | |
| https://android-review.googlesource.com/102882 | |
| https://android-review.googlesource.com/132733 | |
| https://android-review.googlesource.com/132763 | |
| https://android-review.googlesource.com/177314 | |
| For Android 4.4 KitKat: | |
| https://android-review.googlesource.com/82757 | |
| https://android-review.googlesource.com/87670 | |
| https://android-review.googlesource.com/88384 | |
| https://android-review.googlesource.com/99761 | |
| https://android-review.googlesource.com/99850 | |
| https://android-review.googlesource.com/100297 | |
| https://android-review.googlesource.com/102882 | |
| https://android-review.googlesource.com/177314 | |
| Unimplemented Bluetooth features | |
| ================================ | |
| Some Bluetooth functionality require support from outside of BT stack | |
| eg. telephony stack. This sections describes profiles optional features not | |
| implemented due to lack of support in other Android subsystems or missing API | |
| in respective BT HALs. | |
| Profile Feature Comments | |
| -------------------------------------------------------- | |
| HFP Attach a phone number to AT+BINP=1 | |
| a voice tag | |
| HFP Enhanced Call Control AT+CHLD={1x,2x} | |
| HFP Explicit Call Transfer AT+CHLD=4 | |
| HFP Response and Hold AT+BTRH, +BTRH | |
| HFP In-band Ring Tone +BSIR | |
| AVRCP Player Settings HAL API present but not used | |
| AVRCP Browsing No HAL API | |
| GATT Read multiple characteristics No HAL API | |
| Reporting Bugs | |
| ============== | |
| Bugs should be reported at https://01.org/jira/browse/BA. When reporting | |
| a bug please attach logs from logcat (logcat -v time) and HCI trace. Daemon | |
| debug logs should be enabled. When reporting daemon crash please run it under | |
| valgrind if possible. For details on how to enabled debug logs and valgrind see | |
| "Enabling BlueZ debugs" section. |