全部产品
Search
文档中心

Alibaba Cloud DNS:Panduan pengembangan SDK Android

更新时间:Dec 13, 2025

Dokumen ini menjelaskan cara mengintegrasikan HTTPDNS Android Software Development Kit (SDK).

Ikhtisar

SDK Android ini mengenkapsulasi DNS over HTTPS (DoH) JSON API dari HTTPDNS. SDK ini menyediakan antarmuka fungsi Java bagi aplikasi Android untuk melakukan resolusi nama domain, serta menawarkan cache nama domain yang efisien berdasarkan kebijakan time-to-live (TTL) dan Least Recently Used (LRU). Anda dapat dengan mudah mengintegrasikan HTTPDNS ke dalam aplikasi Android guna memperbaiki error resolusi nama domain dan mencapai penjadwalan traffic yang akurat dengan biaya rendah.

SDK ini memberikan manfaat berikut:

  • Mudah digunakan

    Anda dapat mengintegrasikan SDK untuk mengakses layanan HTTPDNS. Metode integrasinya sederhana dan menyediakan layanan resolusi yang nyaman.

  • Latensi nol

    SDK memiliki mekanisme caching LRU bawaan yang menyimpan cache alamat IP dari setiap resolusi nama domain secara lokal. SDK juga secara aktif memperbarui cache yang telah kedaluwarsa berdasarkan TTL untuk memastikan validitasnya, sehingga membantu Anda mencapai resolusi nama domain tanpa latensi.

Untuk informasi lebih lanjut, lihat kode sumber proyek contoh alidns_android_demo.

Integrasi SDK

Impor SDK

Integrasikan SDK menggunakan Gradle dengan Maven

Tambahkan kode berikut ke file build.gradle:

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

Tambahkan informasi untuk file referensi:

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

Integrasikan SDK menggunakan file AAR

Unduh file alidns_android_sdk.aar. Untuk informasi selengkapnya, lihat Unduh SDK. Kemudian, tambahkan paket AAR tersebut ke direktori libs proyek Anda.

Catatan

Anda dapat menggunakan salah satu metode di atas untuk mengintegrasikan SDK ke dalam proyek Anda.

Inisialisasi SDK

Penting

Untuk memastikan SDK berfungsi sebagaimana mestinya dan mencegah kegagalan resolusi alamat IP, Anda harus menginisialisasi SDK sedini mungkin.

Dapatkan Account ID unik Anda dari konsol, lalu buat kunci untuk mendapatkan AccessKey ID dan AccessKey Secret. Setelah mengintegrasikan SDK, Anda harus menginisialisasinya. Contoh inisialisasi SDK dapat dilihat pada kode di kelas Application.

public class DnsCacheApplication extends Application{

    private String accountId = "Your Account ID"; // Tetapkan Account ID yang Anda gunakan untuk mengakses SDK di konsol.
    private String accessKeyId = "Your AccessKey ID"; // Tetapkan AccessKey ID yang Anda gunakan untuk mengakses SDK di konsol.
    private String accessKeySecret = "Your AccessKey secret"; // Tetapkan AccessKey secret yang Anda gunakan untuk mengakses SDK di konsol.

    @Override
    public void onCreate() {
       super.onCreate();
       DNSResolver.Init(this,accountId,accessKeyId,accessKeySecret); // Tetapkan Account ID, AccessKey ID, dan AccessKey secret yang Anda gunakan untuk mengakses SDK di konsol.
       // Catatan: Jika Anda mengonfigurasi nama domain untuk disimpan dalam cache, resolusi akan dipicu secara otomatis ketika 75% TTL telah berlalu. Ini memastikan bahwa resolusi nama domain yang dikonfigurasi selalu mengenai cache. Namun, jika Anda menggunakan CDN, nilai TTL mungkin kecil. Hal ini mengakibatkan banyak permintaan resolusi dan meningkatkan biaya. Gunakan metode ini dengan hati-hati.
       DNSResolver.setKeepAliveDomains(new String[]{"Nama domain yang akan disimpan dalam cache 1","Nama domain yang akan disimpan dalam cache 2",...});       
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{"Nama domain yang akan di-resolve awal 1","Nama domain yang akan di-resolve awal 2",...}); // Tetapkan nama domain tipe IPv4 tertentu untuk di-resolve awal. Ganti nama domain yang di-resolve awal dengan nama domain yang ingin Anda resolve menggunakan Alibaba Cloud DNS.
    }
}
Catatan

DNSResolver adalah kelas inti dari SDK HTTPDNS. Kelas ini mengenkapsulasi DoH JSON API yang disediakan oleh HTTPDNS dan meresolusi nama domain target menjadi alamat IP yang sesuai. Untuk menggunakan SDK HTTPDNS, Anda harus mengintegrasikannya ke dalam kelas turunan Application aplikasi Android Anda.

Selain itu, saat menggunakan SDK dalam proyek Android, Anda harus memberikan izin akses berikut:

<!--Izin yang diperlukan-->
   <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"/>

Autentikasi SDK

SDK ini mendukung autentikasi mulai versi 2.0 dan seterusnya. Fitur ini mengamankan identitas pengguna dan mencegah akses tidak sah. Untuk mengaktifkan autentikasi, Anda harus membuat AccessKey ID dan AccessKey Secret. Petunjuknya tersedia di Buat kunci. Jika Anda tidak menyetel parameter autentikasi selama inisialisasi SDK, HTTPDNS akan menolak permintaan resolusi nama domain. Kegagalan ini dapat mengganggu layanan Anda. Oleh karena itu, Anda harus menyetel parameter autentikasi saat menginisialisasi SDK HTTPDNS.

