Omówienie funkcji AppFunctions

AppFunctions to interfejs API platformy Android z towarzyszącą biblioteką Jetpack, która upraszcza integrację z Androidem MCP. Umożliwia on aplikacjom zachowywanie się jak serwery MCP na urządzeniu, udostępniając funkcje, które działają jako narzędzia używane przez proaktywne funkcje oraz agentów i asystentów, takich jak Google Gemini. Od maja 2026 r. integracja AppFunctions z Gemini jest dostępna w wersji prywatnej dla zaufanych testerów. Możesz już teraz zacząć przygotowywać aplikacje do korzystania z AppFunctions i narzędzi dla deweloperów.

Definiując te AppFunctions, umożliwiasz aplikacji udostępnianie usług, danych i działań w rejestrze wbudowanym w system operacyjny Android, co pozwala użytkownikom wykonywać zadania za pomocą agentów i interakcji na poziomie systemu.

AppFunctions są mobilnym odpowiednikiem narzędzi w ramach Model Context Protocol (MCP). MCP tradycyjnie standaryzuje sposób łączenia się agentów z narzędziami po stronie serwera, a AppFunctions zapewniają ten sam mechanizm w przypadku aplikacji na Androida. Dzięki temu możesz udostępniać funkcje aplikacji jako „narzędzia”, które mogą być wykrywane i wykonywane przez autoryzowane aplikacje (wywołujące) w celu realizacji intencji użytkownika. Aby wykrywać i wykonywać AppFunctions, aplikacje wywołujące muszą mieć uprawnienie EXECUTE_APP_FUNCTIONS. Mogą to być agenty, aplikacje i asystenci AI tacy jak Gemini.

AppFunctions jest dostępny na urządzeniach z Androidem 16 lub nowszym.

Przykłady użycia

AppFunctions to skuteczny mechanizm automatyzacji zadań i usprawniania interakcji z użytkownikiem. Udostępniając funkcje aplikacji, umożliwiasz użytkownikom realizowanie złożonych celów za pomocą języka naturalnego, co często zastępuje konieczność ręcznego poruszania się po interfejsie.

