声明:本镜像基本不会更新了,本来就是买错了才做的,有问题发我基本也不会优化了,自己找AI解决吧,比我强
一、前言:这是一场从"买错"开始的悲剧
事情是这样的。 我母亲不舍得开会员,给她买了电脑不会找资源,因此我就想给她换个盒子。网上翻了一圈,都说 S905L3B 香,4 核 A55 还带 HDR,七八十块。下单。 一查芯片,S905L2B。 我:? L3B 是 G12A,L2B 是 GXLX,两个芯片代,DTB 和内核完全不通用,网上那些 L3B 的资源一个都用不了。联系卖家,人家说"亲,页面写的是 L2B 呀",我回头一看,好家伙,商品标题小字确实写了 L2B,恕我眼拙。 我这人有个毛病:越是不兼容,越想给它整兼容了。 【图1:盒子正面照 + 主板照】 〇、先说结果(省流版)- 底包:slimbox 9.20-Mod ATV(安卓9),纯 32 位 armeabi-v7a,2G 内存,GXLX 平台
- 机器:S905L2 / L2B 通刷,只动 system / vendor 两个分区,DTB 内核一个字节没碰(跨代不兼容,碰了必砖)
- 目标用户:只会用普通电视的中老年人。要求就三条——开机别卡、别乱跳广告、打开就能看剧
项目
| 状态
| 开机引导被第三方 App 抢走
| ✅ 修好了
| 一堆后台常驻流氓 App
| ✅ 删了 6 个
| 蓝牙遥控回连(BLE)
| ✅ 能自动连
| 杜比 / DTS 直通(源码流给功放)
| ✅ 移植成功
| TVBox 预装 + 默认源注入
| ✅ 开箱即用
| 原作者埋的采集上传通道 + 自毁炸弹
| ✅ 拆了
| HDR
| ⚠️ 见下文,自己动手
|
二、为什么选 slimbox 9.20-Mod ATV底包换了好几个,最后落在 slimbox 9.20-Mod ATV 上,理由很朴素:
- 它是干净的 ATV(Android TV),不是国内定制那套没有乱七八糟的开机广告、没有"猜你喜欢"、没有每日推送。桌面就是 ATV 那套,我妈一学就会。
- 底子全杜比的库、DTS 的库、音频 HAL,全套都在——这点很关键,后面说。
- 纯 32 位机器 abilist 是 armeabi-v7a,abilist64 空的。只带 arm64 的 App 装不上(会直接报 INSTALL_FAILED_NO_MATCHING_ABIS)。选包、换包的时候一定要注意。
【图2:ATV 桌面】
三、我到底改了啥(详细清单)3.1 删:把后台的"钉子户"请出去原包里有 6 个常驻应用,我挨个看了它们的权限和保活逻辑,结论是:没一个是我妈需要的。
应用
| 它想干嘛
| 处理
| AutostartApp
| 自启动管理(听起来正经,实为占位)
| 删
| ExtServiced
| 名字叫"扩展服务",标签是超级市场
| 删
| CpuFloat
| 悬浮显示 CPU 占用(给谁看?)
| 删
| KeyTest
| 按键测试工具
| 删
| Terminal
| 终端模拟器
| 删
| LogViewer
| 日志查看器
| 删
|
删之前都反编译看过,确认不是系统依赖组件才动手。不要看到名字像工具就删,有些"看着像工具"的其实是系统服务,删了开不了机。
3.2 修:开机引导被抢这个坑最恶心。现象是:开机第一屏正常,第二屏直接被某个第三方 App 顶掉,引导流程走不完,设置向导卡一半。
根因是几个"自启动 + 高优先级"的 App 抢了启动顺序。清理掉之后,引导顺顺当当走完,当贝桌面正常接管 HOME。
3.3 改:内存与画质参数/vendor/build.prop 里动了几行(与底包逐行 diff 过的):
- sdr2hdr 关掉 —— 这条单独说,见第四章"HDR 那段"
- picture_optimization=false —— 关掉那个"智能画质优化",说白了就是乱动对比度饱和度,看剧颜色忽明忽暗
- cec.set_menu_language=false —— 别让 HDMI-CEC 去改电视的菜单语言
另外把 zram 从 256M 提到 512M(/vendor/etc/fstab.amlogic):
2G 内存的机器,开几个 App 就容易触底。zram 翻倍之后,切后台不再动不动的重新加载,我妈那种"看着看着去倒杯水回来"的用法,体验差别很大。
顺便辟个谣:网上流传的 dalvik.vm.jit.codecachesize=0 提升流畅度,在 ART 上根本没有消费者,纯 no-op。我自己加了又删了,别浪费一行。
3.4 蓝牙:BLE 遥控,得用笨办法这段单独拉出来讲,因为坑很深。
盒子配的是 BLE 语音遥控(CMIOT_REMOTE,走 BLE HID)。原包的蓝牙自动回连功能,对它是失效的——因为:
经典蓝牙扫描,根本扫不到 BLE 设备。
系统那套"扫描 → 发现 → 回连"的老逻辑,对 BLE HID 遥控器完全不工作。开机之后遥控器要是没自动连上,就得进设置手动配一遍,我妈绝不会干这个。
我的做法是写了个小常驻服务(BluetoothLX,sharedUserId=android.uid.system,persistent=true,系统级):
- 已配对:配对表里命中目标名 → 立刻反射调用 BluetoothDevice.connect(),不等扫描
- 未配对:走 BluetoothLeScanner 低延迟模式扫 → 命中名字或 MAC → createBond(TRANSPORT_LE) → 延时 5 秒 connect()
- 加了 BLUETOOTH_PRIVILEGED 权限(system 应用才能拿到)
结果:开机自动连,遥控器揣兜里走开再回来也能自动回连。但是:语音键那条线我也啃了很久,结论是遥控器发的 HID 报告描述符本身就是错的(报告号声明 1 字节、实发 21 字节,内核直接丢弃,压根不产生 input 事件),这是设备固件的锅。硬件层我能绕,但绕出来的东西不干净,最后我放弃了。所以这版不含语音功能,纯遥控。谁要是啃下来了,记得回来发帖。
3.5 杜比 / DTS:从 L3B 身上"薅"过来的重点来了。
先说个反直觉的结论:
这台 L2B 的音频库,和 L3B 是完全一样的。libms12api.so、libHwAudio_dcvdec.so、libHwAudio_dtshd.so、libdroidaudiospdif.so……一个字节不差。音频 HAL audio.primary.amlogic.so 也带全套 MS12 / 直通代码。
那为什么大家说 L3B 支持杜比、L2B 不支持?
因为差异不在库,在一份 XML。
L3B 的 audio_policy_configuration.xml 里,明确声明了一条 spdif raw 输出通道(AC3 / E-AC3 / DTS / IEC61937),并且把它路由到了 HDMI Out。L2B 的固件里——没有这段。
所以"支持杜比",落实到代码上就是这段 XML 配置。
我把这段从 L3B 移植了过来,加到 /vendor/etc/audio_policy_configuration.xml:
效果:杜比 / DTS 源码流可以原封不动直通给功放/回音壁,让专业设备去解码。
但是(重要):
只能"直通",不能"上混"。
Dolby 的 DAP(Atmos 上混、虚拟环绕那套)做不了——因为两个固件里都缺引擎本体(libdolbyms12.so、libms12dap.so),那是 Dolby 的授权件,运行时才 dlopen。授权件不是配置文件能改出来的东西,谁跟你说能,谁就是在逗你。
正确用法:盒子里把音频输出设成"HDMI 直通/Passthrough",让声音原样送到功放,Dolby 灯自己在功放上亮。
3.6 解码:换 32 位包 + 默认软解TVBox 也是坑。原包是 java64 版,只带 arm64 的 so,在 32 位机器上直接装不上。
我换成了 32 位的 java 版,并注入默认解码设置:
- 默认走 IJK + 软解码(mediacodec=0)
原因很实在:这台机器的硬解不稳定(1080p 高码率容易崩),软解保稳。
代价也说明白:1080p H.264 软解没问题,1080p HEVC / 4K 软解会掉帧。真遇到卡,进播放器设置改成 IJK + 硬解码 或者换 EXO 试试。
顺带纠正一个流传的说法:TVBox 播放器选项里没有"系统播放器"。全量是 IJK / EXO / MX / Reex / Kodi / 附近TVBox / VLC,别再找那个不存在的东西了。
3.7 TVBox:预装 + 预配源TVBox 直接预装好,并且默认源已经帮你配好了——首次打开,源列表里直接就有内容,不需要你去找什么订阅、导什么 JSON。
(在 App.onCreate() 里做的注入:检测到 api_url 为空就写默认源进去。)
3.8 TVBox 深度清理:拆了作者的"后门"这部分我必须单独写,因为它不只是去广告。
原版 TVBox 的 spider.jar 是加固过的,而且是那种不怀好意的加固:
第一层:native 加固壳
成员
| 作用
| classes.dex
| 只是个加载器,不跑业务
| assets/ftyguard_v7.so / v8.so
| native 解密器
| assets/ftyshinidie.guard
| 加密的内层 dex
| 流程是:native 从 .guard 里解出内层 dex → DexClassLoader 动态加载 → 真业务在内层跑。你静态怎么扒都扒不到业务代码。
第二层:自毁炸弹(这是重点)
内层 dex 里埋了个随机延迟自毁:
这就是为什么你换了别的东西之后它"莫名闪退"——不是你的问题,是它故意的。
我的处理:
- 把内层 dex 里 r.N() 和 r.zH() 的首指令改成 return-void,重算 dex 的 signature + checksum
- 关键点是所有炸弹路径都汇聚到 r.zH() 这一个咽喉点,堵住这一个就够了
- 验证:dexdump 回读 44 万行正常解析,全 dex 里指向 r.zH() 的调用数 = 0
第三层:采集 / 上报
项目
| 处理
| 说明
| ACCESS_FINE_LOCATION
| 删
| 播放器要定位干嘛?
| READ_PHONE_STATE
| 删
| 同上
| GET_TASKS
| 删
| 同上
| MOUNT_UNMOUNT_FILESYSTEMS
| 删
| 同上
| 被硬编码的遥测 / 弹幕上报端点
| 置空
| 在 j9.smali 里写死的"默认上报地址",我把它改成空串
| 实测抓包验证(空载 100 秒):
版本
| 上行
| 下行
| 旧版
| 11.6 KB
| 176.9 KB
| 清理后
| 5.1 KB
| 56.0 KB
| 上行只有下行量的 1/11,全是 HTTP 请求头,没有任何批量上传。
说明一下:迅雷 P2P 那个"上传"是播放/下载时才有,那是它本职工作,不是偷跑。空载面已经干净了。迅雷 SDK 我留着了(有用),只删了作者刻意添加的那些。
装机实测:连续 30 秒 + 3 轮 22 秒冷启动浸泡 —— 崩溃 0 次,源正常渲染,点海报能出详情页,播放能解析出真实地址。
3.9 预装的 App应用
| 装法
| 能卸载吗
| 当贝市场 dbsc
| 预装
| ✅ 能
| 野草助手 yecao
| 预装
| ✅ 能
| TVBox(LX 清理版)
| 预装
| ✅ 能
| 装机必备 zjbb2025
| 预装
| ✅ 能
| 佳视通 TV com.jsttv.yj
| 预装
| ✅ 能
|
装法是走 /system/preinstall/,首次开机自动扫码安装,装完就是普通用户应用,设置里能直接卸载——不是那种装了删不掉的流氓系统应用。
注意一个特性:这种预装是首启之后陆续出现的,不是开机瞬间就全有。别急。
四、关于 HDR —— 这段得你自己来我家那台电视,不支持 HDR。
所以底包里那个 ro.vendor.sdr2hdr.enable=true,我关掉了。
道理很简单:这功能是把 SDR 内容强行模拟成 HDR 输出,本来是给 HDR 电视"提味"用的。搁在一台根本不懂 HDR 的老电视上,结果就是——画面发灰、发暗、对比度还乱飘。我妈看两天该问我"电视是不是坏了"。
所以这版是按"没有 HDR 的电视"调的。
要是你家电视支持 HDR,或者你想让 SDR 内容看起来"浓一点",把这个值改回 true 就行——拆包、改 /vendor/build.prop、回包,三步的事。
想更彻底地自己适配 HDR?那就自己拆包自己整吧。 拆包方法我在下面附了,不难,就是耐心活。
顺手提醒:L3B(G12A)上面那套 PQ 图像处理模块是二进制实现,和 GXLX 不兼容,千万别往 L2B 上搬,搬了就是黑屏/花屏。这个坑我替你们踩过了。
五、刷机与拆包说明刷机:aml_upgrade_package 标准包,USB Burning Tool 直刷,或者卡刷,按你平时那套来。
拆包改包(给想自己动手的):
避坑两条(血泪):
- 直接对 sparse 分区跑 debugfs 会静默返回空结果,看起来像"文件不存在",其实是格式没展开。必须 simg.py to_raw。 这个假阳性坑了我半小时。
- 往 ext4 里写文件,必须同时设好三样:权限(0100644)、属主(0:0)、SELinux 标签(system 区 u:object_r:system_file:s0)。漏了标签,开机直接被 SELinux 拒,表现为 App 神秘失踪。
六、免责声明(认真脸)- 本固件为个人自用魔改,分享纯粹是给折腾党参考,不提供任何售后
- 刷机有风险,变砖自负。刷之前想清楚,动手之前先备份
- 固件不包含任何 VIP 内容、不破解任何会员。TVBox 只是壳,内容来自互联网公开接口,请自行判断合法性,24 小时内请删除
- 本人未从本固件获取任何利益,也不对因使用本固件产生的任何后果负责
- 涉及删改的第三方 APK,均为移除作者添加的采集/遥测代码,无商业目的。如原作者认为不妥,请联系删除
|