Hvers vegna Android-forritið þitt getur ekki bætt við kerfis-VPN-sniði
VpnService byggir göng sem forritið þitt á; það getur ekki bætt við eða breytt PPTP-, L2TP- eða IPsec-færslum símans. Farðu eftir mörkunum og veldu réttu leiðina.
Þú ýtir á VPN-röðina í Stillingum, sérð snið sem einhver annar setti upp og byrjar að leita að kallinu sem bætir einu við. Ekkert slíkt kall er til. Forrit getur opnað eigin göng í gegnum VpnService, en færslurnar á þeim lista tilheyra kerfinu og þeim biðlara sem bjó þær til. Að vita nákvæmlega hvar mörkin liggja sparar þér viku í eltingarleik við faldar klasa.
Byrjaðu á því sem Stillingaskjárinn sýnir
VPN-listinn er skrá yfir snið sem kerfið eða biðlari framleiðanda setti upp: PPTP, L2TP/IPsec, IKEv2 og hvaða raðir sem OEM-forrit eða MDM ýtti inn. Hver röð ber vefþjónsfang, skírteini og útfærslu samskiptareglna sem lifir utan þíns ferlis. Þegar notandinn ýtir á Tengjast þar er það biðlari kerfisins sem reisir göngin, ekki kóðinn þinn. Þess vegna lifir röðin endurræsingu af og þess vegna fjarlægir uppsetning forritsins þíns hana aldrei.
Frá sjónarhóli notandans lítur listinn út eins og API-flötur, staður þar sem að bæta við VPN ætti að vera eitt intent í burtu. Þannig er það ekki. Einu opinberu inngöngupunktarnir sem snerta hann eru leiðsögu-intent, og allt sem skrifar í hann tilheyrir kerfinu eða forréttindahluta.
Hagnýt afleiðing: ef stuðningstexti segir notendum að bæta sniðinu við í Stillingum, þá er forritið þitt alls ekki hluti af því ferli.
Hvað VpnService gefur þér í raun
VpnService og VpnService.Builder lýsa einum göngum sem forritið þitt á. Þú bætir við vistföngum, slóðum, DNS-þjónum og MTU, afmarkar umferð með addAllowedApplication() eða addDisallowedApplication(), og þá skilar establish() ParcelFileDescriptor fyrir TUN-viðmót. Frá þeim punkti les forritið IP-pakka og skrifar svör, sem þýðir að samskiptareglurnar eru þínar til að útfæra eða byggja inn: OpenVPN, WireGuard, eigin flutningur.
Ekkert í þeirri röð talar PPTP, L2TP/IPsec eða IKEv2. Builder hefur engan rofa sem segir notaðu L2TP-biðlara kerfisins, og ekkert bakkall er til sem leyfir þér að stýra sniði sem kerfið á þegar. Þetta eru raunverulegu mörkin, og þau eru hönnunarmörk en ekki skarð í heimildum.
Þannig að forrit getur sannarlega verið VPN-biðlari á Android. Það getur bara ekki verið stjórnandi fyrir biðlarana sem fylgja símanum.
Samþykkisglugginn er ekki skraut
Vegna þess að göngin þín geta gripið umferð annarra forrita, krefst kerfið þess að notandinn samþykki þau sérstaklega. prepare() skilar Intent sem þú verður að ræsa, samþykkið er bundið við pakkann þinn, og meðan göngin eru uppi sýnir stöðustikan varanlegan vísir. Önnur VPN sem kemur upp gerir fyrstu óvirka, því Android keyrir eitt virkt VPN í einu.
Þessi regla um eitt virkt lætur fólk hrasa í prófunum. Þú reisir göngin þín á meðan fyrirtækjabiðlari er tengdur og ályktar að kóðinn þinn sé bilaður, þegar kerfið skipaði einfaldlega yfir á hinn biðlarann. Hægt er að afturkalla samþykki síðar, og prepare() getur skilað null á tækjum þar sem samþykkisathöfnin vantar, svo establish() verður samt að takast á við bilun.
Faldar API og stillingar-intent
Eldri svör vísa á com.android.internal klasa og AIDL-viðmót sem innbyggði biðlarinn notar. Þau eru ekki í SDK, breytast milli útgáfa án tilkynningar og forritabúðir líta á þann aðgang sem áhættu. Rótun tækisins gerir þau ekki stöðug heldur, því rót og aðgangur að földum API eru ótengd vandamál.
Studda leiðsögu hjálpin er Settings.ACTION_VPN_SETTINGS, en gildi hennar er android.net.vpn.SETTINGS. Leystu hana áður en þú ræsir, því sumar OEM-útgáfur senda ekki með þá athöfn, og farðu yfir í skrifuð skref þegar leysingin mistekst. Hún leiðir notandann á skjáinn og stillir ekkert.
Tækjaeiganda- og MDM-leiðirnar eru undantekningin sem fólk á yfirleitt við. DevicePolicyManager getur tilnefnt pakka fyrir VPN sem er alltaf í gangi, og stýrðar stillingar geta forhlaðið stillingum fyrir biðlara sem styður þær, en það er samt ekki opinbera SDK sem semur PPTP-snið.
Farðu ákvörðunina frá hlið notandans
Ef varan þín þarf að bera umferð skaltu skipuleggja VpnService auk alvöru samskiptareglu-stakks og gera ráð fyrir tíma í samþykkisferlið og regluna um eitt VPN. Ef markmiðið er að tengjast fyrirliggjandi fyrirtækjasniði er starf þitt leiðsögn: djúptengill á stillingaskjáinn, skjalfestu reitina og láttu biðlara kerfisins sjá um göngin. Ef forritið þarf bara að ná til einkalokapunkts þarf það alls ekki eigin göng.
Skrifaðu þá ákvörðun niður áður en þú skrifar kóða, því leiðirnar þrjár eiga nánast ekkert sameiginlegt eftir fyrsta sprettinn.
Síðasta athugun áður en þú byrjar: segir krafan að forritið okkar tengist, eða að tækið tengist? Fyrra er VpnService, síðara er snið sem þú getur ekki búið til. Að orða þá setningu rétt er ódýrara en hvaða endurskipulagning sem er.