---
name: sansheng-tv-adb
description: 用 ADB 给安卓电视（含 Fire TV、Google TV、老款海信/TCL/小米/创维/索尼等）去开机广告、停用预装应用、腾内存，不卸载不 root、每一步可还原。只要用户提到电视卡、电视有广告、清理/精简电视、电视 ADB、停用电视预装应用、开发者模式怎么开、电视调试，就用这个 skill——哪怕他没说「ADB」三个字。也用于判断某台电视值不值得做、找某品牌/系列的开发者模式入口、以及清理中途黑屏/连不上的处理。手机、平板的 ADB 精简不用它。
---

# sansheng-tv-adb · 电视 ADB 清理

这个 skill 让你替一个不会敲命令的人清理家里的电视：他拿遥控器开门，你连上去备份、分批停用、真重启验证，出了岔子先还原再排查。全程只做可还原的动作，每停一个包就写一行还原命令。

数据真源在 `data/brands/*.json`（22 个品牌、81 个系列，含入口步骤、证据等级、禁停/垃圾包名）；`scripts/tvadb.py` 是阶段机的命令行；`references/` 里是提示词兜底、坑、沟通范例。**先读完本文再动手**，遇到具体品牌再读 `entry` 命令的输出，不要凭记忆写入口步骤。

## 先想清楚三件事（读者第一性原理）

1. **他最怕的不是难，是折腾半天发现自己的电视不支持。** 所以第一步永远是判断「能不能、值不值」，30 秒内给结论；不适用就说清为什么、还能做什么，别往下走。
2. **他最需要的是安全感。** 每一步都告诉他：现在做什么、影响多大、怎么退回；出岔子第一句先说「电视没坏，系统在运行」。「停 / 恢复 / 跳过」三个词写在开场白里。
3. **改坏了没有借口。** 十二道安全闸写在脚本里，你不能绕；脚本层拒绝的事别用别的命令绕过去做。

## 用法路径

- **装了本 skill**：按下面的阶段机走，命令都是 `python3 <skill 目录>/scripts/tvadb.py <子命令>`。找不到 skill 目录就 `ls ~/.claude/skills ~/.agents/skills ~/.codex/skills ~/.gemini/config/skills 2>/dev/null | grep tv-adb`。
- **用户只给了网址**（sanshengai.top/tools/tv-adb）或只贴了提示词：读 `references/prompt-zh.md`（英文用户读 `prompt-en.md`），按同样的阶段机做，安全闸降级成你自己的纪律，并如实告诉用户「脚本没装，我按手工流程做，每一步都会给你看命令」。

## 阶段机（每一步停下来等用户回话，不一口气跑完）

| 阶段 | 你做什么 | 命令 | 停下来问什么 |
|---|---|---|---|
| 0 认机型 | 问品牌、遥控器有没有数字键、「设置 → 关于」里系统叫什么 / 安卓版本 | `identify --brand X [--version 9] [--system 名]` | 「你的电视是这几个系列里的哪一个？」把候选系列的「怎么认」念给他 |
| 1 开门 | 把这个系列的开发者模式入口步骤（含前提、风险）说给他，等他开好、给 IP | `entry --brand X --series N` | 「开好了吗？IP 是多少？」 |
| 2 连接 | 连上、等授权、读身份、判资格、建工作目录 | `probe <IP> [--wait 90]` | 授权框在电视上，让他勾「一律允许」；把资格结论念给他 |
| 3 备份 | 四类清单 + 内存 + 设置 + 全量包信息，sha256 清单 | `backup` | 告诉他备份目录在哪 |
| 4 预演 | 拿一个广告包「停 → 验 → 还原 → 验」，测出这台机能用哪条命令 | `dryrun` | 告诉他结果：这台机能用什么方式、能不能还原 |
| 5 分组 | 禁停 / 可停 / 需问 / 未知 四组；排成 ≤10 个一批 | `plan [--confirm-guessed] [--include a,b]` | 把「按包名猜的」和「看你用不用」两组列给他勾；他勾完再重跑 plan |
| 6 停一批 | 只停这一批，每包一行还原命令 | `batch --n 1` | 「请测四样：信号源键切 HDMI、音量、进一次图像设置、播一个片。都正常回我一声」 |
| 7 真重启验证 | `adb reboot` → 回连 → 画面 / 桌面 / 内存 / 停用状态是否保持 | `verify` | 念结果（可用内存变化）；通过才进下一批 |
| 8 岔子 | 黑屏 / 无响应 / 命令被拒 | `status` → `recover` → 必要时 `restore --all` | 第一句：「电视没坏，系统在运行，我先把这一批还原再真重启」 |
| 9 收尾 | 报告 + 结果卡 | `report --card` | 给三样：备份在哪、一句话全还原、开发者模式留着不碍事；邀请他投稿机型 |

每个阶段的固定说法见 `references/communication.md`；照着说，别自己发明。

## 十二道安全闸（脚本层强制，不许绕）

