Rydych chi'n tapio'r rhes VPN yn Gosodiadau, yn gweld proffil a osodwyd gan rywun arall, ac yn dechrau chwilio am yr alwad sy'n ychwanegu un. Nid oes alwad o'r fath. Gall ap agor twnnel ei hun drwy VpnService, ond mae'r cofnodion yn y rhestr honno yn perthyn i'r platfform ac i ba bynnag gleient a'u crëodd. Mae gwybod yn union ble mae'r llinell yn gorwedd yn arbed wythnos i chi o hela dosbarthau cudd.

Dechreuwch gyda'r hyn y mae'r sgrin Gosodiadau yn ei ddangos

Mae'r rhestr VPN yn gofrestr o broffiliau a osodwyd gan y system neu gleient gwerthwr: PPTP, L2TP/IPsec, IKEv2, a pha resymau bynnag a wthiwyd gan ap OEM neu MDM. Mae pob rhes yn cario cyfeiriad gweinydd, manylion mewngofnodi a gweithrediad protocol sy'n byw y tu allan i'ch proses. Pan fydd y defnyddiwr yn tapio Cysylltu yno, cleient y platfform sy'n codi'r twnnel, nid eich cod. Dyna pam mae'r rhes yn goroesi ailgychwyn a pham nad yw dad-osod eich ap byth yn ei dileu.

O safbwynt y defnyddiwr mae'r rhestr yn edrych fel arwyneb API, lle y dylai ychwanegu VPN fod un bwriad i ffwrdd. Nid yw. Yr unig bwyntiau mynediad cyhoeddus sy'n cyffwrdd â hi yw bwriadau llywio, ac mae popeth sy'n ysgrifennu iddi yn perthyn i'r platfform neu i gydran freintiedig.

Canlyniad ymarferol: os yw sgript cymorth yn dweud wrth ddefnyddwyr am ychwanegu'r proffil yn Gosodiadau, nid yw eich ap yn rhan o'r ffrwd honno o gwbl.

Yr hyn y mae VpnService yn ei roi i chi mewn gwirionedd

Mae VpnService a VpnService.Builder yn disgrifio un twnnel sy'n eiddo i'ch ap. Rydych chi'n ychwanegu cyfeiriadau, llwybrau, gweinyddion DNS ac MTU, yn cwmpasu traffig gydag addAllowedApplication() neu addDisallowedApplication(), ac yna mae establish() yn dychwelyd ParcelFileDescriptor ar gyfer rhyngwyneb TUN. O'r pwynt hwnnw mae'r ap yn darllen pecynnau IP ac yn ysgrifennu atebion, sy'n golygu bod y protocol yn eiddo i chi i'w weithredu neu ei wreiddio: OpenVPN, WireGuard, cludiant addasiedig.

Nid oes dim yn y dilyniant hwnnw yn siarad PPTP, L2TP/IPsec nac IKEv2. Nid oes gan Builder switsh sy'n dweud defnyddia gleient L2TP y system, ac nid oes galwad yn ôl sy'n gadael i chi yrru proffil y mae'r platfform eisoes yn berchen arno. Dyna'r gwir ffin, a ffin dylunio yw hi yn hytrach na bwlch mewn caniatâd.

Felly gall ap fod yn gleient VPN ar Android yn bendant. Ni all fod yn rheolwr i'r cleientiaid sy'n dod gyda'r ffôn.

Nid yw'r deialog cydsyniad yn addurn

Gan fod eich twnnel yn gallu cipio traffig apiau eraill, mae'r system yn gorfodi'r defnyddiwr i'w gymeradwyo'n benodol. Mae prepare() yn dychwelyd Intent y mae'n rhaid i chi ei lansio, mae'r cymeradwyaeth yn rhwym wrth eich pecyn, ac tra bo'r twnnel i fyny mae'r bar statws yn dangos dangosydd parhaus. Mae ail VPN yn codi yn anweithio'r cyntaf, gan fod Android yn rhedeg un VPN gweithredol ar y tro.

Mae'r rheol un-gweithredol honno yn baglu pobl wrth brofi. Rydych chi'n codi'ch twnnel tra bo cleient corfforaethol wedi'i gysylltu ac yn dod i'r casgliad bod eich cod wedi torri, pan fo'r platfform wedi newid oddi wrth y cleient arall yn syml. Gellir tynnu cymeradwyaethau'n ôl yn ddiweddarach, a gall prepare() ddychwelyd null ar ddyfeisiau lle mae'r gweithgaredd cydsyniad ar goll, felly rhaid i establish() ddelio â methiant o hyd.

API cudd a bwriadau gosodiadau

Mae atebion hŷn yn pwyntio at ddosbarthau com.android.internal a rhyngwynebau AIDL y mae'r cleient adeiledig yn eu defnyddio. Nid ydynt yn yr SDK, maent yn newid rhwng datganiadau heb rybudd, ac mae siopau apiau yn trin y mynediad hwnnw fel risg. Nid yw gwreiddio'r ddyfais yn eu gwneud yn sefydlog chwaith, gan fod root a mynediad i API cudd yn broblemau digyswllt.

Y cymorth llywio a gefnogir yw Settings.ACTION_VPN_SETTINGS, a'i werth yw android.net.vpn.SETTINGS. Datryswch ef cyn lansio, gan nad yw rhai adeilediadau OEM yn cludo'r gweithgaredd hwnnw, a dychwelwch at gamau ysgrifenedig pan fydd y datrysiad yn methu. Mae'n mynd â'r defnyddiwr i'r sgrin ac yn cyflunio dim.

Llwybrau perchennog dyfais a MDM yw'r eithriad y mae pobl fel arfer yn ei olygu. Gall DevicePolicyManager ddynodi pecyn VPN bob amser ymlaen, a gall cyfluniadau a reolir raglwytho gosodiadau ar gyfer cleient sy'n eu cefnogi, ond nid yw hynny o hyd yn SDK cyhoeddus yn awduro proffil PPTP.

Cerddwch y penderfyniad o ochr y defnyddiwr

Os oes angen i'ch cynnyrch gario traffig, cynlluniwch ar gyfer VpnService ynghyd â stac protocol go iawn, a chyllidebwch amser ar gyfer y ffrwd cydsyniad a'r rheol un-VPN. Os mai'r nod yw cysylltu â phroffil corfforaethol sy'n bodoli eisoes, eich gwaith chi yw arwain: dolen ddwfn i'r sgrin osodiadau, dogfennu'r meysydd, a gadewch i gleient y platfform wneud y twnelu. Os mai dim ond cyrraedd pwynt terfyn preifat sydd ei angen ar yr ap, nid oes angen twnnel ei hun arno o gwbl.

Ysgrifennwch y penderfyniad hwnnw cyn i chi ysgrifennu cod, gan fod y tair llwybr bron â dim yn gyffredin ar ôl y sprint cyntaf.

Gwiriad olaf cyn i chi ddechrau: a yw'r gofyniad yn dweud bod ein hap yn cysylltu, neu fod y ddyfais yn cysylltu? Y cyntaf yw VpnService, yr ail yw proffil na allwch ei greu. Mae cael y frawddeg honno'n iawn yn rhatach na dim ailstrwythuro.

Erthyglau cysylltiedig