Glaonn d’fheidhmchlár VpnService.prepare, faigheann null ar ais, tógann tollán, agus breathnaíonn an tuairisceoir bailí, ach ní shroicheann aon rud an freastalaí. Nó filleann prepare ar Intent, ceadaíonn an t-úsáideoir é, agus teipeann ar establish fós. De ghnáth ciallaíonn an dá thoradh an rud céanna: tá comhéadan VPN an úsáideora seo ag feidhmchlár eile cheana féin, agus tá do ghlaonna protect ag marcáil soicéad nach féidir le do thollán a úsáid. Téigh trí na seiceálacha thíos in ord agus stad ag an gcéad cheann a theipeann, mar ní féidir le céim níos déanaí céim níos luaithe a dheisiú.

Seiceáil an sliotán VPN sula dtagann tú ar protect

Tugann Android d’úsáideoir ar bith go díreach aon chomhéadan VPN gníomhach amháin. Riail ardáin atá anseo, ní cead is féidir le d’fheidhmchlár a iarraidh, mar sin ní féidir le dhá chliaint ar mhaith leo an tollán a bheith acu maireachtáil le chéile.

Is é an VPN i gcónaí ar siúl atá socraithe d’fheidhmchlár eile an cás is deacra, mar choinníonn an córas an feidhmchlár sin nasctha agus diúltaíonn sé do ghlacadh seilbhe. Is féidir le scagaire tráchta ar nós AdGuard, le cliant corparáideach nó le VPN tomhaltóra an sliotán a choinneáil fad a bhfuil dearmad déanta ag an úsáideoir go bhfuil sé suiteáilte. Iarr ar an úsáideoir Socruithe a oscailt agus an iontráil atá liostáilte faoi VPN a léamh; is é an t-ainm ansin an t-úinéir a bhfuil tú in iomaíocht leis. Go dtí go ndéantar an iontráil sin a dhínascadh nó go nglantar an socrú i gcónaí ar siúl, ní féidir le do VpnService a bheith ina chomhéadan.

Céim 1: léigh a bhfuil prepare ag filleadh

Freagraíonn VpnService.prepare ceist amháin: an bhféadfaidh an feidhmchlár seo a bheith ina VPN? Filleann sé null nuair a bhíonn toiliú ann cheana féin, agus Intent nuair a chaithfidh an t-úsáideoir é a cheadú fós, a chaithfidh tú a sheoladh le startActivityForResult. Caith le filleadh null mar chead leanúint ar aghaidh, ní mar chruthúnas go n-éireoidh le establish.

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

Má fhilleann an cosán Intent agus má dhiúltaigh an t-úsáideoir, leanfaidh prepare ar aghaidh ag filleadh Intent ar an gcéad iarracht eile. Logáil an cód toraidh in ionad triail a bhaint as arís i lúb, mar is cinneadh úsáideora é toiliú diúltaithe, ní earráid shealadach.

Céim 2: deimhnigh gur le d’fheidhmchlár an comhéadan

Tar éis establish, is é an ParcelFileDescriptor a fhaigheann tú do chruthúnas úinéireachta, agus is fiú é a sheiceáil roimh aon obair soicéid. Ciallaíonn tuairisceoir atá null nó dúnta cheana féin nár cruthaíodh an comhéadan riamh, fiú mura dtagann aon eisceacht chun solais. Cuir ainm an chomhéadain ón builder i gcomparáid leis an gceann a thuairiscíonn an córas don VPN gníomhach, ag úsáid dumpsys ar ghléas tástála. Má tá siad difriúil, ní hé an tollán a thóg tú an tollán atá ag iompar tráchta.

adb shell dumpsys connectivity

Míníonn an mhí-chomhsheasmhacht chéanna deilbhín nasctha le trácht marbh. Taispeánann an córas tollán an fheidhmchláir eile, agus tá tuairisceoir ag do chód do chomhéadan nach leis.

Céim 3: glaoigh ar protect roimh connect

