방법

지능형 Android 앱 빌드: AppFunctions를 사용하여 Android의 지능형 시스템에 통합

읽는 데 6분 소요
벤 와이스의 프로필 보기
Ben Weiss 개발자 관계팀 엔지니어

'지능형 Android 앱 빌드' 블로그 게시물 시리즈에 다시 오신 것을 환영합니다. 이 시리즈에서는 기본적인 Android 앱을 맞춤설정되고 지능적이며 에이전트형 환경으로 변환합니다. 이전 게시물에서는 Firebase AI Logic을 활용하여 클라우드 호스팅 및 하이브리드 AI 기능을 빌드하는 방법을 살펴보았습니다.

기존 모바일 UI는 집중적인 실습 작업에 탁월하며 Android 지능형 시스템은 복잡한 다단계 작업을 더욱 쉽게 수행할 수 있도록 보완 기능을 도입하고 있습니다. 기존 사용자 인터페이스를 보완함으로써 AppFunctions는 강력한 새로운 진입점을 제공합니다. 기기의 권한 있는 에이전트는 백그라운드에서 앱 기능에 액세스할 수 있습니다. 이는 사용자가 운전, 걷기 또는 기타 멀티태스킹을 할 때 특히 유용할 수 있습니다.

이 도움말에서는 Android AppFunctions를 사용하여 이러한 기능을 여행 계획 앱인 JetPacker에 설계하고 통합한 방법을 보여줍니다. 기능 선택의 근거를 살펴보고, 개발 속도를 높이는 데 사용한 전문 도구를 논의하고, 모든 작업을 수행하는 코드를 자세히 살펴보겠습니다.

AI 지원 기능 설계: 사용자에게 중요한 선택하기

지능형 시스템에 제공할 기능을 선택하기 위해 음성 또는 텍스트 명령이 화면을 탭하는 것보다 객관적으로 빠른 작업을 찾았습니다. 이 나란히 표시된 화면 녹화에서 이러한 대비를 완벽하게 확인할 수 있습니다. 왼쪽에는 사용자가 여러 화면을 탭하여 비용을 기록하고, 오른쪽에는 권한 있는 에이전트를 통해 백그라운드에서 동일한 작업이 즉시 완료됩니다.

첫 번째 선택은 비용 추적이었습니다. 여행 중에 커피 비용을 기록하려면 일반적으로 휴대기기 잠금 해제, 앱 열기, 활성 여행 찾기, 비용 탭으로 이동, 추가 버튼 탭, 영수증 사진 찍기, 결과 확인 등 여러 번 탭해야 합니다. addExpensegetExpenses 기능을 AppFunctions로 제공하면 시스템 에이전트가 어려운 작업을 처리합니다. 사용자가 '파리 여행에 5달러짜리 커피 비용을 추가해 줘'라고 말하면 에이전트가 백그라운드에서 올바른 여행 ID를 자동으로 검색하고 비용을 삽입하여 수동 UI 흐름을 완전히 건너뜁니다.

일정 관리도 우선순위로 지정했습니다. 바쁜 여행 일정에서 다음 활동을 찾으려면 일반적으로 빽빽한 타임라인 뷰를 스크롤해야 합니다. 시스템에 getItineraryaddItineraryEvent를 제공하면 사용자는 '파리에서 다음에 무엇을 할까?'라고 묻고 즉시 답변을 받을 수 있습니다.

마지막으로 핸즈프리 메모 캡처에 집중했습니다. 붐비는 거리를 걸으면서 리마인더나 메모를 입력하는 것은 어렵고 안전하지 않습니다. 음성 메모 기능을 노출하면 사용자는 '비행은 정말 좋았어. 아름다운 일몰을 봤고 잠도 잘 잤어'라고 말할 수 있으며 권한 있는 에이전트는 addVoiceNote AppFunction을 사용하여 여행 데이터베이스에 직접 자동으로 텍스트로 변환하고 저장합니다.

AppFunctions로 구동되는 Android MCP

이 전체 환경은 Android MCP를 기반으로 빌드됩니다. 이 설계에서 앱은 로컬 MCP 서버 역할을 합니다. 원격 API 대신 기기 내 지능형 시스템에 앱 기능을 직접 제공합니다.

