Napautat Asetuksissa VPN-riviä, näet profiilin, jonka joku muu on asentanut, ja alat etsiä kutsua, joka lisää sellaisen. Sellaista kutsua ei ole. Sovellus voi avata oman tunnelinsa VpnService-palvelun kautta, mutta luettelon merkinnät kuuluvat alustalle ja sille asiakasohjelmalle, joka ne loi. Sen tietäminen, missä raja tarkalleen kulkee, säästää viikon piilotettujen luokkien jahtaamiselta.

Aloita siitä, mitä Asetukset-näyttö näyttää

VPN-luettelo on rekisteri profiileista, jotka järjestelmä tai laitevalmistajan asiakasohjelma on asentanut: PPTP, L2TP/IPsec, IKEv2 ja rivit, jotka OEM-sovellus tai MDM on työntänyt sisään. Jokainen rivi kantaa palvelinosoitteen, tunnistetiedot ja protokollatoteutuksen, joka elää prosessisi ulkopuolella. Kun käyttäjä napauttaa siellä Yhdistä, tunnelin nostaa alustan asiakasohjelma, ei sinun koodisi. Siksi rivi säilyy uudelleenkäynnistyksen yli ja siksi sovelluksesi poistaminen ei koskaan poista sitä.

Käyttäjän näkökulmasta luettelo näyttää API-pinnalta, paikalta, jossa VPN:n lisäämisen pitäisi olla yhden intentin päässä. Se ei ole. Ainoat julkiset sisääntulopisteet, jotka siihen koskevat, ovat navigointi-intenttejä, ja kaikki siihen kirjoittava kuuluu alustalle tai etuoikeutetulle komponentille.

Käytännön seuraus: jos tukiteksti käskee käyttäjiä lisäämään profiilin Asetuksissa, sovelluksesi ei ole siinä kulussa lainkaan mukana.

Mitä VpnService todella antaa sinulle

VpnService ja VpnService.Builder kuvaavat yhden tunnelin, joka kuuluu sovelluksellesi. Lisäät osoitteita, reittejä, DNS-palvelimia ja MTU:n, rajaat liikennettä addAllowedApplication()- tai addDisallowedApplication()-kutsulla, ja sitten establish() palauttaa ParcelFileDescriptorin TUN-rajapinnalle. Siitä pisteestä sovellus lukee IP-paketteja ja kirjoittaa vastauksia, eli protokolla on sinun toteutettavaksesi tai upotettavaksesi: OpenVPN, WireGuard, oma siirtotie.

Mikään tuossa ketjussa ei puhu PPTP:tä, L2TP/IPseciä tai IKEv2:ta. Builderissa ei ole kytkintä, joka sanoisi käytä järjestelmän L2TP-asiakasohjelmaa, eikä ole callbackia, jolla voisit ohjata profiilia, jonka alusta jo omistaa. Se on todellinen raja, ja se on suunnitteluraja, ei aukko käyttöoikeuksissa.

Sovellus voi siis aivan hyvin olla VPN-asiakasohjelma Androidissa. Se ei vain voi olla puhelimen mukana tulevien asiakasohjelmien hallitsija.

Suostumusvalintaikkuna ei ole koriste

Koska tunnelisi voi kaapata muiden sovellusten liikennettä, järjestelmä vaatii, että käyttäjä hyväksyy sen nimenomaisesti. prepare() palauttaa Intentin, joka sinun on käynnistettävä, hyväksyntä on sidottu pakettiisi, ja tunnelin ollessa päällä tilapalkissa näkyy pysyvä ilmaisin. Toinen VPN:n noustessa ensimmäinen poistuu käytöstä, koska Android ajaa yhtä aktiivista VPN:ää kerrallaan.

Yhden aktiivisen sääntö kompastuttaa ihmisiä testauksessa. Nostata tunnelisi, kun yritysasiakasohjelma on yhdistettynä, ja päättelet koodisi olevan rikki, vaikka alusta vain vaihtoi pois toisesta asiakasohjelmasta. Hyväksynnät voi perua myöhemmin, ja prepare() voi palauttaa nullin laitteilla, joilta suostumusaktiviteetti puuttuu, joten establish():n on silti käsiteltävä epäonnistuminen.

Piilotetut API:t ja asetusintentit

Vanhemmat vastaukset osoittavat com.android.internal-luokkiin ja AIDL-rajapintoihin, joita sisäänrakennettu asiakasohjelma käyttää. Ne eivät ole SDK:ssa, ne muuttuvat julkaisujen välillä ilman ilmoitusta, ja sovelluskaupat pitävät tällaista pääsyä riskinä. Laitteen roottauskaan ei tee niistä vakaita, koska root ja piilotettujen API:en käyttö ovat toisistaan riippumattomia ongelmia.

Tuettu navigointiapuri on Settings.ACTION_VPN_SETTINGS, jonka arvo on android.net.vpn.SETTINGS. Selvitä se ennen käynnistystä, koska jotkin OEM-koonnokset eivät toimita tuota aktiviteettia, ja siirry kirjallisiin vaiheisiin, kun selvitys epäonnistuu. Se vie käyttäjän näytölle eikä konfiguroi mitään.

Laiteomistajan ja MDM:n polut ovat se poikkeus, jota ihmiset yleensä tarkoittavat. DevicePolicyManager voi nimetä aina päällä olevan VPN-paketin, ja hallitut kokoonpanot voivat esiladata asetuksia asiakasohjelmalle, joka tukee niitä, mutta se ei ole vieläkään julkinen SDK, joka kirjoittaa PPTP-profiilin.

Käy päätös läpi käyttäjän puolelta

Jos tuotteesi täytyy kuljettaa liikennettä, suunnittele VpnService ja oikea protokollapino, ja varaa aikaa suostumuskulkuun ja yhden VPN:n sääntöön. Jos tavoitteena on yhdistää olemassa olevaan yritysprofiiliin, työsi on ohjausta: syvälinkki asetusnäytölle, kenttien dokumentointi, ja anna alustan asiakasohjelman tehdä tunnelointi. Jos sovelluksen tarvitsee vain tavoittaa yksityinen päätepiste, se ei tarvitse omaa tunnelia lainkaan.

Kirjoita tuo päätös muistiin ennen kuin kirjoitat koodia, koska kolmella polulla ei ole ensimmäisen sprintin jälkeen juuri mitään yhteistä.

Viimeinen tarkistus ennen aloitusta: sanooko vaatimus, että sovelluksemme yhdistää vai että laite yhdistää? Ensimmäinen on VpnService, toinen on profiili, jota et voi luoda. Tuon lauseen saaminen oikein on halvempaa kuin mikään refaktorointi.

Aiheeseen liittyvät artikkelit