Anda dapat menyetel parameter autentikasi sebagai berikut:

DNSResolver.Init(this,accountId,accessKeyId,accessKeySecret);
Peringatan
  • Untuk mencegah kebocoran parameter seperti Account ID, AccessKey ID, dan AccessKey Secret melalui log atau data yang dihasilkan selama operasi aplikasi, Anda harus menonaktifkan log debugging SDK pada versi produksi.

  • Anda harus menyetel parameter Account ID, AccessKey ID, dan AccessKey Secret dalam kode selama integrasi. Parameter-parameter ini digunakan untuk pengukuran dan penagihan. Untuk mencegah kebocoran informasi akibat dekompilasi jahat, Anda harus mengaktifkan obfuscation dan menerapkan penguatan keamanan pada aplikasi sebelum menerbitkannya.

FAQ integrasi SDK

Terjadi error "cleartext HTTP traffic not permitted" saat mengirim permintaan HTTP pada Android 9.0

Penyebab: Mulai Android 9.0 (API level 28), Android secara default melarang akses jaringan cleartext dan hanya mengizinkan akses ke URL HTTPS.

Solusi:

Tambahkan kode berikut ke elemen <application> dalam file AndroidManifest.xml aplikasi Anda:

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">

Terjadi error "Didn't find class BasicHttpParams" pada Android 9.0

Penyebab: Apache HTTP client sudah tidak didukung lagi.

Google menghapus dukungan untuk Apache HTTP client di Android 6.0. Mulai Android 9.0, org.apache.http.legacy telah dihapus dari bootclasspath.

Perubahan ini tidak memengaruhi sebagian besar aplikasi yang memiliki targetSdkVersion di bawah 9.0. Namun, aplikasi yang memiliki targetSdkVersion 9.0 atau lebih tinggi dan tetap menggunakan antarmuka Apache HTTP atau merujuk ke paket library yang menggunakan antarmuka tersebut akan menerima error yang menunjukkan bahwa antarmuka Apache HTTP tidak ditemukan.

Solusi:

Tambahkan kode berikut ke elemen <application> dalam file AndroidManifest.xml aplikasi Anda:

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

SDK ini memperkenalkan JNI mulai versi 2.1.9. Anda harus mengonfigurasi NDK di lingkungan pengembangan proyek aplikasi Anda.

  • Tambahkan direktori instalasi NDK ke file local.properties di direktori root proyek aplikasi Anda.

ndk.dir=...\\ndk\\21.4.7075529; // ... menunjukkan path lokal tempat developer menginstal NDK.
  • Tambahkan konfigurasi berikut ke file gradle.properties di direktori root proyek aplikasi Anda.

android.useDeprecatedNdk = true;

Jika NDK sudah dikonfigurasi untuk proyek aplikasi Anda, Anda dapat mengabaikan langkah ini. Untuk memastikan SDK berfungsi sebagaimana mestinya, kami merekomendasikan Anda menggunakan JDK 1.8 dan NDK 21.4.7075529 saat mengompilasi aplikasi Anda.

Referensi API

Pengaturan umum

1. Inisialisasi menggunakan metode Init

Anda dapat memanggil metode Init di kelas Application Anda untuk menginisialisasi SDK.

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

2. Tetapkan nama domain untuk di-resolve awal

Saat menginisialisasi aplikasi Anda, kami menyarankan agar Anda mendaftarkan terlebih dahulu nama domain yang mungkin akan digunakan nanti ke SDK HTTPDNS. Hal ini memungkinkan SDK untuk meresolusi nama domain tersebut lebih awal dan mengurangi latensi permintaan resolusi nama domain berikutnya. Anda dapat memanggil metode berikut untuk menetapkan nama domain pre-resolution:

  • Anda dapat menentukan pre-resolution untuk nama domain IPv6 atau IPv4.

// Tetapkan tipe nama domain tertentu untuk pre-resolution. Ganti nama domain pre-resolution dengan nama domain yang ingin Anda resolve menggunakan Alibaba Cloud DNS.
DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{...});

// DNSResolver.QTYPE_IPV4: Tipe catatan IPv4 untuk pre-resolution.
// DNSResolver.QTYPE_IPV6: Tipe catatan IPv6 untuk pre-resolution.
  • Anda dapat secara otomatis memilih pre-resolution untuk nama domain IPv6 atau IPv4 berdasarkan jaringan saat ini. Di lingkungan jaringan dual-stack, SDK akan melakukan pre-resolution untuk nama domain IPv6 dan IPv4.

DNSResolver.getInstance().preLoadDomains(domains);
Penting

Antarmuka pre-resolution memicu permintaan jaringan asinkron secara real-time. Anda harus memastikan bahwa pengaturan inisialisasi yang diperlukan telah dikonfigurasi sebelum memanggil antarmuka ini.

3. Tetapkan nama domain yang akan disimpan dalam cache

SDK mendukung penyimpanan nama domain yang dikonfigurasi dalam cache. Permintaan resolusi akan dipicu secara otomatis ketika 75% TTL telah berlalu. Hal ini memastikan bahwa resolusi nama domain yang dikonfigurasi selalu mengenai cache dan meningkatkan performa resolusi SDK. Kami merekomendasikan agar Anda tidak menetapkan terlalu banyak nama domain untuk fitur ini. Batas saat ini adalah 10 nama domain. Fitur ini dikonfigurasi secara terpisah dari pre-resolve.

