把手环当开发板:表盘和同步器的二次开发

起点很普通:我买过一个第三方同步器,能把设备里的数据同步出来,也能装别人做的表盘。同步器本身不难用,难用的是它把配置和这台设备锁在了一起。用了一阵发现一个问题:表盘资源和设备码是绑定的,同步器重装一次,旧密码就失效,表盘全部要重新配一遍。这件事很小,但每次重装都要重来一次,我决定自己重写手表端。

厂商的工具链是个黑盒

自己写的第一课,是接受工具链不透明。手表端的应用打包成一种资源包,签名、装机、和手机端通信,每一步都只有厂商给的命令,没有文档说明为什么。想改一个小地方——某一行文字的位置、某个按键的回调——要顺着打包产物里的字节码一层层找,找到那个常量,再回到源码里改。

这不是「逆向」那么浪漫的事,更多是体力活:改一个值、打包、装上去、看现象,再改回来。能复用的大部分只有两样东西:通信协议和资源格式。UI 层基本等于重写——原来的布局方式、事件模型、甚至滚动行为,都和常见的前端框架不一样。

现在这套东西由三块组成

部分用什么写负责什么
手机客户端Flutter,自己的包名同步数据、转发请求、保存配置
手表端资源用 rpk 打包界面、输入、和手机通信
构建环境本地脚本加签名证书打包、签名、装机

手机客户端用 Flutter 写,包名换成自己的,这样和厂商的客户端可以并存,不会互相覆盖。手表端是 rpk 资源包,构建环境放在开发目录里,签名证书也放在同一处,只在本机使用。

签名必须对得上

手机端和手表端要用同一套签名,否则装上去也连不通——握手第一步就校验,失败时只给一个很笼统的错误。这个坑我踩过一次:两端分别打包,证书不一样,表现是「安装成功、打开没反应」,查了半天才发现是签名不是代码。

npm run build     # 打出 rpk 资源包
./pack.sh         # 合进手机端并签名

每次构建完,我会在模拟器里跑一遍,再连拍几张截图存档。真机上还有没验证的路径——触摸、蓝牙重连这些,模拟器给不了。

学到的事

  • 协议比界面稳:接口字段几年不变,界面一年能改三版;
  • 资源格式要自己验:同样的内容,不同工具打出来的包,校验方式可能不一样;
  • 日志要留在自己手里:能看见对方回了什么,比猜快得多;
  • 别急着加功能:把「重装不用重新配」做对,已经解决了大半的烦。

重装一次的流程

现在的顺序是这样的:

  1. 装自己的手机客户端,包名不同,可以和原来的并存;
  2. 手表端装同一套签名的资源包;
  3. 客户端第一次启动时导入配置,之后再重装只装包,配置从本地恢复。

二次开发最省力的做法,往往不是把厂商的东西全换掉,而是只换掉那个每次都让你重来的环节。

不追新功能

这套东西最容易走偏的地方,是把它当成一个产品来做:加设置项、加主题、加动画。我给自己定的顺序反过来:先把「重装不用重新配」做对,再谈别的。因为前者每次重装都会遇到,后者只是偶尔想起来。

现在的状态是能用:数据能同步、表盘能装上、配置能恢复。还有很多没验证的地方,比如真机上的返回键、断线重连后的第一次发送。这些我都记在本子上,不装作已经解决。

手环本来是个消费品,被我当成一块开发板用。它的算力和屏幕都不值得期待,但「重装不用重新配」这一件事做成之后,它终于变成了一个我愿意每天戴的东西。