深夜提醒

现在是深夜,建议您注意休息,不要熬夜哦~

🏮 🏮 🏮

新年快乐

祝君万事如意心想事成!

share-image
中
ESC

海信电视能不能被 CleanYourTV 清理?我拿自己那台 VIDAA_TV 跑完了全程

中文 Read in English

CleanYourTV 这几天很火,18,693 个 star,X 上那条”给我爸妈电视做了个 before/after”的推文跑了 740 万浏览。道理很简单:Android TV 的首页是厂商的广告位,而它有 ADB,所以同一套 pm disable-user 就能把臃肿层拆掉,再换上一个 Apple TV 风格的开源桌面。仓库自己说得很清楚——不 root、不插线、不卸载任何东西,一行命令还原。

问题是它支持列表里全是 TCL、小米、索尼、飞利浦,海信只有零星几条,而且大多标注着”Latin America””India””US”。我家客厅这台是国行海信。所以第一个要回答的问题是:这台到底能不能用。

改之前的首页:聚好看 JuUI,顶部 VIP 促销、商城、一排排推荐位

能不能用,取决于系统而不是品牌

CleanYourTV 只认一件事:目标机器有没有一个能连上的 ADB,以及 pm 让不让干活。所以判断标准不是”海信行不行”,而是这台海信跑的是什么。

国行海信大致分两种。一种是纯 VIDAA U / VIDAA X,Linux 底子,没有 Android 运行时,压根没有 ADB,这类直接出局。另一种是 Android 底层 + VIDAA 外壳 + 聚好看(JuUI)界面——市面上大部分国行海信属于后者,这类有救。

翻仓库的 examples/ 时我撞见了 vidda-mt9653 和 hisense-e5q-pro 两份列表。Vidda 是海信的子品牌,两份列表的表头写着同一句话:设备型号 VIDAA_TV,主板 MediaTek MT9653,Android 11,build 02.02.70.01。也就是说,作者已经在和我这台一模一样的固件上跑通过全套流程,连踩了什么坑都记在注释里。

到这一步,”能不能用”就变成了”我的机器是不是真的是这个固件”。

先把它找出来

电视和电脑在同一网段,adb 本机已经装了(Arch 的 android-tools)。扫一遍 5555:

for i in $(seq 1 254); do
(timeout 0.4 bash -c "echo > /dev/tcp/192.168.1/$i/5555" 2>/dev/null \
&& echo "ADB OPEN: 192.168.1/$i") &
done; wait

这个并行探测不太可靠(它什么都没报),改成先 ARP 扫活再逐个 adb connect 就命中了:

192.168.1.128:5555   device product:VIDAA_TV model:VIDAA_TV device:MT9653

然后确认固件:

adb -s 192.168.1.128:5555 shell getprop ro.build.version.sdk      # 30
adb -s 192.168.1.128:5555 shell getprop ro.build.display.id # RP1A.200720.011 release-keys
adb -s 192.168.1.128:5555 shell getprop ro.build.version.security_patch # 2022-09-05

VIDAA_TV / MT9653 / SDK 30 / 安全补丁 2022-09-05 / 3.8 GB 内存 / 1080p@320dpi——和 examples/vidda-mt9653/ 表头逐字对得上。SDK 30 也高于 launcher 的 minSdk 26,所以禁用和换桌面两半都能做。

再拿仓库那份列表和本机包列表做一次交集,25 项里 23 项存在(缺的是 com.meetingroom 和 com.vision.aibook,本来就没装)。到这儿可以放心动手了。

顺带一提,ro.adb.secure 是 0。这意味着同网段任何设备不需要授权就能拿到 shell,做完必须关掉。

环境

构建 launcher 要 JDK 17 和 Android SDK,~/Android/Sdk 已经有了,platforms/android-34 也在,所以只需要让 gradle wrapper 自己拉 8.9。仓库的 tools/tv.py 是自带的纯 Python ADB-TCP 客户端,要先建 venv:

python3 -m venv tools/venv && tools/venv/bin/pip install -r tools/requirements.txt

它复用 ~/.android/adbkey,所以不会再来一次授权弹窗。

备份,然后分批禁用

tools/disable.sh 在真正下发第一条命令之前会先调 recovery.py --save 把现场写盘,失败就直接退出——这个顺序是对的,事后补的备份描述的是一台已经改坏的机器。我还是自己多留了一份:

