第 08 章 AI 辅助开发集成指南¶
⚠️ 核验说明(2026-03-26):本章已按当前公开官方资料复核。AI 工具示例中涉及的模型与产品名称,优先以
Copilot coding agent、Claude Code、Codex和gpt-5-mini/gpt-5.4这类当前口径为准。学习目标:掌握 AI 工具在 Android 开发中的应用,提升开发效率。
预计学习时间: 3-5 天 实践时间: 2 天
目录¶
1. GitHub Copilot 深度应用¶
1.1 Copilot 配置与优化¶
// VS Code settings.json
{
"editor.inlineSuggest.enabled": true,
"github.copilot.enable": {
"*": true,
"markdown": true,
"plaintext": false,
"scminput": false
},
"github.copilot.nextEditSuggestions.enabled": true
}
建议:
editor.inlineSuggest.enabled是 VS Code 内联建议总开关,若它被关闭,Copilot 内联补全也不会正常显示。github.copilot.enable用于按语言或编辑区类型细分开关。github.copilot.nextEditSuggestions.enabled适合重构和连续编辑场景;若本地扩展版本较旧,看不到该项时可直接忽略。
1.2 Copilot 最佳实践¶
import javax.inject.Provides
import javax.inject.Singleton
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import retrofit2.Retrofit
import retrofit2.converter.kotlinx.serialization.asConverterFactory
// ✅ 好的注释引导Copilot生成代码
// 创建一个Retrofit实例,配置OkHttp客户端和JSON转换器
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.client(okHttpClient)
.addConverterFactory(
Json { ignoreUnknownKeys = true }
.asConverterFactory("application/json".toMediaType())
)
.build()
}
// ✅ 使用函数签名引导
// 实现一个带缓存的用户Repository
class CachedUserRepository(
private val api: UserApi,
private val dao: UserDao
) : UserRepository {
override suspend fun getUser(id: String): Result<User> =
runCatching {
val remoteUser = api.getUser(id)
dao.upsert(remoteUser.toEntity())
remoteUser
}.recoverCatching {
dao.findById(id)?.toDomain() ?: throw it
}
}
1.3 Copilot 快捷键¶
| 入口 | 常见用法 |
|---|---|
Tab | 接受当前内联建议 |
Esc | 拒绝当前建议 |
命令面板 Copilot | 查看聊天、修复、解释、生成测试等命令 |
| 编辑器右键菜单 | 对选中代码执行解释、修复、优化 |
| Source Control 面板 | 结合 diff 做提交说明与代码评审 |
提示:Copilot 的具体快捷键会受操作系统、键位映射和 VS Code 扩展版本影响。学习时优先记“入口位置”和“命令名”,不要死记某一套默认快捷键。
2. Claude Code 集成¶
2.1 代码审查工作流¶
# 1) 按官方文档安装 Claude Code
# macOS / Linux:
curl -fsSL https://claude.ai/install.sh | bash
# Windows:
curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd
# 2) 检查安装是否正常
claude doctor
# 3) 在项目根目录启动交互式会话
claude
实践要点:
- Claude Code 更适合“读 diff、提风险、给重构建议”,不要把它当作自动批准器。
- 审查时直接在会话里贴明确任务,例如“请检查当前工作区改动,重点看协程取消、生命周期泄漏、测试缺口和敏感信息泄漏”。
- 涉及私有代码时,先确认团队的第三方 AI 使用政策和数据保留策略。
2.2 重构辅助¶
## 重构请求模板
请帮我重构以下代码:
```text
[粘贴代码]
```
重构目标:
1. 遵循SOLID原则
2. 减少重复代码
3. 提高可读性
4. 添加适当的注释
5. 确保线程安全
请提供:
- 重构后的完整代码
- 重构说明
- 潜在风险评估
2.3 文档生成¶
## 文档生成模板
请为以下代码生成KDoc文档:
```text
[粘贴代码]
```
要求:
- 为每个公共函数添加文档
- 说明参数和返回值
- 添加使用示例
- 标注可能的异常
3. Codex/OpenAI API 应用¶
3.1 API 集成示例¶
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONArray
import org.json.JSONObject
// OpenAI API 客户端
class OpenAiClient @Inject constructor(
private val client: OkHttpClient
) {
private val jsonMediaType = "application/json; charset=utf-8".toMediaType()
suspend fun generateCode(
prompt: String,
language: String = "kotlin"
): Result<String> =
withContext(Dispatchers.IO) {
runCatching {
val payload = JSONObject()
// 模型名建议由配置注入,而不是硬编码在客户端代码中
.put("model", BuildConfig.OPENAI_MODEL)
.put(
"input",
JSONArray().put(
JSONObject()
.put("role", "user")
.put(
"content",
JSONArray().put(
JSONObject()
.put("type", "input_text")
.put(
"text",
"""
请生成一段 $language 代码。
要求:
1. 只返回代码。
2. 在必要处添加注释。
3. 优先使用稳定、可维护的实现。
任务:
$prompt
""".trimIndent()
)
)
)
)
)
val request = Request.Builder()
.url("https://api.openai.com/v1/responses")
.addHeader("Authorization", "Bearer ${BuildConfig.OPENAI_API_KEY}")
.addHeader("Content-Type", "application/json")
.post(payload.toString().toRequestBody(jsonMediaType))
.build()
client.newCall(request).execute().use { response ->
val body = response.body?.string().orEmpty()
if (!response.isSuccessful) {
error("OpenAI API 调用失败: ${response.code} $body")
}
val outputText = JSONObject(body).optString("output_text")
require(outputText.isNotBlank()) {
"Responses API 未返回 output_text,请检查模型输出格式。"
}
outputText.trim()
}
}
}
}
说明:
- 新项目优先使用
Responses API,而不是把chat/completions当成默认主线。 - 模型名建议走
BuildConfig或服务端配置,不要把具体型号硬编码到业务代码里。 - 如果你需要 JSON 结构化输出、工具调用或更严格的字段约束,应继续在请求体中显式声明 schema,而不是直接对自然语言输出
json.loads(...)。
3.2 复杂算法开发¶
## 算法生成提示词
请用Kotlin实现一个高效的图片缓存算法,要求:
1. 使用LRU淘汰策略
2. 支持内存和磁盘二级缓存
3. 线程安全
4. 支持缓存大小限制
5. 添加单元测试
请提供:
- 完整的实现代码
- 复杂度分析
- 使用示例
4. AI 驱动测试¶
4.1 测试生成¶
## 单元测试生成模板
请为以下类生成完整的单元测试:
```kotlin
class UserRepository(
private val api: UserApi,
private val dao: UserDao
) {
suspend fun getUser(id: String): Result<User> {
return try {
val user = api.getUser(id)
dao.insert(user.toEntity())
Result.success(user.toDomain())
} catch (e: Exception) {
dao.getUser(id)?.let {
Result.success(it.toDomain())
} ?: Result.failure(e)
}
}
}
```
要求:
1. 使用JUnit 5和MockK
2. 覆盖正常和异常场景
3. 测试网络失败时的缓存行为
4. 使用Given-When-Then格式
5. 测试命名清晰
4.2 UI 测试生成¶
// AI生成的Compose UI测试示例
@Test
fun loginScreen_displaysErrorWhenCredentialsInvalid() {
// Given
composeTestRule.setContent {
LoginScreen(
viewModel = LoginViewModel(
loginUseCase = mockLoginUseCase
)
)
}
// When
composeTestRule
.onNodeWithText("Email")
.performTextInput("invalid@email")
composeTestRule
.onNodeWithText("Password")
.performTextInput("123")
composeTestRule
.onNodeWithText("Login")
.performClick()
// Then
composeTestRule
.onNodeWithText("Invalid credentials")
.assertIsDisplayed()
}
5. 提示词工程¶
5.1 提示词设计原则¶
## 高质量提示词结构
1. **角色定义**
"你是一位经验丰富的Android开发专家..."
2. **上下文提供**
"项目使用Kotlin、Jetpack Compose和MVVM架构..."
3. **具体任务**
"请实现一个支持离线功能的Repository..."
4. **约束条件**
"要求:
- 使用协程和Flow
- 支持错误处理
- 添加单元测试"
5. **输出格式**
"请提供:
- 完整代码
- 使用说明
- 注意事项"
5.2 常用提示词模板¶
## 模板1:代码生成
作为Android开发专家,请帮我实现[功能描述]。
技术栈:
- Kotlin
- Jetpack Compose
- Hilt
- Coroutines/Flow
代码要求:
- 遵循MVVM架构
- 添加错误处理
- 包含单元测试
- 使用Material Design 3
## 模板2:代码审查
请审查以下代码并提供改进建议:
```text
[代码]
```
审查维度:
1. 代码质量
2. 性能优化
3. 安全漏洞
4. 最佳实践
5. 可读性
## 模板3:问题排查
我的Android应用遇到以下问题:
[问题描述]
相关代码:
```text
[代码]
```
错误日志:
```text
[日志]
```
请帮我:
1. 分析问题原因
2. 提供解决方案
3. 预防建议
6. Android Studio Gemini 集成¶
6.1 Gemini AI 简介¶
Android Studio 近年的稳定版和预览版已经把 Gemini 逐步整合进 IDE 工作流。对 Android 开发者来说,它的价值不在于“又一个聊天框”,而在于它能结合 Gradle、Manifest、Compose、Logcat 和项目结构提供更贴近 IDE 场景的建议。
需要注意两点:
- Gemini 的具体功能会随 Android Studio 渠道、账号权限和地区而变化,不要把某个版本截图当成长期固定 UI。
- “图片转 Compose”、“Agent 模式”、“批量修复建议”等能力不一定在所有版本同时可用,学习时应以 IDE 实际可见功能为准。
核心功能¶
| 功能 | 说明 |
|---|---|
| 项目上下文问答 | 结合当前模块、文件和构建错误解释代码 |
| Android 专项建议 | 对 Compose、Gradle、Manifest、资源文件更敏感 |
| 问题定位 | 适合分析崩溃栈、编译错误、Lint 报告 |
| 重构辅助 | 生成迁移建议,例如 LiveData -> StateFlow |
| 多模态能力 | 部分版本支持基于设计图或截图生成界面草稿 |
| 任务式执行 | 部分版本提供跨文件修改建议,但仍需人工复核 |
6.2 启用 Gemini AI¶
常见入口有三类:
如果界面中看不到 Gemini:
- 先升级到较新的 Android Studio 稳定版或预览版。
- 登录可用的 Google 账号。
- 检查当前地区、账号权限和企业策略是否允许该功能。
- 不要死记某个菜单路径,因为 Android Studio 不同版本可能调整入口位置。
6.3 Gemini Agent Mode¶
如果你的 Android Studio 版本提供 Agent Mode 或类似的任务式执行能力,可以把它当作“项目内自动化助手”,但不要把它当成无条件可信的自动开发器。
// 示例:在 Gemini 聊天窗口中提交结构化任务
"""
请帮我添加一个用户认证模块:
1. 创建LoginScreen Composable
2. 创建LoginViewModel
3. 添加Retrofit API接口
4. 创建数据模型(LoginRequest/LoginResponse)
5. 添加输入验证逻辑
6. 创建单元测试
要求:
- 使用MVVM架构
- 使用Hilt进行依赖注入
- 使用Kotlin Coroutines处理异步操作
- 支持邮箱和密码验证
- 在修改前先给出将要新增/修改的文件列表
- 如果信息不足,先列出缺失假设再继续
"""
更稳妥的使用方式:
- 先让它输出“变更计划”和“涉及文件”。
- 再让它逐步生成实现,而不是一次性放权。
- 每完成一步,都回到 IDE 手动编译、运行测试、检查 diff。
6.4 多模态输入功能¶
部分版本支持上传图片或截图,让模型生成 Compose 草稿。这里的关键词是“草稿”,不是“可直接上线的最终 UI”。
1. 上传 UI 设计图、低保真线框图或页面截图
2. 指明使用 Material 3、Compose、主题色和适配要求
3. 要求输出组件拆分、状态来源和可访问性注意事项
4. 回到 IDE 人工修正尺寸、边距、语义标签和真实数据绑定
示例输出:
@Composable
fun ProfileCard(
user: User,
onEditClick: () -> Unit
) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
) {
Row(
modifier = Modifier.padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
// 根据设计图生成的头像布局
AsyncImage(
model = user.avatarUrl,
contentDescription = "Avatar",
modifier = Modifier
.size(64.dp)
.clip(CircleShape),
contentScale = ContentScale.Crop
)
Spacer(modifier = Modifier.width(16.dp))
Column(modifier = Modifier.weight(1f)) {
Text(
text = user.name,
style = MaterialTheme.typography.titleMedium
)
Text(
text = user.email,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
IconButton(onClick = onEditClick) {
Icon(Icons.Default.Edit, contentDescription = "Edit")
}
}
}
}
6.5 与 GitHub Copilot 对比¶
| 特性 | GitHub Copilot | Android Studio Gemini |
|---|---|---|
| 核心优势 | 跨编辑器通用、补全速度快 | 更贴近 Android Studio 与 Android 工程上下文 |
| 典型场景 | 写函数、补测试、补样板代码 | 查构建问题、解释 Android 结构、生成 Compose 草稿 |
| 上下文粒度 | 更偏当前文件和选区 | 更偏 IDE 工程、Gradle、布局、Android 配置 |
| 任务式能力 | 取决于当前 IDE / 扩展能力 | 取决于当前 Android Studio 版本与账号能力 |
| 最佳策略 | 作为日常编码助手 | 作为 Android 专项助手 |
6.6 使用最佳实践¶
// ✅ 好的提示示例
"""
请帮我重构这个ViewModel:
1. 将状态管理从LiveData迁移到StateFlow
2. 添加错误处理逻辑
3. 优化内存泄漏风险
4. 添加单元测试
当前代码:
[paste code here]
"""
// ❌ 不好的提示示例
"帮我改代码" // 太模糊,缺乏上下文
补充原则:
- 让模型先解释现状,再提出修改方案,最后输出代码。
- 涉及架构迁移时,要求它分阶段提交,不要一次改完整个模块。
- 对生成的 Compose 代码,重点检查状态提升、重组成本、语义标签和预览可用性。
6.7 隐私与安全¶
使用 Gemini 时需要注意:
- 代码隐私: Gemini 会读取你显式提供的上下文,敏感仓库要先看组织政策
- 企业环境:检查公司是否要求使用企业版、白名单账号或专用代理
- 离线开发: 大多数云端 AI 功能都依赖网络,不应假设能完全离线工作
- 输出审查: AI 可能补出不存在的 API、过时依赖或错误导入,必须编译验证
7. 实践练习¶
练习 1 : AI 辅助开发工作流¶
任务:建立个人 AI 辅助开发工作流
要求: 1. 配置 Copilot 和 Claude Code 2. 创建常用提示词库 3. 建立代码审查流程 4. 记录使用心得
练习 2 : AI 生成完整功能¶
任务:使用 AI 工具生成一个完整功能模块
要求: - 从需求描述开始 - 使用 AI 生成架构设计 - 生成核心代码 - 生成单元测试 - 人工审查和优化
本章小结¶
核心要点¶
- GitHub Copilot是日常编码的强大助手
- Claude Code更适合终端中的代码审查、重构建议和任务拆解
- Codex / OpenAI API更适合被集成进你自己的工作流、脚本和应用
- Android Studio Gemini适合 Android 工程上下文中的解释、排错和 UI 草稿生成
- AI 驱动测试能提升覆盖率,但前提是你真的执行并审查这些测试
- 提示词工程本质上是在减少歧义、暴露约束和控制输出格式
- AI 是助手,不是验收者,最终正确性仍由你负责
AI 工具使用原则¶
| 场景 | 推荐工具 | 注意事项 |
|---|---|---|
| 日常编码 | Copilot | 关注补全质量,不要盲收建议 |
| 代码审查 | Claude Code / Codex | 用 diff 和明确审查维度约束输出 |
| API 集成 | OpenAI API | 优先 Responses API,显式约束输出格式 |
| Android 问题排查 | Gemini | 提供报错、Gradle、Logcat 等完整上下文 |
| UI 草稿生成 | Gemini 多模态 | 人工检查主题、无障碍和状态管理 |
| 测试生成 | Copilot / Codex | 一定要实际运行测试并看失败原因 |
下一步¶
完成本章学习后,请进入第 09 章:测试策略与质量保证。
本章完成时间:预计 3-5 天
最后更新日期: 2026-03-26