Android-ஐ VPN இணைக்கப்பட்டுள்ளதா என்று கேட்க முடியாது. VpnService இணைப்பு நிலையை வழங்கும் getter எதையும் வெளிப்படுத்தவில்லை, நிலைப் பட்டியில் உள்ள சாவி ஐகானை கணினி வரையும், உங்கள் பயன்பாடு படிக்கக்கூடிய எதுவும் அல்ல. நீங்கள் செய்யக்கூடியது இணைப்பு ஸ்டாக்கிடம் இன்னும் குறுகிய கேள்வியைக் கேட்பதுதான்: இந்த பயன்பாட்டின் போக்குவரத்து எந்த பிணையத்தைப் பயன்படுத்துகிறது, அந்த பிணையம் VPN போக்குவரத்தைக் கொண்டுள்ளதா. இந்த வழிகாட்டி தவறான நேர்மறை முடிவுகளைத் தவிர்க்கும் வரிசையில் சோதனைகளை மேற்கொள்கிறது, சாதனத்தில் shell கட்டளையிலிருந்து பயன்பாட்டில் நீங்கள் விட்டுச் செல்லும் callback வரை.

பயன்பாட்டு குறியீட்டைத் தொடுவதற்கு முன் shell இலிருந்து சாதனத்தைச் சரிபார்க்கவும்

முதலில் ஒரு அடிப்படை நிலையை எடுங்கள். adb shell dumpsys connectivity கணினி அறிந்த ஒவ்வொரு பிணையத்தையும் அச்சிடுகிறது, ஒவ்வொரு தொகுதியும் அதன் போக்குவரத்துகளைப் பட்டியலிடுகிறது, எனவே VPN பிணையம் அந்தப் பட்டியலில் VPN உடன் தோன்றும். எல்லாவற்றுக்கும் முன் இயல்புநிலை பிணையத் தொகுதியைப் படியுங்கள், பின்னர் அதே போக்குவரத்தைக் கொண்டுள்ள பிற பிணையங்களைத் தேடுங்கள்.

இரண்டு வெளியீடுகள் வெவ்வேறு கேள்விகளுக்குப் பதிலளிக்கின்றன. VPN பிணையம் இருக்கிறதா என்பதும் உங்கள் பயன்பாடு அதைப் பயன்படுத்துகிறதா என்பதும் ஒன்றல்ல, பணி விவரக்குறிப்பு அல்லது இரண்டாம் பயனர் உள்ள சாதனத்தில் உங்கள் செயல்முறை இணையத்துடன் நேரடியாகப் பேசும்போது இரண்டும் ஒரே நேரத்தில் உண்மையாக இருக்கலாம். உங்கள் சாக்கெட்டுகள் என்ன செய்கின்றன என்பதைத் தீர்மானிப்பது செயலில் உள்ள பிணைய வரிசையே.

பயன்பாடு பயன்படுத்தும் பிணையத்தைக் கேளுங்கள்

குறியீட்டில் திறன் சோதனை நான்கு வரிகள். மேனிஃபெஸ்டில் ACCESS_NETWORK_STATE கேளுங்கள், பின்னர் செயலில் உள்ள பிணையத்தின் திறன்களை VPN போக்குவரத்துடன் ஒப்பிடுங்கள்:

ConnectivityManager cm = (ConnectivityManager)
    context.getSystemService(Context.CONNECTIVITY_SERVICE);
Network active = cm.getActiveNetwork();
NetworkCapabilities caps = cm.getNetworkCapabilities(active);
boolean vpnInUse = caps != null
    && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);

பதில் வேண்டுமென்றே குறுகியது: பயன்பாட்டின் இயல்புநிலை பிணையம் இப்போது VPN ஆக உள்ளதா. எந்த VPN, அது உங்களுடையதா, அல்லது சுரங்கப்பாதை மறுமுனையை அடைகிறதா என்பதைப் பற்றி எதுவும் கூறவில்லை. true ஐ “போக்குவரத்து ஏதோ ஒரு சுரங்கப்பாதை வழியாக வெளியேறுகிறது” என்று கருதி உங்கள் சொந்தக் கணக்கைத் தனியாக வைத்திருங்கள். ஒரே நேரத்தில் மூன்று விஷயங்களை அமைதியாகக் குறிக்கும் பூலியன் என்பதே, பயனர் VPN வழியாக உலாவும்போது அமைப்புகள் திரை VPN அணைக்கப்பட்டதாகத் தெரிவிப்பதற்கான காரணம்.

மாறாக, ஏதேனும் VPN பிணையம் உள்ளதா என்பதை அறிய வேண்டும் என்றால், cm.getAllNetworks() மீது மீண்டும் செய்து ஒவ்வொரு திறன் தொகுப்பையும் சோதிக்கவும். பிற பயன்பாடுகளை மூடும் ஆனால் உங்களுடையதை மூடாத பயன்பாடு-குறிப்பிட்ட VPN இயங்கும் சாதனத்தில் இரு பதில்களும் வேறுபடுகின்றன, அந்த வேறுபாடே தெளிவாக இயக்கத்தில் உள்ள VPN பயன்பாட்டுக்குத் தெரியவில்லை என்று கூறும் பெரும்பாலான பிழை அறிக்கைகளின் மூலம்.

கணக்கெடுப்புக்குப் பதிலாக மாற்றங்களைக் கண்காணியுங்கள்

டைமரில் கணக்கெடுப்பது இந்தக் கேள்விக்கு தவறான வடிவம், ஏனெனில் நிலை மாற்றங்கள் நிகழ்வுகளாக வருகின்றன. VPN போக்குவரத்துடன் பொருந்தும் கோரிக்கையைப் பதிவு செய்து, பொருந்தும் பிணையம் தோன்றும்போது, மறையும்போது அல்லது மாறும்போது கட்டமைப்பு உங்களுக்குச் சொல்லட்டும்:

