MT MTBOX GitHub

Android · GPL-3.0 · FongMi/TV 二次开发

MTBOX安卓视频与本地音乐播放工具箱

基于开源的 FongMi/TV(GPL-3.0)二次开发,包名 com.matou.mtbox,当前版本 6.6.19。整包源码连同音乐引擎与构建脚本已按 GPL-3.0 开源,本地解码、离线可用, 不绑定任何云端账号。

版本 6.6.19 GPL-3.0 com.matou.mtbox Android 7.0+ 无内容源
build.ps1
# 1) 资源 id 会漂移,每次都得重生成 R.java
powershell -File javainject\genr.ps1 -Apk app.apk

# 2) 编译 + 注入 + 签名(apktool 跑两遍)
powershell -File javainject\build.ps1 -Tag music

→ mtbox-music-signed.apk
关于

这是什么

两半拼起来的整包

反编译基线(FongMi/TV 5.6.1 → com.matou.mtbox 6.6.19)加上逐条 smali 补丁, 中间靠 apktool 跑两遍把资源 id 钉住。

音乐引擎直接注入

13 个手写 Java 文件走 javac + d8 出 classes4.dex,丢进 work_fong/unknown 随 apktool 原样打进包,不回编 smali。

音效链路透明

只有 Equalizer + BassBoost,禁用 LoudnessEnhancer;1.0 倍速不碰 setPlaybackParams,无损源走原生直通。

特性

它能做什么

下面每一条都在已发布的安装包里。

01

覆盖非鸿蒙设备

安卓端独立打包,和 TTBOX 互补 —— 家里那台安卓投影或旧平板也能用。

02

自持签名

用自己保管的 keystore 出签名包,安装前可校验,不走第三方重签名。

03

本地导入即用

不绑定云端账号,本地资源导入就播,断网也能用。

04

已开源 GPL-3.0

整包源码连同音乐引擎与构建脚本一并上 GitHub,基底 FongMi/TV 本身也是 GPL-3.0。

05

音效链路直通

只保留 Equalizer + BassBoost,不启用 LoudnessEnhancer;1.0 倍速不碰 setPlaybackParams,无损源走原生直通。

界面

跑起来是什么样

MTBOX 本地音乐 · 歌曲列表
本地音乐 · 歌曲列表
MTBOX 歌词面板 · 逐字同步
歌词面板 · 逐字同步
MTBOX 主题与播放
主题与播放
架构

整包怎么拼起来的

两半:反编译基线,加上注入进去的音乐引擎,中间靠 apktool 跑两遍把资源 id 钉住。

work_fong 基线

FongMi/TV 5.6.1 反编译,包名改成 com.matou.mtbox,版本抬到 6.6.19(versionCode 60619)。

smali 补丁

主题统一、版本显示、全屏旋转、安全加固都落在 smali 上,每一条都留了方案记录。

javainject 音乐引擎

13 个手写 Java 文件走 javac + d8 出 classes4.dex,丢进 work_fong/unknown 随 apktool 原样打进包。

R.java 重生成

genr.ps1 用 public.xml 加 aapt2 dump 拼资源 id 表。资源一动 id 就整表漂移,所以必须两遍出包。

unknown 装载

apktool 会把 work_fong/unknown 下的文件原样复制进 APK,ART 把 classes 1 到 4.dex 一起加载。

签名

apksigner 签 v2/v3 并 verify,keystore 自己保管,不进仓库。

构建

本地怎么出包

四步,顺序不能反。

  1. 01

    生成 R.java

    powershell -File javainject/genr.ps1 -Apk <刚构建的.apk>,资源 id 会漂移,每次都得重跑。

  2. 02

    配签名口令

    设 MTBOX_KS_PASS 与 MTBOX_KEY_PASS 两个环境变量,keystore 需要自己生成。

  3. 03

    出包

    powershell -File javainject/build.ps1 -Tag music,apktool 跑两遍,不要跳 pass 1。

  4. 04

    校验

    apksigner verify 通过、R.java 里 tabSongs 与 musicList 这些 id 对得上,才算成功。

问答

常见问题

为什么 apktool 要跑两遍?
资源一动,aapt2 就会整表重排 @+id,而 R.id 是编译期常量。pass 1 拿到资源表重生成 R.java,pass 2 用同一份 res 出包,两遍的 id 才一致。跳过 pass 1 的结果是 findViewById 返回别人家的 view 或者 null,当场崩。
音乐引擎为什么不走 smali?
13 个手写 Java 文件直接 javac 加 d8 出一个 classes4.dex,丢进 work_fong/unknown 就行 —— apktool 会把该目录原样复制进 APK。省掉一整轮 smali 编译,也不用碰寄存器。
音效开了会不会失真?
音效链只有 Equalizer 加 BassBoost,LoudnessEnhancer 是禁用的 —— 它是动态响度处理器, 满刻度无损源会被削波。原声预设就是 EQ 全 0 加 BassBoost 0,此时完全透明。
锁屏和车机能控制吗?
硬件媒体按键可用,耳机和车机的上下曲、播放暂停会转发进容器。锁屏音乐卡与控制中心媒体卡 不通 —— 那依赖系统主动查询 MediaSession,容器隔离挡住了,App 层无解。
为什么没有内置源?
刻意不内置。所有外部订阅源由使用者自行配置,本项目不提供任何内容源与在线解析地址。
致谢

上游项目

  • FongMi/TV —— 基底,本项目基于它二次开发,GPL-3.0
  • mpv —— 播放内核,GPL-2.0-or-later
  • FFmpeg —— 编解码,LGPL / GPL