DNSResolver.setKeepAliveDomains(new String[]{"Nama domain yang ditentukan pengguna 1", "Nama domain yang ditentukan pengguna 2"});
Catatan

Manfaat

1. Catatan dapat diperbarui tepat waktu sebelum TTL berakhir.

2. Saat digunakan bersama pre-resolve, fitur ini dapat mengurangi latensi resolusi pertama menjadi 0 milidetik.

Kekurangan

1. Permintaan ulang pada 75% TTL menimbulkan biaya tambahan.

4. Tentukan apakah akan menggunakan alamat IPv6 sisi server

Layanan HTTPDNS mendukung akses dari alamat IPv4 maupun IPv6. Anda dapat menggunakan metode DNSResolver.setEnableIPv6(boolean enable) untuk menentukan apakah akan menggunakan alamat IPv6 server-side. Jika Anda menyetel parameter ini ke true, SDK akan menggunakan alamat IPv6 untuk mengakses server. Jika Anda menyetelnya ke false atau tidak menyetelnya, SDK secara default menggunakan alamat IPv4. Jika Anda mengaktifkan akses IPv6 dan layanan HTTPDNS tidak dapat dijangkau, SDK akan secara otomatis beralih ke IPv4 dan mencoba ulang permintaan satu kali.

5. Tetapkan jumlah maksimum entri cache

DNSResolver.getInstance().setMaxCacheSize(CACHE_MAX_NUMBER); // Tetapkan jumlah maksimum entri cache. Nilai default: 100.

Anda dapat menyesuaikan nilai maksimum tersebut.

6. Tetapkan protokol akses server

SDK memungkinkan Anda menyetel protokol untuk permintaan resolusi DNS ke HTTP atau HTTPS. SDK menggunakan dan merekomendasikan protokol HTTPS untuk resolusi karena lebih aman. HTTPDNS penagihan didasarkan pada jumlah permintaan resolusi, dan permintaan HTTPS ditagih lima kali lipat dari permintaan HTTP. Pilih protokol berdasarkan kebutuhan Anda.

DNSResolver.setSchemaType(DNSResolver.HTTPS); // Mode akses default adalah HTTPS.

DNSResolver.HTTP: Mengakses antarmuka sisi server melalui HTTP.

DNSResolver.HTTPS: Mengakses antarmuka sisi server melalui HTTPS.

7. Tetapkan nomor port untuk probing IP berbasis socket

DNSResolver.setSpeedPort(DNSResolver.PORT_80);

Anda dapat menetapkan nomor port untuk probing IP berbasis socket. Port default adalah 80.

Pengaturan lanjutan lainnya

1. Aktifkan atau nonaktifkan log debug SDK

DNSResolver.setEnableLogger(true); // Log debugging SDK dinonaktifkan secara default.

Menentukan apakah akan mengaktifkan log debugging SDK. Setel nilai ke true untuk mengaktifkannya, atau false untuk menonaktifkannya.

2. Tentukan apakah akan mengaktifkan fallback otomatis ke LocalDNS saat resolusi HTTPDNS gagal

DNSResolver.setEnableLocalDns(true); // Secara default, fallback otomatis ke resolusi LocalDNS diaktifkan ketika resolusi HTTPDNS gagal.

3. Aktifkan atau nonaktifkan mode Short

DNS over HTTPS (DoH) JSON API untuk HTTPDNS mengembalikan data dalam format JSON lengkap atau format array alamat IP yang ringkas. Anda dapat memanggil DNSResolver.setEnableShort(boolean enable) untuk mengaktifkan atau menonaktifkan mode Short. Secara default, mode Short dinonaktifkan. Contohnya:

DNSResolver.setEnableShort(true); // Nilai default adalah false. Anda tidak perlu menyetel parameter ini.
Penting

Dalam mode short, pemanggilan SDK ke layanan HTTPDNS mengembalikan array alamat IP yang disederhanakan. Hal ini mengurangi jumlah data respons, sehingga ideal untuk skenario yang sensitif terhadap traffic jaringan.

4. Aktifkan cache non-expiring

DNSResolver.setImmutableCacheEnable(false); // Cache yang tidak kedaluwarsa dinonaktifkan secara default.
Penting

