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