NetworkRequest request = new NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_VPN)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
    .build();
cm.registerNetworkCallback(request, callback);

VPN பிணையம் ஒருபோதும் NET_CAPABILITY_NOT_VPN கொண்டிருக்காது, எனவே வெளிப்படையாக நீக்குவது நோக்கத்தை ஆவணப்படுத்துகிறது. அது இல்லாமலும் கோரிக்கை பொருந்தும், ஆனால் அடுத்து குறியீட்டைப் படிப்பவர் அதைத் தாமே கண்டுபிடிக்க வேண்டும்.

பதிவு கண்காணிப்பு தேவைப்படும் எல்லைக்கு உரியது, வழக்கமாக ஒரு திரை அல்லது முன்னணி சேவை. onStop அல்லது onDestroy இல் பதிவை நீக்குங்கள், ஏற்கனவே சென்ற செயல்பாட்டில் callback ஐத் தொங்கவிடாதீர்கள். தெரியும் கூறு இல்லாத பயன்பாடு நிரந்தர பார்வையாளருக்கு மோசமான புரவலன், நீங்கள் மறக்கும் callback களே கட்டமைப்பு மாற்றத்திற்குப் பின் செயலிழப்பவை.

மூன்று கேள்விகளைத் தனித்தனியாக வைத்திருங்கள்

இந்தத் துறையில் பெரும்பாலான குழப்பம் மூன்று வெவ்வேறு சோதனைகளை ஒன்றாகக் கருதுவதால் வருகிறது. அவை வெவ்வேறு API களைப் பயன்படுத்துகின்றன, ஒன்று உண்மையாக இருக்கும்போது மற்றவை பொய்யாக இருக்கலாம்.

QuestionHow you answer itWhat a yes means
Did the user grant VPN consent to my app?VpnService.prepare() returns nullConsent exists; the tunnel may still be down
Is the device sending default traffic through a VPN?TRANSPORT_VPN on the active networkSomething is tunneling, not necessarily your app
Did this request arrive through the VPN?Source address seen by the serverProof for that connection, nothing wider

மூன்றாவது வரிசை மக்கள் கிளையண்டில் பதிலளிக்க முயல்வது, அங்கு பதிலளிக்க முடியாது. VPN கிளையண்டுகளுக்கு அவர்களுக்கே உரிய முகவரிக் குளத்தைக் கொடுங்கள், சேவையகத்தில் மூல முகவரியைப் படியுங்கள்; அமர்வின் நடுவில் பயனர் சுரங்கப்பாதையை மாற்றினாலும் நிலைத்திருக்கும் ஒரே சான்று அதுவே.

தவறான நேர்மறை முடிவுகளை நீக்கும் சரிபார்ப்பு வரிசை

இன்னும் புழக்கத்தில் உள்ள பழைய மாதிரி குறியீடு getNetworkInfo(ConnectivityManager.TYPE_VPN) ஐ அழைக்கிறது. அந்த அழைப்பு வழக்கொழிந்தது, பல வெளியீடுகளில் VPN இணைக்கப்பட்டிருந்தபோதும் null திருப்பியது, அதனால்தான் நகலெடுக்கப்பட்ட துண்டுகள் வேலை செய்யும் சாதனத்தில் உடைந்ததாகத் தெரிகின்றன. திறன் சோதனைகள் அந்தப் பொறியைத் தவிர்த்து Android 5.0 முதல் ஒரே மாதிரி நடந்துகொள்கின்றன. இன்னும் அதை அழைக்கும் குறியீட்டுத் தளத்தைப் பராமரித்தால், மாற்று வழியில் சுற்றி வைப்பதற்குப் பதிலாக அழைப்பையே மாற்றுங்கள், ஏனெனில் தவறான பதிலை முதலில் உருவாக்கியது அந்த மாற்று வழியே.

ஒரு குறுக்குவழி எச்சரிக்கைக்குத் தகுதியானது. வெளிப்புற சேவை தெரிவிக்கும் பொது முகவரியை VPN வெளியேறும் முகவரியுடன் ஒப்பிடுவது பாதையைப் பற்றி ஏதோ ஒன்றை நிரூபிக்கிறது, ஆனால் ஒவ்வொரு சோதனைக்கும் மூன்றாம் தரப்பு கோரிக்கையைச் சேர்க்கிறது, அந்தச் சேவை இயங்குவதைச் சார்ந்துள்ளது, மேலும் தற்காலிகச் சேமிப்பு அல்லது தடுப்பு செய்யப்படலாம். அதை கைமுறை நோயறிதலாக வைத்திருங்கள், பயன்பாட்டுக்குள் நிலைச் சோதனையாக ஒருபோதும் இல்லை.

இந்த வரிசையில் சோதனைகளை இயக்கி, பயனரின் அறிக்கையுடன் முரண்படும் முதல் சோதனையில் நிறுத்துங்கள்: shell இல் போக்குவரத்து பட்டியல், செயலில் உள்ள பிணையத் திறன்கள், சுரங்கப்பாதையை இயக்கி அணைக்கும்போது callback நிகழ்வுகள், பின்னர் சேவையகப் பக்க மூல முகவரி. நான்கும் பொருந்தியும் பயன்பாடு இன்னும் தவறாக நடந்துகொண்டால், பிழை Android இன் பிணையப் பார்வையில் அல்ல, உங்கள் சொந்த நிலை இயந்திரத்தில் உள்ளது.

தொடர்புடைய கட்டுரைகள்