两个脚本,一个分工

第 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。

动手前的检查

执行之前,确认三件事:

  1. recovery.py 已经跑过,恢复记录文件已生成,你知道它的文件名和位置。
  2. 最终清单已人工过目(ct-0304 的四问),数量、分类与你签字的一致。
  3. 连接畅通——用 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 章学过的顺序翻译成手动版,就是下面五步:

  1. 连接:确认无线调试开着,用 tv.py 探活。
  2. 备份:运行 recovery.py,拿到恢复记录(ct-0403)。
  3. 定清单:生成或修改禁用清单,人工过目(ct-0304 的方法照样适用)。
  4. 执行:bash tools/disable.sh,盯住输出,记录失败项。
  5. 验收:回首页看效果,有问题先想"是不是禁错了",是则 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 见分晓。