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

Alibaba Cloud DNS:Android SDK development guide

最終更新日:Aug 27, 2026

内蔵のキャッシュ機能により信頼性の高いドメイン名前解決を実現するため、モバイル解決 HTTPDNS Android SDK をアプリに統合します。

概要

Android SDK は、モバイル解決 HTTPDNSDoH JSON API の Java ラッパーです。Android アプリがドメイン名を解決するための Java インターフェイスを提供し、Time-to-Live (TTL) と Least Recently Used (LRU) ポリシーを使用する効率的なローカルキャッシュを備えています。モバイル解決 HTTPDNS を Android アプリに統合することで、ドメイン名前解決のエラーを修正し、正確で低コストのスケジューリングを可能にします。

主な利点:

  • シンプルな使用方法

    最小限のコードで モバイル解決 HTTPDNS サービスにアクセスできます。

  • ゼロレイテンシー

    LRU キャッシュは解決済みの IP をローカルに保存し、TTL の有効期限が切れる前にエントリを事前に更新することで、ゼロレイテンシーの解決を可能にします。

実装リファレンスとして、alidns_android_demo サンプルプロジェクトをダウンロードしてご参照ください。

SDK の統合

SDK の追加

Gradle と Maven

次のコードを build.gradle ファイルに追加します。

allprojects {
  repositories {
    maven {
      url 'https://maven.aliyun.com/repository/public/'
    }
    mavenLocal()
    mavenCentral()
  }
}

依存関係情報を追加します。

dependencies {
     implementation 'com.alibaba.pdns:alidns-android-sdk:2.3.3'
     implementation 'com.google.code.gson:gson:2.8.5'
}

AAR ファイル

SDK のダウンロードページから SDK をダウンロードし、alidns_android_sdk.aar パッケージをプロジェクトの libs ディレクトリに追加します。

SDK の初期化

重要

名前解決の失敗を防ぐため、アプリケーションライフサイクルの早い段階で SDK を初期化してください。

コンソールからアカウント ID を取得し、キーを作成して AccessKey IDAccessKey Secret を取得します。次に、この Application クラスの例に示すように SDK を初期化します。

public class DnsCacheApplication extends Application{

    private String accountId = "ご利用のアカウント ID"; // コンソールから取得したアカウント ID を設定します。
    private String accessKeyId = "ご利用の AccessKey ID"; // コンソールから取得した AccessKey ID を設定します。
    private String accessKeySecret = "ご利用の AccessKey Secret"; // コンソールから取得した AccessKey Secret を設定します。

    @Override
    public void onCreate() {
       super.onCreate();
       // SDK アクセスのためにアカウント ID、AccessKey ID、AccessKey Secret を設定します。
       DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret); 
       // 注意:キープアライブ対象のドメインを設定すると、TTL の 75% が経過した時点で自動的に名前解決がトリガーされます。
       // これにより、これらのドメインの名前解決は常にキャッシュにヒットします。ただし、CDN を使用している場合、
       // TTL が短くなる可能性があり、リクエストが頻繁になりコストが増加する可能性があります。このメソッドは注意して使用してください。
       DNSResolver.setKeepAliveDomains(new String[]{"your-domain-to-keep-alive-1","your-domain-to-keep-alive-2",...});       
       // 指定されたドメインの事前解決を実行して IPv4 アドレスを取得します。プレースホルダードメインを解決したいドメインに置き換えてください。
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{"your-domain-to-preload-1","your-domain-to-preload-2",...}); 
    }
}
説明

DNSResolverモバイル解決 HTTPDNS SDK のコアクラスです。モバイル解決 HTTPDNS の DoH JSON API をラップして、ドメイン名を IP アドレスに解決します。モバイル解決 HTTPDNS SDK は Application サブクラスで初期化してください。

AndroidManifest.xml に次の権限を宣言します。

<!--必須の権限-->
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
   <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

SDK の認証

バージョン 2.0 以降、SDK は不正使用を防ぐために認証を必要とします。モバイル解決 HTTPDNS を有効にするには、コンソールでキーを作成して AccessKey IDAccessKey Secret を取得する必要があります。SDK の初期化中に認証パラメーターを設定する必要があります。HTTPDNS は認証されていないリクエストを拒否し、これにより名前解決が失敗し、サービスに影響を与えます。モバイル解決 HTTPDNS

認証パラメーターは次のように設定できます。

DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret);
警告
  • ログにアカウント ID、AccessKey ID、AccessKey Secret、またはその他のランタイムデータが漏洩するのを防ぐため、本番リリースでは SDK のデバッグログを無効にしてください。

  • SDK の統合には、コード内にアカウント ID、AccessKey ID、AccessKey Secret を設定する必要があります。これらのパラメーターは使用量測定と課金に関連しています。悪意のある逆コンパイルによる認証情報の漏洩を防ぐため、アプリケーションをリリースする前にコードの難読化とアプリの補強を有効にしてください。

SDK 統合に関する問題

「Cleartext HTTP traffic not permitted」エラー

原因:Android 9.0 (API レベル 28) 以降、Android はデフォルトでクリアテキストのネットワークトラフィックをブロックし、HTTPS URL のみを許可します。

解決策

AndroidManifest.xml ファイルで、<application> 要素に次のコードを追加します。

android:usesCleartextTraffic="true"

<application
        android:name=".DnsCacheApplication"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true">

「Didn't find class BasicHttpParams」エラー

原因:Apache HTTP クライアントは非推奨です。

Android 6.0 で、Google は Apache HTTP クライアントのサポートを削除しました。Android 9.0 以降、org.apache.http.legacy は bootclasspath から削除されています。

この変更は、API レベル 28 未満をターゲットとするほとんどのアプリケーションには影響しません。API レベル 28 以上をターゲットとするアプリケーションで、Apache HTTP インターフェイスまたはそれを使用するライブラリを引き続き使用する場合、Apache HTTP インターフェイスが見つからないため例外が発生します。

解決策

AndroidManifest.xml ファイルで、<application> 要素に次のコードを追加します。

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

NDK の設定

  • アプリプロジェクトのルートディレクトリにある local.properties ファイルに NDK のインストールパスを追加します。

ndk.dir=...\\ndk\\21.4.7075529; // ... をローカルの NDK インストールパスに置き換えてください。
  • アプリプロジェクトのルートディレクトリにある gradle.properties ファイルに次の設定を追加します。

android.useDeprecatedNdk = true;

最適なパフォーマンスを得るために、JDK 1.8 と NDK 21.4.7075529 を使用してアプリをコンパイルすることを推奨します。

API リファレンス

共通設定

1. Init メソッドを使用した初期化

Application クラスで SDK を初期化する際に Init メソッドを呼び出します。

DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret);

2. 事前解決用のドメインを設定

