നിങ്ങൾ സെറ്റിംഗ്സിൽ 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 സംസാരിക്കുന്നില്ല. സിസ്റ്റത്തിന്റെ L2TP ക്ലയന്റ് ഉപയോഗിക്കുക എന്ന് പറയുന്ന ഒരു സ്വിച്ചും Builder-ൽ ഇല്ല, പ്ലാറ്റ്ഫോം ഇതിനകം സ്വന്തമാക്കിയ ഒരു പ്രൊഫൈൽ നിയന്ത്രിക്കാൻ അനുവദിക്കുന്ന ഒരു കോൾബാക്കും ഇല്ല. അതാണ് യഥാർത്ഥ അതിർത്തി, അത് അനുമതികളുടെ വിടവല്ല, രൂപകൽപ്പനയുടെ അതിർത്തിയാണ്.

അതിനാൽ ഒരു ആപ്പിന് 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 ആണ്, രണ്ടാമത്തേത് നിങ്ങൾക്ക് സൃഷ്ടിക്കാനാകാത്ത ഒരു പ്രൊഫൈലാണ്. ആ വാചകം ശരിയാക്കുന്നത് ഏതൊരു പുനഃക്രമീകരണത്തെക്കാളും വിലകുറഞ്ഞതാണ്.

അനുബന്ധ ലേഖനങ്ങൾ