# Рой: запуск одним значком на Android **Решение — Termux:Widget**, а не веб-ярлык: обычная иконка сайта не умеет запускать локальный сервер в Termux. Настройка ниже выполняется **один раз**; впоследствии значок «Рой» на рабочем столе проверяет обновление и запускает установленную программу при свободном порту. Личные анкеты, фотографии, переписка и ключи не удаляются и в ярлык не записываются. ## 1. Установите совместимый Termux:Widget Плагин должен быть **из того же источника, что и ваш Termux**: если Termux из F-Droid — [Termux:Widget в F-Droid](https://f-droid.org/en/packages/com.termux.widget/); если Termux из GitHub — [GitHub Releases Termux:Widget](https://github.com/termux/termux-widget/releases). Подписи приложений из разных источников несовместимы. Если источник Termux неизвестен или он установлен из Google Play, **не удаляйте и не переустанавливайте Termux ради ярлыка**: можно потерять его локальные данные; сначала уточните источник установки. ## 2. Один раз вставьте в уже работающий Termux весь блок Это **создаёт только новый исполняемый ярлык** в домашнем каталоге Termux. Существующий файл с именем «Рой» не перезаписывается. Скрипт сначала блокирует повторный одновременный запуск через эту кнопку и проверяет, свободен ли порт 8765. При занятом порту он **не обновляет код и не открывает неизвестный локальный сайт**. При свободном порту вызывает именно установленный `start.sh`, который проверяет обновление и открывает браузер. ```sh if [ -L "$HOME/.shortcuts" ]; then echo 'Каталог ярлыков является ссылкой; ничего не меняю.' >&2 elif mkdir -p "$HOME/.shortcuts" && chmod 700 "$HOME/.shortcuts"; then if [ -e "$HOME/.shortcuts/Рой" ] || [ -L "$HOME/.shortcuts/Рой" ]; then echo 'Ярлык «Рой» уже существует; не перезаписываю.' else cat > "$HOME/.shortcuts/Рой" <<'ROY_SHORTCUT' #!/data/data/com.termux/files/usr/bin/python3 import fcntl import os from pathlib import Path import socket import stat import sys home = Path.home() start = home / 'roy-personal-termux' / 'start.sh' if start.is_symlink() or not start.is_file(): sys.exit('Не найден установленный start.sh; ничего не обновляю.') try: fd = os.open(home / '.shortcuts' / '.roy-launch.lock', os.O_CREAT | os.O_RDWR | os.O_NOFOLLOW, 0o600) info = os.fstat(fd) if (not stat.S_ISREG(info.st_mode) or info.st_uid != os.getuid() or info.st_nlink != 1 or stat.S_IMODE(info.st_mode) & 0o077): sys.exit('Файл блокировки небезопасен; запуск остановлен.') fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) except BlockingIOError: sys.exit('Рой уже запускается через значок. Подождите или вернитесь в его вкладку.') except OSError: sys.exit('Не удалось безопасно заблокировать повторный запуск.') os.set_inheritable(fd, True) # держим блокировку до закрытия сервера with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as probe: probe.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: probe.bind(('127.0.0.1', 8765)) except OSError: sys.exit('Порт 8765 занят. Не обновляю код и не открываю чужой сайт. ' 'Если Рой уже работает, вернитесь в его вкладку; ' 'обновление выполняется по кнопкам на странице Чаты.') os.execv('/data/data/com.termux/files/usr/bin/sh', ['sh', str(start)]) ROY_SHORTCUT chmod 700 "$HOME/.shortcuts/Рой" echo 'Ярлык подготовлен. Теперь закрепите «Рой» через Termux:Widget.' fi fi ``` ## 3. Закрепите значок На рабочем столе Android откройте список **«Виджеты»**, найдите **Termux:Widget**, выберите его вариант **Shortcut / Ярлык** (если есть) и в списке файлов нажмите **«Рой»**; подтвердите добавление значка. Если лаунчер даёт только виджет со списком скриптов, добавьте его и нажимайте в нём «Рой» — это также запуск одним нажатием. Если новый файл не появился, нажмите **Refresh / Обновить** в Termux:Widget. В некоторых версиях Android для запуска команды из виджета может понадобиться разрешить Termux «Поверх других окон» либо сначала открыть уведомление Termux. **Что произойдёт при нажатии:** при выключенном сервере запускается прежняя проверка обновления, затем сервер Роя и браузер с локальным сопряжением. При уже работающем сервере значок **ничего не переустанавливает**: вернитесь в существующую вкладку. Для обновления **уже открытого Роя без Termux и без повторного запуска значка** откройте в приложении «Чаты», нажмите «Проверить обновление», затем отдельную кнопку «Перезапустить и обновить» и подтвердите предупреждение о незавершённом Horde-ответе и несохранённом фото. Перерыв сервера допустим; текст набранной реплики восстанавливается в этой же вкладке. Не запускайте одновременно старую команду в другом сеансе и этот значок. Новый цикл проверен синтетически, не на физическом Android — значок нужно добавить на самом телефоне. Начиная с установленной v0.14.37-preview кнопка обновления в уже открытом Рое запрашивает до трёх частей полного ZIP одновременно, сохраняя все проверки SHA и полный перезапуск. Сам ярлык по-прежнему использует последовательную загрузку. Переход с v0.14.36 на v0.14.37 выполняет старый клиент и потому может занять прежнее время; ускорение действует для следующих выпусков. Публичная страница выпусков: https://svideteli-zhenki.pages.dev/ — это **скачивание/информация**, не ярлык запуска локального сервера. Источники: [документация Termux:Widget](https://github.com/termux/termux-widget/blob/master/README.md), [руководство Android по закреплённым ярлыкам](https://developer.android.com/develop/ui/compose/system/shortcuts/creating-shortcuts), [совместимость APK Termux](https://github.com/termux/termux-app/blob/master/README.md).