每次重启手机后都要重新插线开启ADB调试的日子该结束了。对于经常需要调试设备的开发者来说,这种重复性操作不仅浪费时间,还容易打断工作流。本文将带你深入探索如何利用Magisk的service.d功能,实现安卓设备开机自动开启无线ADB的完整方案。
Magisk作为目前最流行的Android root解决方案,其强大之处不仅在于提供了root权限,更在于其模块化设计。service.d目录是Magisk提供的一个特殊功能,允许用户在设备启动时自动执行自定义脚本。
当安卓设备启动时,Magisk会按照以下顺序执行初始化:
/data/adb/service.d/目录下的所有可执行脚本这些脚本会以root权限运行,为我们提供了在系统启动早期阶段执行自定义操作的绝佳机会。
相比其他开机自启方案,service.d具有明显优势:
| 方案 | 执行时机 | 所需权限 | 稳定性 |
|---|---|---|---|
| service.d | 系统启动早期 | root | 高 |
| init.d | 系统启动中期 | root | 中 |
| 第三方自启应用 | 系统启动完成后 | 无root | 低 |
| Tasker等自动化工具 | 用户登录后 | 无root | 中 |
从表格可以看出,service.d在权限和稳定性方面都是最佳选择,特别适合需要可靠执行的关键任务。
在开始编写脚本前,我们需要确保设备环境准备就绪。
提示:可以通过在终端输入
adb shell su -c 'echo $USER'来测试root权限是否可用
使用以下命令进入service.d目录:
bash复制adb shell su -c 'mkdir -p /data/adb/service.d'
adb shell su -c 'chmod 755 /data/adb/service.d'
这个目录默认可能不存在,所以我们需要先创建它并设置正确的权限。755权限表示:
现在我们来创建实现核心功能的脚本文件。
在service.d目录下创建adb_wireless.sh文件:
bash复制#!/system/bin/sh
# 设置ADB监听端口
setprop service.adb.tcp.port 5555
# 重启ADB服务使设置生效
stop adbd
start adbd
这个简单脚本完成了三件事:
创建脚本后,必须设置正确的执行权限:
bash复制adb shell su -c 'chmod 755 /data/adb/service.d/adb_wireless.sh'
权限设置不当是脚本无法执行的常见原因。建议使用755权限,它提供了足够的灵活性同时保持了安全性。
基础功能实现后,我们可以进一步优化脚本,使其更加强大和灵活。
如果你希望使用非默认端口,可以修改脚本中的端口号:
bash复制#!/system/bin/sh
# 使用自定义端口
CUSTOM_PORT=3333
setprop service.adb.tcp.port $CUSTOM_PORT
stop adbd
start adbd
# 记录使用的端口号
echo "ADB端口: $CUSTOM_PORT" > /data/adb/service.d/adb_port.log
注意:选择端口时应避开常用服务端口,建议使用1024-65535范围内的高位端口
为了增加安全性,可以实现每次启动随机选择端口:
bash复制#!/system/bin/sh
# 可选的端口范围
PORT_RANGE_START=30000
PORT_RANGE_END=40000
# 计算随机端口
RANDOM_PORT=$((PORT_RANGE_START + RANDOM % (PORT_RANGE_END - PORT_RANGE_START)))
# 设置并重启ADB
setprop service.adb.tcp.port $RANDOM_PORT
stop adbd
start adbd
# 记录使用的端口
echo "ADB端口: $RANDOM_PORT" > /data/adb/service.d/adb_port.log
这种实现方式每次重启设备都会随机选择一个端口,提高了安全性,但需要额外的机制来获取当前使用的端口。
即使是最简单的脚本也可能遇到执行问题,这里介绍常见问题的解决方法。
确认脚本存在:
bash复制adb shell su -c 'ls -l /data/adb/service.d/'
应该能看到你的脚本文件,权限应为-rwxr-xr-x
手动测试脚本:
bash复制adb shell su -c 'sh /data/adb/service.d/adb_wireless.sh'
执行后检查ADB是否按预期工作
查看系统日志:
bash复制adb shell su -c 'dmesg | grep adbd'
可以获取ADB服务的相关日志信息
在某些ROM上,SELinux可能会阻止脚本执行。可以临时设置为宽容模式测试:
bash复制adb shell su -c 'setenforce 0'
如果问题解决,说明是SELinux策略限制。长期解决方案是创建适当的SELinux策略规则,或者修改脚本以适应现有策略。
实现开机自启无线ADB后,我们可以进一步自动化连接过程。
在脚本中添加IP记录功能:
bash复制#!/system/bin/sh
# 获取WiFi IP地址
WIFI_IP=$(ip addr show wlan0 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1)
# 设置ADB
setprop service.adb.tcp.port 5555
stop adbd
start adbd
# 记录IP和端口
echo "ADB连接: $WIFI_IP:5555" > /data/adb/service.d/adb_connection.info
配合Python脚本实现自动连接:
python复制import subprocess
import re
def get_device_info():
# 拉取设备上的连接信息文件
subprocess.run('adb pull /data/adb/service.d/adb_connection.info', shell=True)
with open('adb_connection.info', 'r') as f:
content = f.read()
# 提取IP和端口
match = re.search(r'(\d+\.\d+\.\d+\.\d+):(\d+)', content)
if match:
return match.group(1), match.group(2)
return None, None
ip, port = get_device_info()
if ip and port:
subprocess.run(f'adb connect {ip}:{port}', shell=True)
这个Python脚本会自动获取设备记录的连接信息并建立ADB连接。
虽然无线ADB带来了便利,但也引入了潜在的安全风险,需要特别注意。
可以修改脚本,只在特定网络环境下启用无线ADB:
bash复制#!/system/bin/sh
# 获取当前连接的WiFi SSID
CURRENT_SSID=$(dumpsys wifi | grep 'SSID:' | awk -F'"' '{print $2}')
# 只在办公室网络启用无线ADB
if [ "$CURRENT_SSID" = "OfficeWiFi" ]; then
setprop service.adb.tcp.port 5555
stop adbd
start adbd
else
setprop service.adb.tcp.port -1
stop adbd
start adbd
fi
这种实现方式可以根据网络环境自动启用或禁用无线ADB功能,大大提高了安全性。