Nuair a bhíonn an comhéadan ann, déantar soicéid a osclaíonn d’fheidhmchlár a ródú isteach sa tollán de réir réamhshocraithe. Ní féidir leis an iompar seachtrach an riail sin a leanúint nó rachadh an paicéad imfhálaithe ar ais isteach sa chomhéadan, mar sin VpnService protect marcálann soicéad chun an VPN a sheachaint agus an líonra bunúsach a úsáid. Filleann an glao boolean, agus is é a neamhaird an bealach a chríochnaíonn tú le soicéad a bhreathnaíonn sláintiúil agus nach n-iompraíonn aon rud.

Glaoigh ar protect roimh connect nó bind, riamh ina dhiaidh. Caithfidh an chosaint a bheith i bhfeidhm sula ndéantar an soicéad a nascadh nó a cheangal, mar tá a ród roghnaithe cheana féin ag soicéad nasctha agus ní bhogann protect níos déanaí go hiontaofa é. Má fhilleann protect false, stad agus seiceáil úinéireacht arís: teipeann air nuair nach leis d’fheidhmchlár an comhéadan, agus sin go díreach an staid a fhágann VPN eile. Is comhartha é filleadh false dul ar ais go Céim 1, ní an soicéad céanna a thriail arís.

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

Céim 4: ceangail próiseas nuair a bhíonn soicéad míchompordach

Ní soicéad amháin roinnt iompar: féadfaidh leabharlann roinnt a oscailt, nó b’fhéidir gur mhaith leat go n-úsáidfeadh gach nasc i bpróiseas cúnta an t-aslú céanna. Ceanglaíonn ConnectivityManager.bindProcessToNetwork an próiseas le líonra roghnaithe, agus rinne an setProcessDefaultNetwork níos sine an obair chéanna sular cuireadh as feidhm é. Iarr an nasc bunúsach le NET_CAPABILITY_NOT_VPN ionas go roghnóidh an ceangal an líonra faoi do thollán seachas an tollán féin.

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

Ní VPN eile é próiseas a cheangal. Roghnaíonn sé aslú don phróiseas sin, rud atá úsáideach do do iompar agus gan úsáid chun dhá thollán a rith ag an am céanna.

Deisigh gléas an úsáideora, ní cosán an chóid

Níl aon API a ligeann do dhá fheidhmchlár an sliotán VPN a roinnt, mar sin baineann an deisiú le staid an ghléis. Tairg dhá chosán nithiúla don úsáideoir: díphlugáil nó glan i gcónaí ar siúl don fheidhmchlár eile ionas gur féidir le do prepare seilbh a ghlacadh, nó oscail socruithe in aghaidh an aipe an fheidhmchláir sin agus eisigh d’fheidhmchlár óna thollán. Coinníonn an t-eisiamh an scagaire ag rith do gach rud eile agus ligeann do d’fheidhmchlár an gnáthnasc a úsáid, rud is minic a bhíonn mar thoradh ag an úsáideoir i ndáiríre.

Scríobh an dá chosán i do dhoiciméadú tacaíochta, mar is annamh a bhíonn a fhios ag úsáideoirí cé acu feidhmchlár a shealbhaíonn an VPN. Iarr orthu ainm an VPN ghníomhaigh ó Shocruithe agus torthaí prepare, establish agus protect ó do logaí a sheoladh, agus is féidir leat a rá laistigh de nóiméad cé an chéim a theip. Ansin fíoraigh le trácht fíor: cuardach ainm, nasc TCP agus aon iarraidh amháin tríd an tollán, ní deilbhín nasctha amháin. Cruthaíonn tuairisceoir bailí agus táscaire glas úinéireacht ar a fheabhas, ach riamh go maireann an t-iompar na rialacha ródaithe.

Má éiríonn leis na ceithre sheiceáil agus má fhaigheann an trácht bás fós, ní do fhadhb an úinéireacht a thuilleadh. Téigh ar aghaidh go ródú agus inrochtaineacht an fhreastalaí, agus tástáil na dintiúir chéanna ó ghléas gan aon fheidhmchlár VPN suiteáilte.

Ailt ghaolmhara