ARTICLE · 1218875
我什么都没卸载,电视里的广告却全没了
我爸妈的小米电视,想看个电视剧,得先看完一条广告。某个下午我用 AI Agent 连着这台真电视,把广告位、遥测服务和一堆预装应用处理干净,后来整个过程整理成了 tv-vibehack 这个仓库,提示词、工具和二十多台机型的实测清单都放在里面。这篇文章把整条链路讲一遍,包括为什么每一步都能撤销,以及路上踩过的坑。全程不用 root,不接线,不卸载任何东西,后悔了一行命令还原。
01 这套做法到底动了电视什么
安卓电视和安卓手机跑的是同一套系统,自然也带着同一个调试桥 adb。在电视的开发者选项里打开 USB 调试,电视就开始在 Wi-Fi 上监听连接,你第一次从电脑连过去时,电视上会弹一次授权确认。从这一刻起,能用的全是标准 Android 工具。
流程压在三步里。先备份,把电视当前安装的包列表和设置存下来;再停用,把厂商的遥测、广告服务、首页推荐位和预装应用用 pm disable-user 逐个停掉;最后装一个轻量桌面,让它接管 Home 键。
pm disable-user 停用的是用户配置层里的包,包本身原样留在系统里,随时可以再启用。恢复脚本之所以能把每一步都撤销回去,靠的就是这个设计。固件分区从头到尾没有被碰过,这一点是后面所有安全性讨论的前提。
预装的东西每个品牌、每个型号都不一样,所以提示词不拿固定清单往上套,它先在你的电视上把预装翻一遍,列出清单问你哪些可能还要用,确认完才动手。你日常在用的应用不会在这一步被误伤。

