තවත් VPN එකක් දැනටමත් සක්රීය විට VpnService ආරක්ෂණය අසාර්ථක වේ
Android එක් එක් පරිශීලකයාට VPN අතුරුමුහුණතක් අනුමත කරයි. prepare, establish, protect සහ හිමිකම් පරීක්ෂණ පිළිවෙලට කරන්න, පසුව අවලංගු කිරීම හෝ යෙදුම අනුව බැහැර කිරීම තෝරන්න.
ඔබේ යෙදුම VpnService.prepare අමතයි, null ලබයි, උමගක් තනයි, විස්තරකරු වලංගු ලෙස පෙනේ, නමුත් සේවාදායකයට කිසිවක් ළඟා නොවේ. නැතහොත් prepare Intent එකක් ආපසු දෙයි, පරිශීලකයා එය අනුමත කරයි, එහෙත් establish තවමත් අසාර්ථක වේ. ප්රතිඵල දෙකම සාමාන්යයෙන් එකම දෙයක් අදහස් කරයි: තවත් යෙදුමක් මේ පරිශීලකයාගේ VPN අතුරුමුහුණත දැනටමත් හිමිකරගෙන ඇත, සහ ඔබේ protect ඇමතුම් ඔබේ උමගට භාවිත කළ නොහැකි සොකට් සලකුණු කරමින් සිටී. පහත පරීක්ෂණ පිළිවෙලට සම්පූර්ණ කර අසාර්ථක වන පළමු එකේ නතර වන්න, මන්ද පසු පියවරකට පෙර පියවරක් අලුත්වැඩියා කළ නොහැක.
protect ස්පර්ශ කිරීමට පෙර VPN ස්ථානය පරීක්ෂා කරන්න
Android සෑම පරිශීලකයෙකුටම හරියටම එක් සක්රීය VPN අතුරුමුහුණතක් ලබා දෙයි. මෙය වේදිකා නියමයකි, ඔබේ යෙදුමට ඉල්ලිය හැකි අවසරයක් නොවේ, එබැවින් දෙදෙනාම උමග වීමට කැමති සේවාදායකයන් දෙදෙනෙකුට එකට පැවතිය නොහැක.
වෙනත් යෙදුමක් සඳහා සකසන ලද සැමවිටම සක්රීය VPN එක වඩාත් අපහසු අවස්ථාවයි, මන්ද පද්ධතිය එම යෙදුම සම්බන්ධව තබා ගනී සහ අත්පත් කරගැනීම ප්රතික්ෂේප කරයි. AdGuard වැනි රථවාහන පෙරහනක්, ආයතනික සේවාදායකයක් හෝ පාරිභෝගික VPN එකක් පරිශීලකයා එය ස්ථාපිත බව අමතක කර ඇති අතරතුර ස්ථානය රඳවා ගත හැක. පරිශීලකයාගෙන් සැකසුම් විවෘත කර VPN යටතේ ලැයිස්තුගත සටහන කියවන ලෙස ඉල්ලන්න; එහි ඇති නම ඔබ තරඟ කරන හිමිකරුය. එම සටහන විසන්ධි නොකර හෝ සැමවිටම සක්රීය සැකසුම මකා නොදමා තිබේ නම්, ඔබේ VpnService අතුරුමුහුණත විය නොහැක.
පියවර 1: prepare ආපසු දෙන දේ කියවන්න
VpnService.prepare එක් ප්රශ්නයකට පිළිතුරු දෙයි: මෙම යෙදුමට VPN විය හැකිද? අනුමැතිය දැනටමත් තිබේ නම් එය null ආපසු දෙයි, පරිශීලකයා තවමත් අනුමත කළ යුතු නම් Intent එකක් දෙයි, එය ඔබ startActivityForResult සමඟ ආරම්භ කළ යුතුය. null ආපසු දීම දිගටම කරගෙන යාමට අවසරයක් ලෙස සලකන්න, establish සාර්ථක වන බවට සාක්ෂියක් ලෙස නොවේ.
Intent intent = VpnService.prepare(context);
if (intent != null) {
startActivityForResult(intent, REQUEST_VPN);
}Intent මාර්ගය ආපසු පැමිණ පරිශීලකයා ප්රතික්ෂේප කළේ නම්, ඊළඟ උත්සාහයේදී prepare නැවත Intent ආපසු දිගටම දෙනු ඇත. ලූපයක නැවත උත්සාහ කිරීම වෙනුවට ප්රතිඵල කේතය ලොග් කරන්න, මන්ද ප්රතික්ෂේප වූ අනුමැතිය පරිශීලකයාගේ තීරණයකි, තාවකාලික දෝෂයක් නොවේ.
පියවර 2: අතුරුමුහුණත ඔබේ යෙදුමට අයත් බව තහවුරු කරන්න
establish කර පසු ලැබෙන ParcelFileDescriptor ඔබේ හිමිකමේ සාක්ෂියයි, ඕනෑම සොකට් කටයුත්තකට පෙර එය පරීක්ෂා කිරීම වටී. null හෝ දැනටමත් වසා ඇති විස්තරකරුවක් යනු අතුරුමුහුණත කිසි විටෙක සාදා නැති බවයි, කිසිදු ව්යතිරේකයක් නොපෙනුණත්. builder හි අතුරුමුහුණත නම පද්ධතිය සක්රීය VPN සඳහා වාර්තා කරන නම සමඟ සසඳන්න, පරීක්ෂණ උපාංගයක dumpsys භාවිතා කරමින්. ඒවා වෙනස් නම්, ඔබ ගොඩනගන ලද උමග රථවාහන ගෙන යන උමග නොවේ.
adb shell dumpsys connectivityඑම නොගැලපීම සම්බන්ධිත නිරූපකයක් සමඟ මළ රථවාහන පැහැදිලි කරයි. පද්ධතිය අනෙක් යෙදුමේ උමග පෙන්වයි, ඔබේ කේතය තමන්ට අයත් නොවන අතුරුමුහුණතක විස්තරකරුවක් තබා ගනී.
පියවර 3: connect ට පෙර protect අමතන්න
අතුරුමුහුණත පවතින විට, ඔබේ යෙදුම විවෘත කරන සොකට් පෙරනිමියෙන් උමගට යොමු වේ. බාහිර ප්රවාහනයට එම නියමය අනුගමනය කළ නොහැක, නැතහොත් කැප්සියුලගත පැකට්ටුව අතුරුමුහුණතට ආපසු එනු ඇත, එබැවින් VpnService protect සොකට් එකක් VPN මඟ හැර පහළ ජාලය භාවිත කිරීමට සලකුණු කරයි. ඇමතුම boolean එකක් ආපසු දෙයි, එය නොසලකා හැරීම නිරෝගී ලෙස පෙනෙන නමුත් කිසිවක් නොගෙන යන සොකට් එකකට ළඟා වන මාර්ගයයි.
connect හෝ bind ට පෙර protect අමතන්න, කිසි විටෙක පසුව නොවේ. සොකට් සම්බන්ධ කිරීමට හෝ බැඳීමට පෙර ආරක්ෂණය ස්ථානගත විය යුතුය, මන්ද සම්බන්ධිත සොකට් දැනටමත් එහි මාර්ගය තෝරාගෙන ඇති අතර පසුව සිදු වන protect එය විශ්වාසදායක ලෙස නොසොලවයි. protect false ආපසු දුන්නොත්, නතර වී හිමිකම නැවත පරීක්ෂා කරන්න: අතුරුමුහුණත ඔබේ යෙදුමට අයත් නොවන විට එය අසාර්ථක වේ, එය තවත් VPN එකක් ඉතිරි කරන තත්ත්වයයි. false ආපසු දීම පියවර 1 ට ආපසු යාමේ සංඥාවකි, එම සොකට් නැවත උත්සාහ කිරීමේ නොවේ.
DatagramSocket socket = new DatagramSocket();
if (!vpnService.protect(socket)) {
return;
}
socket.connect(serverAddress, serverPort);පියවර 4: සොකට් අපහසු විට ක්රියාවලියක් බඳින්න
සමහර ප්රවාහන එක් සොකට් එකක් නොවේ: පුස්තකාලයක් කිහිපයක් විවෘත කළ හැක, නැතහොත් සහායක ක්රියාවලියක සෑම සම්බන්ධතාවයක්ම එකම පිටවීම භාවිත කරන ලෙස ඔබට අවශ්ය විය හැක. ConnectivityManager.bindProcessToNetwork ක්රියාවලිය තෝරාගත් ජාලයකට බඳියි, පැරණි setProcessDefaultNetwork ද එය කල් ඉකුත් වීමට පෙර එම කාර්යය කළේය. පහළ සම්බන්ධතාවය NET_CAPABILITY_NOT_VPN සමඟ ඉල්ලන්න, එවිට බැඳීම ඔබේ උමග යටතේ ඇති ජාලය තෝරා ගනු ඇත, උමගම නොවේ.
NetworkRequest request = new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.build();ක්රියාවලියක් බැඳීම දෙවන VPN එකක් නොවේ. එය එම ක්රියාවලියට පිටවීමක් තෝරයි, එය ඔබේ ප්රවාහනයට ප්රයෝජනවත් වන අතර එකවර උමග දෙකක් ක්රියාත්මක කිරීමට නිෂ්ප්රයෝජනවත් වේ.
කේත මාර්ගය නොව පරිශීලකයාගේ උපාංගය අලුත්වැඩියා කරන්න
යෙදුම් දෙකකට VPN ස්ථානය බෙදාගැනීමට ඉඩ දෙන API එකක් නොමැත, එබැවින් නිවැරදි කිරීම උපාංගයේ තත්ත්වයට අයත් වේ. පරිශීලකයාට පැහැදිලි මාර්ග දෙකක් ලබා දෙන්න: අනෙක් යෙදුමේ සම්බන්ධතාවය විසන්ධි කරන්න හෝ එහි සැමවිටම සක්රීය මකා දමන්න, එවිට ඔබේ prepare අත්පත් කරගත හැක, නැතහොත් එම යෙදුමේ යෙදුම අනුව සැකසුම් විවෘත කර ඔබේ යෙදුම එහි උමගෙන් බැහැර කරන්න. බැහැර කිරීම ඉතිරි සියල්ල සඳහා පෙරහන ක්රියාත්මකව තබා ඔබේ යෙදුමට සාමාන්ය සම්බන්ධතාවය භාවිත කිරීමට ඉඩ දෙයි, එය බොහෝ විට පරිශීලකයාට ඇත්තටම අවශ්ය ප්රතිඵලයයි.
මාර්ග දෙකම ඔබේ සහාය ලේඛනවල ලියන්න, මන්ද පරිශීලකයන් කුමන යෙදුම VPN හිමිද යන්න කලාතුරකින් දනී. සැකසුම්වලින් සක්රීය VPN නම සහ ඔබේ ලොග්වලින් prepare, establish සහ protect ප්රතිඵල එවන ලෙස ඔවුන්ගෙන් ඉල්ලන්න, එවිට එක් මිනිත්තුවකින් කුමන පියවර අසාර්ථක වූයේද යන්න කිව හැක. පසුව සැබෑ රථවාහන සමඟ සත්යාපනය කරන්න: නම් සෙවීමක්, TCP සම්බන්ධතාවයක් සහ උමග හරහා එක් ඉල්ලීමක්, සම්බන්ධිත නිරූපකය පමණක් නොවේ. වලංගු විස්තරකරුවක් සහ කොළ දර්ශකයක් වැඩිම වශයෙන් හිමිකම සනාථ කරයි, ප්රවාහනය මාර්ග නීතිවලින් ජීවත් වූ බව කිසි විටෙක නොවේ.
පරීක්ෂණ හතරම සමත් වී රථවාහන තවමත් මිය ගියොත්, හිමිකම තවදුරටත් ඔබේ ගැටලුව නොවේ. මාර්ගකරණය සහ සේවාදායක ළඟාවීම වෙත යන්න, සහ VPN යෙදුම ස්ථාපිත නොමැති උපාංගයකින් එම අක්තපත්ර පරීක්ෂා කරන්න.