Android қолданбасы ішкі атауды шеше алмайды, ал VPN клиентінің өз браузері оған жетеді және сол бір құрастыру басқа телефонда жұмыс істейді. URL — айнымалы емес. Айнымалы — қолданба процесіне шешу үшін қай желіні пайдалануға рұқсат етілгені, және Android белсенді VPN сіздің сокеттеріңіз қолданатын желі екеніне кепілдік бермейді. Бұл тексерулерді ретімен орындаңыз және resolver суреті болжамыңызға сай келмегенде тоқтаңыз.

1-қадам: қолданбаның қай желіде екенін дәлелдеңіз

Күй жолағын емес, қолданбаның өз көрінісін оқыңыз. ConnectivityManager арқылы белсенді желіні, оның LinkProperties, DNS серверлер тізімін және жеке DNS параметрін алыңыз. Егер тізімде VPN resolverі болса, қолданбаның оған жолы бар; егер онда Wi-Fi resolverі болса, туннель сол процесс үшін әдепкі желі емес.

VPN белгішесі туннель бар екенін ғана айтады. Ол қолданба процесінің оған байланғанын айтпайды, және Android атауларды шешуді әрдайым белсенді көрінетін желі арқылы бағыттай бермейді. Басқа құрылғыға жіберетін жергілікті VPN қолданбалары, интернеті жоқ Wi-Fi желілері және өндіруші құрастырулары қолданбаны туннель серверлерінің орнына әдепкі resolverден сұрауда қалдыруы мүмкін.

2-қадам: VPN тасымалын сұраңыз және процесті байлаңыз

Қолданба туннель resolverін міндетті түрде пайдалануы керек болса, VPN тасымалы бар желіні сұраңыз және кері шақыруда процесті байлаңыз, сонда код желі қашан пайда болатынын болжамайды:

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

Шақыру бүкіл процестің әдепкі желісін өзгертеді, сондықтан одан кейін жасалған әрбір сокет оны пайдаланады. Бұрыннан бар сокеттер жасалған желісін сақтайды, сондықтан байлауға дейін ашылған қосылымдар пулы ескі жолмен шешуді жалғастыруы мүмкін. Қайтарылатын мән — boolean, ал false нәтиже байлау болмағанын білдіреді; қысқа кідіріспен қайталап көріңіз және екі әрекетті де журналға жазыңыз.

3-қадам: байлауды қажет нәрсемен шектеңіз

Бүкіл процесті байлау дөрекі. Телеметрия, жаңартуларды тексеру және үшінші тарап SDK-лары да туннельге ауысады, ал туннельде интернет болмаса, олар істен шыға бастайды. Бір сұраныс үшін желінің сокет фабрикасын қолданыңыз, ал қалғанының бәрін құрылғының әдепкісінде қалдырыңыз. Бір модельді әдейі таңдаңыз: әр қосылым үшін тар байлау немесе VPN жоғалғанда анық ажыратумен процесс байлауы.

Resolverдің екі мүмкіндігі байлауды қатесіз жеңе алады. Қатаң режимдегі жеке DNS сұраныстарды желі resolverінің орнына аталған DoT серверіне жібереді, ал өз DNS-over-HTTPS клиентімен келетін қолданба жүйе resolverін толығымен айналып өтеді. Байлау сәтсіз болды деп қорытынды жасамас бұрын екеуін де тексеріңіз. VPN-нің DNS серверіне ешқашан жетпейтін сұраныс туннель жағындағы ешбір журналда көрінбейді.

4-қадам: CONNECTED шектеуіне сенбеңіз

WorkManager-дегі NetworkType.CONNECTED желі қосылғанын білдіреді, және VPN тасымалы астындағы Wi-Fi немесе ұялы байланыс жоғалған кезде де оны қанағаттандырады. Тапсырма орындалады, әр сұраныс сәтсіз аяқталады, ал қайталау саясаты оны жоспарлау қатесіне ұқсайтын дауылға айналдырады. Туннель — желі; шектеу ешқашан интернет тексерісі болған емес.

Жұмысқа шын мәнінде қажет қабілетті тексеріңіз, мысалы расталған интернет қолжетімділігін, және кері шегінуі бар шектеулі қайталау саясатын ұстаныңыз. Егер тапсырмаға жеке атау қажет болса, жұмысты орындамас бұрын сол атауды таңдалған желіде шешіңіз, және сәтті бола алмайтын сұранысты қайталаудың орнына нақты қатемен тез тоқтаңыз.

5-қадам: дәлелдерді жазып алыңыз және ауқымды қайта тексеріңіз

Таңдалған желінің тасымал түрлерін, LinkProperties-тен алынған DNS серверлерін, байлау true қайтарды ма, және бірінші сұраныстың нақты сәтсіздігін журналға жазыңыз. Содан кейін сол байлау астында жеке атауды және жария атауды іске қосыңыз. Бұл жұп қолданба туннель resolverін пайдаланды ма, әлде үнсіз құрылғының әдепкісіне қайтты ма, соны көрсетеді, және бұл пайдаланушы сезінетін айырмашылық.

Қолдайтын ең ескі Android нұсқасында және бір ағымдағы шығарылымда қайталаңыз. Әдепкі жолды дұрыс көрсететін resolver мінез-құлқы — құрылғылар мен нұсқалар ерекшеленетін дәл сол жер, ал тек ең жаңа сынақ құрылғысында өтетін құрастыру сіз жеткізетін ауқым үшін тексерілмеген. adb shell dumpsys connectivity — ақауды қайта жаңғыртып жатқанда құрылғы қандай желілер мен қабілеттерді хабарлайтынын жылдам растаудың жолы.

Қатысты мақалалар