Обзор функций приложения

AppFunctions — это API платформы Android с сопутствующей библиотекой Jetpack , упрощающей интеграцию Android MCP. Он позволяет вашим приложениям работать как серверы MCP на устройстве, предоставляя функции, которые служат инструментами для использования проактивными функциями, а также агентами и помощниками, такими как Google Gemini. По состоянию на май 2026 года интеграция AppFunctions с Gemini находится в закрытом предварительном тестировании с участием доверенных тестировщиков. Вы можете начать подготовку своих приложений к использованию AppFunctions и инструментов разработки уже сейчас.

Определив эти AppFunctions, вы позволяете своему приложению предоставлять услуги, данные и действия реестру, встроенному в ОС Android, что дает пользователям возможность выполнять задачи через агентов и взаимодействие на системном уровне.

AppFunctions служат мобильным аналогом инструментов в рамках протокола Model Context Protocol (MCP) . В то время как MCP традиционно стандартизирует способы подключения агентов к серверным инструментам, AppFunctions предоставляют тот же механизм для приложений Android. Это позволяет вам предоставлять доступ к возможностям вашего приложения в виде оркестрируемых «инструментов», которые авторизованные приложения (вызывающие стороны) могут обнаруживать и выполнять для удовлетворения намерений пользователя. Вызывающие стороны должны иметь разрешение EXECUTE_APP_FUNCTIONS для обнаружения и выполнения AppFunctions и могут включать агентов, приложения и ИИ-помощников, таких как Gemini.

Приложение AppFunctions доступно на устройствах под управлением Android 16 и выше.

Примеры вариантов использования

AppFunctions предоставляют мощный механизм для автоматизации задач и оптимизации взаимодействия с пользователями. Расширяя возможности вашего приложения, вы позволяете пользователям достигать сложных целей, используя естественный язык, часто заменяя необходимость пошаговой ручной навигации с помощью вашего пользовательского интерфейса.

Следующие сценарии иллюстрируют, как AppFunctions можно использовать для управления пользовательским опытом в различных категориях приложений:

  • Управление задачами и повышение производительности

    • Запрос пользователя : " Напомните мне забрать мою посылку на работе сегодня в 17:00 ".
    • Действие AppFunction : Вызывающая сторона определяет соответствующее приложение для управления задачами и вызывает функцию для создания задачи, автоматически заполняя поля заголовка, времени и местоположения на основе запроса пользователя.

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

  • СМИ и развлечения

    • Запрос пользователя : " Создать новый плейлист с лучшими джазовыми альбомами этого года ".
    • Действие AppFunction : Вызывающая сторона выполняет функцию создания плейлиста в музыкальном приложении, передавая контекст, например, "лучшие джазовые альбомы 2026 года", в качестве запроса для немедленного создания плейлиста.

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

  • Межприкладные рабочие процессы

    • Запрос пользователя : " Найти рецепт лапши в электронном письме Лизы и добавить ингредиенты в свой список покупок ".
    • Действие AppFunction : Этот запрос использует функции из нескольких приложений. Сначала вызывающая сторона использует функцию поиска в почтовом приложении для получения содержимого. Затем она извлекает соответствующие ингредиенты и вызывает функцию приложения для составления списка покупок, чтобы заполнить список пользователя.

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

  • Календарь и расписание

    • Запрос пользователя : " Добавить вечеринку по случаю дня рождения мамы в мой календарь на следующий понедельник в 18:00 ".
    • Действие AppFunction : Утвержденное агентское приложение вызывает функцию «создать событие» приложения календаря, анализируя соответствующий контекст, например, «следующий понедельник» и «18:00», чтобы создать запись без необходимости вручную открывать календарь пользователем.

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

Как работают функции приложения

Следующая диаграмма иллюстрирует типичный процесс обмена функциями приложений (AppFunctions) между приложениями и агентом, а затем их выполнения. Агенты, как правило, рассматривают как удаленные инструменты MCP на стороне сервера, так и локальные функции приложений при обработке запросов пользователей. Подробный процесс использования локальных функций приложений выглядит следующим образом:

  • Объявление AppFunction : Приложение для Android создано с использованием AppFunctions для предоставления доступа к своим функциям, таким как «Создать заметку» или «Отправить сообщение».
  • Генерация схемы : Библиотека AppFunctions Jetpack генерирует XML-файл схемы, в котором перечислены все объявленные функции AppFunctions в приложении. Операционная система Android использует этот файл для индексации доступных функций AppFunctions.
  • Получение метаданных : Агент может получать метаданные AppFunction, выполняя запрос к ним. В дополнение к KDocs, специфичным для каждой функции, разработчики могут определять операционные шаблоны и ограничения на уровне приложения в метаданных приложения, чтобы управлять оркестрацией агента в различных инструментах.
  • Выбор и выполнение функции приложения : На основе подсказок пользователя агент выбирает и выполняет соответствующую функцию приложения с соответствующими параметрами.
