Topik ini menjelaskan cara mengintegrasikan HTTPDNS Android SDK. Untuk ikhtisar prinsip dasar integrasi HTTPDNS, lihat Client Integration Overview.
Pendahuluan
Bagian ini menjelaskan cara mengintegrasikan HTTPDNS Android SDK.
Panduan ini berlaku untuk proyek Android Studio yang menggunakan Gradle untuk manajemen dependensi.
SDK mendukung Android 4.4 (API Level 19) atau versi yang lebih baru.
targetSdkVersion mendukung hingga Android 14 (API 34).
SDK mendukung arsitektur arm64-v8a, armeabi-v7a, x86, dan x86_64.
SDK ini bersifat open source. Anda dapat memodifikasi kode sumber untuk memenuhi kebutuhan khusus. Untuk informasi selengkapnya, lihat httpdns-android-sdk.
Langkah 1: Tambahkan SDK ke aplikasi Anda
Anda dapat menambahkan SDK ke aplikasi dengan menambahkan dependensi melalui Maven atau dari file lokal.
Kami merekomendasikan penambahan dependensi melalui Maven karena konfigurasinya sederhana, lebih sedikit kesalahan, dan mudah diperbarui.
1. Tambahkan dependensi menggunakan Maven (Direkomendasikan)
1.1 Konfigurasi repositori Maven
Bagian ini menjelaskan metode konfigurasi yang direkomendasikan: metode dependencyResolutionManagement untuk Gradle 7.0 atau versi yang lebih baru, dan metode allprojects untuk versi Gradle di bawah 7.0.
1.1.1 Metode dependencyResolutionManagement
Pada file Gradle tingkat root (project-level) (<project>/settings.gradle), tambahkan alamat repositori Maven ke blok repositories dalam dependencyResolutionManagement.
dependencyResolutionManagement {
repositories {
maven {
url 'https://maven.aliyun.com/nexus/content/repositories/releases/'
}
}
}1.1.2 Metode allprojects
Pada file Gradle tingkat root (project-level) (<project>/build.gradle), tambahkan alamat repositori Maven ke blok allprojects pada blok repositories.
allprojects {
repositories {
maven {
url 'https://maven.aliyun.com/nexus/content/repositories/releases/'
}
}
}1.2 Tambahkan dependensi SDK
Pada file Gradle tingkat modul (app-level) (biasanya <project>/<app-module>/build.gradle), tambahkan dependensi SDK ke blok dependencies.
dependencies {
implementation 'com.aliyun.ams:alicloud-android-httpdns:${httpdnsVersion}'
}Anda dapat menemukan httpdnsVersion di Android SDK release notes.
2. Tambahkan dependensi dari file lokal
2.1 Unduh SDK
Pilih dan unduh HTTPDNS dari EMAS SDK List. Kemudian, salin semua file dari paket SDK ke direktori <project>/<app-module>/libs pada modul tingkat aplikasi Anda.
2.2 Tambahkan dependensi SDK
2.2.1 Konfigurasi direktori SDK lokal
Pada file Gradle tingkat modul (app-level) (biasanya <project>/<app-module>/build.gradle), tambahkan path ke direktori SDK lokal.
repositories {
flatDir {
dirs 'libs'
}
}2.2.2 Tambahkan dependensi SDK
Pada file Gradle tingkat modul (app-level) (biasanya <project>/<app-module>/build.gradle), tambahkan dependensi SDK ke blok dependencies.
dependencies {
implementation (name: 'alicloud-android-httpdns-${httpdnsVersion}', ext: 'aar')
implementation (name: 'alicloud-android-logger-${loggerVersion}', ext: 'aar')
implementation (name: 'alicloud-android-crashdefend-${crashDefendVersion}', ext: 'jar')
implementation (name: 'alicloud-android-ipdetector-${ipdetectorVersion}', ext: 'aar')
implementation 'commons-codec:commons-codec:1.15'
}Nomor versi SDK dalam contoh dependensi harus sesuai dengan nomor versi pada nama file artefak yang diunduh.
Jika terjadi error kelas tidak ditemukan selama proses kompilasi, pastikan blok
dependenciesmencakupimplementation fileTree(dir: 'libs', include the following: ['*.jar']).
Langkah 2: Konfigurasikan dan gunakan SDK
1. Konfigurasikan HTTPDNS
// Inisialisasi konfigurasi. Panggil metode ini tanpa menangani nilai kembali.
InitConfig config = InitConfig.Builder()
/*
(Opsional) Tentukan kluster layanan HTTPDNS untuk permintaan resolusi nama domain pertama setelah aplikasi diinstal. Permintaan berikutnya akan diarahkan ke kluster terdekat berdasarkan jaringan klien. Anda harus secara eksplisit memilih wilayah target. Nilai yang valid: Region.SG, Region.HK, Region.US, dan Region.DE.
*/
.setRegion(Region.SG)
/*
(Wajib) Berikan konteks aplikasi. Ini digunakan untuk tujuan seperti mendeteksi perubahan jaringan. Biasanya Anda dapat memberikan ApplicationContext.
*/
.setContext(context)
/*
(Opsional) Konfigurasi kunci rahasia untuk menandatangani permintaan ke server. Ini mencegah permintaan dimanipulasi. Fitur ini dinonaktifkan secara default. Aktifkan untuk keamanan yang lebih baik.
*/
.setSecretKey(secretKey)
/*
(Opsional) Konfigurasi protokol lapisan transport untuk komunikasi antara SDK dan server. Mengaktifkan HTTPS memberikan keamanan tautan yang lebih tinggi. Perhatikan perbedaan penagihan antara HTTP dan HTTPS. Protokol default adalah HTTP. Aktifkan HTTPS untuk keamanan yang lebih baik.
*/
.setEnableHttps(enableHttps)
/*
(Opsional) Atur periode timeout untuk resolusi nama domain. Satuan: milidetik. Nilai maksimum adalah 5000 ms. Nilai default adalah 2000 ms.
*/
.setTimeoutMillis(2 * 1000)
/*
(Opsional) Tentukan apakah akan mengaktifkan cache lokal. Ini mengoptimalkan waktu yang dibutuhkan untuk resolusi nama domain setelah startup dan meningkatkan kecepatan pemuatan layar pertama. Fitur ini dinonaktifkan secara default. Kami merekomendasikan agar Anda mengaktifkannya dan mengatur durasi cache menjadi 1 hari.
*/
.setEnableCacheIp(true, 24 * 60 * 60 * 1000)
/*
(Opsional) Tentukan apakah akan mengizinkan penggunaan cache yang telah kedaluwarsa. Jika Anda mengaktifkan opsi ini, API dapat langsung mengembalikan alamat IP kedaluwarsa terakhir untuk mengurangi pemblokiran dan meningkatkan performa permintaan. SDK secara asinkron memperbarui hasil resolusi terbaru di latar belakang. Fitur ini diaktifkan secara default.
*/
.setEnableExpiredIp(true)
/*
(Opsional) Aktifkan sniffing dan pengurutan untuk daftar alamat IP dalam hasil resolusi. Tetapkan daftar nama domain dan port untuk deteksi. Kami merekomendasikan Anda mengonfigurasi ini untuk permintaan yang sensitif terhadap latensi.
*/
.setIPRankingList(ipRankingItemJson.toIPRankingList())
/*
(Opsional) Konfigurasi antarmuka untuk menyesuaikan TTL cache. Ini mengubah TTL cache default dari DNS otoritatif.
*/
.configCacheTtlChanger(ttlChanger)
/*
(Opsional) Alamat IP beberapa nama domain relatif stabil. Cache untuk nama domain ini tidak perlu sering diperbarui saat jaringan berubah. Anda dapat menggunakan antarmuka ini untuk secara eksplisit memberi tahu SDK.
*/
.configHostWithFixedIp(hostListWithFixedIp)
/*
(Opsional) Konfigurasi kondisi filter untuk nama domain yang tidak menggunakan HTTPDNS untuk resolusi. Untuk nama domain dalam daftar, HTTPDNS langsung mengembalikan null.
*/
.setNotUseHttpDnsFilter(notUseHttpDnsFilter)
.build()
HttpDns.init(accountID, config);// Inisialisasi konfigurasi. Panggil metode ini tanpa menangani nilai kembali.
InitConfig config = new InitConfig.Builder()
/*
(Opsional) Tentukan kluster layanan HTTPDNS untuk permintaan resolusi nama domain pertama setelah aplikasi diinstal. Permintaan berikutnya akan diarahkan ke kluster terdekat berdasarkan jaringan klien. Jika Anda tidak ingin permintaan pertama diarahkan ke kluster default, pilih secara eksplisit wilayah target, seperti Region.SG atau Region.HK. Kluster default adalah daratan Tiongkok untuk Alibaba Cloud China Website dan Singapura untuk Alibaba Cloud International Website.
*/
.setRegion(Region.SG)
/*
(Wajib) Berikan konteks aplikasi. Ini digunakan untuk tujuan seperti mendeteksi perubahan jaringan. Biasanya Anda dapat memberikan ApplicationContext.
*/
.setContext(context)
/*
(Opsional) Konfigurasi kunci rahasia untuk menandatangani permintaan ke server. Ini mencegah permintaan dimanipulasi. Fitur ini dinonaktifkan secara default. Aktifkan untuk keamanan yang lebih baik.
*/
.setSecretKey(secretKey)
/*
(Opsional) Konfigurasi protokol lapisan transport untuk komunikasi antara SDK dan server. Mengaktifkan HTTPS memberikan keamanan tautan yang lebih tinggi. Perhatikan perbedaan penagihan antara HTTP dan HTTPS. Protokol default adalah HTTP. Aktifkan HTTPS untuk keamanan yang lebih baik.
*/
.setEnableHttps(enableHttps)
/*
(Opsional) Atur periode timeout untuk resolusi nama domain. Satuan: milidetik. Nilai maksimum adalah 5000 ms. Nilai default adalah 2000 ms.
*/
.setTimeoutMillis(2 * 1000)
/*
(Opsional) Tentukan apakah akan mengaktifkan cache lokal. Ini mengoptimalkan waktu yang dibutuhkan untuk resolusi nama domain setelah startup dan meningkatkan kecepatan pemuatan layar pertama. Fitur ini dinonaktifkan secara default. Kami merekomendasikan agar Anda mengaktifkannya dan mengatur durasi cache menjadi 1 hari.
*/
.setEnableCacheIp(true, 24 * 60 * 60 * 1000)
/*
(Opsional) Tentukan apakah akan mengizinkan penggunaan cache yang telah kedaluwarsa. Jika Anda mengaktifkan opsi ini, API dapat langsung mengembalikan alamat IP kedaluwarsa terakhir untuk mengurangi pemblokiran dan meningkatkan performa permintaan. SDK secara asinkron memperbarui hasil resolusi terbaru di latar belakang. Fitur ini diaktifkan secara default.
*/
.setEnableExpiredIp(true)
/*
(Opsional) Aktifkan sniffing dan pengurutan untuk daftar alamat IP dalam hasil resolusi. Tetapkan daftar nama domain dan port untuk deteksi. Kami merekomendasikan Anda mengonfigurasi ini untuk layanan yang sensitif terhadap latensi.
*/
.setIPRankingList(ipRankingItemJson.toIPRankingList())
/*
(Opsional) Konfigurasi antarmuka untuk menyesuaikan TTL cache. Ini mengubah TTL cache default dari DNS otoritatif.
*/
.configCacheTtlChanger(ttlChanger)
/*
(Opsional) Alamat IP beberapa nama domain relatif stabil. Cache untuk nama domain ini tidak perlu sering diperbarui saat jaringan berubah. Anda dapat menggunakan antarmuka ini untuk secara eksplisit memberi tahu SDK.
*/
.configHostWithFixedIp(hostListWithFixedIp)
/*
(Opsional) Konfigurasi kondisi filter untuk nama domain yang tidak menggunakan HTTPDNS untuk resolusi. Untuk nama domain dalam daftar, HTTPDNS langsung mengembalikan null.
*/
.setNotUseHttpDnsFilter(notUseHttpDnsFilter)
.build();
HttpDns.init(accountID, config);Anda dapat menerapkan optimistic DNS caching dengan mengonfigurasi
setEnableExpiredIp(true)dansetEnableCacheIp(true, 24 * 60 * 60 * 1000). Fitur ini menyimpan hasil resolusi nama domain secara lokal dan memungkinkan penggunaan alamat IP yang telah kedaluwarsa, sehingga sebagian besar resolusi DNS dapat diselesaikan secara lokal. Ini direkomendasikan untuk nama domain bisnis yang alamat IP hasil resolusinya tidak sering berubah. Untuk informasi selengkapnya, lihat setEnableCacheIp dan setEnableExpiredIp.Mengatur parameter setEnableHttps ke `true` akan meningkatkan biaya Anda. Sebelum mengaktifkan fitur ini, baca dengan cermat dokumen Product billing.
Jika Anda memiliki persyaratan keamanan tinggi terhadap informasi nama domain atau parameter SDNS, Anda dapat menggunakan antarmuka setAesSecretKey untuk mengaktifkan enkripsi lapisan konten pada permintaan resolusi. Namun, penggunaan enkripsi konten AES akan meningkatkan biaya Anda. Sebelum mengaktifkan fitur ini, baca dengan cermat dokumen Product billing.
Jika Anda tidak mengatur
setEnableHttpsketrueselama inisialisasi, Anda harus menambahkan konfigurasiandroid:usesCleartextTraffic="true"ke nodeapplicationdalam fileAndroidManifest.xmltingkat aplikasi. Jika tidak, permintaan resolusi nama domain akan gagal pada versi sistem yang lebih baru (targetSdkVersion 27 atau lebih tinggi).
Untuk informasi selengkapnya tentang antarmuka konfigurasi, lihat Configuration interfaces.
2. Dapatkan instans layanan
HTTPDNS Android SDK menyediakan layanan resolusi nama domain melalui instance layanan global. Anda dapat memperoleh instance tersebut sebagai berikut.
val httpdns = HttpDns.getService(accountID)HttpDnsService httpdns = HttpDns.getService(accountID);3. Konfigurasi pra-resolusi nama domain
Setelah Anda menginisialisasi HTTPDNS, Anda dapat mengonfigurasi pre-resolusi untuk nama domain hot spot yang mungkin akan Anda gunakan nanti. Ini memungkinkan SDK melakukan resolusi terlebih dahulu dan mengurangi latensi permintaan resolusi berikutnya.
val hostList = arrayListOf<String>()
hostList.add("www.aliyun.com")
httpdns.setPreResolveHosts(hostList)ArrayList<String> hostList = new ArrayList<>();
hostList.add("www.aliyun.com");
httpdns.setPreResolveHosts(hostList);Mengaktifkan pre-resolusi nama domain secara signifikan meningkatkan tingkat hit optimistic DNS cache. Ini memungkinkan sebagian besar permintaan resolusi dikembalikan langsung dari cache lokal, sehingga mengurangi latensi dari resolusi real-time.
Pre-resolusi meningkatkan jumlah permintaan resolusi. Kami merekomendasikan agar Anda hanya mengaktifkannya untuk nama domain layanan inti atau nama domain yang sering diakses untuk mencapai keseimbangan terbaik antara performa dan biaya.
4. Lakukan resolusi nama domain
HTTPDNS menyediakan beberapa metode resolusi nama domain, termasuk resolusi sinkron, asinkron, dan sinkron non-blocking. Contoh berikut menggunakan API resolusi sinkron non-blocking.
val httpDnsResult = httpdns.getHttpDnsResultForHostSyncNonBlocking("www.aliyun.com", RequestIpType.auto)HTTPDNSResult httpDnsResult = httpdns.getHttpDnsResultForHostSyncNonBlocking("www.aliyun.com", RequestIpType.auto);Antarmuka getHttpDnsResultForHostSyncNonBlocking hanya melakukan kueri cache dan mengembalikan hasil resolusi dari cache. Jika tidak ada hasil resolusi di cache atau hasil tersebut telah kedaluwarsa, SDK melakukan resolusi nama domain di thread pekerja. Setelah resolusi berhasil, cache diperbarui untuk panggilan berikutnya.
Menggunakan antarmuka ini bersamaan dengan pre-resolusi (setPreResolveHosts), cache persistensi (setEnableCacheIp), dan opsi untuk mengizinkan alamat IP kedaluwarsa (setEnableExpiredIp) memungkinkan sebagian besar permintaan resolusi mengenai cache lokal. Ini mencapai latensi resolusi 0 ms.
Jika bisnis Anda sangat bergantung pada hasil resolusi HTTPDNS, misalnya saat Anda menggunakan resolusi kustom atau mengalami pembajakan Local DNS yang parah, gunakan getHttpDnsResultForHostSync atau getHttpDnsResultForHostAsync.
Pilih antarmuka resolusi nama domain yang sesuai untuk skenario Anda. Untuk informasi selengkapnya tentang antarmuka tersebut, lihat Domain name resolution interfaces dan Custom resolution interfaces.
5. Gunakan hasil resolusi nama domain
Setelah resolusi berhasil pada langkah sebelumnya, Anda dapat memperoleh hasil resolusi nama domain. Untuk informasi lebih lanjut tentang struktur data, lihat HTTPDNSResult.
Kode berikut memberikan contoh proses resolusi untuk pustaka jaringan OkHttp:
object : Dns {
@Throws(UnknownHostException::class)
override fun lookup(host: String): List<InetAddress> {
val httpdnsResult: HTTPDNSResult = HttpDns.getService(accountID)
.getHttpDnsResultForHostSyncNonBlocking(host, RequestIpType.auto)
val inetAddresses: MutableList<InetAddress> = ArrayList()
var address: InetAddress
try {
if (httpdnsResult.ips != null) {
// Proses alamat IPv4
for (ipv4 in httpdnsResult.ips) {
address = InetAddress.getByName(ipv4)
inetAddresses.add(address)
}
}
if (httpdnsResult.ipv6s != null) {
// Proses alamat IPv6
for (ipv6 in httpdnsResult.ipv6s) {
address = InetAddress.getByName(ipv6)
inetAddresses.add(address)
}
}
} catch (e: UnknownHostException) {
}
return if (!inetAddresses.isEmpty()) {
inetAddresses
// Penting: Konfigurasikan fallback ke Local DNS
} else Dns.SYSTEM.lookup(host)
}
}new Dns() {
@Override
public List<InetAddress> lookup(String host) throws UnknownHostException {
HTTPDNSResult httpdnsResult = HttpDns.getService(accountID).getHttpDnsResultForHostSync(host, RequestIpType.auto);
List<InetAddress> inetAddresses = new ArrayList<>();
InetAddress address;
try {
if (httpdnsResult.getIps() != null) {
// Proses alamat IPv4
for (String ipv4 : httpdnsResult.getIps()) {
address = InetAddress.getByName(ipv4);
inetAddresses.add(address);
}
}
if (httpdnsResult.getIpv6s() != null) {
// Proses alamat IPv6
for (String ipv6 : httpdnsResult.getIpv6s()) {
address = InetAddress.getByName(ipv6);
inetAddresses.add(address);
}
}
} catch (UnknownHostException e) {
}
if (!inetAddresses.isEmpty()) {
return inetAddresses;
}
return Dns.SYSTEM.lookup(host);
}
};Untuk solusi integrasi pustaka jaringan spesifik, lihat:
Best practices for integrating HTTPDNS with OkHttp on Android
Best practices for integrating HTTPDNS with WebView and a local proxy on Android
Best practices for integrating HTTPDNS with Alibaba Cloud OSS SDK on Android
Best practices for integrating HTTPDNS with ExoPlayer on Android
Best practices for integrating HTTPDNS with WebView and OkHttp on Android
Best practices for integrating HTTPDNS with HttpURLConnection on Android
6. Konfigurasi obfuscation
Jika Anda telah mengaktifkan obfuscation kode untuk proyek Anda, tambahkan aturan berikut ke file konfigurasi Anda.
-keep class com.alibaba.sdk.android.**{*;}Langkah 3: Verifikasi integrasi
Verifikasi mencakup dua bagian: memastikan bahwa SDK berhasil memperoleh alamat IP untuk nama domain, dan memastikan bahwa pustaka jaringan menggunakan alamat IP tersebut untuk berhasil mengakses layanan bisnis.
1. Verifikasi bahwa alamat IP diperoleh
Pastikan bahwa SDK HTTPDNS berhasil menyelesaikan alamat IP dari nama domain target. Anda dapat menggunakan salah satu dari dua metode berikut untuk verifikasi:
View resolution logs: Lihat log resolusi HTTPDNS di konsol EMAS. Jika log menunjukkan daftar alamat IP untuk nama domain target, resolusi berhasil.
Cetak hasil kembali SDK: Cetak hasil callback resolusi dari SDK HTTPDNS langsung di kode Anda untuk memeriksa apakah alamat IP yang valid dikembalikan.
# Kirim permintaan sinkron D sync request host www.aliyun.com with type both extras : null cacheKey null # Hasil kueri cache D host www.aliyun.com result in cache is null # Picu resolusi cloud I sync start request for www.aliyun.com both D ip detector type is 3 D ipdetector type is both D start resolve ip request for www.aliyun.com both # Periode timeout resolusi D the httpDnsConfig timeout is: 2000 D final timeout is: 2000 D wait for request finish # Kirim permintaan resolusi D request url http://xx.xx.xx.xx:80/xxxx/sign_d?host=www.aliyun.com&sdk=android_2.4.0&query=4,6&sid=CaZk1vTyI3hy&s=b4a34694b7215b4cd6a10376b3425a8e&t=1715772172 # Resolusi berhasil D request success {"ipsv6":[],"host":"www.aliyun.com","ips":[],"ttl":60,"origin_ttl":60} # Perbarui cache D save host www.aliyun.com for type v4 ttl is 60 D save host www.aliyun.com for type v6 ttl is 60 D sync resolve time is: 224 # Kembalikan hasil resolusi I request host www.aliyun.com for both and return host:www.aliyun.com, ips:[], ipv6s:[], extras:{}, expired:false, fromDB:false after request
2. Verifikasi bahwa pustaka jaringan terintegrasi
Integrasi yang berhasil dengan pustaka jaringan berarti resolusi DNS melewati Local DNS dan menggunakan HTTPDNS. Anda dapat menggunakan salah satu dari dua metode berikut untuk verifikasi:
Hijacking simulation test: Atur server DNS jaringan Wi-Fi ponsel Anda ke alamat yang tidak valid. Jika permintaan bisnis Anda masih dapat dikirim, integrasi berhasil.
Fault injection test: Gunakan fitur custom resolution EMAS HTTPDNS untuk menyelesaikan nama domain target ke alamat IP yang tidak valid. Jika permintaan bisnis gagal, integrasi berhasil.
Catatan
Kompilasi gagal setelah peningkatan SDK
Jika kompilasi gagal setelah Anda melakukan upgrade SDK, kemungkinan API SDK telah berubah. Lihat Android SDK API dan gunakan antarmuka pengganti yang baru.
Anda harus menulis kode fallback
Kode fallback memastikan bahwa ketika HTTPDNS gagal mengembalikan hasil yang diharapkan, aplikasi Anda kembali menggunakan Local DNS untuk menyelesaikan resolusi nama domain.
Catat alamat IP dan session ID yang diperoleh dari HTTPDNS
Kami menyediakan solusi untuk memecahkan masalah resolusi. Solusi ini mengharuskan Anda mencatat alamat IP dan sessionId yang diperoleh dari HTTPDNS dalam log. Untuk informasi selengkapnya, lihat Use the Session Tracing Solution to Troubleshoot Resolution Issues.