Programu yako inaita VpnService.prepare, inapata null, inajenga handaki, na kielezaji kinaonekana halali, lakini hakuna kinachofika kwa seva. Au prepare inarudisha Intent, mtumiaji anaikubali, na establish bado inashindwa. Matokeo yote mawili kwa kawaida yanamaanisha kitu kimoja: programu nyingine inamiliki kiolesura cha VPN cha mtumiaji huyu, na miito yako ya protect inaweka alama kwenye soketi ambazo handaki yako haiwezi kutumia. Pitia ukaguzi ulio hapa chini kwa mpangilio na simama kwenye ule wa kwanza unaoshindwa, kwa sababu hatua ya baadaye haiwezi kurekebisha ile ya awali.

Kagua nafasi ya VPN kabla ya kugusa protect

Android inampa kila mtumiaji kiolesura kimoja tu cha VPN kinachotumika. Hii ni kanuni ya jukwaa, si ruhusa ambayo programu yako inaweza kuomba, kwa hiyo wateja wawili ambao wote wanataka kuwa handaki hawawezi kuishi pamoja.

VPN inayowashwa kila wakati iliyowekwa kwa programu nyingine ni kisa kigumu zaidi, kwa sababu mfumo unaendelea kuunganisha programu hiyo na unakataa kuchukua udhibiti. Kichujio cha trafiki kama AdGuard, mteja wa kampuni au VPN ya watumiaji inaweza kushikilia nafasi wakati mtumiaji amesahau kuwa imesakinishwa. Mwombe mtumiaji afungue Mipangilio na asome ingizo lililoorodheshwa chini ya VPN; jina hapo ndiye mmiliki unaoshindana naye. Hadi ingizo hilo likatwe au mpangilio wa kila wakati ufutwe, VpnService yako haiwezi kuwa kiolesura.

Hatua 1: soma kile prepare inarudisha

VpnService.prepare hujibu swali moja: je, programu hii inaweza kuwa VPN? Inarudisha null wakati idhini ipo tayari, na Intent wakati mtumiaji bado anapaswa kuidhinisha, ambayo unapaswa kuizindua kwa startActivityForResult. Chukulia kurudisha null kama ruhusa ya kuendelea, si uthibitisho kwamba establish itafanikiwa.

Intent intent = VpnService.prepare(context);
if (intent != null) {
    startActivityForResult(intent, REQUEST_VPN);
}

Ikiwa njia ya Intent inarudi na mtumiaji amekataa, prepare itaendelea kurudisha Intent kwenye jaribio lijalo. Rekodi msimbo wa matokeo badala ya kujaribu tena kwenye mzunguko, kwa sababu idhini iliyokataliwa ni uamuzi wa mtumiaji, si hitilafu ya muda.

Hatua 2: thibitisha kuwa kiolesura ni cha programu yako

Baada ya establish, ParcelFileDescriptor unayopokea ni uthibitisho wa umiliki wako, na inafaa kuikagua kabla ya kazi yoyote ya soketi. Kielezaji ambacho ni null au tayari kimefungwa kinamaanisha kiolesura hakikuundwa kamwe, hata kama hakuna ubaguzi uliojitokeza. Linganisha jina la kiolesura kutoka kwa builder na lile ambalo mfumo unaripoti kwa VPN inayotumika, ukitumia dumpsys kwenye kifaa cha majaribio. Ikiwa ni tofauti, handaki uliyojenga si handaki inayobeba trafiki.

adb shell dumpsys connectivity

Kutokubaliana huko huko kunaeleza aikoni iliyounganishwa na trafiki iliyokufa. Mfumo unaonyesha handaki ya programu nyingine, wakati msimbo wako unashikilia kielezaji cha kiolesura ambacho hakimiliki.

Hatua 3: ita protect kabla ya connect