Типичный поток функций приложения (AppFunctions) от момента доступа к приложению до выполнения агентом.
Рисунок 1 : Типичная схема предоставления и последующего выполнения AppFunctions агентом.

Библиотека AppFunctions Jetpack упрощает предоставление доступа к функциональности вашего приложения. С помощью обработчика аннотаций вы можете аннотировать функции, которые хотите сделать доступными для агентов. Затем абоненты могут находить и вызывать эти индексированные функции, используя AppFunctionManager .

Перед вызовом функции необходимо убедиться, что устройство поддерживает функцию AppFunctions, попытавшись получить экземпляр AppFunctionManager . После подтверждения поддержки можно проверить, включена ли конкретная функция в целевом приложении, используя isAppFunctionEnabled(packageName,functionId) . Для запроса статуса функций в других пакетах требуется разрешение android.permission.EXECUTE_APP_FUNCTIONSpermission .

Вашему приложению не требуется проверять, поддерживается ли функция AppFunction; это автоматически обрабатывается библиотекой Jetpack. Например, AppFunctionManager может проверить, поддерживается ли эта функция.

Вот пример AppFunctions для приложения для создания заметок с возможностями создания, редактирования и отображения списков заметок:

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

Примеры, навыки и инструменты тестирования

Для повышения вашей квалификации в области AppFunctions мы подготовили следующие материалы:

  • Изучите пример AppFunctions , чтобы убедиться и изучить, как все работает на ваших устройствах.
  • Используйте навык агента AppFunctions для ускорения разработки на всех четырех этапах жизненного цикла:
    • Исследование : Проанализируйте свой код, чтобы выявить и порекомендовать наиболее ценные функции для оркестрации ИИ.
    • Реализация и настройка : генерация реализаций Kotlin, настройка метаданных системы и зависимостей сборки.
    • KDoc Refinement : Оптимизация документации по функциям и свойствам для агентов ИИ и Android MCP.
    • Тестирование и отладка : Предоставьте команды ADB для локальной оценки и отладки на устройстве.
  • Для тестирования и проверки из командной строки используйте команды ADB, такие как adb shell cmd app_function ... , как прямой и простой способ проверить регистрацию функций, изучить описания метаданных и выполнить функции на устройстве.
  • Чтобы оценить возможности Android MCP и протестировать сквозные рабочие процессы без каких-либо запросов, установите и используйте приложение AppFunctions testing agent для Android на своем устройстве.

Часто задаваемые вопросы (FAQ)

В следующем разделе рассматриваются часто задаваемые вопросы об AppFunctions.

Я разработчик приложений. Могу ли я сегодня внедрить AppFunctions?

Да, можно реализовать и протестировать AppFunctions в вашем приложении, следуя инструкциям, изложенным в предыдущих разделах.

В чём разница между AppFunctions и MCP?

Оба подхода позволяют агентам ИИ управлять инструментами, но имеют существенные различия в архитектуре, задержке и требуемых усилиях разработчиков. AppFunctions — это встроенные в ОС механизмы, эксклюзивные для Android, которые выполняются локально. В отличие от них, стандартный MCP-сервер — это платформенно-независимое решение, которое полагается на облачное выполнение и сетевые обмены данными.

Вкратце, разработка с использованием AppFunctions позволяет использовать существующее состояние приложения непосредственно на устройстве и не требует поддержки сервисов вне вашего Android-приложения.

Я реализовал AppFunctions в своем приложении. Почему мой системный агент не может получить к ним доступ?

Функции приложений (AppFunctions) — это экспериментальная функция. Для тщательной оценки качества работы в целом на этом экспериментальном этапе доступ ко всему конвейеру обработки данных имеет лишь ограниченное количество приложений и системных агентов.

Как подготовить мое приложение к общедоступной версии AppFunctions?

Определите, какие функции вашего приложения вы хотите предоставить для автоматизации с помощью агентов. Вы можете реализовать AppFunctions в своем приложении. Для этого выполните действия, описанные в предыдущих разделах этой страницы, и убедитесь, что они зарегистрированы на устройстве, вызвав команду adb shell cmd app_function list-app-functions .

Могу ли я получить ранний доступ к полному циклу разработки агентских приложений?

Мы проводим программу раннего доступа (EAP), чтобы подключить избранные приложения для тестирования полного цикла разработки, необходимого для запуска AppFunctions в продакшене на Android. Вы можете зарегистрировать свою заинтересованность в интеграции вашего приложения AppFunctions, заполнив эту форму регистрации EAP . Регистрация вашей заинтересованности НЕ гарантирует автоматическое получение доступа к полной интеграции. Мы отправим вам электронное письмо, если ваше приложение будет выбрано для участия в программе EAP, или сообщим, когда AppFunctions станет общедоступным.

Как я могу оставить отзыв о AppFunctions?

Вы можете оставить отзыв об API, создав заявку и зарегистрировав свой интерес в форме программы раннего доступа.