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/
所有蓝牙部分都放在了一起
相关文章:
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 2…...
ubuntu中使用ffmpeg和nginx推流rtmp视频
最近在测试ffmpeg推流rtmp视频,单独安装ffmpeg是无法完成推流的,需要一个流媒体服务器,常用nginx,可以直接在ubuntu虚拟机里面测试一下。 测试过程不涉及编译ffmpeg和nginx,仅使用基本功能: 1 安装ffmpeg …...
strongswan测试流程
测试shell脚本文件testing/do-tests,测试配置文件testing/testing.conf。do-tests脚本不加参数,将依次执行testing/tests/目录下的所有测试用例。do-tests脚本有两个参数-v和-t,前者在测试中记录详细信息,后者在输出信息中增加时间…...
[CKS] CIS基准测试,修复kubelet和etcd不安全项
目前的所有题目为2024年10月后更新的最新题库,考试的k8s版本为1.31.1 专栏其他文章: [CKS] K8S Admission Set Up[CKS] CIS基准测试,修复kubelet和etcd不安全项[CKS] K8S NetworkPolicy Set Up[CKS] 利用Trivy对image进行扫描[CKS] 利用falco进行容器…...
Linux/Windows/OSX 上面应用程序重新启动运行。
1、Linux/OSX 上面重新运行程序,直接使用 execvp 函数就可以了,把main 函数传递来的 argv 二维数组(命令行参数)传进去就可以,注意不要在 fork 出来的子进程搞。 2、Windows 平台可以通过 CreateProcess 函数来创建新的…...
React拆分组件中的传值问题
在我们实际项目开发中,很多时候为为了项目后期便于维护,都会将相关的组件进行拆分,拆分过后,会将数据方法在父组件中进行编写,然后将一些逻辑拆分为组件,在这个过程中,最重要的就是数据的传递&a…...
RocketMQ的使⽤
初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种⽅式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要⻢上回复。 两种⽅式各有优劣,打电话可以⽴即得到响应,但…...
Android Studio 设置不显示 build-tool 无法下载
2024版本查看build-tool版本 File -> Settings -> Languages & Frameworks -> Android SDK 或者直接打开Settings后搜索“SDK” 解决方案 将 Android Studio 升级到2022.2.1以上的版本将 C:/Windows/System32/drivers/etc/hosts 文件用管理员身份打开,…...
【Y20030007】基于java+servlet+mysql的垃圾分类网站的设计与实现(附源码 配置 文档)
网垃圾分类网站的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着全球环境保护意识的提升,垃圾分类已成为一项紧迫且重要的任务。为了有效推动垃圾分类的实施,提升公众的环保意识和参与度,垃圾分类已…...
细说敏捷:敏捷四会之standup meeting
上一篇文章中,我们讨论了 敏捷四会 中 冲刺计划会 的实施要点,本篇我们继续分享敏捷四会中实施最频繁,团队最容易实施但往往也最容易走形的第二个会议:每日站会 关于每日站会的误区 站会是一个比较有标志性的仪式活动࿰…...
ThinkPHP8使用workerman
应用场景说明:通过建立通信,不同用户进行消息推送或数据更新,因为本身需要作为服务端进行主动消息推送,因此使用Gateway方式,如果不需要的可以不采用这种形式,以下内容仅为参考,具体业务场景&am…...
C语言超详细教程
系列文章目录 文章目录 系列文章目录1 运算符1.1 算术运算符:2 控制语句2.1 条件语句:2.2 循环语句:3 函数3.1 函数的定义与声明:3.2 递归函数:4 指针4.1 指针的定义与使用函数指针:5. 数组与字符串5.1 数组一维数组:相同类型元素的集合(如:多维数组:数组的数组(如:…...
[开源]3K+ star!微软Office的平替工具,跨平台,超赞!
大家好,我是JavaCodexPro! 数字化的当下,高效的办公工具是提升工作效率的关键,然而大家想到的一定是 Microsoft Office 办公软件,然而价格也是相当具有贵的性价比。 今天JavaCodexPro给大家分享一款超棒的开源办公套…...
如何借助计算机视觉算法通过识别水尺精准识别水位
如何借助计算机视觉算法通过识别水尺精准识别水位 随着技术的发展,计算机视觉在多个领域得到了广泛的应用,尤其是在环境监测方面。本文将介绍一种利用计算机视觉算法通过识别水尺来精准识别水位的方法。这种方法可以用于河流、水库等场景的水位监测&…...
C++(进阶) 第1章 继承
C(进阶) 第1章 继承 文章目录 前言一、继承1.什么是继承2.继承的使用 二、继承方式1.private成员变量的(3种继承方式)继承2. private继承方式3.继承基类成员访问⽅式的变化 三、基类和派生类间的转换1.切片 四、 继承中的作⽤域1.隐藏规则&am…...
获国家权威机构认可 亚信安全荣获CNVD技术组支撑单位认证
近日,国家信息安全漏洞共享平台(CNVD)依据《CNVD管理办法》及《CNVD支撑单位能力要求》,对申请加入考察期的单位进行了全面而严格的能力评估。经过层层筛选与审核,亚信安全凭借卓越的技术实力与专业的服务能力…...
2. Autogen官网教程 (Terminating Conversations Between Agents)
在这一章中,我们将探讨如何结束自动生成代理之间的对话。 导入必要的库 import osfrom autogen import ConversableAgent配置智能体 我们需要配置智能体使用的语言模型(LLM)。以下是一个配置示例: llm_config {"config_…...
java 排序 详解
Java 提供了多种方式对数据进行排序,包括数组和集合的排序。排序在日常开发中非常常见,以下将从排序算法的基本原理、Java 中的内置排序方法以及自定义排序三方面进行详解。 1. 排序的基本概念 排序是将一组数据按特定顺序排列的过程,常见顺…...
【数据集】城市通量塔站点观测数据
【数据集】城市通量塔站点观测数据 数据概述数据下载参考数据概述 数据集简介:Harmonized gap-filled dataset from 20 urban flux tower sites 数据集名称:Harmonized gap-filled dataset from 20 urban flux tower sites (用于 Urban-PLUMBER 项目的 20 个城市通量塔站点…...
scau编译原理综合性实验
一、题目要求 题目: 选择部分C语言的语法成分,设计其词法分析程序、语法语义分析程序。 要求: 设计并实现一个一遍扫描的词法语法语义分析程序,将部分C语言的语法成分(包含赋值语句、if语句、while循环语句…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
