代理选择器 ProxySelector 的实现
在 OkHttp3 中,ProxySelector 对象由 OkHttpClient 维护。创建客户端时,可以通过 Builder 设置自定义的 ProxySelector;若未指定,则回退到系统默认实现。
OpenJDK 1.8 默认的 ProxySelector 为 sun.net.spi.DefaultProxySelector,它通过读取系统属性来决定代理行为。而在 Android 平台上,默认使用的是 ProxySelectorImpl,其核心逻辑是从系统属性(System Properties)中获取代理配置,并过滤掉禁止代理的主机。
public abstract class ProxySelector {
private static ProxySelector defaultSelector = new ProxySelectorImpl();
public static ProxySelector getDefault() {
return defaultSelector;
}
}
Android 端的 ProxySelectorImpl 会根据 URI 的 scheme(如 http、https、ftp)查找对应的系统属性(例如 http.proxyHost),如果匹配到非代理主机列表则直接返回 NO_PROXY,否则尝试建立连接。
Address 与路由信息封装
前面提到的 RouteSelector 依赖 Address 提供的代理和地址信息来收集路由数据。Address 类在 OkHttp3 中扮演着配置容器的角色,它描述了建立连接所需的所有参数,包括 HTTP 服务器地址、DNS 解析器、SocketFactory、代理、TLS 设施等。
public final class Address {
final HttpUrl url;
final Dns dns;
final SocketFactory socketFactory;
final Proxy proxy;
final ProxySelector proxySelector;
// ... 其他配置
}
在拦截器链的执行过程中,RetryAndFollowUpInterceptor 负责创建 Address 对象,并从 OkHttpClient 中获取当前的 ProxySelector。随后,这个 会被传递给 ,用于后续的路由选择和连接管理。