Poniższe scenariusze pokazują, jak można używać AppFunctions do tworzenia środowisk w różnych kategoriach aplikacji:

  • Zarządzanie zadaniami i produktywność

    • Prośba użytkownika: "Przypomnij mi, żebym odebrał paczkę w pracy dzisiaj o 17 :00".
    • Działanie AppFunction: aplikacja wywołująca identyfikuje odpowiednią aplikację do zarządzania zadaniami i wywołuje funkcję tworzenia zadania, automatycznie wypełniając pola tytułu, czasu i lokalizacji na podstawie prompta użytkownika.

    /**
     * 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()

  • Media i rozrywka

    • Prośba użytkownika: "Utwórz nową playlistę z najlepszymi albumami jazzowymi z tego roku".
    • Działanie AppFunction: aplikacja wywołująca wykonuje funkcję tworzenia playlisty w aplikacji muzycznej, przekazując kontekst, np. „najlepsze albumy jazzowe z 2026 r.”, jako zapytanie, aby natychmiast wygenerować playlistę.

    /**
     * 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()

  • Przepływy pracy między aplikacjami

    • Prośba użytkownika: "Znajdź przepis na makaron w e-mailu od Lisy i dodaj składniki do listy zakupów".
    • Działanie AppFunction: to żądanie korzysta z funkcji z kilku aplikacji. Najpierw aplikacja wywołująca używa funkcji wyszukiwania w aplikacji pocztowej, aby pobrać treść. Następnie wyodrębnia odpowiednie składniki i wywołuje funkcję aplikacji listy zakupów, aby wypełnić listę użytkownika.

    /**
     * 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()

  • Kalendarz i terminarze

    • Prośba użytkownika: "Dodaj do kalendarza urodziny mamy w przyszły poniedziałek o 18:00".
    • Działanie AppFunction: zatwierdzona aplikacja agentowa wywołuje funkcję „utwórz wydarzenie” w aplikacji kalendarza analizując odpowiedni kontekst, np. „w przyszły poniedziałek” i „18:00”, aby utworzyć wpis bez konieczności ręcznego otwierania kalendarza przez użytkownika.

    /**
     * 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()

Jak działają AppFunctions

Poniższy diagram przedstawia typowy przepływ udostępniania AppFunctions przez aplikacje agentowi i ich późniejszego wykonywania. Podczas obsługi żądań użytkowników agenci prawdopodobnie będą uwzględniać zarówno zdalne narzędzia MCP po stronie serwera, jak i lokalne AppFunctions. Szczegółowy przepływ korzystania z lokalnych AppFunctions jest następujący:

  • Deklaracja AppFunction: aplikacja na Androida jest tworzona tak, aby korzystać z AppFunctions i udostępniać swoje funkcje, takie jak "Utwórz notatkę" czy "Wyślij wiadomość".
  • Generowanie schematu: biblioteka Jetpack AppFunctions generuje plik schematu XML który zawiera listę wszystkich zadeklarowanych AppFunctions w aplikacji. System Android używa tego pliku do indeksowania dostępnych AppFunctions.
  • Pobieranie metadanych: agent może pobierać metadane AppFunction, wysyłając do niej zapytanie. Oprócz KDocs dotyczących funkcji deweloperzy mogą definiować wzorce operacyjne i ograniczenia na poziomie aplikacji w metadanych aplikacji, aby kierować orkiestracją agentów w różnych narzędziach.
  • Wybieranie i wykonywanie AppFunction: na podstawie promptów użytkownika agent wybiera i wykonuje odpowiednią AppFunction z odpowiednimi parametrami.
Typowy przepływ AppFunctions od ekspozycji aplikacji do wykonania przez agenta.
Rysunek 1. Typowy przepływ udostępniania AppFunctions i ich późniejszego wykonywania przez agenta.

Biblioteka Jetpack AppFunctions upraszcza udostępnianie funkcji aplikacji. Za pomocą procesora adnotacji możesz oznaczać funkcje, które chcesz udostępnić agentom. Aplikacje wywołujące mogą następnie wykrywać i wywoływać te indeksowane funkcje za pomocą AppFunctionManager.

Przed wywołaniem funkcji aplikacje wywołujące powinny sprawdzić, czy urządzenie obsługuje funkcję AppFunctions, próbując pobrać instancję AppFunctionManager. Gdy funkcja jest obsługiwana, aplikacje wywołujące mogą sprawdzić, czy dana funkcja jest włączona w aplikacji docelowej, za pomocą isAppFunctionEnabled(packageName,functionId). Wysyłanie zapytań o stan funkcji w innych pakietach wymaga android.permission.EXECUTE_APP_FUNCTIONS uprawnienia.

Twoja aplikacja nie musi sprawdzać, czy funkcja AppFunction jest obsługiwana. Jest to automatycznie obsługiwane w bibliotece Jetpack. Na przykład, AppFunctionManager może sprawdzić, czy funkcja jest obsługiwana.

Oto przykład AppFunctions dla aplikacji do robienia notatek z funkcjami tworzenia, edytowania i wyświetlania notatek:

@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,
)

Przykłady, umiejętności i narzędzia testujące

Aby pomóc Ci w zdobyciu umiejętności w zakresie AppFunctions, udostępniliśmy te materiały:

  • Zapoznaj się z przykładem AppFunctions, aby sprawdzić i poznać działanie wszystkich funkcji na swoich urządzeniach.
  • Użyj umiejętności agenta AppFunctions, aby przyspieszyć tworzenie aplikacji w 4 etapach cyklu życia:
    • Odkrywanie: analizuj kod, aby identyfikować i rekomendować funkcje o wysokiej wartości na potrzeby orkiestracji AI.
    • Implementacja i konfiguracja: generuj implementacje Kotlin, konfiguruj metadane systemu i zależności kompilacji.
    • Dopracowywanie KDoc: optymalizuj dokumentację funkcji i właściwości pod kątem agentów AI i Androida MCP.
    • Testowanie i debugowanie: udostępniaj polecenia ADB do lokalnej oceny i debugowania na urządzeniu.
  • Do testowania i weryfikacji w wierszu poleceń używaj poleceń ADB, takich jak adb shell cmd app_function ..., jako bezpośredniego i prostego sposobu na testowanie rejestracji funkcji , sprawdzanie opisów metadanych i wykonywanie funkcji na urządzeniu.

Najczęstsze pytania

W tej sekcji znajdziesz odpowiedzi na najczęstsze pytania dotyczące AppFunctions.

Jestem deweloperem aplikacji. Czy mogę wdrożyć AppFunctions już dziś?

Tak, możesz wdrożyć i przetestować AppFunctions w swojej aplikacji, postępując zgodnie z instrukcjami podanymi w poprzednich sekcjach.

Jaka jest różnica między AppFunctions a MCP?

Obie te funkcje umożliwiają agentom AI orkiestrację narzędzi, ale różnią się architekturą, opóźnieniem i wymaganym nakładem pracy dewelopera. AppFunctions to wbudowane haki na poziomie systemu operacyjnego, które są dostępne tylko w Androidzie i działają lokalnie. Z kolei standardowy serwer MCP to rozwiązanie niezależne od platformy, które opiera się na wykonywaniu w chmurze i podróżach w obie strony w sieci.

Krótko mówiąc, tworzenie aplikacji za pomocą AppFunctions umożliwia bezpośrednie korzystanie z istniejącego stanu aplikacji na urządzeniu i nie wymaga utrzymywania usług poza aplikacją na Androida.

Wdrożyłem AppFunctions w mojej aplikacji. Dlaczego mój agent systemowy nie może do nich uzyskać dostępu?

AppFunctions to funkcja eksperymentalna. Aby dokładnie ocenić jakość ogólnego środowiska w tej fazie eksperymentalnej, tylko ograniczona liczba aplikacji i agentów systemowych może uzyskać dostęp do całego potoku.

Jak mogę przygotować aplikację na ogólną dostępność AppFunctions?

Zastanów się, które funkcje aplikacji chcesz udostępnić automatyzacji agentowej. Możesz wdrożyć AppFunctions w swojej aplikacji. Aby to zrobić, wykonaj czynności opisane w poprzednich sekcjach na tej stronie i sprawdź, czy są one zarejestrowane na urządzeniu, wywołując adb shell cmd app_function list-app-functions.

Czy mogę uzyskać wcześniejszy dostęp do kompleksowego środowiska deweloperskiego agenta?

Prowadzimy program wczesnego dostępu, aby wdrożyć wybrane aplikacje w testowaniu kompleksowego środowiska deweloperskiego wymaganego do uruchomienia AppFunctions w wersji produkcyjnej na Androidzie. Możesz zgłosić zainteresowanie integracją AppFunctions za pomocą tego formularza rejestracji w programie wczesnego dostępu. Zgłoszenie zainteresowania NIE oznacza automatycznego uzyskania dostępu do pełnej integracji. Jeśli Twoja aplikacja zostanie wybrana do programu wczesnego dostępu, wyślemy Ci e-maila. Poinformujemy Cię też, gdy AppFunctions będą ogólnie dostępne.

Jak mogę przesłać opinię na temat AppFunctions?

Możesz przesłać opinię na temat interfejsu API, zgłaszając problem i rejestrując się w formularzu programu wczesnego dostępu.