Dokumen proses integrasi Android SDK menjelaskan alur kerja lengkap untuk mengimpor dan mengonfigurasi kit pengembangan perangkat lunak (SDK) Android, melakukan resolusi alamat IP, menerapkannya pada pustaka jaringan Anda, serta memverifikasi integrasinya. Topik ini menjelaskan cara mengintegrasikan HTTPDNS dengan WebView.
1. Pendahuluan
WebView adalah komponen sistem Android yang menyematkan konten web dalam aplikasi Anda. Menggunakan HTTPDNS saat WebView memuat halaman dapat meningkatkan keamanan dan kinerja jaringan.
Topik ini berfokus pada penggunaan alamat IP yang diselesaikan oleh HTTPDNS untuk permintaan jaringan di WebView Android. Untuk informasi lebih lanjut mengenai layanan resolusi HTTPDNS, lihat dokumen proses integrasi Android SDK.
2. Teknologi saat ini dan tantangan
2.1 Batasan permintaan jaringan WebView Android
Di Android, WebView menggunakan kernel browser bawaan sistem, yang didasarkan pada Chromium, untuk memuat halaman web. Pipa permintaan jaringannya terpisah dari pustaka jaringan aplikasi. Resolusi nama domain juga menggunakan proses DNS asli kernel. Banyak permintaan tidak dapat dicegat di lapisan Java. Sistem tertutup ini menciptakan hambatan alami untuk mengintegrasikan HTTPDNS.
2.2 Evolusi solusi teknis
Seiring dengan evolusi sistem Android dan WebView, solusi teknis untuk mengintegrasikan HTTPDNS juga berkembang.
Solusi Intersepsi:
Solusi ini mencegat permintaan sumber daya dalam callback shouldInterceptRequest() dan menerbitkannya ulang menggunakan pustaka jaringan dalam aplikasi, seperti OkHttp, dengan resolusi HTTPDNS terintegrasi. Proses ini melewati DNS sistem.
Metode ini mudah diimplementasikan dan bekerja untuk beberapa permintaan GET. Namun, memiliki keterbatasan besar. Karena badan permintaan untuk metode seperti POST tidak diekspos, Anda hanya bisa sepenuhnya mencegat permintaan GET. Ini membatasi cakupan solusi terhadap total lalu lintas WebView.
Solusi Proxy (Direkomendasikan):
Solusi ini memulai server proxy lokal dan menggunakan ProxyController dari AndroidX WebKit untuk mengonfigurasi proxy HTTP, HTTPS, dan WebSocket yang seragam untuk WebView. Metode ini secara transparan meneruskan semua lalu lintas kernel ke tumpukan jaringan yang dikendalikan oleh aplikasi. Ini memungkinkan Anda mencegat semua protokol dan metode permintaan untuk resolusi HTTPDNS, yang mengatasi hambatan cakupan metode shouldInterceptRequest().
3. Solusi proxy lokal (Direkomendasikan)
3.1 Gambaran solusi
Solusi ini memulai server proxy HTTP lokal di aplikasi Anda. Ini menggunakan `ProxyController` dari AndroidX WebKit untuk merutekan semua permintaan jaringan WebView ke proxy lokal ini. Proxy melakukan resolusi nama domain HTTPDNS dan kemudian meneruskan permintaan ke server aktual.
Alur Kerja:

