如何为Android设备上运行的应用程序设置代理
Android 应用单独设置代理的实现方案
方法一:针对自定义网络请求配置代理(以 OkHttp 为例)
如果你的应用使用 OkHttp 发起网络请求,可直接在客户端构建阶段指定代理规则:
// 初始化代理对象,替换为实际的代理IP和端口 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("192.168.1.100", 8080)); // 构建带代理配置的 OkHttpClient OkHttpClient client = new OkHttpClient.Builder() .proxy(proxy) // 若代理需要身份验证,添加认证逻辑 .proxyAuthenticator((route, response) -> { String authCredential = Credentials.basic("proxy_user", "proxy_pass"); return response.request().newBuilder() .header("Proxy-Authorization", authCredential) .build(); }) .build();
后续所有通过该 client 发起的请求都会自动走指定代理。
方法二:配置应用级网络安全规则适配系统代理
若要让应用的所有网络请求(包括系统发起的请求)走代理,可通过网络安全配置实现:
- 在
res/xml/下创建network_security_config.xml文件:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config>
- 在
AndroidManifest.xml的<application>标签中引用该配置:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
- 代码中设置全局代理(Android 7.0+ 需申请
SYSTEM_ALERT_WINDOW权限并获得用户授权):
// 配置全局代理 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("代理IP", 端口)); System.setProperty("http.proxyHost", "代理IP"); System.setProperty("http.proxyPort", String.valueOf(端口)); System.setProperty("https.proxyHost", "代理IP"); System.setProperty("https.proxyPort", String.valueOf(端口));
方法三:通过轻量 VPN 实现精准应用代理
如果需要严格控制仅当前应用走代理,可实现自定义 VPN 服务,将应用流量转发至代理服务器:
- 声明权限:在
AndroidManifest.xml中添加
<uses-permission android:name="android.permission.BIND_VPN_SERVICE" /> <uses-permission android:name="android.permission.INTERNET" />
- 创建 VPN 服务子类:
public class AppProxyVpnService extends VpnService { private ParcelFileDescriptor vpnInterface; @Override public int onStartCommand(Intent intent, int flags, int startId) { Builder vpnBuilder = new Builder(); vpnBuilder.setSession("App Proxy") .addAddress("10.0.0.2", 32) .addRoute("0.0.0.0", 0) .addDnsServer("8.8.8.8") // 仅允许当前应用使用该VPN .addAllowedApplication(getPackageName()); vpnInterface = vpnBuilder.establish(); // 启动线程处理流量转发至代理服务器 new ProxyForwardThread(vpnInterface).start(); return START_STICKY; } @Override public void onDestroy() { if (vpnInterface != null) { try { vpnInterface.close(); } catch (IOException e) { e.printStackTrace(); } } super.onDestroy(); } }
- 在代码中启动 VPN 服务,需引导用户完成授权。
内容的提问来源于stack exchange,提问作者Banana Pekan
相关产品推荐
相关产品推荐

