Android蓝牙架构,源文件目录/编译方式学习

|----------------|-------------|--------------------|
| Android 版本 | 发布时间 | 代号(Codename) |
| Android 1.0 | 2008年9月23日 | 无 |
| Android 1.1 | 2009年2月9日 | Petit Four |
| Android 1.5 | 2009年4月27日 | Cupcake |
| Android 1.6 | 2009年9月15日 | Donut |
| Android 2.0 | 2009年10月26日 | Eclair |
| Android 2.1 | 2010年1月12日 | Eclair |
| Android 2.2 | 2010年5月20日 | Froyo |
| Android 2.3 | 2010年12月6日 | Gingerbread |
| Android 3.0 | 2011年2月22日 | Honeycomb |
| Android 4.0 | 2011年10月18日 | Ice Cream Sandwich |
| Android 4.1 | 2012年7月9日 | Jelly Bean |
| Android 4.2 | 2012年11月13日 | Jelly Bean |
| Android 4.3 | 2013年7月24日 | Jelly Bean |
| Android 4.4 | 2013年10月31日 | KitKat |
| Android 5.0 | 2014年11月12日 | Lollipop |
| Android 5.1 | 2015年3月9日 | Lollipop |
| Android 6.0 | 2015年10月5日 | Marshmallow |
| Android 7.0 | 2016年8月22日 | Nougat |
| Android 7.1 | 2016年10月4日 | Nougat |
| Android 8.0 | 2017年8月21日 | Oreo |
| Android 8.1 | 2017年12月5日 | Oreo |
| Android 9.0 | 2018年8月6日 | Pie |
| Android 10 | 2019年9月3日 | 无(开始使用数字版本) |
| Android 11 | 2020年9月8日 | 无 |
| Android 12 | 2021年10月4日 | 无 |
| Android 13 | 2022年8月15日 | 无 |
| Android 14 | 2023年10月4日 | 无 |

零. 前言

由于Bluedroid的介绍文档有限,以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等),加上需要掌握的语言包括Java/C/C++等,加上网络上其实没有一个完整的介绍Bluedroid系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluedroid做一个系统性的介绍,尽可能的涵盖所有内容。


蓝牙视频教程(跟韦东山老师合作), 其中专题21就是专门针对Bluedroid做的系统介绍

https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.20.5aeb41f98e267j&id=693788592796


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/143818386

我们只分析下Android 7~14的版本架构,由于以前的Android版本太旧了,我们过多的分析也没有多大的意义,而为什么要分从Android7开始分析呢,主要有两个原因:

1)Android7 是最后一个在协议栈部分保留C语言的版本

2)Android8 后开始引用hidl架构,Android7是最后一个保留vendor用so形式存在的版本

给大家介绍一个android在线观看代码的链接:

http://www.aospxref.com/

XRefAndroid - Support Android 15.0 & Open Harmony 5.0

其中看Android代码比较好的工具有:Android Studio/VSCode等,看个人习惯

学习android蓝牙需要你掌握的技能有:

  • Jave/C/C++编程语言
  • Android UI 4大组件
  • Binder通信
  • 蓝牙理论基础

一. Android 7架构

我们首先来看下Android7中的蓝牙架构,如下图:

可以看到Android蓝牙一共分为几层:

  • APPLICATION FRAMEWORK
  • BLUETOOTH PROCESS
  • JNI
  • BLUETOOTH STACK
  • Vendor Externsions

1.APPLICATION FRAMEWORK

framework的service

路径:

蓝牙的framework 路径如下:/frameworks/base/services/core/java/com/android/server/

编译方式:

make services

路径:

android原生的设置apk路径如下:packages\apps\Settings

蓝牙的framework 路径如下:frameworks\base\core\java\android\bluetooth

NOTED: Android原生用蓝牙的apk是setting apk,如果你自己编写apk,不再讨论范围内

作用:

编译方式:

make Settings

清除:

make clean-Settings

生成内容:

out/target/product/rk3399_roc_pc_plus/product/priv-app/Settings/Settings.apk

**NOTED:**编译Setting需要在系统中编译或者需要额外签名

开发板位置:

/product/priv-app/Settings/Settings.apk

push方法:

adb push rk3399/rk3399_Android10.0/rk3399_Android10.0/out/target/product/rk3399_roc_pc_plus/product/priv-app/Settings/Settings.apk /product/priv-app/Settings/

2.BLUETOOTH PROCESS

**作用:**蓝牙internal apk,是一个service,对上通过binder跟framework api沟通,对下通过jni跟bluedroid蓝牙协议栈沟通

**路径:**packages\apps\Bluetooth

编译方式:

根目录下:

make Bluetooth

清除:

make clean-Bluetooth