adb -s $T shell "pm list packages -u" > packages_all.txt
for s in global secure system; do adb -s $T shell "settings list $s" > settings_$s.txt; done

从 settings 里读到两件后面用得上的事:默认输入法是搜狗 TV(唯一 IME,不能碰),enabled_accessibility_services 里挂着 com.keylab.speech.view.vidaa 的四个服务。

清单我按自己的选择改了三处:加上 OTA(com.jamdeo.updateservice、com.hisense.playerupdate),确认包含语音助手桌面 com.keylab.speech.view.vidaa,确认不含 com.hisense.tv.tiletransition。分三批下发,每批之间冷重启一次:

批次 内容 数量
1 遥测 / 上报 / 推送 / 广告位 9
2 卖场酒店残留、多余分享应用、屏保、printspooler 14
3 语音助手副桌面、OTA 3

第二批里 com.vision.aibook 静默跳过(本机没有)。三批全部 disabled-user,重启后开机正常,聚好看首页照常起来。

这里值得说一句 tiletransition。仓库注释里写得很细:这名字看着像转场动画或者开机广告层,实际上它承载 TileAnimationService,厂商的信号源面板在切换输入前会绑定它。禁掉之后面板照样打开、照样有动画,但点 HDMI 没有任何反应,logcat 里是:

W/ActivityManager: Unable to start service Intent {
act=com.hisense.tv.tiletransition.TileAnimationService ... } not found

包名不说实话,这是逆向厂商系统时的常态。

装上桌面

launcher/build-and-install.sh 会把 APK 分块 base64 推到 /data/local/tmp 再 pm install,中途任何一步失败都不会去碰原生桌面,Home 交接不干净还会自动回滚。同固件那份表头给了两个必传的变量:

TV_HOST=192.168.1.128 STOCK_LAUNCHER=com.jamdeo.tv.vod HOME_KEY_SERVICE=1 ./build-and-install.sh

STOCK_LAUNCHER 必须手动给,因为脚本靠 resolve-activity HOME 猜原生桌面,而它只认 Google TV 那几个包名,com.jamdeo.tv.vod 不在名单里。

APK 438 KB。侧载没有被拒——这是国行机型最容易翻车的一步,有些机器对每一个 sideload 都回 INSTALL_FAILED_VERIFICATION_FAILURE,有些拒绝任何声明 category.HOME 的非厂商签名包,那两种情况就只能做禁用那一半。这台两关都过了:

Success
Status: ok / LaunchState: COLD / TotalTime: 674
Package com.jamdeo.tv.vod new state: disabled-user
cmd package set-home-activity --user 0 com.gathin.tvhome/.MainActivity → Success
Home now resolves to com.gathin.tvhome/.MainActivity
HomeKeyService enabled

接管之后的首页:黑底、顶部时钟与问候、右上角有线网络和设置胶囊、dock 上方大字标出聚焦应用,环境光取自应用图标色

冷重启一次,resolve-activity HOME 仍然是 com.gathin.tvhome,launcher 常驻 32 MB PSS。再验信号源:

adb -s $T shell "am startservice -a com.hisense.tv.start_inputs \
-n com.hisense.tv.inputs/com.hisense.tv.InputsUIService"

厂商信号源面板:直播电视、HDMI 1、HDMI 2/eARC、HDMI 3、音视频输入

三个仓库文档没写准的地方

Home 键的真实键值和文档不一样。 同固件那份表头说物理 Home 键是 scancode 102,被 keylayout 映射成 KEYCODE_F12(142)。我挂了 getevent -lt 让家里人按了一次,内核层确实是 KEY_HOME(102),但 Android 侧的映射在 /system/usr/keylayout/Generic.kl:124:

key 102   MOVE_HOME

也就是 KEYCODE_MOVE_HOME(122)——一个文本编辑键,在电视上什么都不做。这就是禁用聚好看之后 Home 键变哑的原因(原本厂商 SysUIMerge 拿它当”回到上一个应用”,而那个应用恰好是聚好看)。修法是用 launcher 的 app_keys 把这个 keycode 指回新桌面,由已经启用的 HomeKeyService 接住:

"app_keys": ["122:com.gathin.tvhome"]