SDK memiliki tiga mekanisme pembaruan cache internal:

  • Cache non-expiring: Saat fitur ini diaktifkan, cache dianggap valid selama seluruh waktu proses aplikasi. Pemeriksaan dan pembaruan kedaluwarsa cache tidak lagi dilakukan. Anda tidak perlu memanggil setKeepAliveDomains untuk memperbarui cache secara aktif. Hal ini meminimalkan jumlah resolusi.

    Metode: DNSResolver.setImmutableCacheEnable(boolean var0)

    Deskripsi parameter: Jika parameter var0 bernilai true, fitur cache yang tidak kedaluwarsa diaktifkan. Jika var0 bernilai false, fitur cache yang tidak kedaluwarsa dinonaktifkan.

  • Pembaruan cache aktif: Mekanisme ini membantu memastikan bahwa permintaan resolusi menggunakan catatan DNS cache terbaru. Saat TTL nama domain tertentu turun menjadi 75% dari nilai aslinya, SDK secara otomatis memicu kueri resolusi baru untuk memperbarui cache. Hal ini mengurangi latensi DNS untuk permintaan berikutnya dan membantu menjaga cache tetap mutakhir, terutama saat zona otoritatif untuk nama domain berubah. Kami menyarankan agar Anda membatasi jumlah nama domain yang dikonfigurasi untuk pembaruan aktif. Maksimal 10 nama domain didukung.

    Metode: DNSResolver.setKeepAliveDomains(String[] var1)

    Deskripsi parameter: var1 adalah array string nama domain yang memerlukan pembaruan aktif.

  • Pembaruan cache pasif:

    Saat Anda memanggil dua metode berikut untuk mengambil hasil resolusi, cache diperbarui secara pasif:

    • getIPsV4ByHost(String hostName) method: Mengambil array catatan IPv4 yang sesuai dengan hostName. Jika cache tidak kosong dan catatan belum kedaluwarsa, hasil cache dikembalikan. Jika tidak, metode ini mengambil hasil resolusi terbaru melalui permintaan jaringan, mengembalikan hasil tersebut, lalu memperbarui cache. Metode ini sering digunakan dalam skenario yang memerlukan akurasi tinggi untuk hasil resolusi.

    • getIpv4ByHostFromCache(String hostName, boolean isAllowExp) method: Mengambil array catatan IPv4 yang sesuai dengan hostName dari cache. Metode ini menentukan apakah akan mengembalikan hasil resolusi kedaluwarsa dari cache berdasarkan nilai parameter isAllowExp. Kami menyarankan agar Anda menggunakan metode ini bersama metode preload saat aplikasi dimulai. Hal ini memastikan bahwa aplikasi menyimpan cache hasil resolusi terbaru saat startup.

      Jika isAllowExp disetel ke true, catatan kedaluwarsa dikembalikan meskipun cache telah kedaluwarsa. Jika cache kosong, null dikembalikan. Jika isAllowExp disetel ke false, null dikembalikan jika cache telah kedaluwarsa atau kosong. Dalam kedua kasus, permintaan asinkron dikirim untuk memperbarui cache.

    Contoh yang direkomendasikan:

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

5. Konfigurasi cache

DNSResolver.setEnableCache(true); // Cache diaktifkan secara default.

Menentukan apakah fitur cache diaktifkan. Setel nilai ke true untuk mengaktifkan cache, atau false untuk menonaktifkannya.

6. Aktifkan pengujian kecepatan IP

DNSResolver.setEnableSpeedTest(false); // Pengujian kecepatan IP dinonaktifkan secara default.

Menentukan apakah akan mengaktifkan fitur pengujian kecepatan IP. Nilai true mengaktifkan fitur ini dan nilai false menonaktifkannya.

7. Konfigurasikan caching berbasis ISP untuk nama domain

DNSResolver.setIspEnable(true);// Menentukan apakah akan mengaktifkan caching nama domain berbasis ISP.

Jika `setIspEnable` disetel ke `true`, setiap lingkungan jaringan (ISP) memiliki cache sendiri untuk hasil resolusi. Jika tidak, semua lingkungan jaringan berbagi satu cache.

8. Tetapkan TTL maksimum untuk cache negatif

DNSResolver.setMaxNegativeCache(MAX_NEGATIVE_CACHE);// Menetapkan TTL maksimum untuk cache negatif. Default adalah 30 detik.

Cache negatif menyimpan respons untuk nama domain yang tidak dapat di-resolve ke alamat IP. Anda dapat menyetel TTL maksimum untuk cache ini sesuai kebutuhan.

9. Tetapkan TTL maksimum untuk cache

DNSResolver.setMaxTtlCache(MAX_TTL_CACHE);// Menetapkan TTL maksimum untuk cache. Default adalah 3600 detik.

Anda dapat menggunakan SDK untuk menyetel TTL maksimum untuk semua entri cache. Default adalah 3600 detik.

10. Konfigurasikan informasi subnet klien

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

Parameter setEdnsSubnet mendukung fitur Extension Mechanisms for DNS (EDNS) Client Subnet (ECS) (RFC 7871). Fitur ini mengirimkan informasi subnet Anda ke server DNS otoritatif untuk resolusi DNS yang lebih akurat dan pengalihan lalu lintas. Mask yang lebih panjang memberikan informasi alamat yang lebih presisi, sedangkan mask yang lebih pendek memberikan privasi pengguna yang lebih baik. Kami merekomendasikan panjang mask /24.

Catatan

Dalam skenario proxy DNS yang menggunakan DNS over HTTPS (DoH) JSON API, proxy DNS menggunakan parameter ini untuk meneruskan informasi subnet pengguna ke HTTPDNS, yang kemudian meneruskan informasi tersebut ke server otoritatif.

Contohnya, saat DNSResolver.setEdnsSubnet("1.2.XX.XX/24") dipanggil, server otoritatif menggunakan awalan alamat 1.2.XX.XX/24 untuk memberikan hasil resolusi yang dioptimalkan.

11. Menyetel timeout resolusi nama domain

Properti timeout menentukan timeout untuk resolusi nama domain. Nilai default adalah 3 detik. Anda dapat menyetel nilai kustom antara 2 detik hingga 5 detik.

DNSResolver.setTimeout(3);

12. Ambil session ID untuk troubleshooting