生成内容:

out/target/product/rk3399_roc_pc_plus/system/app/Bluetooth/Bluetooth.apk

**NOTED:**编译Setting需要在系统中编译或者需要额外签名

开发板位置:

/system/app/Bluetooth/Bluetooth.apk

push方法:

adb push rk3399/rk3399_Android10.0/rk3399_Android10.0/out/target/product/rk3399_roc_pc_plus/system/app/Bluetooth/Bluetooth.apk /system/app/Bluetooth/

3.JNI

**作用:**这个是蓝牙的jni库,编译在Bluetooth.apk中,主要通过jni跟底层的bluedroid蓝牙协议栈沟通

路径:packages\apps\Bluetooth\jni

编译方式:

make libbluetooth_jni

清除:

make clean-libbluetooth_jni

生成内容:

out/target/product/rk3399_roc_pc_plus/system/lib64/libbluetooth_jni.so

开发板位置:

/system/lib64/libbluetooth_jni.so

/system/app/Bluetooth/lib/arm64/libbluetooth_jni.so

虽然开发板中有两个位置,但是/system/app/Bluetooth/lib/arm64/libbluetooth_jni.so是一个软连接,所以真实的so还是在/system/lib64/libbluetooth_jni.so

push方法:

adb push rk3399/rk3399_Android10.0/rk3399_Android10.0/out/target/product/rk3399_roc_pc_plus/system/lib64/libbluetooth_jni.so /system/lib64/

4.BLUETOOTH STACK

**作用:**Android蓝牙Host本身,也就是蓝牙协议栈的主体

**路径:**system\bt

编译方式:

make libbluetooth

清除:

make clean-libbluetooth

生成内容:

out/target/product/rk3399_roc_pc_plus/system/lib64/libbluetooth.so

开发板位置:

/system/lib64/libbluetooth.so

/system/lib/libbluetooth.so

NOTED:要根据开发板是32位还是64位,分别push到特定的目录下

push方法:

adb push rk3399/rk3399_Android10.0/rk3399_Android10.0/out/target/product/rk3399_roc_pc_plus/system/lib64/libbluetooth.so /system/lib64/

补充:

协议栈有配置文件

/etc/bluetooth/bt_stack.conf

/etc/bluetooth/bt_did.conf

5.VENDOR IMPLEMENTATAION

**作用:**特定芯片厂商的vendor部分,Android把特定常用的操作,比如power控制,下载固件,sco等行为抽象出来,用so的方式来达到切换的效果

**路径:**hardware\broadcom\libbt

如果是其他厂商的蓝牙,那么就是hardware\vendor_xxx\xxx_bt

编译方式:

make libbt-vendor

清除:

make clean-libbt-vendor

生成内容:

out/target/product/rk3399_roc_pc_plus/vendor/lib64/libbt-vendor.so

开发板位置:

/vendor/lib64/libbt-vendor.so

/vendor/lib/libbt-vendor.so

NOTED:要根据开发板是32位还是64位,分别push到特定的目录下

push方法:

adb push rk3399/rk3399_Android10.0/rk3399_Android10.0/

out/target/product/rk3399_roc_pc_plus/vendor/lib64/libbt-vendor.so /vendor/lib64/

补充:

bcm有vendor配置文件,具体路径在/vendor/etc/bluetooth/bt_vendor.conf

另外查看bt_vendor.conf可以查看到串口名称以及fw路径

二. Android 8-12蓝牙架构图

可以看到Android蓝牙一共分为几层:

  • APPLICATION FRAMEWORK
  • BLUETOOTH PROCESS
  • JNI
  • BLUETOOTH STACK
  • HIDL INTERFACES
  • VENDOR IMPLEMENTATAION

生成内容路径以rk3399举例,在更新的过程中会遇到这个问题,解决方式是:

root access is disabled by system setting - enable in settings -> development options

在开发者选项中选择Apps and ADB

然后每次push之前记得

adb root

adb remount

1.APPLICATION FRAMEWORK

framework的service

路径:

蓝牙的framework 路径如下:/frameworks/base/services/core/java/com/android/server/

编译方式:

make services

生成内容:

./out/target/product/evk_8mp_car/system/framework/oat/arm64/services.odex

开发板位置:

./system/framework/oat/arm64/services.odex

路径:

android原生的设置apk路径如下:packages\apps\Settings

蓝牙的framework 路径如下:frameworks\base\core\java\android\bluetooth

NOTED: Android原生用蓝牙的apk是setting apk,如果你自己编写apk,不再讨论范围内

作用:

编译方式:

make Settings

清除:

make clean-Settings

生成内容:

out/target/product/rk3399_roc_pc_plus/product/priv-app/Settings/Settings.apk

