Android aplikacija ne uspijeva razriješiti interno ime dok vlastiti preglednik VPN klijenta do njega dolazi, a ista gradnja radi na drugom telefonu. Varijabla nije URL. Varijabla je kojoj mreži je procesu aplikacije dopušteno koristiti za razrješavanje, a Android ne jamči da je aktivni VPN onaj koji koriste vaši sockеti. Prođite ove provjere redom i zaustavite se kada se snimak razrješivača ne slaže s vašom pretpostavkom.

Korak 1: Dokažite na kojoj je mreži aplikacija

Čitajte vlastiti pogled aplikacije, a ne statusnu traku. Iz ConnectivityManager uzmite aktivnu mrežu, njezine LinkProperties , popis DNS poslužitelja i postavku privatnog DNS-a. Ako popis sadrži razrješivač VPN-a, aplikacija ima put do njega; ako sadrži razrješivač Wi-Fi mreže, tunel nije zadana mreža za taj proces.

Ikona VPN-a samo kaže da tunel postoji. Ne kaže da je proces aplikacije povezan s njim, a Android ne usmjerava razrješavanje imena uvijek kroz mrežu koja izgleda aktivno. Lokalne VPN aplikacije koje prosljeđuju na drugi uređaj, Wi-Fi mreže bez interneta i gradnje proizvođača mogu ostaviti aplikaciju da pita zadani razrješivač umjesto poslužitelja tunela.

Korak 2: Zatražite VPN prijenos i povežite proces

Kada aplikacija mora koristiti razrješivač tunela, zatražite mrežu s VPN prijenosom i povežite proces u callbacku, da kod ne nagađa kada se mreža pojavljuje:

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_VPN)
    .build()

connectivityManager.requestNetwork(request, object : NetworkCallback() {
    override fun onAvailable(network: Network) {
        val bound = connectivityManager.bindProcessToNetwork(network)
        Log.i(TAG, "bound to VPN network: " + bound)
    }
})

Poziv mijenja zadanu mrežu na razini procesa, pa je svaki socket stvoren nakon toga koristi. Socketi koji već postoje zadržavaju mrežu na kojoj su stvoreni, zato skup veza otvoren prije povezivanja može nastaviti razrješavati starim putem. Povratna vrijednost je boolean, a rezultat false znači da se povezivanje nije dogodilo; pokušajte ponovno nakon kratke stanke i zabilježite oba pokušaja.

Korak 3: Ograničite povezivanje na ono što ga treba

Povezivanje na razini procesa je grubo. Telemetrija, provjere ažuriranja i SDK-ovi trećih strana također prelaze na tunel, a ako tunel nema internet, počinju padati. Za jedan zahtjev koristite tvornicu socketa mreže i zadržite zadanu postavku uređaja za sve ostalo. Svjesno odaberite jedan model: usko povezivanje po vezi ili povezivanje procesa s izričitim odvajanjem kada VPN nestane.

Dvije značajke razrješivača mogu pobijediti povezivanje bez ikakve pogreške. Privatni DNS u strogom načinu šalje upite na imenovani DoT poslužitelj umjesto na razrješivač mreže, a aplikacija s vlastitim DNS-over-HTTPS klijentom potpuno zaobilazi sistemski razrješivač. Provjerite oboje prije nego zaključite da je povezivanje neuspješno. Upit koji nikada ne dođe do DNS poslužitelja VPN-a neće se pojaviti ni u jednom zapisniku s tunelske strane.

Korak 4: Ne vjerujte ograničenju CONNECTED

Oznaka NetworkType.CONNECTED u WorkManageru znači da je mreža povezana, a VPN prijenos to zadovoljava čak i kada je temeljna Wi-Fi ili mobilna veza nestala. Posao se izvršava, svaki zahtjev pada, a politika ponavljanja pretvara to u oluju koja izgleda kao greška u raspoređivanju. Tunel je mreža; ograničenje nikada nije bilo provjera interneta.

Provjerite sposobnost koja poslu zaista treba, poput potvrđenog pristupa internetu, i držite ograničenu politiku ponavljanja s odmakom. Ako posao treba interno ime, razriješite to ime u odabranoj mreži prije obavljanja posla i brzo padnite s jasnom pogreškom umjesto da ponavljate zahtjev koji ne može uspjeti.

Korak 5: Zabilježite dokaze i ponovno testirajte raspon

Zabilježite vrste prijenosa odabrane mreže, DNS poslužitelje iz LinkProperties , je li povezivanje vratilo true i točan neuspjeh prvog zahtjeva. Zatim pokrenite interno i javno ime pod istim povezivanjem. Taj par pokazuje je li aplikacija koristila razrješivač tunela ili se tiho vratila na zadano uređaja, a to je razlika koju korisnik osjeti.

Ponovite na najstarijoj Android verziji koju podržavate i na jednoj aktualnoj verziji. Ponašanje razrješivača zbog kojeg zadani put izgleda ispravno upravo je mjesto gdje se uređaji i verzije razlikuju, a gradnja koja prolazi samo na najnovijem testnom uređaju nije provjerena za raspon koji isporučujete. adb shell dumpsys connectivityje brz način da potvrdite koje mreže i sposobnosti uređaj prijavljuje dok reproducirate kvar.

Povezani članci