文章目录
Android SDK中寻找traceroute代码
设备使用的是Android 11,在/system/bin下默认有traceroute6,但是没有找到traceroute。
SDK下只搜索到traceroute6的代码,没找到traceroute的
# ls ./external/iputils/traceroute*
./external/iputils/traceroute6.c
内置traceroute到SDK中
下载可执行文件
先参照这篇文章Android设备推送traceroute命令进行网络诊断下载traceroute的可执行文件在vendor目录下的mk中查找关键字PRODUCT_COPY_FILES
find vendor/ -name "*.mk" |xargs grep "COPY"
可以找到如下图所示的结果
有许多mk都用了拷贝文件到系统的方法,
3. 添加拷贝请求
其中vendor/xxx/proprietary/build/target_system_product.mk就是这次要使用的。
首先把bin文件拷贝到SDK下的external/iputils/目录中。
然后target_system_product.mk中添加
PRODUCT_COPY_FILES += external/iputils/traceroute:system/bin/traceroute
- 重新编译,在out目录下查询下是否存在traceroute
find out/ -name "traceroute"
# 可以正常的搜索到,说明拷贝成功了
out/target/product/xx/system/bin/traceroute
- 烧录新固件到设备后开机, 用adb指令执行traceroute
正常会打印如下信息:
说明集成traceroute指令到安卓设备中成功了。
另外确保设备是连接网络的,否则指令会失败
traceroute -I www.baidu.com
www.baidu.com: No address associated with hostname
Cannot handle "host" cmdline arg `www.baidu.com' on position 1 (argc 2)
traceroute参数说明
-I 参数(使用 ICMP Echo 请求)
traceroute -I target_host
- 作用:使用 ICMP Echo 请求(类似 ping 命令)作为探测包,而不是默认的 UDP 包。
- 适用场景:
当目标主机或中间路由器过滤 UDP 流量时,ICMP 可能更易通过。
某些网络环境(如企业内网)可能对 ICMP 限制较少。 - 注意:
部分防火墙可能仍然拦截 ICMP 流量。
-T 参数(使用 TCP SYN 包)
traceroute -T target_host
- 作用:使用 TCP SYN 包(建立连接的第一步)作为探测包。
- 适用场景:
当 UDP 和 ICMP 都被封锁时,TCP 通常是允许的(如 Web 流量使用 TCP 80/443 端口)。
可通过-p指定目标端口(默认 80)。 - 示例:
traceroute -T -p 443 www.baidu.com # 使用TCP 443端口(HTTPS)
- 注意
需要root权限,否则可能会失败
You do not have enough privileges to use this traceroute method.
socket: Operation not permitted