LINE Android 앱은 수백 명의 개발자가 하나의 Git 저장소에서 함께 만들어 가는, 수백 개의 Gradle 모듈로 구성된 대규모 Android 앱입니다. LINE Android 앱 개발 팀은 최근에 여러 AI 코딩 에이전트(주로 Claude Code, 그 외 Codex·OpenCode·Gemini in Android Studio 등)를 개발에 일상적으로 활용하고 있는데요. 이런 규모에서는 AI 에이전트가 토큰을 과도하게 소비하는 상황이 빈번하게 발생합니다. 코드가 방대해 하나의 검색 요청이 수많은 결과를 반환할 수 있으며, 그 결과가 에이전트의 컨텍스트에 포함되면 그것만으로 비용이 빠르게 증가합니다. 게다가 텍스트 검색(grep/glob)이나 에이전트가 찾은 방대한 결과로는 ‘이 심볼이 어디에서 선언 혹은 참조되는지’, ‘IDE(Integrated Development Environment)에서 이 파일에 대한 문제를 어떻게 파악하는지’와 같은 의미론적 질문에 정확히 답하기 어려워서 에이전트가 질문과 무관한 결과에 의존한 채 재시도를 거듭하며 토큰을 더 소비합니다. 모듈이 많아질수록 비효율은 점점 더 커집니다.
Android CLI는 Android 개발자에게 점차 기본 도구가 될 것입니다. 그러나 수백 개 모듈 규모의 저장소에 그대로 적용하면 토큰을 낭비하고 에이전트가 예기치 않은 오작동을 할 우려가 있습니다. 이 글은 저희가 그 한계를 메우기 위해 Android CLI 위에 쌓은 보완책(얇은 래퍼(wrapper), 스킬, 프롬프트)을 소개하고, 이 보완책을 이용해 대규모 저장소와 여러 에이전트 환경에서 토큰을 아끼며 안정적으로 쓰기 위해 어떻게 접근하고 있는지 소개하겠습니다.
도입 배경: 첫 적용처는 문서 검색
저희는 Google이 Android CLI를 공개 발표한 직후 도입해 사용하기 시작했습니다(참고: Build Android apps 3x faster using any agent). Android CLI는 AI 에이전트가 Android 개발 작업을 커맨드라인에서 수행하도록 돕는 Google의 도구입니다. 프로젝트 빌드·배포, SDK(Software Development Kit) 관리, 환경 진단부터 공식 문서 검색, 뒤에서 다룰 Android Studio 연동까지 폭넓은 기능을 제공합니다.
이 기능 중 저희가 가장 먼저 적용한 것은 문서 검색입니다. 에이전트가 적은 토큰으로 Android·Jetpack Compose·AndroidX·Firebase 등 공식 문서를 최신 상태로 참조할 수 있다면 생산성 향상에 직접적인 도움이 될 것이라고 판단했기 때문입니다. 에이전트의 사전 학습 지식에는 시점 제한이 있기 때문에 빠르게 변화하는 Android·AndroidX API에서는 더 이상 유효하지 않은 시그니처를 그럴듯하게 생성하는 환각(hallucination)이 발생하기 쉽습니다. 이럴 때 권위 있는 최신 문서를 검색해 근거로 삼게 하면 환각을 줄일 수 있을 것입니다.
문서 검색 자체는 그 전에도 Google Cloud의 Knowledge MCP(Model Context Protocol) 서버를 이용하여 사용하고 있었습니다. 다만 다음과 같은 이유로 이를 대규모 조직에 적용하는 데는 부담이 있었습니다.
- 개발자마다 개별적으로 Google Cloud API 인증을 구성해야 하는데 수백 명 규모에서는 운영 복잡도가 너무 큰 작업입니다.
- 운영 복잡도를 줄이기 위해 인증을 대신 처리하는 프락시를 별도로 운영했더니 이번에는 할당량 제한에 직면해 이를 처리하기 위한 로직을 추가하고 유지해야 했습니다.
결과적으로 문서 검색 하나를 위해 인증 프락시와 할당량 대응 로직이라는 부수 인프라를 계속 유지해야 했는데 Android CLI는 이 부담을 없애 주었습니다. 인증 프락시도, 할당량 제한 우회 로직도 더 이상 필요하지 않습니다. 저희는 MCP 기반 문서 검색을 Android CLI로 교체했으며, 이를 에이전트에 제공하는 것이 get-android-dev-knowledge 스킬입니다. 이 스킬은 Android CLI의 docs 서브커맨드를 두 단계로 사용합니다. 키워드로 문서를 찾는 search와, 그 결과의 본문을 가져오는 fetch입니다.
# 1. 키워드로 공식 문서를 검색
.agents/tools/android-cli/android docs search \
'Android Jetpack Compose quickstart'
# 2. 검색 결과의 KB URL로 본문을 가져오기
.agents/tools/android-cli/android docs fetch \
'kb://android/develop/ui/compose/documentation'
교체로 얻은 이점은 다음과 같습니다.
- 최신 공식 문서 참조: 모델의 사전 학습 지식보다 최신 지식인 Android Knowledge Base를 직접 참조 출처로 삼습니다.
- 토큰 절약: 범용 웹 검색보다 적은 토큰으로 문서를 가져옵니다.
- 부수 인프라 제거: MCP 서버도, 개발자별 인증도, 인증 프락시도, 할당량 제한 대응 로직도 필요 없습니다. 저장소에 번들된 바이너리를 경로로 호출하면 됩니다.
CLI 바이너리를 Git 저장소에 포함시킨 이유
get-android-dev-knowledge를 적용하면서, 저희는 Android CLI 바이너리를 Git 저장소에 포함하기로 했습니다. 앞선 예시에서 명령을 저장소 내부 경로인 .agents/tools/android-cli/android로 직접 호출하고 있다는 점을 파악하셨을 것입니다. 전역에 설치된 android 명령을 쓰는 대신 저장소 안에 고정된 경로를 부르고 있 는데, 이는 바이너리를 저장소에 포함(번들링)했기 때문입니다. 그렇게 결정한 이유는 세 가지입니다.
1. 환경 파편화 방지
설치를 개발자 개개인에게 맡기면 버전·설치 위치·플랫폼이 개발자마다 달라지면서 환경 차이 때문에 오류가 발생할 수 있습니다. 설치를 저장소 클론으로 대체하면 이 문제가 사라집니다. 커밋에 고정된 바이너리가 저장소와 함께 배포되므로 장비 간 버전 불일치도 없습니다. 이는 개발자 장비뿐 아니라 CI(Continuous Integration)와 에이전트 실행 호스트에도 똑같이 적용됩니다. 어디서 클론하든 동일한 버전이 포함됩니다.
2. 보안 정책과 래퍼
회사 보안 정책상 불필요한 정보가 외부로 나가는 것을 가능한 한 피해야 합니다. Android CLI는 호출 시 일부 데이터를 수집할 수 있으며, 이를 제어하려면 호출마다 인자를 지정해야 합니다(참고: Data collected).
현재 저희 시스템에서 이 도구를 실제로 호출하는 주체는 사람이 아니라 에이전트입니다. 에이전트는 호출마다 이 인자를 누락할 수 있으므로 호출을 감싸는 래퍼에서 인자를 강제하는 편이 안전합니다. 이때 래퍼가 CLI를 호출하려면 바이너리 위치를 알아야 하며, 그 위치를 보장하는 가장 단순한 방법이 저장소의 고정 경로에 두는 것입니다. 즉, 바이너리 번들링은 단순한 편의일 뿐 아니라, 보안 요구 사항을 충족하기 위한 래퍼의 전제 조건이기도 합니다.
3. git-lfs
저희는 이미 대규모 Git 저장소를 운영하고 있어 git-lfs가 적용되어 있습니다. 덕분에 바이너리를 저장소에 포함하는 비용은 크 지 않았습니다.
Android CLI 1.0과 Android Studio 연동
Google I/O 26 직전 Android CLI 1.0이 출시되면서 기능이 크게 확장되었습니다(참고: Android CLI is now stable at 1.0: agent-driven Android development). 저희는 이 릴리스에서 Android Studio 연동 기능이 추가되었다는 점에 주목했습니다. Apple은 이미 지난해 WWDC에서 외부 에이전트가 MCP 서버를 통해 Xcode에 접근하도록 하는 기능을 선보였는데(참고: Giving external agents access to Xcode), Android 측에서도 이에 상응하는 기능이 제공된 것은 의미 있는 변화였습니다. 이 시점에는 세부 기능을 모두 파악한 것은 아니었으나, 개발 환경에 연동하기 위한 사전 작업을 시작했습니다.
Android CLI 래퍼와 1.0 도입 과정에서 발견한 정보 추적 수집 버그
앞서 보안 정책 때문에 호출마다 데이터 수집 제어 인자를 지정해야 한다고 언급했습니다. 그 인자가 --no-metrics이고, 이를 강제하는 지점이 모든 Android CLI 호출이 거치는 Android CLI 래퍼입니다. 이 스크립트는 플랫폼에 알맞은 바이너리를 선택한 뒤 항상 --no-metrics를 붙여 실행합니다.
exec "${REAL_BIN}" --no-metrics "$@"
저희는 --no-metrics와 관련해 Android CLI 1.0을 도입하는 과정에서 버그(issue 515098197)를 하나 발견했습니다. Android CLI의 정보 추적 수집 기능이 --no-metrics