तुम्ही सेटिंग्जमधील 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 मध्ये नाहीत, आवृत्त्यांदरम्यान सूचनेशिवाय बदलतात, आणि ॲप स्टोअर्स त्या प्रवेशाला जोखीम मानतात। डिव्हाइस रूट केल्यानेही ते स्थिर होत नाहीत, कारण रूट आणि लपलेल्या API चा प्रवेश या असंबंधित समस्या आहेत।

समर्थित नेव्हिगेशन सहाय्यक Settings.ACTION_VPN_SETTINGS आहे, ज्याचे मूल्य android.net.vpn.SETTINGS आहे। सुरू करण्यापूर्वी ते रिझॉल्व्ह करा, कारण काही OEM बिल्ड ती ॲक्टिव्हिटी देत नाहीत, आणि रिझॉल्व्ह अयशस्वी झाल्यास लिखित पायऱ्यांकडे जा। ते वापरकर्त्याला स्क्रीनवर नेते आणि काहीही कॉन्फिगर करत नाही।

डिव्हाइस-मालक आणि MDM मार्ग हे लोक सहसा म्हणत असलेले अपवाद आहेत। DevicePolicyManager नेहमी-चालू VPN पॅकेज नियुक्त करू शकते, आणि व्यवस्थापित कॉन्फिगरेशन ते समर्थित करणाऱ्या क्लायंटसाठी सेटिंग्ज पूर्वी लोड करू शकतात, पण ते अजूनही सार्वजनिक SDK PPTP प्रोफाइल लिहिणे नाही।

वापरकर्त्याच्या बाजूने निर्णय घ्या

तुमच्या उत्पादनाला रहदारी वाहून न्यायची असेल, तर VpnService सोबत खरा प्रोटोकॉल स्टॅक नियोजित करा, आणि संमती प्रवाह व एक-VPN नियमासाठी वेळ राखून ठेवा। लक्ष्य विद्यमान कॉर्पोरेट प्रोफाइलशी जोडणे असेल, तर तुमचे काम मार्गदर्शन आहे: सेटिंग्ज स्क्रीनवर डीप लिंक, फील्ड्सचे दस्तऐवजीकरण, आणि टनेलिंग प्लॅटफॉर्म क्लायंटला करू द्या। ॲपला फक्त खाजगी एंडपॉइंटपर्यंत पोहोचायचे असेल, तर त्याला स्वतःचे टनेल अजिबात आवश्यक नाही।

कोड लिहिण्यापूर्वी तो निर्णय लिहून ठेवा, कारण पहिल्या स्प्रिंटनंतर तीनही मार्गांत जवळपास काहीही सामाईक नाही।

सुरुवातीपूर्वीची शेवटची तपासणी: गरज सांगते की आमचे ॲप जोडते की डिव्हाइस जोडते? पहिले VpnService आहे, दुसरे अशी प्रोफाइल आहे जी तुम्ही तयार करू शकत नाही। ते वाक्य बरोबर करणे कोणत्याही पुनर्रचनेपेक्षा स्वस्त आहे।

संबंधित लेख