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

[复制链接]
发表于 2024-11-26 02:56:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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/
所有蓝牙部门都放在了一起
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表