当大模型需要从回答问题进一步走向调用工具、规划任务和执行操作时,应用就需要一套可控的 Agent 运行框架。ADK for Kotlin 将这些能力带入 Kotlin 与 Android 生态,既支持云端编排,也覆盖设备端推理、状态持久化和敏感操作确认。下面从架构、核心机制和基础代码入手展开说明。

今日,Google 发布了 ADK for Kotlin 1.0 正式版。
这意味着:Android 开发者可以用 Kotlin 写生产级 AI Agent 了。
ADK 全称 Agent Development Kit,这是:Google 官方出品的 Kotlin AI Agent 开发框架。
类比一下:如果 Retrofit 是"网络请求框架",那 ADK 就是"AI Agent 框架"。


普通的 LLM 调用,你问它一个问题,它给你一段文字。
但 Agent 不一样——它能调用工具、做决策、执行操作。ADK 解决的是一个核心问题:怎么让 AI 不只是"聊天",而是"干活",日常使用场景包括:
手机上跑一个助手 Agent:
findContact 工具找到张三;previewTransfer 生成预览;executeTransfer 执行。全程在 Android 上完成,敏感数据不出设备。
生产数据库告警了,Agent 自动:
getServiceMetrics() → 发现连接池饱和 98.5%;fetchRecentDeployments() → 定为25 分钟前的未索引批查询;#production-alerts 发送分析报告 + 回滚建议。从告警到定位根因,分钟级完成。
云端大模型做主编排器,设备端小模型处理隐私数据:
ADK 不是一个聊天框架,而是一个 AI 执行引擎。它让 LLM 从"能说"变成"能做"。
ADK for Kotlin 基于 Kotlin Multiplatform(KMP) 构建。

核心设计思路:不绑定任何模型、会话提供者或记忆系统。
你可以只用核心层写服务端 Agent,也可以加上 Android 扩展写端侧 Agent。按需引入,不捆绑。
| 层级 | 模块 | 职责 |
|---|---|---|
| 核心层 | google-adk-kotlin-core | Agent 引擎、工具系统、编排逻辑 |
| 处理器 | google-adk-kotlin-processor | KSP 编译期 Schema 生成 |
| Android 扩展 | google-adk-kotlin-core-android | Android 生命周期适配 |
| 设备端模型 | google-adk-kotlin-mlkit-android | ML Kit + Gemini Nano |
| 设备端推理 | google-adk-kotlin-litertlm | LiteRT-LM(Gemma 等) |
| 云端模型 | google-adk-kotlin-firebase-android | Firebase AI Logic |
ADK for Kotlin 1.0 与 Python / JS 版本实现了完整功能对等。选 Kotlin 不再是功能妥协,而是语言偏好。

ADK具体的能力包括:

@Tool 注解 + KSP 编译期生成这是 ADK 最优雅的设计。
定义一个工具,就是写一个普通的 Kotlin 函数,加上 @Tool 注解:
class OrderTools(
private val orders: OrderRepository
) {
@Tool(description = "根据订单号查询订单")
suspend fun findOrder(
@Param("客户可见的订单号") orderNumber: String
): OrderSummary {
require(orderNumber.length in 6..24) // ? 参数校验
return orders.findByNumber(orderNumber)
?: throw ToolException("订单不存在")
}
}
编译时,KSP 自动生成函数的 JSON Schema——零运行时反射。
⚠️ 这里用的是 Kotlin Symbol Processing,不是运行时反射。性能开销为零,Schema 在编译期就确定了。
对比 Python ADK 的装饰器方案,Kotlin 版的优势很明显:
| 维度 | Python ADK | Kotlin ADK |
|---|---|---|
| Schema 生成 | 运行时反射 | 编译期 KSP |
| 类型安全 | 运行时检查 | 编译期检查 |
| 性能开销 | 有反射开销 | 零 |
| IDE 支持 | 一般 | 完整补全 + 重构 |
@Tool + KSP 是 Kotlin ADK 相比 Python 版最大的技术优势。写工具就是写函数,编译器帮你搞定剩下的。
复杂任务别塞给一个全能 Agent——拆成多个专职 Agent 协作。
ADK 支持层级化多 Agent 系统:
┌─────────────┐
│ Router Agent │ ← 分类请求,选择工作流
└──────┬───────┘
┌────────┼────────┐
┌────▼───┐ ┌──▼────┐ ┌─▼────────┐
│Research│ │Decision│ │Execution │
│ Agent │ │ Agent │ │ Agent │
│ 检索引用│ │应用规则│ │审批后执行 │
└────────┘ └───────┘ └──────────┘
代码实现很直觉——子 Agent 就是 subAgents 列表:
val rootAgent = LlmAgent(
name = "MissionControl",
model = Gemini(apiKey = apiKey, name = "gemini-2.5-flash"),
instruction = Instruction("你是任务控制中心..."),
subAgents = listOf(
researchAgent, // ? 检索子 Agent
decisionAgent, // ? 决策子 Agent
executionAgent // ? 执行子 Agent
)
)
Router Agent 根据指令自动把任务分派给合适的子 Agent。
多 Agent 的好处不是"更强",而是"更可控"。每个 Agent 职责单一,出了问题一眼就能定位。
Agent 自己做决策没问题,但涉及钱、数据、隐私的操作,必须让人确认。
ADK 内置了完整的确认流程:
@Tool(requireConfirmation = true) 标记敏感工具;@Tool(requireConfirmation = true) // ? 标记需要确认
suspend fun transferFunds(
@Param("目标账户") targetAccount: String,
@Param("金额") amount: Double
): TransferResult {
// 只有用户确认后才会执行到这里
return bankService.transfer(targetAccount, amount)
}
在 Android 上,确认可以是一个 Compose 弹窗、一条通知、甚至一个深链接。
HITL 不是可选的"高级功能",是生产级 Agent 的底线。没有它,Agent 就是一颗定时炸弹。
这是 Kotlin ADK 独有的——Python / JS 版没有。
| 扩展 | 作用 |
|---|---|
| LiteRT-LM | 设备端跑 Gemma 等小模型,离线可用 |
| ML Kit GenAI | 设备端 Gemini Nano,隐私优先 |
| Firebase AI Logic | 云端 Gemini,适合复杂推理 |
| Room 持久化 | 会话状态存 SQLite,App 被杀也不丢 |
| AppSearch 语义记忆 | 设备端全文索引,Agent 的"长期记忆" |
| FileArtifactService | 管理 Agent 生成的文件产物 |
混合架构的典型用法:
// 云端模型做主编排
val orchestrator = LlmAgent(
model = Firebase.create("gemini-3.8-flash", firebaseAi),
subAgents = listOf(onDeviceAgent) // ? 设备端子 Agent
)
// 设备端模型处理隐私数据
val onDeviceAgent = LlmAgent(
model = GenaiPrompt.create(generativeModel, name = "gemini-nano"),
instruction = Instruction("你负责处理用户的本地文档...")
)
Android 扩展是 Kotlin ADK 的护城河。Python 写不了端侧 Agent,JS 也做不到 Room + AppSearch 级别的本地持久化。

