Сиз Жөндөөлөрдөгү VPN сабын басасыз, башка бирөө орноткон профилди көрөсүз жана аны кошкон чакырымды издеп баштайсыз. Мындай чакырым жок. Колдонмо VpnService аркылуу өзүнүн туннелин ача алат, бирок ошол тизмедеги жазуулар платформага жана аларды түзгөн кардарга таандык. Чектин кайда экенин так билүү сизге жашыруун класстарды кууп жүрүүдөн бир жума үнөмдөйт.

Жөндөөлөр экраны көрсөткөндөн баштаңыз

VPN тизмеси — система же өндүрүүчүнүн кардары орноткон профилдердин реестри: PPTP, L2TP/IPsec, IKEv2 жана OEM колдонмосу же MDM түртүп киргизген катарлар. Ар бир сапта сервер дареги, каттоо маалыматтары жана сиздин процессиңизден сыртта жашаган протоколдун ишке ашырылышы бар. Колдонуучу ошол жерде Туташууну басканда туннелди платформанын кардары көтөрөт, сиздин код эмес. Ошондуктан сап кайра жүктөөдөн кийин да калат жана ошондуктан колдонмоңузду өчүрүү аны эч качан алып салбайт.

Колдонуучу тарабынан тизме API бетине окшош, VPN кошуу бир ниет аралыкта болушу керек болгон жер. Андай эмес. Ага тийген жалгыз коомдук кирүү чекиттери — навигация ниеттери, ал эми ага жазгандын баары платформага же артыкчылыгы бар компонентке таандык.

Практикалык жыйынтык: эгер колдоо тексті колдонуучуларга профилди Жөндөөлөрдө кошууну айтса, сиздин колдонмоңуз бул агымдын бөлүгү эмес.

VpnService чындыгында эмне берет

VpnService жана VpnService.Builder сиздин колдонмоңузга таандык бир туннелди сүрөттөйт. Сиз даректерди, маршруттарды, DNS серверлерин жана MTU кошосуз, трафикти addAllowedApplication() же addDisallowedApplication() аркылуу чектейсиз, анан establish() TUN интерфейси үчүн ParcelFileDescriptor кайтарат. Ошол учурдан тартып колдонмо IP пакеттерди окуп, жоопторду жазат, башкача айтканда протоколду ишке ашыруу же киргизүү — сиздин ишиңиз: OpenVPN, WireGuard, өзүңүздүн транспорт.

Бул ырааттуулукта эч нерсе PPTP, L2TP/IPsec же IKEv2 жөнүндө айтпайт. Builderде системанын L2TP кардарын колдон деген которгуч жок, жана платформа ээ болгон профилди башкарууга мүмкүндүк берген кайтарым чакыруу да жок. Бул чыныгы чек, жана бул уруксаттардагы кемчилик эмес, долбоордун чеги.

Ошондуктан колдонмо Androidде VPN кардары боло алат. Жөн гана телефон менен келген кардарлардын менеджери боло албайт.

Макулдук терезеси жасалга эмес

Туннелиңиз башка колдонмолордун трафигин кармай алгандыктан, система колдонуучудан ага ачык макулдук алат. prepare() сиз иштетүүгө тийиш Intent кайтарат, макулдук пакетиңизге байланган, ал эми туннель иштеп турганда статус тилкесинде туруктуу белги көрүнөт. Экинчи VPN көтөрүлсө, биринчиси өчөт, анткени Android бир убакта бир гана активдүү VPN иштетет.

Бир активдүү деген эреже сыноодо адамдарды адаштырат. Корпоративдик кардар туташкан кезде өз туннелиңизди көтөрүп, кодуңуз бузулду деп жыйынтык чыгарасыз, ал эми платформа жөн гана башка кардардан которулган. Макулдуктар кийинчерээк жокко чыгарылышы мүмкүн, жана макулдук ишмердүүлүгү жок түзмөктөрдө prepare() null кайтарышы мүмкүн, ошондуктан establish() дагы эле катаны иштетүүгө тийиш.

Жашыруун APIлер жана жөндөөлөр ниеттери

Эски жооптор ички кардар колдонгон com.android.internal класстарын жана AIDL интерфейстерин көрсөтөт. Алар SDKда жок, чыгарылыштардын ортосунда эскертүүсүз өзгөрөт, ал эми колдонмо дүкөндөрү бул кирүүнү тобокел деп эсептейт. Түзмөктү root кылуу да аларды туруктуу кылбайт, анткени root жана жашыруун APIге кирүү — байланышсыз маселелер.

Колдоого алынган навигация жардамчысы Settings.ACTION_VPN_SETTINGS, анын мааниси android.net.vpn.SETTINGS. Аны иштетүүдөн мурун чечиңиз, анткени айрым OEM курулуштары бул ишмердүүлүктү бербейт, ал эми чечүү ийгиликсиз болсо, жазуу түрүндөгү кадамдарга өтүңүз. Ал колдонуучуну экранга алып барат жана эч нерсени конфигурациялабайт.

Түзмөк ээси жана MDM жолдору — адамдар адатта айткан өзгөчөлүк. DevicePolicyManager дайыма күйүп турган VPN пакетин дайындай алат, ал эми башкарылуучу конфигурациялар аларды колдогон кардар үчүн жөндөөлөрдү алдын ала жүктөй алат, бирок бул дагы эле PPTP профилин жазган коомдук SDK эмес.

Чечимди колдонуучу тарабынан өткөрүңүз

Эгер өнүмүңүз трафикти ташууга тийиш болсо, VpnService жана чыныгы протоколдук стекти пландаңыз, макулдук агымына жана бир VPN эрежесине убакыт бөлүңүз. Эгер максат — бар корпоративдик профилге туташуу болсо, сиздин ишиңиз багыттоо: жөндөөлөр экранына терең шилтеме, талааларды документтештирүү, ал эми туннелди платформанын кардары жасасын. Эгер колдонмого жеке акыркы чекитке жетүү гана керек болсо, ага өз туннели таптакыр керек эмес.

Бул чечимди код жазганга чейин жазып коюңуз, анткени үч жолдун биринчи спринттен кийин дээрлик эч окшоштугу жок.

Баштоодон мурун акыркы текшерүү: талап биздин колдонмо туташат деп айтабы, же түзмөк туташабы? Биринчиси — VpnService, экинчиси — сиз түзө албаган профиль. Ошол сүйлөмдү туура түзүү каалаган кайра куруудан арзан.

Тектеш макалалар