Miks teie Androidi rakendus ei saa lisada süsteemset VPN-profiili
VpnService loob tunnelit, mille omanik on teie rakendus; see ei saa telefoni PPTP, L2TP ega IPsec kirjeid lisada ega muuta. Käige piir läbi ja valige õige tee.
Puudutate Seadetes VPN-rida, näete profiili, mille keegi teine on installinud, ja hakkate otsima kutsungit, mis selle lisab. Sellist kutsungit ei ole. Rakendus saab VpnService kaudu avada omaenda tunneli, kuid selle loendi kirjed kuuluvad platvormile ja sellele kliendile, kes need lõi. Täpne teadmine, kus piir asub, säästab teile nädala peidetud klasside tagaajamist.
Alustage sellest, mida Seadete ekraan näitab
VPN-loend on register profiilidest, mille on installinud süsteem või tootja klient: PPTP, L2TP/IPsec, IKEv2 ja kõik read, mille OEM-rakendus või MDM on sisse lükanud. Iga rida kannab serveri aadressi, volitusi ja protokolli teostust, mis elab väljaspool teie protsessi. Kui kasutaja puudutab seal Ühenda, tõstab tunneli platvormi klient, mitte teie kood. Seetõttu jääb rida taaskäivituse üle ja seetõttu ei eemalda teie rakenduse desinstallimine seda kunagi.
Kasutaja vaatepunktist näeb loend välja nagu API pind, koht, kus VPN-i lisamine peaks olema ühe kavatsuse kaugusel. See ei ole nii. Ainsad avalikud sisendpunktid, mis seda puudutavad, on navigeerimiskavatsused, ja kõik, mis sinna kirjutab, kuulub platvormile või privilegeeritud komponendile.
Praktiline tagajärg: kui tugitekst ütleb kasutajatele, et lisage profiil Seadetes, ei ole teie rakendus selles voos üldse osaline.
Mida VpnService teile tegelikult annab
VpnService ja VpnService.Builder kirjeldavad üht tunnelit, mille omanik on teie rakendus. Lisate aadresse, marsruute, DNS-serverid ja MTU, määrate liikluse ulatuse funktsiooniga addAllowedApplication() või addDisallowedApplication(), ja seejärel tagastab establish() TUN-liidese jaoks ParcelFileDescriptor. Sellest hetkest loeb rakendus IP-pakette ja kirjutab vastuseid, mis tähendab, et protokoll on teie oma seda rakendada või kaasata: OpenVPN, WireGuard, kohandatud transport.
Miski selles järjestuses ei räägi PPTP, L2TP/IPsec ega IKEv2 keelt. Builderil ei ole lülitit, mis ütleks kasuta süsteemi L2TP-klienti, ja puudub tagasikutse, mis laseks teil juhtida profiili, mille platvorm juba omab. See on tõeline piir ja see on disainipiir, mitte lünk lubades.
Nii et rakendus võib Androidis täiesti olla VPN-klient. Ta lihtsalt ei saa olla haldur klientidele, mis telefoniga kaasas tulevad.
Nõusolekudialoog ei ole kaunistus
Kuna teie tunnel võib teiste rakenduste liiklust haarata, nõuab süsteem, et kasutaja kiidaks selle selgesõnaliselt heaks. prepare() tagastab Intent'i, mille peate käivitama, heakskiit on seotud teie paketiga ja kuni tunnel töötab, näitab olekuriba püsivat indikaatorit. Teine VPN, mis tõuseb, lülitab esimese välja, sest Android hoiab korraga ühte aktiivset VPN-i.
See ühe aktiivse reegel komistab inimesi testimisel. Tõstate oma tunneli, kui ettevõtte klient on ühendatud, ja järeldate, et teie kood on katki, samal ajal kui platvorm lihtsalt lülitus teiselt kliendilt ära. Heakskiite saab hiljem tühistada ja prepare() võib tagastada null seadmetes, kus nõusoleku tegevus puudub, seega peab establish() ikkagi ebaõnnestumist käsitlema.
Peidetud API-d ja seadete kavatsused
Vanemad vastused osutavad com.android.internal klassidele ja AIDL-liidestele, mida sisseehitatud klient kasutab. Neid ei ole SDK-s, need muutuvad väljaannete vahel ilma teavituseta ja rakendusepoed peavad sellist juurdepääsu riskiks. Seadme rootimine ei tee neid ka stabiilseks, sest root ja peidetud API juurdepääs on omavahel mitteseotud probleemid.
Toetatud navigeerimisabi on Settings.ACTION_VPN_SETTINGS, mille väärtus on android.net.vpn.SETTINGS. Lahendage see enne käivitamist, sest mõned OEM-i buildid ei tarni seda tegevust, ja lülituge kirjalikele sammudele, kui lahendamine ebaõnnestub. See viib kasutaja ekraanile ega seadista midagi.
Seadmeomaniku ja MDM-i teed on erand, mida inimesed tavaliselt mõtlevad. DevicePolicyManager saab määrata alati sisse lülitatud VPN-i paketi ja hallatavad konfiguratsioonid saavad eellaadida seadeid kliendile, mis neid toetab, kuid see ei ole ikkagi avalik SDK, mis koostab PPTP-profiili.
Käige otsus kasutaja poolelt läbi
Kui teie toode peab liiklust kandma, planeerige VpnService pluss tõeline protokollipinu ja arvestage aega nõusolekuvoo ja ühe-VPN-i reegli jaoks. Kui eesmärk on ühenduda olemasoleva ettevõtte profiiliga, on teie töö suunamine: sügavlink seadete ekraanile, dokumenteerige väljad ja laske platvormi kliendil tunnel teha. Kui rakendus peab jõudma ainult privaatsesse lõpp-punkti, ei vaja see üldse oma tunnelit.
Kirjutage see otsus üles enne, kui kirjutate koodi, sest kolmel teel ei ole pärast esimest sprinti peaaegu midagi ühist.
Viimane kontroll enne alustamist: kas nõue ütleb, et meie rakendus ühendub, või et seade ühendub? Esimene on VpnService, teine on profiil, mida te ei saa luua. Selle lause õigesti sõnastamine on odavam kui ükskõik milline refaktoroimine.