ADK 目前有三个语言版本。选哪个?
| 维度 | ADK Kotlin | ADK Python | ADK JS/TS |
|---|---|---|---|
| 主战场 | Android + 服务端 | 服务端 + 数据/ML | Web + Node.js |
| 设备端推理 | ✅ LiteRT-LM / ML Kit | ❌ | ❌ |
| 类型安全 | ✅ 编译期 KSP | ❌ 运行时 | 部分(TS) |
| 本地持久化 | ✅ Room + AppSearch | ❌ | ❌ |
| 生态集成 | Jetpack / Compose / Coroutines | PyTorch / NumPy / LangChain | React / Next.js |
| Java 互操作 | ✅ 一等公民 | ❌ | ❌ |
不存在"最好的 ADK",只有"最适合你战场的 ADK"。

// build.gradle.kts
plugins {
id("com.android.application")
kotlin("android")
id("com.google.devtools.ksp") version "2.1.20-2.0.1"
}
dependencies {
// 核心引擎(Android 版)
implementation("com.google.adk:google-adk-kotlin-core-android:1.0.0")
// KSP 处理器(编译期生成 Tool Schema)
ksp("com.google.adk:google-adk-kotlin-processor:1.0.0")
// 云端模型(可选,按需引入)
implementation("com.google.adk:google-adk-kotlin-firebase-android:1.0.0")
}
⚠️ Android 项目用
google-adk-kotlin-core-android,不是google-adk-kotlin-core。别引错了。
class TimeService {
@Tool
fun getCurrentTime(
@Param("城市名称") city: String
): Map<String, String> {
// 实际项目替换为真实时区查询
return mapOf("city" to city, "time" to "10:30 AM")
}
}
val rootAgent = LlmAgent(
name = "time_agent",
description = "查询指定城市的当前时间",
model = Gemini(name = "gemini-flash-latest", apiKey = API_KEY),
instruction = Instruction("你是一个时间查询助手,用中文回答。"),
tools = TimeService().generatedTools() // ? KSP 自动生成
)
val runner = InMemoryRunner(
agent = rootAgent,
sessionService = InMemorySessionService()
)
scope.launch {
runner.runAsync(
userId = "user-123",
sessionId = "session-001",
newMessage = Content(
role = Role.USER,
parts = listOf(Part(text = "北京现在几点?"))
)
).collect { event ->
val text = event.content?.parts?.firstOrNull()?.text
if (!text.isNullOrBlank()) {
println(text) // ✅ 输出 Agent 回复
}
}
}
四步跑通。@Tool 定义能力,LlmAgent 组装智能体,InMemoryRunner 运行。
5 分钟从零到能跑,这是 ADK 上手体验最好的地方。

ADK for Kotlin 1.0 GA,这件事对 Android 开发者的意义在于:
@Tool + KSP 是最优雅的工具定义方式——编译期生成,零反射,类型安全。? 参考资料:adk.dev/get-started…
Ubuntu怎么换壁纸? Ubuntu中设置自己照片为桌面的技巧
Ubuntu系统日期和时间怎么设置? Ubuntu修改时间和日期的技巧
LangGraph 初识:Agent 为什么要采用 Graph 工作流?
LangGraph 人工介入机制:用 Interrupt 暂停 Agent 并等待确认
Ubuntu怎么进行延迟截图? Ubuntu截图技巧
DeepSeek Harness 系列(05):Session 如何保存并延续对话记忆