본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 06. 05. 00:12

AppFunctions를 사용한 에이전트 앱 구동을 위한 셋업

요약

Google I/O에서 발표된 AppFunctions를 사용하여 에이전트 앱을 구축할 때 필요한 Android 환경 셋업 방법을 설명합니다. 에이전트 앱을 특권 앱(Privileged App)으로 설정하기 위한 에뮬레이터 구성 및 권한 설정 절차를 다룹니다.

핵심 포인트

  • AppFunctions는 앱 기능을 에이전트가 호출할 수 있게 하는 메커니즘임
  • 에이전트 구현 시 Android 16 에뮬레이터와 root 권한이 필요함
  • -writable-system 옵션으로 /system 파티션 쓰기 권한 확보 필수
  • aflags를 통해 schema parser 플래그 활성화 여부 확인 필요

올해 Google I/O에서 상당히 전면에 내세워졌던 AppFunctions로 여러 가지를 시도해보고 있는데, 셋업 시 주의해야 할 점이 있어 공유합니다.

AppFunctions는 자신의 앱 기능을 Android 시스템을 경유하여 다른 에이전트 앱에서 호출할 수 있도록 하는 메커니즘입니다.

AppFunctions에는 Tool/Agent라는 두 가지 역할이 있습니다. Tool은 에이전트에게 함수를 제공하는 측이며, 단순히 구동만 하는 것이라면 특별히 곤란한 점은 없습니다.

아래에 공식 샘플도 있습니다.

[IMG:1]

이 샘플에서는 Tool로서의 채팅 앱 구현은 포함되어 있으나, 아래와 같이 adb 명령어를 통해 툴을 호출할 뿐 에이전트 측의 구현은 없습니다.

adb shell "cmd app_function execute-app-function \
--package com.example.chatapp \
--function 'com.example.chatapp.appfunctions.AppFunctions#send' \
...

에이전트 측을 구현한다 하더라도, 셋업은 권한 관련 문제도 있어 약간의 요령이 필요하므로 정리해 보겠습니다.

  • Android 16 emulator
    androidx.appfunctions:1.0.0-alpha09

filipfan/appfunctionspilot

위에 선구자분의 샘플이 있어, 이를 참고하여 절차를 진행했습니다.

이하 절차는 에이전트 앱을 사용하기 위한 것이며, 툴 앱만 구동하는 경우에는 필요하지 않습니다.

Android Studio의 Device Manager에서 root화가 가능한 에뮬레이터(Android 16)를 생성합니다.

이때 Google APIs를 선택해 주세요 (Google Play 버전도 있지만, 이것은 root화할 수 없습니다).

에뮬레이터는 CLI에서 -writable-system 옵션을 붙여서 실행해야 합니다.

(Android Studio를 통한 실행으로는 이 옵션이 붙지 않기 때문에 사용할 수 없습니다)

이는 /system 파티션을 읽기/쓰기 가능하게 만들어, 에이전트 앱을 특권 앱(Privileged App)으로 배치하기 위해 필요합니다.

특권 앱은 프리인스톨(Pre-installed)된 앱에서 흔히 볼 수 있는 것으로, 일반 앱보다 강력한 권한으로 동작합니다.

~/Library/Android/sdk/emulator/emulator -avd <avd-name> -writable-system

그 후 다음 절차로 root화합니다.

adb root

다음 명령어로 플래그(flag)가 enabled 상태인지 확인합니다.

adb shell aflags list | grep "enable_app_functions_schema_parser"

이것이 비활성화되어 있으면 Agent 측에서 AppFunctionManager.observeAppFunctions()를 호출해도 시스템이 metadata를 반환하지 않아 빈 결과가 됩니다.

위 명령은 root화되어 있지 않으면 Error: must be root가 발생하여 확인할 수 없습니다.

enabled가 아니라면 비활성 상태입니다.

다행히 제 시뮬레이터에서는 enabled 상태였습니다.

만약 비활성 상태라면 enabled로 설정하고 (adb shell aflags enable com.android.appfunctions.flags.enable_app_functions_schema_parser), 재부팅한 뒤 tool 앱과 agent 앱을 설치합니다.

adb reboot
./gradlew :tool:installDebug :app:installDebug

(모듈 이름은 상황에 맞게 변경)

하지만 여전히 appFunctionManager.observeAppFunctions()를 통해 툴 앱의 metadata를 가져올 수는 없습니다.

이하 AppFunctionManager의 kDoc입니다.

android.permission.EXECUTE_APP_FUNCTIONS 권한을 보유하고 있을 때 - android.content.pm.PackageManager.canPackageQuery를 통해 쿼리할 수 있도록 허용된 다른 패키지의 함수들.

에이전트 (Agent) 앱은 android.permission.EXECUTE_APP_FUNCTIONS라는 권한이 필요합니다.

특권 (privileged) 권한은 시스템 (system) 영역에 배치된 앱에만 부여됩니다. 따라서 일반적인 adb install로는 권한이 부여되지 않으며, 에이전트가 다른 앱의 함수를 호출할 수 없는 상태가 됩니다.

먼저 확인해 보겠습니다.

adb shell pm list permissions -f | grep -A 5 "EXECUTE_APP_FUNCTIONS"

출력

+ permission:android.permission.EXECUTE_APP_FUNCTIONS
package:android
label:null
...

protectionLevelprivileged가 포함되어 있습니다.

특권 앱에만 부여되는 권한임을 알 수 있습니다.

다음 절차에 따라 시스템 (system) 앱으로 배치합니다.

remount는 시스템 파티션을 읽기/쓰기 가능하게 만듭니다.

시스템 앱으로 인식시키기 위해 reboot도 필요합니다.

# rooted emulator 에서 root + remount
adb root
adb remount
...

이를 통해 AppFunctionManager.observeAppFunctions()로 메타데이터 (metadata)를 가져올 수 있게 되며, 동시에 툴 (tool)을 호출할 수 있게 됩니다.

만약 위 내용에 오류가 있다면 댓글 등으로 지적해 주시면 감사하겠습니다.

자, 이제부터는 추측이 들어갑니다.

이러한 에이전트 측의 높은 진입 장벽은 보안 등을 고려한 결과라고 생각됩니다.

누구나 에이전트 앱을 만들 수 있게 되면, 다른 앱의 기능을 악용할 가능성이 있습니다.

따라서 현재는 특권 앱에게만 허용되는 엄격한 제약이 있습니다.

앱 개발자가 에이전트 측 앱을 구현할 기회가 얼마나 있을지는 미지수입니다.

그럼에도 개발자는 root화된 시뮬레이터 (Simulator) 등을 통해 에이전트 측 앱을 테스트해 볼 수 있습니다.

에이전트 측 앱의 구현을 파악함으로써 구조에 대한 이해를 높일 수 있고, 이는 툴 측의 구현에도 도움이 될 수 있습니다.

다만, 향후 어떻게 변할지는 알 수 없습니다.

AppFunctions는 아직 알파 (alpha) 단계이므로, 버전에 따라 여기서 기술한 동작도 변할 수 있다고 생각합니다.

계속해서 AppFunctions의 동향을 지켜보고자 합니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0