AppFunctions를 사용하면 Android 앱이 시스템과 다양한 AI 에이전트 및 어시스턴트가 검색하고 호출할 수 있는 특정 기능을 공유할 수 있습니다. 이러한 함수를 정의하면 앱이 Android OS에 서비스, 데이터, 작업을 제공하여 사용자가 AI 에이전트와 시스템 수준 상호작용을 통해 작업을 완료할 수 있습니다.
AppFunctions는 모델 컨텍스트
프로토콜 (MCP) 내 도구의 모바일 버전 역할을 합니다. MCP는 기존에 에이전트가 서버 측 도구에 연결하는 방법을 표준화했지만 AppFunctions는 Android 앱에 동일한 메커니즘을 제공합니다. 이를 통해 승인된 앱 (호출자)이 검색하고 실행하여 사용자 인텐트를 처리할 수 있는 오케스트레이션 가능한 '도구'로 앱의 기능을 노출할 수 있습니다. 호출자는 AppFunctions를 검색하고 실행하려면 EXECUTE_APP_FUNCTIONS
권한이 있어야 하며 에이전트, 앱,
Gemini와 같은 AI 어시스턴트를 포함할 수 있습니다.
AppFunctions는 Android 16 이상을 실행하는 기기에서 작동합니다.
사용 사례
AppFunctions는 작업을 자동화하고 사용자 상호작용을 간소화하는 강력한 메커니즘을 제공합니다. 앱의 기능을 노출하면 사용자가 자연어를 사용하여 복잡한 목표를 달성할 수 있으며 UI를 사용하여 단계별 수동 탐색을 할 필요가 없는 경우가 많습니다.
다음 시나리오에서는 AppFunctions를 사용하여 다양한 앱 카테고리 내에서 환경을 개선하는 방법을 보여줍니다.
- 작업 관리 및 생산성
- 사용자 요청: "오늘 오후 5 시에 직장에서 택배를 찾아오라고 알려 줘".
- AppFunction 작업: 호출자가 관련 작업 관리 앱을 식별하고 함수를 호출하여 작업을 만듭니다. 이때 사용자의 프롬프트에 따라 제목, 시간, 위치 필드가 자동으로 채워집니다.
- 미디어 및 엔터테인먼트
- 사용자 요청: "올해 최고의 재즈 앨범으로 새 재생목록을 만들어 줘".
- AppFunction 작업: 호출자가 음악 앱 내에서 재생목록 생성 함수를 실행하고 '2026년 최고의 재즈 앨범'과 같은 컨텍스트를 쿼리로 전달하여 콘텐츠를 즉시 생성하고 실행합니다.
- 교차 앱 워크플로
- 사용자 요청: "Lisa의 이메일에서 국수 레시피를 찾아 쇼핑 목록에 재료를 추가해 줘".
- AppFunction 작업: 이 요청은 여러 앱의 함수를 사용합니다. 먼저 호출자가 이메일 앱의 검색 함수를 사용하여 콘텐츠를 가져옵니다. 그런 다음 관련 재료를 추출하고 쇼핑 목록 앱의 함수를 호출하여 사용자 목록을 채웁니다.
- 캘린더 및 일정
- 사용자 요청: "다음 주 월요일 오후 6시에 엄마의 생일 파티를 캘린더에 추가해 줘".
- AppFunction 작업: 승인된 에이전트형 앱이 캘린더 앱의 '일정 만들기' 함수를 호출하여 '다음 주 월요일' 및 '오후 6시'와 같은 관련 컨텍스트를 파싱하여 사용자가 캘린더를 수동으로 열지 않고도 항목을 만들 수 있습니다.
AppFunctions의 작동 방식
AppFunctions는 Android 16 플랫폼 기능이자 앱이 에이전트 앱과 같은 호출자가 기기에서 액세스하고 실행할 수 있도록 특정 함수를 노출할 수 있는 Jetpack 라이브러리입니다.
다음 다이어그램은 앱에서 에이전트로 AppFunctions를 공유하고 이후에 실행하는 일반적인 흐름을 보여줍니다. 에이전트는 사용자 요청을 처리할 때 서버 측 원격 MCP 도구와 로컬 AppFunctions를 모두 고려할 가능성이 높습니다. 로컬 AppFunctions를 사용하는 자세한 흐름은 다음과 같습니다.
- AppFunction 선언: Android 앱은 AppFunctions를 노출하도록 빌드됩니다. 예를 들어 '메모 만들기' 또는 '메시지 보내기'와 같습니다.
- 스키마 생성: AppFunctions Jetpack 라이브러리는 앱에 선언된 모든 AppFunctions를 나열하는 XML 스키마 파일을 생성합니다. 이 파일 은 Android OS에서 사용 가능한 AppFunctions를 색인화하는 데 사용됩니다.
- 메타데이터 검색: 에이전트는 AppFunction 메타데이터를 쿼리하여 검색할 수 있습니다.
- AppFunction 선택 및 실행: 에이전트는 사용자 프롬프트에 따라 적절한 매개변수로 적절한 AppFunction을 선택하고 실행합니다.
AppFunctions Jetpack 라이브러리를 사용하면 앱의 기능을 쉽게 노출할 수 있습니다.
개발자는 주석 프로세서를 사용하여 노출하려는 함수에 주석을 추가합니다. 그러면 호출자가 이러한 색인된 함수를 사용하여 검색하고 호출할 수 있습니다.
AppFunctionManager
함수를 호출하기 전에 호출자는 AppFunctionManager의 인스턴스를 검색하여 기기가 AppFunctions 기능을 지원하는지 확인해야 합니다. 지원되면 호출자는 타겟 앱 내에서 특정
함수가 사용 설정되어 있는지
isAppFunctionEnabled(packageName, functionId)를 사용하여 확인할 수 있습니다. 다른 패키지의 함수 상태를 쿼리하려면
android.permission.EXECUTE_APP_FUNCTIONS permission이 필요합니다.
앱에서 AppFunction 기능이 지원되는지 확인할 필요는 없습니다. 이는 Jetpack 라이브러리 내에서 자동으로 처리됩니다. 예를 들어
AppFunctionManager는 기능이 지원되는지 확인할 수 있습니다.
다음은 메모를 만들고, 수정하고, 나열하는 기능이 있는 메모 작성 앱의 AppFunctions 예입니다.
/** * A note app's [AppFunction]s. */ class NoteFunctions( private val noteRepository: NoteRepository ) { /** * Lists all available notes. * * @param appFunctionContext The context in which the AppFunction is executed. */ @AppFunction(isDescribedByKDoc = true) suspend fun listNotes(appFunctionContext: AppFunctionContext): List<Note>? { return noteRepository.appNotes.ifEmpty { null }?.toList() } /** * Adds a new note to the app. * * @param appFunctionContext The context in which the AppFunction is executed. * @param title The title of the note. * @param content The note's content. */ @AppFunction(isDescribedByKDoc = true) suspend fun createNote( appFunctionContext: AppFunctionContext, title: String, content: String ): Note { return noteRepository.createNote(title, content) } /** * Edits a single note. * * @param appFunctionContext The context in which the AppFunction is executed. * @param noteId The target note's ID. * @param title The note's title if it should be updated. * @param content The new content if it should be updated. */ @AppFunction(isDescribedByKDoc = true) suspend fun editNote( appFunctionContext: AppFunctionContext, noteId: Int, title: String?, content: String?, ): Note? { return noteRepository.updateNote(noteId, title, content) } } /** * A note. */ @AppFunctionSerializable(isDescribedByKDoc = true) data class Note( /** The note's identifier */ val id: Int, /** The note's title */ val title: String, /** The note's content */ val content: String )
자주 묻는 질문 (FAQ)
다음 섹션에서는 AppFunctions에 관해 자주 묻는 질문(FAQ)을 다룹니다.
앱 개발자입니다. 오늘 AppFunctions를 구현할 수 있나요?
예, 이전 섹션에 자세히 설명된 안내에 따라 앱 내에서 AppFunctions를 구현하고 테스트할 수 있습니다.
앱에서 AppFunctions를 구현했습니다. 시스템 에이전트가 액세스할 수 없는 이유는 무엇인가요?
AppFunctions는 실험 기능입니다. 이 실험 단계에서 전반적인 환경의 품질을 신중하게 평가하기 위해 제한된 수의 앱과 시스템 에이전트만 전체 파이프라인에 액세스할 수 있습니다.
AppFunctions의 일반 제공을 위해 앱을 준비하려면 어떻게 해야 하나요?
에이전트형 자동화에 노출할 앱의 기능을 고려하세요. 앱에서 AppFunctions를 구현할 수 있습니다. 이렇게 하려면 이 페이지의 이전 섹션에 있는
단계를 따르고 기기에
등록되어 있는지 확인하세요.adb shell cmd app_function
list-app-functions
엔드 투 엔드 에이전트형 개발자 환경에 사전 체험판으로 액세스할 수 있나요?
Android에서 AppFunctions를 프로덕션에 출시하는 데 필요한 엔드 투 엔드 개발자 환경을 테스트하는 데 선택된 앱을 온보딩하기 위해 사전 체험판 프로그램 (EAP)을 진행하고 있습니다. 이 EAP 등록 양식을 통해 AppFunctions 통합에 관심을 등록할 수 있습니다. 관심을 등록해도 전체 통합에 자동으로 액세스할 수 있는 것은 아닙니다. 앱이 EAP에 선택되거나 AppFunctions가 공개적으로 제공되면 이메일을 보내드립니다.
AppFunctions에 관한 의견을 제공하려면 어떻게 해야 하나요?
문제를 신고하고 사전 체험판 프로그램 양식에 관심을 등록하여 API에 관한 의견을 제공할 수 있습니다.