Proč vaše aplikace pro Android nemůže přidat systémový profil VPN
VpnService vytváří tunel, který vlastní vaše aplikace; nemůže přidávat ani upravovat položky PPTP, L2TP nebo IPsec v telefonu. Projděte hranici a zvolte správnou cestu.
Klepnete na řádek VPN v Nastavení, uvidíte profil, který nainstaloval někdo jiný, a začnete hledat volání, které ho přidává. Takové volání neexistuje. Aplikace může otevřít vlastní tunel přes VpnService, ale položky v tomto seznamu patří platformě a tomu klientovi, který je vytvořil. Přesná znalost toho, kde vede hranice, vám ušetří týden honění skrytých tříd.
Začněte tím, co ukazuje obrazovka Nastavení
Seznam VPN je registr profilů, které nainstaloval systém nebo klientský software výrobce: PPTP, L2TP/IPsec, IKEv2 a řádky, které protlačila aplikace OEM nebo MDM. Každý řádek nese adresu serveru, přihlašovací údaje a implementaci protokolu, která žije mimo váš proces. Když uživatel klepne na Připojit, tunel zvedne klient platformy, ne váš kód. Proto řádek přežije restart a proto ho odinstalace vaší aplikace nikdy neodstraní.
Z pohledu uživatele vypadá seznam jako plocha API, místo, kde by přidání VPN mělo být vzdálené jedno gesto. Není. Jediné veřejné vstupní body, které se ho dotýkají, jsou navigační záměry, a vše, co do něj zapisuje, patří platformě nebo privilegované komponentě.
Praktický důsledek: pokud text podpory říká uživatelům, aby profil přidali v Nastavení, vaše aplikace do toho toku vůbec nepatří.
Co vám VpnService skutečně dává
VpnService a VpnService.Builder popisují jeden tunel, který vlastní vaše aplikace. Přidáte adresy, trasy, servery DNS a MTU, omezíte provoz pomocí addAllowedApplication() nebo addDisallowedApplication(), a pak establish() vrátí ParcelFileDescriptor pro rozhraní TUN. Od té chvíle aplikace čte IP pakety a zapisuje odpovědi, což znamená, že protokol je váš a můžete ho implementovat nebo vložit: OpenVPN, WireGuard, vlastní transport.
Nic v této posloupnosti nemluví PPTP, L2TP/IPsec ani IKEv2. Builder nemá přepínač, který by říkal použij systémového klienta L2TP, a neexistuje zpětné volání, které by vám dovolilo řídit profil, jenž platforma už vlastní. To je skutečná hranice a je to hranice návrhu, ne mezera v oprávněních.
Aplikace tedy rozhodně může být klientem VPN na Androidu. Jen nemůže být správcem klientů, které dodává telefon.
Dialog souhlasu není ozdoba
Protože váš tunel může zachytit provoz jiných aplikací, systém donutí uživatele, aby ho výslovně schválil. prepare() vrací Intent, který musíte spustit, schválení je vázané na váš balíček a dokud je tunel aktivní, stavový řádek zobrazuje trvalý indikátor. Druhá VPN, která se zvedne, deaktivuje první, protože Android provozuje jednu aktivní VPN najednou.
To pravidlo jedné aktivní mate lidi při testování. Zvednete svůj tunel, zatímco je připojený firemní klient, a usoudíte, že váš kód je rozbitý, přičemž platforma prostě přepnula od jiného klienta. Schválení lze později odebrat a prepare() může vrátit null na zařízeních, kde chybí aktivita souhlasu, takže establish() musí i tak zvládat selhání.
Skrytá API a záměry nastavení
Starší odpovědi ukazují na třídy com.android.internal a rozhraní AIDL, která používá vestavěný klient. Nejsou v SDK, mezi verzemi se mění bez oznámení a obchody s aplikacemi považují takový přístup za riziko. Root zařízení je také nezpevní, protože root a přístup ke skrytým API jsou nesouvisející problémy.
Podporovanou navigační pomůckou je Settings.ACTION_VPN_SETTINGS, jejíž hodnota je android.net.vpn.SETTINGS. Před spuštěním ji vyřešte, protože některé sestavy OEM tuto aktivitu nedodávají, a když se vyřešení nezdaří, přejděte na psaný postup. Převede uživatele na obrazovku a nic nenastaví.
Cesty vlastníka zařízení a MDM jsou výjimkou, kterou lidé obvykle myslí. DevicePolicyManager může určit balíček trvale zapnuté VPN a spravované konfigurace mohou přednačíst nastavení klientovi, který je podporuje, ale to pořád není veřejné SDK, které píše profil PPTP.
Projděte rozhodnutí z pohledu uživatele
Pokud váš produkt musí přenášet provoz, počítejte s VpnService a skutečným protokolovým zásobníkem a naplánujte čas na tok souhlasu a pravidlo jedné VPN. Pokud je cílem připojit se k existujícímu firemnímu profilu, vaším úkolem je navigace: hluboký odkaz na obrazovku nastavení, zdokumentujte pole a nechte tunelování na klientovi platformy. Pokud aplikace potřebuje dosáhnout jen soukromého koncového bodu, vlastní tunel vůbec nepotřebuje.
Zapište to rozhodnutí dřív, než napíšete kód, protože ty tři cesty po prvním sprintu nemají skoro nic společného.
Poslední kontrola před startem: říká požadavek, že se připojuje naše aplikace, nebo že se připojuje zařízení? První je VpnService, druhé je profil, který nemůžete vytvořit. Správně napsat tu větu je levnější než jakýkoli refaktoring.