# 小鹏手表解锁 · 操作手册


> 这套方案让**红米 Watch 5** 上的一个小应用，通过小米互联把指令发给手机；手机收到后唤起 AutoJs6 脚本，自动划开锁屏、回桌面、点小鹏桌面小组件上的「车锁」按钮，并把结果回传到表盘。全程约 5 秒，不需要打开小鹏 App。
>
> 按 **1 准备 → 2 安装配置 → 3 使用 → 4 排障** 的顺序做一遍即可。⚠️ **车锁按钮点一次就是一次真实的锁车/解锁翻转**，联调时务必确认最终把车锁回去。

**先认几个名词**

| 名词 | 是什么 |
|------|--------|
| 桥接服务 | 手机上一个常驻后台服务，负责接收手表消息、触发脚本、回传状态 |
| AutoJs6 | 手机上的自动化工具，负责"点亮屏幕 → 划开锁屏 → 点小组件"这套动作 |
| RPK | 手表端快应用的安装包，用 AstroBox 安装 |
| 蓝牙设备解锁 | 手机系统里的一项授权，允许配对的手表在锁屏状态下解锁手机 |
| 小组件车锁 | 小鹏 App 放在桌面上的小组件按钮，点一下在「解锁 ↔ 上锁」之间**切换** |

---

## 1. 开始怎么准备

### 1.1 需要备齐的东西

| 项目 | 要求与说明 |
|------|-----------|
| 手表 | 红米 Watch 5（其他 Vela 快应用机型未验证） |
| 手机 | HyperOS / MIUI，能装 AutoJs6 与手表 Companion App |
| 车 | 小鹏，桌面已放好小鹏小组件的「车锁」按钮 |
| 成品包 | 手机端 APK、手表端 RPK、AutoJs 脚本（三样版本必须一致，见 §1.2） |
| 电脑 | 仅装包/传文件时需要，装 adb 或通过文件传输把 RPK 送到手机 |
| 工具 | AstroBox（装手表 RPK）、AutoJs6（跑脚本） |

### 1.2 版本必须一致

手机 APK、手表 RPK、AutoJs 脚本三者的版本号要一致，表盘页脚和 App 标题栏都会显示版本号，装错包一眼能看出来。以发布包里的 `VERSION` 文件为准，本文对应 **v2.1.1**。

> 若你手上是源码而非成品包：先用 `python tools/sync-version.py --check` 核对五处版本一致，再用 `bash tools/build-all.sh` 出包到 `dist/v<版本号>/`。这一步是开发者流程，普通使用者直接拿成品包即可。

### 1.3 动手前必读的 4 条

1. **动作语义是「切换」**：小组件车锁按钮点一次就在解锁与上锁之间翻转，脚本不读车况、也不判断方向。所以**点之前先想清楚当前是锁还是开**。
2. **联调完要确认车锁回**：看小组件图标——黑色闭合锁 = 已锁，绿色开锁 = 已解锁。远程解锁后若无人开门，车会自己回锁，但仍需人工确认最终状态。
3. **签名证书绝不外传**：打包用的自签名证书只留在本地，不要上传到任何公开位置。手机端覆盖升级要求同签名。
4. **服务要保活**：装完必须做「忽略电池优化 + 允许自启动」，否则后台被系统杀掉，手表点了没反应。

### 1.4 整条链路（理解了这个，排障就知道查哪一段）

```
手表点按钮
   ↓ 小米互联消息
手机 Companion 收到 → 回 ack → 发广播触发脚本
   ↓
AutoJs6：划开锁屏 → 回桌面 → 点小组件车锁按钮
   ↓ 本机回环 HTTP / 广播
手机把结果推回手表 → 表盘显示「上次操作」
```

任一段断了都会表现为「点了没反应」。排查时按 §4 的症状表分段验证。

---

## 2. 后面怎么配置

### 2.1 步骤总览

| 步骤 | 动作与验证 |
|------|-----------|
| 1 | 装手机端 APK、确认通知栏常驻「小鹏解锁 · 桥接服务运行中…」 |
| 2 | 装手表端 RPK（AstroBox） |
| 3 | **重新配对 + 重新加蓝牙设备解锁**（§2.2，顺序不能乱） |
| 4 | 部署 AutoJs 脚本到约定路径，绑定广播触发器 |
| 5 | 做保活设置（忽略电池优化 + 自启动） |
| 6 | 抬腕点一次，确认表盘显示「上次操作」 |

