Omówienie funkcji AppFunctions

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

Definiując te funkcje aplikacji, umożliwiasz jej udostępnianie usług, danych i działań w rejestrze wbudowanym w system operacyjny Android. Dzięki temu użytkownicy mogą wykonywać zadania za pomocą agentów i interakcji na poziomie systemu.

Funkcje aplikacji są mobilnym odpowiednikiem narzędzi w ramach Model Context Protocol (MCP). MCP tradycyjnie standaryzuje sposób, w jaki agenci łączą się z narzędziami po stronie serwera, a AppFunctions zapewnia ten sam mechanizm w przypadku aplikacji na Androida. Dzięki temu możesz udostępniać funkcje aplikacji jako „narzędzia”, które autoryzowane aplikacje (wywołujące) mogą wykrywać i wykonywać, aby realizować intencje użytkowników. Osoby dzwoniące muszą mieć uprawnienie EXECUTE_APP_FUNCTIONS do odkrywania i wykonywania funkcji aplikacji. Mogą to być agenci, aplikacje i asystenci AI, np. Gemini.

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

Przykłady użycia

Funkcje aplikacji to zaawansowany 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 funkcje aplikacji mogą wpływać na wrażenia użytkowników w różnych kategoriach aplikacji:

  • Zarządzanie zadaniami i produktywność

    • Prośba użytkownika:Przypomnij mi, żebym odebrał paczkę w pracy o 17:00”.
    • Działanie AppFunction: dzwoniący 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 promptu 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: osoba dzwonią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 w wielu aplikacjach

    • Prośba użytkownika:Znajdź przepis na makaron z e-maila Lisy i dodaj składniki do mojej listy zakupów”.
    • Działanie AppFunction: to żądanie korzysta z funkcji z wielu aplikacji. Najpierw osoba dzwoniąca używa funkcji wyszukiwania w aplikacji poczty e-mail, 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 harmonogram

    • Prośba użytkownika:Dodaj do mojego kalendarza przyjęcie urodzinowe mamy w najbliższy poniedziałek o 18:00”.
    • Działanie AppFunction: zatwierdzona aplikacja agentowa wywołuje funkcję „utwórz wydarzenie” aplikacji kalendarza, analizując odpowiedni kontekst, np. „w najbliższy 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ą funkcje aplikacji

Poniższy diagram przedstawia typowy przepływ udostępniania funkcji aplikacji agentowi i ich wykonywania. Agenty prawdopodobnie będą uwzględniać zarówno zdalne narzędzia MCP po stronie serwera, jak i lokalne funkcje aplikacji podczas obsługi żądań użytkowników. Szczegółowy proces korzystania z lokalnych funkcji aplikacji wygląda tak:

  • Deklaracja AppFunction: aplikacja na Androida jest zbudowana tak, aby korzystać z funkcji AppFunction i udostępniać swoje funkcje, takie jak „Utwórz notatkę” czy „Wyślij wiadomość”.
  • Generowanie schematu: biblioteka AppFunctions Jetpack generuje plik schematu XML, który zawiera listę wszystkich zadeklarowanych funkcji aplikacji. System Android używa tego pliku do indeksowania dostępnych funkcji aplikacji.
  • Pobieranie metadanych: agent może pobierać metadane funkcji aplikacji, wysyłając do nich zapytania. Oprócz dokumentacji KDoc dotyczącej poszczególnych funkcji deweloperzy mogą definiować wzorce operacyjne i ograniczenia na poziomie aplikacji w metadanych aplikacji, aby ułatwić koordynację agentów w wielu narzędziach.
  • Wybieranie i wykonywanie funkcji aplikacji: na podstawie promptów użytkownika agent wybiera i wykonuje odpowiednią funkcję aplikacji z odpowiednimi parametrami.
Typowy przepływ AppFunctions od ekspozycji aplikacji do wykonania przez agenta.
Ilustracja 1. Typowy schemat udostępniania funkcji aplikacji i ich wykonywania przez agenta.

