Aplikácia pre Android nedokáže preložiť interné meno, hoci prehliadač samotného klienta VPN sa k nemu dostane a rovnaký build funguje na inom telefóne. URL nie je premenná. Premenná je, ktorú sieť smie proces aplikácie používať na preklad, a Android negarantuje, že aktívna VPN je sieť, ktorú používajú vaše sockety. Vykonajte tieto kontroly v poradí a zastavte sa, keď sa snímka resolvera nezhoduje s vaším predpokladom.

Krok 1: dokážte, v ktorej sieti je aplikácia

Čítajte vlastný pohľad aplikácie, nie stavový riadok. Z ConnectivityManager získajte aktívnu sieť, jej LinkProperties, zoznam serverov DNS a nastavenie súkromného DNS. Ak zoznam obsahuje resolver VPN, aplikácia má cestu k nemu; ak obsahuje resolver Wi-Fi, tunel nie je predvolená sieť pre ten proces.

Ikona VPN hovorí len to, že tunel existuje. Nehovorí, že proces aplikácie bol k nemu pripútaný, a Android nie vždy smeruje preklad mien cez sieť, ktorá vyzerá aktívne. Lokálne aplikácie VPN, ktoré preposielajú na iné zariadenie, siete Wi-Fi bez internetu a buildy výrobcov môžu nechať aplikáciu pýtať sa predvoleného resolvera namiesto serverov tunela.

Krok 2: vyžiadajte transport VPN a pripútajte proces

Keď aplikácia musí použiť resolver tunela, vyžiadajte sieť s transportom VPN a v callbacku pripútajte proces, aby kód nehádal, kedy sa sieť objaví:

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)
    }
})

Volanie zmení predvolenú sieť celého procesu, takže každý socket vytvorený po ňom ju používa. Už existujúce sockety si ponechávajú sieť, v ktorej vznikli, preto môže fond pripojení otvorený pred pripútaním ďalej prekladať po starej ceste. Návratová hodnota je boolean a výsledok false znamená, že pripútanie nenastalo; skúste to znova s krátkym oneskorením a zaznamenajte oba pokusy.

Krok 3: obmedzte pripútanie na to, čo ho potrebuje

Pripútanie celého procesu je hrubé. Telemetria, kontroly aktualizácií a SDK tretích strán sa tiež presúvajú na tunel, a ak tunel nemá internet, začnú zlyhávať. Pre jednu požiadavku použite továreň socketov siete a všetko ostatné nechajte na predvolenom nastavení zariadenia. Vedome vyberte jeden model: úzke pripútanie na pripojenie alebo pripútanie procesu s výslovným odpútaním, keď VPN zmizne.

Dve funkcie resolvera dokážu poraziť pripútanie bez akejkoľvek chyby. Súkromné DNS v prísnom režime posiela dopyty na pomenovaný server DoT namiesto resolvera siete a aplikácia s vlastným klientom DNS-over-HTTPS úplne obchádza systémový resolver. Skontrolujte oboje, kým usúdite, že pripútanie zlyhalo. Dopyt, ktorý nikdy nedorazí na server DNS VPN, sa neobjaví v žiadnom logu na strane tunela.

Krok 4: neverte obmedzeniu CONNECTED

NetworkType.CONNECTED v WorkManager znamená, že sieť je pripojená, a transport VPN ho splní aj vtedy, keď podkladové pripojenie Wi-Fi alebo mobilné spojenie zmizlo. Úloha beží, každá požiadavka zlyhá a politika opakovaní z toho urobí búrku, ktorá vyzerá ako chyba plánovania. Tunel je sieť; obmedzenie nikdy nebolo kontrolou internetu.

Skontrolujte schopnosť, ktorú práca naozaj potrebuje, napríklad overený prístup na internet, a udržujte obmedzenú politiku opakovaní s odstupom. Ak úloha potrebuje súkromné meno, preložte to meno vo vybranej sieti pred vykonaním práce a rýchlo zlyhajte s jasnou chybou namiesto opakovania požiadavky, ktorá nemôže uspieť.

Krok 5: zaznamenajte dôkazy a znova otestujte rozsah

Zaznamenajte typy transportu vybranej siete, servery DNS z LinkProperties, či pripútanie vrátilo true, a presnú chybu prvej požiadavky. Potom spustite súkromné meno a verejné meno pod tým istým pripútaním. Tá dvojica ukáže, či aplikácia použila resolver tunela alebo ticho klesla na predvolené nastavenie zariadenia, a to je rozdiel, ktorý používateľ pociťuje.

Zopakujte to na najstaršej podporovanej verzii Androidu a na jednom aktuálnom vydaní. Správanie resolvera, ktoré robí predvolenú cestu správnou, je presne to miesto, kde sa zariadenia a verzie líšia, a build, ktorý prejde len na najnovšom testovacom zariadení, nie je overený pre rozsah, ktorý dodávate. adb shell dumpsys connectivity je rýchly spôsob, ako potvrdiť, aké siete a schopnosti zariadenie hlási, kým reprodukujete poruchu.

Súvisiace články