dock 里那个”设置”是错的那个。 这个得怪我自己眼尖:新桌面右上角有个”设置”胶囊,dock 里也有一格”设置”,但两者不是同一个应用。胶囊走 Settings.ACTION_SETTINGS,解析到 com.android.tv.settings/.hisense.systemsettings.MainActivity,是海信真正的设置;dock 那格是 com.android.settings,AOSP 原生那套在电视上基本残缺的界面。

原因在 launcher 的默认配置:dock_apps 出厂写的是 Netflix / Prime / YouTube / Hotstar,国行一个都没装,于是 fill_dock 拿网格最靠前的应用补位,把 AOSP 设置顶上去了。加进 hidden_apps 就干净了。

一个和本次改动无关的厂商 bug。 每次开机 com.android.wechathci:WebService(海信微信绑定 / hitv 应用自更新)会崩两次然后放弃:

java.lang.NoClassDefFoundError: Not a primitive type: '\u0000'
at com.jamdeo.tv.TvManager.getInstance(TvManager.java:50)

它不在清单里,栈也没碰到任何被禁的包,是固件自带问题。记录一下,免得以后拿它当替罪羊。

改配置不用重新构建

上面两处都是主题层面的事。launcher 读外部 files 目录里的 config.json,覆盖内置 config.xml 的同名键,所以:

TV_HOST=192.168.1.128 tools/theme.sh themes/hisense-cn

theme.sh 会重启 Home 并把无障碍服务重新挂回去——am force-stop 会让 Android 把 launcher 的 HomeKeyService 从 enabled_accessibility_services 里摘掉,这一步不做,Home 键的映射就白配了。

{
"dock_apps": ["com.xiaodianshi.tv.yst", "com.awen.tvguard"],
"fill_dock": false,
"hidden_apps": ["com.android.settings", "com.hisense.tv.mirror"],
"app_keys": ["122:com.gathin.tvhome"]
}

最终 dock:只留两格真实能打开的 TV 应用

顺便说个插曲。桌面刚接管、还没禁掉原生桌面的那一瞬间,抢走前台的是我自己写的 com.awen.tvguard(电视看护)弹的一道”先回答几个问题·请问你今天吃完早饭了吗”。也就是说,我在拆别人广告的同时,被自己的问答拦了一下。

被自己的应用截胡

值不值

禁用那一半买到的是:遥测、上报、厂商推送通道、一个永远在轮询网络的 hproxy、卖场/酒店残留、以及一个把拍信创意图库当屏保的广告位。它不买到首页那些推荐位——那些是 com.jamdeo.tv.vod 自己拉的,只能靠换桌面去掉。这一点仓库表头写得比谁都直白,别对”debloat”抱超出它字面的期待。

代价清单:OTA 关了(以后升固件要手动开回来)、语音助手和遥控器麦克风键没了、Home 键需要自己配映射。全部可逆:

TV_HOST=192.168.1.128 tools/restore.sh /tmp/cytv-backup/debloat.txt
TV_HOST=192.168.1.128 tools/theme.sh --reset

还原时注意一件事:com.hisense.service.ad 在我这台是出厂就已禁用的,restore 会把它打开。所以备份必须在你动手之前做,而不是在你想还原的时候。

最后回到开头那个问题。国行海信只要是 Android 底 + 聚好看界面的,CleanYourTV 就能用,而且同固件的实测清单已经躺在 examples/ 里,你要做的只是 getprop 四个值对一遍。纯 VIDAA 的机器不用试,那套系统里没有 ADB 这条路。

官网

做完记得回电视上把 USB 调试关掉。ro.adb.secure=0 的门开着,比首页那些广告位危险得多。

文章作者:阿文
文章链接: https://www.awen.me/post/a3f19c42.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿文的博客!

评论

0 条评论
😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️✋ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐⛎ ♈♉♊ ♋♌♍ ♎♏♐ ♑♒♓ 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘❌⭕ 🛑⛔📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭❗ ❕❓❔ ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️✅ 🈯💹❇️ ✳️❎🌐 💠Ⓜ️🌀 💤🏧🚾 ♿🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️
加载中...

留言反馈

😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️✋ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐⛎ ♈♉♊ ♋♌♍ ♎♏♐ ♑♒♓ 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘❌⭕ 🛑⛔📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭❗ ❕❓❔ ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️✅ 🈯💹❇️ ✳️❎🌐 💠Ⓜ️🌀 💤🏧🚾 ♿🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️