初期化時に モバイル解決 HTTPDNS SDK にドメインを登録して事前解決を有効にし、後続のレイテンシーを削減します。

  • IPv4 または IPv6 ドメインの事前解決を指定

// 事前解決するレコードタイプを指定します。プレースホルダードメインを解決したいドメインに置き換えてください。
DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{...});

// DNSResolver.QTYPE_IPV4: ドメインの IPv4 レコードタイプを事前にフェッチします。
// DNSResolver.QTYPE_IPV6: ドメインの IPv6 レコードタイプを事前にフェッチします。
// DNSResolver.QTYPE_IPV4_IPV6: ドメインの IPv4 と IPv6 の両方のレコードタイプを事前にフェッチします。
  • 現在のネットワークに基づいて事前解決のために IPv4 または IPv6 を自動的に選択します。デュアルスタック環境では、IPv4 と IPv6 の両方のアドレスが事前にロードされます。

DNSResolver.getInstance().preLoadDomains(domains);
重要

事前解決 API は、リアルタイムで非同期ネットワークリクエストをトリガーします。この API を呼び出す前に、必要なすべての初期化が完了していることを確認してください。

3. キャッシュのキープアライブ用のドメインを設定

SDK は、TTL の 75% が経過した時点で設定されたドメインを再解決し、キャッシュを最新の状態に保ちます。これを 10 ドメインに制限することを推奨します。事前解決とは独立しています。

DNSResolver.setKeepAliveDomains(new String[]{"your-domain-1", "your-domain-2"});
説明

メリット

  • レコードはタイムリーに更新されます (TTL が切れる前に)。

  • 事前解決と併用すると、初期解決のレイテンシーを 0 ミリ秒に短縮できます。

デメリット

  • TTL の 75% で再リクエストすると、追加のコストが発生します。

4. IPv6 サーバーアドレスを使用するかどうかを指定

モバイル解決 HTTPDNS サービスは IPv4 と IPv6 の両方のアクセスをサポートしています。DNSResolver.setEnableIPv6(boolean enable) を使用して IPv6 サーバーアクセスを切り替えます。デフォルト:IPv4。IPv6 が有効で、モバイル解決 HTTPDNS サービスへの接続が失敗した場合、SDK は自動的に IPv4 で一度再試行します。

5. キャッシュエントリの最大数を設定

DNSResolver.getInstance().setMaxCacheSize(CACHE_MAX_NUMBER); // キャッシュエントリの最大数を設定します。デフォルトは 100 です。

count の最大値をカスタマイズできます。

6. サーバーアクセスのプロトコルを設定

SDK は、名前解決リクエストに HTTP と HTTPS をサポートしています。デフォルト:HTTPS (セキュリティ上推奨)。HTTPS リクエストは HTTP レートの 5 倍で課金されることに注意してください。ビジネス要件に基づいて選択してください。モバイル解決 HTTPDNS

DNSResolver.setSchemaType(DNSResolver.HTTPS); // デフォルトのアクセスモードは HTTPS です。

DNSResolver.HTTP:HTTP 経由でサーバー側インターフェイスにアクセスします。

DNSResolver.HTTPS:HTTPS 経由でサーバー側インターフェイスにアクセスします。

高度な設定

1. SDK デバッグログの有効化または無効化

DNSResolver.setEnableLogger(true); // SDK デバッグログはデフォルトで無効になっています。

SDK デバッグログを有効または無効にします。デフォルト:無効。

2. HTTPDNS の名前解決が失敗した場合にローカル DNS への自動フォールバックを有効にするかどうかを指定モバイル解決 HTTPDNS

DNSResolver.setEnableLocalDns(true); // デフォルトでは、HTTPDNS の名前解決が失敗した場合のローカル DNS への自動フォールバックが有効になっています。

3. 短縮モードの有効化または無効化

モバイル解決 HTTPDNS の DoH JSON API は、完全な JSON とコンパクトな IP 配列の 2 つの形式でデータを返します。DNSResolver.setEnableShort(boolean enable) を呼び出して短縮モードを有効または無効にできます。デフォルトでは、短縮モードは無効です。

DNSResolver.setEnableShort(true); // デフォルト値は false です。このパラメーターを設定する必要はありません。
重要

短縮モードでは、モバイル解決 HTTPDNS SDK は完全な JSON の代わりにコンパクトな IP 配列を返し、応答サイズを削減します。トラフィックに敏感なシナリオに適しています。

4. 無期限キャッシュを有効にするかどうかを指定

DNSResolver.setImmutableCacheEnable(false); // デフォルトでは、無期限キャッシュは無効になっています。
重要

SDK は 3 つのキャッシュ更新メカニズムを提供します。

  • キャッシュは決して期限切れにならない:この機能を有効にすると、有効期限チェックと更新操作をスキップすることで、アプリのランタイム中にキャッシュが常に有効であるとして扱われます。setKeepAliveDomains を設定してキャッシュを能動的に更新する必要がなく、ユーザーの名前解決数を最小限に抑えます。

    メソッド:DNSResolver.setImmutableCacheEnable(boolean var0)

    パラメーター var0true の場合、キャッシュは決して期限切れにならない機能が有効になります。var0false の場合、この機能は無効になります。

  • 能動的なキャッシュ更新:この機能は、名前解決が最新のキャッシュされたレコードにヒットすることを保証します。ドメインの権威ゾーンが変更されると、このメカニズムは、名前解決リクエストがキャッシュにヒットして DNS レイテンシーを削減するだけでなく、最新のレコードを取得することも保証します。ドメインの TTL の 75% が経過すると、SDK は自動的に名前解決クエリをトリガーしてキャッシュを更新します。能動的な更新が有効になっているドメインの数を 10 に制限することを推奨します。

    メソッド:DNSResolver.setKeepAliveDomains(String[] var1)

    説明:var1 は、事前に更新する必要があるドメイン名の文字列配列です。

  • 受動的なキャッシュ更新

    次の 2 つのメソッドを呼び出して名前解決結果を取得すると、キャッシュは受動的に更新されます。

    • getIPsV4ByHost(String hostName) メソッドは、指定された hostName の IPv4 レコードの配列を取得します。キャッシュが空でなく、TTL 内である場合、メソッドはキャッシュされた結果を直接返します。それ以外の場合は、まずネットワークリクエストを通じて最新の名前解決結果を取得し、その結果を返してキャッシュを更新します。このメソッドは、非常に正確な名前解決結果が必要なシナリオでよく使用されます。

    • getIpv4ByHostFromCache(String hostName, boolean isAllowExp) メソッドは、キャッシュから hostName の IPv4 レコードの配列を取得します。isAllowExp パラメーターの値に基づいて、このメソッドはキャッシュから期限切れの名前解決結果を返すかどうかを決定します。最新の名前解決結果がキャッシュされるように、アプリ起動時に事前ロードメソッドと併用することを推奨します。

      isAllowExptrue に設定されている場合、キャッシュが期限切れであっても古いデータが返され (キャッシュが空の場合は null が返されます)、非同期リクエストを使用してキャッシュが更新されます。このパラメーターが false に設定されている場合、キャッシュが期限切れまたは空のときに null が返され、非同期リクエストを使用してキャッシュが更新されます。

    推奨パターン

    String[] IPArray = mDNSResolver.getIpv4ByHostFromCache(hostname,true);
            if (IPArray == null || IPArray.length == 0){
                IPArray = mDNSResolver.getIPsV4ByHost(hostname);
            }