### 2.2 重装手表端后必做（顺序不能乱）

⚠️ 只要**重装过手表应用**或**换了手表**，以下三步必须全部重做一遍，少做一样就会出现「手表点了没反应」或「锁屏划不开」。

1. 先装好手表端 RPK，然后打开手机 Companion，等通知栏出现「小鹏解锁 · 桥接服务运行中…」。
2. **重新配对**：打开「小米运动健康」→ 设备 → 删掉旧的手表记录 → 重新配对（在手表上确认配对码）。
3. **重新加蓝牙解锁**：手机「设置 → 锁屏 → 蓝牙设备解锁」→ 把这块手表**重新添加**进去，并确认开关是开的。

> 原因：手表应用重装后，小米互联认的节点会变；锁屏的蓝牙解锁绑的是设备地址，重新配对后这项授权会失效。
> 手机端只是**覆盖升级**（同签名）时一般不用重做这三步；只有手表端重装或换表才需要。

### 2.3 装手机端 APK

1. 安装 APK（`adb install -r` 或直接点击安装）。
2. 打开 App，确认通知栏有常驻的「小鹏解锁 · …」。
3. 点「保活设置」：**忽略电池优化 + 允许自启动**。

### 2.4 装手表端 RPK

把 RPK 传到手机，用 AstroBox 安装。装完**回到 §2.2** 把配对和蓝牙解锁补上。

### 2.5 部署 AutoJs 脚本

1. 把脚本覆盖到手机 `/sdcard/Download/UURemote/HIGER/higer1_lockproof_v2.js`。
2. **文件名不要改，只覆盖内容**——广播触发器 `com.higer.xpeng.unlock` 已绑定这个路径。
3. 为防触发器绑的是另一个名字，可同时保留一份同内容的 `higer1_car_lock_2.0.0.js` 作为兜底。
4. 在 AutoJs6 里确认无障碍权限已开启，脚本能被广播唤起。

### 2.6 配置完成检查清单

- [ ] 通知栏常驻「桥接服务运行中…」
- [ ] 保活两项都开了（忽略电池优化、自启动）
- [ ] 小米运动健康里手表是**新配对**的那条记录
- [ ] 「设置 → 锁屏 → 蓝牙设备解锁」里这块手表已添加且开关打开
- [ ] AutoJs6 无障碍已开启，脚本在约定路径且文件名正确
- [ ] 桌面小组件的车锁按钮存在，且能手动点一次
- [ ] 抬腕点一次，表盘显示「上次操作：已切换车锁」

最后一条通过才算整条链路通了。

---

## 3. 后面怎么使用

### 3.1 日常操作

**抬腕 → 在表盘点一下按钮 → 等约 5 秒 → 看表盘结果**。手机会自动亮屏、划开锁屏、回桌面、点小组件，不用掏手机。

手机上锁屏与否都能用：锁屏状态下脚本会先划开再动作。

### 3.2 表盘显示含义

| 显示 | 意味着 |
|------|--------|
| 上次操作：已切换车锁 · N 分钟前 | 上一次执行成功 |
| 上次没执行成功 | 脚本没跑完（锁屏没划开、没找到小组件等），回报 `fail` |
| 状态未知 | 手机没收到脚本回传，看 §4 排障 |

### 3.3 只取结果、不动作

表盘点「同步」只取上一次的执行结果显示，**不会亮屏、不会动车**。想确认状态而不想触发锁车时用这个。

### 3.4 使用要点

- **切换语义**：点一次翻转一次，不要连点。想解锁变上锁，再点一次即可。
- 脚本不读车况，表盘的 `locked` 恒为「未知」是**设计如此**，不是故障；用 `done` / `fail` 判断有没有执行。
- 小组件按钮点下去直接执行，不会弹「解锁启动 / 仅解锁」；兜底路径也固定点「仅解锁」，不会误启动车辆。
- 服务被系统杀掉时，5 分钟看门狗会兜底拉起；若长期不生效，回去检查保活两项。

---

## 4. 出了故障怎么弄

### 4.1 先按症状定位

