Kāpēc jūsu Android lietotne nevar pievienot sistēmas VPN profilu
VpnService izveido tuneli, kas pieder jūsu lietotnei; tā nevar pievienot vai rediģēt tālruņa PPTP, L2TP vai IPsec ierakstus. Izstaigājiet robežu un izvēlieties pareizo ceļu.
Jūs pieskaraties VPN rindai Iestatījumos, redzat profilu, ko instalējis kāds cits, un sākat meklēt izsaukumu, kas to pievieno. Tāda izsaukuma nav. Lietotne var atvērt savu tuneli, izmantojot VpnService, bet ieraksti šajā sarakstā pieder platformai un tam klientam, kas tos izveidoja. Precīzas zināšanas par to, kur atrodas robeža, ietaupa nedēļu, ko pavadītu, dzenoties pēc slēptajām klasēm.
Sāciet ar to, ko rāda Iestatījumu ekrāns
VPN saraksts ir reģistrs profilu, ko instalējusi sistēma vai ražotāja klients: PPTP, L2TP/IPsec, IKEv2 un visas rindas, ko ievietojusi OEM lietotne vai MDM. Katra rinda nes servera adresi, akreditācijas datus un protokola ieviešanu, kas dzīvo ārpus jūsu procesa. Kad lietotājs tur pieskaras Savienot, tuneli paceļ platformas klients, nevis jūsu kods. Tāpēc rinda saglabājas pēc pārstartēšanas un tāpēc lietotnes atinstalēšana to nekad nenoņem.
No lietotāja puses saraksts izskatās kā API virsma, vieta, kur VPN pievienošanai jābūt viena nolūka attālumā. Tā nav. Vienīgie publiskie ieejas punkti, kas to skar, ir navigācijas nolūki, un viss, kas tajā raksta, pieder platformai vai priviliģētai komponentei.
Praktiskas sekas: ja atbalsta teksts liek lietotājiem pievienot profilu Iestatījumos, jūsu lietotne nemaz nav šīs plūsmas daļa.
Ko VpnService patiešām dod
VpnService un VpnService.Builder apraksta vienu tuneli, kas pieder jūsu lietotnei. Jūs pievienojat adreses, maršrutus, DNS serverus un MTU, ierobežojat satiksmi ar addAllowedApplication() vai addDisallowedApplication(), un pēc tam establish() atgriež ParcelFileDescriptor TUN saskarnei. No tā brīža lietotne lasa IP paketes un raksta atbildes, kas nozīmē, ka protokols ir jūsu ziņā to ieviest vai iekļaut: OpenVPN, WireGuard, pašu transports.
Nekas šajā secībā nerunā par PPTP, L2TP/IPsec vai IKEv2. Builder nav slēdža, kas teiktu izmanto sistēmas L2TP klientu, un nav atzvanīšanas, kas ļautu jums vadīt profilu, kas platformai jau pieder. Tā ir īstā robeža, un tā ir dizaina robeža, nevis atļauju robi.
Tātad lietotne pilnīgi var būt VPN klients Android sistēmā. Tā tikai nevar būt to klientu pārvaldnieks, kas nāk kopā ar tālruni.
Piekrišanas dialogs nav rotājums
Tā kā jūsu tunelis var uztvert citu lietotņu satiksmi, sistēma liek lietotājam to skaidri apstiprināt. prepare() atgriež Intent, kas jums jāpalaiž, apstiprinājums ir piesaistīts jūsu pakotnei, un, kamēr tunelis ir aktīvs, statusa joslā redzams pastāvīgs indikators. Otrs VPN, kas tiek pacelts, deaktivizē pirmo, jo Android vienlaikus uztur vienu aktīvu VPN.
Šis viena aktīvā noteikums liek cilvēkiem klūpēt testēšanā. Jūs paceļat savu tuneli, kamēr ir pievienots uzņēmuma klients, un secināt, ka jūsu kods ir salūzis, lai gan platforma vienkārši pārslēdzās no otra klienta. Apstiprinājumus var atsaukt vēlāk, un prepare() var atgriezt null ierīcēs, kur trūkst piekrišanas aktivitātes, tāpēc establish() joprojām ir jārīkojas ar kļūmi.
Slēptie API un iestatījumu nolūki
Vecākas atbildes norāda uz com.android.internal klasēm un AIDL saskarnēm, ko izmanto iebūvētais klients. Tās nav SDK, tās mainās starp laidieniem bez brīdinājuma, un lietotņu veikali šo piekļuvi uzskata par risku. Ierīces rootošana arī nepadara tās stabilas, jo root un piekļuve slēptajiem API ir nesaistītas problēmas.
Atbalstītais navigācijas palīgs ir Settings.ACTION_VPN_SETTINGS, kura vērtība ir android.net.vpn.SETTINGS. Atrisiniet to pirms palaišanas, jo dažas OEM būves nepiegādā šo aktivitāti, un pārejiet uz rakstītiem soļiem, kad atrisināšana neizdodas. Tas aizved lietotāju uz ekrānu un neko nekonfigurē.
Ierīces īpašnieka un MDM ceļi ir tas izņēmums, ko cilvēki parasti domā. DevicePolicyManager var norādīt vienmēr ieslēgtu VPN pakotni, un pārvaldītās konfigurācijas var iepriekš ielādēt iestatījumus klientam, kas tās atbalsta, bet tas joprojām nav publiskais SDK, kas raksta PPTP profilu.
Izstaigājiet lēmumu no lietotāja puses
Ja jūsu produktam ir jāpārvadā satiksme, plānojiet VpnService un īstu protokolu steku, un atvēliet laiku piekrišanas plūsmai un viena VPN noteikumam. Ja mērķis ir pieslēgties esošam uzņēmuma profilam, jūsu darbs ir vadība: dziļsaite uz iestatījumu ekrānu, lauku dokumentēšana, un ļaujiet platformas klientam veikt tunelēšanu. Ja lietotnei tikai jāsasniedz privāts galapunkts, tai vispār nav vajadzīgs savs tunelis.
Pierakstiet šo lēmumu pirms koda rakstīšanas, jo trim ceļiem pēc pirmā sprinta gandrīz nav nekā kopīga.
Pēdējā pārbaude pirms sākuma: vai prasība saka, ka pieslēdzas mūsu lietotne, vai ka pieslēdzas ierīce? Pirmais ir VpnService, otrais ir profils, ko jūs nevarat izveidot. Šo teikumu pareizi noformulēt ir lētāk nekā jebkura pārveide.