当前位置: 首页 > 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…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...