Android应用无法连接本地Web服务器,但adb shell可正常访问
Android应用无法连接本地127.0.0.1端口的解决思路
问题场景
Android设备上的系统服务启动了Web服务器,通过adb shell执行curl http://127.0.0.1:8545能正常请求,但设备上的任意Android应用请求该地址时,出现超时错误:
Caused by: java.net.SocketTimeoutException: failed to connect to /127.0.0.1 (port 8545) from /127.0.0.1 (port 48102) after 10000ms
可能的原因及解决方法
Android 10+的回环访问限制
从Android 10开始,系统默认限制应用沙箱访问本地回环地址(127.0.0.1),需做如下配置:- 在
AndroidManifest.xml中添加基础网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 若使用HTTP而非HTTPS,需开启明文流量允许:
<application ... android:usesCleartextTraffic="true"> ... </application>
- 在
Web服务器监听地址绑定问题
若系统服务的Web服务器仅绑定127.0.0.1,可能无法接收来自应用沙箱的请求。需修改服务器配置,将监听地址改为0.0.0.0,这样服务器会监听所有本地网络接口,包括应用沙箱的回环访问。SELinux权限拦截
系统服务的进程SELinux上下文可能限制了来自应用的连接请求:- 先临时关闭SELinux测试(需root权限):
adb shell setenforce 0 - 若关闭后应用能正常连接,需为系统服务进程添加对应的SELinux规则,允许接收应用的网络连接请求。
- 先临时关闭SELinux测试(需root权限):
系统防火墙规则限制
Android系统防火墙可能拦截了应用对8545端口的访问:- 查看当前防火墙规则:
adb shell iptables -L - 添加允许访问8545端口的规则(需root权限):
adb shell iptables -A INPUT -p tcp --dport 8545 -j ACCEPT
- 查看当前防火墙规则:
内容的提问来源于stack exchange,提问作者Markusbug
相关产品推荐
相关产品推荐

