తప్పు ఊహ ఏమిటంటే VpnService యాప్ సిస్టమ్ స్విచ్ని తిప్పుతుంది మరియు అప్పటి నుండి ఫోన్ రక్షించబడుతుంది. వాస్తవానికి జరిగేది మరింత సన్నని: యాప్ సమ్మతిని అడుగుతుంది, ఇంటర్ఫేస్ను నిర్మిస్తుంది, ఫైల్ డిస్క్రిప్టర్ ద్వారా ప్యాకెట్లను చదువుతుంది మరియు రాస్తుంది, ఆగినప్పుడు ఇంటర్ఫేస్ను తిరిగి ఇస్తుంది. ఒకేసారి అలాంటి ఒక సొరంగం మాత్రమే సజీవంగా ఉండగలదు, మరియు సిస్టమ్ అడగకుండానే దాన్ని తీసుకోగలదు. ప్రోటోకాల్పై ప్రజలు ఆపాదించే గందరగోళ ప్రవర్తనలో ఎక్కువ భాగం ఆ యాజమాన్య నమూనా నుండే వస్తుంది.

ప్రతి జీవిత చక్ర మార్పును అంచు కేసుగా కాకుండా డిజైన్లో భాగంగా పరిగణించండి.

అపోహ: యాప్ ఫోన్ VPNని ఆన్ చేస్తుంది

VpnService.prepare() తో ప్రవాహం మొదలవుతుంది, అది వినియోగదారు అంగీకరించాల్సిన Intentని తిరిగి ఇస్తుంది, మరియు establish() తో కొనసాగుతుంది, అది తర్వాత కూడా యాప్ నియంత్రించని కారణాల వల్ల విఫలం కావచ్చు. రెండవ సొరంగాన్ని ఏర్పాటు చేయడం మొదటి ఇంటర్ఫేస్ను నిష్క్రియం చేస్తుంది మరియు సిస్టమ్ నోటిఫికేషన్ను భర్తీ చేస్తుంది. ఆ క్రమంలో ఎక్కడా యాప్ మొత్తం పరికరం స్విచ్ని కలిగి ఉండదు; దానికి ఇచ్చిన డిస్క్రిప్టర్ మరియు దానిపై వచ్చే ప్యాకెట్లు మాత్రమే ఉంటాయి. శాశ్వత నోటిఫికేషన్ కూడా యాప్ డిజైన్ది కాదు, సిస్టమ్ది.

ఇంటర్ఫేస్ లాక్కోవడం కాదు, ఇవ్వడం, కాబట్టి మరో క్లయింట్ ఎప్పుడైనా స్థలాన్ని తీసుకోవచ్చు. యాప్ దాన్ని రిటర్న్ విలువ ద్వారా కాదు, కాల్బ్యాక్ ద్వారా తెలుసుకుంటుంది.

యాప్ను బలవంతంగా ఆపడం నోటిఫికేషన్ ప్యానెల్లో కనిపించడానికి కూడా అదే కారణం: సిస్టమ్ ఏమి ఇచ్చిందో నివేదిస్తుంది, యాప్ ఏమి చూపాలని ఎంచుకుందో కాదు.

అపోహ: సమ్మతి ఒకసారి మాత్రమే ఇవ్వబడుతుంది

సిస్టమ్ సొరంగాన్ని మరో క్లయింట్కు అప్పగించినప్పుడు, బేస్ క్లాస్ onBind() నుండి తిరిగి ఇచ్చే binderపై రద్దు లావాదేవీని పంపుతుంది. ఆ binderను తనదానితో భర్తీ చేసే యాప్ రద్దు లావాదేవీని తానే ముందుకు పంపాలి, లేకపోతే VpnService.onRevoke() ఎప్పటికీ ప్రేరేపించబడదు మరియు సేవ ఇక లేని డిస్క్రిప్టర్లో రాస్తూనే ఉంటుంది. వినియోగదారు కూడా అనుమతిని ఉపసంహరించుకోవచ్చు, మరియు సిస్టమ్ పునఃప్రారంభం లేదా ఎల్లప్పుడూ ఆన్ పునఃకనెక్షన్ సమయంలో సేవను ఆపవచ్చు.

దీన్ని నిర్వహించడం లాగ్ లైన్ కాదు, నిర్దిష్ట పని: డిస్క్రిప్టర్ చదవడం ఆపండి, దాన్ని మూసివేయండి, కనెక్ట్ ఫ్లాగ్ను తుడిచివేయండి మరియు వినియోగదారు ఏ స్థితిలో ఉన్నారో చెప్పండి. తర్వాత యాప్ మళ్లీ ఏర్పాటు చేయాలా, మళ్లీ అడగాలా లేదా వేచి ఉండాలా నిర్ణయించండి, ఎందుకంటే ఎల్లప్పుడూ ఆన్ కాన్ఫిగరేషన్లో సిస్టమ్ సేవను తానే తిరిగి తీసుకురావచ్చు.

రద్దును స్థితిగా కాకుండా మినహాయింపుగా పరిగణించే యాప్, తాను రాసే ప్రతి ప్యాకెట్ విసిరివేయబడుతున్నప్పటికీ కనెక్ట్ అయినట్లు నివేదిస్తుంది, మరియు గోప్యతా సాధనానికి ఇది సాధ్యమయ్యే అత్యంత దారుణమైన వైఫల్య విధానం.

అపోహ: ఇంటర్ఫేస్ మీ కోసం ట్రాఫిక్ను వడపోస్తుంది