**NOTED:**编译Setting需要在系统中编译或者需要额外签名

开发板位置:

/product/priv-app/Settings/Settings.apk

push方法:

adb push rk3399/rk3399_Android10.0/rk3399_Android10.0/out/target/product/rk3399_roc_pc_plus/product/priv-app/Settings/Settings.apk /product/priv-app/Settings/

2.BLUETOOTH PROCESS

**作用:**蓝牙internal apk,是一个service,对上通过binder跟framework api沟通,对下通过jni跟bluedroid蓝牙协议栈沟通

**路径:**packages\apps\Bluetooth

编译方式:

根目录下:

make Bluetooth

清除:

make clean-Bluetooth

生成内容:

out/target/product/rk3399_roc_pc_plus/system/app/Bluetooth/Bluetooth.apk

**NOTED:**编译Setting需要在系统中编译或者需要额外签名

开发板位置:

/system/app/Bluetooth/Bluetooth.apk

push方法:

adb push rk3399/rk3399_Android10.0/rk3399_Android10.0/out/target/product/rk3399_roc_pc_plus/system/app/Bluetooth/Bluetooth.apk /system/app/Bluetooth/

3.JNI

**作用:**这个是蓝牙的jni库,编译在Bluetooth.apk中,主要通过jni跟底层的bluedroid蓝牙协议栈沟通

路径:packages\apps\Bluetooth\jni

编译方式:

make libbluetooth_jni

清除:

make clean-libbluetooth_jni

生成内容:

out/target/product/rk3399_roc_pc_plus/system/lib64/libbluetooth_jni.so

开发板位置:

/system/lib64/libbluetooth_jni.so

/system/app/Bluetooth/lib/arm64/libbluetooth_jni.so

虽然开发板中有两个位置,但是/system/app/Bluetooth/lib/arm64/libbluetooth_jni.so是一个软连接,所以真实的so还是在/system/lib64/libbluetooth_jni.so

push方法:

adb push rk3399/rk3399_Android10.0/rk3399_Android10.0/out/target/product/rk3399_roc_pc_plus/system/lib64/libbluetooth_jni.so /system/lib64/

4.BLUETOOTH STACK

**作用:**Android蓝牙Host本身,也就是蓝牙协议栈的主体

**路径:**system\bt

编译方式:

make libbluetooth

清除:

make clean-libbluetooth

生成内容:

out/target/product/rk3399_roc_pc_plus/system/lib64/libbluetooth.so

开发板位置:

/system/lib64/libbluetooth.so

/system/lib/libbluetooth.so

NOTED:要根据开发板是32位还是64位,分别push到特定的目录下

push方法:

adb push rk3399/rk3399_Android10.0/rk3399_Android10.0/out/target/product/rk3399_roc_pc_plus/system/lib64/libbluetooth.so /system/lib64/

补充:

协议栈有配置文件

/etc/bluetooth/bt_stack.conf

/etc/bluetooth/bt_did.conf

5.HIDL INTERFACES

**作用:**里面有几个作用,第一个是audio相关的,一个是uart相关的

**路径:**hardware\interfaces\bluetooth

编译方式:

make android.hardware.bluetooth@1.0-impl

清除:

make clean-android.hardware.bluetooth@1.0-impl

生成内容:

out/target/product/rk3399_roc_pc_plus/obj/SHARED_LIBRARIES/android.hardware.bluetooth@1.0-impl_intermediates/android.hardware.bluetooth@1.0-impl.so

6.VENDOR IMPLEMENTATAION

**作用:**特定芯片厂商的vendor部分,Android把特定常用的操作,比如power控制,下载固件,sco等行为抽象出来,用so的方式来达到切换的效果

**路径:**hardware\broadcom\libbt

如果是其他厂商的蓝牙,那么就是hardware\vendor_xxx\xxx_bt

编译方式:

make libbt-vendor

清除:

make clean-libbt-vendor

生成内容:

out/target/product/rk3399_roc_pc_plus/vendor/lib64/libbt-vendor.so

开发板位置:

/vendor/lib64/libbt-vendor.so

/vendor/lib/libbt-vendor.so

NOTED:要根据开发板是32位还是64位,分别push到特定的目录下

push方法:

adb push rk3399/rk3399_Android10.0/rk3399_Android10.0/

out/target/product/rk3399_roc_pc_plus/vendor/lib64/libbt-vendor.so /vendor/lib64/

补充:

bcm有vendor配置文件,具体路径在/vendor/etc/bluetooth/bt_vendor.conf

另外查看bt_vendor.conf可以查看到串口名称以及fw路径

三. Android 13~Android 15

架构没有改变,目录修改为了:

/packages/modules/Bluetooth/

所有蓝牙部分都放在了一起