Parameter sessionId dihasilkan saat aplikasi dimulai dan tetap konstan sepanjang siklus hidupnya. Semua permintaan resolusi HTTPDNS yang dilakukan selama siklus hidup aplikasi menyertakan sessionId ini. Server mencatat parameter ini dan menghasilkan indeks. Anda dapat menggunakan sessionId untuk melacak siklus hidup aplikasi dan menangani masalah terkait.

public static String getSessionId()

13. Callback logging

Callback yang menerima log yang dihasilkan oleh SDK.

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

Konfigurasi anti-obfuscation

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

API Layanan

  /**
   * Melakukan preload resolusi nama domain dengan mendeteksi secara otomatis lingkungan jaringan saat ini:
   * hanya IPv4, hanya IPv6, atau dual-stack.
   * Di lingkungan dual-stack, metode ini melakukan preload hasil resolusi IPv4 dan IPv6.
   * Panggil metode ini selama inisialisasi SDK saat startup aplikasi untuk menyimpan hasil resolusi
   * dalam cache. Hal ini mengurangi latensi untuk resolusi nama domain berikutnya.
   *
   * @param domains Nama domain yang akan di-preload.
   */
   public void preLoadDomains(final String[] domains)

    /**
     * Melakukan preload nama domain IPv4 atau IPv6 tertentu.
     * Panggil metode ini selama inisialisasi SDK saat startup aplikasi untuk menyimpan hasil resolusi
     * dalam cache. Hal ini mengurangi latensi untuk resolusi nama domain berikutnya.
     *
     * @param qType Jenis alamat IP yang akan di-preload: IPv4 atau IPv6.
     * @param domains Nama domain yang akan di-preload.
     */
    public void preLoadDomains(String qType, final String[] domains)
   /**
   * Mendapatkan data resolusi untuk nama domain dengan mendeteksi secara otomatis
   * lingkungan jaringan saat ini: hanya IPv4, hanya IPv6, atau dual-stack.
   * Jika hasil resolusi valid ada dalam cache, hasil cache dikembalikan.
   * Jika cache kosong atau hasilnya telah kedaluwarsa, metode ini mengirim permintaan
   * jaringan sinkron ke server untuk mendapatkan hasil resolusi rekursif. Hasil tersebut kemudian
   * dikembalikan dan disimpan dalam cache.
   *
   * @param host Nama domain yang akan di-resolve.
   * @return Array alamat IP optimal berdasarkan lingkungan jaringan saat ini.
   */
    public String[] getIpsByHost(String host)

