All Products
Search
Document Center

HTTPDNS:Praktik terbaik untuk menggunakan HTTPDNS dengan WebView dan proxy lokal di Android

Last Updated:Nov 10, 2025

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.