1
- 发布:2026-06-01 13:57
- 更新:48 分钟前
- 阅读:42
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: 22H2
HBuilderX类型: 正式
HBuilderX版本号: 5.07
手机系统: Android
手机系统版本号: Android 11
手机机型: 地秤显示屏
页面类型: vue
vue版本: vue2
打包方式: 离线
项目创建方式: HBuilderX
操作步骤:
预期结果:
1
1
实际结果:
1
1
bug描述:
uni-app Android 离线打包后蓝牙地秤可连接但无法读数
问题现象
同一个 uni-app 项目,使用 HBuilderX 官方云打包时,蓝牙地秤可以正常连接并读取重量。
切换为 Android Studio 离线打包后:
- App 可以正常安装和启动。
- 蓝牙模块已经可以搜索并连接设备。
- 连接成功后,地秤重量无法正常读取,表现为重量不变、一直为
0.0,或无法获取实时重量。
也就是说,目前不是“蓝牙无法连接”,而是“连接后无法读取地秤数据”。
项目类型
uni-app Android 离线打包工程
HBuilderX 云打包:读秤正常
Android Studio 离线打包:蓝牙可连接,但读秤异常
当前主要测试设备系统:Android 11
已确认的离线打包配置
1. 已添加蓝牙 AAR
离线工程中已添加:
Bluetooth-release.aar
2. 已在 dcloud_properties.xml 注册蓝牙模块
配置如下:
<feature name="Bluetooth" value="io.dcloud.feature.bluetooth.BluetoothFeature"/>
3. AndroidManifest.xml 已声明蓝牙相关权限
当前已声明的权限包括:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
4. 已拆包确认 APK 内包含蓝牙配置
离线打包生成的 APK 中已确认包含:
<feature name="Bluetooth" value="io.dcloud.feature.bluetooth.BluetoothFeature"/>
因此目前看起来不是 Bluetooth-release.aar 未打入包,也不是 dcloud_properties.xml 未配置。
读秤相关逻辑
项目中存在两类蓝牙称连接方式:
SPP 蓝牙称:经典蓝牙串口,通过 plus.android 调 Android BluetoothSocket
BLE 蓝牙称:低功耗蓝牙,通过 uni.openBluetoothAdapter / notify 读取数据
BLE 模式下大致流程:
连接蓝牙设备
-> 获取 service / characteristic
-> 找 notify 特征值
-> 开启 notify
-> onBLECharacteristicValueChange 接收数据
-> ArrayBuffer 转 hex
-> 根据地秤协议解析重量
云打包时该逻辑可正常工作,离线打包后连接正常但读数异常。
重点怀疑点
由于同一套前端代码在 HBuilderX 云打包中正常,在 Android Studio 离线打包中异常,所以怀疑差异不在业务代码,而在离线打包环境与云打包环境不完全一致。
目前重点怀疑:
targetSdkVersion差异导致 Android 蓝牙权限策略变化。- 当前测试环境为 Android 11,因此 Android 12+ 新增的
BLUETOOTH_SCAN/BLUETOOTH_CONNECT不是首要嫌疑;Android 11 下更需要关注定位权限和定位开关。 - 云打包自动补充了某些权限、兼容配置或运行时处理,离线工程未完全复刻。
- 离线 SDK 版本与云打包使用的 SDK 版本不一致。
- BLE notify 特征值选择或开启行为在离线包中与云打包存在差异。
targetSdkVersion 验证
离线工程原配置:
targetSdkVersion 33
为验证是否与 Android 高版本 target 权限策略有关,临时改为:
targetSdkVersion 30
release 构建时 lint 会提示:
ExpiredTargetSdkVersion
Google Play requires that apps target API level 33 or higher.
为了本地验证,临时添加:
lint {
disable 'ExpiredTargetSdkVersion'
}
这样可以生成 targetSdk 30 的验证包。
注意:这只是为了定位问题,不建议作为正式发布配置。
补充说明:当前主要测试设备是 Android 11。Android 11 本身没有 Android 12 引入的附近设备权限弹窗,但 BLE 扫描通常仍依赖定位权限和系统定位开关。因此,如果 targetSdk 30 与 33 的验证结果没有差异,应优先排查云打包与离线打包的 SDK / Manifest / 运行时权限申请差异,而不是只盯 Android 12+ 蓝牙权限。
当前想请教的问题
想请教官方或有经验的开发者:
- HBuilderX 云打包和 Android 离线打包在蓝牙模块上,除了添加
Bluetooth-release.aar、注册BluetoothFeature、声明权限外,是否还有其他必要配置? - 当前设备是 Android 11,经典蓝牙 SPP 场景下,
plus.android调用BluetoothSocket在离线打包中是否还需要额外配置或权限申请? - Android 11 下,BLE 扫描和连接除了 Manifest 中声明定位权限外,是否还需要离线工程手动处理定位权限申请或系统定位开关检测?
- HBuilderX 云打包是否会自动添加某些蓝牙相关兼容配置,而离线打包需要手动补充?
- 是否有推荐方式对比云打包 APK 与离线打包 APK 的蓝牙模块配置差异?
期望结果
希望离线打包后的 APK 与 HBuilderX 云打包行为一致:
蓝牙设备可以连接
连接后可以正常接收地秤数据
页面实时显示重量
目前离线包只做到“可以连接”,但读数仍异常。
可以很明显看到两张图的读数有区别
.......
欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
好的,作为 DCloud 官方人员,我对这份 bug 反馈进行评审。
评审意见:关于“uni-app Android 离线打包后蓝牙地秤可连接但无法读数”的反馈
反馈质量评价
这份反馈的整体质量很高,值得肯定。具体体现在:
-
问题描述清晰:用户非常准确地定位了问题的差异点——“云打包正常,离线打包连接成功但读数为0”。这极大地缩小了排查范围,将问题锁定在“离线打包环境配置”而非“业务代码逻辑”上。
-
环境信息详尽:用户提供了完整的版本信息(HBuilderX 5.07)、设备系统(Android 11)、项目类型(Vue2)以及关键的离线打包配置(
targetSdkVersion、AAR、dcloud_properties.xml、AndroidManifest.xml权限等)。这些信息对于定位离线打包问题至关重要。 -
排查思路严谨:用户不仅描述了现象,还提供了自己的排查过程和怀疑点(如
targetSdkVersion差异、云打包的自动补全行为、SDK版本不一致等),这表明用户已经进行了深入的技术分析,为官方人员提供了非常有价值的线索。特别是关于targetSdkVersion 30和33的对比测试思路,是专业且有效的。 -
问题明确:最后列出的5个具体问题,直接指向了云打包与离线打包在蓝牙模块上的配置差异,非常聚焦。
需要补充的内容:
- 复现步骤:虽然用户描述了“可以连接但无法读数”的最终现象,但缺少从打开App到连接蓝牙地秤,再到发现读数异常的具体操作步骤。一份标准、详细的复现步骤能帮助官方人员更高效地搭建测试环境并尝试复现。
- 代码示例:当前反馈缺少核心的蓝牙读写、notify订阅相关的代码片段。虽然问题大概率与环境有关,但提供代码能完全排除代码逻辑层面的微小差异。
- 分类信息:复现步骤、预期结果、实际结果三处均填写为“1”,这是无效信息,需要补充。
Bug 是否成立与排查方向
这是一个成立的问题,且是高价值的“环境配置差异”类Bug。根据用户描述和分析,这几乎可以确定是离线打包工程与云打包环境在蓝牙模块的运行时权限、SDK版本或依赖库上存在细微差别所导致。
基于知识库和通用技术知识,我建议从以下几个方面进行深度排查:
-
离线SDK版本与HBuilderX版本的匹配性(首要怀疑点):
这是离线打包最常见的问题根源。请务必确保您下载的Android 离线SDK的版本与您使用的HBuilderX 5.07完全一致。版本不匹配会导致各种不可预知的运行时错误。请对照 Android 离线SDK下载页面 重新下载并替换整个SDK。知识库中的 离线打包造成的差异 一节也明确指出了版本一致性的重要性。 -
运行时权限的动态申请:
您已经在AndroidManifest.xml中声明了权限,但对于 Android 11 设备,定位权限(ACCESS_FINE_LOCATION)必须在运行时动态申请。BLE 扫描强依赖定位权限。您虽然声明了权限,但若未在代码中动态申请并获得用户授权,BLE的扫描和数据交互可能是不完整的。云打包的基座可能内置了更完整的权限申请逻辑。请检查您的离线工程中,是否在连接蓝牙前主动调用了plus.android.requestPermissions或uni.authorize来请求定位权限。请参考知识库中的 uni.getLocation 注意事项,其中明确提到App平台需要赋予定位权限。 -
BLE MTU 设置:
根据 ask 社区的一个相似问题 【报Bug】Android下蓝牙监听特征值变化回调不执行,有开发者反馈在连接成功后,必须调用uni.setBLEMTU设置一个合适的MTU值(例如247),才能正常接收到数据。虽然这通常影响的是数据接收,而非连接,但可以作为一个尝试点,在连接成功后立即调用此API进行测试。 -
系统定位开关:
在 Android 11 上,即使App有定位权限,如果系统的“位置信息”总开关是关闭的,BLE 扫描也无法正常工作。请确保测试设备的系统定位服务是开启状态。
关于您提出的5个具体问题的回复
-
除了添加AAR、注册Feature、声明权限外,是否有其他必要配置?
有。最关键的配置是确保离线SDK版本与HBuilderX版本严格一致。此外,运行时权限的动态申请是实现完整BLE功能的必要条件。请检查build.gradle中的依赖配置是否与官方SDK示例工程保持一致,特别是uniapp-v8-release.aar等核心库。 -
经典蓝牙 SPP 场景下,
plus.android调用是否需要额外配置?
对于plus.android直接调用原生 API 的方式,主要依赖的是正确的权限声明和运行时权限授予。只要BLUETOOTH、BLUETOOTH_ADMIN等权限已声明并已授权,理论上不需要额外配置。但如果离线SDK版本不一致,可能会影响到plus.android桥接层的内部实现。 -
Android 11 下,是否需要离线工程手动处理定位权限申请或开关检测?
需要,并且这是高概率原因。 离线工程需要开发者完全自主处理运行时权限流程。您必须在代码中明确引导用户开启定位权限,并可选择性检测系统定位开关状态。云打包的默认基座可能已经处理了部分通用逻辑。 -
HBuilderX 云打包是否会自动添加某些蓝牙相关兼容配置?
云打包的配置是相对标准化的。离线打包更需要关注的是原生工程本身的配置,例如build.gradle中的compileSdkVersion、minSdkVersion是否合理,以及是否缺少某些必要的依赖库。请务必以官方离线SDK中的示例工程为基准进行比对。 -
是否有推荐方式对比云打包APK与离线打包APK的蓝牙模块配置差异?
可以使用apkanalyzer命令行工具或 Android Studio 自带的APK Analyzer工具,直接对比两个 APK 包内的文件。重点对比以下内容:AndroidManifest.xml:对比权限声明、<feature>配置是否完全一致。lib/目录:对比.so库文件是否相同。assets/目录:对比dcloud_properties.xml及apps/下的资源文件是否一致。META-INF/目录:对比签名和证书信息。
总结与建议
您的反馈非常有价值。问题基本可以定位为离线打包工程环境与云打包环境不完全一致。请优先执行以下操作:
- 重新下载与 HBuilderX 5.07 版本完全匹配的 Android 离线SDK,并完整替换工程中的相关文件。
- 在代码中增加运行时请求
ACCESS_FINE_LOCATION权限的逻辑,确保权限被用户授权。 - 检查测试设备的系统“位置信息”开关是否已开启。
- 如果问题依旧,可尝试在 BLE 连接成功的回调中调用
uni.setBLEMTU设置一个如 247 的MTU值。
如果以上步骤仍无法解决,请补充详细的复现步骤和相关代码片段,并再次提交反馈,我们将继续跟进。感谢您的支持与贡献。