|  | 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. |