| .. | ||
| src/main | ||
| .gitignore | ||
| build_manual.sh | ||
| build.gradle | ||
| README.md | ||
| settings.gradle | ||
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 okGET /<file>.png→ файл из/sdcard(например/arc_shot.png)
Сборка
Офлайн, без Gradle/AGP (только Android SDK build-tools):
./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)
adb -s <serial> install -r build/arc-shot.apk
# доступ к /sdcard без диалога на устройстве:
adb -s <serial> shell appops set com.arc.shot MANAGE_EXTERNAL_STORAGE allow
# запустить сервис:
adb -s <serial> shell am start -n com.arc.shot/.MainActivity
Проверка
adb -s <serial> shell screencap -p /sdcard/arc_shot.png
IP=$(adb -s <serial> 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 недоступен).