当前位置: 首页 > news >正文

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 文件用管理员身份打开&#xff0c…...

【Y20030007】基于java+servlet+mysql的垃圾分类网站的设计与实现(附源码 配置 文档)

网垃圾分类网站的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着全球环境保护意识的提升,垃圾分类已成为一项紧迫且重要的任务。为了有效推动垃圾分类的实施,提升公众的环保意识和参与度,垃圾分类已…...

细说敏捷:敏捷四会之standup meeting

上一篇文章中,我们讨论了 敏捷四会 中 冲刺计划会 的实施要点,本篇我们继续分享敏捷四会中实施最频繁,团队最容易实施但往往也最容易走形的第二个会议:每日站会 关于每日站会的误区 站会是一个比较有标志性的仪式活动&#xff0…...

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支撑单位能力要求》,对申请加入考察期的单位进行了全面而严格的能力评估。经过层层筛选与审核,亚信安全凭借卓越的技术实力与专业的服务能力&#xf…...

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循环语句&#xf…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理&#xff1a…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

测试markdown--肇兴

day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...