本帖最后由 JaxsonWang 于 2026-7-20 19:57 编辑
前言
我的电视系统是 2.10.3982,设备型号:L75MA-AC,Android9,理论上版本号差不多本教程通用的。下面教程不涉及到 Magisk 补丁 root,第三方 recovery 刷入等教程,并且我使用的是 macOS 环境,不提供其他系统教程,可以根据文章实际情况来变动。 本教程是利用小米电视里面的服务名 TvService 作为入口,这个服务名把一个脚本路径交给高权限服务,由 uid=0 的 misysdiagnose SELinux 域执行:service call TvService 4400 s16 s s16 <script-path>: - ADB shell
- uid=2000(shell)
- SELinux=u:r:shell:s0
- │
- │ Binder transaction 4400
- ▼
- Xiaomi TvService
- │
- │ 将脚本路径交给厂商诊断执行组件
- ▼
- misysdiagnose 执行脚本
- uid=0(root)
- SELinux=u:r:misysdiagnose:s0
复制代码
利用上面特性配合我写的脚本通过 UART/CP2102 → U-Boot/Recovery → 部署 Magisk 启动链实现的持久 root。 - TvService 临时 Root
- │
- │ 尝试部署持久化文件、修改启动入口
- ▼
- Magisk 持久 Root
复制代码
准备
下载我的附件,然后新建 xiaomi 文件夹将附件里面内容解压进去,不要根解压。 使用 CP2102 UART 连接电视:这边参考论坛教程:
电脑设置终端环境变量: - # 小米电视ip地址
- export TV=192.168.50.202:5555
- # 工作目录地址
- export XIAOMI=/Users/jaxson/Downloads/xiaomi
- # 附件地址,放在工作目录地址里面
- export ROOT_BUNDLE=$XIAOMI/final-root-bundle
- # magisk 安装包
- export MAGISK_APK=$ROOT_BUNDLE/apps/Magisk-v27.0.apk
复制代码
CP2102:921600 baud / 8N1 / 无流控。 | HDMI 1 | CP2102 | | 14 | +5V | | 15 | TXD | | 16 | RXD | | 20 / 屏蔽地 | GND |
核对设备打开终端输入: - adb connect "$TV"
- adb -s "$TV" shell '
- getprop ro.product.model
- getprop ro.product.device
- getprop ro.build.version.release
- getprop ro.build.version.sdk
- getenforce
- '
复制代码
必须得到: - 敏感词-ASTP0
- mulan
- 9
- 28
- Enforcing
复制代码
进入 Recovery Root
启动 UART,注意在 window 使用 putty 的话,设置波特921600,新开一个终端A,输入: - mkdir -p "$XIAOMI/logs"
- "$ROOT_BUNDLE/tools/uart921600" \
- /dev/cu.usbserial-0001 \
- 921600 \
- "$XIAOMI/logs/mulan-root-install.raw.log"
复制代码
另一个终端 B 重启电视:
终端 A 在 U-Boot 阶段按回车。看到 mulan# 后逐条执行: - factorydata read console_enable
- factorydata write console_enable 1
- factorydata read console_enable
- setenv reboot_mode update
- printenv reboot_mode
- run switch_bootmode
复制代码
不要执行 saveenv。
Recovery 中确认: - grep -E '^(Uid|Gid|CapEff|Seccomp):' /proc/self/status
- cat /sys/fs/selinux/enforce
复制代码
必须是 UID 0,SELinux 输出 0。
完整分区备份
如果这一步不用做的话可以无视,直接跳转到下一节,但建议还是做一下备份,后期折腾分区坏了还能还原。 Recovery: - B=/sbin/busybox
- $B mount /dev/block/data /data
- D=/data/local/tmp/mulan-full-backup
- $B mkdir -p "$D"
- $B umount /cache
- f(){ $B dd if=/dev/block/$1 of=$D/$1.img bs=1M; }
复制代码
逐条执行: - f bootloader
- f reserved
- f cache
- f env
- f logo
- f recovery
- f misc
- f dtbo
- f cri_data
- f param
- f boot
- f rsv
- f metadata
- f vbmeta
- f tee
- f secure_recovery
- f factorydata
- f vendor
- f odm
- f system
- f product
- $B dd if=/dev/block/mmcblk0boot0 of=$D/mmcblk0boot0.img bs=1M
- $B dd if=/dev/block/mmcblk0boot1 of=$D/mmcblk0boot1.img bs=1M
- $B dd if=/dev/block/mtdblock0 of=$D/mtdblock0.img bs=1M
- $B dd if=/dev/block/mmcblk0 of=$D/emmc-before-data.img bs=1M count=3184
- $B chown -R 2000:2000 "$D"
- $B chmod 700 "$D"
- $B chmod 600 "$D"/*
- $B sync
- $B reboot
复制代码
Android 启动后重新开启 ADB,把备份拉到电脑,并复制一份到其他存储:
- mkdir -p "$XIAOMI/backups/mulan-full-backup"
- adb connect "$TV"
- adb -s "$TV" pull \
- /data/local/tmp/mulan-full-backup/. \
- "$XIAOMI/backups/mulan-full-backup/"
复制代码
安装 Stage-B
电视正常启动并重新开启 ADB 后,在终端 B: - <blockquote>adb -s "$TV" shell 'test ! -e /data/local/tmp/mulan-stage-b-install-20260719'
复制代码
在终端 A 的 Recovery shell: - <blockquote>B=/sbin/busybox
复制代码
必须看到: - [mulan-stage-b-install] INSTALL_SUCCESS
复制代码
成功后: 等待 Android 和 ADB 恢复:- <blockquote>adb connect "$TV"
复制代码必须是 Magisk 27.0、uid=0、bootstrap.rc=0,ADB 日志包含 SERVICE_SUCCESS。
启用内置 Zygisk
终端 B 执行: - <blockquote>adb -s "$TV" shell
复制代码
输出必须包含:
安装 Stage-C Final
终端 B: - <blockquote>adb -s "$TV" shell 'test ! -e /data/local/tmp/mulan-stage-c-final'
复制代码
必须看到: - [mulan-stage-c-final-prepare] PREPARE_SUCCESS
复制代码
终端 B 继续输入命令,进入 Recovery: - adb -s "$TV" reboot recovery
复制代码
终端 A: 必须看到:- [mulan-stage-c-final-install] INSTALL_SUCCESS
复制代码 出现 FAILED 时不要重启。成功后:
最终验证
等待约 90 秒,不要手动重新开启电视设置中的 ADB:
必须满足: - sys.boot_completed=1
- SELinux=Enforcing
- uid=0
- stage-c-early.rc=0
- stage-c-service.rc=0
- STAGE_C_LATE_SUCCESS
- Zygisk mode=builtin
复制代码
ADB 日志包含 STABILIZATION_SUCCESS 和 SERVICE_SUCCESS
检查 Zygisk: - adb -s "$TV" shell "/sbin/magisk su -c '
复制代码必须看到 /system/lib/libzygisk.so。再正常重启一次并重复本节。
Magisk App 和模块
终端执行下面命令安装 magisk app:- adb -s "$TV" install -r "$MAGISK_APK"
复制代码
不要点击“修复运行环境”、Direct Install、核心更新或卸载。
模块必须兼容 Android 9、Magisk 27 和 32 位 zygote。安装模块后正常重启。
给应用授予 Root 权限
目前 magisk app 在小米电视系统无法正常弹窗授权,直到超时提示拒绝授权,这时候可以用下面 UID 授权:
1. 查应用 UID 把包名替换成目标应用: - export TV=192.168.50.202:5555
- adb -s "$TV" shell
- pm list packages -U | grep 'package:com.example.app '
复制代码
示例输出: - package:com.example.app uid:10075
复制代码
记下 UID。不要直接给 uid:1000 等共享系统 UID 授权,否则同一 UID 下的其他系统组件也会获得 Root。
2. 永久允许
先确认 Magisk daemon 正常: - pidof magiskd
- /sbin/magisk su -c id
复制代码
然后进入 Root shell,把 10075 换成实际 UID: - /sbin/magisk su
- APP_UID=10075
- /sbin/magisk --sqlite "INSERT OR REPLACE INTO policies (uid,policy,until,logging,notification) VALUES ($APP_UID,2,0,1,0);"
- /sbin/magisk --sqlite "SELECT uid,policy,until,logging,notification FROM policies WHERE uid=$APP_UID;"
- exit
- exit
复制代码
正确结果包含: - uid=10075
- policy=2
- until=0
复制代码
含义: - policy=2 允许
- until=0 永不过期
- logging=1 记录新的 su 请求
- notification=0 不显示授权通知
复制代码
这会覆盖该 UID 原有的拒绝记录,不再依赖电视上无法操作的 Magisk 弹窗。
3. 重新启动应用
- adb -s "$TV" shell 'am force-stop com.example.app'
复制代码
重新打开应用,再执行它的 Root 功能。
Magisk 日志中的旧“拒绝”不会自动消失,应以新的请求时间和 policies 查询结果为准。
4. 查看全部授权- /sbin/magisk su -c '/sbin/magisk --sqlite "SELECT uid,policy,until,logging,notification FROM policies ORDER BY uid;"'
复制代码
5. 撤销授权
查询无结果表示已撤销。
6. 常见问题
No daemon is currently running!这不是 App 授权问题,而是 magiskd 没有运行。先正常重启电视,确认以下命令成功后再授权: - pidof magiskd
- /sbin/magisk su -c id
复制代码
已写入 policy=2,应用仍提示没有 Root 依次检查: 不要通过 Magisk App 的“修复运行环境”处理授权弹窗问题。
|