Programu ya Android inashindwa kutua jina la ndani wakati kivinjari cha mteja wa VPN yenyewe kinakifikia, na build hiyo hiyo inafanya kazi kwenye simu nyingine. URL si kigezo. Kigezo ni mtandao ambao mchakato wa programu unaruhusiwa kutumia kwa utatuzi, na Android haihakikishi kwamba VPN inayofanya kazi ndiyo mtandao unaotumiwa na soketi zako. Fanya ukaguzi huu kwa mpangilio na usimame wakati picha ya resolver haitafanana na dhana yako.

Hatua 1: thibitisha ni mtandao upi programu iko

Soma mwonekano wa programu yenyewe, si upau wa hali. Kutoka ConnectivityManager, pata mtandao unaofanya kazi, LinkProperties wake, orodha ya seva za DNS na mpangilio wa DNS wa faragha. Ikiwa orodha ina resolver ya VPN, programu ina njia kuelekea kwake; ikiwa ina resolver ya Wi-Fi, handaki si mtandao chaguo-msingi kwa mchakato huo.

Aikoni ya VPN inasema tu kwamba handaki lipo. Haisemi kwamba mchakato wa programu ulifungwa nalo, na Android huwa haielekezi utatuzi wa majina kupitia mtandao unaoonekana hai. Programu za VPN za ndani zinazopeleka kwenye kifaa kingine, mitandao ya Wi-Fi isiyo na intaneti na build za watengenezaji zote zinaweza kumwacha mtumiaji akiuliza resolver chaguo-msingi badala ya seva za handaki.

Hatua 2: omba usafirishaji wa VPN na ufunge mchakato

Wakati programu inapaswa kutumia resolver ya handaki, omba mtandao wenye usafirishaji wa VPN na ufunge mchakato kwenye callback, ili msimbo usikisie wakati mtandao utaonekana:

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

Wito hubadilisha mtandao chaguo-msingi wa mchakato wote, kwa hiyo kila soketi inayoundwa baadaye hutumia huo. Soketi zilizopo tayari hubaki na mtandao zilizoundwa nao, ndiyo sababu bwawa la miunganisho lililofunguliwa kabla ya kufunga linaweza kuendelea kutua kwa njia ya zamani. Thamani inayorejeshwa ni boolean, na matokeo ya false humaanisha kufunga hakukutokea; jaribu tena kwa ucheleweshaji mfupi na uandike majaribio yote mawili.

Hatua 3: weka kufunga ndani ya kile kinachokihitaji

Kufunga kwa mchakato wote ni kukali. Telemetry, ukaguzi wa masasisho na SDK za wahusika wengine pia huhamia kwenye handaki, na ikiwa handaki halina intaneti huanza kushindwa. Kwa ombi moja, tumia kiwanda cha soketi cha mtandao na uache chaguo-msingi la kifaa kwa kila kitu kingine. Chagua model moja kwa makusudi: kufunga nyembamba kwa kila muunganisho, au kufunga kwa mchakato na kufungua wazi wakati VPN inapotea.

Vipengele viwili vya resolver vinaweza kushinda kufunga bila kosa lolote. DNS ya faragha katika hali kali hutuma maswali kwa seva ya DoT iliyotajwa badala ya resolver ya mtandao, na programu inayokuja na mteja wake wa DNS-over-HTTPS hupita kabisa resolver ya mfumo. Kagua vyote viwili kabla ya kuhitimisha kwamba kufunga kumeshindwa. Swali ambalo halifikii kamwe seva ya DNS ya VPN halitaonekana kwenye log yoyote ya upande wa handaki.

Hatua 4: usiamini kizuizi cha CONNECTED

NetworkType.CONNECTED katika WorkManager humaanisha mtandao umeunganishwa, na usafirishaji wa VPN hukidhi hilo hata wakati kiungo cha Wi-Fi au cha simu kilicho chini yake kimepotea. Kazi inaendeshwa, kila ombi linashindwa, na sera ya kujaribu tena huigeuza kuwa dhoruba inayoonekana kama hitilafu ya upangaji. Handaki ni mtandao; kizuizi hakikuwa kamwe ukaguzi wa intaneti.

Kagua uwezo ambao kazi inauhita kweli, kama ufikiaji wa intaneti uliothibitishwa, na uweke sera ndogo ya kujaribu tena na kurudi nyuma. Ikiwa kazi inahitaji jina la faragha, tatua jina hilo kwenye mtandao uliochaguliwa kabla ya kufanya kazi, na shindwa haraka kwa kosa lililo wazi badala ya kurudia ombi ambalo haliwezi kufanikiwa.

Hatua 5: andika ushahidi na ujaribu upya masafa

Andika aina za usafirishaji za mtandao uliochaguliwa, seva za DNS kutoka LinkProperties, ikiwa kufunga kulirejesha true, na kushindwa kamili kwa ombi la kwanza. Kisha endesha jina la faragha na jina la umma chini ya kufunga kulekule. Jozi hilo linaonyesha ikiwa programu ilitumia resolver ya handaki au ilirudi kimya kwa chaguo-msingi la kifaa, na hiyo ndiyo tofauti ambayo mtumiaji huipata.

Rudia kwenye toleo la zamani zaidi la Android unalolisaidia na kwenye toleo moja la sasa. Tabia ya resolver inayofanya njia chaguo-msingi ionekane sahihi ndiyo mahali hasa ambapo vifaa na matoleo hutofautiana, na build inayopita tu kwenye kifaa kipya zaidi cha majaribio haijathibitishwa kwa masafa unayosafirisha. adb shell dumpsys connectivity ni njia ya haraka ya kuthibitisha mitandao na uwezo ambao kifaa huripoti unapozalisha hitilafu.

Makala zinazohusiana