Commit Graph
2 Commits
Author SHA1 Message Date
butubb fa07ed0804 feat(platform): 设备端商店支持"请平台静默装"—— 设备请求、平台走 adb 落地
背景:设备端自己调系统安装器在 MIUI 上要过「继续 → 勾选未经安全检测 → 继续更新」
甚至 ICP 备案检查好几步;而平台用 adb(推送 + pm install)装是**静默**的,实测
升级 2.7s、全新安装 7.9s、336MB 大包也没弹过一次框。

所以给设备端商店补一个"请求平台装"的出口:用户还是在手机上选应用(应用商店体验),
真正干活的是平台,几秒钟装完、零弹窗。

- web/device_agent_api.py 新增 `POST /api/device/agent/install`:
  设备带令牌调它 → 平台复用应用管理的安装器(`apk_mgr.install`,本身已是
  推送 + pm install、并发 5 台)→ 返回是否受理;失败时设备端自行退回本机安装
- 鉴权与设备识别沿用同一套(令牌 + 指纹),未登记设备拒绝并说明原因

注:设备端 APK 那边的对应按钮改动已暂停(用户决定先不动 Agent),
这个接口属于平台侧能力,先落在本次分支里,等 Agent 恢复时直接可用。
2026-09-13 15:38:14 +08:00
butubb dad1af8b0b feat: 设备端应用商店(平台侧)—— Agent 直连拉清单/下载/安装,绕开 MIUI 的 USB 安装拦截
背景:`adb install` 在 MIUI 上被「USB 安装」拦下(USER_RESTRICTED),必须人工点确认;
而**由设备上的 App 自己调系统安装器**走的是普通应用安装流程,不触发那道拦截。

平台侧实现(设备端 Agent APK 在另一个仓库,契约见 doc/DEVICE_AGENT.md):

- web/device_agent_api.py(新):
  * 设备侧 `/api/device/agent/{bootstrap,apk/<id>,report}` —— 无登录会话,靠
    `X-Device-Token`(常量时间比对)鉴权;`X-Device-Fingerprint` 让平台认出是哪台设备
    (换 IP 也认得出,并把平台分配的名称回给它);**默认关闭,关闭时统一 404**,
    不暴露接口存在性;只读清单与文件,不返回任何配置/密钥
  * 管理侧 `/api/agent-store/{config,logs}` —— 登录 + 应用管理权限;启用时自动生成令牌,
    可一键重置(旧令牌立即失效)
- core/models.py:新增 `device_install_log`(下载/安装记录,自动裁剪保留 500 条)
- 应用管理页新增「📱 设备端应用商店」面板:开关 / 接入地址 / 令牌(复制·重置)/ 安装记录;
  面板里写明它与「平台批量推送」的分工
- doc/DEVICE_AGENT.md(新):**两个仓库共享的接口契约** —— 接入流程、三个设备接口的
  完整规格与错误码、adb 指令协议(剪贴板/身份显示/配置下发)、版本兼容约定、安全须知;
  API.md、DATA_MODEL.md、doc/README.md 索引同步

验证:
- 后端 9 组用例:默认关闭 404、无/错令牌 401、指纹认出设备名、清单、下载、上报与失败
  原因落库、关闭后重新 404、重置令牌后旧令牌立即失效、未登录管理端被拒 —— 全通过
- 真实浏览器:面板渲染、点开关 → 自动生成令牌 → 设备端带令牌拉到清单且 device.name=A08、
  无 JS 报错;测试后已把开关还原为关闭
- 全量回归 105 项通过(42 GET + 62 写探测 + 7 关键业务)
2026-09-13 14:40:38 +08:00