Mara kiolesura kinapokuwepo, soketi ambazo programu yako inafungua huelekezwa kwenye handaki kwa chaguo-msingi. Usafirishaji wa nje hauwezi kufuata kanuni hiyo, vinginevyo pakiti iliyofungwa ingerudi kwenye kiolesura, kwa hiyo VpnService protect huweka alama kwenye soketi ili ipite VPN na itumie mtandao wa chini. Mwito unarudisha boolean, na kuipuuza ndiyo njia unayoishia na soketi inayoonekana mzima na haibeba kitu.

Ita protect kabla ya connect au bind, kamwe si baada. Ulinzi lazima uwe mahali kabla soketi haijaunganishwa au kufungwa, kwa sababu soketi iliyounganishwa tayari imechagua njia yake na protect ya baadaye haiisogezi kwa uhakika. Ikiwa protect inarudisha false, simama na kagua umiliki tena: inashindwa wakati kiolesura si cha programu yako, ambayo ndiyo hali hasa ambayo VPN nyingine huacha. Kurudisha false ni ishara ya kurudi Hatua 1, si kujaribu tena soketi hiyo hiyo.

DatagramSocket socket = new DatagramSocket();
if (!vpnService.protect(socket)) {
    return;
}
socket.connect(serverAddress, serverPort);

Hatua 4: funga mchakato wakati soketi ni ngumu

Baadhi ya usafirishaji si soketi moja: maktaba inaweza kufungua kadhaa, au unaweza kutaka kila muunganisho katika mchakato msaidizi utumie njia moja ya kutoka. ConnectivityManager.bindProcessToNetwork hufunga mchakato kwenye mtandao uliochaguliwa, na setProcessDefaultNetwork ya zamani ilifanya kazi hiyo hiyo kabla ya kuchakaa. Omba muunganisho wa chini kwa NET_CAPABILITY_NOT_VPN ili ufungaji uchague mtandao chini ya handaki yako na si handaki yenyewe.

NetworkRequest request = new NetworkRequest.Builder()
    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
    .build();

Kufunga mchakato si VPN ya pili. Huchagua njia ya kutoka kwa mchakato huo, ambayo ni muhimu kwa usafirishaji wako na haina maana kwa kuendesha handaki mbili kwa wakati mmoja.

Rekebisha kifaa cha mtumiaji, si njia ya msimbo

Hakuna API inayoruhusu programu mbili kushiriki nafasi ya VPN, kwa hiyo marekebisho ni ya hali ya kifaa. Mpe mtumiaji njia mbili mahususi: kata au futa kila wakati kwa programu nyingine ili prepare yako ichukue udhibiti, au fungua mipangilio kwa kila programu ya programu hiyo na uitoe programu yako kwenye handaki yake. Kutenga kunaendelea kuweka kichujio kikifanya kazi kwa kila kingine na kuruhusu programu yako kutumia muunganisho wa kawaida, ambayo mara nyingi ni matokeo ambayo mtumiaji anayataka kweli.

Andika njia zote mbili katika nyaraka zako za msaada, kwa sababu watumiaji mara chache hujua ni programu gani inamiliki VPN. Waombe watume jina la VPN inayotumika kutoka Mipangilio na matokeo ya prepare, establish na protect kutoka kwa kumbukumbu zako, na unaweza kusema ndani ya dakika moja ni hatua gani ilishindwa. Kisha thibitisha kwa trafiki halisi: utafutaji wa jina, muunganisho wa TCP na ombi moja kupitia handaki, si aikoni iliyounganishwa tu. Kielezaji halali na kiashiria cha kijani huthibitisha umiliki zaidi, kamwe si kwamba usafirishaji ulinusurika kanuni za uelekezaji.

Ikiwa ukaguzi wote wanne unapita na trafiki bado inakufa, umiliki si tatizo lako tena. Nenda kwa uelekezaji na upatikanaji wa seva, na jaribu vitambulisho hivyo hivyo kutoka kifaa kisicho na programu ya VPN iliyosakinishwa.

Makala zinazohusiana