feat(rtos): 首次发布手机真机调试桥与S2探针

这个提交包含在:
sydxky 于 2026-11-14 13:25:37 +08:00 提交
当前提交 2f0f4b9702
59 个文件已更改
+4303

没有与搜索条件相匹配的文件

+29
查看文件
@@ -0,0 +1,29 @@
# 电脑通过手机调试 S2 真机
入口工程:[phone-debug-bridge](../phone-debug-bridge/README.md)。它是安装到 Android 手机的调试 APK,包名 `com.sydxky.rtos.bridge`;RTOS 手表应用仍使用 Glyphix `bundle.pkg`。
## 2026-11-14 更新
后续“尝试打通”补测:保留配对数据重启健康并等待重连后,取得 **OWW265 / runtime 0.8.0-5 / nucleus 0.8.0-229 / 手表 MAS 2006005**。0.2.0 APK 的安装/检查/启动请求恢复成功。探针 1.0.3 只请求 setKeepScreenOn,静置实测失败;1.0.4 增加 wakeScreenOn 前台 15 秒续期后,静置至少 159 秒仍显示探针,用户确认实体屏幕仍亮。手动点击后的官方截图显示计数 0→1。远程 launch 后仍可能停在表盘,前台调起、READY/TAP 日志、通用远程输入与真机 Inspector 尚未通过;常亮只证明本次短时前台调试。详情见[补测记录](../docs/VALIDATION.md)。电脑新增 `wait-link`,避免把 Binder 刚绑定误作手表已经连上。
后续实测使用已授权网络 ADB `YOUR_PHONE_SERIAL`(已核验为同一 P30PRO),可替换示例 USB 序列号;先用 `adb devices -l` 确认当前目标,地址可能变化。退出探针释放调试常亮。源码、圆/方构建、5 项常亮生命周期回归、模拟器 UI、实体手动触摸和实体短时亮屏分别记录。
工程已升级为 **0.2.0 / 3**,提供 APK 图片预览与圆屏安全区检查,以及电脑 `ui.py` 的截图、控件检查、点击、滑动和步骤报告。目标必须显式选择 `phone`、`watch-health`、`watch-import` 或 `inspector`;具体支持范围见工程 README。圆/方原生模拟器已验证 Inspector 截图、文字断言、按钮点击和步骤报告;S2 通用操控与 Inspector 隧道尚未确认。
**0.2.0 / 3 已实际安装到 P30PRO**,回读 APK SHA-256 与交付包一致;手机新界面的 SAF 导入、预览、安全区辅助线和电脑 PNG 导出通过。电脑已能自动导航官方健康界面并导出 S2 的 480×464 JPEG 表盘截图。该分辨率与 JPEG 格式来自实际公开文件,脚本支持健康添加的同名编号。
此前 0.1.1 已通过电脑认证回环接口绑定 `com.heytap.health`,检测到 Wear Engine **2006006 / 263**,手表连接查询为 true;厂商设备信息、日志开关、探针安装和启动返回成功。设备信息内容为空,探针 READY 日志、探针页面和点击仍需各自证据。最终范围见 [本轮记录](VALIDATION.md)。
修复安装目的路径为 `remote://mass/...pkg`,解决此前只传文件名导致的 `4008 rename remote file failed`;263 的信息、检查、启动和连接订阅使用手机包名,安装使用 appId。P30PRO 遇到 `bind_rejected` 时先打开已配对的运动健康,再重新连接;不修改 `authentication_state` 或配对数据。
后续从 `phone-debug-bridge` 运行 `bridge.py --serial YOUR_PHONE_SERIAL setup`、`connect`、`link`;安装/启动、日志命令和 `verify.py` 详见工程 README。手机 APK 是 Android Debug 签名的本地开发工具,未作为上架包发布。
## 2026-11-13 历史检查
用户于 2026-11-13 表示:P30PRO 已在运动健康配对 S2。电脑 ADB 当前确认手机为 `YOUR_PHONE_SERIAL` / `VOG-AL00` / Android API 29。发现 `com.heytap.health` 中的 `com.glyphix.mas.service.WearEngineService`,Action `com.xfaith.glyphix.WEAR_ENGINE_ACTION`,exported=true、无绑定权限要求。开始检查时健康版本为 6.9.37(6093700);结束前再次查询已为 `6.10.15_9e2a81e_261107`(6101500),后续测试须以手机当时实际版本为准。
电脑调用 Python CLI → USB ADB 端口转发 → 手机回环认证 API → bindService / Binder → 运动健康负责传输 → S2。无需给 RTOS 手表打开 Android ADB。
手机工程提供服务发现、262 / 263 协议选择、设备信息、应用检查 / 安装 / 启动、消息 / 文件、RPC 日志和异步作业查询。另有独立 [deviceprobe](../com.sydxky.rtos.deviceprobe/README.md) 用于验证链路。最短复现命令、构建工具、接口边界和后续验收都在手机工程 README;实际通过与未通过项见 [验收记录](VALIDATION.md)。
注意区分:用户已配对、电脑已识别手机、手机 Binder 已绑定、手表在线、包安装成功、页面运行、人工触摸与显示,以及平台上架,分别需要各自证据。参考仓库针对 Watch S / OWW262 的成功记录不替代 S2 结果。
+18
查看文件
@@ -0,0 +1,18 @@
# 独立公开源码验证
2026-11-14,Windows / PowerShell 7。仅本仓库的源码参与构建,JDK、Android SDK、Glyphix SDK 和模拟器 global/launcher 均从本机已授权工具位置提供,不纳入仓库或源码包。
| 检查 | 结果 |
| --- | --- |
| Python 标准库回归 | 20/20 通过 |
| Node 常亮生命周期 | 5/5 通过 |
| Android assembleDebug + lintDebug | 成功,0 errors / 9 warnings |
| 圆 / 方 QuickApp | 两种构建成功,完整六文件 |
| 圆 / 方原生模拟器 UI | 文字断言、按钮点击、截图及步骤计划通过 |
| 源码敏感扫描 | 未发现真实令牌、私钥、设备序列号、私有目录或内部 Git URL |
独立目录重新构建的 APK SHA-256 为 `1128A0AD6B9EF351C00450C92228CD2A4AF19D2538DB1BDAFD4B0C854EBE440F`。与发行附件 `316221A6751C9ED8A23BD1FA4381F8AA35620AB1A85123468F8DD04811F880E0` 的所有 ZIP 条目内容逐项一致,但完整归档字节不相同。本项目不声称 APK 字节可复现。发行附件沿用已在 P30PRO 实装并回读核验的原始 APK,自行构建也会受本机 debug 签名材料影响。
探针圆屏 bundle.pkg SHA-256:`7E4A2F507CE20290AE05DE32A1AEAF6423E8145A165DA52D658E0E8FCB44E5F3`;方屏:`3D12F4BA7218C9B7140731ED484C8DC7EF625FFE4AC28114DB276690A01A9BE4`。公开源码构建结果与本次 S2 实装的圆屏包一致。
S2 的实体亮屏和手动触摸证据另见 [真机记录](VALIDATION.md),不能用模拟器或构建通过替代。
+11
查看文件
@@ -0,0 +1,11 @@
# 隐私与调试安全
手机桥不连接本项目的云端服务,仅在手机回环地址 127.0.0.1:18765 提供 API,经已授权 ADB forward 供电脑使用。使用随机 256 位 Bearer 令牌,拒绝浏览器 Origin,不开放 CORS。令牌由 PC 工具通过已授权 ADB 的 run-as 读取,不写入 PC 配置或验收报告。
APK 无存储、蓝牙、位置、麦克风或无障碍权限。安装包通过应用私有上传目录传入,跨进程仅交付只读文件描述符;图片通过 Android 系统选择器导入。官方手表截图仍由运动健康负责,可能保存在它自己的公开图片目录。使用网络 ADB 时由用户负责其原有授权和网络环境,桥 API 不改为监听 Wi-Fi 地址。
事件和作业只在手机进程内有界保存,可能包含被调试应用主动输出的业务内容。分享日志前应检查;verify.py 只输出设备白名单和探针标记,不输出 MAC、UUID、vendorId、license 或 Bearer。上传缓存最多 4 个文件 / 64 MiB,单文件最多 32 MiB。
默认 test/test 仅为演示占位值,不是厂商授权凭据。实际互联应使用自己的 appId/license,本地连接文件匹配 *.local.json 并已被 Git 忽略。不要提交或公开该文件、令牌、日志中的个人资料、签名密钥或手机配对数据。
结束时关闭已开启的日志、disconnect、cleanup、stop,并退出探针以释放前台常亮。cleanup 只删除本桥上传缓存,不删除健康配对或用户截图。Debug APK 的 run-as 能力和回环 API 用于开发测试,发行版不是生产后台服务或商店版本。
+57
查看文件
@@ -0,0 +1,57 @@
# S2 真机链路补测与常亮探针
日期:2026-11-14,Asia/Shanghai。手机 APK 保持 **0.2.0 / 3**;手表探针为 **1.0.4 / 10004**。当前已通过真机设备信息、安装、官方截屏、探针页面、手动触摸,以及本固件上至少 159 秒的前台静置常亮。通用远程输入和真机 Inspector 尚未通过。原始失败报告保留。
## 真机链路与设备
保留配对数据重启运动健康、正常打开并等待 connected=true 后,设备信息、应用检查、日志开关、探针安装及启动请求恢复 code 200。Binder bound 早于手表在线;`wait-link --seconds 45` 只轮询在线查询,不重放安装或写入 RPC。尚不能断言所有 `3000 svc exec failed` 都能由此解决。
实际设备信息放在回调 **msg 的 JSON 字符串**中,values 为空;已修复白名单解析并增加脱敏回归。设备报告 OPPO / **OWW265**,nucleus **0.8.0-229**,runtime **0.8.0-5**,手表 MAS **2006005**;手机 SDK **2006006 / 263** 是手机接口版本。报告不保留 MAC、UUID、vendorId 或原始健康业务日志。
P30PRO 为 VOG-AL00 / API29,运动健康 6.10.15。USB 离线后,通过核验为同一手机的已授权网络 ADB `YOUR_PHONE_SERIAL` 完成后续操作。其他 OWW261 ADB 设备不属于本链路。地址可能变化,先查询 `adb devices -l`,按当前手机地址替换示例。手机调试 API 仍仅监听回环地址。
## 常亮:失败记录与修复结果
1.0.3 只调用 `@system.brightness.setKeepScreenOn(true)`。离开充电座、用户重新打开后取得起始探针图;至少 79 秒后复查已回到表盘,用户明确回复“已熄屏”。因此该版本常亮实测失败,不能继续写作仅充电遮挡或待验证。
1.0.4 增加 `wakeScreenOn({ screenOn: true })`,按官方文档省略 timeout 表示不限时间,并在前台每 15 秒续期。隐藏/销毁均清理定时器、使旧回调失效并释放 setKeepScreenOn(false);没有在后台持续唤醒,也没有修改亮度、自动亮度或永久系统设置。参考了官方接口及用户指定仓库的前台续期用法;Watch S 的参考结果不替代 S2 实测。
| 1.0.4 实测 | 结果 |
| --- | --- |
| 用户状态 | 已取下充电座,打开探针后不触摸 |
| 起始截图采集完成 | 13:01:35,探针 1.0.4,次数 0 |
| 复查请求 / 完成 | 13:04:14 / 13:04:25,保守静置至少 159 秒 |
| 复查画面 | 仍显示探针 1.0.4、“常亮续期中 · 待实测”、次数 0 |
| 实体屏幕观察 | 用户回复“仍亮着,显示探针” |
| 手动触摸 | 用户在 S2 点一次按钮;随后官方截图确认次数 0→1 |
静置前后画面相同,JPEG SHA-256 均为 `B46FD339DCEE4D6BA5406C98847867A6F50F89A64F605CADA383125EE6C1C13A`;手动点击后为 `4E0EACFFAEFEF868382D8D92DB2F07864090306F9B3D61114D3CBC9630783AAB`。图片均为官方健康截屏流程导出的 480×464 JPEG。交付证据含前后采集记录、1.0.3 失败记录、实体观察回复及手动点击图。截图单独不能证明 OLED 通电,亮屏结论同时依据用户现场观察。
验收范围为这台 S2、当前固件的短时前台调试常亮,尚未测试长时间续航或全部系统策略。页面保留“待实测”文案,因为每次新设备/会话仍需观察。退出探针可释放调试常亮。P30PRO 原有 stay_on_while_plugged_in=3 已保留。
来源:[Glyphix 亮度管理](https://docs.xfaith-tech.com/glyphix/docs/api/system-brightness.html)、[用户指定参考仓库](https://github.com/chengchengking/oppo-watch-s-sideload/tree/main)(本地快照 `162fca4aa51302e18ee9802dc5269e54814c02e8`,本轮未刷新)。
## 仍未打通的能力
用户从图标打开的探针 1.0.0 和 1.0.4 均有真实页面证据。多次远程 launch 返回 200 后截屏仍为表盘,故远程前台启动尚未确认。当前手动触摸成功不能证明 PC 触摸注入;通用 S2 点击/滑动、Inspector 隧道和 JS console READY/TAP 仍未通过。
`auto_test_start` / `auto_test_stop` 最小脚本均最终返回 **3000 svc exec failed**。之后一次安装在 0 字节进度后失败,重启健康并等待重连后安装恢复。这是观察到的恢复路径,SDK 内部根因尚未确定。
临时 1.0.1/1.0.2 网络探针没有收到电脑服务请求,未作为成功通道,最终源码已移除该通道。未修改认证状态、冒充健康、替换桌面槽位或清理配对数据。
## 软件验证与后续使用
20 项 Python 测试通过;1.0.4 的 5 项生命周期 Node 测试通过,覆盖定时器唯一性、隐藏/销毁释放、旧 Promise 隔离、缺少接口和亮屏拒绝停止续期。圆/方 QuickApp 构建与两种原生模拟器 UI 通过。模拟器控件自动点击独立于 S2 手动触摸证据。本轮未修改 Android 源码或 APK,沿用已实装并回读核验的 0.2.0 包。
从 phone-debug-bridge 目录运行(按 `adb devices -l` 选择同一手机):
```powershell
python bridge.py --serial YOUR_PHONE_SERIAL connect
python bridge.py --serial YOUR_PHONE_SERIAL wait-link --seconds 45
python bridge.py --serial YOUR_PHONE_SERIAL info
python ui.py --target watch-health --serial YOUR_PHONE_SERIAL screenshot --output artifacts/s2.jpg
```
若服务持续 3000,先查看已有作业结果;可保留配对数据重启健康,等待重连再单次验证。重启健康会短暂中断同步。不要把未确认支持的 RPC 放入自动循环。
RPC 日志此前已成功关闭,本轮未重新开启;上传缓存已清理。临时电脑网络服务及 18766 反向转发已移除,手机桥与 18765 正向转发保留供后续调试。结束时执行 `bridge.py --serial <当前手机> disconnect`、`cleanup`、`stop`;退出手表探针结束应用常亮。未发布应用商店或生产服务;独立源码及附件发布另见本仓库发行版。
二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 20 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 20 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 20 KiB

+138
查看文件
@@ -0,0 +1,138 @@
{
"time": "2026-11-14T13:19:25.716596+08:00",
"phone": {
"model": "VOG-AL00",
"androidApi": 29,
"bridgeVersion": "0.2.0",
"installed_apk_sha256": "316221a6751c9ed8a23bd1fa4381f8aa35620ab1a85123468f8dd04811f880e0",
"stay_on_while_plugged_in": 3,
"setting_preserved": true
},
"wear_engine": {
"bound": true,
"protocol": 263,
"phoneMasVersion": 2006006,
"connected": true
},
"watch": {
"brand": "OPPO",
"model": "OWW265",
"runtimeVersion": "0.8.0-5",
"nucleusVersion": "0.8.0-229",
"masVersion": 2006005
},
"recovery": {
"paired_health_process_restarted": true,
"pairing_data_preserved": true,
"waited_for_actual_link": true,
"info_callback_success": true,
"logs_on_callback_success": true,
"logs_off_callback_success": true,
"probe_check_callback_success": true,
"probe_install_callback_success": true,
"probe_launch_callback_success": true,
"remote_launch_foreground_confirmed": false
},
"probe": {
"manual_open_page_screenshot": true,
"page_screenshot": "S2-1.0.4-静置复查.jpg",
"page_screenshot_sha256": "b46fd339dcee4d6ba5406c98847867a6f50f89a64f605cada383125ee6c1c13a",
"page_version": "1.0.4",
"count_visible": 1,
"ready_console_marker_received": false,
"tap_marker_received": false,
"physical_click_verified": true,
"installed_version_now": "1.0.4",
"installed_version_callback_success": true,
"keep_screen_request_user_reported": true,
"keep_screen_idle_verified": true,
"latest_capture_interfered_by_charging_overlay": false,
"manual_tap": {
"user_response": "已点击,次数变为 1",
"capture_request_started": "2026-11-14T13:05:29.919590+08:00",
"file": "S2-1.0.4-手动点击.jpg",
"sha256": "4e0eacffaefef868382d8d92db2f07864090306f9b3d61114d3cbc9630783aab",
"before_count": 0,
"after_count": 1,
"passed": true,
"input_origin": "human_watch_touch_not_PC_injection"
},
"installed_version_screen_confirmed": "1.0.4",
"keep_screen_idle_minimum_seconds": 159,
"physical_screen_user_response": "仍亮着,显示探针",
"keep_screen_scope": "short foreground idle observation on this S2 firmware; no long endurance or permanent system-setting claim",
"keep_screen_1_0_3": {
"passed": false,
"minimum_idle_seconds": 79,
"after_image": "watchface",
"user_response": "已熄屏"
},
"keep_screen_1_0_4": {
"date": "2026-11-14",
"timezone": "Asia/Shanghai",
"phone_transport": "authorized_network_adb_same_phone_verified",
"watch": "OPPO Watch S2 / OWW265",
"probe_version": "1.0.4",
"charger_removed_user_confirmed": true,
"user_no_touch_requested": true,
"baseline": {
"command_completed": "2026-11-14T13:01:35+08:00",
"file": "S2-1.0.4-静置起始.jpg",
"sha256": "b46fd339dcee4d6ba5406c98847867a6f50f89a64f605cada383125ee6c1c13a",
"image_content": "probe1.0.4; count0; 常亮续期中 · 待实测"
},
"after": {
"request_started": "2026-11-14T13:04:14.148761+08:00",
"command_completed": "2026-11-14T13:04:25+08:00",
"minimum_idle_seconds": 159,
"file": "S2-1.0.4-静置复查.jpg",
"sha256": "b46fd339dcee4d6ba5406c98847867a6f50f89a64f605cada383125ee6c1c13a",
"image_content": "probe1.0.4; count0; 常亮续期中 · 待实测"
},
"physical_screen_user_response": "仍亮着,显示探针",
"keep_screen_idle_passed": true,
"scope": "short foreground idle observation on this S2 firmware; no long endurance or permanent system-setting claim",
"screenshot_alone_proves_physical_light": false,
"manual_tap": {
"user_response": "已点击,次数变为 1",
"capture_request_started": "2026-11-14T13:05:29.919590+08:00",
"file": "S2-1.0.4-手动点击.jpg",
"sha256": "4e0eacffaefef868382d8d92db2f07864090306f9b3d61114d3cbc9630783aab",
"before_count": 0,
"after_count": 1,
"passed": true,
"input_origin": "human_watch_touch_not_PC_injection"
},
"official_screenshot_dimensions": [
480,
464
]
}
},
"unsupported_or_incomplete": {
"auto_test_start": "failed code3000 svc exec failed after initial client timeout",
"auto_test_stop": "failed code3000 svc exec failed after initial client timeout",
"probe_network_poc": "no request received; not retained in final probe",
"general_watch_input": "not verified",
"physical_inspector_tunnel": "not verified"
},
"software": {
"python_tests_passed": 20,
"probe_round_build": true,
"probe_rect_build": true,
"native_emulator_ui_round": true,
"native_emulator_ui_rect": true,
"screen_lifecycle_node_tests_passed": 5,
"probe_version_tested": "1.0.4"
},
"cleanup": {
"rpc_logs_off_callback_success": true,
"temporary_network_server_stopped": true,
"temporary_adb_reverse_removed": true,
"upload_cache": {
"deleted": 1
},
"phone_bridge_left_running_for_user_debugging": true,
"adb_forward_18765_left_active": true
}
}