全书最重要的一个安全阀

如果说 CleanYourTV 的"可撤销"设计是一张安全网,那备份就是织网的线。这一篇要讲的事情,可以概括成一句话:在动电视之前,先把电视的"软件包状态"原原本本地记录下来,存成一份可以随时读回的文件。

为什么要单独用一篇来讲?因为整个方案的安全承诺——"一行命令恢复原样"——是有前提的:恢复脚本要知道"原样"长什么样。停用操作本身会生成恢复记录,但一份额外的、独立保存的状态文件,是双保险。它的存在让最坏的情况(误停系统组件、固件升级后异常)也有路可退。

备份到底备什么:三个层次

先说清楚备份的对象。CleanYourTV 语境下的"备份",不是给你拷贝视频、照片,而是记录电视的软件环境。它分三个层次:

层次 记录内容 由谁生成 用途
一 全部已安装软件包清单(含系统应用) 连接后由 tv.py 拉取 看清电视里都有什么,是勾选清单的依据
二 每个包的启用/停用状态 恢复记录文件 恢复时逐条还原
三 本次停用了哪些包、各自的原状态 disable 执行时自动写入 一键撤销的凭据

第一层是"体检报告",第二、三层是"病历档案"。CleanYourTV 的工具链把这三层都覆盖了:连接电视后,脚本先拉取完整清单,供你审阅;确认停用后,recovery.py 会把被停用的包及其原状态写进恢复文件;之后任何时候执行恢复,脚本读取这份记录,逐条把包恢复成原样。

换句话说,从你连接电视的那一刻起,"原样"就已经在被记录了。 你要做的主动动作只有一个:把这份记录妥善保存。

恢复文件:它长什么样,存在哪

恢复文件是纯文本,一行一个软件包名,可读性很好,用记事本就能打开。它的价值在于两点:一是机器可读——恢复脚本直接读它执行;二是人可读——你自己能看懂里面记了什么,心里有底。

保存位置有三个推荐,按优先级排:

  1. 电脑上的项目目录旁,和脚本放在一起。这是默认行为,恢复命令直接能找到它,最省事。
  2. 电脑上另开一个"电视备份"文件夹,把恢复文件复制一份进去,再顺手记下日期和电视型号。这是防"误删"的手工冗余。
  3. 云盘或 U 盘。电视清理不是天天做的事,恢复文件可能在抽屉里躺半年才用上,多一个异地副本,抗风险能力再上一层。

特别提醒:不要把恢复文件只留在电视上。 恢复的场景恰恰包括"电视出问题"的时候,那时电视自己未必靠得住。电脑、U 盘、云盘,至少占一样。

恢复的三种方式

有了备份,恢复就有三条路,从轻到重排列。了解它们的存在,比记住命令更重要——知道有后路,操作时才不慌。

方式一:跑恢复脚本(推荐)。 工具链里的 restore.sh 就是一键撤销:重新连上电视,执行脚本,它读取恢复文件,把所有被停用的包逐条恢复启用。这是最省心的路径,一条命令,几分钟完成。

方式二:用 tv.py 逐条恢复。 如果恢复文件不在手边,或者只误停了一两个应用,可以用 tv.py 连上电视,针对单个包执行 pm enable 重新启用。适合小修小补,本书第 4 章会演示具体命令。

方式三:电视上手动恢复。 被停用的应用并没有消失,只是从界面上藏了起来。进入"设置—应用—显示系统应用",找到目标应用,选择"启用",即可恢复。不用电脑、不敲命令,就是费点遥控器。

三条路对应三种心态:方式一是"我要全部反悔",方式二是"我后悔了其中一个",方式三是"我够不着电脑但想先救急"。三路都通,才叫可撤销。

固件升级后的特殊剧本

备份还有一个常被忽略的场景:电视固件升级之后。

系统升级会改写部分软件包的状态,可能出现:某个你停用的应用被系统重新启用;某个恢复记录里的包名在新固件中改名或移除;极少数情况下,升级后连恢复文件都对不上号。针对这个场景,工具链里有专门的 check.py:它在固件升级后核对当前软件包状态与恢复记录的差异,加 --fix 参数可以直接按记录恢复。

