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
AppFunctions 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: osoba dzwonią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 promptu użytkownika.
/** * Create a new task or reminder with a title, due time, and location. * * @param context The execution context provided by the system. * @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( context: AppFunctionContext, title: String, dueDateTime: LocalDateTime? = null, location: String? = null ) : TaskMedia 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 context The execution context provided by the system. * @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( context: AppFunctionContext, query: String ): PlaylistPrzepł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 context The execution context provided by the system. * @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( context: AppFunctionContext, query: String ): List<EmailSummary> /** * Add a list of items or ingredients to the user's active shopping list. * * @param context The execution context provided by the system. * @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( context: AppFunctionContext, items: List<String> ): ShoppingListKalendarz 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 context The execution context provided by the system. * @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( context: AppFunctionContext, title: String, startDateTime: LocalDateTime ): Event
Jak działają funkcje aplikacji
Ten diagram ilustruje typowy proces 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 Jetpack AppFunctions generuje plik schematu XML, który zawiera listę wszystkich zadeklarowanych w aplikacji funkcji AppFunctions. System Android używa tego pliku do indeksowania dostępnych funkcji AppFunctions.
- Pobieranie metadanych: agent może pobierać metadane funkcji aplikacji, wysyłając do nich zapytania.
- Wybieranie i wykonywanie funkcji aplikacji: na podstawie promptów użytkownika agent wybiera i wykonuje odpowiednią funkcję aplikacji z odpowiednimi parametrami.
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:
/**
* 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
)
Najczęstsze pytania
W sekcji poniżej 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 z użyciem 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?
AppFunctions 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 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.