CleanYourTV 是一个把 Android TV / Google TV 的广告桌面换成极简 Apple TV 风格启动器的项目,MIT 协议,214 个机型可用。
CleanLetv 是它的乐视电视适配版。 乐视的固件有四层机制会跟桌面打架——遥控器按键在框架层就被吃掉、桌面进程会被系统主动强杀、原厂桌面杀不掉、常驻系统窗口盖住设置面板——这些在通用版里没有解。
实测机型:乐视 X4-65S(DemeterUHD,Android 6.0 / SDK 23,MStar 芯片,1920×1080)
本项目的所有改造,都是在「刷乐视底包 + 精简包、拿到 root」之后做的。 换句话说:原厂固件 + 无 root 的机器上,本项目只有一半功能能用。 详见 没有 root 会怎样。
上游 CleanYourTV 的 minSdk 是 26(Android 8.0),装不上乐视 X4-65S 这台 Android 6.0 的机器。本项目把下限降到 23(Android 6.0):
// launcher/app/build.gradle
- minSdk 26 // 上游 CleanYourTV
+ minSdk 23 // 本项目:为 Android 6.0 的乐视电视做法是开启 core library desugaring——代码里的 java.time(LocalDate、Instant、ZoneId、Duration)只从 API 26 才存在,desugaring 把它重写成 java.util.Calendar / java.text 的等价实现,于是桌面在 API 23 上跑得起来,功能代码一行不用改。
⚠️ coreLibraryDesugaringEnabled true和coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'这两行别删。去掉确实能省约 1.5MB 体积,但构建会因为代码里 API 26 才有的java.time调用而失败,等于回到上游那个装不上 Android 6.0 的状态。想给 Android 8.0 以上的通用机型用,可以把
minSdk改回 26 并去掉 desugaring,体积更小、依赖更少。
被下调的只有下限,targetSdk 34 和 compileSdk 34 与上游一致。这意味着本仓库的 APK 装不了 Android 6.0 以下的电视——上游的通用版反而能装(因为下限更高)。
三个特色各自的 root 依赖:每日一言(2️⃣)完全不需要 root; 按键重映射(1️⃣)必须 root——要改
/system/usr/keylayout/*.kl; Le 键全局应用库(3️⃣)必须 root——要装/system/bin/lekeyd守护进程。 逐项对照见 没有 root 会怎样。
🔒 需要 root:改写
/system/usr/keylayout/*.kl要 root 权限。
乐视固件的 PhoneWindowManager 在框架层按 keycode 拦截遥控器按键,应用层和无障碍层根本收不到。本项目改写系统的 keylayout 文件,把这些键从固件的拦截网里"换"出来,交还给桌面。
完整按键映射表(红外 Vendor_3697_Product_0001.kl + 蓝牙 Vendor_4c65_Product_3d4c.kl):
⚠️ 这张表描述的是乐视原装那款带 Le 键的遥控器。scancode 是遥控器厂商自己定的编号,换一支遥控器要重新核对——尤其是 Le 键那一行,见 Le 键的遥控器适配边界。
| 遥控器按键 | scancode | 原 keycode | 现 keycode | 桌面行为 |
|---|---|---|---|---|
| 设置 | 357 | 176 SETTINGS | 176 | 直接进「桌面设置」 |
| 菜单 | 139 | 82 MENU | 82 | 焦点图标弹右键菜单(打开/移除/排序/应用信息) |
| Le 键 | 189 | 4431 LE | 135 F5 | 全局唤出应用库 / 每日一言面板 |
| 分享(截图) | 377 | 4415 LETV | 4415(不变) | 固件自己截图,存 /sdcard/Pictures/Screenshots/ |
| 语音 | 167 | 173 DVR | 136 F6 | 一键打开用户指定的 App |
| 输入源 | 187 | 无(VIRTUAL_NUMBER) | 无 | 乐视信号源面板(HDMI 1/2/3 + 数字电视) |
关键点:KeyEvent.getScanCode() 返回的是 Linux EV_KEY 码(.kl 文件里的 key N),不是 getevent 打印的 MSC_SCAN 值——后者是 USB HID 层的另一套编码,KeyEvent 永远不返回它。分不清这两者,按键映射必然错。
改映射用 scripts/fixkl.sh(幂等,重刷固件后重跑即可):
su -c 'mount -o rw,remount /system' # SuperSU 需要 --mount-master,见 docs/开发文档.md §9
sh fixkl.sh
reboot # .kl 开机只读一次,必须重启生效✅ 不需要 root:语句库打包在 APK 里,装上就有。
桌面右上角每天一句,同一天固定;Le 键面板每次打开随机一句。9896 条语句打包进 APK,完全离线。
- 12 个分类(动画、诗词、影视、哲学、抖机灵……),首页与 Le 键两套独立选择
- 分类用位掩码存储,12 位全选 = 4095
- 同一天同一句:日期做种子混洗后对命中条数取模(不是对总数取模,否则改分类范围会偏)
- 语句库来自一言开源社区官方语句库,随附抓取与过滤脚本
Le 键面板里可以左右方向键翻句:
🔒 需要 root:要装
/system/bin/lekeyd守护进程。原因见本节末尾和 没有 root 会怎样。
乐视遥控器上那颗 Le 键,被固件劫持成"打开乐视视频"(startService(com.stv.lekey) + 启动 com.letv.tv/.WelcomeActivity)。本项目把它夺了回来。
⚠️ 这颗键只存在于乐视自家那几款带 Le 键的遥控器上。别的遥控器(第三方通用遥控、旧款遥控、手机 App 虚拟遥控)大多没有这颗实体键,或者它的 scancode 不是 189——本功能对这些遥控器不生效。详见 Le 键的遥控器适配边界。
- 在任何 App 里都能唤出,且不跳回桌面——透明 Activity 悬浮在当前 App 之上
- 切换 App 无缝:关掉面板就回到原来那个 App
- 面板内容二选一:应用库 / 每日一言
- 关掉面板后视频自动续播(见下)
/system/bin/lekeyd——一个 12KB 的 root 守护进程,直接读 /dev/input/event*,不依赖任何 App 存活。
顺带的"避广告"效果:应用库面板盖上去时,下面的视频 App 会进入 STOPPED(不只是 PAUSED),音频轨道直接归零——这是 App 主动触发的暂停,不会弹暂停广告。而关闭面板后播放守卫会确认回到了同一个 App 且确实没声音,再补一个媒体播放键,把视频还给你。
判定"现在到底有没有在播"必须读
dumpsys media.audio_flinger——dumpsys media_session的state=3在这台机器上是陈旧的,面板盖上去后 session 还挂着"播放中"而音频轨道早就没了。
这一节回答一个很实际的问题:我的遥控器没有 Le 键,或者换了别的遥控器,还能用这个功能吗?
答案是不能直接用,但原因分三种,改造难度完全不同。先说结论:
| 你的情况 | 能用吗 | 怎么改 |
|---|---|---|
| 用乐视原装那款带 Le 键的遥控器 | ✅ 开箱即用 | 不用改 |
| 遥控器没有 Le 这颗物理键 | ❌ 无法唤起 | 换遥控器,或改用别的键(见下) |
| 遥控器有类似功能的键,但 scancode 不是 189 | 见 下面那段 |
为什么判定标准是 scancode 189,而不是"看着像 Le 键"
桌面和 lekeyd 守护进程都只认 scancode 189,一个键都不放过:
MainActivity.LE_SCANCODE_LE = 189(launcher/app/src/main/java/com/gathin/tvhome/MainActivity.java)lekeyd.c里的#define SCAN_LE 189(dbg/lekeyd/lekeyd.c)
而 189 这个号来自遥控器自己在 keylayout 里的定义。本机两份 keylayout 都有这一行:
# dbg/kl-backup-orig/Vendor_3697_Product_0001.kl (红外接收器)
key 189 LE
# dbg/kl-backup-orig/Vendor_4c65_Product_3d4c.kl (蓝牙遥控键盘)
key 189 LE
换一支遥控器,可能出三种岔子:
- 物理上没有这颗键 — 第三方通用遥控器、Android TV 迷你遥控器、手机 App 虚拟遥控基本都没有。它压根不会发 189 这个码,功能无从谈起。这种最常见,也最没办法——除非改用别的键。
- 有这颗键,但 scancode 不同 — 遥控器厂商自己给键位编号,乐视这套 189 是乐视遥控器的约定。别的厂商可能编成 200、232……数字本身毫无含义,只能实测。
- scancode 对了,但 keylayout 文件名变了 — 键盘布局是按输入设备(红外接收器 / 蓝牙键盘的 Vendor_Product)挑文件的。换了遥控器,如果它枚举成另一个设备,
fixkl.sh里写死的那两个文件名就改不到它,.kl不会被重映射,固件照样吃键。
怎么确认自己的遥控器发的是哪个 scancode
先把 getevent 跑起来,再按那颗键:
adb shell getevent -lt /dev/input/event0 # 红外;蓝牙遥控器一般是 event2
# 按一下目标键,看输出里的 valuegetevent -l 打印的是 MSC_SCAN(USB HID 层编码,如 0x7003c),不是 scancode——.kl 文件里写的 key N 那个 N 才是 scancode。想看 scancode,对照 /system/usr/keylayout/ 下你这台设备实际加载的那个 .kl 文件,里面 key N 行就是。
⚠️ 别用getevent的输出直接去改.kl:getevent打印的code是 MSC_SCAN,跟key N差一个转换层。这坑踩过一次,见 docs/开发文档.md §4.1。
如果你手上那支遥控器有颗想拿来当应用库键的实体键(比如某个空闲的 F 键、或者一颗你用不上的功能键),改造分四步:
① 确认那颗键的 scancode
adb shell getevent -lt /dev/input/event2
# 按那颗键,记下 MSC_SCAN;再对照 .kl 文件确认它当前映射成什么② 改 .kl 把它换成固件不拦的 keycode
在 scripts/fixkl.sh 的循环里加一行(<SC> 换成实际 scancode,<KC> 换成目标 keycode):
sed -i 's/^key <SC>[[:space:]].*$/key <SC> <KC>/' /system/usr/keylayout/$f.kl目标 keycode 选 F5(135) 或 F6(136) 这类:框架对它们没有特殊分支,固件的拦截匹配不上,也几乎没有电视 App 绑定它们。别选 MENU(82)——聚焦中的 App 会把它吃掉变成它自己的选项菜单(这个坑本项目第一版就踩了)。
③ 改桌面和守护进程的常量
| 文件 | 改动 |
|---|---|
launcher/app/src/main/java/com/gathin/tvhome/MainActivity.java |
LE_SCANCODE_LE = 189 → 你的 scancode |
launcher/app/src/main/java/com/gathin/tvhome/HomeKeyService.java |
用的是 MainActivity.LE_SCANCODE_LE,跟着走,不用单独改 |
dbg/lekeyd/lekeyd.c |
#define SCAN_LE 189 → 你的 scancode |
④ 重新编译、推送、重启
.kl 开机只读一次,改完必须重启才生效。
💡 顺带一提:设置键和输入源键的 scancode 是可配置的(
settings_key_scancodes/input_source_scancodes,见themes/README.md),不用改代码。只有 Le 键是硬编码的,所以它对遥控器型号最敏感。
乐视的固件把桌面能用的手段卡得很死,所以这个项目的大部分功能需要 root。下面是逐项对照——如果你的电视没有 root,装上桌面也能用,但只有一半能力。
实测这台乐视 X4-65S 走的是这条路:
刷乐视底包 → 刷精简包 → 得到 root(本机是 SuperSU)→ 在此基础上做本项目的改造"精简包"这一步是关键:原厂固件里的广告与推广组件还在,
pm disable逐个停用既慢又不干净;精简包把它们从系统里移掉了,改键位、装守护进程这些操作才干净利落。这意味着:
- 如果你手上的电视是原厂固件、没有 root,本项目只能用到上表里"不需要 root"的那几项
- 刷机有风险:刷错包可能变砖,且会清掉数据。本项目不提供、不推荐、也不背书任何底包或精简包——请自行判断、备份后再动手
- 本仓库里的所有改造(改
.kl、装lekeyd、禁组件)都是在已有 root 的前提下做的增量操作,不包含刷机步骤刷机教程与适用机型见 获取 root:刷底包 + 精简包。
| 功能 | 需要 root? | 没有 root 时的情况 |
|---|---|---|
| 桌面本体(极简 Apple TV 风格启动器) | ❌ 不需要 | ✅ 完全可用。装 APK、开 ADB 装上就能换掉广告桌面 |
| 每日一言(首页每天一句) | ❌ 不需要 | ✅ 完全可用,语句库在 APK 里,纯离线 |
| 应用库 / 每日一言面板(桌面内) | ❌ 不需要 | ✅ 完全可用 |
| 天气(和风天气) | ❌ 不需要 | ✅ 完全可用(需在桌面设置里填 API Key) |
| 无障碍服务占住设置键 | settings put secure 普通 shell 就能写,但 pm install -r 会清空无障碍设置,得手动重开 |
|
| 改键位映射(设置键 / 菜单键 / Le 键 / 语音键) | ✅ 必须 | ❌ 固件的 PhoneWindowManager 在框架层按 keycode 吃键,桌面收不到任何按键事件。只能改 /system/usr/keylayout/*.kl,那要 root |
| Le 键全局应用库(在任何 App 里唤出) | ✅ 必须 | ❌ 需要 root 守护进程 lekeyd 直读 /dev/input(原因见下)。 |
| 关面板后视频续播 | ✅ 必须 | ❌ 依赖 root 守护进程里的 leplay.sh 播放守卫 |
| 修复设置键被乐视抽屉盖住 | ✅ 必须 | ❌ 要 su -c 'pm disable com.stv.globalsetting',系统包不接受普通 shell 的 pm disable |
| 禁用原厂乐视桌面 | ✅ 必须 | ❌ 要 su -c 'pm disable-user',否则桌面被强杀时按键落回乐视界面 |
| 推主题 / 改配置 | 写 /sdcard 不需要 root,但覆盖应用私有目录 /data/data/com.gathin.tvhome/files/ 需要 root |
App 级的全局按键监听在这台机器上做不到。 固件会在别的 App 到前台约 0.5 秒后 force-stop 所有持有无障碍服务的包——连专门新建的单服务小包也一样,一样被杀。所以"装一个 App 监听 Le 键"这条路在乐视上是被堵死的,唯一的解法是一个 root 守护进程直接读 /dev/input/event*,不依赖任何 App 存活。
改键位必须动 /system。 固件在框架层按 keycode 拦截按键,应用层和无障碍层根本收不到事件;要让桌面能处理这些键,只能改写系统 keylayout 文件把 keycode "换"出来,而 /system 分区的写入权限只在 root 手里。
有些系统组件只有 root 能动。 pm disable 一个系统包会被 shell 身份(uid 2000)拒绝,必须走 su。
- 按上面的表,装好桌面后先用能用的部分:换掉广告桌面、每日一言、应用库面板、天气——这些都不依赖 root。
- 如果电视能解锁 bootloader 或能用 Magisk(乐视 X4-65S 的具体可行性自行判断),root 之后回来跑
scripts/fixkl.sh和部署lekeyd,剩余功能就全了。 - 提醒:
scripts/fixkl.sh会改写系统分区里的 keylayout 文件,dbg/lekeyd/会往/system/bin装守护进程。动手前务必完整备份(dbg/kl-backup-orig/里有.kl原件备份),并先读 docs/开发文档.md 的固件机制章节。
上一节说 root 是前提,那 root 从哪来?实测这台乐视 X4-65S 走的是这条路:
刷乐视底包 → 刷精简包 → 得到 root(本机是 SuperSU)→ 在此基础上做本项目的改造
精简包这一步是关键:原厂固件里的广告与推广组件还在,靠 pm disable 逐个停用既慢又不干净;精简包把它们从系统里移掉了(刷完后系统只剩 64 个包、无第三方包),改键位、装守护进程这些操作才干净利落。
完整教程(含底包/精简包下载、救砖文件、操作步骤)在这里:
Letv超4 X65S刷机教程 — ZNDS 论坛,作者 ℡汝若有心,2019-02-13
本仓库不携带、不镜像、不背书任何固件包,上面链接里的附件请自行到原帖获取。
教程里引用的前辈原话(适用于底包):
引用前辈们的话,适用于 CPU 为 6A938 的电视,在超4 X50 PRO 上测试通过。理论上支持机型:超4 X75 超4 X70 超4 X43Pro X65S 超4 X40 超4 X43 超4 X55 超4 X65 Curved 超4 X55 Curved 超4 X50 Pro 超4 X50。也就是说第一批发布的 938Mstar 系统都支持,不支持第二次带 M N 的电视
即这 12 个机型:
超4 X75 · 超4 X70 · 超4 X43Pro · X65S · 超4 X40 · 超4 X43 · 超4 X55 · 超4 X65 Curved · 超4 X55 Curved · 超4 X50 Pro · 超4 X50
几个要点:
- 6A938 就是 MStar 的「极光」芯片(Cortex-A72 + A53),乐视超4 系列用的正是它。本仓库实测的 X4-65S 也在列表里。
- 第一批发布的 938Mstar 系统都支持;第二次带 M、N 的电视不支持。
⚠️ 这段描述针对的是底包。精简包是另一回事——它不按这个机型列表划界,能不能用得看自己的机器(精简包刷完桌面只剩几个图标,等于换了一套系统,很多机型反而都能跑)。- 你的机器不在列表里的话,别硬刷。先确认芯片型号再说。
这一节和上面的刷机范围无关——底包/精简包划的是机型,这里划的是遥控器。
本项目的按键相关功能(改键位映射、Le 键全局应用库)依赖乐视遥控器上的实体按键,尤其是那颗 Le 键:
| 遥控器 | 情况 |
|---|---|
乐视原装带 Le 键的遥控器(本机实测的红外 Vendor_3697_Product_0001 / 蓝牙 Vendor_4c65_Product_3d4c) |
✅ 直接可用,scancode 189 |
| 第三方通用遥控、Android TV 迷你遥控器、手机 App 虚拟遥控 | ❌ 通常没有 Le 这颗物理键,功能不生效 |
| 有类似功能的键,但 scancode 不是 189 |
判定标准是 scancode 189(不是"看着像"):桌面 MainActivity.LE_SCANCODE_LE 和守护进程 lekeyd.c 的 #define SCAN_LE 都只认这个号。完整的排查与改造步骤见 Le 键的遥控器适配边界。
💡 换句话说:**乐视这个 Le 键功能是"这台机器 + 这款遥控器"的组合,不是所有遥控器的通用功能。**没有 root 拿不到的那部分功能,请以 没有 root 会怎样 那张表为准。
- 先开 UART 模式(工程模式 → other → uart enable 置 on)——这是救砖的保险丝。切记不要把 factory mode 工厂模式从 off 改成 on,否则每次开机都出雪花屏。
- U 盘要求:USB 2.0、FAT32、16G 或以下,不能是系统盘,建议先格式化。
- 底包和精简包分两次刷:把要刷的
.bin改名成LetvUpgrade938.bin放 U 盘根目录,用超3 遥控器进强刷模式:设置 → vol+ → vol- → ch- → ch+ → 开机键。刷完底包后把它的 bin 移走,再把精简包改名,同样流程刷第二遍。 - 每次刷完恢复出厂设置,再进桌面。
- 精简包刷完后桌面只剩几个图标,自定义图标在
/system/plugin/下,权限改0644。
⚠️ 变砖是真实风险。刷错包、U盘识别失败、操作顺序错了都可能变砖,虽然有 UART 串口救砖方案,但并非万无一失。请务必先备份个人资料。
CleanLetv/
├── launcher/ 桌面启动器源码(Android Studio 直接打开)
│ └── app/src/main/
│ ├── java/com/gathin/tvhome/
│ │ ├── MainActivity.java 桌面主 Activity,按键分发链在这里
│ │ ├── HomeKeyService.java 无障碍服务,占住设置键
│ │ ├── AppLibraryActivity.java 透明 Activity,全局应用库外壳
│ │ ├── AppLibraryDialog.java 应用库 / 每日一言面板
│ │ ├── Sentences.java 本地语句库索引(行偏移,不全量进内存)
│ │ ├── Hitokoto.java 取句入口(首页固定 / 面板随机)
│ │ ├── Weather.java 天气(和风天气)
│ │ ├── Lunar.java 农历
│ │ ├── Compat.java 高版本 API 收口(minSdk 23 的地基)
│ │ └── ...
│ └── assets/sentences.json 9896 条语句(AGPL-3.0,见 NOTICE)
├── themes/letv-x4/ 乐视专属主题(按键映射、列数、程序坞…)
├── scripts/
│ ├── fixkl.sh 按键重映射(幂等)
│ └── findkl.sh 找出遥控器绑定的 .kl 文件
├── dbg/
│ ├── lekeyd/ 全局 Le 键守护进程(root,纯 C)
│ │ ├── lekeyd.c 主程序
│ │ ├── lekeyd.sh 看护脚本(单实例)
│ │ ├── leplay.sh 播放守卫(关面板后把视频还回去)
│ │ └── build.sh NDK 交叉编译
│ └── kl-backup-orig/ .kl 原件备份(用于还原)
├── tools/
│ ├── tv.py 纯 Python ADB 客户端(不依赖 adb 二进制)
│ ├── b64push.py 文件传输(这台电视的 adbd SYNC 协议会挂死)
│ ├── b64pull.py
│ └── letv-buttons.sh 一键修复设置键(禁乐视抽屉)
└── docs/
├── 开发文档.md 全部定制点、固件机制、坑与禁忌
├── 使用指引.md 面向最终用户的操作手册
└── 迁移文档.md 装到另一台同型号电视的清单
必需:
- 一台乐视电视(Android 6.0 / SDK 23 及以上;实测机型 X4-65S)
- ADB 已开启(网络 ADB 5555 或 USB)
- 本机装了 Android SDK 与 JDK 17+
遥控器(要按键相关功能才需要):
- Le 键全局应用库要求遥控器有 Le 这颗物理键且 scancode 是 189——乐视原装那款遥控器满足,第三方遥控器大多不满足。
- 改键位映射(设置键 / 菜单键 / 语音键)同理,scancode 同样按遥控器型号而定。
- 详见 Le 键的遥控器适配边界。
root(看你要哪些功能):
- 桌面本体、每日一言、应用库面板、天气不需要 root; 但改键位映射、Le 键全局应用库、视频续播、修复设置键、禁用原厂桌面全都需要。 逐项对照见 没有 root 会怎样。
- 实测这台机器的 root 来源是:刷乐视底包 → 刷精简包 → 得到 root(本机是 SuperSU), 本项目的改造是在此基础上的增量操作。
- 电视已 root 时,
su建议用 SuperSU 且允许 ADB shell 提权;另注意 SuperSU 的 挂载命名空间隔离(su --mount-master,见下方提示)。 ⚠️ 刷机有风险,变砖和丢数据都是真实存在的。本仓库不提供、不推荐、 也不背书任何底包或精简包,请自行判断、备份后再动手;刷机步骤不在本仓库范围内。
cd launcher
export ANDROID_HOME=/path/to/Android/Sdk
./gradlew assembleDebug这步不需要电视有 root,装好 APK 就能用桌面本体、每日一言、应用库面板和天气。
编译产物:
launcher/app/build/outputs/apk/debug/app-debug.apk。 因为minSdk降到了 23(见 SDK 要求已下调),这个 APK 装得上 Android 6.0 的乐视; 但也意味着它只能装在 API 23 及以上——低于 6.0 的电视装不了。
# 这台固件的 adbd SYNC 协议会挂死,adb push 传不动,必须用 b64push
python tools/b64push.py launcher/app/build/outputs/apk/debug/app-debug.apk /data/local/tmp/tvhome.apk
adb shell "pm install -r -d /data/local/tmp/tvhome.apk"装完必须做这三步(pm install -r 会清空无障碍设置,am force-stop 会连带关掉同进程的无障碍服务):
adb shell "am force-stop com.gathin.tvhome"
adb shell "settings put secure enabled_accessibility_services com.gathin.tvhome/.HomeKeyService"
adb shell "settings put secure accessibility_enabled 1"
adb shell "input keyevent 3" # HOME,把被屏保抢走的焦点唤回桌面🔒 本步需要 root。 没有 root 就跳过——桌面本体、每日一言、应用库面板、天气不受影响, 只是按键映射和 Le 键全局应用库用不了。详见 没有 root 会怎样。
adb push scripts/fixkl.sh /data/local/tmp/
adb shell "su -c 'mount -o rw,remount /system'"
adb shell "su -c 'sh /data/local/tmp/fixkl.sh'"
adb push dbg/lekeyd/lekeyd dbg/lekeyd/lekeyd.sh dbg/lekeyd/leplay.sh /data/local/tmp/
adb shell "su -c 'cp /data/local/tmp/lekeyd /system/bin/ && chmod 755 /system/bin/lekeyd'"
adb shell "su -c 'cp /data/local/tmp/lekeyd.sh /system/bin/ && cp /data/local/tmp/leplay.sh /system/bin/ && chmod 755 /system/bin/lekeyd.sh /system/bin/leplay.sh'"
adb shell "su -c 'cp /data/local/tmp/install-recovery-2.sh /system/etc/ && chmod 755 /system/etc/install-recovery-2.sh'"
adb reboot
⚠️ SuperSU 的挂载命名空间隔离:普通su -c里的 remount 只作用于该会话的私有命名空间,返回成功但全局仍是 ro。必须用su --mount-master -c "mount -o remount,rw /system; ...",且 cp/chmod 要写在同一个会话里。写入前先grep ' /system ' /proc/mounts确认是rw,别信返回码。
乐视的 com.stv.globalsetting 服务常驻一个 TYPE_PHONE 窗口(ty=2008),永远压在 TYPE_APPLICATION 之上——我们的设置面板确实启动了、焦点也是我们的,但被整层盖住。代码层面无解,只能让那扇窗消失:
TV_HOST=192.168.1.50 bash tools/letv-buttons.sh🔒 需要 root:
pm disable一个系统包会被 shell 身份(uid 2000)拒绝,必须走su -c。
python tools/b64push.py themes/letv-x4/config.json /sdcard/Android/data/com.gathin.tvhome/files/config.json
adb shell "su -c 'cp -f /sdcard/Android/data/com.gathin.tvhome/files/config.json /data/data/com.gathin.tvhome/files/config.json'"主题 JSON 可以改列数、程序坞行数、每日一言开关与分类、按键映射等,不用重编译。完整键表见 themes/README.md。
⚠️ 覆盖应用私有目录/data/data/com.gathin.tvhome/files/需要 root。 不 root 的话,主题配置得靠桌面设置界面改(列数、程序坞、每日一言分类等仍然可调)。
| 文档 | 内容 |
|---|---|
| docs/开发文档.md | 固件机制分析、全部定制点、26 条踩坑与禁忌、验证方法 |
| docs/使用指引.md | 面向最终用户的操作手册 |
| docs/迁移文档.md | 装到另一台同型号电视的完整清单 |
| NOTICE | 协议分层说明(MIT 上游 + AGPL 语句库) |
本项目整体采用 AGPL-3.0,原因见 NOTICE:
- 桌面源码(
launcher/):来自 CleanYourTV,MIT 协议,Copyright (c) 2026 Gathin。修改后同样以 MIT 发布,原授权声明保留在launcher/LICENSE - 每日一言语句库(
assets/sentences.json):AGPL-3.0,打包进 APK 分发要求衍生作品同样以 AGPL-3.0 发布 - 乐视适配脚本与守护进程:本项目作者编写,AGPL-3.0
如果你只想要 MIT 许可的那部分:删掉
launcher/app/src/main/assets/sentences.json即可(每日一言功能失效,其余不受影响),那一份代码适用 MIT。
字体 Outfit 采用 SIL Open Font License 1.1。
CleanYourTV — Gathin23
本项目基于它开发。这个项目让两百多种电视摆脱了广告桌面,本仓库做的是把其中一个固执的国产厂商——乐视——也拉进队伍里。
hitokoto-osc/sentences-bundle — 一言开源社区
每日一言的语句库来源。
📋 桌面本体、每日一言、应用库面板、天气:不需要 root,装 APK 即可用。
🔧 本项目的改造前提是「刷乐视底包 + 精简包、拿到 root」。 刷机有风险,本仓库不提供也不背书任何固件包,请自行判断、备份后再动手。



