项目总结与发布:常见问题排查、性能优化、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()。我习惯在ViewModelonCleared里做清理:

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_SCANBLUETOOTH_CONNECTBLUETOOTH_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)以上。更新应用也要逐步提升。记得检查你的compileSdktargetSdk

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项目总结与发布知识体系 常见问题排查 • 扫描不到设备 • 连接不稳定 • 数据收发异常 • 权限与配置 性能优化 • 扫描优化 • 数据解析优化 • 内存管理 • 功耗优化 Google Play发布 • 权限声明 • 隐私政策 • 目标API级别 • 测试账号 合规检查 • 数据收集合规 • 蓝牙规范合规 • 无障碍合规 • GDPR/隐私法规 发布前自检清单 ✅ 所有权限已声明并动态申请 ✅ 隐私政策已准备并链接到App内 ✅ 无障碍支持已通过扫描工具检查 ✅ 蓝牙连接稳定性已测试 ✅ 内存泄漏已排查 ✅ 目标API级别符合要求

说实话,发布一个BLE App比普通App要操心得多。但只要你把上面这些点都过一遍,基本不会出大问题。我每次发布前都会拿这张清单逐项检查,省了不少事。

最后提醒一句:发布后别急着庆祝。多看看Google Play Console里的崩溃报告和用户反馈,有问题及时修。毕竟,用户可不会管你用的是不是BLE,他们只关心「这玩意儿好不好用」。


公众号:蓝海资料掘金营,微信deep3321