操作流程示意|先备份,再停用,最后更换桌面
02 会不会把电视搞坏
先把结论放在前面。整个流程里没有刷机、没有 root、没有删文件,这三样恰好是变砖的主要来源,所以固件本身没有任何风险,停用动作只发生在数据分区的用户配置层。
真正会出问题的地方,是停用了电视赖以运行的组件。仓库里记录过两起,一台海信停用之后开机直接进了 Android Recovery,按了 “Try again” 才退出来;Google TV 上如果把原生桌面停掉、又没处理好接管顺序,Home 键会陷入崩溃循环。这两个坑的解法都写在后面踩坑那一节。
所以执行上有一条纪律,清理清单分小批应用,助手做的备份文件夹原样留好,restore.sh 放在手边备用。就算哪天电脑和工具都不在,电视本机的设置→应用页面也能把停用的包一个个重新启用。恢复出厂是最后手段,别把它当第一反应。
权限上的疑问也一并回答。整套操作走的是 Android Debug Bridge,连接时电视上要明确点一次允许,和平时开发安卓应用走的是同一个口子,电视只信任你批准过的那台电脑的密钥。事后把 USB 调试关掉,装好的桌面照常工作。
03 实际操作只有三步
准备工作只要两样,一台和电视连着同一个 Wi-Fi 的电脑,一个能执行 shell 命令的编程助手,Claude Code 或者同类工具都行。
第一步在电视上。打开设置,进设备偏好,进关于,对着 Build 一项连按 OK 七次,开发者选项就解锁了。退回去进开发者选项,打开 USB 调试。有些电视还会多出一个 Network 或 ADB 调试的开关,一并打开。这期间电视保持开机。
第二步在电脑上。打开你的助手,把仓库 PROMPT.md 里的提示词整段粘进去,把里面的电视型号替换成你自己的。
第三步跟着走就行。电视上弹出允许 USB 调试的确认框时点允许,然后助手会依次问你几个问题,常用哪些流媒体应用、底部 dock 里放哪四个、语音助手留不留、Chromecast 留不留、固件更新留不留。答完之后它自动把备份、清理、编译、安装、验证一气做完,每一步都用从电视拉回来的截图确认过,再进下一步。
时间上有个参照。第一次在一台 1GB 内存的 Mi TV 上做,花了一个下午。仓库收到过反馈,拿仓库当上下文再跑,十五分钟左右就能走完。
04 哪些电视能这么干
凡是跑 Android TV 或 Google TV 的机型都在范围内,小米、红米、TCL、海信、索尼、一加、Realme、Nvidia Shield 都算。三星和 LG 不行,它们跑的是 Tizen 和 webOS,完全是另一个体系。Fire TV 能做一半,清广告和遥测没问题,但 Fire OS 不允许第三方桌面接管 Home 键,换桌面这一步过不去。
examples 目录里收着 21 台网友实测过的机型,系统版本从 Android TV 9 一路覆盖到 Google TV 14,小米的电视、盒子和电视棒占了不少。你的型号不在清单里也没关系,提示词本来就要在你的电视上现场发现预装清单。做完之后把自己机型的 debloat 清单贡献回去,下一个同型号的人就不用重新摸一遍,这些机型清单大部分本来就是当初那条推文的评论区里来的。
05 换上的桌面长什么样
背景是纯黑的。屏幕底部一条浅色圆角横带(dock),里面放你挑的四个常用应用,位置和 Apple TV 一致。焦点落在哪个应用上,顶部就用大字号显示它的名字,旁边一圈环境光晕,颜色取自该应用自己的图标素材。按下方向键,其余应用以网格形式从底部滑出来。
高亮是一整块悬浮的玻璃片,在磁贴之间弹来弹去,被点到的磁贴微微抬起,显出名字。顶部一排三个磨砂按钮,输入源点开是各路 HDMI、AV 和直播电视的列表,Wi-Fi 按钮显示当前连的网络,最后一个是设置。问候语、大字号细体的时钟和日期,用 Outfit 字体排出来。
屏保是配套的时钟,钟面每分钟挪一个位置,光晕随之变色,系统只在电视空闲时运行它,烧屏的问题不用再惦记,在电视的屏保设置里选 Clock,或者用一条 settings 命令就能打开。
遥控器上的输入源键也照顾到了。Google TV 的原生桌面本来就接这个键,其他情况可以装一个可选的无障碍服务,把 KEYCODE_TV 映射到系统输入切换器,安装时带上 INPUT_KEY_SERVICE=1 就启用。
这个桌面是仓库自己写的,包名 com.gathin.tvhome,装好约 250KB,纯 Java 加 AndroidX RecyclerView,没有更重的东西。为 1GB 内存的电视做的取舍很直白,无模糊、无视频、无网络、无后台服务。自己动手写的直接原因之一,是市面上的第三方桌面经常把换壁纸这类基本功能做成收费项。
配置全集中在 launcher 的 config.xml一个文件里。dock 的顺序、要隐藏的应用、你电视的直播应用包名、网格列数(5 列起磁贴自动缩小适应)、dock 下方保留几行网格,都在这里改。盒子和电视棒没有 HDMI 口和调谐器,输入源按钮会自己隐藏。导航逻辑也抠过,上下键一次只动一行,从 dock 往上先到顶部按钮排,按钮排两端不会越界跳到磁贴上,回到桌面时停在上次聚焦的应用,应用列表中途变过也一样。
config.xml 里还有一个可选开关 show_home_settings_shortcut,打开后网格末尾会多出一块默认桌面磁贴,点开是系统自带的桌面选择页。大多数安卓电视固件没有这个页面,磁贴就保持隐藏。想通过它选回原桌面,前提是原桌面还处于启用状态。
语言跟着电视系统走,现有英语、德语、西班牙语、加泰罗尼亚语和简体中文。电视系统里没有的语言,Android 13 及以上可以单独指定给桌面,用一条 cmd locale set-app-locales 命令解决。
06 不想用 AI,自己敲命令也可以
助手做的每件事都能手动完成,工具链只需要 Python 3。建好虚拟环境,把电视 IP 写进 TV_HOST。
BASH/命令
python3 -m venv tools/venv && tools/venv/bin/pip install -r tools/requirements.txt
export TV_HOST=192.168.1.50
tools/tv.py 是纯 Python 实现的 ADB 客户端,支持单条 shell、批量执行和文件推拉。造这个轮子的原因,后面踩坑节会讲到,官方 adb 二进制在有的系统上会被静默拦截。--probe 先看型号、系统版本和固件,单条命令直接跟在后面,几条命令用管道喂给 --batch,它会在一条连接里逐条跑完。
BASH/命令
tools/venv/bin/python -I tools/tv.py --probe
tools/venv/bin/python -I tools/tv.py 'pm list packages'
printf 'cmd1\ncmd2\n' | tools/venv/bin/python -I tools/tv.py --batch
清理和还原各有脚本,disable.sh 应用一份 debloat 清单,restore.sh 把它原样撤销。Windows 上不需要 WSL 和 Git Bash,旁边就放着 PowerShell 版本,装过 Android Studio 的话连 JDK 都不用另找。
编译安装桌面是一条命令。
BASH/命令
TV_HOST=192.168.1.50 launcher/build-and-install.sh
依赖 JDK 17 和 Android SDK 的 platform 34 加 build-tools 34.0.0,macOS 上用 Homebrew 一行装齐,没有 Homebrew 的话,脚本会去 /usr/libexec/java_home 和 Android Studio 默认的 ~/Library/Android/sdk 找现成的。
装上去的是裁剪过的 release 包,从 1.6MB 压到 250KB 上下,用 debug 密钥签名方便覆盖旧版,装完还会让电视预编译一遍,首次启动不用等 JIT。
两个安装脚本在动原桌面之前,都会先问电视 Home 键现在归谁,只对认识的包下手,也就是 Google 的 tvlauncher 或 launcherx,想换目标可以传 STOCK_LAUNCHER 覆盖,填 none 就完全不动原桌面。切换完成后它还会回头检查 Home 实际解析到了谁,发现不对就把原桌面恢复回去。
07 踩过的坑
下面这些是我和贡献者们都真踩过的,分连接和在电视上干活两个阶段说。先看连接。新版 macOS 把 Google 签名的 adb 当成它自己的应用,归入本地网络隐私管控,静默拦截,于是 adb connect 报 No route to host,而端口明明开着。tv.py 干脆不依赖这个二进制,这个坑从根上就不存在了。
有些电视,小米在列,设置里找不到无线调试开关,其实 USB 调试一开,5555 端口的网络 ADB 就已经开了,直接连就行。Mi Box S 有个隐蔽的副作用,USB 调试开着的时候,固件把 USB 口切到了 ADB 设备模式,接在上面的音箱和硬盘全部断电,所以干完活把调试关掉,桌面不需要它常开。
Windows 上两个坑都出在管道。PowerShell 5.1 会往管道内容前塞一个字节序标记,第一条批量命令直接变成乱码,tv.py 现在会主动剥掉它;Git Bash 会把 /data/local/tmp 这类路径改写成 Windows 路径,脚本里已经替你设好 MSYS_NO_PATHCONV=1。
到了电视上干活,规矩换了一批。链式命令别用,pm disable a; pm disable b 这种写法可能跑完第一条就静默停下,一条 shell 调用只放一条命令,--batch 的实现正是如此。大文件推送走 Python 客户端会挂,推 APK 用 b64push.py,base64 分块上传,末尾校验和。TCL 上停在直播或 HDMI 画面时,截屏出来是空的,先按 Home 再 screencap。
还有一条顺序上的死规矩,新桌面装好之前不要停用原桌面,否则 Home 键会落在一个出厂测试应用上。
Home 键不认新桌面,坑里最深的一个
Google TV 的一台小米(MiTV-MOOR2)上,原生桌面停了,新桌面还是接管不了 Home。排查下来,抢答 HOME 的是另一个系统应用 com.google.android.tungsten.setupwraith,它的 .MainActivity 在 intent-filter 里挂着 priority 4。
常规手段在这个应用面前逐个失效。Android 会无视非系统镜像应用在 HOME filter 上声明的 android:priority,你自己调得再高也没用;cmd package set-home-activity 打印了 Success,实际什么都没改,重启也一样;对 setupwraith 的单个组件执行 pm disable-user,吃回一个 SecurityException。
最后起作用的方案是把整个 setupwraith 包停用。它的身份是首次开机设置向导,停掉后日常使用不受影响,唯一要记着的是恢复出厂之前先把它启用回来,把它写进 debloat.txt,restore.sh 会处理。
Google TV 14 上还演化出更凶的版本。小米 MiTV-MZTU0 上,setupwraith 的 .RecoveryActivity 拿到了 Home,system_server 随之进入崩溃循环,电视每分钟从 Wi-Fi 掉线一次。
安装脚本现在的执行顺序就是这场事故换来的,先启动新桌面,再停用原桌面,最后设置 home 偏好,因为 HOME 应用集合一变,Android 会把已设的偏好丢掉;设完再回头检查 Home 实际落在谁身上,不对就把原桌面重新启用回来。已经掉进崩溃循环的,一条命令能救回来。
BASH/命令
tools/tv.py 'pm enable --user 0 com.google.android.apps.tv.launcherx'
时区和键盘的两个小坑
一台在伊朗的小米电视,时钟差了半小时到一小时。电视自己挑了邻国时区,更麻烦的是老固件带的时区数据,还停在伊朗 2022 年取消夏令时之前,Android 10 以上可以先查一下时区数据的版本号。
BASH/命令
tools/tv.py 'cat /apex/com.android.tzdata/etc/tz/tz_version'
修法是关掉自动时区再手动指定,春天如果又跳一小时,就直接换固定偏移。凡是固件发布之后才改过时区规则的国家,都适用这套办法。
BASH/命令
tools/tv.py 'settings put global auto_time_zone 0; cmd alarm set-timezone Asia/Tehran'
tools/tv.py 'cmd alarm set-timezone GMT+03:30'
键盘那个坑也出在小米,换完桌面屏幕键盘没了,查下来默认输入法指向一个根本没装的百度键盘,切到 Google 的 LatinIME 就好了。
BASH/命令
tools/tv.py 'ime set com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME'

