操作指南

构建智能 Android 应用:使用 AppFunctions 集成到 Android 的智能系统

6 分钟阅读时间
查看 Ben Weiss 的个人资料
Ben Weiss 开发者关系工程师

欢迎回到“构建智能 Android 应用”系列博文,我们将在此系列博文中介绍如何将基本的 Android 应用转变为个性化、智能化的智能体体验。在我们的 上一篇博文中,我们探讨了如何利用 Firebase AI Logic 构建云托管式和混合式 AI 功能。

传统的移动界面擅长处理专注的动手任务,而 Android 智能系统则引入了补充功能,让复杂的、多步骤的操作变得更加简单。通过补充传统的用户界面,AppFunctions 提供了一个强大的新入口点:设备上的特权智能体可以在后台访问应用功能。当用户开车、走路或执行其他多任务操作时,这会特别有用。

在本文中,我们将向您展示如何使用 Android AppFunctions 设计这些功能并将其集成到我们的旅行计划应用 JetPacker 中。我们将探讨选择这些功能的理由,讨论我们用于加快开发的专用工具,并深入了解让这一切正常运行的代码。

设计支持 AI 的功能:为用户做出重要选择

为了选择要提供给智能系统的功能,我们寻找了语音或文本命令比点击屏幕更快完成的任务。在此并排屏幕录制中,您可以清楚地看到这种对比:左侧是用户点击多个屏幕来记录费用;右侧是同一任务通过特权智能体在后台即时完成。

我们的首选是费用跟踪。在旅行期间记录咖啡费用通常需要多次点击操作:解锁手机、打开应用、找到正在进行的旅行、导航到“费用”标签页、点击“添加”按钮、拍摄收据照片,然后检查结果。通过将 addExpensegetExpenses 功能作为 AppFunctions 提供,系统智能体可以处理繁重的工作。当用户说“将 5 美元的咖啡费用添加到我的巴黎旅行中”时,智能体会自动在后台搜索正确的旅行 ID 并插入费用,完全跳过手动界面流程。

我们还优先考虑了行程管理。在繁忙的旅行行程中查找下一个活动通常需要滚动浏览密集的时间轴视图。通过向系统提供 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 入口点,优化我们的 KDoc 文档以确保 LLM 了解参数边界,并使用 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 默认在界面线程上运行,因此我们使用 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 会生成最终的具体服务子类 JetPackerAppFunctionService,如 serviceName 参数所声明的那样。我们还在应用的清单中注册了 app_metadata.xml。此文件为 JetPacker 声明的 AppFunctions 提供了全局操作规则。

测试和验证 AppFunctions

实现后,您应验证 AppFunctions 是否已注册并正常运行。

对于运行 Android 17 或更高版本的设备或模拟器,您可以使用终端中的 ADB 命令列出和调用函数。运行 adb shell cmd app_function list-app-functions 会显示软件包的所有注册函数。然后,您可以执行特定函数并通过运行 adb shell cmd app_function execute-app-function 并传递原始 JSON 参数字符串来测试其数据库集成。

除了这些 ADB 命令之外,您还可以使用 AppFunctions 测试智能体 来检查配置、列出和执行 AppFunctions,甚至可以查看 AppFunctions 在实际对话流程中的行为。

总结

在考虑可以使用 AppFunctions 向智能系统贡献的应用功能时,我们需要稍微改变对代码和文档的思考方式。AppFunctions 使您能够为应用使用这种新的互动模型,从而允许使用智能体访问应用功能。

首先,AppFunctions 开发技能是必不可少的生命周期工具,可帮助您发现功能、实现和优化应用中的 AppFunctions。其次,KDoc 注释是编译后的 API 资产;清晰的参数说明直接影响系统智能体的执行准确性。最后,Android MCP 提供本地优先执行,允许应用安全地与 AI 智能体协作。

通过 AppFunctions 贡献应用功能可让您的应用为智能系统做好准备。请告诉我们您如何让应用适应智能体时代!

了解详情

请查看此系列博文的其他部分:
第 1 部分 应用简介和概览。
第 2 部分 设备端智能。深入了解机器学习套件的生成式 AI API 和 Gemini Nano,以构建隐私优先的功能,例如行程摘要、收据解析和本地音频处理。
第 3 部分 混合推理和云推理。了解如何使用 Firebase AI Logic 将 LLM 答案基于真实世界数据(例如 Google 地图和网络上下文)。
第 4 部分(本文!)系统集成。使用 AppFunctions 与 Android 智能系统集成。
第 5 部分(即将推出):应用内智能体工作流。使用 A2UI 和 ADK 为应用添加端到端预订助理。

想了解更多有关 Android 开发的信息?请在 YouTubeLinkedIn 上关注 Android Developers!

本博文中的所有代码段均遵循以下版权声明:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
Written by:
继续阅读