思无邪66头像
关注
无无线调试华为手机Shizuku保活探索封面图

无无线调试华为手机Shizuku保活探索

没有无线调试的华为手机,Shizuku 照样保活!——一次踩坑探索实录

上一篇《彻底解决华为手机 Shizuku 一拔数据线就掉线问题》讲了「无线调试」这套最优解。

但很多朋友实测反馈:我的开发者选项里根本搜不到「无线调试」!

别慌,这篇文章就是为你写的。这次不用最优解,硬是在「没有无线调试」的老机型上,把 Shizuku 给保活了。全程记录我的踩坑过程,包括翻车的那一步 👇


一、先说结论(急着用的看这里)

核心思路一句话:

让 adbd(手机上的调试守护进程)从 USB「搬家」到 TCP,然后在拔线之后再启动 Shizuku。

# ① USB 连着电脑时,执行一次(每重启一次手机需要重做):
adb tcpip 5555

# ② 拔掉数据线!先拔线!
# ③ 通过 WiFi 连接并启动 Shizuku:
adb connect 192.168.0.102:5555
adb -s 192.168.0.102:5555 shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh

# ④ 验证进程存在:
adb -s 192.168.0.102:5555 shell "ps -A | grep shizuku"

为什么顺序这么重要?这是我翻车一次才搞明白的,后面细说。


二、探索起点:老办法为什么救不了我的手机

先把问题摆出来:

  • Shizuku 用 adb shell sh .../start.sh 启动,一切正常 ✅
  • 数据线一拔——当场去世 ❌

上一篇的解法是「无线调试」,但我这次的测试机(华为老旗舰,EMUI/HarmonyOS,Android 10 底层):

  • 开发者选项翻遍了 ❌
  • 设置里搜索「无线调试」——没有这个选项 ❌

原因很简单:「无线调试」是 Android 11 才引入的功能,底层还是 Android 10 的老机型,压根没有这个东西。上一篇的最优解直接失效。

那怎么办?总不能每次用 Shizuku 都插着线吧?


三、走过的弯路:MT 管理器的 shell 行不行?

我的第一反应:手机上装个带终端的工具,直接在手机本地跑 start.sh 不就完了?

于是我装了 MT 管理器(自带 shell 终端),结果——不行。

踩坑分析(这部分是原理,看懂了能少走很多弯路):

  1. MT 终端跑的是 MT 自己的应用身份(u0_a 开头的普通应用 uid)
    而 Shizuku 必须以 shell(uid 2000) 或 root(uid 0) 身份运行才有特权。你在 MT 终端里跑 start.sh,拉起的进程是 MT 的子进程,权限跟 MT 一样只是个普通应用,Shizuku 服务端直接拒绝工作。

  2. Android 10+ 还有 W^X 限制
    应用无法执行放进自己目录的自定义二进制,想给 MT 塞一个 adb 工具?没门。

📌 一句话总结这个弯路:MT 管理器的定位是「使用已运行的 Shizuku」,不是「启动 Shizuku」。

类比一下:MT 是个持有普通门禁卡的访客,而 Shizuku 需要的是保安(shell 用户)从保安室(adb 通道)里请出来。访客自己在门口喊一嗓子,是喊不出一个保安的。


四、关键思路转变:让 adbd「搬家」

回到问题本质。上一篇说过:

USB 启动的 Shizuku 进程,挂在 adbd 会话下。华为在 USB 断开时会终止相关 ADB 会话,顺手清杀 shell 用户的进程。

注意这句里的关键词:USB 断开。

那如果把 adbd 从 USB 挪到 TCP 上呢?ADB 有个官方功能:

adb tcpip 5555

执行后,adbd 会监听 TCP 5555 端口,不再依赖 USB。此时拔掉数据线:

  • adbd 还活着(走 WiFi/TCP)✅
  • adb devices 里 WiFi 地址还在 ✅

看起来完美?我一开始也是这么以为的,然后翻车了 👇


五、翻车实录:按新方案做了,还是死了!

我的第一次操作顺序:

# ① USB 连着,开启 tcpip
adb tcpip 5555

# ② 此时 USB 和 WiFi 两个连接都在:
# 2KE0219C04022878        device
# 192.168.0.102:5555      device

# ③ 通过 WiFi 启动 Shizuku
adb -s 192.168.0.102:5555 shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh

# 输出:
# info: start.sh begin
# info: starting server...
# info: shizuku_starter exit with 0

# ④ 验证,进程确实在:
# shell  21071  1  ... S shizuku_server     ← shell 用户身份,父进程是 init(已完美守护化)

# ⑤ 拔线
# ⑥ 再看 —— Shizuku 还是死了 ❌

adbd 明明活着,Shizuku 为什么还是被杀了?

在这里插入图片描述

反复对比后我才想明白:

华为的清杀动作,不是「adbd 死了才杀进程」,而是 「拔线这个物理事件发生的瞬间,清杀 shell 用户的进程」。不管你的 Shizuku 是从 USB 会话还是 WiFi 会话启动的,只要拔线那一刻它活着,就会被顺手带走。

这就好比公司保安规定:下班打卡那一刻,清空所有访客。你访客是从正门还是侧门进来的根本不重要,卡点在场就是被清。


六、正确姿势:先拔线,后启动

想通了这一点,解法就简单得有点好笑:

拔线事件已经发生了,之后再启动的 Shizuku,就不会再遇到下一次拔线。

修正后的完整流程:

