Manhajarka tana kira VpnService.prepare, tana samun null, tana gina rami, kuma mai bayanin yana da kyau, amma babu abin da ke isa uwar garke. Ko kuma prepare ya dawo da Intent, mai amfani ya amince da shi, kuma establish ya kasa har yanzu. Dukansu sakamakon yawanci suna nufin abu ɗaya: wata manhaja ta riga ta mallaki haɗin VPN na wannan mai amfani, kuma kiran protect ɗinka yana yi wa sockets alama waɗanda raminka ba zai iya amfani da su ba. Bi binciken da ke ƙasa a jere kuma ka tsaya a na farko da ya kasa, domin mataki na gaba ba zai iya gyara na baya ba.

Duba wurin VPN kafin ka taɓa protect

Android yana ba kowane mai amfani haɗin VPN guda ɗaya kawai mai aiki. Wannan ƙa’ida ce ta dandali, ba izini ba da manhajarka za ta iya nema, don haka abokan ciniki biyu da dukansu suke son zama ramin ba za su iya kasancewa tare ba.

VPN na kowane lokaci da aka saita wa wata manhaja shi ne mafi wuya, domin tsarin yana riƙe da wannan manhajar a haɗe kuma yana ƙin karɓar mulki. Tacewar zirga-zirga kamar AdGuard, abokin ciniki na kamfani ko VPN na mabukaci na iya riƙe wurin yayin da mai amfani ya manta an shigar da shi. Ka ce wa mai amfani ya buɗe Saituna ya karanta shigarwar da ke ƙarƙashin VPN; sunan da ke wurin shi ne mai shi da kake fafatawa da shi. Har sai an cire wannan shigarwa ko an share saitin kowane lokaci, VpnService ɗinka ba zai iya zama haɗin ba.

Mataki 1: karanta abin da prepare ke dawo da shi

VpnService.prepare yana amsa tambaya ɗaya: shin wannan manhaja za ta iya zama VPN? Yana dawo da null idan yarda ta riga ta kasance, da Intent idan mai amfani har yanzu dole ya amince da shi, wanda dole ne ka ƙaddamar da startActivityForResult. Ɗauki dawowar null a matsayin izinin ci gaba, ba a matsayin hujjar cewa establish zai yi nasara ba.

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

Idan hanyar Intent ta dawo kuma mai amfani ya ƙi, prepare zai ci gaba da dawo da Intent a yunƙuri na gaba. Yi rikodin lambar sakamako maimakon sake gwadawa a madauki, domin yarda da aka ƙi shi ne shawarar mai amfani, ba kuskure na wucin gadi ba.

Mataki 2: tabbatar da cewa haɗin na manhajarka ne

Bayan establish, ParcelFileDescriptor da ka karɓa shi ne hujjar mallakarka, kuma ya dace ka duba shi kafin kowane aiki na socket. Mai bayanin da yake null ko an riga an rufe shi yana nufin ba a taɓa ƙirƙirar haɗin ba, ko da babu wani musgunawa da ya bayyana. Kwatanta sunan haɗin daga builder da wanda tsarin ke bayarwa don VPN mai aiki, ta amfani da dumpsys a na’urar gwaji. Idan sun bambanta, ramin da ka gina ba shi ne ramin da ke ɗaukar zirga-zirga ba.

adb shell dumpsys connectivity

Irin wannan sabani yana bayanin gunƙi mai alaƙa da mataccen zirga-zirga. Tsarin yana nuna ramin wata manhajar, yayin da lambar ka ke riƙe da mai bayanin haɗin da ba ya mallaka.

Mataki 3: kira protect kafin connect

Da zarar haɗin ya kasance, sockets da manhajarka ta buɗe ana tura su cikin ramin ta hanyar da ta dace. Jigilar waje ba za ta iya bin wannan ƙa’idar ba in ba haka ba fakitin da aka lulluɓe zai koma cikin haɗin, saboda haka VpnService protect yana yi wa socket alama don ya wuce VPN kuma ya yi amfani da cibiyar sadarwar da ke ƙasa. Kiran yana dawo da boolean, kuma yin watsi da shi shi ne hanyar da za ka ƙarasa da socket mai kama da lafiya wanda ba ya ɗaukar komai.

Kira protect kafin connect ko bind, ba bayan ba. Dole kariya ta kasance kafin a haɗa ko a ɗaure socket, domin socket da aka haɗa ya riga ya zaɓi hanyarsa kuma protect na baya ba ya motsa shi da aminci. Idan protect ya dawo da false, tsaya ka sake duba mallaka: yana kasa sa’ad da haɗin ba na manhajarka ba, wanda shi ne ainihin yanayin da wani VPN ke bari. Dawowar false alama ce ta komawa Mataki 1, ba sake gwada wannan socket ba.

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

Mataki 4: ɗaure tsari sa’ad da socket ya yi wahala

Wasu jigila ba socket ɗaya ba ne: ɗakin karatu na iya buɗe da yawa, ko kana so kowace haɗi a cikin tsarin taimako ta yi amfani da fita ɗaya. ConnectivityManager.bindProcessToNetwork yana ɗaure tsarin ga cibiyar sadarwar da aka zaɓa, kuma tsohon setProcessDefaultNetwork ya yi irin wannan aiki kafin a daina amfani da shi. Nemi haɗin da ke ƙasa da NET_CAPABILITY_NOT_VPN domin ɗaurin ya zaɓi cibiyar sadarwar da ke ƙarƙashin raminka ba ramin kansa ba.

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

Ɗaure tsari ba VPN na biyu ba ne. Yana zaɓar fita ga wannan tsari, wanda ke da amfani ga jigilarka kuma ba shi da amfani wajen gudanar da ramuka biyu a lokaci ɗaya.

Gyara na’urar mai amfani, ba hanyar lambar ba

Babu wani API da ke barin manhajoji biyu su raba wurin VPN, don haka gyaran ya shafi yanayin na’urar. Ba wa mai amfani hanyoyi biyu tabbatattu: cire haɗin ko share kowane lokaci na wata manhajar domin prepare ɗinka ya karɓi mulki, ko buɗe saitunan kowace manhaja na waccan manhajar ka kuma keɓe manhajarka daga raminta. Keɓewar tana riƙe da tacewa tana aiki ga komai sauran kuma tana barin manhajarka ta yi amfani da haɗin yau da kullum, wanda sau da yawa shi ne sakamakon da mai amfani yake so a zahiri.

Rubuta hanyoyin biyu cikin takardun tallafinka, domin masu amfani ba safai suke sanin wace manhaja ce ta mallaki VPN ba. Ka ce su aiko da sunan VPN mai aiki daga Saituna da sakamakon prepare, establish da protect daga bayananka, kuma za ka iya faɗi cikin minti ɗaya wane mataki ya kasa. Sannan tabbatar da zirga-zirga na gaske: neman suna, haɗin TCP da buƙata ɗaya ta cikin ramin, ba gunƙi mai alaƙa kawai ba. Mai bayani mai inganci da alama mai kore suna tabbatar da mallaka a mafi kyawu, ba wai cewa jigilar ta tsira daga ƙa’idodin turawa ba.

Idan duk binciken huɗu sun wuce kuma zirga-zirga har yanzu yana mutuwa, mallaka ba matsalarka ba ce kuma. Ci gaba zuwa tura hanya da isar uwar garke, ka gwada irin waɗannan takardun shaidar daga na’urar da ba a shigar da manhajar VPN a ciki ba.

Labarai masu alaƙa