所以正确的时间线是这样的:清理完成 → 正常使用 → 电视弹出系统更新 → 升级完跑一次 check.py 核对 → 有出入就用 --fix 修复。养成这个习惯,你的电视就能长期保持清理后的状态,不会被一次悄悄推送的升级打回原形。

恢复文件里到底记了什么

打开一份恢复文件,你会看到类似这样的内容(示意,非真实数据):

# 电视型号:XXX
# 系统版本:Android TV 14
# 记录时间:2026-11-04 21:30
# 以下为本次停用的包及原状态
com.vendor.promotion.home / 原状态:enabled
com.vendor.game.center / 原状态:enabled
com.vendor.shopping.mall / 原状态:enabled

别小看这几行。包名(com. 开头的那一串)是安卓应用的唯一身份证,恢复脚本靠它精确定位;"原状态"一栏则区分了这个应用是"本来就用"还是"本来就停用"——恢复时,本来停用的不会被误开,本来启用的才回到启用。

看懂这份文件,你就拥有了最高级别的撤销权:哪怕脚本丢了,照着包名一个个 pm enable,也能把电视还原。这就是开源工具给用户的体面——所有关键信息都以人能读懂的形式交到你手里。

顺带提醒一个命名习惯:给恢复文件名加上日期和电视型号,比如 recovery-2026-11-04-sony-x90l.txt。电视清理不是天天做的事,半年后翻出一堆同名文件,你分不清哪份对哪台电视。

多次清理:恢复文件怎么管理

有人会问:我这次停一批、过两个月又想停几个,恢复文件怎么办?会不会互相覆盖?

好问题。正确的做法是每次清理都用一份新的恢复文件,旧的留档。因为恢复的语义是"回到上一次的状态",多份文件对应多个时间点的快照:

  • 第一次清理生成文件 A,记录"原始状态";
  • 第二次清理前,先备份当前状态生成文件 B,再执行新的停用;
  • 想回到最初,用 A;想回到第一次清理后,用 B。

工具链的设计支持这个用法:恢复时指定哪份记录,就回到哪个时间点。家有多台电视的,更要用文件名把"电视—日期"锁死,别让 A 电视的恢复文件被拿去救 B 电视——预装包名不同,救不了,还可能添乱。

手动兜底:两个要记住的命令

备份策略讲到底,是给自己留底牌。这里给两个"万一脚本都用不了"时的兜底命令,不需要理解原理,知道存在即可:

场景 做法
恢复单个应用 连上电视后执行 pm enable <包名>
查看所有被停用的包 连接后列出状态为 disabled 的包,逐个恢复

具体怎么执行、上哪输这些命令,第 4 章会用整篇篇幅讲 tv.py 的用法。这里先建立认知:恢复的主动权始终在你手里,脚本只是帮你省事,不是唯一通路。

备份检查清单

把这一篇浓缩成动手前的最后一张表:

序号 检查项 结果
1 已理解备份 = 软件包清单 + 状态记录 □ 是 □ 否
2 电脑上已建好专门文件夹存放恢复文件 □ 是 □ 否
3 恢复文件至少有一份在电脑/ U 盘/云盘上 □ 是 □ 否
4 知道三种恢复方式(脚本、单包、电视手动) □ 是 □ 否
5 知道固件升级后要用 check.py 核对 □ 是 □ 否
6 恢复文件名里能看出日期或电视型号 □ 是 □ 否

备份的心法可以概括成八个字:先存后动,留有余地。 电视清理不是不可逆的冒险,但"不可逆"和"麻烦"之间隔着的就是这份记录。花五分钟安排好的备份,会在未来某次手滑、升级或改主意时,替你省下一整个下午。

电脑那头还差最后一块拼图:Python 环境和 tv.py 的关系。下一篇用最短的篇幅把它讲清楚,之后我们就可以正式开始了。