Bootstrap

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 [email protected]

清除:

make [email protected]

生成内容:

out/target/product/rk3399_roc_pc_plus/obj/SHARED_LIBRARIES/[email protected]_intermediates/[email protected]

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/

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

;