5. キャッシュの有効化または無効化

DNSResolver.setEnableCache(true); // キャッシュはデフォルトで有効になっています。

名前解決キャッシュを有効または無効にします。デフォルト:有効。

6. IP 速度測定の有効化または無効化。この機能はバージョン 2.3.0 以前ではデフォルトで無効、バージョン 2.3.1 以降ではデフォルトで有効です。

DNSResolver.setEnableSpeedTest(false); // v2.3.0 以前ではデフォルトで無効、v2.3.1 以降ではデフォルトで有効です。

IP 速度測定を有効または無効にします。デフォルト:v2.3.0 以前では無効、v2.3.1 以降では有効。

7. ソケット監視による IP 速度測定のポート番号を設定

DNSResolver.setSpeedPort(DNSResolver.PORT_80);

ソケットベースの IP 速度測定のポートを設定します。デフォルト:80。

8. IP 速度測定の IPv6 優先マージンを設定 (v2.3.3 以降でサポート)

DNSResolver.setSpeedTestIpv6PreferMs(0);

IP 速度測定の IPv6 優先マージンをミリ秒単位で設定します。速度測定が有効で、IPv4 と IPv6 アドレスが一緒にランク付けされる場合、SDK は測定された IPv6 時間からこのマージンを減算してから、その結果を測定された IPv4 時間と比較します。したがって、IPv6 が IPv4 よりもマージン未満で遅い場合でも、IPv6 アドレスが優先されます。デフォルト:0 (マージンを無効にします)。有効範囲:[0, 1000]。この設定は、速度測定が有効な場合にのみ有効です。

9. ISP ネットワークごとにドメインキャッシュをパーティション分割するかどうかを指定

DNSResolver.setIspEnable(true); // デフォルトでは、ドメインキャッシュは ISP ネットワークごとにパーティション分割されます。

有効にすると、ドメインキャッシュデータはネットワーク環境ごとに個別に保存されます。無効にすると、すべてのネットワークで単一のキャッシュが共有されます。

10. ネガティブキャッシュの最大 TTL を設定

DNSResolver.setMaxNegativeCache(MAX_NEGATIVE_CACHE); // ネガティブキャッシュの最大 TTL を設定します。デフォルトは 30 秒です。

ネガティブキャッシュの最大 TTL を設定します。ドメインに対して IP が返されない場合にネガティブキャッシュエントリが作成されます。デフォルト:30 秒。

11. キャッシュの最大 TTL を設定

DNSResolver.setMaxTtlCache(MAX_TTL_CACHE); // キャッシュの最大 TTL を設定します。デフォルト値は 3,600 秒です。

キャッシュエントリの最大 TTL 上限を設定します。デフォルト:3,600 秒。

12. クライアントサブネット情報を設定

DNSResolver.setEdnsSubnet("1.2.XX.XX/24");

setEdnsSubnet は EDNS Client Subnet (ECS, RFC 7871) をサポートし、ユーザーのサブネット情報を権威 DNS に渡して正確なトラフィックスケジューリングを行います。マスクが長いほど結果はより正確になり、マスクが短いほどプライバシーが向上します。/24 マスクが推奨されます。

説明

このパラメーターは、DNS プロキシが DoH JSON API を使用するシナリオ向けに設計されています。これらのシナリオでは、ユーザーが DNS クエリを DNS プロキシに送信し、プロキシはこのパラメーターを使用してユーザーのサブネット情報を モバイル解決 HTTPDNS に渡し、その後権威 DNS サーバーに渡します。

たとえば、DNSResolver.setEdnsSubnet("1.2.XX.XX/24") を呼び出すと、権威サーバーは 1.2.XX.XX/24 アドレスに基づくプレフィックス情報を受信し、DNS リンクの選択に役立てます。

13. ドメイン名の名前解決のタイムアウト期間を設定

ドメイン名の名前解決の timeout を設定します。デフォルト:3 秒。推奨範囲:2~5 秒。

DNSResolver.setTimeout(3);

14. 同時解決の最大数を設定 (v2.3.2 以降でサポート)

非同期 DNS 解決 (事前解決、キャッシュ更新) の最大同時実行数を設定します。有効範囲:[1, 50]。デフォルト:10。

DNSResolver.setMaxConcurrentResolveCount(10);

15. トラブルシューティングのために SessionId を取得

sessionId はアプリ起動時に生成され、ライフサイクル全体を通じて一定です。すべての モバイル解決 HTTPDNS 名前解決リクエストはこの ID を持ちます。トラブルシューティングのためにサーバー上のリクエストをトレースするために使用します。

public static String getSessionId()

16. ログ出力コールバック

このコールバックは、SDK によって出力されるログを受信します。

HttpDnsLog.setLogger(new ILogger() {
  @Override
  public void log(String msg) {
      Log.d("HttpDnsLogger:", msg);
  }
});

ProGuard の設定

   -keep class com.alibaba.pdns.** {*;}

サービス API

  /**
   * 自動検出されたネットワーク環境 (IPv4 のみ、IPv6 のみ、またはデュアルスタック) に基づいてドメイン名の名前解決を事前にロードします。
   * デュアルスタックネットワーク環境では、IPv4 と IPv6 の両方の名前解決結果が事前にロードされます。このメソッドは、アプリ起動時の SDK 初期化中に呼び出すことができます。
   * このメソッドは、名前解決結果をキャッシュに事前に保存して、後続のドメイン名の名前解決のレイテンシーを削減します。
   *
   * @param domains 事前にロードするドメイン名。
   */
   public void preLoadDomains(final String[] domains)

    /**
     * 指定されたレコードタイプ (IPv4 または IPv6) のドメイン名の名前解決を事前にロードします。
     * このメソッドは、アプリ起動時の SDK 初期化中に呼び出すことができます。このメソッドは、名前解決結果をキャッシュに事前に保存して、後の名前解決のレイテンシーを削減します。
     *
     * @param qType 事前にロードするレコードタイプ (IPv4 や IPv6 など)。
     * @param domains 事前にロードするドメイン名。
     */
    public void preLoadDomains(String qType, final String[] domains)
   /**
   * 自動検出されたネットワーク環境 (IPv4 のみ、IPv6 のみ、またはデュアルスタック) に基づいてドメイン名の名前解決データを取得します。
   * キャッシュに期限切れでない名前解決結果が存在する場合、キャッシュからの結果が返されます。
   * キャッシュが空またはキャッシュされた結果が期限切れの場合、同期ネットワークリクエストがサーバーに送信され、再帰的な名前解決結果が取得されます。その後、結果が返され、キャッシュに保存されます。
   *
   * @param host 解決したいドメイン名。
   * @return 現在のネットワーク環境に基づいた最適な IP アドレス配列。
   */
    public String[] getIpsByHost(String host)

