Ответ 1
Я не знаю, почему я много раз искал Google, но не искал поиска. Глядя на века, я наконец нашел красивое написанное. Код буквально красив, что редко:
https://github.com/hexene/LocalVPN
В проекте не используется NDK или любой собственный код, чисто java, что делает его идеальным началом для простого проекта (не для того, чтобы он не был хорош для сложного). И рабочий процесс довольно прост:
- Когда приложение отправляет исходящий запрос (запрос от ОС Android на какой-либо сервер в Интернете), запрос приходит
LocalVPNService.class
- В
LocalVPNService
проверяется TCP/UDP-пакет и извлекается IP-адрес источника и получателя (для этого используетсяPacket.class
). -
LocalVPNService
устанавливает соединение от имени приложения, запускающего запрос, и вызываетVpnService.protect()
для вновь созданного соединения, чтобы избежать циклов. - Затем соединения передаются обработчикам, которые просто передают байты из/в два соединения в цикле. Потоки для ввода/вывода UDP/TCP управляются в разных рабочих классах и потоках.
Как вы можете видеть, гексен выполнил всю тяжелую работу и тяжелую работу уже.
Все классы, упомянутые выше, находятся в каталоге проектов. Я быстро просмотрел исходный код из github, описанный здесь рабочий процесс может быть неточным.