Android AppFunctions는 이 개념을 실현하는 API입니다. 주석이 달린 Kotlin 함수를 읽고 권한 있는 에이전트가 기기에서 로컬로 검색하고 호출할 수 있는 유형 안전 샌드박스 처리된 도구 정의로 컴파일합니다.

Android MCP diagram.png
앱, Android 플랫폼, 시스템 에이전트가 AppFunctions를 조정하는 다이어그램

Android MCP 모델에서 앱은 구조화된 도구를 노출하는 로컬 MCP 서버 역할을 하며 Android 플랫폼은 중앙 도구 레지스트리 역할을 합니다. MCP 클라이언트 측에서 에이전트 앱은 레지스트리에 액세스할 수 있는 시스템 권한이 부여된 후 지능형 시스템에 등록됩니다.

사용자가 등록된 에이전트와 상호작용하면 LLM은 요청을 AppFunction으로 처리할 수 있는지 확인하고 플랫폼의 메타데이터를 쿼리하며 백그라운드에서 적절한 등록된 함수를 실행합니다. 이 로컬 MCP 클라이언트-서버 설계는 완전한 제어 기능을 제공합니다. 에이전트가 액세스할 수 있는 기능을 정확하게 선택하여 앱의 나머지 데이터를 비공개로 유지할 수 있습니다.

Android 기술로 개발 속도를 높인 방법

통합 프로세스를 간소화하기 위해 AppFunctions 개발 기술을 활용했습니다. AppFunctions 개발 기술은 완전한 개발 도우미입니다. 이 기술은 Kotlin 데이터 클래스를 매핑하여 매개변수를 직렬화하고, 필요한 Service 진입점을 생성하고, LLM이 매개변수 경계를 이해하도록 KDoc 문서를 개선하고, ADB를 사용하여 자동화된 테스트를 설정하는 등 전체 수명 주기를 안내했습니다.

지능형 시스템에 앱 기능 제공

이론은 충분히 설명했으니 구현을 살펴보겠습니다.

구성 및 종속 항목 설정

먼저 AppFunctions 종속 항목을 추가합니다. API용 하나와 Kotlin Symbol Processing 컴파일러용 하나입니다.

implementation("androidx.appfunctions:appfunctions:1.0.0-alpha10")
ksp("androidx.appfunctions:appfunctions-compiler:1.0.0-alpha10")

맞춤 데이터 유형 모델링

에이전트와 교환되는 모든 맞춤 객체는 @AppFunctionSerializable로 주석을 달아야 합니다. TripSerializable.kt 파일에서 이동 데이터 모델을 정의합니다.

@AppFunctionSerializable(isDescribedByKDoc = true)
data class TripSerializable(
    /** The trip's unique identifier. */
    val id: String,
    /** The trip's title. */
    val title: String,
    /** The trip's destination location. */
    val location: String,
    /** The trip's start date in milliseconds. */
    val startDate: Long,
    /** The trip's end date in milliseconds. */
    val endDate: Long,
    /** A list of participants. */
    val participants: List<String>,
)

@AppFunction 주석을 사용하여 기능 제공

다음으로 이 스킬은 데이터베이스 쿼리를 실행하는 Kotlin 함수를 작성하고 @AppFunction으로 주석을 답니다. searchTrip에서 이를 볼 수 있습니다.

/**
 * Looks for trips based on optional filters like id, title (name), location, and dates.
 *
 * @param id The unique identifier of the trip.
 * @param title The title or name of the trip.
 * @param location The destination location.
 * @param startDate The minimum start date in milliseconds.
 * @param endDate The maximum end date in milliseconds.
 * @return A list of trips matching the filters.
 */
