언어 모델에게 안드로이드 내부의 '손'을 주자, 앱 공장(App Factory)이 탄생하다
요약
본 기사는 LLM 어시스턴트에게 실제 시스템 제어 능력을 부여하는 '앱 공장' 프로젝트를 소개합니다. Termux와 WebView를 결합하여, 언어 모델이 셸(shell)에 직접 접근해 명령어 실행, 파일 상호작용, 코드 컴파일 등 자율적인 작업을 수행할 수 있게 합니다.
핵심 포인트
- LLM에게 실제 행동 능력을 부여하는 '손'을 제공함.
- Termux를 활용하여 루트 권한 없이 Linux 셸 환경을 구축.
- Python 서버(`ai-tasker-server`)가 LLM과 셸 사이의 통신 게이트웨이 역할 수행.
- WebView와 별도 서비스(VibeService)를 통해 DeepSeek과의 상호작용 및 APK 설치 기능 구현.
대부분의 LLM 어시스턴트는 '병 속의 두뇌'와 같습니다. 추론하고, 코드를 작성하며, 개념을 설명할 수는 있지만, 실제 세상에서는 아무것도 할 수 없습니다. 그들이 생성하는 모든 것은 인간이 복사하여 어딘가에 붙여넣는 텍스트일 뿐입니다.
저는 이 문제를 해결하기로 했습니다. Termux Assistant AI는 WebView를 DeepSeek Chat과 연결하고, 동시에 로컬 HTTP 서버를 통해 Termux 내부의 셸(shell)에 어시스턴트에게 직접 접근 권한을 부여하는 안드로이드 앱입니다. 효과적으로 말하자면 — 언어 모델이 '손'을 얻게 된 것입니다.
이 프로젝트는 완전한 오픈 소스(MIT)입니다: github.com/CR4CODE/Termux-Assistant-AI.
Termux란 무엇이며, 왜 핵심인가
Termux는 루트(root) 권한이 필요 없는 안드로이드용 터미널 에뮬레이터로, 완전한 Linux 환경을 제공합니다. Bash, Python, git, ssh, 패키지 관리자 등 모든 것이 작동합니다. 본질적으로 주머니 속의 일반적인 Linux 배포판인 셈입니다.
핵심 통찰력은 이렇습니다: Termux가 있다면, 셸(shell)이 있다는 것입니다. 그리고 언어 모델이 셸을 갖게 된다면, 임의의 명령어를 실행하고, 파일과 상호작용하며, 코드를 컴파일하고, 릴리스를 게시할 수 있습니다.
남아있는 두 가지 질문은 다음과 같았습니다:
- WebView 앱과 Termux를 어떻게 연결할 것인가?
- 모델에서 셸로 명령을 안전하게 전달하는 방법은 무엇인가?
Termux 내부에서는 Python 서버인 ai-tasker-server가 실행됩니다. 이 서버는 127.0.0.1:8767에서 리스닝하며 앱으로부터 작업을 수신합니다. 앱이 수신하는 작업은 다음과 같습니다:
POST /task
Body: {"task": "auto:uptime"}
Response: {"status":"success","output":"...","exit_code":0}
경로는 접두사별로 그룹화되어 있습니다:
auto:—bash -c를 통한 직접적인 bash 실행project_*— Android 프로젝트의 읽기/쓰기/빌드 기능vk__,tg__— VK 및 Telegram에 게시하는 기능release_*— 릴리스 파이프라인: CHANGELOG, 태그, GitHub Releasebot_*— PiarBot 관리apply_patches:— 소스 파일에 패치 적용log:— 로그 읽기
핵심 설계 결정 사항: auto: 명령어는 LLM 기반 분류 없이 바로 bash로 전달됩니다. 초기 버전에서는 명령어 유형을 추측하려 했으나, 존재하지 않는 경로에서 멈추는(hangs) 현상이 발생했습니다. 현재는 단순히 subprocess.run(["bash", "-c", code], timeout=120)를 사용합니다.
Layer 3: VibeService (포트 8768)
WebView를 관리하고 HTTP API를 노출하는 별도의 Android 서비스입니다:
- POST /send — 입력 필드에 텍스트를 삽입하고 "보내기" 버튼을 누릅니다.
- GET /read — 마지막 DeepSeek 응답을 읽습니다.
- GET /hash — 마지막 응답의 해시값 (변경 감지용)
- GET /thinking — 모델이 현재 생성 중인지 여부?
- GET /stopped — 모델이 "Stopped" 상태에 멈춰 있는지 여부?
- POST /install-apk — 경로에서 APK를 설치합니다.
이 서비스는 어시스턴트가 DeepSeek과 통신하고 자율적인 루프를 실행하는 방식입니다.
전체 개발 주기: 프롬프트부터 APK까지
가장 흥미로운 부분은 Vibe 모드입니다. 사용자가 하나의 작업을 작성하면 시스템이 나머지 모든 것을 처리합니다.
워크플로우:
워크플로우:
- 사용자가
vibe-run <project> "<task>"를 실행합니다. - 스크립트가 프로젝트 트리와 모든
.java/.xml파일의 내용을 수집합니다. - 파일을
=== FILE: path === ... === END FILE ===형식으로 요구하는 프롬프트를 구성합니다. - VibeService (
/send)를 통해 DeepSeek에 전송합니다. - 응답 안정화 대기: 해시가 N초 동안 연속적으로 변경되지 않는지 확인합니다.
- 응답을 파싱하고, 파일을 프로젝트에 적용합니다.
aapt2 → javac → d8 → apksigner를 통해 APK를 빌드합니다.- 빌드가 실패하면 — 오류 로그를 모델로 다시 보내고 재시도합니다 (최대 5회 반복).
- 성공 시 —
/install-apk를 통해 설치할 수 있도록 APK가 전달됩니다.
핵심 트릭은 **자가 복구(self-healing)**입니다. 만약 모델이
Termux Assistant AI는 실험입니다: 언어 모델에게 '손'을 주면 무슨 일이 벌어질까요? 놀랍게도 — 많은 일들이 벌어집니다. 이 모델은 앱을 만들고, 릴리스를 배포하며, 자체 버그를 수정하고, 소셜 미디어를 운영합니다. 모든 것이 PC나 클라우드 인프라 없이 단일 Android 휴대폰 안에서 이루어집니다.
이 프로젝트는 완전히 오픈 소스입니다:
- 코드: github.com/CR4CODE/Termux-Assistant-AI
- 랜딩 페이지: cr4code.github.io/Termux-Assistant-AI
- 라이선스: MIT
저는 프로그래머가 아닙니다. 코드를 한 줄도 모릅니다. 여러분이 보는 모든 것은 한 사람과 저의 '손'이 된 AI에 의해 만들어졌습니다.
질문이나 비판은 댓글로 환영합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기