mirror of
https://github.com/by-sonic/tglock.git
synced 2026-08-05 07:01:56 +03:00
feat(android): приложение под Android и переход на rustls
Android грузит приложение как нативную библиотеку и входит через JNI-символ, а не через main. Поэтому Tauri-приложение переехало из src/main.rs в src/gui.rs внутри библиотеки, с #[cfg_attr(mobile, tauri::mobile_entry_point)], а main.rs стал обёрткой. Модуль объявлен как #[cfg(feature = "gui")], так что свойство «--no-default-features даёт ядро без Tauri и WebView» сохранилось — проверено сборкой и 51 тестом headless-варианта. Переход на rustls — вынужденный, но выгодный. native-tls на Linux и Android тянет OpenSSL, а openssl-sys не кросскомпилируется под aarch64-linux-android: сборка падала на нём. rustls на чистом Rust, корневые сертификаты webpki вшиты в бинарь. Побочно: на Linux исчезла зависимость от системного libssl, а образу Docker больше не нужен даже ca-certificates. На этом переходе тест живой сети поймал баг, который прошёл бы в релиз: rustls 0.23 отказывается угадывать криптопровайдер и ПАНИКУЕТ на первом TLS- рукопожатии. Компиляция чистая, все офлайновые тесты зелёные — они ходят через локальный маршрут без TLS. То есть в сборку ушло бы приложение, не способное подключиться ни к чему. Провайдер (ring, кросскомпилируется под Android) устанавливается в ensure_crypto_provider, регрессию держит тест a_crypto_provider_is_available_for_tls. Живой тест против шести боевых дата-центров Telegram проходит. Прочее: - open::that заменён на tauri-plugin-opener: у крейта open нет реализации под Android, а плагин работает на обеих платформах. - Библиотека переименована в tglock_lib: одинаковые имена lib и bin давали коллизию выходных файлов, которую cargo обещает сделать ошибкой. - Программный рендер WebView не применяется на Android — там GPU есть всегда, и переопределение только замедлило бы интерфейс. - .gitignore: строка /gen скрывала весь сгенерированный Android-проект. Теперь игнорируются только артефакты сборки, local.properties и keystore. Foreground service. Прокси — поток в процессе приложения, и без сервиса система выгрузит его через минуты после сворачивания. Сервис стартует из MainActivity, а не по команде из ядра: JNI-мост между Rust и Kotlin осознанно не делался, чтобы не добавлять слой, который нельзя проверить. Плата — уведомление висит, пока открыто приложение, даже при выключенной защите. НЕ ПРОВЕРЕНО: вся Android-часть в рантайме. Устройств не подключено, эмулятора и системных образов в SDK нет. APK собирается, но приложение никто ни разу не запускал: ни интерфейс, ни сервис, ни тип specialUse на Android 14+, ни запрос разрешения на уведомления. Поэтому Android-артефакт сознательно НЕ добавлен в release.yml — публиковать нечего, пока никто не запустил это на живом устройстве.
This commit is contained in:
@@ -223,8 +223,6 @@ COPY . .
|
||||
RUN cargo build --release --locked --no-default-features --bin tglock-cli
|
||||
|
||||
FROM debian:bookworm-slim
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
COPY --from=build /src/target/release/tglock-cli /usr/local/bin/tglock-cli
|
||||
EXPOSE 1080
|
||||
ENTRYPOINT ["tglock-cli", "--lan", "--secret-file", "/data/secret"]
|
||||
@@ -234,7 +232,7 @@ ENTRYPOINT ["tglock-cli", "--lan", "--secret-file", "/data/secret"]
|
||||
docker run -d --name tglock -p 1080:1080 -v tglock-data:/data tglock
|
||||
```
|
||||
|
||||
Образу не нужны ни Node.js, ни `libwebkit2gtk` — только `ca-certificates` для проверки сертификата Telegram.
|
||||
Образу не нужно вообще ничего: ни Node.js, ни `libwebkit2gtk`, ни даже `ca-certificates` — TLS работает на rustls, а корневые сертификаты вшиты в бинарь.
|
||||
|
||||
---
|
||||
|
||||
@@ -411,7 +409,7 @@ TGLock определяет Telegram по IP получателя и завор
|
||||
| **Tauri 2** | Нативная оболочка для GUI. Опциональна: за фичей `gui`, в CLI не входит |
|
||||
| **TypeScript + Vite** | Интерфейс, внутренняя навигация и строгая типизация |
|
||||
| **tokio** | Async I/O, обработка сигналов для корректной остановки сервиса |
|
||||
| **tokio-tungstenite** | WebSocket-клиент с TLS поверх `native-tls` |
|
||||
| **tokio-tungstenite** + **rustls** | WebSocket-клиент с TLS на чистом Rust: без системного OpenSSL, кросскомпилируется под Android, корневые сертификаты вшиты |
|
||||
| **aes** + **ctr** | Расшифровка MTProto `obfuscated2` init-пакета |
|
||||
| **clap** | Разбор аргументов `tglock-cli` |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user