/**
    * ホスト名に対応する IPv4 レコードの配列を取得します。
    * キャッシュに期限切れでない名前解決結果が存在する場合、キャッシュからの結果が返されます。
    * キャッシュが空またはキャッシュされた結果が期限切れの場合、同期ネットワークリクエストがサーバーに送信され、再帰的な名前解決結果が取得されます。その後、結果が返され、キャッシュに保存されます。
    *
    * @param hostName ホスト名 (例:www.example.com)。
    * @return ホスト名に対応する IPv4 アドレスの配列。
    */
  public  String[] getIPsV4ByHost(String hostName) 

   /**
    * ホスト名に対応する IPv6 レコードの配列を取得します。
    * @param hostName ホスト名 (例:www.example.com)。
    * @return ホスト名に対応する IPv6 アドレスの配列。
    */
  public String[] getIPsV6ByHost(String hostName) 

  

  /**
   * 自動検出されたネットワーク環境 (IPv4 のみ、IPv6 のみ、またはデュアルスタック) に基づいて、解決されたドメイン名の IP アドレス配列をキャッシュから取得します。
   * キャッシュが空の場合、このメソッドは null を返し、非同期クエリを開始します。クエリ結果はその後キャッシュに保存されます。
   * キャッシュに名前解決結果が存在し、期限切れの結果を返すことを許可している場合、期限切れの IP アドレスが返され、キャッシュは非同期で更新されます。
   * 期限切れの結果を返すことを許可せず、キャッシュされた結果が期限切れの場合、このメソッドは null を返し、その後非同期でキャッシュを更新します。
   *
   * @param host クエリするホスト (例:www.example.com)。
   * @param isAllowExp 期限切れのドメインの名前解決データを返すかどうかを指定します。
   * @return 解決されたホストのキャッシュされた IP アドレス配列。
   */
   public String[] getIpsByHostFromCache(String host, boolean isAllowExp)
   
    /**
     * 解決されたドメイン名の IPv4 レコードタイプの IP アドレス配列をキャッシュから取得します。
     * キャッシュが空の場合、このメソッドは null を返し、非同期クエリを開始します。クエリ結果はその後キャッシュに保存されます。
     * キャッシュに名前解決結果が存在し、期限切れの結果を返すことを許可している場合、期限切れの IP アドレスが返され、キャッシュは非同期で更新されます。
     * 期限切れの結果を返すことを許可せず、キャッシュされた結果が期限切れの場合、このメソッドは null を返し、その後非同期でキャッシュを更新します。
     *
     * @param host クエリするホスト (例:www.example.com)。
     * @param isAllowExp 期限切れのドメインの名前解決データを返すかどうかを指定します。
     * @return ホストが解決された後のキャッシュからの IPv4 レコードタイプの IP アドレス配列。
     */
    public String[] getIpv4ByHostFromCache(String host , boolean isAllowExp)

    /**
     * 解決されたドメイン名の IPv6 レコードタイプの IP アドレス配列をキャッシュから取得します。
     * キャッシュが空の場合、このメソッドは null を返し、非同期クエリを開始します。クエリ結果はその後キャッシュに保存されます。
     * キャッシュに名前解決結果が存在し、期限切れの結果を返すことを許可している場合、期限切れの IP アドレスが返され、キャッシュは非同期で更新されます。
     * 期限切れの結果を返すことを許可せず、キャッシュされた結果が期限切れの場合、このメソッドは null を返し、その後非同期でキャッシュを更新します。
     *
     * @param host クエリするホスト (例:www.example.com)。
     * @param isAllowExp 期限切れのドメインの名前解決データを返すかどうかを指定します。
     * @return ホストが解決された後のキャッシュからの IPv6 レコードタイプの IP アドレス配列。
     */
    public String[] getIpv6ByHostFromCache(String host , boolean isAllowExp)

  /**
  * URL に対応する IPv4 レコードの DomainInfo オブジェクトの配列を取得します。
  * キャッシュに期限切れでない名前解決結果が存在する場合、キャッシュからの結果が返されます。
  * キャッシュが空またはキャッシュされた結果が期限切れの場合、同期ネットワークリクエストがサーバーに送信され、再帰的な名前解決結果が取得されます。その後、結果が返され、キャッシュに保存されます。
  *
  * @param url URL (例:http://www.example.com)。
  * @return URL に対応する IPv4 タイプの DomainInfo オブジェクトの配列。
  */
  public DomainInfo[] getIPsV4DInfoByUrl(String url) 

  注意:DomainInfo オブジェクトの URL は、ホストが自動的に IP アドレスに置き換えられた URL です。URL 内のホストを手動で置き換える必要はありません。

  /**
   * URL に対応する IPv6 レコードの DomainInfo オブジェクトの配列を取得します。
   * キャッシュに期限切れでない名前解決結果が存在する場合、キャッシュからの結果が返されます。
   * キャッシュが空またはキャッシュされた結果が期限切れの場合、同期ネットワークリクエストがサーバーに送信され、再帰的な名前解決結果が取得されます。その後、結果が返され、キャッシュに保存されます。
   * 
   * @param url URL (例:http://m.example.com)。
   * @return URL に対応する IPv6 タイプの DomainInfo オブジェクトの配列。
   */
   public DomainInfo[] getIPsV6DInfoByUrl(String url) 

  /**
    * 特定の URL に対応する IPv4 レコードの DomainInfo オブジェクトを取得します。
    * キャッシュに期限切れでない名前解決結果が存在する場合、キャッシュからの結果が返されます。
    * キャッシュが空またはキャッシュされた結果が期限切れの場合、同期ネットワークリクエストがサーバーに送信され、再帰的な名前解決結果が取得されます。その後、結果が返され、キャッシュに保存されます。
    *
    * @param url URL (例:http://m.example.com)。
    * @return URL に対応する IPv4 タイプの DomainInfo オブジェクトのコレクションからランダムな DomainInfo オブジェクト。
    */
    public DomainInfo getIPV4DInfoByUrl(String url) 


  /**
    * 特定の URL に対応する IPv6 レコードの DomainInfo オブジェクトを取得します。
    * キャッシュに期限切れでない名前解決結果が存在する場合、キャッシュからの結果が返されます。
    * キャッシュが空またはキャッシュされた結果が期限切れの場合、同期ネットワークリクエストがサーバーに送信され、再帰的な名前解決結果が取得されます。その後、結果が返され、キャッシュに保存されます。
    *
    * @param url URL (例:http://www.example.com)。
    * @return URL に対応する IPv6 タイプの DomainInfo オブジェクトのコレクションからランダムな DomainInfo オブジェクト。
    */
   public DomainInfo getIPV6DInfoByUrl(String url) 

   注意:返される DomainInfo オブジェクトは、次のプロパティをカプセル化しています。

  /**
   * アクセスドメインの自動増分 ID。
    */
    public String id = null;

   /**
    * 直接使用できる URL。URL 内のホストは IP アドレスに置き換えられます。
    */
     public String url = null;

    /**
    * HTTP ヘッダーに設定される宛先サービスの名前。
    */
    public String host = "";

   /**
    * 返されるコンテンツ本文。
    */
   public String data = null;

   /**
    * リクエストが開始された時刻。
    */
   public String startTime = null;

   /**
    * リクエストが終了した時刻。リクエストがタイムアウトした場合、この値は null です。
    */
   public String stopTime = null; 

   /**
   * サーバーから返されたステータスコード (例:200、404、500)。
   */
   public String code = null;

  /**
    * ホスト名に対応する IPv4 レコードを取得します。
    * キャッシュに期限切れでない名前解決結果が存在する場合、キャッシュからの結果が返されます。
     * キャッシュが空またはキャッシュされた結果が期限切れの場合、同期ネットワークリクエストがサーバーに送信され、再帰的な名前解決結果が取得されます。その後、結果が返され、キャッシュに保存されます。
  
    * @param hostName ホスト名 (例:www.example.com)。
    * @return ホスト名に対応する IPv4 アドレスのセットからランダムな IPv4 アドレス。IP 速度測定が有効な場合、最適な IPv4 アドレスが返されます。
    */
  public String getIPV4ByHost(String hostName) 

   /**
    * ホスト名に対応する IPv6 レコードを取得します。
    * キャッシュに期限切れでない名前解決結果が存在する場合、キャッシュからの結果が返されます。
    * キャッシュが空またはキャッシュされた結果が期限切れの場合、同期ネットワークリクエストがサーバーに送信され、再帰的な名前解決結果が取得されます。その後、結果が返され、キャッシュに保存されます。
  
    * @param hostName ホスト名 (例:www.example.com)。
    * @return ホスト名に対応する IPv6 アドレスのセットからランダムな IPv6 アドレス。IP 速度測定が有効な場合、最適な IPv6 アドレスが返されます。
    */
   public String getIPV6ByHost(String hostName) 
      

    /**
     * 成功した HTTPDNS リクエストと失敗した HTTPDNS リクエストの統計を取得します。
     *
     * @return すべてのドメイン名の名前解決統計の JSON 配列文字列。
     */
    public String getRequestReportInfo()
    
     /**
     * キャッシュのキープアライブ用のドメイン名を設定します。設定されたドメイン名の名前解決は、TTL の 75% が経過すると自動的に開始されます。これにより、設定されたドメイン名の名前解決リクエストが常にキャッシュにヒットし、SDK の名前解決効率が向上します。
     * この機能には過剰な数のドメイン名を設定しないことを推奨します。現在の制限は 10 ドメイン名です。この機能は、事前解決機能とは独立して設定されます。
     *
     * @param persistentCacheDomains
     */
    public synchronized static void setKeepAliveDomains(String[] persistentCacheDomains) {
    
     /**
     * 指定されたドメイン名のキャッシュをクリアします。hostname が null の場合、すべてのドメイン名のキャッシュがクリアされます。
     *
     * @param domains キャッシュをクリアしたいドメイン名の配列。
     */
    public void clearHostCache(String[] domains){

API の例

URL:渡されるアクセスアドレス (例:http://www.example.com)。

 String hostname = "www.taobao.com";
 String url = "http://www.taobao.com";

1. 現在のネットワーク環境に最適な IP データを取得

String[] ip = DNSResolver.getInstance().getIpsByHost(hostname); // 現在のネットワークに最適なドメイン解決 IP を取得します。

2. 現在のネットワーク環境に基づいてドメイン解決を事前ロード

DNSResolver.getInstance().preLoadDomains(domains); // 事前解決用のドメイン名を設定します。プレースホルダードメインを HTTPDNS で解決したいドメインに置き換えてください。

3. 現在のネットワーク環境に基づいてキャッシュからドメイン解決データを読み取り

String[] ip = DNSResolver.getInstance().getIpsByHostFromCache(hostname,true); // 現在のネットワーク環境のキャッシュからドメイン解決データを取得します。

4. IPv4 アドレスを取得

String IPV4 = DNSResolver.getInstance().getIPV4ByHost(hostname); // 解決された IPv4 アドレスを取得します。

5. IPv6 アドレスを取得

String IPV6 =  DNSResolver.getInstance().getIPV6ByHost(hostname); // 解決された IPv6 アドレスを取得します。

6. キャッシュから解決済みの IPv4 アドレスを取得

String[] IPV4 =  DNSResolver.getInstance().getIpv4ByHostFromCache(hostname , true); // キャッシュから解決済みの IPv4 アドレスを取得します。

7. キャッシュから解決済みの IPv6 アドレスを取得

String[] IPV6 =  DNSResolver.getInstance().getIpv6ByHostFromCache(hostname , true); // キャッシュから解決済みの IPv6 アドレスを取得します。

8. URL に対応する DomainInfo オブジェクトを取得

DomainInfo dinfo = DNSResolver.getInstance().getIPV4DInfoByUrl(url); // 置き換えられた URL を取得します。

9. キャッシュから指定されたドメインの解決結果をクリア

DNSResolver.getInstance().clearHostCache(hostName); // 指定されたドメインのキャッシュをクリアします。hostName が null に設定されている場合、すべてのドメインのキャッシュがクリアされます。

10. 成功した HTTPDNS リクエストと失敗した HTTPDNS リクエストの統計を取得

String reportInfo = DNSResolver.getInstance().getRequestReportInfo(); // 成功したリクエストと失敗したリクエストの統計を取得します。

次の表は、ドメイン解決統計の JSON 文字列配列のフィールドについて説明しています。

 [
      {
         "avgRtt":"1",                         // 平均ドメイン解決時間 (ミリ秒単位)。
         "degradeLocalDnsCount": 0,            // ローカル DNS へのフォールバック数。                       
         "domainName":"www.example.com",       // 解決されたドメイン名。
         "hitDnsCacheCount": 1,                // キャッシュヒット数。
         "httpabnormalCount": 0,               // 失敗した再帰リクエスト数。
         "isp": "China Mobile",                // ISP 名。
         "localDnsResolveErrCount": 0,         // ローカル DNS 解決失敗数。
         "maxRtt": 8.0,                        // 最大ドメイン解決時間 (ミリ秒単位)。          
         "nonetworkCount": 0,                  // ネットワークが利用できない回数。
         "permissionErrCount": 0,              // ユーザー認証失敗数。
         "queryType": 1,                       // IP タイプ。1 は IPv4、28 は IPv6 を示します。
         "recursiveReqCount": 1,               // 再帰クエリ数。
         "reqParameterErrCount": 0,            // リクエストパラメーター形式エラー数。
         "reqPathErrCount": 0,                 // URL エラー数。
         "reqServerErrCount": 0,               // DNS サーバー側エラー数。
         "reqTimeoutCount": 0,                 // DNS サービスタイムアウトエラー数。
         "resolveSuccessCount": 1,             // 解決成功数。
         "timeoutCount": 0,                    // ネットワークタイムアウトエラー数。
         "utfNetWorkErroNum": 0                // データ報告タイムアウトエラー数。
      }
         ......
 ]
重要

モバイル解決 HTTPDNS ドメイン解決リクエストの統計は、ネットワーク環境、ドメイン名、リクエストタイプごとに集計されます。

public class MainActivity extends AppCompatActivity {
   private Button button;
   private TextView tvInfo;
   private TextView tvResult;
   private String hostUrl = "http://www.taobao.com"; // 解決したい hostUrl に置き換えてください。
   private String hostName = "www.taobao.com"; // 解決したい hostName に置き換えてください。
   private static final String TAG = "PDnsDemo";
   private static ExecutorService pool = Executors.newSingleThreadExecutor();
   private static final String PDNS_RESULT = "pdns_result";
   private static final int SHOW_CONSOLE_TEXT = 10000;
   private Handler mHandler;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.demo_activity_main);
       init();
       initHandler();
   }
 private void init() {
       tvInfo = findViewById(R.id.tv_respons_info);
       tvResult = findViewById(R.id.tv_respons);
       button = findViewById(R.id.btn_onclik);
       button.setOnClickListener(new View.OnClickListener() {
           public void onClick(View view) {
               new Thread(new Runnable() {
                      @Override
                      public void  run() {
                      // HTTPDNS SDK の getIPV4ByHost メソッドを呼び出して、ターゲットドメイン名の解決済み IP アドレスを取得します。
                      String ip = DNSResolver.getInstance().getIPV4ByHost(hostName);
                      if(ip != null){
                         tvInfo.setText("ドメインの解決済み IP は: "+ ip);
                      }
                      // HTTPDNS SDK の getIPV4DInfoByUrl メソッドを呼び出して、解決済みの DomainInfo オブジェクトから URL を取得します。
                      // この URL のホストは IP アドレスに置き換えられています。
                      DomainInfo dinfo = DNSResolver.getInstance().getIPV4DInfoByUrl(hostUrl);
                      if (dinfo != null) {
                           showResponse(dinfo);
                      }
                   }
               }).start();
           }
       });
   }
   private void initHandler() {
       mHandler = new Handler() {
           @Override
           public void handleMessage(Message msg) {
               switch (msg.what)  {
                   case SHOW_CONSOLE_TEXT:
                       tvResult.setText(msg.getData().getString(PDNS_RESULT) + "\n");
                       break;
               }
           }
       };
   }
   private void showResponse(final DomainInfo dinfo) {
                // ネットワークリクエストを送信します。
               String requestUrl = dinfo.url;
               HttpURLConnection conn = null;
               try {
                   URL url = new URL(requestUrl);
                   conn = (HttpURLConnection) url.openConnection();
                   // IP アドレスを使用してアクセスする場合、HTTP リクエストヘッダーの Host フィールドを元のドメイン名に設定する必要があります。
                   conn.setRequestProperty("Host", url.getHost()); // HTTP リクエストヘッダーの Host フィールドを設定します。
                   DataInputStream dis = new DataInputStream(conn.getInputStream());
                   int len;
                   byte[] buff = new byte[4096];
                   StringBuilder response = new StringBuilder();
                   while ((len = dis.read(buff)) != -1) {
                       response.append(new String(buff, 0, len));
                   }
                   Log.d(TAG, "Response: " + response.toString());
                   dis.close();
                   sendMessage(response.toString());
               } catch (IOException e) {
                   e.printStackTrace();
               }finally {
                   if (conn != null) {
                       conn.disconnect();
                   }
               }
           }
   private void sendMessage(String message) {
       if (mHandler != null) {
               Message msg = mHandler.obtainMessage();
               Bundle bundle = new Bundle();
               bundle.putString(PDNS_RESULT, message);
               msg.setData(bundle);
               msg.what = SHOW_CONSOLE_TEXT;
               mHandler.sendMessage(msg);
       }
   }
}

public class DnsCacheApplication extends Application {
    
    private String accountId = "ご利用のアカウント ID"; // コンソールから取得したアカウント ID を設定します。
    private String accessKeyId = "ご利用の AccessKey ID"; // コンソールから取得した AccessKey ID を設定します。
    private String accessKeySecret = "ご利用の AccessKey Secret"; // コンソールから取得した AccessKey Secret を設定します。

    @Override
    public void onCreate() {
       super.onCreate();
       // SDK アクセスのためにアカウント ID、AccessKey ID、AccessKey Secret を設定します。
       DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret); 
       // キャッシュのキープアライブ用のドメイン名を設定します。設定されたドメイン名の名前解決は、TTL の 75% が経過すると自動的に開始され、ドメイン名の名前解決リクエストが常にキャッシュにヒットするようにします。
       DNSResolver.setKeepAliveDomains(new String[]{"your-domain-1","your-domain-2",...}); 
       // 指定されたドメインを IPv4 アドレスに事前ロードします。プレースホルダードメインを解決したいドメインに置き換えてください。
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{"your-domain-to-preload-1","your-domain-to-preload-2",...}); 
    }
}

