Prekni rreshtin VPN në Cilësimet, shihni një profil të instaluar nga dikush tjetër dhe filloni të kërkoni thirrjen që shton një të tillë. Një thirrje e tillë nuk ekziston. Një aplikacion mund të hapë tunelin e vet përmes VpnService, por hyrjet në atë listë i përkasin platformës dhe klientit që i krijoi ato. Të dish saktësisht ku qëndron kufiri të kursen një javë gjueti pas klasave të fshehura.

Filloni me atë që tregon ekrani i Cilësimeve

Lista e VPN-ve është një regjistër i profileve që ka instaluar sistemi ose një klient i prodhuesit: PPTP, L2TP/IPsec, IKEv2 dhe rreshtat që ka shtyrë një aplikacion OEM ose një MDM. Çdo rresht mban një adresë serveri, kredenciale dhe një implementim protokolli që jeton jashtë procesit tuaj. Kur përdoruesi prek Lidhu atje, tunelin e ngre klienti i platformës, jo kodi juaj. Prandaj rreshti mbijeton një rindezje dhe prandaj çinstalimi i aplikacionit tuaj nuk e heq kurrë.

Nga ana e përdoruesit lista duket si një sipërfaqe API, një vend ku shtimi i një VPN duhet të jetë një intent larg. Nuk është. Pikat e vetme publike të hyrjes që e prekin janë intentet e navigimit, dhe çdo gjë që shkruan në të i përket platformës ose një komponenti të privilegjuar.

Pasojë praktike: nëse një tekst mbështetjeje u thotë përdoruesve të shtojnë profilin në Cilësimet, aplikacioni juaj nuk është fare pjesë e atij rrjedhe.

Çfarë ju jep në të vërtetë VpnService

VpnService dhe VpnService.Builder përshkruajnë një tunel që zotërohet nga aplikacioni juaj. Shtoni adresa, rrugë, serverë DNS dhe një MTU, kufizoni trafikun me addAllowedApplication() ose addDisallowedApplication(), dhe më pas establish() kthen një ParcelFileDescriptor për një ndërfaqe TUN. Nga ai moment aplikacioni lexon paketa IP dhe shkruan përgjigje, që do të thotë se protokolli është i juaji për t'u implementuar ose përfshirë: OpenVPN, WireGuard, një transport i personalizuar.

Asgjë në atë sekuencë nuk flet PPTP, L2TP/IPsec ose IKEv2. Builder nuk ka asnjë çelës që thotë përdor klientin L2TP të sistemit, dhe nuk ka asnjë callback që ju lejon të drejtoni një profil që platforma e zotëron tashmë. Ky është kufiri i vërtetë, dhe është një kufi dizajni, jo një boshllëk lejesh.

Pra një aplikacion mund të jetë plotësisht një klient VPN në Android. Thjesht nuk mund të jetë menaxher për klientët që vijnë me telefonin.

Dialogu i pëlqimit nuk është zbukurim

Meqenëse tuneli juaj mund të kapë trafikun e aplikacioneve të tjera, sistemi kërkon që përdoruesi ta miratojë shprehimisht. prepare() kthen një Intent që duhet ta lansoni, miratimi lidhet me paketën tuaj, dhe sa kohë tuneli është aktiv shiriti i statusit tregon një tregues të përhershëm. Një VPN i dytë që ngrihet çaktivizon të parin, sepse Android ekzekuton një VPN aktiv në një herë.

Ky rregull i një aktiv bën që njerëzit të pengohen gjatë testimit. Ngrini tunelin tuaj ndërsa një klient korporativ është i lidhur dhe arrini në përfundimin se kodi juaj është prishur, ndërsa platforma thjesht kaloi nga klienti tjetër. Miratimet mund të tërhiqen më vonë, dhe prepare() mund të kthejë null në pajisjet ku mungon aktiviteti i pëlqimit, prandaj establish() duhet ende të trajtojë dështimin.

API-të e fshehura dhe intentet e cilësimeve

Përgjigjet e vjetra tregojnë klasa com.android.internal dhe ndërfaqe AIDL që përdor klienti i integruar. Ato nuk janë në SDK, ndryshojnë mes versioneve pa njoftim dhe dyqanet e aplikacioneve e trajtojnë atë akses si rrezik. Rootimi i pajisjes as nuk i bën ato të qëndrueshme, sepse root dhe aksesi në API të fshehura janë probleme të palidhura.

Ndihma e navigimit e mbështetur është Settings.ACTION_VPN_SETTINGS, vlera e së cilës është android.net.vpn.SETTINGS. Zgjidheni përpara se ta lansoni, sepse disa ndërtime OEM nuk e ofrojnë atë aktivitet, dhe kaloni në hapa të shkruar kur zgjidhja dështon. Ajo e çon përdoruesin në ekran dhe nuk konfiguron asgjë.

Rrugët e pronarit të pajisjes dhe MDM janë përjashtimi që njerëzit zakonisht kanë parasysh. DevicePolicyManager mund të caktojë një paketë VPN gjithmonë aktive, dhe konfigurimet e menaxhuara mund të parangarkojnë cilësime për një klient që i mbështet, por kjo nuk është ende SDK publik që shkruan një profil PPTP.

Ndiqni vendimin nga ana e përdoruesit

Nëse produkti juaj duhet të mbajë trafik, planifikoni VpnService plus një stivë të vërtetë protokollesh, dhe parashikoni kohë për rrjedhën e pëlqimit dhe rregullin e një VPN. Nëse qëllimi është të lidheni me një profil ekzistues korporativ, puna juaj është udhëzimi: lidhje e thellë në ekranin e cilësimeve, dokumentoni fushat dhe lërini klientit të platformës të bëjë tunelizimin. Nëse aplikacioni duhet vetëm të arrijë një pikë fundore private, nuk ka fare nevojë për tunelin e vet.

Shkruajeni atë vendim përpara se të shkruani kod, sepse tre rrugët nuk kanë pothuajse asgjë të përbashkët pas sprintit të parë.

Një kontroll i fundit përpara se të filloni: a thotë kërkesa që lidhet aplikacioni ynë, apo që lidhet pajisja? E para është VpnService, e dyta është një profil që nuk mund ta krijoni. Ta formuloni saktë atë fjali është më lirë se çdo rifaktorim.

Artikuj të ngjashëm