వచ్చేది ముడి IP. సంగ్రహించడం లేదా వడపోయడం అంటే IP, TCP, UDP మరియు IPv6 శీర్షికలను విశ్లేషించడం, ప్రవాహాలను ట్రాక్ చేయడం మరియు ప్రత్యుత్తరాలను డిస్క్రిప్టర్కు తిరిగి రాయడం, ఇది సంగ్రహణ యాప్ను సిస్టమ్ సౌకర్యం కాకుండా చిన్న నెట్వర్క్ స్టాక్గా మారుస్తుంది. protect() ఉనికిలో ఉన్నది యాప్ స్వంత రవాణా సాకెట్ తనను తాను పట్టుకోకుండా తన సొరంగాన్ని దాటడానికి, మరియు సొరంగం లేచిన తర్వాత సృష్టించబడే ప్రతి సాకెట్పై తనిఖీ చేయదగిన బూలియన్ విలువను అది తిరిగి ఇస్తుంది.

బిల్డర్ యొక్క అనుమతించిన మరియు నిషేధించిన యాప్ జాబితాలు ఎవరి ట్రాఫిక్ ఇంటర్ఫేస్లోకి ప్రవేశిస్తుందో నిర్ణయిస్తాయి. అవి ఇంటర్ఫేస్ మోసే IP ప్యాకెట్లకు మించిన పేలోడ్కు ప్రవేశాన్ని ఇవ్వవు, మరియు ఏ API కూడా మరో క్లయింట్ సొరంగాన్ని బహిర్గతం చేయదు లేదా సిస్టమ్ VPN ప్రొఫైళ్లను జాబితా చేస్తుంది. నెట్వర్క్ సామర్థ్యాలు ఒక నెట్వర్క్ VPN రవాణా అని చెప్పగలవు, కానీ సొరంగం ఎవరిదో చెప్పలేవు.

అందుకే ఇతర యాప్ల గురించి స్థితి ప్రశ్నలకు విరుద్ధమైన సమాధానాలు వస్తాయి: సమాచారం మీ ప్రక్రియకు బహిర్గతం కావడమే లేదు.

జీవిత చక్రం నిజంగా ఏమి కోరుతుంది

మీరు నియంత్రించే స్థితులను ట్రాక్ చేయండి: సిద్ధం, ఏర్పాటు, రద్దు, ఆపివేయబడింది. పునఃకనెక్షన్ విచ్ఛిన్నం తర్వాత ఏర్పాటు అయి ఉండాలి, డిస్క్రిప్టర్ మరియు రవాణా సాకెట్కు ఒకే యజమానితో, ఎందుకంటే ఏర్పాటు కోసం పోటీపడే రెండు భాగాలు ఉన్న ఏకైక ఖాళీ స్థలం కోసం పోరాడతాయి. ఆధునిక Androidలో నేపథ్య ప్రారంభాలు పరిమితం, కాబట్టి బూట్ ప్రసారం హామీ కాదు; API స్థాయి అనుమతించిన చోట దాని నోటిఫికేషన్తో ఫోర్గ్రౌండ్ సేవను ఉపయోగించండి.

చివరి స్థితిని మాత్రమే కాదు, మార్పును లాగ్ చేయండి, మరియు ప్రతి మార్గాన్ని పరీక్షించగలిగేంత చిన్నదిగా స్థితి యంత్రాన్ని ఉంచండి. పరీక్షలో మీరు చేరుకోలేని స్థితి, లాగ్ లేకుండా క్షేత్రంలో ఎదురయ్యే స్థితి.

పరికరంలో జీవిత చక్రాన్ని పరీక్షించండి

ఎమ్యులేటర్లు కనెక్టివిటీని నకిలీ చేయగలవు, కానీ సమ్మతి మరియు రద్దు మార్గాన్ని నమ్మదగిన విధంగా కాదు, కాబట్టి వీటిని స్థలాన్ని దొంగిలించడానికి రెండవ VPN క్లయింట్ ఇన్స్టాల్ చేసిన నిజమైన పరికరంలో అమలు చేయండి.

adb shell dumpsys connectivity | grep -i -A3 vpn
adb shell dumpsys activity services | grep -i -A2 vpnservice
adb logcat -s VpnService:V AndroidRuntime:E
adb shell am force-stop com.example.vpnapp

సొరంగాన్ని ప్రారంభించండి, నోటిఫికేషన్ మరియు ఇంటర్ఫేస్ను నిర్ధారించండి, తర్వాత మరో క్లయింట్ను కనెక్ట్ చేసి రద్దు కాల్బ్యాక్ నడుస్తుందో, స్థితి తుడిచిపెట్టుకుపోతుందో చూడండి. యాప్ను బలవంతంగా ఆపి, ఇంకా సజీవ డిస్క్రిప్టర్ను ఏదైనా నివేదిస్తుందో లేదో తనిఖీ చేయండి.

ఎల్లప్పుడూ ఆన్ పునఃప్రారంభం తర్వాత క్రమాన్ని పునరావృతం చేయండి, ఎందుకంటే ఆ మార్గం వినియోగదారు ప్రారంభించిన కనెక్షన్ నుండి భిన్నం. మీరు వెతుకుతున్నది ఆకుపచ్చ చిహ్నం కాదు, యాప్ ఇక తనది కాని డిస్క్రిప్టర్ను ఉపయోగించడం ఆపేసిందని రుజువు.

సంబంధిత వ్యాసాలు