すべてのプロダクト
Search
ドキュメントセンター

HTTPDNS:OkHttp を使用した Android での HTTPDNS のベストプラクティス

最終更新日:Jan 06, 2026

Android SDK の統合プロセス の Topic では、Android ソフトウェア開発キット (SDK) のインポートと設定、IP アドレスの解決、ネットワークライブラリへの適用、統合の検証に関する完全なガイドを提供します。この Topic では、HTTPDNS と OkHttp を統合するための特定のソリューションに焦点を当てています。

1. 背景

Android でネットワークフレームワークとして OkHttp を使用している場合、OkHttp が提供するカスタム DNS サービスインターフェイスを呼び出すことで、HTTPDNS サービスを適切に統合できます。

OkHttp は、ネットワークリクエストを処理するためのオープンソースの軽量 Android フレームワークです。 HttpURLConnection および Apache HttpClient の代替として Square によって開発されました。リリース以来、OkHttp は成熟するにつれて Android 開発者の間で人気を博しています。

デフォルトでは、OkHttp は、名前解決のためにシステム DNS サービス InetAddress を使用します。また、DNS サービスをカスタマイズするためのインターフェイスも公開しており、これを使用して HTTPDNS を統合できます。

説明

このメソッドは Retrofit+OkHttp にも適用されます。設定済みの OkHttpClient をパラメーターとして Retrofit.Builder::client(OkHttpClient) に渡すことができます。

2. カスタム DNS インターフェイス

OkHttp は、開発者が DNS 解決をカスタマイズするための Dns API を提供します。

class OkHttpDns constructor(context: Context): Dns {
    private var mContext: Context

    init {
        mContext = context
    }
    @Throws(UnknownHostException::class)
    override fun lookup(host: String): List<InetAddress> {
        val httpdnsResult: HTTPDNSResult = HttpDns.getService(accountID)
            .getHttpDnsResultForHostSyncNonBlocking(host, RequestIpType.both)
        val inetAddresses: MutableList<InetAddress> = ArrayList()
        var address: InetAddress
        try {
            if (httpdnsResult.ips != null) {
                // IPv4 アドレスを処理します。
                for (ipv4 in httpdnsResult.ips) {
                    address = InetAddress.getByName(ipv4)
                    inetAddresses.add(address)
                }
            }
            if (httpdnsResult.ipv6s != null) {
                // IPv6 アドレスを処理します。
                for (ipv6 in httpdnsResult.ipv6s) {
                    address = InetAddress.getByName(ipv6)
                    inetAddresses.add(address)
                }
            }
        } catch (e: UnknownHostException) {
        }
        return if (!inetAddresses.isEmpty()) {
            inetAddresses
        } else Dns.SYSTEM.lookup(host)
    }
}
public class OkHttpDns implements Dns {
    private Context mContext;
    public OkHttpDns(Context context) {
        mContext = context;
    }
    @Override
    public List<InetAddress> lookup(String host) throws UnknownHostException {
        HTTPDNSResult httpdnsResult = HttpDns.getService(accountID).getHttpDnsResultForHostSync(host, RequestIpType.both);
        List<InetAddress> inetAddresses = new ArrayList<>();
        InetAddress address;
        try {
            if (httpdnsResult.getIps() != null) {
                // IPv4アドレスを処理する
                for (String ipv4 : httpdnsResult.getIps()) {
                    address = InetAddress.getByName(ipv4);
                    inetAddresses.add(address);
                }
            }

            if (httpdnsResult.getIpv6s() != null) {
                // IPv6アドレスを処理する
                for (String ipv6 : httpdnsResult.getIpv6s()) {
                    address = InetAddress.getByName(ipv6);
                    inetAddresses.add(address);
                }
            }
        } catch (UnknownHostException e) {

        }

        if (!inetAddresses.isEmpty()) {
            return inetAddresses;
        }

        return okhttp3.Dns.SYSTEM.lookup(host);
    }
}

okhttp の内部リトライメカニズムは、リトライ中に異なる IP アドレスを選択して接続を確立する場合があります。したがって、Dns インターフェイスの lookup() メソッドは、複数の IP アドレスを含む List<InetAddress> を返すことができます。このアプローチにより、利用できない単一の IP アドレスが返された場合に発生する可能性のあるリクエストの失敗を防ぐことができます。

3. OkHttpClient の構成

OkHttpClient オブジェクトを作成し、デフォルトの DNS サービスの代わりに OkHttpDns オブジェクトを渡します。

private fun initOkHttp(context: Context) {
    val client = OkHttpClient.Builder() 
        // 必要に応じて OkHttp の他の初期化設定を構成する
        .dns(OkHttpDns(context))
        .build()
}
private void initOkHttp(Context context) {
    OkHttpClient client = new OkHttpClient.Builder()
    // 必要に応じて OkHttp の他の初期化設定を構成する
    .dns(new OkHttpDns(context))
    .build();
}

以下は、OkHttp と HttpDns の実装の完全なコードです。

4. 検証

統合が完了したら、それが成功したことを確認する必要があります。ハイジャックシミュレーションやフォールトインジェクションテストなどのメソッドを使用できます。詳細については、「ネットワークライブラリ統合の検証」をご参照ください。

5. まとめ

OkHttp と HTTPDNS の組み合わせには、以下の利点があります:

  • DNS インターフェイスを実装することで、HttpDns サービスに簡単にアクセスできます。

  • このソリューションは適応性が高く、HTTPS、SNI、Cookie 管理などのシナリオに適しており、証明書の検証やドメイン名のチェックは必要ありません。