V Nastavitvah se dotaknete vrstice VPN, vidite profil, ki ga je namestil nekdo drug, in začnete iskati klic, ki ga doda. Takega klica ni. Aplikacija lahko odpre svoj tunel prek VpnService, vendar vnosi na tem seznamu pripadajo platformi in tistemu odjemalcu, ki jih je ustvaril. Natančno vedenje, kje je meja, vam prihrani teden lova za skritimi razredi.

Začnite s tem, kar prikazuje zaslon Nastavitve

Seznam VPN je register profilov, ki jih je namestil sistem ali odjemalec proizvajalca: PPTP, L2TP/IPsec, IKEv2 in vrstice, ki jih je porinila aplikacija OEM ali MDM. Vsaka vrstica nosi naslov strežnika, poverilnice in izvedbo protokola, ki živi zunaj vašega procesa. Ko uporabnik tam tapne Poveži, tunel dvigne odjemalec platforme, ne vaša koda. Zato vrstica preživi ponovni zagon in zato je odstranitev vaše aplikacije nikoli ne odstrani.

Z vidika uporabnika je seznam videti kot površina API, kraj, kjer bi moralo biti dodajanje VPN oddaljeno eno namero. Ni. Edine javne vstopne točke, ki se ga dotikajo, so navigacijske namere, in vse, kar vanj piše, pripada platformi ali privilegirani komponenti.

Praktična posledica: če besedilo za podporo uporabnikom pravi, naj profil dodajo v Nastavitvah, vaša aplikacija sploh ni del tega toka.

Kaj vam VpnService v resnici da

VpnService in VpnService.Builder opisujeta en tunel, ki ga ima v lasti vaša aplikacija. Dodate naslove, poti, strežnike DNS in MTU, omejite promet z addAllowedApplication() ali addDisallowedApplication(), nato establish() vrne ParcelFileDescriptor za vmesnik TUN. Od tega trenutka aplikacija bere pakete IP in piše odgovore, kar pomeni, da je protokol vaš za izvedbo ali vgradnjo: OpenVPN, WireGuard, lasten transport.

Nič v tem zaporedju ne govori PPTP, L2TP/IPsec ali IKEv2. Builder nima stikala, ki bi reklo uporabi sistemskega odjemalca L2TP, in ni povratnega klica, ki bi vam omogočil upravljanje profila, ki ga platforma že ima. To je resnična meja in je meja zasnove, ne vrzel v dovoljenjih.

Aplikacija je torej lahko povsem odjemalec VPN na Androidu. Le upravitelj odjemalcev, ki pridejo s telefonom, ne more biti.

Pogovor o soglasju ni okras

Ker lahko vaš tunel zajame promet drugih aplikacij, sistem zahteva, da ga uporabnik izrecno odobri. prepare() vrne Intent, ki ga morate zagnati, odobritev je vezana na vaš paket, in dokler je tunel aktiven, vrstica stanja prikazuje trajni indikator. Drugi VPN, ki se dvigne, deaktivira prvega, ker Android izvaja en aktivni VPN naenkrat.

To pravilo enega aktivnega ljudi spotakne pri testiranju. Dvignete svoj tunel, medtem ko je povezan poslovni odjemalec, in sklepate, da je vaša koda pokvarjena, platforma pa je preprosto preklopila z drugega odjemalca. Odobritve je mogoče pozneje preklicati, in prepare() lahko vrne null na napravah, kjer manjka dejavnost soglasja, zato mora establish() še vedno obravnavati neuspeh.

Skriti API-ji in namere nastavitev

Starejši odgovori kažejo na razrede com.android.internal in vmesnike AIDL, ki jih uporablja vgrajeni odjemalec. Niso v SDK, med izdajami se spreminjajo brez obvestila in trgovine z aplikacijami obravnavajo ta dostop kot tveganje. Root naprave jih tudi ne naredi stabilnih, ker sta root in dostop do skritih API nepovezana problema.

Podprta navigacijska pomoč je Settings.ACTION_VPN_SETTINGS, katere vrednost je android.net.vpn.SETTINGS. Razrešite jo pred zagonom, ker nekatere različice OEM te dejavnosti ne priložijo, in ko razrešitev spodleti, preidite na pisne korake. Uporabnika pripelje na zaslon in ničesar ne nastavi.

Poti lastnika naprave in MDM so izjema, ki jo ljudje običajno mislijo. DevicePolicyManager lahko določi paket stalno vklopljenega VPN, upravljane konfiguracije pa lahko prednaložijo nastavitve za odjemalca, ki jih podpira, a to še vedno ni javni SDK, ki piše profil PPTP.

Prehodite odločitev z vidika uporabnika

Če mora vaš izdelek prenašati promet, načrtujte VpnService in pravi protokolni sklad ter predvidite čas za tok soglasja in pravilo enega VPN. Če je cilj povezati se z obstoječim poslovnim profilom, je vaše delo vodenje: globoka povezava na zaslon z nastavitvami, dokumentiranje polj in prepustite tuneliranje odjemalcu platforme. Če mora aplikacija doseči le zasebno končno točko, lastnega tunela sploh ne potrebuje.

To odločitev zapišite, preden napišete kodo, ker tri poti po prvem sprintu nimajo skoraj nič skupnega.

Zadnji pregled pred začetkom: ali zahteva pravi, da se poveže naša aplikacija, ali da se poveže naprava? Prvo je VpnService, drugo je profil, ki ga ne morete ustvariti. Pravilno oblikovati ta stavek je ceneje od vsakršnega preoblikovanja.

Sorodni članki