| # | 闸 | 在哪实现 |
|---|---|---|
| G1 资格 | Android < 5 或非安卓 → 停在阶段 2，给「连得上改不了 / 不适用」结论与替代动作 | `probe` 的 eligibility |
| G2 备份 | 没有 `backup/` 目录不许 `plan`，更不许 `batch` | `plan` 前置断言 |
| G3 回滚预演 | 没跑 `dryrun` 不许 `batch`；预演包必须停完再还原干净 | `batch` 前置断言 |
| G4 禁停硬名单 | 桌面 / 信号源 / 输入法 / 安装器 / 设置 / 遥控蓝牙 / 工厂重置 OTA / 电视核心服务 / WebView / 无障碍 / CEC / DRM + 品牌名单，脚本层跳过 | `data/generic-rules.json` + 品牌 `must_keep` |
| G5 命令降级 | disable-user → hide → uninstall -k --user 0；uninstall 必须 `--allow-uninstall` 单独预演过才可用 | `dryrun` / `batch` |
| G6 小批量 | 一批 ≤10；批与批之间必须收到用户「测过没问题」 | `batch` 拒绝 >10；你负责等回话 |
| G7 真重启 | 每批后 `verify`：先等系统把停用状态写盘（改完 20 秒内不重启），再 `adb reboot`，用 uptime 变小证明真的重启过；告诉用户遥控器关机是待机不是重启 | `verify` |
| G7b 复查 | 重启后检查停用状态有没有被系统悄悄恢复（酷开的 hide 会） | `verify` 的 `came_back` |
| G8 异常固定顺序 | 查状态 → 还原最近一批 → 真重启 → 不行再全还原 → 再重启；**不许**让用户拔电源当第一反应 | `recover` |
| G9 熔断 | 同一批两次异常、或用户说「停」→ `restore --all`，出报告结束 | 你执行 |
| G10 状态文件 | `state.json` + `rollback.sh` 每停一包即写；断了用 `resume` 接上 | 全程 |
| G11 临时项 | 禁停名单里的包若处于停用状态（且不是出厂就停的），`status` 会警告，批末必须恢复 | `status` |

## 四类分类怎么跟用户说

- **可停（有来源）**：品牌数据里标了广告 / 购物 / 上报 / 演示的，直接排进批次，说一句「这些不管谁家都不会用」。
- **按包名猜的**：脚本只会猜，不会自动停。列给用户，得到确认后 `plan --confirm-guessed`。
- **看你用不用**：语音助手、投屏、应用商店、账号、第三方影音。逐项问，他勾了哪些就 `plan --include a,b,c`。默认一个都不勾（稳妥模式）。
- **未知**：默认不碰。用户点名要停某个未知包，先查它是什么，查不到就不停。

## 出岔子时的判断顺序

1. 命令被拒（SecurityException / unknown command）：这是正常现象，`dryrun` 已经替你找到能用的方法；如果 `usable` 为空，这台机就是「连得上改不了」，告诉用户并结束，别去找 root。
2. 黑屏、桌面空白：先 `status` 证明系统在运行，再 `recover`。09-14 的实证是：全部还原再真重启就回来了，之后逐组藏包每组真重启都正常——黑屏多半是第一次停用触发的一次性系统重启，不是某个包的常驻问题。
3. 重启后没回连：等一分钟再 `verify`；电视重新弹授权框就让他再点一次「一律允许」。
4. `verify` 报 `came_back`：这台机的 hide 会被系统恢复，问用户是否允许 `dryrun --allow-uninstall`，预演通过再继续。
5. 任何你拿不准的：`restore --all`，比继续猜安全。

## 红线

- 不 root、不解锁 bootloader、不刷机、不讨论怎么做；用户问起就说结论：没收益，而且会让 Netflix 等只能放标清。
- 不用 `pm uninstall` 卸系统应用（没有 `--user 0` 的那种）；不用 `rm`、不碰 `/system`。
- 老电视（Android ≤ 9、内存 ≤ 2 GB）不换桌面：现代 launcher 装不上，原桌面又绑着信号源和设置。
- 给用户看的截图里，序列号、MAC 地址要打码；`report` 不打印它们。
- 不承诺「能挡系统更新」：Fire TV 等机型的 OTA 包受保护，停不掉。

## 什么时候读哪个文件

- 某品牌/系列的入口步骤、坑、命令能力 → 只用 `entry` 命令输出，不要自己翻 JSON 复述。
- 没装脚本的手工流程 → `references/prompt-zh.md` / `prompt-en.md`。
- 每阶段怎么开口 → `references/communication.md`。
- 实测踩过的坑（待机≠重启、黑屏、hide 被恢复、误标包名、老联想）→ `references/pitfalls.md`。
- 用户想投稿自己机型的入口 → `.github/ISSUE_TEMPLATE/new-tv-entry.yml` 的字段，让他照着填，或直接给他 GitHub issue 链接。

## 完成的标准

用户手里有：备份目录路径、一句话全还原命令、前后内存数字、停用清单（每条带还原命令）、一张结果卡；电视经过至少一次真重启验证通过；禁停名单里没有任何包处于我们造成的停用状态。缺一样都不算完成。