@AppFunction(isDescribedByKDoc = true)
suspend fun searchTrip(
    id: String? = null,
    title: String? = null,
    location: String? = null,
    startDate: Long? = null,
    endDate: Long? = null
): List<TripSerializable> {
    return withContext(Dispatchers.IO) {
    // implementation
}

AppFunctions는 기본적으로 UI 스레드에서 실행되므로 withContext(Dispatchers.IO)를 사용하여 백그라운드 디스패처로 전환합니다. 또한 명확한 명령형 동사를 사용하고 매개변수 제약 조건을 지정하도록 KDoc을 개선합니다. 이 문서는 권한 있는 에이전트가 매개변수를 확인하고 런타임 오류를 처리하는 데 사용하는 도구의 스키마로 직접 컴파일됩니다.

서비스 진입점 및 Hilt 통합

이러한 기능을 지능형 시스템에 등록하려면 AppFunctionService를 확장하는 추상 기본 클래스를 만듭니다. @AppFunctionServiceEntryPoint로 주석을 답니다.

@RequiresApi(36)
@AndroidEntryPoint
@AppFunctionServiceEntryPoint(
    serviceName = "JetPackerAppFunctionService",
    appFunctionXmlFileName = "jetpacker_app_function_service"
)
abstract class BaseJetPackerAppFunctionService : AppFunctionService() {
    @Inject internal lateinit var tripDao: TripDao
    // DAOs and database references are injected here...
}

컴파일 중에 KSP는 serviceName 매개변수로 선언된 최종 구체적인 서비스 하위 클래스인 JetPackerAppFunctionService를 생성합니다. 또한 앱의 매니페스트에 app_metadata.xml을 등록합니다. 이 파일은 JetPacker의 선언된 AppFunctions에 대한 전역 운영 규칙을 제공합니다.

AppFunctions 테스트 및 확인

구현한 후에는 AppFunctions가 등록되어 있고 올바르게 작동하는지 확인해야 합니다.

Android 17 이상을 실행하는 기기 또는 에뮬레이터에서 터미널의 ADB 명령어를 사용하여 함수를 나열하고 호출할 수 있습니다. adb shell cmd app_function list-app-functions를 실행하면 패키지에 등록된 모든 함수가 표시됩니다. 그런 다음 원시 JSON 매개변수 문자열을 전달하면서 adb shell cmd app_function execute-app-function을 실행하여 특정 함수를 실행하고 데이터베이스 통합을 테스트할 수 있습니다.

이러한 ADB 명령어 대신 AppFunctions 테스트 에이전트를 사용하여 구성을 검사하고, AppFunctions를 나열하고 실행하고, 실제 대화 흐름에서 AppFunctions가 어떻게 동작하는지 확인할 수도 있습니다.

결론

AppFunctions를 사용하여 지능형 시스템에 제공할 수 있는 앱 기능을 고려할 때는 코드와 문서에 대한 생각을 약간 바꿔야 합니다. AppFunctions를 사용하면 앱에 이 새로운 상호작용 모델을 사용할 수 있으므로 에이전트를 사용하여 앱 기능에 액세스할 수 있습니다.

첫째, AppFunctions 개발 기술은 필수적인 수명 주기 도구로, 앱의 기능을 검색하고 AppFunctions를 구현하고 개선하는 데 도움이 됩니다. 둘째, KDoc 주석은 컴파일된 API 애셋입니다. 명확한 매개변수 설명은 시스템 에이전트의 실행 정확도에 직접적인 영향을 미칩니다. 마지막으로 Android MCP는 앱이 AI 에이전트와 안전하게 공동작업할 수 있도록 로컬 우선 실행을 제공합니다.

AppFunctions를 통해 앱 기능을 제공하면 애플리케이션이 지능형 시스템에 대비할 수 있습니다. 에이전트 시대에 맞게 앱을 어떻게 조정하고 있는지 알려 주세요.

자세히 알아보기

이 블로그 게시물 시리즈의 다른 부분을 확인해 보세요.
1부: 앱 소개 및 간략한 개요
2부: 기기 내 지능형 ML Kit의 GenAI API와 Gemini Nano를 자세히 살펴보고 일정 요약, 영수증 파싱, 로컬 오디오 처리와 같은 개인 정보 보호 우선 기능을 빌드합니다.
3부: 하이브리드 및 클라우드 추론 Firebase AI Logic을 사용하여 Google 지도 및 웹 컨텍스트와 같은 실제 데이터에서 LLM 답변을 제공하는 방법을 알아봅니다.
4부 (이 게시물): 시스템 통합 AppFunctions를 사용하여 Android 지능형 시스템과 통합합니다.
5부 (출시 예정): 인앱 에이전트형 워크플로 A2UI 및 ADK로 구동되는 엔드 투 엔드 예약 어시스턴트로 앱을 확장합니다.

Android 개발에 관해 더 알고 싶으신가요? YouTube 또는 LinkedIn에서 Android 개발자를 팔로우하세요.

이 블로그 게시물의 모든 코드 스니펫은 다음 저작권 고지를 따릅니다.

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
작성자:
계속 읽기