AppFunctions는 Android MCP 통합을 간소화하는 Jetpack 라이브러리가 함께 제공되는 Android 플랫폼 API입니다. 이를 통해 앱이 온디바이스 MCP 서버처럼 동작하여 Google Gemini와 같은 에이전트 및 어시스턴트와 함께 사전 대응형 기능에서 사용할 도구 역할을 하는 기능을 제공할 수 있습니다. 2026년 5월 현재 Gemini와의 AppFunctions 통합은 신뢰할 수 있는 테스터와 함께 비공개 프리뷰로 제공됩니다. 지금부터 앱을 준비하여 AppFunctions 및 개발 도구를 사용할 수 있습니다.
이러한 AppFunction을 정의하면 앱이 Android OS에 내장된 레지스트리에 서비스, 데이터, 작업을 제공할 수 있으므로 사용자가 에이전트와 시스템 수준 상호작용을 통해 작업을 완료할 수 있습니다.
AppFunctions는 모델 컨텍스트 프로토콜 (MCP) 내 도구의 모바일 버전 역할을 합니다. MCP는 기존에 에이전트가 서버 측 도구에 연결하는 방법을 표준화했지만, AppFunctions는 Android 앱에 동일한 메커니즘을 제공합니다. 이를 통해 승인된 앱 (호출자)이 검색하고 실행하여 사용자 의도를 충족할 수 있는 오케스트레이션 가능한 '도구'로 앱의 기능을 노출할 수 있습니다. 호출자에게는 AppFunction을 검색하고 실행할 수 있는 EXECUTE_APP_FUNCTIONS 권한이 있어야 하며, 여기에는 에이전트, 앱, Gemini와 같은 AI 어시스턴트가 포함될 수 있습니다.
AppFunctions는 Android 16 이상을 실행하는 기기에서 사용할 수 있습니다.
사용 사례
AppFunctions는 작업을 자동화하고 사용자 상호작용을 간소화하는 강력한 메커니즘을 제공합니다. 앱의 기능을 개방하면 사용자가 자연어를 사용하여 복잡한 목표를 달성할 수 있으며, UI를 사용한 단계별 수동 탐색이 필요하지 않은 경우가 많습니다.
다음 시나리오에서는 다양한 앱 카테고리 내에서 환경을 개선하기 위해 AppFunctions를 사용하는 방법을 보여줍니다.
할 일 관리 및 생산성
- 사용자 요청: "오늘 오후 5시에 회사에서 택배를 찾아오라고 알려 줘."
- AppFunction 작업: 호출자가 관련 작업 관리 앱을 식별하고 함수를 호출하여 작업을 만듭니다. 제목, 시간, 위치 필드는 사용자의 프롬프트에 따라 자동으로 채워집니다.
/** * Create a new task or reminder with a title, due time, and location. * * @param title The descriptive title of the task (e.g., "Pick up my package"). * @param dueDateTime The specific date and time when the task should be completed. * @param location The physical location associated with the task (e.g., "Work"). * @return The created Task */ @AppFunction(isDescribedByKDoc = true) suspend fun createTask( title: String, dueDateTime: LocalDateTime? = null, location: String? = null, ): Task = TODO()
미디어 및 엔터테인먼트
- 사용자 요청: "올해의 인기 재즈 앨범으로 새 재생목록을 만들어 줘".
- AppFunction 작업: 호출자가 음악 앱 내에서 재생목록 생성 함수를 실행하여 '2026년 인기 재즈 앨범'과 같은 컨텍스트를 쿼리로 전달하여 재생목록을 즉시 생성합니다.
/** * Create a new music playlist based on a natural language query. * * @param query The description used to generate the playlist (e.g., "top jazz albums from 2026"). * @return The final created playlist based on songs. */ @AppFunction(isDescribedByKDoc = true) suspend fun createPlaylistFromQuery( query: String, ): Playlist = TODO()
앱 간 워크플로
- 사용자 요청: "Lisa의 이메일에서 국수 레시피를 찾아 재료를 내 쇼핑 목록에 추가해 줘".
- AppFunction 작업: 이 요청은 여러 앱의 함수를 사용합니다. 먼저 호출자가 이메일 앱의 검색 기능을 사용하여 콘텐츠를 가져옵니다. 그런 다음 관련 재료를 추출하고 쇼핑 목록 앱의 함수를 호출하여 사용자의 목록을 채웁니다.
/** * Search for emails matching a query or sender name to retrieve content like recipes. * * @param query The search term or contact name (e.g., "Lisa noodle recipe"). * @return A list of matching email summaries containing the requested information. */ @AppFunction(isDescribedByKDoc = true) suspend fun searchEmails( query: String, ): List<EmailSummary> = TODO() /** * Add a list of items or ingredients to the user's active shopping list. * * @param items The names of the ingredients or products to add to the list. * @return The final shopping list with new items added */ @AppFunction(isDescribedByKDoc = true) suspend fun addItemsToShoppingList( items: List<String>, ): ShoppingList = TODO()
캘린더 및 일정
- 사용자 요청: "다음 주 월요일 오후 6시에 엄마 생일 파티를 내 캘린더에 추가해 줘".
- AppFunction 작업: 승인된 에이전트 앱이 캘린더 앱의 '일정 만들기' 함수를 호출하여 '다음 월요일', '오후 6시'와 같은 관련 컨텍스트를 파싱하여 사용자가 캘린더를 수동으로 열지 않아도 항목을 만듭니다.
/** * Schedule a new event on the user's primary calendar. * * @param title The name of the calendar event (e.g., "Mom's birthday party"). * @param startDateTime The specific date and time the event is scheduled to begin. * @return The created Event object. */ @AppFunction(isDescribedByKDoc = true) suspend fun createCalendarEvent( title: String, startDateTime: LocalDateTime, ): Event = TODO()
AppFunctions 작동 방식
다음 다이어그램은 앱이 AppFunctions를 에이전트와 공유하고 이후에 실행하는 일반적인 흐름을 보여줍니다. 에이전트는 사용자 요청을 처리할 때 서버 측 원격 MCP 도구와 로컬 AppFunctions를 모두 고려할 가능성이 높습니다. 로컬 AppFunctions 사용의 자세한 흐름은 다음과 같습니다.
- AppFunction 선언: Android 앱은 AppFunctions를 사용하여 '메모 작성' 또는 '메시지 보내기'와 같은 기능을 사용할 수 있도록 빌드됩니다.
- 스키마 생성: AppFunctions Jetpack 라이브러리는 앱에 선언된 모든 AppFunctions를 나열하는 XML 스키마 파일을 생성합니다. Android OS는 이 파일을 사용하여 사용 가능한 AppFunctions를 색인합니다.
- 메타데이터 검색: 에이전트는 쿼리를 통해 AppFunction 메타데이터를 검색할 수 있습니다. 함수별 KDoc 외에도 개발자는 앱 메타데이터에 앱 수준 운영 패턴과 제약 조건을 정의하여 여러 도구에서 에이전트 오케스트레이션을 안내할 수 있습니다.
- AppFunction 선택 및 실행: 에이전트는 사용자 프롬프트를 기반으로 적절한 매개변수를 사용하여 적절한 AppFunction을 선택하고 실행합니다.
AppFunctions Jetpack 라이브러리를 사용하면 앱의 기능을 쉽게 노출할 수 있습니다.
주석 프로세서를 사용하면 에이전트에서 사용할 수 있도록 하려는 함수에 주석을 추가합니다. 그러면 호출자가 AppFunctionManager를 사용하여 이러한 색인 함수를 검색하고 호출할 수 있습니다.
함수를 호출하기 전에 호출자는 AppFunctionManager 인스턴스를 가져오려고 시도하여 기기가 AppFunctions 기능을 지원하는지 확인해야 합니다. 지원되면 호출자는 isAppFunctionEnabled(packageName,functionId)를 사용하여 타겟 앱 내에서 특정 함수가 사용 설정되어 있는지 확인할 수 있습니다. 다른 패키지의 함수 상태를 쿼리하려면 android.permission.EXECUTE_APP_FUNCTIONSpermission가 필요합니다.
앱에서 AppFunction 기능이 지원되는지 확인할 필요는 없습니다. 이는 Jetpack 라이브러리 내에서 자동으로 처리됩니다. 예를 들어 AppFunctionManager는 기능이 지원되는지 확인할 수 있습니다.
다음은 메모를 만들고, 수정하고, 나열하는 기능을 갖춘 메모 작성 앱의 AppFunctions 예입니다.
@RequiresApi(36) @AndroidEntryPoint @AppFunctionServiceEntryPoint( serviceName = "TaskAppFunctionService", appFunctionXmlFileName = "task_app_function_service", ) abstract class BaseTaskAppFunctionService : AppFunctionService() { @Inject internal lateinit var taskRepository: TaskRepository /** * Creates a task based on [createTaskParams]. * * @param createTaskParams The parameter to describe how to create the task. */ @AppFunction(isDescribedByKDoc = true) suspend fun createTask( createTaskParams: CreateTaskParams, ): Task = withContext(Dispatchers.IO) { // Developers can use predefined exceptions to let the agent know // why it failed. if (createTaskParams.title == null && createTaskParams.content == null) { throw AppFunctionInvalidArgumentException("Title or content should be non-null") } val id = taskRepository.createTask( createTaskParams.title, createTaskParams.content ) return@withContext taskRepository .getTask(id) ?.toTask() ?: throw AppFunctionElementNotFoundException("Task not found for ID = $id") } // Maps internal TaskEntity private fun TaskEntity.toTask() = Task(id = id, title = title, content = description) }
/** The parameter to create the task. */ @AppFunctionSerializable(isDescribedByKDoc = true) data class CreateTaskParams( /** The title of the task. */ val title: String?, /** The content of the task. */ val content: String?, ) /** The user-created task. */ @AppFunctionSerializable(isDescribedByKDoc = true) data class Task( /** The ID of the task. */ val id: String, /** The title of the task. */ val title: String, /** The content of the task. */ val content: String, )
샘플, 스킬, 테스트 도구
AppFunctions의 기술을 향상할 수 있도록 다음과 같은 리소스를 제공합니다.
- AppFunctions 샘플을 살펴보고 기기에서 모든 것이 어떻게 작동하는지 확인하고 알아봅니다.
- AppFunctions 에이전트 스킬을 사용하여 4단계 수명 주기 전반에서 개발을 가속화하세요.
- 디스커버리: 코드베이스를 분석하여 AI 오케스트레이션을 위한 가치 있는 기능을 식별하고 추천합니다.
- 구현 및 구성: Kotlin 구현을 생성하고 시스템 메타데이터와 빌드 종속 항목을 구성합니다.
- KDoc 개선: AI 에이전트 및 Android MCP를 위해 함수 및 속성 문서를 최적화합니다.
- 테스트 및 디버깅: 기기에서 로컬 평가 및 디버깅을 위한 ADB 명령어를 제공합니다.
- 명령줄 테스트 및 확인의 경우
adb shell cmd app_function ...와 같은 ADB 명령어를 사용하여 함수 등록을 테스트하고, 메타데이터 설명을 검사하고, 기기에서 함수를 실행하는 직접적이고 가벼운 방법을 사용하세요. - 프롬프트 없이 Android MCP를 직접 경험하고 엔드 투 엔드 워크플로를 테스트하려면 기기에 AppFunctions testing agent Android 앱을 설치하고 사용하세요.
자주 묻는 질문(FAQ)
다음 섹션에서는 AppFunctions에 대해 자주 묻는 질문(FAQ)을 다룹니다.
앱 개발자입니다. 오늘 AppFunctions를 구현할 수 있나요?
예, 앞 섹션에 자세히 설명된 안내에 따라 앱 내에서 AppFunctions를 구현하고 테스트할 수 있습니다.
AppFunctions와 MCP의 차이점은 무엇인가요?
두 가지 모두 AI 에이전트가 도구를 오케스트레이션할 수 있지만 아키텍처, 지연 시간, 필요한 개발자 노력에 상당한 차이가 있습니다. AppFunctions는 로컬에서 실행되는 Android 전용 내장 OS 수준 후크입니다. 반면 표준 MCP 서버는 클라우드 실행 및 네트워크 왕복에 의존하는 플랫폼에 구애받지 않는 솔루션입니다.
간단히 말해 AppFunctions로 개발하면 기기에서 기존 앱 상태를 직접 사용할 수 있으며 Android 앱 외부에서 서비스를 유지할 필요가 없습니다.
앱에 AppFunctions를 구현했습니다. 시스템 에이전트가 이에 액세스할 수 없는 이유는 무엇인가요?
AppFunctions는 실험용 기능입니다. 이 실험 단계에서 전반적인 환경의 품질을 신중하게 평가하기 위해 제한된 수의 앱과 시스템 에이전트만 전체 파이프라인에 액세스할 수 있습니다.
AppFunctions의 정식 버전을 위해 앱을 준비하려면 어떻게 해야 하나요?
에이전트 기반 자동화에 노출할 앱 기능을 고려합니다.
앱에서 AppFunctions를 구현할 수 있습니다. 이렇게 하려면 이 페이지의 이전 섹션에 나온 단계를 따르고 adb shell cmd app_function list-app-functions를 호출하여 기기에 등록되었는지 확인하세요.
엔드 투 엔드 에이전트형 개발자 환경을 사전 체험할 수 있나요?
Google에서는 Android에서 AppFunctions를 프로덕션에 출시하는 데 필요한 엔드 투 엔드 개발자 환경을 테스트하기 위해 일부 앱을 온보딩하는 사전 체험 프로그램 (EAP)을 진행하고 있습니다. 이 EAP 등록 양식을 통해 AppFunctions 통합에 관심이 있음을 등록할 수 있습니다. 관심을 등록해도 전체 통합에 자동으로 액세스할 수 있는 것은 아닙니다. 앱이 EAP에 선정되면 이메일을 보내드리며, AppFunctions가 공개적으로 제공되면 알려드리겠습니다.
AppFunctions에 대한 의견을 제공하려면 어떻게 해야 하나요?
문제를 신고하고 사전 체험 프로그램 양식에 참여 의사를 등록하여 API에 대한 의견을 제공할 수 있습니다.