Biblioteka Jetpack AppFunctions ułatwia udostępnianie funkcji aplikacji. Za pomocą procesora adnotacji możesz dodawać adnotacje do funkcji, które chcesz udostępnić agentom. Dzwoniący mogą następnie wykrywać i wywoływać te zindeksowane funkcje za pomocą AppFunctionManager.

Przed wywołaniem funkcji dzwoniący powinni sprawdzić, czy urządzenie obsługuje funkcję AppFunctions, próbując pobrać instancję AppFunctionManager. Gdy ta funkcja będzie obsługiwana, dzwoniący będą mogli sprawdzić, czy w danej aplikacji jest włączona konkretna funkcja, za pomocą isAppFunctionEnabled(packageName,functionId). Wykonywanie zapytań o stan funkcji w innych pakietach wymaga uprawnienia android.permission.EXECUTE_APP_FUNCTIONSpermission.

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 możliwością 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 funkcji aplikacji, udostępniliśmy te materiały:

  • Zapoznaj się z przykładową aplikacją AppFunctions, aby sprawdzić i przetestować, jak wszystko działa na Twoich urządzeniach.
  • Użyj umiejętności agenta AppFunctions, aby przyspieszyć rozwój w 4-etapowym cyklu życia:
    • Odkrywanie: analizuje bazę kodu, aby identyfikować i rekomendować funkcje o wysokiej wartości na potrzeby orkiestracji AI.
    • Wdrażanie i konfigurowanie: generowanie implementacji w języku Kotlin oraz konfigurowanie metadanych systemu i zależności kompilacji.
    • Ulepszenie KDoc: optymalizacja dokumentacji funkcji i właściwości pod kątem agentów AI i Android 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 .... Jest to bezpośredni i prosty sposób na testowanie rejestracji funkcji, sprawdzanie opisów metadanych i wykonywanie funkcji na urządzeniu.
  • Aby zobaczyć, jak działa Android MCP, i przetestować kompleksowe przepływy pracy bez konieczności używania promptów, zainstaluj i używaj na urządzeniu aplikacji na Androida AppFunctions testing agent.

Najczęstsze pytania

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

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

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

Czym różnią się funkcje aplikacji od platformy MCP?

Obie umożliwiają agentom AI koordynowanie narzędzi, ale różnią się znacznie architekturą, opóźnieniem i wymaganym nakładem pracy programisty. Funkcje aplikacji to wbudowane na poziomie systemu operacyjnego wywołania dostępne tylko na Androidzie, które są wykonywane lokalnie. Z kolei standardowy serwer MCP to rozwiązanie niezależne od platformy, które opiera się na wykonywaniu w chmurze i wędrówkach sieciowych.

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

Mam zaimplementowane w aplikacji funkcje AppFunctions. Dlaczego mój agent systemowy nie ma do nich dostępu?

Funkcje aplikacji to funkcja eksperymentalna. Aby dokładnie ocenić jakość ogólnych wrażeń użytkownika w fazie eksperymentalnej, tylko ograniczona liczba aplikacji i agentów systemowych może uzyskać dostęp do całego procesu.

Jak przygotować aplikację na ogólną dostępność funkcji aplikacji?

Zastanów się, które funkcje aplikacji chcesz udostępnić automatyzacji opartej na agentach. Możesz zaimplementować 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 programistycznego agenta?

Prowadzimy program wcześniejszego dostępu, aby wprowadzić wybrane aplikacje do testowania kompleksowego środowiska deweloperskiego wymaganego do wdrożenia funkcji aplikacji w wersji produkcyjnej na Androidzie. Możesz zgłosić chęć zintegrowania funkcji aplikacji za pomocą tego formularza rejestracji w programie wcześniejszego 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 funkcje aplikacji staną się publicznie dostępne.

Jak mogę przesłać opinię o funkcjach aplikacji?

Możesz przesłać opinię o interfejsie API, zgłaszając problem i rejestrując zainteresowanie programem wcześniejszego dostępu.