通过Magisk service.d 脚本实现手机开机自动开启无线 ADB
✅ 通过Magisk service.d 脚本实现手机开机自动开启无线 ADB
很多时候,我们希望手机 开机后自动开启无线 ADB (ADB over TCP/IP),这样电脑就能直接通过 Wi-Fi 连接设备,而不用每次都插数据线。默认无线ADB重启手机就关闭的。需要再次插线开启。
如果你的手机 已经 Root 并安装了 Magisk,就可以通过 service.d
脚本轻松实现。
这里以小米手机为例:
1. 前置条件
- 手机必须已经 Root,并且是 Magisk 环境。
- 手机可以使用
adb shell
进入 root 模式 (su
)。 - 熟悉基本的 Linux 命令操作。
2. 进入手机的 service.d 目录
首先用电脑连接手机:USB或者无线方式均可
adb shell
su
进入 root shell 后,切换到 Magisk 的 service.d
目录:
cd /data/adb/service.d/
📌 说明:
-
service.d
是 Magisk 的开机脚本目录。 -
任何放在这里的
.sh
脚本文件,都会在开机时由 Magisk 以 root 权限自动执行。开启root账户执行su命令的时候 手机会弹框,需要点击允许。
3. 新建脚本文件
在 service.d
目录中新建一个脚本文件 adb.sh
:
touch adb.sh
4. 写入脚本内容
使用 echo
方式逐行写入内容:
echo "#!/system/bin/sh" > adb.sh
echo "setprop service.adb.tcp.port 5555" >> adb.sh
echo "stop adbd" >> adb.sh
echo "start adbd" >> adb.sh
📌 说明:
#!/system/bin/sh
→ 指定脚本的解释器,必须写在第一行。setprop service.adb.tcp.port 5555
→ 设置 ADB 监听端口为5555
(可修改,见后续章节)。stop adbd
→ 停止当前正在运行的 ADB 服务。start adbd
→ 重新启动 ADB 服务,此时会按照上面设置的端口以无线模式运行。
5. 修改权限
让脚本具有可执行权限:
chmod 755 adb.sh
📌 说明:
755
权限表示:脚本对所有用户可读可执行,但只有 root 可写。- 如果权限过低,Magisk 开机时不会执行。
6. 测试脚本
可以手动执行一次,验证是否生效:
sh /data/adb/service.d/adb.sh
执行后,在电脑上尝试连接:adb connect 手机IP:5555
adb connect 10.11.0.20:5555
adb devices
如果能正常连接,说明脚本没问题。
7. 重启验证
最后重启手机。
Magisk 会在开机时自动执行 adb.sh
,这样每次开机就会自动开启无线 ADB,无需再插线。
8. 自定义端口
如果不想使用默认的 5555
端口,比如你要用 3333
:
编辑脚本 adb.sh
,将这一行:
setprop service.adb.tcp.port 5555
改成:
setprop service.adb.tcp.port 3333
保存后重新赋权:
chmod 755 /data/adb/service.d/adb.sh
然后重启手机即可。
📌 注意:
- ADB 端口范围一般在 1024–65535 之间,建议选择不常用的端口。
- 修改后,电脑端连接方式也要变,比如:
adb connect 手机IP:3333
adb connect 10.11.0.20:3333
8.1 多端口选择
如果你想要 在多个端口里随机选一个,比如 3333
、4444
、5555
,可以这样写:
#!/system/bin/sh
PORTS=("3333" "4444" "5555")
RANDOM_PORT=${PORTS[$RANDOM % ${#PORTS[@]}]}setprop service.adb.tcp.port $RANDOM_PORT
stop adbd
start adbdecho "ADB started on port $RANDOM_PORT" > /data/adb/service.d/adb_port.log
📌 说明:
PORTS=(...)
定义了一个端口数组。$RANDOM % ${#PORTS[@]}
会随机取一个下标。- 执行后会在
/data/adb/service.d/adb_port.log
写入实际启用的端口。 - 这样你每次重启手机,ADB 就会在不同端口运行,提高隐蔽性。
8.2 随机端口(范围内随机)
如果你想要 完全随机,比如在 30000–40000
范围内随机选一个端口,可以用:
#!/system/bin/sh
RANDOM_PORT=$((30000 + RANDOM % 10000))setprop service.adb.tcp.port $RANDOM_PORT
stop adbd
start adbdecho "ADB started on port $RANDOM_PORT" > /data/adb/service.d/adb_port.log
📌 说明:
$((30000 + RANDOM % 10000))
会生成一个30000–39999
的随机端口。- 和上面的多端口方式一样,会把实际端口写入
adb_port.log
,方便你在电脑端查看后连接。
9. 故障排查
如果脚本没生效,可以按照以下步骤排查:
9.1 确认脚本是否存在
ls -l /data/adb/service.d/
应该能看到 adb.sh
文件,且权限为 -rwxr-xr-x
(755)。
9.2 手动运行脚本
sh /data/adb/service.d/adb.sh
如果能正常开启无线 ADB,说明脚本本身没问题。
9.3 查看日志
Magisk 会在开机时执行脚本,日志可以通过 dmesg
或 Magisk 自带日志查看:
dmesg | grep adbd
或者在 Magisk Manager → 日志 中查看是否有执行报错。
9.4 检查 SELinux
某些 ROM 的 SELinux 策略可能会阻止脚本运行。可以临时切换到宽松模式测试:
setenforce 0
(测试成功后建议恢复回去:setenforce 1
)
10. Python脚本自动获取端口进行连接
通过 USB adb 拉取
/data/adb/service.d/adb_port.log
读取其中的端口号
自动用
adb connect 手机IP:端口
建立无线连接
import subprocess
import os
import re
import smtplib
import time
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart# ========= 配置 =========
ADB_PATH = "adb" # adb 路径
DEVICE_IP = "10.11.0.20" # 手机 IP
LOCAL_LOG = "adb_port.log" # 存放到电脑的日志文件
REMOTE_LOG = "/data/adb/service.d/adb_port.log" # 手机端日志路径MAX_RETRY = 3 # 最大重试次数
RETRY_INTERVAL = 5 # 每次重试间隔秒数# 邮件配置
SMTP_SERVER = "smtp.example.com"
SMTP_PORT = 587
EMAIL_USER = "alert@example.com"
EMAIL_PASS = "发送邮箱的密码或授权码"
TO_EMAIL = "yourmail@example.com"# ========= 工具函数 =========
def run(cmd):"""运行命令并返回输出"""print(f"[执行] {cmd}")result = subprocess.run(cmd, shell=True, capture_output=True, text=True)return result.stdout.strip()def pull_log():"""拉取 adb_port.log"""print("📥 拉取 adb_port.log ...")run(f"{ADB_PATH} shell su -c 'chmod 644 {REMOTE_LOG}'")run(f"{ADB_PATH} pull {REMOTE_LOG} {LOCAL_LOG}")def read_port():"""读取日志文件,提取端口号"""if not os.path.exists(LOCAL_LOG):raise FileNotFoundError("日志文件不存在,可能未成功拉取")with open(LOCAL_LOG, "r", encoding="utf-8") as f:content = f.read()print(f"📄 日志内容: {content}")match = re.search(r"(\d{4,5})", content)if match:return match.group(1)else:raise ValueError("未找到端口号,请检查日志内容")def connect_device(port):"""连接 adb"""print(f"🔗 尝试连接 {DEVICE_IP}:{port} ...")result = run(f"{ADB_PATH} connect {DEVICE_IP}:{port}")print(result)return "connected" in result.lower()def send_alert(msg):"""发送告警邮件"""print("📧 发送告警邮件 ...")message = MIMEMultipart()message["From"] = EMAIL_USERmessage["To"] = TO_EMAILmessage["Subject"] = "ADB 无线连接失败告警"message.attach(MIMEText(msg, "plain", "utf-8"))try:server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)server.starttls()server.login(EMAIL_USER, EMAIL_PASS)server.sendmail(EMAIL_USER, TO_EMAIL, message.as_string())server.quit()print("✅ 邮件已发送!")except Exception as e:print(f"❌ 邮件发送失败: {e}")# ========= 主逻辑 =========
def main():for attempt in range(1, MAX_RETRY + 1):try:print(f"\n===== 第 {attempt} 次尝试 =====")pull_log()port = read_port()if connect_device(port):print("✅ ADB 无线连接成功!")returnexcept Exception as e:print(f"⚠️ 失败: {e}")if attempt < MAX_RETRY:print(f"⏳ {RETRY_INTERVAL}s 后重试 ...")time.sleep(RETRY_INTERVAL)# 多次失败 → 邮件告警send_alert(f"无法连接设备 {DEVICE_IP},请检查手机是否开启 adb 或端口配置。")if __name__ == "__main__":main()
使用步骤
-
手机端脚本(
adb.sh
)已经会生成/data/adb/service.d/adb_port.log
内容示例:ADB started on port 3333
-
电脑用 USB 连接手机,确保
adb devices
能识别到设备。 -
运行:
python auto_adb.py
输出示例:
📥 拉取 adb_port.log ... 📄 日志内容: ADB started on port 3333 🔗 尝试连接 10.11.0.20:3333 ... connected to 10.11.0.20:3333 ✅ ADB 无线连接已建立!
db.sh)已经会生成
/data/adb/service.d/adb_port.log`
内容示例:
ADB started on port 3333
-
电脑用 USB 连接手机,确保
adb devices
能识别到设备。 -
运行:
python auto_adb.py
输出示例:
📥 拉取 adb_port.log ... 📄 日志内容: ADB started on port 3333 🔗 尝试连接 10.11.0.20:3333 ... connected to 10.11.0.20:3333 ✅ ADB 无线连接已建立!