# ① USB 连着电脑,执行一次(让 adbd 搬家到 TCP):
adb tcpip 5555

# ② 立刻拔掉数据线!

# ③ 此时 USB 已不在,纯 WiFi 连接:
adb connect 192.168.0.102:5555

# ④ 拔线之后再启动 Shizuku:
adb -s 192.168.0.102:5555 shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh

# ⑤ 验证:
adb -s 192.168.0.102:5555 shell "ps -A | grep shizuku"

启动成功的标志(ps 输出长这样):

shell  21071  1  5237184 146152 ... S shizuku_server

重点看两处:

  • shell 开头 → 身份正确(uid 2000),权限没问题
  • 父进程是 1(init)→ 已脱离 adb 会话,完美守护化

之后正常用手机、锁屏、熄屏,每隔一段时间查一次 ps,观察它是否还活着。


七、如果它过一会儿还是死了:两条兜底路

兜底 1:禁用华为的进程清杀引擎(慎用)

华为系统里有个叫 iAware 的后台管控组件,负责激进清杀后台进程。可以试着禁用它:

adb -s 192.168.0.102:5555 shell pm disable-user --user 0 com.huawei.iaware

⚠️ 注意:

  • 部分系统版本会拒绝禁用,试了才知道
  • 副作用是可能略耗电、后台更热闹
  • 随时可恢复:adb shell pm enable com.huawei.iaware

兜底 2:Termux 手机自启动(强烈推荐装上)

就算 Shizuku 偶尔断掉,只要 adbd 还在 tcpip 模式(重启手机前一直有效),你可以在手机上自己把它拉起来,全程不用碰电脑:

资源连接需要自取—————–

链接:https://pan.quark.cn/s/88877a8f2249?pwd=6A8D 提取码:6A8D

  1. 安装 Termux(F-Droid 版,Google Play 版已停更且受限)
  2. 安装 adb 工具:
pkg install android-tools

在这里插入图片描述

  1. 手机自连、启动:
adb connect 127.0.0.1:5555
adb shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh

在这里插入图片描述

整个过程不到一分钟,Shizuku 断了随时自己续。

在这里插入图片描述

📌 Termux 能干而 MT 不能的原因:Termux(F-Droid 版)targetSdk 低,不受 Android 10+ 的 W^X 执行限制,能跑 adb 二进制;而且它是通过 adb 通道以 shell 用户身份启动 Shizuku,不是用自己的应用身份硬来。


八、别忘了:保活三件套 + 重启后的恢复流程

保活三件套(上一篇详细讲过,这里列清单)

  • ✅ 应用启动管理:Shizuku 关「自动管理」,手动允许自启动 / 后台活动 / 关联启动
  • ✅ 电池优化:Shizuku 设为「不允许优化」
  • ✅ 多任务界面下拉 Shizuku 卡片,加锁 🔒

这套是对 Shizuku 应用进程的保险;而 shell 用户的 shizuku_server 进程能不能活,靠的是本文的 tcpip 方案。两套保险叠加。

重启后的恢复流程(绕不开的一步)

tcpip 模式有个硬限制:手机一重启,adbd 自动回到 USB 模式,之前设置的 5555 端口清零。

所以每次重启手机后:

  1. 插一次数据线
  2. 跑一遍 adb tcpip 5555 → 拔线 → adb connect → start.sh
  3. 之后又是一条好汉

嫌麻烦可以写个一键 bat 把这四步串起来,插线跑一下就完事:

adb tcpip 5555
timeout /t 2
adb connect 192.168.0.102:5555
adb -s 192.168.0.102:5555 shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh
adb -s 192.168.0.102:5555 shell "ps -A | grep shizuku"
pause

九、常见问题速查表

问题现象可能原因解决方法
拔线后 Shizuku 死了先启动、后拔线(顺序错了)先拔线,再通过 WiFi 启动
拔线后 adb connect 失败忘了先执行 adb tcpip 5555插线执行一次再拔
重启后连不上 5555tcpip 模式随重启失效正常现象,插线重跑一遍
MT 管理器/终端里跑 start.sh 无效应用 uid 没有特权必须走 adb 通道(shell 用户)
Shizuku 活一会儿被杀iAware 周期清杀见兜底 1 / 完成保活三件套
想完全脱离电脑—Termux 自连方案(兜底 2)

十、总结:这次探索学到了什么

回顾整个探索路径:

拔线必死
  → 没有无线调试,上一篇方案失效
  → 弯路:MT 管理器 shell(应用 uid,没特权,Pass)
  → 思路转变:adb tcpip 5555,让 adbd 搬家
  → 翻车:先启动后拔线,照样死
  → 顿悟:清杀发生在「拔线瞬间」,与启动通道无关
  → 正解:先拔线,后启动 ✅
  → 兜底:iAware 禁用 + Termux 手机自启

两篇文章合在一起,覆盖了华为 Shizuku 保活的两类机型:

机型方案重启后
有无线调试(Android 11+)上一篇:无线调试启动手机端一键重启,最省心
没有无线调试(本篇)tcpip 搬家 + 先拔后启需插线跑一遍 bat

📌 一句话总结:

没有无线调试不可怕,可怕的是没搞清华为「拔线清杀」的触发时机。把 adbd 搬到 TCP 上,再把启动顺序调对,老机型一样能保活。


本篇是《华为 Shizuku 保活》系列第二篇,第一篇:彻底解决华为手机 Shizuku 一拔数据线就掉线问题

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2501_90379366/article/details/166494434

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--