Dhana potofu ni kwamba programu ya VpnService hugeuza swichi ya mfumo na kwamba simu inalindwa kuanzia hapo. Kinachotokea kwa kweli ni finyu zaidi: programu inaomba idhini, inajenga kiolesura, inasoma na kuandika pakiti kupitia kielekezi cha faili, na hurudisha kiolesura inaposimama. Handaki moja tu kama hiyo inaweza kuwa hai kwa wakati mmoja, na mfumo unaweza kuichukua bila kuuliza. Sehemu kubwa ya tabia ya kuchanganya ambayo watu wanaisababisha itokane na itifaki inatoka kwenye mtindo huo wa umiliki.

Chukulia kila mpito wa mzunguko wa maisha kama sehemu ya muundo na si kama kesi ya pembeni.

Hadithi: programu huwasha VPN ya simu

Mtiririko huanza na VpnService.prepare(), ambayo hurudisha Intent ambayo mtumiaji lazima aikubali, na huendelea na establish(), ambayo bado inaweza kushindwa baadaye kwa sababu ambazo programu haidhibiti. Kuanzisha handaki la pili huzima kiolesura cha kwanza na hubadilisha arifa ya mfumo. Hakuna mahali popote katika mfululizo huo ambapo programu inamiliki swichi ya kifaa kizima; inamiliki kielekezi kilichopewa na pakiti zinazotua juu yake. Hata arifa ya kudumu ni ya mfumo na si ya muundo wa programu.

Kwa kuwa kiolesura kinatolewa na hakikamatwa, mteja mwingine anaweza kuchukua nafasi wakati wowote. Programu hujua hilo kupitia mwito wa kurudi, si kupitia thamani ya kurudi.

Kusimamishwa kwa programu kwa nguvu kunaonekana kwenye paneli ya arifa kwa sababu hiyo hiyo: mfumo unaripoti kile kilichotoa, si kile programu ilichagua kuonyesha.

Hadithi: idhini hutolewa mara moja

Mfumo unapokabidhi handaki kwa mteja mwingine, hutuma muamala wa kufuta kwenye binder ambayo darasa la msingi hurudisha kutoka onBind(). Programu inayobadilisha binder hiyo na yake lazima iwasilishe yenyewe muamala wa kufuta, vinginevyo VpnService.onRevoke() haitawahi kuanza na huduma itaendelea kuandika kwenye kielekezi kisichokuwepo tena. Mtumiaji pia anaweza kuondoa idhini, na mfumo unaweza kusimamisha huduma wakati wa kuwasha upya au kuunganisha tena kwa hali ya kuwaka kila wakati.

Kushughulikia hilo ni kazi halisi na si mstari wa logi: acha kusoma kielekezi, kifunge, futa bendera ya muunganisho na umwambie mtumiaji yuko katika hali gani. Kisha amua ikiwa programu inapaswa kuanzisha tena, kuuliza tena au kusubiri, kwa sababu katika usanidi wa kuwaka kila wakati mfumo unaweza kurudisha huduma yenyewe.

Programu inayochukulia ufutaji kama ubaguzi na si kama hali itaripoti imeunganishwa wakati kila pakiti inayoandika inatupwa, na hiyo ni hali mbaya zaidi ya kushindwa kwa chombo cha faragha.

Hadithi: kiolesura huchuja trafiki kwa niaba yako

Kinachofika ni IP mbichi. Kunasa au kuchuja kunamaanisha kuchambua vichwa vya IP, TCP, UDP na IPv6, kufuatilia mitiririko na kuandika majibu kurudi kwenye kielekezi, jambo ambalo hulifanya programu ya kunasa kuwa staki ndogo ya mtandao na si kitu cha mfumo. protect() ipo ili soketi ya usafirishaji ya programu yenyewe ipite handaki lake badala ya kujinasa yenyewe, na hurudisha thamani ya boolean inayostahili kukaguliwa kwenye kila soketi inayoundwa baada ya handaki kuwa juu.

Orodha za programu zilizoruhusiwa na zilizokatazwa kwenye kijenzi huamua trafiki ya nani inaingia kwenye kiolesura. Hazitoi ufikiaji wa mzigo zaidi ya pakiti za IP ambazo kiolesura hubeba, na hakuna API inayofichua handaki la mteja mwingine au kuorodhesha profaili za VPN za mfumo. Uwezo wa mtandao unaweza kusema mtandao ni usafirishaji wa VPN, lakini si handaki ni la nani.

Ndiyo sababu maswali ya hali kuhusu programu nyingine hupata majibu yanayopingana: taarifa haziko wazi kwa mchakato wako.

Kile mzunguko wa maisha unachohitaji kwa kweli

Fuatilia hali unazodhibiti: tayari, imeanzishwa, imefutwa, imesimamishwa. Kuunganisha tena kunapaswa kuwa kuvunja kisha kuanzisha, na mmiliki mmoja wa kielekezi na soketi ya usafirishaji, kwa sababu vipengele viwili vinavyoshindana kuanzisha vitagombana kwa nafasi moja iliyopo. Uanzishaji wa chinichini umezuiwa kwenye Android ya kisasa, kwa hivyo matangazo ya kuwasha hayo ni dhamana; tumia huduma ya mbele na arifa yake mahali ambapo kiwango cha API kinaruhusu.

Rekodi mpito na si hali ya mwisho pekee, na uweke mashine ya hali ndogo vya kutosha kujaribu kila njia. Hali ambayo huwezi kuifikia katika jaribio ni hali ambayo utaikuta uwandani bila logi.

Jaribu mzunguko wa maisha kwenye kifaa

Emulators zinaweza kughushi muunganisho lakini si njia ya idhini na ufutaji kwa kushawishi, kwa hivyo endesha hizi kwenye kifaa halisi kilichowekwa mteja wa pili wa VPN ili aibe nafasi.

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

Anzisha handaki, thibitisha arifa na kiolesura, kisha unganisha mteja mwingine na uangalie ikiwa mwito wa kurudi wa ufutaji unafanya kazi na hali inasafishwa. Simamisha programu kwa nguvu na uangalie ikiwa kuna kitu bado kinaripoti kielekezi hai.

Rudia mfululizo baada ya kuwasha upya kwa hali ya kuwaka kila wakati, kwa sababu njia hiyo ni tofauti na muunganisho ulioanzishwa na mtumiaji. Unachotafuta si ikoni ya kijani bali ushahidi kwamba programu iliacha kutumia kielekezi ambacho haikuwa ikimiliki tena.

Makala zinazohusiana