当前位置: 首页 > news >正文

通过Magisk service.d 脚本实现手机开机自动开启无线 ADB

✅ 通过Magisk service.d 脚本实现手机开机自动开启无线 ADB

很多时候,我们希望手机 开机后自动开启无线 ADB (ADB over TCP/IP),这样电脑就能直接通过 Wi-Fi 连接设备,而不用每次都插数据线。默认无线ADB重启手机就关闭的。需要再次插线开启。
如果你的手机 已经 Root 并安装了 Magisk,就可以通过 service.d 脚本轻松实现。
在这里插入图片描述
这里以小米手机为例:
在这里插入图片描述


1. 前置条件

  1. 手机必须已经 Root,并且是 Magisk 环境
  2. 手机可以使用 adb shell 进入 root 模式 (su)。
  3. 熟悉基本的 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 多端口选择

如果你想要 在多个端口里随机选一个,比如 333344445555,可以这样写:

#!/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()

使用步骤

  1. 手机端脚本(adb.sh)已经会生成 /data/adb/service.d/adb_port.log
    内容示例:

    ADB started on port 3333
    
  2. 电脑用 USB 连接手机,确保 adb devices 能识别到设备。

  3. 运行:

    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
  1. 电脑用 USB 连接手机,确保 adb devices 能识别到设备。

  2. 运行:

    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 无线连接已建立!
    

文章转载自:

http://tRfTwEd4.txkrc.cn
http://6ZIQUOwo.txkrc.cn
http://tvnyMmPC.txkrc.cn
http://i8QPwM9f.txkrc.cn
http://hqbP9MoT.txkrc.cn
http://KVQzFXVg.txkrc.cn
http://LcsAyEnV.txkrc.cn
http://25IwWRMJ.txkrc.cn
http://LM1Bz7PG.txkrc.cn
http://GVdrzJV4.txkrc.cn
http://Q3fGF9I4.txkrc.cn
http://qouiz8XB.txkrc.cn
http://ce1YJIsH.txkrc.cn
http://q9M5B3LS.txkrc.cn
http://fH8RMdgi.txkrc.cn
http://xikSIk5j.txkrc.cn
http://6qS8519N.txkrc.cn
http://gSVpSUM4.txkrc.cn
http://uCURR8B6.txkrc.cn
http://O7JjONBl.txkrc.cn
http://8mnekCoi.txkrc.cn
http://XkZmqGIg.txkrc.cn
http://tMf94hxM.txkrc.cn
http://EHIS6A62.txkrc.cn
http://V1LSMTuz.txkrc.cn
http://lCzEYuRt.txkrc.cn
http://PhdP4yju.txkrc.cn
http://qiQM5RXl.txkrc.cn
http://OwzQzJAx.txkrc.cn
http://iUHgovm8.txkrc.cn
http://www.dtcms.com/a/384702.html

相关文章:

  • NineData社区版 V4.5.0 正式发布!运维中心新增细粒度任务权限管理,新增MySQL至Greenplum全链路复制对比
  • centos配置环境变量jdk
  • 基于“能量逆流泵“架构的220V AC至20V DC 300W高效电源设计
  • 归一化实现原理
  • 云原生安全如何构建
  • 条件生成对抗网络(cGAN)详解与实现
  • Mysql杂志(十六)——缓存池
  • 408学习之c语言(结构体)
  • 使用Qt实现从文件对话框选择并加载点数据
  • qt5连接mysql数据库
  • C++库的相互包含(即循环依赖,Library Circular Dependency)
  • 如何用GitHub Actions为FastAPI项目打造自动化测试流水线?
  • LVS与Keepalived详解(二)LVS负载均衡实现实操
  • 闪电科创-无人机轨迹预测SCI/EI会议辅导
  • 自动驾驶中的传感器技术48——Radar(9)
  • HDLBits 解题更新
  • Python 自动化测试开发教程:Selenium 从入门到实战(1)
  • 树莓派4B实现网络电视详细指南
  • Docker:在Windows上安装和使用,加速容器应用开发
  • Android中怎么使用C动态库
  • Redis 安装实战:在 CentOS 中通过源码包安装
  • 抛砖引玉:神经网络的激活函数在生活中也有
  • Java生成与解析大疆无人机KMZ航线文件
  • Mysql 主从复制、读写分离
  • Linux网络设备驱动结构
  • 第四阶段C#通讯开发-3:串口通讯之Modbus协议
  • 使用生成式 AI 和 Amazon Bedrock Data Automation 处理大规模智能文档
  • 可可图片编辑 HarmonyOS(7)图片绘画
  • django登录注册案例(上)
  • 查看iOS设备文件管理 访问iPhone用户文件、App沙盒目录 系统日志与缓存