ベストプラクティス

事前解決と期限切れ応答のキャッシュを組み合わせて、最適なパフォーマンスを実現します。

事前解決は起動時に結果をキャッシュします。期限切れの応答を許可すると、TTL の有効期限が切れた後でもキャッシュされた IP がすぐに返され、ほぼゼロのレイテンシーでの名前解決が実現します。

事前ロードされたドメインは、後続のリクエストでローカルキャッシュにヒットし、ネットワークのラウンドトリップを排除します。

1. 事前解決

アプリケーション起動時にキャッシュを有効にし、主要なドメインを事前解決します。

ApplicationonCreate() メソッドで、ドメインを事前解決し、結果をローカルにキャッシュします。

1. IPv4 のみのシナリオ

//********IPv4 のみのシナリオの場合*******
public class DnsCacheApplication extends Application{
    private String accountId = "ご利用のアカウント ID"; // コンソールから取得したアカウント ID を設定します。
    private String accessKeyId = "ご利用の AccessKey ID"; // コンソールから取得した AccessKey ID を設定します。
    private String accessKeySecret = "ご利用の AccessKey Secret"; // コンソールから取得した AccessKey Secret を設定します。

    @Override
    public void onCreate() {
       super.onCreate();
       // SDK アクセスのためにアカウント ID、AccessKey ID、AccessKey Secret を設定します。
       DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret); 
       DNSResolver.setEnableCache(true); // キャッシュを有効にします。デフォルト値:true。
       // 事前解決用の IPv4 レコードタイプ。    
       // 指定されたドメインを IPv4 アドレスに事前ロードします。プレースホルダードメインを HTTPDNS で解決したいドメインに置き換えてください。
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{"your-domain-to-preload-1","your-domain-to-preload-2",...}); 
    }
}

