Как loft работает на телефоне, затем на Android TV / Google TV. Каталог: clients/Android/. План: clients/Android/PLAN_ru.md. Движок: clients/mobile/. Протокол: protocol.md. URI импорта: share.md. UX: clients/Android/design/DESIGN_ru.md. Макет: clients/Android/design/index.html.
Адаптер — Java. Сессия — Go.
приложения
→ tun0 у VpnService
→ LoftVpnService (app.loft.android)
→ clients/mobile (gomobile AAR)
→ loft / SSTP / VLESS / Trojan
→ protect(fd) на сокетах фронта
Процесса loft-front нет. Служба и есть сессия.
make -C clients/mobile android пишет clients/mobile/build/engine.aar (-androidapi 24, страницы 16 КиБ). Приложение зависит от этого файла. Для bind нужен NDK.
Java-пакет app.loft.engine: Engine, Snapshot, PacketSink, SocketProtector, Mobile.parseShare.
VpnService.protect(fd) через Engine.SetProtector. IP фронтов ещё excludeRoute на API 33+.
Смена пути: позже ConnectivityManager.NetworkCallback → NotifyPathChange; тонкий адаптер пока ждёт обрыв сокета и повторный набор в Go.
| AAR движка | API 24 |
| Приложение телефона | API 26, target 36 |
| Язык | Java 17 |
| Android TV / Google TV | тот же AAR; Leanback flavor позже (план фаза 4) |