# arc-shot Крошечное Android-приложение для фермы: foreground-сервис + HTTP-файл-сервер на порту **8099**, раздающий скриншоты с `/sdcard`. Нужно, чтобы десктоп качал кадры по HTTP **напрямую с телефона, мимо adb** — иначе `adb exec-out screencap` по Wi-Fi виснет и душит adb-сервер (каскад `adb devices timeout` → mass-offline). Экран приложение **не снимает** (это требовало бы MediaProjection с диалогом согласия) — кадр делает десктоп через `adb shell screencap -p /sdcard/arc_shot.png`, а arc-shot только отдаёт готовый файл по HTTP. Без внешних зависимостей (raw `ServerSocket`). ## Эндпоинты - `GET /health` → `200 ok` - `GET /.png` → файл из `/sdcard` (например `/arc_shot.png`) ## Сборка **Офлайн, без Gradle/AGP** (только Android SDK build-tools): ```bash ./build_manual.sh # -> build/arc-shot.apk ``` Переменные: `BT_VER` (build-tools, дефолт 35.0.1), `PLATFORM` (дефолт android-34), `MIN_SDK`/`TARGET_SDK`, `ANDROID_SDK_ROOT`. **Через Android Studio / Gradle** — см. `build.gradle`. Важно: для AGP-сборки убрать атрибут `package="com.arc.shot"` из `AndroidManifest.xml` (AGP берёт пакет из `namespace`). Ручной `build_manual.sh`, наоборот, требует `package=` в манифесте. ## Установка и выдача прав (с десктопа, через adb) ```bash adb -s install -r build/arc-shot.apk # доступ к /sdcard без диалога на устройстве: adb -s shell appops set com.arc.shot MANAGE_EXTERNAL_STORAGE allow # запустить сервис: adb -s shell am start -n com.arc.shot/.MainActivity ``` ## Проверка ```bash adb -s shell screencap -p /sdcard/arc_shot.png IP=$(adb -s shell ip route get 1.1.1.1 | sed -n 's/.*src \([0-9.]*\).*/\1/p') curl -s "http://$IP:8099/arc_shot.png" -o shot.png && file shot.png curl -s "http://$IP:8099/health" # -> ok ``` Десктоп использует этот путь автоматически при `config.ini [screenshot] transport=http` (с fallback на `exec-out`, если arc-shot недоступен).