2. IPv6 サポート

//********IPv6 サポートが必要なシナリオの場合*******
public class DnsCacheApplication extends Application{
    private String accountId = "ご利用のアカウント ID"; // コンソールから取得したアカウント ID を設定します。
    private String accessKeyId = "ご利用の AccessKey ID"; // コンソールから取得した AccessKey ID を設定します。
    private String accessKeySecret = "ご利用の AccessKey Secret"; // コンソールから取得した AccessKey Secret を設定します。

    @Override
    public void onCreate() {
       super.onCreate();
       // SDK アクセスのためにアカウント ID、AccessKey ID、AccessKey Secret を設定します。
       DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret); 
       DNSResolver.setEnableCache(true); // キャッシュを有効にします。デフォルト値:true。
       DNSResolver.setEnableIPv6(true); // IPv6 ネットワーク経由でドメイン名を解決するかどうかを指定します。デフォルト値:false。  
       DNSResolver.setEnableSpeedTest(true); // IP 速度測定を有効にするかどうかを指定します。デフォルト値:false。
       // 事前解決用の IPv4 および IPv6 レコードタイプ。  
       // 指定されたドメインを IPv4 および IPv6 アドレスに事前ロードします。プレースホルダードメインを HTTPDNS で解決したいドメインに置き換えてください。
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4_IPV6,new String[]{"your-domain-to-preload-1","your-domain-to-preload-2",...}); 
    }
}

