તમારી Android એપ સિસ્ટમ VPN પ્રોફાઇલ કેમ ઉમેરી શકતી નથી
VpnService એ તમારી એપની માલિકીનું ટનલ બનાવે છે; તે ફોનની PPTP, L2TP કે IPsec એન્ટ્રીઓ ઉમેરી કે સંપાદિત કરી શકતું નથી. સીમા અનુસરો અને યોગ્ય માર્ગ પસંદ કરો.
તમે સેટિંગ્સમાં VPN પંક્તિ પર ટૅપ કરો છો, બીજા કોઈએ ઇન્સ્ટોલ કરેલી પ્રોફાઇલ જુઓ છો અને એ ઉમેરતો કૉલ શોધવા લાગો છો. એવો કોઈ કૉલ નથી. એપ VpnService દ્વારા પોતાનું ટનલ ખોલી શકે છે, પણ એ યાદીની એન્ટ્રીઓ પ્લેટફોર્મની અને જેણે તે બનાવી તે ક્લાઇન્ટની છે. રેખા ક્યાં છે તે ચોક્કસ જાણવું તમને છુપી ક્લાસની પાછળ દોડવાના એક અઠવાડિયાથી બચાવે છે.
સેટિંગ્સ સ્ક્રીન શું બતાવે છે તેનાથી શરૂ કરો
VPN યાદી એ સિસ્ટમ કે વેન્ડર ક્લાઇન્ટે ઇન્સ્ટોલ કરેલી પ્રોફાઇલોનું રજિસ્ટર છે: PPTP, L2TP/IPsec, IKEv2 અને OEM એપ કે MDM દ્વારા દબાવેલી ગમે તે પંક્તિઓ. દરેક પંક્તિ સર્વર સરનામું, ઓળખપત્રો અને પ્રોટોકૉલ અમલીકરણ ધરાવે છે જે તમારી પ્રોસેસની બહાર રહે છે. જ્યારે વપરાશકર્તા ત્યાં કનેક્ટ પર ટૅપ કરે છે, ત્યારે ટનલ પ્લેટફોર્મ ક્લાઇન્ટ ઉપાડે છે, તમારો કોડ નહીં. એટલે જ પંક્તિ રીબૂટ પછી પણ ટકે છે અને એટલે જ તમારી એપ અનઇન્સ્ટોલ કરવાથી તે ક્યારેય દૂર થતી નથી.
વપરાશકર્તાની બાજુથી યાદી API સપાટી જેવી લાગે છે, એવી જગ્યા જ્યાં VPN ઉમેરવું એક ઇન્ટેન્ટના અંતરે હોવું જોઈએ. એવું નથી. તેને સ્પર્શતા એકમાત્ર જાહેર પ્રવેશબિંદુઓ નેવિગેશન ઇન્ટેન્ટ છે, અને તેમાં જે લખે છે તે બધું પ્લેટફોર્મ કે વિશેષાધિકાર પ્રાપ્ત ઘટકનું છે.
વ્યવહારુ પરિણામ: જો સપોર્ટ ટેક્સ્ટ વપરાશકર્તાઓને સેટિંગ્સમાં પ્રોફાઇલ ઉમેરવા કહે, તો તમારી એપ એ પ્રવાહનો ભાગ જ નથી.
VpnService ખરેખર તમને શું આપે છે
VpnService અને VpnService.Builder એક ટનલ વર્ણવે છે જે તમારી એપની માલિકીનું છે. તમે સરનામાં, રૂટ, DNS સર્વર અને MTU ઉમેરો છો, addAllowedApplication() કે addDisallowedApplication() વડે ટ્રાફિકની સીમા નક્કી કરો છો, અને પછી establish() TUN ઇન્ટરફેસ માટે ParcelFileDescriptor પરત આપે છે. એ ક્ષણથી એપ IP પૅકેટ વાંચે છે અને જવાબ લખે છે, એટલે પ્રોટોકૉલ અમલમાં મૂકવો કે જડવો તમારો કામ છે: OpenVPN, WireGuard, કસ્ટમ ટ્રાન્સપોર્ટ.
એ ક્રમમાં કંઈ PPTP, L2TP/IPsec કે IKEv2 બોલતું નથી. Builder પાસે એવો સ્વિચ નથી જે કહે સિસ્ટમનો L2TP ક્લાઇન્ટ વાપરો, અને એવો કોઈ કૉલબૅક નથી જે પ્લેટફોર્મ પાસે પહેલેથી હોય એવી પ્રોફાઇલ ચલાવવા દે. આ જ સાચી સીમા છે, અને તે પરવાનગીઓની ખાલી જગ્યા નહીં, ડિઝાઇનની સીમા છે.
તેથી એપ Android પર ચોક્કસપણે VPN ક્લાઇન્ટ હોઈ શકે. ફક્ત ફોન સાથે આવતા ક્લાઇન્ટ માટે મેનેજર ન હોઈ શકે.
સંમતિનું સંવાદ સજાવટ નથી
તમારું ટનલ બીજી એપનો ટ્રાફિક પકડી શકે છે, તેથી સિસ્ટમ વપરાશકર્તા પાસે તેને સ્પષ્ટ મંજૂરી મંગાવે છે. prepare() એક Intent પરત આપે છે જે તમારે શરૂ કરવો પડે, મંજૂરી તમારા પૅકેજ સાથે બંધાયેલી છે, અને ટનલ ચાલુ હોય ત્યારે સ્ટેટસ બાર કાયમી સૂચક બતાવે છે. બીજું VPN ઉપર આવે તો પહેલું નિષ્ક્રિય થાય, કારણ કે Android એક સમયે એક જ સક્રિય VPN ચલાવે છે.
એક-સક્રિયનો નિયમ પરીક્ષણમાં લોકોને ભૂલ કરાવે છે. તમે કોર્પોરેટ ક્લાઇન્ટ જોડાયેલો હોય તે વખતે તમારું ટનલ ઉપાડો છો અને નિષ્કર્ષ કાઢો છો કે તમારો કોડ તૂટેલો છે, જ્યારે પ્લેટફોર્મ ફક્ત બીજા ક્લાઇન્ટથી ખસી ગયું છે. મંજૂરીઓ પછીથી રદ થઈ શકે છે, અને જે ઉપકરણોમાં સંમતિ પ્રવૃત્તિ નથી ત્યાં prepare() null પરત આપી શકે છે, તેથી establish() એ નિષ્ફળતા હજી સંભાળવી પડે.
છુપાયેલ API અને સેટિંગ્સ ઇન્ટેન્ટ
જૂના જવાબો com.android.internal ક્લાસ અને AIDL ઇન્ટરફેસ તરફ ઇશારો કરે છે જે બિલ્ટ-ઇન ક્લાઇન્ટ વાપરે છે. તે SDKમાં નથી, રિલીઝ વચ્ચે જાણ કર્યા વિના બદલાય છે, અને એપ સ્ટોર એ ઍક્સેસને જોખમ ગણે છે. ઉપકરણ રૂટ કરવાથી પણ તે સ્થિર નથી થતું, કારણ કે root અને છુપાયેલ API ઍક્સેસ બે અલગ સમસ્યાઓ છે.
સમર્થિત નેવિગેશન સહાયક Settings.ACTION_VPN_SETTINGS છે, જેની કિંમત android.net.vpn.SETTINGS છે. શરૂ કરતા પહેલા તેને રિઝૉલ્વ કરો, કારણ કે કેટલાક OEM બિલ્ડ એ પ્રવૃત્તિ આપતા નથી, અને રિઝૉલ્વ નિષ્ફળ જાય તો લેખિત પગલાં પર જાઓ. તે વપરાશકર્તાને સ્ક્રીન પર લઈ જાય છે અને કંઈ ગોઠવતું નથી.
ડિવાઇસ-માલિક અને MDM માર્ગ એ અપવાદ છે જે લોકો સામાન્ય રીતે ધારે છે. DevicePolicyManager હંમેશા-ચાલુ VPN પૅકેજ નિયુક્ત કરી શકે છે, અને મેનેજ્ડ કન્ફિગરેશન એ ક્લાઇન્ટ માટે સેટિંગ્સ પ્રીલોડ કરી શકે છે જે તેમને સમર્થન આપે છે, પણ એ હજી પણ જાહેર SDK દ્વારા PPTP પ્રોફાઇલ લખવાનું નથી.
વપરાશકર્તાની બાજુથી નિર્ણય પર ચાલો
જો તમારા ઉત્પાદને ટ્રાફિક વહન કરવો હોય, તો VpnService સાથે સાચો પ્રોટોકૉલ સ્ટૅક ગણો, અને સંમતિ પ્રવાહ તથા એક-VPN નિયમ માટે સમય ફાળવો. જો લક્ષ્ય હાલની કોર્પોરેટ પ્રોફાઇલ સાથે જોડાવાનું હોય, તો તમારું કામ માર્ગદર્શન છે: સેટિંગ્સ સ્ક્રીન પર ડીપ-લિંક, ફીલ્ડનું દસ્તાવેજીકરણ, અને ટનલિંગ પ્લેટફોર્મ ક્લાઇન્ટને કરવા દો. જો એપને ફક્ત ખાનગી એન્ડપૉઇન્ટ સુધી પહોંચવાનું હોય, તો તેને પોતાનું ટનલ જરૂરી જ નથી.
કોડ લખતા પહેલા એ નિર્ણય લખી લો, કારણ કે પહેલા સ્પ્રિન્ટ પછી ત્રણેય માર્ગમાં લગભગ કંઈ સામ્ય નથી.
શરૂ કરતા પહેલા છેલ્લી ચકાસણી: જરૂરિયાત કહે છે કે આપણી એપ જોડાય છે, કે ઉપકરણ જોડાય છે? પહેલું VpnService છે, બીજું એ પ્રોફાઇલ છે જે તમે બનાવી શકતા નથી. એ વાક્ય સાચું ઘડવું કોઈ પણ રીફૅક્ટરિંગ કરતાં સસ્તું છે.