Android13 安装谷歌GMS导致打开蓝牙失败解决方法
Android13 安装谷歌GMS导致打开蓝牙失败解决方法
文章目录
- Android13 安装谷歌GMS导致打开蓝牙失败解决方法
- 一、前言
- 二、解决方法
- 1、简单的解决方法
- 2、添加属性和日志解决
- 三、分析
- 1、查看异常日志
- 2、 查看蓝牙相关日志
- 四、总结
- 1、Android13 安装谷歌GMS导致打开蓝牙失败具体原因是BLE蓝牙扫描导致去除BLE蓝牙扫描即可。
- 2、蓝牙错误分析
一、前言
Android13 上安装谷歌GMS相关服务后,无法打开蓝牙,打开蓝牙马上异常导致自动关闭蓝牙。
这个问题国内估计大部分开发者不会遇到,但是如果是面向国外用户需要安装谷歌相关服务可能会遇到。
这个问题在Android13 几个不同芯片供应商方案都有遇到,说明这个问题在Android13 上是个共性问题,Android原生代码的问题。
本文主要记录一下。
二、解决方法
该问题与BLE 蓝牙扫描相关,去除BLE蓝牙扫描操作即可解决。
1、简单的解决方法
packages\modules\Bluetooth\system\gd\hci\le_scanning_manager.ccvoid scan(bool start) {//add by mychangeif (true) {LOG_WARN("scan return! because have gms!");return ;}if (start) {configure_scan();start_scan();}
这里是直接在 scan 方法里面进行了 return。
去除了这里的扫描代码,并不影响蓝牙的使用,连接蓝牙耳机,蓝牙鼠标键盘和手机是没啥问题的。
2、添加属性和日志解决
添加日志打印和属性判断的方法:+++ b/release/release/packages/modules/Bluetooth/system/gd/hci/le_scanning_manager.cc
@@ -17,6 +17,7 @@#include <memory>#include <unordered_map>
+#include <cutils/properties.h>#include "hci/acl_manager.h"#include "hci/controller.h"
@@ -613,6 +614,15 @@ struct LeScanningManager::impl : public LeAddressManagerCallback {}void scan(bool start) {
+ //add by mydebug ,start
+ char value[PROPERTY_VALUE_MAX];
+ property_get("persist.mydebug.stop_le_scan", value, "");
+ LOG_WARN("scan prop persist.mydebug.stop_le_scan value = %s", value);
+ if (strncmp(value, "no", 2)) { //default ture, setprop no will false.
+ LOG_WARN("scan return! because have gms!");
+ return ;
+ }
+ //add by mydebug , endif (start) {
这里添加了属性 persist.mydebug.stop_le_scan,默认没有,如果设置为 no 就是原本的逻辑。
添加后可以进行测试,属性修改为no的情况,无法打开蓝牙,修改为yes或者其他字符串是可以正常打开蓝牙的。
为啥去除BLE蓝牙的扫描就可以,这是同事陈旺追踪到的,具体修改涉及到C代码。
这里只能简单介绍和分析,如果需要深入研究,可以自己追一下Android13的源码。
三、分析
该问题不好分析,这里只提供相关思路。
1、查看异常日志
从日志看没有 AndroidRuntion 关键字日志,说明不存在应用崩溃。
查看 crash 关键字日志,确实可以看到不少日志,其中 “F DEBUG” 就是关键日志,是底层异常的关键日志。
11-03 09:20:55.407 9084 9084 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-03 09:20:55.407 9084 9084 F DEBUG : Build fingerprint: 'mydebug/rk3588_t/rk3588_t:13/TQ2A.230305.008.F1/eng.mydebug.20231102.190806:userdebug/release-keys'
11-03 09:20:55.407 9084 9084 F DEBUG : Revision: '0'
11-03 09:20:55.407 9084 9084 F DEBUG : ABI: 'arm64'
11-03 09:20:55.407 9084 9084 F DEBUG : Timestamp: 2023-11-03 09:20:54.995416302+0800
11-03 09:20:55.407 9084 9084 F DEBUG : Process uptime: 0s
11-03 09:20:55.407 9084 9084 F DEBUG : Cmdline: com.android.bluetooth
11-03 09:20:55.407 9084 9084 F DEBUG : pid: 8977, tid: 9027, name: bt_stack_manage >>> com.android.bluetooth <<<
11-03 09:20:55.407 9084 9084 F DEBUG : uid: 1002
11-03 09:20:55.407 9084 9084 F DEBUG : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
11-03 09:20:55.407 9084 9084 F DEBUG : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
11-03 09:20:55.407 9084 9084 F DEBUG : Abort message: 'assertion 'status_view.GetStatus() == ErrorCode::SUCCESS' failed - Receive set extended scan enable with error code COMMAND_DISALLOWED' //错误关键
11-03 09:20:55.407 9084 9084 F DEBUG : x0 0000000000000000 x1 0000000000002343 x2 0000000000000006 x3 00000074f864ceb0
11-03 09:20:55.407 9084 9084 F DEBUG : x4 7274736073527364 x5 7274736073527364 x6 7274736073527364 x7 7f7f7f7f7f7f7f7f
11-03 09:20:55.407 9084 9084 F DEBUG : x8 00000000000000f0 x9 000000784035aa00 x10 0000000000000001 x11 0000007840398de4
11-03 09:20:55.407 9084 9084 F DEBUG : x12 00000074f864bd60 x13 0000000000000087 x14 00000074f864d0f0 x15 00000002829bb542
11-03 09:20:55.407 9084 9084 F DEBUG : x16 00000078403fdd58 x17 00000078403dac70 x18 00000074f7704038 x19 0000000000002311
11-03 09:20:55.407 9084 9084 F DEBUG : x20 0000000000002343 x21 00000000ffffffff x22 00000074f864e000 x23 000000750d528468
11-03 09:20:55.407 9084 9084 F DEBUG : x24 0000007590216000 x25 0000000000000000 x26 b4000075e5b66e0c x27 0000000000000001
11-03 09:20:55.407 9084 9084 F DEBUG : x28 0000000000000001 x29 00000074f864cf30
11-03 09:20:55.408 9084 9084 F DEBUG : lr 000000784038a968 sp 00000074f864ce90 pc 000000784038a994 pst 0000000000001000
11-03 09:20:55.408 9084 9084 F DEBUG : backtrace:
11-03 09:20:55.408 9084 9084 F DEBUG : #00 pc 0000000000051994 /apex/com.android.runtime/lib64/bionic/libc.so (abort+164) (BuildId: 4e07915368c859b1910c68c84a8de75f) //具体的错误堆栈信息
11-03 09:20:55.408 9084 9084 F DEBUG : #01 pc 000000000060a300 /apex/com.android.art/lib64/libart.so (art::Runtime::Abort(char const*)+116) (BuildId: 499c2699a3444f5f106778c61af92356)
11-03 09:20:55.408 9084 9084 F DEBUG : #02 pc 0000000000016ea8 /system/lib64/libbase.so (android::base::SetAborter(std::__1::function<void (char const*)>&&)::$_3::__invoke(char const*)+80) (BuildId: b77c57f68a484ed93d5a7eda59d83bf9)
11-03 09:20:55.408 9084 9084 F DEBUG : #03 pc 0000000000006e10 /system/lib64/liblog.so (__android_log_assert+308) (BuildId: 6d90ed7ade4424925966905508d7e8b2)
11-03 09:20:55.408 9084 9084 F DEBUG : #04 pc 000000000095eb54 /apex/com.android.btservices/lib64/libbluetooth_jni.so (bluetooth::hci::LeScanningManager::impl::check_status(bluetooth::hci::CommandCompleteView)+1128) (BuildId: e3a43fbd0d5d775b82f1fcbcaffc6903)
11-03 09:20:55.408 9084 9084 F DEBUG : #05 pc 0000000000876eec /apex/com.android.btservices/lib64/libbluetooth_jni.so (void base::internal::FunctorTraits<void (*)(bluetooth::hci::CommandCompleteView), void>::Invoke<void (*)(bluetooth::hci::CommandCompleteView), bluetooth::hci::CommandCompleteView>(void (*&&)(bluetooth::hci::CommandCompleteView), bluetooth::hci::CommandCompleteView&&)+268) (BuildId: e3a43fbd0d5d775b82f1fcbcaffc6903)
11-03 09:20:55.408 9084 9084 F DEBUG : #06 pc 00000000008e8ba4 /apex/com.android.btservices/lib64/libbluetooth_jni.so (void base::internal::FunctorTraits<base::OnceCallback<void (bluetooth::hci::CommandCompleteView)>, void>::Invoke<base::OnceCallback<void (bluetooth::hci::CommandCompleteView)>, bluetooth::hci::CommandCompleteView>(base::OnceCallback<void (bluetooth::hci::CommandCompleteView)>&&, bluetooth::hci::CommandCompleteView&&)+280) (BuildId: e3a43fbd0d5d775b82f1fcbcaffc6903)
11-03 09:20:55.408 9084 9084 F DEBUG : #07 pc 00000000009d38c8 /apex/com.android.btservices/lib64/libbluetooth_jni.so (bluetooth::os::Handler::handle_next_event()+236) (BuildId: e3a43fbd0d5d775b82f1fcbcaffc6903)
11-03 09:20:55.408 9084 9084 F DEBUG : #08 pc 0000000000a2837c /apex/com.android.btservices/lib64/libbluetooth_jni.so (bluetooth::os::Reactor::Run()+584) (BuildId: e3a43fbd0d5d775b82f1fcbcaffc6903)
11-03 09:20:55.408 9084 9084 F DEBUG : #09 pc 0000000000a29078 /apex/com.android.btservices/lib64/libbluetooth_jni.so (bluetooth::os::Thread::run(bluetooth::os::Thread::Priority)+176) (BuildId: e3a43fbd0d5d775b82f1fcbcaffc6903)
11-03 09:20:55.408 9084 9084 F DEBUG : #10 pc 0000000000a29200 /apex/com.android.btservices/lib64/libbluetooth_jni.so (void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (bluetooth::os::Thread::*)(bluetooth::os::Thread::Priority), bluetooth::os::Thread*, bluetooth::os::Thread::Priority> >(void*)+68) (BuildId: e3a43fbd0d5d775b82f1fcbcaffc6903)
11-03 09:20:55.408 9084 9084 F DEBUG : #11 pc 00000000000b63b0 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208) (BuildId: 4e07915368c859b1910c68c84a8de75f)
11-03 09:20:55.408 9084 9084 F DEBUG : #12 pc 00000000000530b8 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: 4e07915368c859b1910c68c84a8de75f)
通过日志可以看到具体报错是jni相关,具体到c代码的哪个类和接口,不太会分析,有兴趣的自己可以研究看看。
从上面可以看到 :Receive set extended scan enable with error code ,这个错误打印是在 le_scanning_manager.cc 文件中的。
具体流程怎么追踪到 scan 方法,从代码上未能简单看出!
2、 查看蓝牙相关日志
可以查看:BluetoothManagerService 、droid.bluetooth 、BluetoothBondStateMachine 等关键字
里面都是有蓝牙开关、蓝牙异常关闭或者蓝牙相关服务died/dead 日志。但是确认看不出是 le_scanning_manager 里面的scan方法导致报错。
这种 c 代码的问题,只能深入追踪,这里对 c/c++ 不熟悉,所以不深入介绍了。
四、总结
1、Android13 安装谷歌GMS导致打开蓝牙失败具体原因是BLE蓝牙扫描导致去除BLE蓝牙扫描即可。
2、蓝牙错误分析
查看蓝牙相关日志: BluetoothManagerService 、droid.bluetooth 、BluetoothBondStateMachine
查看 AndroidRuntime、crash 日志
如果是jni或者so相关的,基本错误都是在c/c++ 代码中,有可能需要深入分析追踪。
相关文章:
Android13 安装谷歌GMS导致打开蓝牙失败解决方法
Android13 安装谷歌GMS导致打开蓝牙失败解决方法 文章目录 Android13 安装谷歌GMS导致打开蓝牙失败解决方法一、前言二、解决方法1、简单的解决方法2、添加属性和日志解决 三、分析1、查看异常日志2、 查看蓝牙相关日志 四、总结1、Android13 安装谷歌GMS导致打开蓝牙失败具体原…...

独创改进 | RT-DETR 引入双向级联特征融合结构 RepBi-PAN | 附手绘结构图原图
本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 文章目录 YOLOv6贡献RepBi-…...

Ubuntu下安装vscode,并解决终端打不开vscode的问题
Visual Studio Code安装 1,使用 apt 安装 Visual Studio Code 在官方的微软 Apt 源仓库中可用。按照下面的步骤进行即可: 以 sudo 用户身份运行下面的命令,更新软件包索引,并且安装依赖软件: sudo apt update sud…...

Spring Boot Actuator 漏洞利用
文章目录 前言敏感信息泄露env 泄露配置信息trace 泄露用户请求信息mappings 泄露路由信息heapdump泄露堆栈信息 前言 spring对应两个版本,分别是Spring Boot 2.x和Spring Boot 1.x,因此后面漏洞利用的payload也会有所不同 敏感信息泄露 env 泄露配置信…...
acwing算法基础之数据结构--trie算法
目录 1 基础知识2 模板3 工程化 1 基础知识 trie树算法,也叫作字典树算法。 用处:用来高效存储和查找字符串集合的数据结构。 (一) 定义变量。 const int N 1e5 10; int son[N][26], cnt[N], idx; char str[N];(二…...
ES from+size>10000报错
参考博客 from size > 10000就会报错 Result window is too large, from size must be less than or equal to: [10000] but was [10001]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_…...
(04)Mycat实现分库
1、如何选择分库表 #客户表 rows:20万 CREATE TABLE customer(id INT AUTO_INCREMENT,NAME VARCHAR(200),PRIMARY KEY(id) );#订单表 rows:600万 CREATE TABLE orders(id INT AUTO_INCREMENT,order_type INT,customer_id INT,amount DECIMAL(10,2),PRIMARY KEY(id) ); #…...

DeepSORT多目标跟踪——算法流程与源码解析
一、目标检测与目标追踪 1. 目标检测 在目标检测任务中,主要目标是识别图像或视频帧中存在的物体的位置和类别信息。这意味着目标检测算法需要定位物体的边界框(Bounding Box)并确定每个边界框内的物体属于哪个类别(如人、汽车、…...

C++查漏补缺与新标准(C++20,C++17,C++11)02 C++快速回顾(二)
本内容参考C20高级编程 C风格的数组 //形如 int myArray[3]{2};一个比较新颖的获取C风格数组大小的函数std::size(),返回size_t类型(在中定义的无符号整数) #include <iostream> using namespace std;int main() {int myArray[5] {…...
红米K40功能介绍
红米K40是小米旗下的一款高性能智能手机。以下是红米K40的一些功能介绍及新增功能: 1.高性能处理器:红米K40搭载了骁龙870处理器,提供强大的性能和流畅的操作体验。 2.120Hz刷新率屏幕:红米K40采用了6.67英寸的AMOLED全面屏&…...
壹[1],Opencv常用结构
1,Point类:点表示 point表示二维结构的点,(x,y) cv::Point point; point.x 100; point.y 100; 2,Scalar类:颜色表示 cv::Scalar colorBlue(255,0,0);//蓝色 cv::Scalar colorGreen(0, 255, 0);//绿色 cv::Scalar colorRed(0, …...
Linux常用指令(一)——目录操作
Linux目录操作 1.1 目录切换 cd1.2 目录查看 ls1.3 创建目录 mkdir1.4 删除目录 rm1.5 复制目录 cp1.6 删除目录 rm1.7 搜索目录 find1.8 查看当前所在目录 pwd 更加完整的Linux常用指令 1.1 目录切换 cd # 切换到根目录 cd / # 切换到根目录的usr目录 cd /usr # 返回上一级目…...
前端基础之jQuery
一.什么是jQuery jQuery是一个轻量级的、兼容多浏览器的JavaScript库。jQuery使用户能够更方便地处理HTML Document、Events、实现动画效果、方便地进行Ajax交互,能够极大地简化JavaScript编程。它的宗旨就是:“Write less, do more.“ jQuery内部封装了…...

【基于HTML5的网页设计及应用】——实现个人简历表格和伪类选择器应用
🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL:…...
思考(九十二):DBProxy实现多级存储和事务处理
DBProxy 数据处理的主控室 后端开发一块重要的内容就是如何处理数据。比如: 问题说明统一的访问界面如游戏服只需要 Load、Save、Begin、Commit、Rollback 接口多级存储来降低成本如热数据在 Redis ;冷数据在 MySQL ;长时间非活跃,则归档 OSS同个逻辑涉及多个数据更新要么…...

新手入门Python一定要看的八个超实用建议!
文章目录 前言一、项目文件事先做好归档二、永远不要手动修改源数据并且做好备份三、做好路径的正确配置四、代码必要的地方做好备注与说明五、加速你的Python循环代码六、可视化你的循环代码进度七、使用高效的异常捕获工具八、要多考虑代码健壮性关于Python技术储备一、Pytho…...

Centos 7.x上利用certbot申请Let‘s Encrypt的SSH证书(HTTPS证书)
目录 01-安装Certbot02-在网站的根目录依次新建文件夹.well-known和acme-challenge03-申请证书 要在CentOS 7.x上为域名申请Let’s Encrypt证书,你可以使用Certbot工具,它是一个自动化证书颁发工具,用于管理Let’s Encrypt证书。以下是在Cent…...

采用springboot、avue框架开发的:大型医院绩效考核系统成品源码
医院绩效考核系统全套源码(演示自主版权医院应用案例) 医院绩效考核系统,建立以医院发展目标为导向,以医务人员劳动价值、工作量为评价基础,统筹效率、质量、成本的绩效管理和绩效工资分配体系。系统支持RBRVS…...

时序分解 | Matlab实现FEEMD快速集合经验模态分解时间序列信号分解
时序分解 | Matlab实现FEEMD快速集合经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现FEEMD快速集合经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现FEEMD快速集合经验模态分解时间序列信号分解 算法新颖小众,…...

自学SLAM(6)相机与图像实践:OpenCV处理图像与图像拼接(点云)
前言 如果写过SLAM14讲第一次的作业,或者看过我之前的运行ORB_SLAM2教程应该都安装过OpenCV了,如果没有安装,没关系,可以看我之前的博客,里面有如何安装OpenCV。 链接: 运行ORB-SLAM2(含OpenCV的安装&…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14
什么是 Pattern Matching(模式匹配) ❝ 模式匹配就是一种“描述式”的写法,不需要你手动判断、提取数据,而是直接描述你希望的数据结构是什么样子,系统自动判断并提取。❞ 你给的定义拆解: ✴ Instead of …...

Centos 7 服务器部署多网站
一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站,目录结构如下: bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...

DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集
基于深度学习YOLOv11的盲人障碍物目标检测:开启盲人出行新纪元 在全球范围内,盲人及视觉障碍者的出行问题一直是社会关注的重点。尽管技术不断进步,许多城市的无障碍设施依然未能满足盲人出行的实际需求。尤其是在复杂的城市环境中ÿ…...
uni-app学习笔记二十三--交互反馈showToast用法
showToast部分文档位于uniapp官网-->API-->界面:uni.showToast(OBJECT) | uni-app官网 uni.showToast(OBJECT) 用于显示消息提示框 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的内容,长度与 icon 取值有关。iconString否图…...
C++参数传递 a与a的区别
在 C 中,&a(引用)和 a(值传递) 的关键区别在于 参数如何传递给函数,以及由此引发的 性能、语义和安全问题。 最核心的在于你想不想传入的参数被改变,如果想,就用参数传递&#…...