| 症状 | 先看 |
|------|------|
| **重装手表端后完全没反应** | §2.2：重新配对 + 重新加蓝牙设备解锁，漏一步就废 |
| 锁屏下没反应 | §4.2：查「解锁」文字是否找到、蓝牙设备解锁是否还挂着这块表 |
| 手表点按钮没反应 | §4.3：查 App 有没有收到手表消息、互联权限与配对 |
| 车没动但日志显示点了 | §4.4：查点击坐标是否超出屏宽（翻页没到位） |
| 表盘一直「状态未知」 | §4.5：查回环状态端口有没有收到数据 |
| 服务被系统杀掉 | 保活没做完（忽略电池优化 + 自启动），看门狗会兜底拉起 |
| 解锁后又自己锁上 | 车的保护逻辑：远程解锁后无人开门自动回锁，属正常 |

### 4.2 锁屏划不开

1. 先看脚本日志里有没有 `unlock: 点锁屏 '解锁'`。没有说明没找到锁屏上的文字元素——不同机型锁屏文案不同（「解锁」「开锁」「上滑解锁」「滑动解锁」），按实际文案调整匹配词。
2. 检查手机「设置 → 锁屏 → 蓝牙设备解锁」里这块手表是否还挂着。重新配对过就必须重新添加。
3. 若锁屏设了密码且没开蓝牙设备解锁，需要在脚本里配好 PIN 走数字键盘。
4. **不要用滑动手势去划锁屏**：HyperOS 锁屏上无障碍滑动注入不进去，脚本靠"点解锁文字"让锁消失，这是实测结论。

### 4.3 手表点按钮没反应

1. 看 App 日志有没有 `收到手表消息[…]`。没有就查小米运动健康配对是否已重做、互联权限是否已申请。
2. 装新包或进程重启后若日志出现 `you have registered`，说明小米互联仍认为旧监听在册：先移除监听再重新注册，脚本内已做退避重试，等一会儿再试。
3. 用表盘「同步」按钮测试：能取到上一次结果说明互联通道是通的，问题在脚本侧；取不到说明消息根本没到手机。

### 4.4 车没动但日志显示点了

看日志里 `点 id/ic_widget_1 @x,y` 的 **x 是否小于屏宽**。小米桌面把多页横向并排，无障碍给出的坐标可能是跨页的大值（如 1853 而屏宽只有 1200），点下去等于点在屏幕外。处理：把桌面翻到小组件所在页，让脚本先校验坐标在屏内再点；脚本会记住小组件位置，之后大多数情况无需翻页。

### 4.5 表盘一直「状态未知」

1. 看 App 日志有没有 `状态端口收到:`。有说明回传通道通，问题在表盘刷新；没有就是脚本回传失败。
2. 查脚本日志里的 `HTTP_ERR=` 行。常见两个原因：
   - 回传请求被发成了表单编码而不是 JSON —— 服务端已兼容两种格式，若仍是旧版服务端请升级。
   - 请求体含中文时按字符数读取会读不够，导致不回响应 —— 现版本按字节读取，升级即可。
3. 脚本日志在手机 `Download/higer_unlock.log`，状态快照在 `Download/higer_state.json`，App 日志区带「脚本│」前缀的是脚本回传内容。

### 4.6 诊断信息在哪看

| 位置 | 用途 |
|------|------|
| App 日志区 | 有没有收到手表消息、状态端口有没有收到数据、脚本回传日志（「脚本│」前缀） |
| `Download/higer_unlock.log` | 脚本每一步动作：划锁屏、找小组件、点击坐标、HTTP 结果 |
| `Download/higer_state.json` | 上一次执行结果快照 |
| AutoJs6 日志 | 脚本本身报错、无障碍是否生效 |

反馈问题时附上：发生时间、三样成品的版本号、手机/手表型号、表盘显示内容、相关日志片段。**公开反馈前记得检查日志里的个人路径和设备标识。**

### 4.7 已知硬约束与避坑

- 锁屏必须有办法划开；没开「蓝牙设备解锁」且设了密码时，需要在脚本里配 PIN。
- 桌面小组件必须在**某一页**上存在；被删掉会退化到「进 App 点车锁磁贴」的兜底路径。
- **重装手表端 → 重新配对 + 重新加蓝牙设备解锁**，两步缺一不可，这是头号坑。
- HyperOS 锁屏靠「点解锁文字」而非滑动；判断是否在锁屏用系统 API，不要靠包名猜。
- 小组件坐标要校验在屏内，跨页大坐标点了无效。
- 保活两项不做，后台被杀就是「点了没反应」。
- **联调/测试结束务必确认车已锁回**（黑色闭合锁图标）。
- 签名证书只留本地，绝不上传公开位置。


---

> 作者: [Higer](https://higer.ren/)  
> URL: https://higer.ren/docs/xpeng-watch-unlock-manual/  

