Klepnete na riadok VPN v Nastaveniach, uvidíte profil, ktorý nainštaloval niekto iný, a začnete hľadať volanie, ktoré ho pridáva. Také volanie neexistuje. Aplikácia môže otvoriť vlastný tunel cez VpnService, ale položky v tomto zozname patria platforme a tomu klientovi, ktorý ich vytvoril. Presná znalosť toho, kde vedie hranica, vám ušetrí týždeň naháňania skrytých tried.

Začnite tým, čo zobrazuje obrazovka Nastavenia

Zoznam VPN je register profilov, ktoré nainštaloval systém alebo klientsky softvér výrobcu: PPTP, L2TP/IPsec, IKEv2 a riadky, ktoré pretlačila aplikácia OEM alebo MDM. Každý riadok nesie adresu servera, prihlasovacie údaje a implementáciu protokolu, ktorá žije mimo vášho procesu. Keď používateľ tam klepne na Pripojiť, tunel zdvihne klient platformy, nie váš kód. Preto riadok prežije reštart a preto ho odinštalovanie vašej aplikácie nikdy neodstráni.

Z pohľadu používateľa vyzerá zoznam ako plocha API, miesto, kde by pridanie VPN malo byť vzdialené jedno gesto. Nie je. Jediné verejné vstupné body, ktoré sa ho dotýkajú, sú navigačné zámery, a všetko, čo doň zapisuje, patrí platforme alebo privilegovanej komponente.

Praktický dôsledok: ak text podpory hovorí používateľom, aby profil pridali v Nastaveniach, vaša aplikácia do toho toku vôbec nepatrí.

Čo vám VpnService naozaj dáva

VpnService a VpnService.Builder opisujú jeden tunel, ktorý vlastní vaša aplikácia. Pridáte adresy, trasy, servery DNS a MTU, obmedzíte prevádzku pomocou addAllowedApplication() alebo addDisallowedApplication(), a potom establish() vráti ParcelFileDescriptor pre rozhranie TUN. Od tej chvíle aplikácia číta IP pakety a zapisuje odpovede, čo znamená, že protokol je váš na implementáciu alebo vloženie: OpenVPN, WireGuard, vlastný transport.

Nič v tejto postupnosti nehovorí PPTP, L2TP/IPsec ani IKEv2. Builder nemá prepínač, ktorý by hovoril použi systémového klienta L2TP, a neexistuje spätné volanie, ktoré by vám dovolilo riadiť profil, ktorý platforma už vlastní. To je skutočná hranica a je to hranica návrhu, nie medzera v oprávneniach.

Aplikácia teda rozhodne môže byť klientom VPN na Androide. Len nemôže byť správcom klientov, ktoré dodáva telefón.

Dialóg so súhlasom nie je ozdoba

Keďže váš tunel môže zachytiť prevádzku iných aplikácií, systém donúti používateľa, aby ho výslovne schválil. prepare() vracia Intent, ktorý musíte spustiť, schválenie je viazané na váš balík a kým je tunel aktívny, stavový riadok zobrazuje trvalý indikátor. Druhá VPN, ktorá sa zdvihne, deaktivuje prvú, pretože Android prevádzkuje jednu aktívnu VPN naraz.

To pravidlo jednej aktívnej mýli ľudí pri testovaní. Zdvíhnete svoj tunel, kým je pripojený firemný klient, a usúdite, že váš kód je pokazený, pričom platforma jednoducho prepnula od iného klienta. Schválenia možno neskôr odobrať a prepare() môže vrátiť null na zariadeniach, kde chýba aktivita súhlasu, takže establish() musí aj tak zvládať zlyhanie.

Skryté API a zámery nastavení

Staršie odpovede ukazujú na triedy com.android.internal a rozhrania AIDL, ktoré používa vstavaný klient. Nie sú v SDK, medzi verziami sa menia bez oznámenia a obchody s aplikáciami považujú taký prístup za riziko. Root zariadenia ich tiež nezpevní, pretože root a prístup k skrytým API sú nesúvisiace problémy.

Podporovanou navigačnou pomôckou je Settings.ACTION_VPN_SETTINGS, ktorej hodnota je android.net.vpn.SETTINGS. Pred spustením ju vyriešte, pretože niektoré zostavy OEM túto aktivitu nedodávajú, a keď sa riešenie nepodarí, prejdite na písaný postup. Prevedie používateľa na obrazovku a nič nenastaví.

Cesty vlastníka zariadenia a MDM sú výnimkou, ktorú ľudia zvyčajne myslia. DevicePolicyManager môže určiť balík trvalo zapnutej VPN a spravované konfigurácie môžu prednačítať nastavenia klientovi, ktorý ich podporuje, ale to stále nie je verejné SDK, ktoré píše profil PPTP.

Prejdite rozhodnutie z pohľadu používateľa

Ak váš produkt musí prenášať prevádzku, počítajte s VpnService a skutočným protokolovým zásobníkom a naplánujte čas na tok súhlasu a pravidlo jednej VPN. Ak je cieľom pripojiť sa k existujúcemu firemnému profilu, vašou úlohou je navigácia: hlboký odkaz na obrazovku nastavení, zdokumentujte polia a nechajte tunelovanie na klientovi platformy. Ak aplikácia potrebuje dosiahnuť len súkromný koncový bod, vlastný tunel vôbec nepotrebuje.

Zapíšte to rozhodnutie skôr, než napíšete kód, pretože tri cesty po prvom sprinte nemajú takmer nič spoločné.

Posledná kontrola pred štartom: hovorí požiadavka, že sa pripája naša aplikácia, alebo že sa pripája zariadenie? Prvé je VpnService, druhé je profil, ktorý nemôžete vytvoriť. Správne napísať tú vetu je lacnejšie než akýkoľvek refaktoring.

Súvisiace články