项目总结与发布:常见问题排查、性能优化、Google Play发布、合规检查
终于走到这一步了。你的BLE应用写完了,功能也调通了。但说实话,一个项目从「能跑」到「能发」,中间还隔着好几道坎。我见过太多开发者在最后关头翻车——要么是Google Play审核被拒,要么是用户反馈连不上设备。今天咱们就把这些坑一个个填平。
常见问题排查:那些让我熬夜的Bug
先聊聊BLE开发里最让人头疼的几个问题。嗯,都是我在项目里真实踩过的雷。
1. 扫描不到设备
这个问题出现频率最高。你打开扫描,结果列表空空如也。别慌,按这个顺序查:
- 权限给了吗? Android 12以上需要
BLUETOOTH_SCAN权限,而且得是精确定位权限。我记得有一次调试了半天,结果发现模拟器没开蓝牙。 - 扫描参数对不对? 很多人直接用默认设置,但有些设备只广播特定Service UUID。试试用
ScanFilter过滤,或者干脆不设过滤先扫一遍。 - 扫描模式调了吗?
SCAN_MODE_LOW_LATENCY虽然费电,但调试时能救命。
小技巧: 我习惯在扫描回调里打印所有设备的名称和地址。有时候设备其实扫到了,只是名字为空,看起来像没扫到。
2. 连接不稳定,动不动断开
这个问题更隐蔽。你连上了,但过几秒就断。原因多半是:
- 连接参数不合适。 有些低端蓝牙芯片对连接间隔很敏感。我建议用
requestConnectionPriority设置高优先级,至少保证调试阶段稳定。 - MTU没协商。 默认MTU只有23字节,传大包数据时容易出问题。记得在连接成功后主动请求MTU:
bluetoothGatt.requestMtu(512)
- 信号干扰。 这个无解,但你可以加个重连机制。我一般会在
onConnectionStateChange里判断断开原因,如果是GATT_CONNECTION_TIMEOUT就自动重连。
3. 数据收发异常
写数据没反应?读数据全是0?
- 先确认UUID对不对。 我犯过最蠢的错误是把Service UUID和Characteristic UUID搞反了。
- 检查写类型。 有些设备只支持
WRITE_TYPE_NO_RESPONSE,你用WRITE_TYPE_DEFAULT就会失败。代码里显式设置一下:
bluetoothGattCharacteristic.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE
- 通知开关开了吗? 很多人忘了调用
setCharacteristicNotification,然后抱怨收不到数据。记得还要给Descriptor写值。
注意: 所有GATT操作都要在同一个线程里执行,别在回调里直接调另一个GATT方法。我习惯用一个Handler串行化所有操作。
性能优化:让你的App跑得更顺
BLE应用对性能要求其实挺高的。你想想看,手机既要跑UI,又要处理蓝牙数据,稍不注意就卡顿或者耗电。
1. 扫描优化
别一直扫。我见过有人把扫描写在onResume里,结果页面切换时反复启停。正确的做法是:
- 只在需要扫描的时候开启,比如进入设备列表页面。
- 设置超时,比如10秒后自动停止。
- 用
ScanSettings.Builder设置合理的扫描模式。后台扫描用SCAN_MODE_BALANCED就够了。
2. 数据解析优化
蓝牙传过来的数据通常是字节数组。别在主线程里做复杂解析。我一般会:
- 用
CoroutineScope(Dispatchers.IO)处理数据。 - 解析完再用
withContext(Dispatchers.Main)更新UI。 - 如果数据量大,考虑用
Flow或者LiveData做背压处理。
3. 内存管理
GATT对象别泄漏。每次断开连接后记得调用close()。我习惯在ViewModel的onCleared里做清理:
override fun onCleared() {
bluetoothGatt?.disconnect()
bluetoothGatt?.close()
bluetoothGatt = null
super.onCleared()
}
4. 功耗优化
这个容易被忽略。你想想看,用户用你的App连个手环,结果手机半天就没电了,谁受得了?
- 不用扫描时立刻停止。
- 连接参数别设太激进。连接间隔设30ms以上比较合理。
- 如果只是偶尔收数据,用
PHY_LE_1M就够了,别开PHY_LE_2M。
Google Play发布:审核那些事儿
发布到Google Play是最后一步,也是最容易出幺蛾子的一步。我前两年有个App被拒了三次,就是因为权限问题。
1. 权限声明
Android 12以后,蓝牙权限管理变得很严格。你需要:
- 在清单文件里声明
BLUETOOTH_SCAN、BLUETOOTH_CONNECT、BLUETOOTH_ADVERTISE权限。 - 运行时动态申请权限。
- 在Google Play Console里填写权限声明,说明你为什么需要这些权限。
重点: 如果你的App只做BLE中心设备(连接外设),不需要BLUETOOTH_ADVERTISE权限。别多申请,否则审核会问你要理由。
2. 隐私政策
只要你的App处理任何用户数据,就需要隐私政策。BLE App通常需要:
- 说明你收集了哪些数据(比如设备MAC地址)。
- 说明数据用途(比如用于连接设备)。
- 提供隐私政策链接,放在Play Store的App详情页和App内部。
3. 目标API级别
Google要求新应用必须target Android 13(API 33)以上。更新应用也要逐步提升。记得检查你的compileSdk和targetSdk。
4. 测试账号
如果你的App需要登录才能使用,记得在Play Console里提供测试账号。我有个朋友因为这个被拒了,审核人员进不去App,直接给打回了。
合规检查:别给自己挖坑
合规这事儿,说白了就是别踩红线。尤其是BLE涉及硬件和用户数据,稍不注意就违规。
1. 数据收集合规
- 别偷偷收集设备信息。如果你需要MAC地址,得明确告诉用户。
- 如果App有后台扫描功能,必须在隐私政策里说明。
- 欧盟用户要遵循GDPR,得提供数据删除功能。
2. 蓝牙规范合规
- 别用蓝牙做非法用途,比如未经授权读取他人设备。
- 如果你的App是BLE外设(广播模式),广播数据包别超过31字节。
- 遵循蓝牙SIG的规范,别用保留的UUID。
3. 无障碍合规
这个很多人忽略。Google Play现在会检查App的无障碍支持。至少保证:
- 所有按钮有
contentDescription。 - 扫描结果列表支持TalkBack。
- 连接状态变化有语音提示。
我的经验: 在发布前用Accessibility Scanner工具跑一遍,能发现大部分问题。
知识体系总览
下面这张图总结了本章的核心内容,从问题排查到发布上架,每一步都有对应的要点。
说实话,发布一个BLE App比普通App要操心得多。但只要你把上面这些点都过一遍,基本不会出大问题。我每次发布前都会拿这张清单逐项检查,省了不少事。
最后提醒一句:发布后别急着庆祝。多看看Google Play Console里的崩溃报告和用户反馈,有问题及时修。毕竟,用户可不会管你用的是不是BLE,他们只关心「这玩意儿好不好用」。
公众号:蓝海资料掘金营,微信deep3321