我的荣耀 Magic3 遇到了一个问题:通过电脑启动 Shizuku 后,连接 USB 时显示运行正常,一拔线,首页就变成“未运行”。最后在这台手机上有效的办法是:先把 ADB 切到 TCP 5555 模式,再重新启动 Shizuku。 拔线后服务继续运行,接回电脑检查,Shizuku 和 ADB 服务的进程编号也都没有变化。
这篇记录的是一次具体设备上的实测。它解决了本次拔线掉线问题;手机重启后的恢复、长时间锁屏,以及其他荣耀机型是否有效,需要分别验证。操作会开启手机的网络 ADB 调试端口,使用前请看后面的安全说明。
一、实测设备与问题表现
| 项目 | 本次环境 |
|---|---|
| 手机 | 荣耀 Magic3,ELZ-AN00,骁龙 888 |
| 系统 | MagicOS 8.0,Android 14 |
| 系统版本 | 8.0.0.221(CHNC00E211R4P7) |
| Shizuku | 13.6.0.r1086.2650830c,官方版本 |
| 权限状态 | 未 root,通过 ADB 启动,服务运行于 shell 权限 |
| 电脑工具 | Windows PowerShell、Google Android SDK Platform-Tools |
| 实测日期 | 2026 年 10 月 10 日 |
原来的现象可以稳定复现:连接电脑启动成功,拔掉 USB,Shizuku 变成未运行;重新接线后,电脑上也查不到原来的 shizuku_server 进程。
这次没有通过 root、冻结系统服务或者循环重启脚本来解决。手机上另有 Dhizuku,但本次有效步骤使用的是 ADB,未调用 Dhizuku 的所有者权限。
二、先检查常规设置
如果只是偶尔停止,建议先排查后台限制、USB 调试是否被关掉,以及 USB 模式切换。Shizuku 官方手册也列出了允许后台运行、保留开发者选项和 USB 调试、使用仅充电模式等建议。华为 EMUI 的建议还包括允许仅充电模式下的 ADB 调试;荣耀是否有同名选项,以实际系统界面为准。Shizuku 官方手册
我这台手机已经加入了电池优化白名单,USB 调试和开发者选项也处于开启状态。尝试通过 svc usb 命令切换 USB 模式时,命令没有报错,但实际 USB 配置没有改变,因此不能把这一步记作“成功改成仅充电”。
如果你的手机通过上述设置就能解决问题,可以继续使用原来的启动方式。
三、为什么没有只给启动命令加 nohup
为了区分“首页显示异常”和“服务真的退出”,排查时另外运行了一个有限时长的记录脚本。它使用 setsid 和 nohup 脱离终端,每秒记录一次 Shizuku 进程与 ADB 状态。
原模式下拔线后,Shizuku 进程消失,这个已经脱离终端的记录脚本也同时终止。重新接线后,ADB 服务的进程编号发生了变化。
这些现象让我怀疑问题与 USB 断开时的 ADB 服务处理有关,而不只是 Shizuku 管理界面被后台清理。这属于根据现象作出的推断,没有定位到荣耀系统内部具体哪一段代码。
另外,Shizuku 13.6 的启动器本身已经使用了 fork()、setsid(),并把标准输入输出转向 /dev/null。所以,单纯再包一层 nohup,不能保证它绕过系统对相关进程的清理。Shizuku 13.6 启动器源码
四、有效操作:切换 TCP 模式,再启动 Shizuku
下面以 Windows PowerShell 为例。请使用 Google 官方 Platform-Tools,在解压后的 platform-tools 文件夹里打开 PowerShell。
1. 确认 USB 连接和授权
手机打开 USB 调试,接上电脑,接受自己电脑的调试授权,然后执行:
.\adb.exe devices -l列表中应出现目标手机,并显示 device。如果是 unauthorized,先处理手机上的授权提示;如果是 offline,先恢复正常连接。
为了避免多台设备时操作错手机,把列表第一列的设备序列号填到下面变量里。这里只填自己的设备编号,不需要把编号公开发帖:
$phoneSerial = '这里替换成自己的设备序列号'.\adb.exe -s $phoneSerial shell getprop ro.product.model.\adb.exe -s $phoneSerial shell getprop ro.adb.secure确认型号正确,并且 ro.adb.secure 返回 1。如果不是 1,不要继续照这个方法开启网络调试。本次实测设备返回的是 1。
2. 记录原来的 TCP 设置
.\adb.exe -s $phoneSerial shell getprop service.adb.tcp.port.\adb.exe -s $phoneSerial shell getprop persist.adb.tcp.port本次操作前,这两项均为空。如果你的手机原本已有网络调试配置,请先记录自己的原值,后面的“恢复 USB 模式”不等于恢复任意自定义配置。
3. 切换到 TCP 5555 模式
保持 USB 连接,执行:
.\adb.exe -s $phoneSerial tcpip 5555正常情况下会显示:
restarting in TCP mode port: 5555等待几秒,再检查:
Start-Sleep -Seconds 3.\adb.exe devices -l.\adb.exe -s $phoneSerial shell getprop service.adb.tcp.port最后一条应返回 5555。切换时 ADB 服务会重启,原有 Shizuku 可能随之退出,所以要在切换完成后重新启动它。本次手机的 USB ADB 连接随后恢复正常,后续仍然通过 USB 执行启动命令。
如果连接没有回来,先重新插线并检查授权;不要在设备还处于 offline 时继续粘贴后面的命令。如果你的机型在 TCP 模式下不能恢复 USB 连接,也不能照本次操作直接往下做,需要另行排查。
adb tcpip 5555 是传统的 ADB TCP 模式,不等同于 Android 11 及以上开发者选项中的无线调试配对功能。本次没有执行 adb pair,也没有通过 Wi-Fi 连接手机启动服务。Android 官方 ADB 文档
4. 重新启动 Shizuku
优先使用 Shizuku 当前版本界面提供的电脑启动命令,选择“通过连接电脑启动”后查看或复制。使用多设备参数时,在命令里的 adb 后加上 -s 和目标序列号;在这里的 PowerShell 窗口中,把 adb 写成 .\adb.exe。
注意版本差异:13.6 的发布说明明确提到更新了启动命令。我这次使用的是安装目录里的 libshizuku.so 启动器,不能假定旧教程中的 start.sh 在每个版本都存在。Shizuku 13.6 发布说明
如果你同样使用官方 Shizuku 13.6、ARM64 手机,可以用下面这段 PowerShell 根据当前安装路径找到启动器。本次 Magic3 使用的就是这一类启动路径;应用更新后目录可能改变,所以不要永久保存某次安装目录的随机字符串。
$apkOutput = @(.\adb.exe -s $phoneSerial shell pm path moe.shizuku.privileged.api)if ($LASTEXITCODE -ne 0) { throw '无法查询 Shizuku 安装路径' }
$baseApks = @($apkOutput | Where-Object { $_ -match '^package:/data/app/[A-Za-z0-9/._~+=-]+/base\.apk$'})if ($baseApks.Count -ne 1) { throw '未找到唯一的 Shizuku base.apk,请使用应用提供的命令' }
$apkPath = $baseApks[0].Substring('package:'.Length)$starterPath = $apkPath.Substring(0, $apkPath.Length - '/base.apk'.Length) + '/lib/arm64/libshizuku.so'
.\adb.exe -s $phoneSerial shell ls -l $starterPathif ($LASTEXITCODE -ne 0) { throw '未找到 ARM64 启动器,请使用应用提供的命令' }
.\adb.exe -s $phoneSerial shell $starterPathif ($LASTEXITCODE -ne 0) { throw 'Shizuku 启动失败,请检查输出' }打开 Shizuku,确认首页显示正在运行。如果目录不存在、系统拒绝执行或者启动失败,先按当前版本官方说明排查,不要为了运行这段代码修改系统目录权限。
五、怎么验证它真的没有掉
拔线之前,记录服务进程编号:
.\adb.exe -s $phoneSerial shell pidof shizuku_server.\adb.exe -s $phoneSerial shell pidof adbd保持 Shizuku 页面打开,拔掉 USB,等待约 20 秒,看首页是否仍显示正在运行。然后重新接回电脑,不要手动停止或启动 Shizuku,再执行上面两条命令。
本次结果:
| 检查项目 | 拔线前 | 接回后 |
|---|---|---|
| Shizuku 首页 | 正在运行 | 拔线期间仍显示正在运行 |
shizuku_server PID | 21746 | 21746 |
adbd PID | 21713 | 21713 |
service.adb.tcp.port | 5555 | 5555 |
另一个有限时长记录脚本也在拔线期间持续记录,约 96 秒的记录窗口内,Shizuku 的 PID 一直是 21746。相比只看首页文字,这些结果进一步支持服务没有中断,也没有在接线后偷偷重新启动。
本次验证覆盖了拔线与接回过程,未进行数小时锁屏、长期待机或重启后的存活测试。 也没有验证换网络、关闭 Wi-Fi 等其他场景。遇到这些情况,请分别测试,不能直接从本次结果推导。
六、手机重启后怎么办
本次没有设置开机脚本,也没有修改持久化 TCP 属性。按照这个方案使用时,手机重启后应重新连接电脑,检查设备和授权状态,执行 tcpip 5555,再启动 Shizuku。
Shizuku 13.6 另有 Android 13 及以上、连接受信任 WLAN 时免 root 自动启动的功能,但本次没有配置或验证,不能把它算作这套方案的效果。Shizuku 13.6 发布说明
这里获得的是 ADB 的 shell 权限,没有给手机 root,也没有让 Shizuku 获得跨重启永久运行能力。
七、网络调试端口与撤销方法
这个方法的代价是开启 TCP 5555 上的网络 ADB。Android 14 的 ADB 实现会根据 TCP 端口配置建立网络监听;因此不要把它理解成“只有手机本机能连接”的模式。AOSP Android 14 ADB 实现
本次设备的 ro.adb.secure=1,保留了 ADB 认证。对于自己信任、已获授权的电脑,仍应妥善管理调试授权;认证存在也不代表开启调试端口就完全没有风险。
- 尽量在可信网络上使用,不要把 5555 端口映射到公网。
- 不要授权陌生电脑;只有自己的可信电脑才考虑勾选长期授权。
- 不需要网络调试时,可以恢复 USB 模式。
本次原来没有自定义 TCP 设置。要撤销这次模式切换,接回 USB,确认连接正常后执行:
.\adb.exe -s $phoneSerial usbStart-Sleep -Seconds 3.\adb.exe devices -l.\adb.exe -s $phoneSerial shell getprop service.adb.tcp.port正常会显示正在重启到 USB 模式。随后 TCP 端口属性应不再是 5555,常见值为 0。如果仍是 5555,撤销没有按预期完成,需要继续检查。
恢复 USB 模式会重启 ADB 服务,Shizuku 也可能退出。需要继续使用时,可以按原来的电脑方式重新启动,但本机原先“拔线就掉”的现象可能再次出现。
本次实际测试的是切换到 TCP 模式并验证拔线存活;上述恢复命令是 ADB 提供的标准撤销方式,尚未在本次成功配置上执行撤销测试。
八、遇到失败时先看这几项
| 现象 | 检查方向 |
|---|---|
找不到 adb | 在 Platform-Tools 目录操作,PowerShell 使用 .\adb.exe |
| 提示多台设备 | 使用 -s 指定目标设备,确认序列号填对 |
显示 unauthorized | 解锁手机,处理自己电脑的 USB 调试授权 |
切换后设备消失或 offline | 等待几秒、重新插线、检查授权,不要跳过连接检查 |
找不到 start.sh 或 libshizuku.so | 使用当前版本应用提供的命令,重新查询安装路径 |
| TCP 属性已是 5555,拔线仍停止 | 该方法未解决你的设备问题,恢复原模式再排查后台或系统限制 |
| 服务进程还在,但首页显示未运行 | 需要进一步排查管理界面与服务通信,不能直接当作同一个掉线问题 |