2. 期限切れの応答を許可

ネットワークリクエストの前にキャッシュから IP を読み取り、期限切れのエントリがすぐに返されるようにします。キャッシュはバックグラウンドで非同期に更新されます。

1. IPv4 のみのシナリオ

    //********IPv4 のみのシナリオの場合*******
    @Override
    public List<InetAddress> lookup(@NonNull String hostname) throws UnknownHostException {
        // キャッシュから IP アドレスを取得することを優先します。2 番目のパラメーターが true の場合、期限切れでも使用可能なレコードを返すことができます。
        String[] IPArray = mDNSResolver.getIpv4ByHostFromCache(hostname,true);
        if (IPArray == null || IPArray.length == 0){
            // キャッシュにヒットしない場合、非同期解決を開始します。
            IPArray = mDNSResolver.getIPsV4ByHost(hostname);
        }
        if (IPArray != null && IPArray.length > 0) {
            List<InetAddress> inetAddresses = new ArrayList<>();
            InetAddress address;
            for (String ip : IPArray) {
                address = InetAddress.getByName(ip);
                inetAddresses.add(address);
            }
            if (!inetAddresses.isEmpty()) {
                return inetAddresses;
            }
        }
        return okhttp3.Dns.SYSTEM.lookup(hostname);
    }

2. IPv6 サポート

    //********IPv6 サポートが必要なシナリオの場合*******
    @Override
    public List<InetAddress> lookup(@NonNull String hostname) throws UnknownHostException {
        // キャッシュから IP アドレスを取得することを優先します。2 番目のパラメーターが true の場合、期限切れでも使用可能なレコードを返すことができます。
        String[] IPArray = mDNSResolver.getIpsByHostFromCache(hostname,true);
        if (IPArray == null || IPArray.length == 0){
            // キャッシュにヒットしない場合、非同期解決を開始します。
            IPArray = mDNSResolver.getIpsByHost(hostname);
        }
        if (IPArray != null && IPArray.length > 0) {
            List<InetAddress> inetAddresses = new ArrayList<>();
            InetAddress address;
            for (String ip : IPArray) {
                address = InetAddress.getByName(ip);
                inetAddresses.add(address);
            }
            if (!inetAddresses.isEmpty()) {
                return inetAddresses;
            }
        }
        return okhttp3.Dns.SYSTEM.lookup(hostname);
    }

使用上の注意

  1. モバイル解決 HTTPDNS から取得した IP アドレスを使用してリクエストを送信する場合、HTTP の Host ヘッダーを元のドメイン名に設定します。

  2. モバイル解決 HTTPDNS SDK が空の IP を返した場合、元のドメイン名 URL にフォールバックします。

    String ip = DNSResolver.getInstance().getIPV4ByHost("your-domain");
    if (ip != null) {
    	// URL のホストを IP アドレスに置き換えて API リクエストを行います。
    }else {
    	// 元のドメイン名のリクエスト URL を使用してフォールバックリクエストを行います。
        // この場合、ドメイン名を含む元の URL を使用してネットワークリクエストを行います。
    }
  3. モバイル解決 HTTPDNS SDK の統合リファレンスとして、デモプログラムをダウンロードしてください。

  4. 統合後、コンソールのトラフィック分析ページで成功を確認します。トラフィックが表示されない場合は、アカウント IDAccessKey IDAccessKey Secret が正しく設定されていることを確認してください。

オンプレミス DNS

v2.3.0 以降、HTTPDNS Android SDK はオンプレミス DNS デプロイメントのサポートを追加します。

オンプレミス DNS は、データコンプライアンスとカスタム解決ポリシー (金融、政府、大企業) を必要とするシナリオに適しています。SDK は、パブリッククラウドのみ、オンプレミスのみ、および 2 つのプライマリ/スタンバイハイブリッドの 4 つのデプロイモードをサポートします。

コア機能

  • オンプレミスデプロイメントのサポート:IPv4/IPv6 アドレスまたはホストドメイン名を使用してオンプレミス DNS サービスエンドポイントを設定することをサポートします。

  • 双方向認証:このメカニズムは、顧客固有の accessKeyIdaccessKeySecret でリクエストに署名し、安全な通信を保証します。

  • サーキットブレーカーとヘルスチェック:オンプレミス DNS ノードが 3 回以上連続して失敗した場合、サーキットブレーカーが自動的にトリガーされます。その後、指定された healthCheckDomain を使用して 1 分ごとに可用性がチェックされます。ノードは回復後に自動的に再有効化されます。

  • 証明書検証の制御:バージョン 2.3.1.beta 以降、オンプレミス DNS のテスト用に TLS 証明書検証を無効にできます。ベータ版はテスト専用であり、本番環境では使用しないでください。Android SDK リリースノート

  • スマートフォールバック:プライマリ DNS (パブリッククラウド DNS またはオンプレミス DNS) がドメイン名の解決に失敗し、失敗回数が指定されたしきい値に達した場合、システムは自動的にスタンバイ DNS に切り替わり、解決の高可用性を確保します。

  • シームレスな API 互換性:パブリッククラウド DNS またはオンプレミス DNS のどちらを使用する場合でも、解決 API の呼び出し方法は同じです。ビジネスロジックを変更する必要はありません。

