一个下午 + 一段 Prompt 搞定电视去广告:cleanyourtv 完整拆解
【免费下载链接】cleanyourtvDebloat any Android or Google TV over Wi-Fi and get an Apple TV-style home.项目地址: https://gitcode.com/gh_mirrors/tv/cleanyourtv
晚上十点,你按下电视电源键,画面先闪过十几秒关不掉的开机广告,再落进满屏推广位的原生主页。让这段等待消失的工具叫 cleanyourtv:通过 Wi-Fi 给 Android TV 和 Google TV 去广告、清预装,再装一个 Apple TV 风格的电视桌面,不 root、不插线、不卸载,发布几天就冲到 83 星/小时。这篇文章不复述它的爆红经过,也不写安装教程,只拆仓库里的四个设计决定。
一段提示词,怎么就长成了一个产品
仓库的第一入口不是 README,也不是源码,而是 PROMPT.md:把这份文档整段粘进 Claude Code 或其他带 shell 权限的编码助手,在一台和电视连着同一个 Wi-Fi 的电脑上,AI 就会替你跑完全程。开头先划边界:小米、TCL、海信、索尼、OnePlus、Nvidia Shield 这些 Android TV / Google TV 都适用,三星 Tizen、LG webOS、Fire TV 直接说"不行"。
有意思的是,提示词里没有一份垃圾应用清单,反而要求 AI 自己去数:把已装包列出来,按厂商遥测、厂商内容与广告服务、用不上的后台服务、预装应用分类,拿不准的先问人。品牌中立带来传播半径——同一段话贴在海信上、贴进索尼,流程一字不用改。
它把整套工作流也写成了动词:动手前备份完整包列表、getprop 输出和设置,"disable ... with pm disable-user, never uninstall system packages",小批量禁用,每批之间截图验证,收工前把 ADB 调试关掉。README 里"十五分钟"的说法就来自这套步骤:AI 照着走,人只回答三四个清单问题——哪些应用在用、Dock 放几个、要不要留语音助手和固件更新。传播链条从"看到、惊叹、关页面"变成"看到、粘进去、电视真的变了"。克隆仓库的读者还有捷径:助手直接复用 tools/ 和 launcher/,只需改一处配置文件。
你家电视里住着多少个"幽灵"
打开一台没动过的小米,examples/xiaomi-mi-tv-4a/debloat.txt 能数出 21 个可以安全关掉的包,注释分四堆。com.miui.tv.analytics、com.xiaomi.statistic是小米遥测与统计,数据一直在往云端送;com.mitv.tvhome.atv、com.mitv.tvhome.michannel、com.xm.webcontent撑起 PatchWall 主页的内容和推广行——首页那些滚来滚去的推荐位就是它们摆的;com.mitv.milinkservice行尾注释写得挺实在:Mi cast 会失效,Chromecast 仍可用;com.xiaomi.mimusic2、com.google.android.play.games属于"没人要过"的预装。
这份清单的组织方式本身就在转化用户。每行都回答"它是什么、禁了失去什么",打开清单的人本能地拿它对照自家客厅那台电视:这一行我家有没有?那个推广位是哪一段装的?对照动作发生的那一刻,用户已经把自己算进了项目——examples/ 目录下三百多个型号文件夹就是这么长出来的。
1GB 内存逼出来的工程纪律
PROMPT.md 的 Launcher 一节只给了一句预算:"Keep it light: the TV has about 1 GB of RAM. No blur, no video, no network polling."——1GB 内存,不许模糊、不许视频、不许网络轮询。这句否定是启动器的宪法,launcher/ 里的实现处处对应它。
整个界面只有一个会动的视觉元素:一块半透明玻璃板 GlassView.java,在布局里初始只有 10dp 见方,靠弹簧动画在磁贴间移动。它被缓存成硬件纹理,注释写明原因:弹簧只改位移,GPU 直接搬运纹理,免掉每帧重放裁剪和发光——正是绕开了 MT5895 芯片上让高光"爬"而不是"飞"的软件渲染路径。
弹簧参数在 MainActivity.java:刚度 260、阻尼比 0.58,高光落定前带一点回弹,液体感来自这里;关掉过冲则换成阻尼比 1 的临界阻尼,滑过去不荡。背景色写死在布局第一行#FF000000纯黑,时间日期全部交给系统TextClock,零自绘。Dock 的浅色圆角带同样不占布局层:DockDecoration.java 继承 RecyclerView.ItemDecoration,在网格第一行背后画一条渐变带,视觉和布局彻底解耦。
约束在这里就是设计语言:把 1GB 写进需求,代码里每一处取舍都有了依据。
让"反悔"比"动手"更容易
用户不怕试,怕的是试完回不去。这个仓库把退路做成了三件套。
备份先行:动手前,完整包列表、getprop 输出和全部设置先存进备份目录,再写一个能重新启用一切的还原脚本。手段选得轻:tools/disable.sh 只用pm disable-user --user 0关包,从不卸载系统包——就算工具全丢,也能进电视设置的应用页手动恢复;pm uninstall一旦执行就没有第二条路。一键还原:tools/restore.sh 接收同一份清单,把电视放回禁用前的状态,原本禁用的保持禁用,Home 交还原来的组件,动画缩放回到记录值。
脚本自己也在守退路:disable.sh 遇到 Android 核心包整单拒绝,注释里那台原装 Mi TV Stick 就是被清单带走核心包后从未再开机;关掉原 Home 之前,它先查还有谁能应答 HOME 意图。tools/tv.py 与 tools/b64push.py 是另一类兜底:前者绕开被 macOS 本地网络隐私拦掉的二进制 adb,后者把 APK 切成 48KB 的 base64 块走 shell 逐块传输并校验 md5,专治大文件 push 卡死。敢在真机上试错,信任就这么攒出来。
三件可以直接搬走的东西
把入口文档写成流程说明书,而不是源码导读。证据在 PROMPT.md:环境前提(同一 Wi-Fi、开发者选项)、步骤、逐步验证(截图)、回退方法(备份与还原)全写清楚,"给 AI 的那段话"就是第一交付物。迁移场景:任何需要在真实设备上跑一遍的自动化,都把这段流程说明放在仓库最上层,克隆下来十五分钟就能复现。
用否定清单加具体数字建立工程可信度。证据是 PROMPT.md 里"1 GB of RAM. No blur, no video, no network polling"这句需求,和 MainActivity.java 里刚度 260、阻尼比 0.58 这类可审计的常量。迁移场景:写规范时把预算和禁区写成可核对的否定句,性能承诺立刻有了凭据,读者看到的是一组数字而不是形容词。
让回退路径比前进路径更短。证据是 tools/disable.sh 的禁用而非卸载,与操作记录一一对应的 tools/restore.sh。迁移场景:任何改动线上状态的工具,先留备份,只选可逆的动词,再让还原命令和操作命令一样短——退路比行动容易,用户才敢动手。
开机广告那十几秒、满屏的推广位,如今只剩纯黑背景、一块跳动的玻璃高光和一行时钟。这套东西能从一个下午长成一个仓库,靠的不是更会吆喝,而是退路永远比操作短。信任从来不是宣传出来的,是退路比行动短攒出来的。
【免费下载链接】cleanyourtvDebloat any Android or Google TV over Wi-Fi and get an Apple TV-style home.项目地址: https://gitcode.com/gh_mirrors/tv/cleanyourtv
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考