两个脚本,一个分工
第 3 章的流程里,"禁用什么、留什么"由你和助手商量着定;到了手动阶段,执行与撤销由一对脚本负责:
| 脚本 | 职责 | 一句话理解 |
|---|---|---|
| disable.sh | 按清单批量停用应用 | 照单执行,把推广类预装一一停用 |
| restore.sh | 按改前记录一键撤销 | 翻旧账,把停用过的应用恢复回来 |
分工的背后是一条铁律:先记录,再修改。撤销的依据不是猜,而是修改之前留下的"案卷"——这份案卷由 recovery.py 生成(详见 ct-0403)。disable.sh 需要的恢复记录就来自它。没有记录,restore.sh 也无力回天。
disable.sh:照单执行
它做什么
disable.sh 读取一份禁用清单(ct-0304 里你签字的那份),通过 ADB 通道对清单上的应用逐个执行 pm disable-user。再强调一次这个命令的性质:它是设置→应用→停用的命令行等价物,只停用,不卸载,应用数据原样保留。这是项目安全承诺的核心——只使用电视提供给机主的开关,不 Root、不刷机、不绕 DRM。
动手前的检查
执行之前,确认三件事:
- recovery.py 已经跑过,恢复记录文件已生成,你知道它的文件名和位置。
- 最终清单已人工过目(ct-0304 的四问),数量、分类与你签字的一致。
- 连接畅通——用 tv.py 探活一句,
python3 tools/tv.py --ip 192.168.1.50 shell能进即可。
执行与预期输出
在项目根目录执行:
bash tools/disable.sh
脚本如需指定清单文件,按它的提示传入(具体参数与文件命名以脚本内注释、--help 和仓库 README 为准)。执行时预期看到:逐项输出处理结果,每项标注成功或失败;跑完后给出汇总,例如"成功 X 项,失败 Y 项"(格式以实际脚本为准)。
对输出中的失败项不必紧张:个别系统保护组件可能拒绝停用,这是正常现象,保持原状即可,把失败项记下来告知助手或自己存档。真正要警惕的是"大面积失败"——那通常说明连接出了问题,先修连接再重跑,别硬刷。
restore.sh:一键撤销
它做什么
restore.sh 依据改前记录(recovery.py 生成的恢复记录),把当时停用的应用逐一恢复启用。它的存在让"精简"从一条单行道变成了环线:不满意,撤;撤错了,再撤回来。
什么时候用它
三种典型场景:一是禁用了某个应用后日常离不开它,手动恢复;二是固件升级或误操作导致电视状态异常,需要回到改前状态;三是把电视转手之前,恢复原貌。
执行与预期输出
同样在项目根目录执行:
bash tools/restore.sh
预期看到:脚本读取恢复记录,逐项恢复启用并输出结果,最后汇总"恢复 X 项"。跑完后回首页核对:之前消失的应用图标回来了,被停用的应用可以正常打开,即说明撤销成功。
撤销之后
恢复完成后建议重启一次电视,python3 tools/tv.py --ip 192.168.1.50 reboot,让系统状态彻底刷新。首页若出现"幽灵图标"(应用在但显示异常),多数情况下重启即可解决。
flowchart LR
A[recovery.py 生成恢复记录] --> B[disable.sh 读取清单]
B --> C[逐项 pm disable-user]
C --> D[停用生效]
D --> E{不满意?}
E -->|是| F[restore.sh 依据记录撤销]
F --> G[恢复启用]
E -->|否| H[继续使用]
清单长什么样
disable.sh 照单执行,那张"单"——禁用清单——值得多说两句。它通常是项目目录下的一个纯文本文件,内容是按 ct-0304 的分类整理出的待停用应用名单,一行一个应用(具体格式、命名与脚本读取方式,以脚本内注释和示例清单为准)。清单有三个来源:助手在流程里生成的草稿、你人工把关后定稿的版本,以及日后固件升级后用 check.py 比对出来的补充项。
清单里的应用一般以包名形式出现,那是系统内部的应用标识,由工具列出时原样保留,不需要你手写、也不需要你读懂。你要做的只是在定稿前对照 ct-0304 的三类别四问过目一遍。定稿之后的清单建议单独保存一份——它和恢复记录一文一武,共同构成你电视状态的完整档案。
幂等性:为什么可以放心重跑
新手对脚本最大的顾虑是"跑坏了怎么办"。以 disable.sh 为例,它的操作是幂等的:对同一个应用执行一次停用和执行两次停用,结果完全一样,不会叠加、不会冲突。所以执行中途断网、断连,补救方式就是重新跑一遍,然后核对汇总输出,确认最终状态与清单一致即可。
restore.sh 同理:恢复一次和恢复两次,电视都回到"改前启用"的状态。真正需要小心的从来不是"重跑",而是"没有记录就动手"和"大面积失败硬刷"——前者让你失去依据,后者说明连接有毛病。避开这两个坑,这两个脚本是工具链里最让人放心的两位。
手动流程全景
把第 3 章学过的顺序翻译成手动版,就是下面五步:
- 连接:确认无线调试开着,用 tv.py 探活。
- 备份:运行 recovery.py,拿到恢复记录(ct-0403)。
- 定清单:生成或修改禁用清单,人工过目(ct-0304 的方法照样适用)。
- 执行:
bash tools/disable.sh,盯住输出,记录失败项。 - 验收:回首页看效果,有问题先想"是不是禁错了",是则 restore.sh 撤销。
注意第 2 步和第 4 步的先后顺序不可交换。本书的所有工具设计都遵循同一个世界观:修改永远发生在记录之后。这不是繁琐,是给你留的退路。
与 AI 助手流程的关系
第 3 章里,这两个脚本是助手在幕后调用的;第 4 章里,它们是你手中的工具。同一个脚本,两种用法——这正是 CleanYourTV "AI 流程与手动工具链同源"的设计:助手只是把工具按 PROMPT.md 的顺序串起来,你学会了工具,也就看懂了助手在干什么,卡住时能随时接管。
与 check.py 的接力
电视的固件升级会不定期把部分禁用"洗"回出厂状态,这时 disable.sh 与 restore.sh 需要和 check.py 打个配合:先运行 check.py 比对,拿到"被还原的项"清单;确认这些应用确实是你想继续停用的,再让 disable.sh 按补充清单重新执行一遍。反过来,如果某次升级后电视行为异常、你又吃不准是哪项被改动,就让 check.py 的报告当线索,该恢复的用 restore.sh 处理。
这一套"核对—再执行"的循环,细节都在 ct-0403。这里先建立一个印象:这两个执行脚本不是一次性的消耗品,而是伴随电视整个生命周期的常备工具。
常见问题
问:disable.sh 跑一半断了(比如网络抖动),怎么办?
答:重新跑一遍即可。停用操作是幂等的——已停用的应用再次停用不会出新问题。然后核对汇总输出,确认最终状态。
问:restore.sh 会把没禁过的应用也恢复吗?
答:不会。它严格依据改前记录行动,记录里没有的项不动。这也是为什么恢复记录要妥善保管。
问:恢复记录误删了,还能撤销吗?
答:自动撤销没有了,但可以手动恢复:连上电视,对想恢复的应用重新执行启用(对应 pm 系列命令,具体形态以工具 --help 与 README 为准),或去电视的设置→应用里把它改回启用。只是别再删第二次记录。
问:两个脚本要在电脑上跑还是电视上跑?
答:电脑上。它们是 Shell 脚本,通过 ADB 通道遥控电视,电视端不需要(也没有)额外安装。
问:disable.sh 执行时,电视能正常看吗?
答:停用操作在后台进行,电视画面一般不受影响,你甚至能照常看片。但建议执行的那几分钟里别做其他操作,留在屏幕前盯住输出——任何异常都是越早发现越好处理。
问:清单里的应用标识(包名)需要我手写吗?
答:不需要。清单由工具列出电视现存应用后整理而成,包名原样保留;你要做的只是分类和取舍,不涉及任何技术细节。
小结
disable.sh 与 restore.sh 是工具链里的执行对:一个照单停用,一个凭记录撤销;一个向前,一个兜底。用好它们的关键不在命令本身,而在顺序——先 recovery.py 留案卷,再 disable.sh 动刀。至于那份"案卷"怎么写、固件升级后又怎么核对,下一篇 ct-0403 见分晓。