構成

1. パブリッククラウド DNS のみ

このモードは、オンプレミス DNS をデプロイしていない標準的な SaaS ユーザー向けです。

DNSResolver.Init(this, accountID, accessKeyId, accessKeySecret);

2. オンプレミス DNS のみ

このモードは、オンプレミス DNS に完全に依存しているお客様向けです。

DNSResolver.InitFusionDNS(this,new String[]{"1.1.X.X","2.2.X.X"},null,null,"443", "check.example.com", "your_fusion_ak", "your_fusion_sk");
// オプション: 証明書検証を無効にします (テスト環境のみ。2.3.1.beta などのベータ版 SDK が必要です)。
// DNSResolver.setEnableCertificateValidation(false);

3. プライマリ:パブリッククラウド、スタンバイ:オンプレミス

プライマリの Alibaba Cloud パブリック HTTPDNS がドメイン名の解決に失敗した場合、システムは自動的にオンプレミス DNS にフォールバックします。

// プライマリ:パブリッククラウド DNS
DNSResolver.Init(this, accountID, accessKeyId, accessKeySecret);
    
// スタンバイ:オンプレミス DNS
DNSResolver.InitFusionDNS(this,new String[]{"1.1.X.X","2.2.X.X"},null,null,"443", "check.example.com", "your_fusion_ak", "your_fusion_sk");
// オプション:証明書検証を無効にする (テスト環境のみ、ベータ版 SDK バージョン (例:2.3.1.beta) が必要)。
// DNSResolver.setEnableCertificateValidation(false);

4. プライマリ:オンプレミス、スタンバイ:パブリッククラウド

オンプレミス DNS をプライマリ DNS として使用します。オンプレミス DNS がドメイン名の解決に失敗した場合、システムは自動的に Alibaba Cloud パブリッククラウド DNS にフォールバックします。

// プライマリ:オンプレミス DNS
DNSResolver.InitFusionDNS(this,new String[]{"1.1.X.X","2.2.X.X"},null,null,"443", "check.example.com", "your_fusion_ak", "your_fusion_sk");
// オプション:証明書検証を無効にする (テスト環境のみ、ベータ版 SDK バージョン (例:2.3.1.beta) が必要)。
// DNSResolver.setEnableCertificateValidation(false);

// スタンバイ:パブリッククラウド DNS
DNSResolver.Init(this, accountID, accessKeyId, accessKeySecret);

新しい API

SDK は、オンプレミスデプロイメントと高可用性ディザスタリカバリのために 3 つのコア API を追加します。

1. エンドポイントと認証の設定

    /** オンプレミスデプロイメントで使用されるオンプレミス DNS 用。パブリック DNS のみを使用する場合は、このメソッドを呼び出す必要はありません。
     *
     * オンプレミス DNS サーバーのアドレスと認証情報を設定します。
     * 顧客はこのインターフェイスを使用して、プライベート DNS サーバーのアドレスと認証情報を渡します。
     * SDK はこの情報を使用してリクエストを開始します。
     * @param ctx コンテキスト。
     * @param serverIpv4Arr IPv4 アドレスの配列 (nil の場合あり)。
     * @param serverIpv6Arr IPv6 アドレスの配列 (nil の場合あり)。
     * @param serverHostArr ホストドメイン名の配列 (nil の場合あり)。
     * @param port サービスポート (例:"443")。nil の場合、デフォルトポート "443" が使用されます。
     * @param healthCheckDomain サーキットブレーカーがトリガーされた後のヘルスチェックに使用されるドメイン名。解決サービスが 3 回以上連続して失敗すると、サーキットブレーカーがトリガーされ、そのサービスの IP アドレスは healthCheck 状態になります。後続のリクエストはこのサービスに送信されません。
     *                          タイマーが 1 分ごとに実行され、この healthCheckDomain を使用して解決 API を呼び出し、解決サービスが利用可能かどうかをプローブします。プローブが成功すると、サービスは alive 状態に戻り、後続のリクエストはこのサービスに送信できます。
     * @param accessKeyId 顧客のプライベート accessKeyId。認証に使用されます。
     * @param accessKeySecret 顧客のプライベート accessKeySecret。認証に使用されます。
     */
    public static void InitFusionDNS(Context ctx,String[] serverIpv4Arr, String[] serverIpv6Arr, String[] serverHostArr, String port, String healthCheckDomain, String accessKeyId, String accessKeySecret)

2. TLS 証明書検証の制御

オンプレミス DNS の TLS 証明書検証を制御します。Android SDK のベータビルドはバージョン 2.3.1 から公開されており、2.3.1 に一致するベータビルドは 2.3.1.beta という名前です。ベータビルドを使用すると、テストを実行できるようにオンプレミス DNS の TLS 証明書検証を無効にできます。ベータビルドはテストの便宜のためにのみ存在します。本番環境でベータビルドを使用しないでください。

    /** オンプレミスデプロイメントで使用されるオンプレミス DNS 用。パブリック DNS のみを使用する場合は、このメソッドを呼び出す必要はありません。
     *
     * オンプレミス DNS の証明書検証を有効にするかどうかを指定します。デフォルト値:true。サーバーにドメイン証明書または IP 証明書が設定されていない場合、テスト用にこのパラメーターを false に設定できます。本番環境では、セキュリティリスクが発生する可能性があるため、このパラメーターを true に設定することを強く推奨します。
     * @param enable このパラメーターを true に設定して証明書検証を有効にする (デフォルト)、または false に設定して無効にします。
     */
    public static void setEnableCertificateValidation(boolean enable)

3. フォールバックしきい値の設定

    /** パブリッククラウド DNS とオンプレミス DNS の両方を設定する場合、プライマリ DNS での DNS 解決が何回失敗したらシステムが自動的にスタンバイ DNS にフォールバックするかを指定できます。1 種類の DNS のみを設定する場合は、このメソッドを呼び出す必要はありません。
     *
     * プライマリ DNS での DNS 解決が何回失敗したらシステムが自動的にスタンバイ DNS にフォールバックするかを指定します。1 種類の DNS のみを設定する場合は、このメソッドを呼び出す必要はありません。
     * @param fallbackThreshold 失敗しきい値。デフォルト:プライマリ DNS がパブリッククラウド DNS の場合は 4、プライマリ DNS がオンプレミス DNS の場合は 2。
     * 有効範囲:[0, 4]。値 0 は即時フォールバックを示します。
     */
     public static void setFallbackThreshold(int fallbackThreshold)