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 හි ජාල දර්ශනයේ නොව ඔබේම තත්ත්ව යන්ත්‍රයේ ඇත.

අදාළ ලිපි