中兴 F50 Pro 折腾手记
⚠ 免责声明
- 刷机会让机器失去保修。
- 刷机一定会带来潜在的安全风险。
- 本文不带任何目的,不对任何结果作保,纯属技术分享。 ️
购入
一直在时间线上刷到有人推中兴的随身 WiFi,前后看到过三款,分别是:
- F50
- V50
- F50 Pro
考虑到离职之后有一张 sim 卡没有手机插了,便准备买一台回来试试。
最开始先买了 F50,到手之后插上电脑,还没插卡呢就开始发热,偶买噶你吓到我啦,退了。
后来在 pdd 刷到了 V50,好家伙,赛博朋克造型,让我一下子想起了淇澳岛上那家公司出的键盘,这高低不得整一台回来?pdd 现在是快啊,啪一下一天就到了,插上电脑,照例没插 sim 卡,点进后台发现用户协议那边“同意”怎么都点不过去。职业敏感告诉我可能是因为没插卡,没网络导致我这个“同意”没法上送服务器?于是插上 sim 卡,好家伙,这货开始了自己的无限重启人生,退了。(后来反应过来可能是在不停 OTA 自重启?无所谓了)
最终购入 F50 Pro 是咨询了闲鱼上某位老哥之后决定的,这些哥们儿玩得早,把中兴的机器几乎全研究透了,告诉我如果要自己插卡就买 F50 Pro,说是散热好,系统新。得,就它了。
后记:实际使用几天下来 F50 Pro 的散热表现确实很不错,个人感觉没必要买散热器。
哦对了,还得再叠个甲,总有人会疑惑为什么 6202 年了还有人买 MiFi 这种东西,还得自己折腾,不是海鲜市场买个便宜的垃圾手机开热点就行吗?对此我表示无任何异议,你用你的便宜热点机,我用我的 MiFi 就行了呗~
折腾
买这台机器最大的乐趣还是为了折腾,虽然中兴拿 Android 来做随身 WiFi 的 OS 我确实没想到。
离职之后因为没有了公司的手机,多出来一张流量卡舍不得注销,跟风斥巨资买了一台 #中兴F50,做功课的时候 UFI-TOOLS 看得我一愣一愣的,怎么 scrcpy 都用上了?转念一想,这货本质应该跑的是一个 Android,机身没屏幕,然后 scrcpy 出来,然后,就为所欲为了。妙哇。 https://t.co/E8ZbxGxsjR
— 𝗦𝗵𝗲𝗻 (@shhenlin) October 15, 2026
离开公司架构组之后有大半年时间没碰过框架跟启动层的东西了,好在现在有 AI,这并不难。
在搜集资料的阶段,我重点找到了下面这些:
- https://kanokano.cn/archives/1435.html
- https://search.bilibili.com/all?keyword=50Pro
- https://github.com/kanoqwq/UFI-TOOLS
已经是 6202 年了,我们有 AI ,不用自己看,一股脑丢给 Agent,得到的结论如下:
| 实机情况 | 当前资料给出的判断 |
|---|---|
| 新版 MU3353/V610 | 目前不适用旧工具;指南特别警告,旧备份流程也可能导致无法启动 |
| MU3356,B27 及以上 | 指南标注不支持安装 |
| 较早的 B15 | 有临时开启 ADB 的旧安装流程 |
| B22 | 作者提供过 Root 后取得无线 ADB、再安装的路径,仍需核对具体包与实机。作者回复 |
前天收到快递,一看包装 MU3356,合格证 2026.10,再兴致冲冲连上电脑一看,天塌了:
1
[ro.build.sw_internal_version]: [MU3356V1.0.0B28]
AI 很聪明,它知道转头扎进 github 找解决方案,果不其然有大佬分享了,要感谢这些伙伴,没有你没有我(们)的今天:
https://github.com/againrivers/zte-f50pro-b28-root
git clone 下来简单看了看,梳理了一下思路:
为了用 Magisk,需要刷2个分区,分区的 img 需要把本机当前的备份出来自己 patch。(备份很重要,备份很重要,备份很重要!万一 patch 出来的 img 刷🧱了还能救回去)。而为啥是2个分区?这就是这个项目的意义,因为大佬发现 B28 开始只刷
boot_init好像进不去,中兴最新版本估计升级了 TOS 校验。
等我自己扒完代码,才发现这位大佬更加与时俱进,AI 时代了,项目都是直接留了 AGENT.md用来指挥的,那我刚才吭哧吭哧看的算什么?
于是一股脑丢给 Agent 照做就行,期间唯一要我的就是插拔几下 USB,软件开发真的药丸。
当然,结果就是成功变砖了,好在有备份啊。
坑,复盘
下面按时间顺序记录。前四次刷写主要用于定位 init_boot 和 TrustOS 的问题,后续工作则集中在 Magisk、UFI-TOOLS 和 scrcpy。
前四次刷写失败与变量排查
按照项目文档,我先从本机 B28 备份中取出 init_boot_a,加入 Magisk、ADB 和禁用更新等配置,TrustOS 保持原厂,然后刷回设备。设备没有正常进入 Android,USB 枚举异常,表现为进入诊断模式。我先用完整备份刷回原厂 init_boot_a,设备恢复正常。
项目里有个 Issue 很有价值,新版固件需要同时处理 TrustOS 和 init_boot。于是我从本机备份的 sml_a + trustos_a 制作 Patch:
1
spd_dump_mac -t dis_avb_ex sml_a trustos_a
上面的命令可以生成一个 tos-noavb-bsp-bypassed,我用了它,没有使用社区提供的 tos.bin。
接下来一共进行了四次尝试,第三次尝试前,我在 cpio 重建流程中发现了一个实际缺陷:/dev/console、/dev/null 和 /dev/urandom 的 rdev 全被清零,为此又重新做了一版 init_boot:
- 原厂 TrustOS + 第一版自制 init_boot;
- 自制 TrustOS + 第一版自制 init_boot;
- 自制 TrustOS + 修正版自制 init_boot;
- 原厂 TrustOS + 修正版自制 init_boot。
可惜每次都无法正常启动,好在有备份,不至于变砖。
这样面向运气刷机肯定是不行的,需要隔离测试一下,究竟是 init_boot 还是 TrustOS 的问题。
隔离测试确认自制的 TrustOS 没问题
测试方法很简单:
自制 Patch 后的 TrustOS + 原厂 init_boot
设备正常启动,USB 和 HTTP 持续稳定。
这个结果确认了三点:肯定是我自制的 init_boot 有毛病,不知道中兴这一版改了什么。
社区 init_boot 恢复启动
已经折腾了将近3个小时,没有什么进展。到这步我想到了前面那个仓库的作者有留联系方式,果断联系了一下。哪知道大佬跟我说,已经没必要折腾了,直接丢给我一个已经验证过的社区刷机包,说是可以起来。
坦率地讲,我上车 ZTE 随身 WiFi 晚了,甚至根本不知道这些大佬们主要活跃在哪个社区,很多关键经验没有出现在公开文档或搜索结果里,而是留在作者和玩家之间,感慨信息差真的害死人。如果更早找到这些资料和交流渠道,前面的重复尝试应该会少很多。
但是大佬丢给我的这个刷机包也有几个难点,我让 AI 分析了一下:
- 整个脚本和工具是 Windows 的,而我用的 Mac。
- 社区包的是基于6月份的基线制作的,我这10月的机器,固件要比它新:
- tos.bin 与本机派生 TrustOS 有 611,443 字节不同,正是文档警告的异版本风险,排除。
- magisk.img 记录的原厂 SHA1 是 dad886…,本机活动槽原厂 SHA1 是 cda171…,不直接刷。
- 社区脚本包含 persist.sys.usb.config adb,可能导致 NCM 管理网络消失。
不慌,我是 Android 开发者!我大概看了一下包里的Windows 脚本,本质也就是刷那2个分区,这一点 Mac 上一样做,这就好办了。我看了一下刷机包里的magisk.img(也就是 init_boot.img),确认它包含正确的设备节点和一些额外配置,于是决定先用它,而 tos.bin还用我自己 patch 的,之前已经刷就能去了,这波不动。
没想到一把过,设备正常启动,USB、HTTP 和无线 ADB 都恢复了。
暂时还没搞懂为什么我自己的 patch 的 init_boot 不行,先不管了,继续折腾。
⚠️ 按理说此时应该也把社区的
tos.bin刷一遍。但我这个既然起来了我就没再动。并不排除刷了社区的tos.bin反而会砖,因为我这台机器太新了,我宁愿用自己 patch 的tos。
Shell Root 授权
设备恢复启动后,接下来就是 Android 内的问题了,首先遇到的是调用 Root 仍然有问题:
1
adb shell /debug_ramdisk/su -c id
一开始请求超时,后来返回 Permission denied。安装 Magisk APK 后,设备显示“需要修复运行环境”。我尝试过 ADB 点击、按键导航和 uiautomator,但无法完成修复。直接写 Magisk SQLite 返回 Root is required,adb root 则返回:
1
adbd cannot run as root in production builds
原因是 ADB Shell 使用 UID 2000,Magisk 正在等待用户确认授权,而设备没有可供操作的屏幕。
想到社区这个 magisk.img 也不一定啥都有,决定基于它,修改 overlay.d/sbin/start_adbip.sh:
- 删除
setprop persist.sys.usb.config adb,避免改变原来的 NCM 网络配置; - 在 Magisk 数据库中预置
root_access=3; - 给 UID 2000 写入允许策略;
- 其他 cpio 条目、设备元数据和 AVB 内容保持不动。
然后再做了一个 init_boot.img。刷入,启动,Shell Root 验证通过:
1
uid=0(root) gid=0(root) context=u:r:magisk:s0
Magisk 运行环境不完整
Shell Root 可用后,Magisk 的模块和启动脚本仍然不能正常工作。
当时 /data/adb/magisk 是空的,/cache/magisk.log 中记录了:
1
Magisk environment incomplete, abort
我从已经核验过的官方 Magisk APK 中提取 11 个环境文件,包括 magisk、magiskinit、magiskboot、magiskpolicy、busybox 和相关脚本,放到 /data/adb/magisk,同时加入 no-AOA 的 post-fs-data.d 脚本。
重启后,以下检查全部通过:
1
2
3
4
/debug_ramdisk/su -c id
/debug_ramdisk/su -c "magisk -v"
/debug_ramdisk/su -c "ls /data/adb/magisk | wc -l"
/debug_ramdisk/su -c "grep -c 'Running post-fs-data.d' /cache/magisk.log"
这一阶段实际包含两个独立问题:Shell 授权和 Magisk 运行环境。只有两者都处理完成,模块和开机脚本才能正常工作。
⚠️ 这么折腾是因为到这里我的 F50 Pro 都没插卡,我不排除插卡有网之后,也可以在 Magisk 里面在线下载恢复,但我不想再试一次了。能用就别动吧。
UFI-TOOLS 的 Root Shell
旧文档中的包名是 com.kano.ufi.tools,实际 APK 已经改为:
1
com.minikano.f50_sms
后台启动后,http://192.168.0.1:2333 返回 200,但 Root Shell API 返回 500:
1
没有找到 socat 创建的 sock (高级功能是否开启?)
这不是鉴权问题,而是高级功能尚未开启,Root Shell 所需的 socat 通道不存在。启用高级功能后,socat 和 TTYD 正常监听,API 返回 uid=0(root)。
随后修改默认 UFI 口令,避免同网段的其他用户通过默认凭据调用 Root Shell。
scrcpy 连接黑屏,录制会导致设备重启
scrcpy 最初直接报告 Server connection failed。后来使用以下参数解决了音频和控制通道的问题:
1
2
3
scrcpy -s 192.168.0.1:5555 \
--no-audio \
--force-adb-forward
窗口可以打开,日志也出现 Renderer、Video decoding 和 Controller started。但是起来的画面是黑屏的。为了确认问题所在,我把 scrcpy 输出录成文件。录制结束时连视频头都没有生成,软、硬件 H.264 编码器都没有实际帧,--new-display 也没有改善。
但奇怪的是,我单独用原生screencap 截图,可以取得正常 UI,说明系统中存在可显示的界面,但视频采集链路没有输出。
单帧可以,我灵机一动,那就 screenrecord 试试? 结果录到一半,这货直接设备重启了。不死心再试,还是重启。这活儿的小身板估计经不起这么折腾,不敢再开录屏了。
替换 SurfaceFlinger 后解决
最后解决问题的是社区提供的“F50Pro 投屏修复”Magisk 模块。(感谢 UFI-TOOLS 的作者大佬,这得研究了多久啊)。
模块的核心是替换:
1
/system/bin/surfaceflinger
安装包标注“仅在 B22 测试”,我这 B28 固件还是有些心惊胆战的。不过考虑到前后两个版本中兴不至于改到 Surfaceflinger,再一个 Magisk 本身机制就是插件加载,类似 overlay,不会真实替换,不行大不了关了插件即可。
于是安装插件,重启后,SurfaceFlinger、ADB 和 UFI-TOOLS 均正常。
F50 Pro 自带的屏幕分辨率只有240x320,画面出来的那一刻我都笑了。 (实际上没屏幕,官方估计是为了加快启动速度所以改低了),可以在 scrcpy 加参数将分辨率提高到 1080p:
1
2
3
4
scrcpy -s 192.168.0.1:5555 \
--no-audio \
--force-adb-forward \
--new-display=1920x1080/240
到这里,投屏也成功了。
致谢
这次成功的折腾离不开下面这些大佬的项目。社区一定是需要分享和贡献的,这也是这篇文章的目的所在:
| 资料 | 链接 | 本次参考内容 |
|---|---|---|
| UFI-TOOLS 安装与使用指南 | kanokano.cn | 前期兼容性判断、ADB 与安装思路 |
| F50 Pro 相关视频 | B 站搜索 | 前期资料搜集和玩家经验 |
| UFI-TOOLS | GitHub 项目 | 后台、高级功能、Root Shell、ADB 和插件 |
| UFI-TOOLS Issue #104 | 作者回复 | B22 上先 Root、再通过无线 ADB 安装的路径 |
| F50 Pro B28 Root | againrivers/zte-f50pro-b28-root | B28 的备份、Root、刷写与恢复方案 |
| UFI-TOOLS 用户文档 | User_Doc.md | 功能、配置和使用方式 |
| 展锐 macOS 刷机工具集 | zte-f50pro-macos-toolkit · f50pro-MacOS-tools | 在 Mac 上执行备份、刷写和恢复 |
另外,最后解决 scrcpy 黑屏的“F50Pro 投屏修复”模块也是社区伙伴提供的本地压缩包,同样感谢。

