/system/etc/init.d/99adb_wireless[12]: /system/bin/adb: not found /system/etc/init.d/99adb_wireless[11]: /system/bin/adb: not found
时间: 2025-07-19 18:30:12 浏览: 7
<think>我们正在处理一个在init.d脚本中出现的"adb command not found"错误。init.d脚本通常是在Android设备的系统启动时运行的,因此我们需要确保在脚本执行时adb命令可用。
根据引用[1],adb(Android Debug Bridge)是一个客户端-服务器程序,用于与Android设备通信。在设备上,adb服务器通常运行在后台。但是,在init.d脚本中,环境变量可能没有正确设置,导致系统找不到adb命令。
问题分析:
1. 在init.d脚本中,环境变量PATH可能不包含adb所在的目录。通常adb位于/system/bin/或/system/xbin/。
2. 脚本可能在没有adb环境的上下文中执行(例如,在系统启动的早期阶段,adb服务可能还没有完全准备好)。
解决方案:
1. 在脚本中使用adb的绝对路径,而不是相对路径。例如,使用`/system/bin/adb`或`/system/xbin/adb`。
2. 在脚本中设置PATH环境变量,将adb所在目录包含进去。
具体步骤:
方法一:使用绝对路径
在脚本中,将所有使用`adb`的地方替换为绝对路径。例如:
原命令:adb devices
改为:/system/bin/adb devices 或 /system/xbin/adb devices
方法二:在脚本开头设置PATH
在脚本开头添加:
export PATH=$PATH:/system/bin:/system/xbin
然后,再使用adb命令。
但是,需要注意的是,在init.d脚本执行时,系统可能还处于启动阶段,adb服务可能尚未启动。因此,我们可能需要确保adb服务已经启动。通常,adb服务由adbd守护进程提供,而adbd在系统启动过程中会由init进程启动。但是,在init.d脚本运行时,adbd可能还没有启动。因此,如果脚本需要与adb通信,可能需要等待adbd启动。
我们可以添加一个循环来等待adbd启动。例如:
until [ "$(getprop init.svc.adbd)" == "running" ]; do
sleep 1
done
但是,请注意,init.d脚本的执行时机可能早于adbd启动。因此,如果脚本必须使用adb,可能需要延迟执行。
另外,我们还可以考虑使用其他方式来实现无线adb连接(从问题中的脚本名99adb_wireless推测可能是设置无线adb连接)。例如,通过设置端口和监听:
/system/bin/adb tcpip 5555
但是,同样需要等待adbd启动。
因此,一个综合的脚本示例(使用绝对路径并等待adbd)可能如下:
```bash
#!/system/bin/sh
# 等待adbd启动
until [ "$(getprop init.svc.adbd)" == "running" ]; do
sleep 1
done
# 设置adb的绝对路径
ADB=/system/bin/adb
# 执行adb命令
$ADB tcpip 5555
```
注意:不同的设备,adb的路径可能不同。请根据设备实际情况调整。
另外,还需要检查脚本是否有执行权限(chmod +x /system/etc/init.d/99adb_wireless),以及init.d是否被系统支持(有些设备需要内核支持或使用Magisk等工具)。
如果问题仍然存在,可能需要检查adb是否存在于指定的路径。可以通过在终端模拟器(如Termux)中运行`which adb`或`ls /system/bin/adb`来确认。
最后,由于init.d脚本在系统启动时运行,可能没有网络环境,所以如果脚本需要网络连接(例如无线adb连接需要网络),可能需要等待网络就绪。可以使用类似的方法等待网络:
until netcfg | grep wlan0 | grep -q UP; do
sleep 1
done
或者等待获取到IP地址:
until [ "$(getprop net.wlan0.ipaddress | tr -d '[:space:]')" != "" ]; do
sleep 1
done
但是,这些等待策略可能会增加启动时间,因此需要根据实际需求调整。
总结:解决"adb command not found"的关键是使用adb的绝对路径,并确保在adb服务运行后再执行命令。</think>### 解决 init.d 脚本中 "adb command not found" 错误
在 Android 设备的 `/system/etc/init.d/99adb_wireless` 脚本中出现 "adb command not found" 错误,通常是由于 **环境变量缺失** 或 **执行时机不当** 导致。以下是系统级解决方案:
---
#### 核心解决方法
1. **使用绝对路径替代环境变量**
在 init.d 脚本中直接指定 adb 的绝对路径:
```bash
# 替换原命令
/system/bin/adb devices # 替代 "adb devices" [^1]
/system/bin/adb tcpip 5555
```
2. **显式设置 PATH 环境变量**
在脚本开头添加:
```bash
#!/system/bin/sh
export PATH=/system/bin:/system/xbin:$PATH # 包含adb路径[^1]
```
3. **添加 adbd 服务状态检查**
确保 adb 守护进程已启动:
```bash
# 等待adbd服务就绪
while [ "$(getprop init.svc.adbd)" != "running" ]; do
sleep 1
done
```
---
#### 完整脚本示例
```bash
#!/system/bin/sh
# 1. 设置PATH环境变量
export PATH=/system/bin:/system/xbin:$PATH
# 2. 等待adbd服务启动
until [ "$(getprop init.svc.adbd)" = "running" ]; do
sleep 1
done
# 3. 使用绝对路径执行命令
/system/bin/adb tcpip 5555
/system/bin/adb connect 192.168.1.100:5555 # 替换为设备IP
```
---
#### 关键注意事项
1. **脚本执行权限**
确保文件有可执行权限:
```bash
adb shell chmod 755 /system/etc/init.d/99adb_wireless
```
2. **系统分区挂载时机**
init.d 脚本可能在 `/system` 挂载前执行,添加等待逻辑:
```bash
# 等待/system挂载
while [ ! -e /system/bin/adb ]; do
sleep 2
done
```
3. **SELinux 权限问题**
在 Android 6.0+ 设备检查 SELinux 状态:
```bash
adb shell getenforce # 若为Enforcing需调整策略
```
---
#### 验证步骤
1. 手动测试脚本:
```bash
adb shell su -c "/system/etc/init.d/99adb_wireless"
```
2. 查看日志:
```bash
adb logcat | grep -E "adb|init.d" # 过滤相关日志[^1]
```
---
### 相关问题
1. **如何在非 root 设备实现类似功能?**
(使用 Magisk 模块或 Tasker 替代 init.d)
2. **adb 无线连接如何保持稳定?**
(结合 `setprop persist.adb.tcp.port 5555` 持久化配置)
3. **init.d 脚本不执行如何调试?**
(检查 `/system/etc/init.d/` 目录权限和 init.rc 配置)
4. **Android 10+ 设备如何启用 init.d?**
(需通过 Magisk 或自定义内核实现)
5. **如何捕获脚本执行错误日志?**
(在脚本开头添加 `exec 2>/data/adb_init.log` 重定向错误输出)
> 引用[^1]:adb 使用客户端-服务器模型,需确保 adbd 守护进程已运行
> 引用[^2]:通过 `dumpsys` 可验证蓝牙等系统服务状态
> 引用[^3]:挂载点检查对系统分区可用性验证至关重要
阅读全文
相关推荐




















