███████ ███ ███ ██████ ███████ ███████ ████████ ██ ██ ██████
██ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██
█████ ██ ████ ██ ██ ██ ███████ █████ ██ ██ ██ ██████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██████ ███████ ███████ ██ ██████ ██
Одна команда — Android готов к FindMyDevice. С верификацией подписи F-Droid.
Кроссплатформенная (Linux + Windows 10/11) утилита для настройки Android-приложения
FindMyDevice (de.nulide.findmydevice):
выдача всех runtime/special permissions через ADB, установка APK с F-Droid с
проверкой подписи репозитория и SHA-256 каждого скачанного файла, опциональная
установка Sunup
как UnifiedPush-distributor.
- Quickstart
- Что умеет
- Headless mode (CLI флаги)
- Верификация APK
- Permissions, которые выдаются
- Сборка
- Где живёт конфиг
- Архитектура
- License
make build-linux # → dist/fmd-setup-linux-amd64
./dist/fmd-setup-linux-amd64 # запустится интерактивный TUI- На телефоне включи Параметры разработчика → Отладка по USB.
- Подключи телефон по USB, нажми Allow на RSA-диалоге.
- В TUI выбери
[1] GRANT→[2] INSTALL→[3] CHECK(или headless — см. ниже).
- 🔌 Автодетект ADB. Если
adbне найден в PATH, утилита предложит: скачать portableplatform-toolsсdl.google.com, показать команду для системной установки, либо указать путь вручную. - 📱 Установка APK с F-Droid для трёх пакетов: FMD, Sunup (UnifiedPush distributor), F-Droid client.
- 🔐 Выдача всех permissions через
pm grant: location, SMS, телефон, камера/микро, Bluetooth, уведомления, плюс optionalWRITE_SECURE_SETTINGS. - ⚙️ «Special» permissions, которые не поддаются
pm grant: battery whitelist, overlay, notification listener. - ✅ CHECK-таблица по
dumpsys package— какое разрешение granted/denied/unsupported. - 🧹 Полное удаление FMD/Sunup/F-Droid + сброс special-настроек одной командой.
- 🛰️ Live device watcher в TUI: показывает статус устройства в реальном времени (с active ping для обхода кеша adb-сервера).
- 💀 DedSec-style UI: ANSI-цвета, глитч-эффекты, alt-screen Bubble Tea.
Для скриптов и автоматизации — без TUI:
fmd-setup --action <name> [--device SERIAL] [--adb PATH] [--yes] [--no-color]--action |
Что делает |
|---|---|
grant-all |
Выдаёт все runtime/optional permissions + special-настройки |
revoke-all |
Снимает всё (destructive, требует --yes) |
check |
Печатает таблицу granted/denied для всех permissions |
dump |
Сырой обрезанный dumpsys package <fmd> |
install-fmd |
Скачивает (с верификацией) и ставит FMD APK |
install-sunup |
То же для Sunup |
install-fdroid |
То же для F-Droid client |
uninstall-all |
Сносит FMD/Sunup/F-Droid + сбрасывает special (destructive, требует --yes) |
Exit-коды:
| Код | Смысл |
|---|---|
0 |
Успех |
1 |
Action отработал, но были failures (например, denied permission) |
2 |
Init-ошибка: не найден adb, нет устройства, и т.п. |
64 |
Неверное использование (unknown action, отсутствует --yes для destructive) |
Пример:
# залить FMD на конкретное устройство и сразу выдать permissions
fmd-setup --action install-fmd --device R5CT123ABCD
fmd-setup --action grant-all --device R5CT123ABCD
fmd-setup --action check --device R5CT123ABCDКаждое скачивание APK с F-Droid проходит трёхступенчатую проверку:
- 📥
entry.jar(~5 КБ) с https://f-droid.org/repo/entry.jar — его JAR-подпись (scheme v1, PKCS#7) сверяется с захардкоженным SHA-256 fingerprint сертификата репозитория F-Droid (internal/fdroid/pin.go):43238d51…9ccab. - 📦
index-v2.jsonскачивается и хешируется. Если SHA-256 ≠ значению изentry.json→ ошибка, файл не используется. Кэш в<ConfigDir>/cache/index-v2.jsonинвалидируется только по SHA-256 (не по TTL), что исключает stale data race. - 📲 APK скачивается, его SHA-256 сверяется с записью в проверенном индексе. Несовпадение → файл удаляется, exit code 1.
Модель угроз — та же, что у официального F-Droid Client: компрометация CDN / mirror без компрометации ключа репозитория не подсунет подменённый APK.
Если F-Droid публично анонсирует ротацию ключа репо — обнови
FDroidRepoFingerprintчерез PR.
Runtime (через pm grant --user 0):
| Permission | Зачем нужно |
|---|---|
ACCESS_COARSE_LOCATION |
Find-my-device по сетям |
ACCESS_FINE_LOCATION |
Find-my-device по GPS |
ACCESS_BACKGROUND_LOCATION |
Локация когда приложение в фоне |
READ_PHONE_STATE |
Команды связанные с телефонией |
SEND_SMS / READ_SMS / RECEIVE_SMS |
Команды через SMS и ответы |
POST_NOTIFICATIONS |
Уведомления (Android 13+; на <13 — skip) |
CAMERA / RECORD_AUDIO |
Удалённое фото / запись звука |
BLUETOOTH_CONNECT |
Bluetooth-команды (Android 12+) |
Optional:
| Permission | Зачем |
|---|---|
WRITE_SECURE_SETTINGS |
Авто включение/выключение GPS |
Special (не поддаются pm grant):
| Шаг | Через что |
|---|---|
| Battery whitelist (FMD + Sunup) | dumpsys deviceidle whitelist +<pkg> |
| Overlay (display over other apps) | appops set ... SYSTEM_ALERT_WINDOW allow |
| Notification listener | cmd notification allow_listener ... |
Источник — AndroidManifest.xml FMD master + документация приложения.
Нужен Go 1.26+.
make build-all # обе ОС в dist/
make build-linux # только linux/amd64
make build-windows # только windows/amd64
make run # запуск из исходников
make check # fmt + lint + test (race + cover)
make test # только тесты
make lint # только golangci-lint
make version # печатает версию из git describeВерсия запекается через -ldflags -X main.version=$(git describe --tags --always --dirty). Бинарь делает --version:
$ ./dist/fmd-setup-linux-amd64 --version
fmd-setup v0.1.0-3-g962a2a6| OS | Путь |
|---|---|
| Linux | ~/.config/fmd-setup/ (или $XDG_CONFIG_HOME/fmd-setup/) |
| Windows | %APPDATA%\fmd-setup\ |
Внутри:
config.json— путь к выбранному adb-бинарю.platform-tools/— portable adb (если выбран этот путь).cache/—index-v2.json+ скачанные APK.
fmd-setup/
├── main.go точка входа: TUI или headless по --action
└── internal/
├── actions/ бизнес-логика команд (Grant, Install, Check, ...)
├── adb/ обёртка над adb с context-таймаутами
├── cli/ парсер флагов + stdoutSink для headless
├── fdroid/ F-Droid index-v2 client + JAR signature verify
├── fmd/ константы FMD: permissions, SpecialSteps, packages
├── httputil/ shared Download с progress
├── platform/ ConfigDir / PortableToolsDir / InstallHint (per-OS)
├── tui/ Bubble Tea модель / view / commands
└── ui/ ANSI колоры, banner, glitch-эффекты, Log helpers
actions/ — единственный источник правды для всех команд: и TUI, и headless CLI вызывают одни и те же функции через actions.LogSink интерфейс.
Unlicense — public domain. Делай что хочешь.
— зарелижено в дом → найди телефон в кустах