/**
    * Mendapatkan array catatan IPv4 untuk hostname.
    * Jika hasil resolusi valid ada dalam cache, hasil cache dikembalikan.
    * Jika cache kosong atau hasilnya telah kedaluwarsa, metode ini mengirim permintaan
    * jaringan sinkron ke server untuk mendapatkan hasil resolusi rekursif. Hasil tersebut kemudian
    * dikembalikan dan disimpan dalam cache.
    *
    * @param hostName Hostname yang akan di-resolve, misalnya www.taobao.com.
    * @return Array alamat IPv4 untuk hostname yang ditentukan.
    */
  public  String[] getIPsV4ByHost(String hostName) 

   /**
    * Mendapatkan array catatan IPv6 untuk hostname.
    * @param hostName Hostname yang akan di-resolve, misalnya www.taobao.com.
    * @return Array alamat IPv6 untuk hostname yang ditentukan.
    */
  public String[] getIPsV6ByHost(String hostName) 

  

  /**
   * Mendapatkan array alamat IP yang telah di-resolve dari cache dengan mendeteksi secara otomatis
   * lingkungan jaringan saat ini: hanya IPv4, hanya IPv6, atau dual-stack.
   * Jika cache kosong, metode ini mengembalikan null dan memulai kueri asinkron.
   * Hasil kueri kemudian disimpan dalam cache.
   * Jika hasil cache ada dan pengembalian hasil kedaluwarsa diizinkan, metode ini
   * mengembalikan alamat IP kedaluwarsa dan kemudian memperbarui cache secara asinkron.
   * Jika pengembalian hasil kedaluwarsa tidak diizinkan dan hasil cache telah kedaluwarsa,
   * metode ini mengembalikan null dan kemudian memperbarui cache secara asinkron.
   *
   * @param host Host yang akan dikueri, misalnya www.taobao.com.
   * @param isAllowExp Menentukan apakah akan mengembalikan data resolusi kedaluwarsa.
   * @return Array alamat IP yang telah di-resolve untuk host dari cache.
   */
   public String[] getIpsByHostFromCache(String host, boolean isAllowExp)
   
    /**
     * Mendapatkan array alamat IPv4 yang telah di-resolve dari cache.
     * Jika cache kosong, metode ini mengembalikan null dan memulai kueri asinkron.
     * Hasil kueri kemudian disimpan dalam cache.
     * Jika hasil cache ada dan pengembalian hasil kedaluwarsa diizinkan, metode ini
     * mengembalikan alamat IP kedaluwarsa dan kemudian memperbarui cache secara asinkron.
     * Jika pengembalian hasil kedaluwarsa tidak diizinkan dan hasil cache telah kedaluwarsa,
     * metode ini mengembalikan null dan kemudian memperbarui cache secara asinkron.
     *
     * @param host Host yang akan dikueri, misalnya www.taobao.com.
     * @param isAllowExp Menentukan apakah akan mengembalikan data resolusi kedaluwarsa.
     * @return Array alamat IPv4 yang telah di-resolve untuk host dari cache.
     */
    private String[] getIpv4ByHostFromCache(String host , boolean isAllowExp)

    /**
     * Mendapatkan array alamat IPv6 yang telah di-resolve dari cache.
     * Jika cache kosong, metode ini mengembalikan null dan memulai kueri asinkron.
     * Hasil kueri kemudian disimpan dalam cache.
     * Jika hasil cache ada dan pengembalian hasil kedaluwarsa diizinkan, metode ini
     * mengembalikan alamat IP kedaluwarsa dan kemudian memperbarui cache secara asinkron.
     * Jika pengembalian hasil kedaluwarsa tidak diizinkan dan hasil cache telah kedaluwarsa,
     * metode ini mengembalikan null dan kemudian memperbarui cache secara asinkron.
     *
     * @param host Host yang akan dikueri, misalnya www.taobao.com.
     * @param isAllowExp Menentukan apakah akan mengembalikan data resolusi kedaluwarsa.
     * @return Array alamat IPv6 yang telah di-resolve untuk host dari cache.
     */
    private String[] getIpv6ByHostFromCache(String host , boolean isAllowExp)

  /**
  * Mendapatkan array objek DomainInfo untuk catatan IPv4 yang sesuai dengan URL.
  * Jika hasil resolusi valid ada dalam cache, hasil cache dikembalikan.
  * Jika cache kosong atau hasilnya telah kedaluwarsa, metode ini mengirim permintaan
  * jaringan sinkron ke server untuk mendapatkan hasil resolusi rekursif. Hasil tersebut kemudian
  * dikembalikan dan disimpan dalam cache.
  *
  * @param url URL, misalnya http://www.taobao.com.
  * @return Array objek DomainInfo tipe IPv4 untuk URL target.
  */
  public DomainInfo[] getIPsV4DInfoByUrl(String url) 

  Catatan: URL dalam objek DomainInfo adalah URL dengan host yang sudah diganti oleh alamat IP. Anda tidak perlu memodifikasi URL secara manual.

  /**
   * Mendapatkan array objek DomainInfo untuk catatan IPv6 yang sesuai dengan URL.
   * Jika hasil resolusi valid ada dalam cache, hasil cache dikembalikan.
   * Jika cache kosong atau hasilnya telah kedaluwarsa, metode ini mengirim permintaan
   * jaringan sinkron ke server untuk mendapatkan hasil resolusi rekursif. Hasil tersebut kemudian
   * dikembalikan dan disimpan dalam cache.
   * 
   * @param url URL, misalnya http://m.taobao.com.
   * @return Array objek DomainInfo tipe IPv6 untuk URL target.
   */
   public DomainInfo[] getIPsV6DInfoByUrl(String url) 

  /**
    * Mendapatkan objek DomainInfo untuk catatan IPv4 yang sesuai dengan URL.
    * Jika hasil resolusi valid ada dalam cache, hasil cache dikembalikan.
    * Jika cache kosong atau hasilnya telah kedaluwarsa, metode ini mengirim permintaan
    * jaringan sinkron ke server untuk mendapatkan hasil resolusi rekursif. Hasil tersebut kemudian
    * dikembalikan dan disimpan dalam cache.
    *
    * @param url URL, misalnya http://m.taobao.com.
    * @return Objek DomainInfo acak dari kumpulan objek tipe IPv4 untuk URL target.
    */
    public DomainInfo getIPV4DInfoByUrl(String url) 


  /**
    * Mendapatkan objek DomainInfo untuk catatan IPv6 yang sesuai dengan URL.
    * Jika hasil resolusi valid ada dalam cache, hasil cache dikembalikan.
    * Jika cache kosong atau hasilnya telah kedaluwarsa, metode ini mengirim permintaan
    * jaringan sinkron ke server untuk mendapatkan hasil resolusi rekursif. Hasil tersebut kemudian
    * dikembalikan dan disimpan dalam cache.
    *
    * @param url URL, misalnya http://www.taobao.com.
    * @return Objek DomainInfo acak dari kumpulan objek tipe IPv6 untuk URL target.
    */
   public DomainInfo getIPV6DInfoByUrl(String url) 

   Deskripsi: Objek domainInfo yang dikembalikan mengenkapsulasi properti berikut.

  /**
   * ID auto-increment untuk nama domain.
    */
    public String id = null;

   /**
    * URL siap pakai dengan host yang sudah diganti oleh alamat IP.
    */
     public String url = null;

    /**
    * Nama layanan target yang akan diatur di header permintaan HTTP.
    */
    public String host = "";

   /**
    * Isi body respons.
    */
   public String data = null;

   /**
    * Waktu permintaan dimulai.
    */
   public String startTime = null;

   /**
    * Waktu permintaan berakhir. Nilai ini null jika permintaan timeout.
    */
   public String stopTime = null; 

   /**
   * Kode status yang dikembalikan oleh server, seperti 200, 404, atau 500.
   */
   public String code = null;

  /**
    * Mendapatkan catatan IPv4 untuk hostname.
    * Jika hasil resolusi valid ada dalam cache, hasil cache dikembalikan.
    * Jika cache kosong atau hasilnya telah kedaluwarsa, metode ini mengirim permintaan
    * jaringan sinkron ke server untuk mendapatkan hasil resolusi rekursif. Hasil tersebut kemudian
    * dikembalikan dan disimpan dalam cache.
  
    * @param hostName Hostname yang akan di-resolve, misalnya www.taobao.com.
    * @return Alamat IPv4 acak dari kumpulan alamat untuk hostname target.
    *         Jika pengujian kecepatan diaktifkan, metode ini mengembalikan alamat IPv4 optimal.
    */
  public String getIPV4ByHost(String hostName) 

   /**
    * Mendapatkan catatan IPv6 untuk hostname.
    * Jika hasil resolusi valid ada dalam cache, hasil cache dikembalikan.
    * Jika cache kosong atau hasilnya telah kedaluwarsa, metode ini mengirim permintaan
    * jaringan sinkron ke server untuk mendapatkan hasil resolusi rekursif. Hasil tersebut kemudian
    * dikembalikan dan disimpan dalam cache.
  
    * @param hostName Hostname yang akan di-resolve, misalnya www.taobao.com.
    * @return Alamat IPv6 acak dari kumpulan alamat untuk hostname target.
    *         Jika pengujian kecepatan diaktifkan, metode ini mengembalikan alamat IPv6 optimal.
    */
   public String getIPV6ByHost(String hostName) 
      

    /**
     * Mendapatkan statistik keberhasilan dan kegagalan untuk permintaan ke HTTPDNS.
     *
     * @return String array JSON yang berisi statistik resolusi untuk semua nama domain.
     */
    public String getRequestReportInfo()
    
     /**
     * Menetapkan nama domain yang cache-nya akan disimpan aktif.
     * Nama domain yang ditentukan akan secara otomatis di-resolve ketika 75% TTL-nya telah berlalu.
     * Hal ini memastikan bahwa permintaan resolusi untuk nama domain tersebut selalu mengenai cache,
     * yang meningkatkan efisiensi resolusi SDK.
     * Jangan menetapkan terlalu banyak nama domain untuk fitur ini. Batas saat ini adalah 10.
     * Konfigurasi ini independen dari pre-resolve.
     *
     * @param persistentCacheDomains
     */
    public synchronized static void setKeepAliveDomains(String[] persistentCacheDomains) {
    
     /**
     * Menghapus cache untuk nama domain tertentu. Jika parameter `domains` bernilai null,
     * cache untuk semua nama domain dihapus.
     *
     * @param domains Array nama domain yang entri cache-nya akan dihapus.
     */
    public void clearHostCache(String[] domains){

Contoh pemanggilan API

URL: URL yang akan di-resolve. Misalnya, http://www.taobao.com.

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

1. Dapatkan data IP optimal untuk lingkungan jaringan saat ini

String[] ip = DNSResolver.getInstance().getIpsByHost(hostname); // Dapatkan alamat IP optimal dari resolusi nama domain untuk jaringan saat ini.

2. Lakukan preload resolusi nama domain untuk lingkungan jaringan saat ini

DNSResolver.getInstance().preLoadDomains(domains); // Tetapkan nama domain untuk pre-resolution. Ganti nama domain yang di-preload dengan nama domain yang ingin Anda resolve menggunakan Alibaba Cloud DNS.

3. Ambil resolusi nama domain dari cache untuk lingkungan jaringan saat ini

String[] ip = DNSResolver.getInstance().getIpsByHostFromCache(hostname,true);// Dapatkan data resolusi nama domain dari cache untuk lingkungan jaringan saat ini.

4. Dapatkan alamat IPv4

String IPV4 = DNSResolver.getInstance().getIPV4ByHost(hostname); // Dapatkan alamat IPv4 dari resolusi nama domain.

5. Dapatkan alamat IPv6

String IPV6 =  DNSResolver.getInstance().getIPV6ByHost(hostname); // Dapatkan alamat IPv6 dari resolusi nama domain.

6. Ambil alamat IPv4 yang telah di-resolve dari cache

String[] IPV4 =  DNSResolver.getInstance().getIpv4ByHostFromCache(hostname , true); // Dapatkan alamat IPv4 yang telah di-resolve dari cache.

7. Ambil alamat IPv6 yang telah di-resolve dari cache

String[] IPV6 =  DNSResolver.getInstance().getIpv6ByHostFromCache(hostname , true); // Dapatkan alamat IPv6 yang telah di-resolve dari cache.

8. Ambil objek DomainInfo berdasarkan URL

DomainInfo dinfo = DNSResolver.getInstance().getIPV4DInfoByUrl(url); // Dapatkan URL yang telah diganti.

9. Hapus cache resolusi untuk nama domain tertentu

DNSResolver.getInstance().clearHostCache(hostName); // Hapus cache untuk nama domain tertentu. Tetapkan hostName ke null untuk menghapus cache semua nama domain.

10. Ambil statistik permintaan Alibaba Cloud DNS yang berhasil dan gagal

String reportInfo = DNSResolver.getInstance().getRequestReportInfo(); // Dapatkan statistik tentang permintaan yang berhasil dan gagal.

Tabel berikut menjelaskan bidang dalam array JSON statistik resolusi nama domain:

 [
      {
         "avgRtt":"1",                         // Waktu rata-rata untuk resolusi nama domain. Satuan: ms.
         "degradeLocalDnsCount": 0,            // Jumlah kali layanan diturunkan ke LocalDNS.                       
         "domainName":"www.example.com",       // Nama domain yang di-resolve.
         "hitDnsCacheCount": 1,                // Jumlah hit cache.
         "httpabnormalCount": 0,               // Jumlah permintaan rekursif yang gagal.
         "isp": "China Mobile",                // Nama penyedia layanan.
         "localDnsResolveErrCount": 0,         // Jumlah resolusi LocalDNS yang gagal.
         "maxRtt": 8.0,                        // Waktu maksimum untuk resolusi nama domain. Satuan: ms.          
         "nonetworkCount": 0,                  // Jumlah kali jaringan tidak tersedia.
         "permissionErrCount": 0,              // Jumlah autentikasi pengguna yang gagal.
         "queryType": 1,                       // Jenis alamat IP. 1 menunjukkan IPv4 dan 28 menunjukkan IPv6.
         "recursiveReqCount": 1,               // Jumlah kueri rekursif.
         "reqParameterErrCount": 0,            // Jumlah kali format parameter permintaan tidak valid.
         "reqPathErrCount": 0,                 // Jumlah error URL.
         "reqServerErrCount": 0,               // Jumlah error server DNS.
         "reqTimeoutCount": 0,                 // Jumlah timeout layanan DNS.
         "resolveSuccessCount": 1,             // Jumlah resolusi yang berhasil.
         "timeoutCount": 0,                    // Jumlah timeout jaringan.
         "utfNetWorkErroNum": 0                // Jumlah timeout pelaporan data.
      }
         ......
 ]
Penting

Statistik resolusi nama domain HTTPDNS tersedia dalam dimensi berikut: lingkungan jaringan, nama domain, dan jenis permintaan.

Contoh

public class MainActivity extends AppCompatActivity {
   private Button button;
   private TextView tvInfo;
   private TextView tvResult;
   private String hostUrl = "http://www.taobao.com"; // Ganti ini dengan hostUrl yang ingin Anda resolve.
   private String hostName = "www.taobao.com"; // Ganti ini dengan hostName yang ingin Anda resolve.
   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() {
                      // Panggil metode getIPV4ByHost di SDK HTTPDNS untuk mendapatkan alamat IP setelah nama domain target di-resolve.
                      String ip = DNSResolver.getInstance().getIPV4ByHost(hostName);
                      if(ip != null){
                         tvInfo.setText("Alamat IP dari nama domain yang di-resolve adalah: "+ ip);
                      }
                      // Panggil metode getIPV4DInfoByUrl di SDK HTTPDNS untuk mendapatkan URL dari objek domainInfo setelah nama domain target di-resolve. Di URL ini, host di URL asli diganti dengan alamat 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) {
                // Kirim permintaan jaringan.
               String requestUrl = dinfo.url;
               HttpURLConnection conn = null;
               try {
                   URL url = new URL(requestUrl);
                   conn = (HttpURLConnection) url.openConnection();
                   // Saat Anda menggunakan alamat IP untuk akses, atur bidang Host di header permintaan HTTP ke nama domain yang di-resolve.
                   conn.setRequestProperty("Host", url.getHost());// Atur bidang Host di header permintaan HTTP.
                   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, "Respons: " + 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 = "Your Account ID"; // Tetapkan Account ID yang Anda gunakan untuk mengintegrasikan SDK di konsol.
    private String accessKeyId = "Your AccessKey ID"; // Tetapkan AccessKey ID yang Anda gunakan untuk mengintegrasikan SDK di konsol.
    private String accessKeySecret = "Your AccessKey secret"; // Tetapkan AccessKey secret yang Anda gunakan untuk mengintegrasikan SDK di konsol.

    @Override
    public void onCreate() {
       super.onCreate();
       DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret); // Tetapkan Account ID, AccessKey ID, dan AccessKey secret untuk integrasi SDK di konsol.
       DNSResolver.setKeepAliveDomains(new String[]{"your-domain-1","your-domain-2",...}); // Jika Anda mengonfigurasi domain keep-alive, resolusi akan dipicu secara otomatis ketika 75% TTL telah berlalu. Hal ini memastikan bahwa permintaan resolusi untuk nama domain yang dikonfigurasi selalu mengenai cache.
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{"your-preload-domain-1","your-preload-domain-2",...}); // Pre-resolve nama domain tipe IPv4. Ganti nama domain yang di-preload dengan nama domain yang ingin Anda resolve menggunakan Alibaba Cloud DNS.
    }
}

Catatan

  1. Setelah Anda menggunakan HTTPDNS untuk meresolusi nama domain menjadi alamat IP, gunakan alamat IP tersebut untuk mengirim permintaan aplikasi. Setel bidang Host di header permintaan HTTP ke nama domain asli.

  2. Untuk memastikan layanan Anda berjalan dengan benar, jika SDK HTTPDNS mengembalikan alamat IP kosong untuk suatu nama domain, Anda harus fallback menggunakan nama domain asli untuk permintaan tersebut. Kode berikut memberikan contoh:

    String ip = DNSResolver.getInstance().getIPV4ByHost("nama domain");
    if (ip != null) {
    	// Ganti host di URL dengan alamat IP untuk permintaan antarmuka.
    }else {
    	// Gunakan URL permintaan nama domain asli untuk permintaan downgrade (gunakan URL asli dengan nama domain untuk permintaan jaringan).
    }
  3. Program demo tersedia untuk membantu Anda memulai dengan cepat SDK HTTPDNS. Klik di sini untuk mengunduh program demo.

  4. Setelah mengintegrasikan SDK, verifikasi integrasi dengan memeriksa adanya traffic di bagian Analisis Traffic di konsol. Jika tidak ada traffic yang dihasilkan, pastikan parameter Account ID, AccessKey ID, dan AccessKey Secret telah disetel dengan benar.