3.2 Integrasi dependensi
Tambahkan dependensi berikut ke file app/build.gradle Anda:
// Sesuaikan versi dependensi sesuai kebutuhan
dependencies {
implementation 'androidx.webkit:webkit:1.7.0'
implementation 'com.aliyun.ams:alicloud-android-httpdns:2.6.5'
implementation 'io.github.littleproxy:littleproxy:2.4.4'
implementation 'io.netty:netty-all:4.1.42.Final'
implementation 'com.google.guava:guava:30.1.1-android'
implementation 'org.slf4j:slf4j-android:1.7.30'
}
3.3 Langkah-langkah integrasi
Mengintegrasikan proxy HTTPDNS WebView melibatkan tiga langkah inti:
Langkah 1: Inisialisasi HTTPDNS
Inisialisasi layanan HTTPDNS di kelas `Application` Anda:
public class WebviewProxyApplication extends Application {
public static String accountId = "your_account_id";
public static String secretKey = "your_secret_key"; // Opsional
@Override
public void onCreate() {
super.onCreate();
initHttpDns();
}
private void initHttpDns() {
try {
InitConfig config = new InitConfig.Builder()
.setContext(this)
.setTimeout(5000)
.setEnableCacheIp(true)
.setEnableExpiredIp(true)
.setSecretKey(secretKey) // Opsional, untuk otentikasi
.build();
HttpDns.init(accountId, config);
Log.i("HTTPDNS", "Inisialisasi berhasil");
} catch (Exception e) {
Log.e("HTTPDNS", "Inisialisasi gagal", e);
}
}
}
Langkah 2: Memulai layanan proxy LittleProxy
Buat `ProxyService` untuk mengelola server proxy:
public class ProxyService extends Service {
private HttpProxyServer proxyServer;
private HttpDnsResolver httpDnsResolver;
private boolean isRunning = false;
public boolean startProxyServer() {
if (isRunning) return true;
try {
// Buat resolver HTTPDNS
httpDnsResolver = new HttpDnsResolver(this);
// Mulai server LittleProxy
int port = generateRandomPort();
proxyServer = DefaultHttpProxyServer.bootstrap()
.withPort(port)
.withAddress(new InetSocketAddress("127.0.0.1", port))
.withServerResolver(httpDnsResolver) // Gunakan resolver HTTPDNS
.withConnectTimeout(10000)
.withIdleConnectionTimeout(30000)
.start();
isRunning = true;
Log.i("Proxy", "Server proxy dimulai dengan sukses: 127.0.0.1:" + port);
return true;
} catch (Exception e) {
Log.e("Proxy", "Gagal memulai server proxy", e);
return false;
}
}
public void stopProxyServer() {
if (proxyServer != null) {
proxyServer.stop();
isRunning = false;
Log.i("Proxy", "Server proxy dihentikan");
}
}
public boolean isProxyRunning() {
return isRunning;
}
}
// Implementasi resolver HTTPDNS
class HttpDnsResolver implements HostResolver {
private HttpDnsService httpDnsService;
public HttpDnsResolver(Context context) {
httpDnsService = HttpDns.getService(WebviewProxyApplication.accountId);
}
@Override
public InetSocketAddress resolve(String host, int port) throws UnknownHostException {
try {
// Gunakan HTTPDNS untuk resolusi
HTTPDNSResult result = httpDnsService.getHttpDnsResultForHostSyncNonBlocking(
host, RequestIpType.auto);
if (result != null && result.getIps() != null && result.getIps().length > 0) {
String ip = result.getIps()[0];
Log.d("DNS", "Resolusi HTTPDNS: " + host + " -> " + ip);
return new InetSocketAddress(ip, port);
}
// Jatuh kembali ke DNS sistem
return new InetSocketAddress(InetAddress.getByName(host), port);
} catch (Exception e) {
Log.w("DNS", "Resolusi gagal, menggunakan DNS sistem: " + host);
return new InetSocketAddress(InetAddress.getByName(host), port);
}
}
}
Langkah 3: Konfigurasi proxy WebView
Di Activity Anda, konfigurasikan WebView untuk menggunakan proxy lokal:
public class MainActivity extends AppCompatActivity {
private WebView webView;
private ProxyService proxyService;
private boolean isProxyRunning = false;
// Executor utama untuk ProxyController
private final Executor mainExecutor = ContextCompat.getMainExecutor(this);
private void configureWebViewProxy() {
// Periksa apakah sistem mendukung konfigurasi proxy
if (!WebViewFeature.isFeatureSupported(WebViewFeature.PROXY_OVERRIDE)) {
Log.w("WebView", "Konfigurasi proxy tidak didukung pada sistem saat ini");
return;
}
if (isProxyRunning) {
String proxyAddress = proxyManager.getProxyAddress();
// Konfigurasikan WebView untuk menggunakan proxy lokal
ProxyConfig proxyConfig = new ProxyConfig.Builder()
.addProxyRule(proxyAddress, ProxyConfig.MATCH_HTTP)
.addProxyRule(proxyAddress, ProxyConfig.MATCH_HTTPS)
.addDirect(ProxyConfig.MATCH_ALL_SCHEMES) // Hubungkan langsung untuk protokol lain
.build();
ProxyController.getInstance().setProxyOverride(proxyConfig, mainExecutor, () -> {
Log.i("WebView", "Proxy dikonfigurasi dengan sukses");
});
} else {
// Hapus konfigurasi proxy
ProxyController.getInstance().clearProxyOverride(mainExecutor, () -> {
Log.i("WebView", "Konfigurasi proxy dihapus");
});
}
}
private void loadUrl(String url) {
// Pastikan konfigurasi proxy diterapkan sebelum memuat URL
configureWebViewProxy();
webView.loadUrl(url);
}
}
3.4 Referensi implementasi lengkap
Membuat layanan proxy lokal, mengintegrasikan HTTPDNS, dan mengonfigurasi WebView bisa menjadi kompleks. Implementasi lengkap, open-source tersedia di GitHub: Demo HTTPDNS WebView.
Komponen inti meliputi yang berikut:
HttpDnsResolver: Mengimplementasikan antarmuka `HostResolver` LittleProxy dan mengintegrasikan resolusi HTTPDNS.
ProxyService: Layanan Android yang mengelola siklus hidup server proxy.
ProxyManager: Mengelola status proxy dan pengikatan layanan.
MainActivity: Menangani interaksi UI dan konfigurasi proxy WebView.
Solusi ini mencakup mekanisme fallback multilayer untuk memastikan stabilitas. Secara otomatis melewati konfigurasi `ProxyController` pada versi sistem yang tidak didukung. Jika resolusi HTTPDNS gagal, ia akan jatuh kembali ke DNS sistem. Juga secara otomatis beralih ke IP lain jika IP yang diselesaikan tidak tersedia.
4. Solusi intersepsi tradisional
Untuk sistem lama yang tidak mendukung `ProxyController` (WebView < 72), Anda dapat menggunakan solusi intersepsi tradisional sebagai strategi fallback.
4.1 Gambaran solusi
Solusi intersepsi tradisional menimpa metode WebViewClient.shouldInterceptRequest() untuk mencegat permintaan jaringan WebView. Kemudian menerbitkan ulang permintaan tersebut menggunakan klien OkHttp dengan HTTPDNS terintegrasi.
Fitur Utama:
Hanya mendukung intersepsi permintaan GET.
Memerlukan penanganan manual data seperti cookie.
Memiliki kompleksitas implementasi dan biaya pemeliharaan yang lebih tinggi.
Menawarkan kompatibilitas yang baik dan mendukung versi WebView yang lebih lama.
4.2 Implementasi detail
Solusi intersepsi tradisional melibatkan banyak detail teknis dan kasus tepi. Untuk implementasi lengkap dan instruksi, lihat Praktik Terbaik untuk Menggunakan HTTPDNS dengan OkHttp di Android.
5. Verifikasi
Setelah integrasi selesai, Anda dapat memverifikasi keberhasilannya melalui metode seperti simulasi pembajakan atau pengujian injeksi kesalahan. Untuk petunjuk detailnya, lihat dokumen Verifikasi integrasi pustaka jaringan.
6. Perbandingan dan ringkasan solusi
Dimensi / Solusi | Solusi proxy | Solusi intersepsi |
Dukungan resmi | API formal, publik, dan jangka panjang yang diperkenalkan oleh Google di AndroidX WebKit. | Menggunakan API `WebViewClient` publik, tetapi fungsinya terbatas pada permintaan GET. |
Versi efektif | Android 5.0+ WebView 72+ | Android 5.0+ |
Cakupan protokol | HTTP, HTTPS, dan WebSocket | Hanya permintaan GET HTTP/HTTPS |
Kompleksitas implementasi | Sedang: Memerlukan implementasi proxy lokal, manajemen port, dan penerusan dua arah. | Sedang: Memerlukan integrasi OkHttp dan menangani rekonstruksi permintaan dan resolusi DNS. |
Tingkat intrusivitas terhadap kode bisnis | Rendah: Hanya memerlukan konfigurasi proxy untuk WebView. | Rendah: Hanya memerlukan penggantian implementasi `WebViewClient`. |
Cookie, cache, dan CORS | Transparan di lapisan proxy. Tidak perlu penanganan tambahan. | Pengembang harus menangani cookie secara manual. |
Biaya pemeliharaan | Rendah: Mengandalkan API resmi, sehingga risiko masalah peningkatan kecil. | Rendah: Berdasarkan API `WebViewClient` yang stabil. |
Strategi fallback kegagalan | Didukung: Dapat jatuh kembali ke jaringan sistem jika proxy gagal. | Harus diimplementasikan oleh pengembang. |
Skenario yang direkomendasikan | Pengembangan aplikasi modern yang memerlukan dukungan protokol penuh. | Skenario yang memerlukan integrasi cepat dan hanya perlu menangani permintaan GET. |
Mempertimbangkan stabilitas, biaya pengembangan dan pemeliharaan, serta tren masa depan, solusi proxy lokal sangat direkomendasikan. Solusi ini menangani semua jenis permintaan, menampilkan dukungan protokol penuh, menawarkan pengalaman integrasi transparan, dan mencakup mekanisme fallback yang elegan. Ini menyediakan layanan HTTPDNS yang stabil dan andal dengan biaya rendah.
Pilih strategi integrasi berdasarkan kebutuhan bisnis Anda. Lakukan pengujian menyeluruh untuk memastikan bahwa peningkatan keamanan jaringan tidak memengaruhi pengalaman pengguna secara negatif.