还原关系示意|还原依赖原清单,部分设置需单独撤销
08 反悔了怎么还原
唯一的前提,把当初应用的那份清单留好,restore 靠它逐项撤销。restore.sh 会把清单里的包全部重新启用,把原桌面启用并选回默认,再把三个动画缩放复位。原桌面的包名作为第二个参数传入,默认是 tvlauncher,Google TV 机型要传 launcherx,Windows 下对应 -Stock 参数。
BASH/命令
TV_HOST=192.168.1.50 tools/restore.sh examples/<你的电视>/debloat.txt
有三件事 restore 不会替你做。新桌面还留在电视上,想删就去电视设置里卸载;清单之外你手动停过的包它不认识;无障碍服务和屏保改动,要各自用一条 settings 命令撤销。电视要是已经连不上了,本机的设置→应用页面还能兜底,停用的包在那里同样能启用回来。
固件更新的疑问在这里一并说了。大多数 debloat 清单会停用厂商的更新服务,更新只在你主动重新启用它之后才会来。真来了也不算大事,最坏情况是某个包恢复了启用,把脚本重跑一遍就回去了。流媒体应用更不受影响,它们照常从 Play Store 拿更新,而 Play Store 没人动;新桌面和它们之间没有耦合,它只列出已装的应用然后启动,用的是 Android 十几年没变过的 launcher intent。
09 能不能直接下载现成的 APK
仓库 FAQ 里有这么一问,答案是让你自己编。构建脚本把编译压到大约一分钟,自己编还意味着装进电视的东西你全程过目。仓库至今没有发布预编译二进制,这个立场没变过。















































































