mirror of
https://github.com/by-sonic/tglock.git
synced 2026-08-02 16:45:50 +03:00
a87e26c581
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 — публиковать нечего, пока никто не запустил это на живом устройстве.
74 lines
2.8 KiB
TOML
74 lines
2.8 KiB
TOML
[package]
|
||
name = "tglock"
|
||
version = "2.0.0-beta.2"
|
||
edition = "2021"
|
||
rust-version = "1.88"
|
||
description = "Telegram unblock via local WebSocket tunnel"
|
||
license = "MIT"
|
||
autobins = false
|
||
|
||
[features]
|
||
default = ["gui"]
|
||
# The graphical application, on desktop and on Android. Turning it off drops
|
||
# Tauri, the system WebView and the frontend bundle from the build, which is
|
||
# what makes headless servers and machines without a GPU or monitor able to
|
||
# build and run TGLock at all.
|
||
gui = ["dep:tauri", "dep:tauri-build", "dep:tauri-plugin-opener"]
|
||
|
||
[lib]
|
||
# Отличается от имени бинаря намеренно: одинаковые имена lib и bin дают
|
||
# коллизию выходных файлов, которую cargo обещает сделать ошибкой.
|
||
name = "tglock_lib"
|
||
path = "src/lib.rs"
|
||
# Android загружает приложение как нативную библиотеку, а не как исполняемый
|
||
# файл, поэтому нужен cdylib. rlib остаётся для CLI и тестов.
|
||
crate-type = ["staticlib", "cdylib", "rlib"]
|
||
|
||
[[bin]]
|
||
name = "tglock"
|
||
path = "src/main.rs"
|
||
required-features = ["gui"]
|
||
|
||
[[bin]]
|
||
name = "tglock-cli"
|
||
path = "src/bin/cli.rs"
|
||
|
||
[dependencies]
|
||
tauri = { version = "2", features = [], optional = true }
|
||
# Opens the tg:// link. Unlike the `open` crate this works on Android too.
|
||
tauri-plugin-opener = { version = "2", optional = true }
|
||
clap = { version = "4", features = ["derive"] }
|
||
serde = { version = "1", features = ["derive"] }
|
||
serde_json = "1"
|
||
tokio = { version = "1", features = [
|
||
"rt-multi-thread",
|
||
"net",
|
||
"io-util",
|
||
"time",
|
||
"macros",
|
||
"sync",
|
||
"signal",
|
||
] }
|
||
# rustls вместо native-tls: на чистом Rust, поэтому кросскомпилируется под
|
||
# Android без OpenSSL, а на Linux снимает зависимость от системного libssl.
|
||
# webpki-roots несёт корневые сертификаты с собой, так что поведение одинаково
|
||
# на всех платформах и не зависит от системного хранилища.
|
||
tokio-tungstenite = { version = "0.24", features = ["rustls-tls-webpki-roots"] }
|
||
# Провайдер выбирается явно: rustls 0.23 не определяет его сам, если фичи не
|
||
# включают ровно один, и падает паникой при первом TLS-соединении. ring выбран
|
||
# потому что кросскомпилируется под Android без внешнего тулчейна.
|
||
rustls = { version = "0.23", default-features = false, features = [
|
||
"ring",
|
||
"std",
|
||
"tls12",
|
||
] }
|
||
futures-util = "0.3"
|
||
aes = "0.8"
|
||
ctr = "0.9"
|
||
cipher = "0.4"
|
||
sha2 = "0.10"
|
||
rand = "0.8"
|
||
|
||
[build-dependencies]
|
||
tauri-build = { version = "2", features = [], optional = true }
|