用 AI 工具开发 Android 应用实战:从需求到上线全流程

AI 编程助手正在重塑 Android 开发方式。从 Gemini Code Assist、GitHub Copilot 到 Cursor,这些工具不只能补全代码,还能理解需求、生成架构、自动修复 Bug。本文以一个实际的 AI 对话助手 App 为例,演示如何借助 AI 工具全程提效开发。
1. 用 AI 生成项目结构与依赖配置
拿到需求后,首先让 AI 给出推荐的项目架构。以 Gemini Code Assist 为例,在 Android Studio 中描述需求:
"帮我创建一个 Android MVVM 架构的 AI 对话 App,使用 Kotlin + Jetpack Compose,集成 OpenAI API,需要支持消息列表展示、输入框、发送按钮。"
AI 会生成完整的 build.gradle.kts 依赖配置:
// build.gradle.kts (app)
dependencies {
// Jetpack Compose
implementation(platform("androidx.compose:compose-bom:2024.02.00"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.material3:material3")
implementation("androidx.activity:activity-compose:1.8.2")
// ViewModel + 协程
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
// OkHttp + Retrofit(调用 AI API)
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
}2. AI 生成数据层:API 接口与数据模型
描述需求后,AI 直接生成 OpenAI Chat API 的 Retrofit 接口和数据类:
// data/model/ChatMessage.kt
data class ChatMessage(
val role: String, // "user" 或 "assistant"
val content: String
)
data class ChatRequest(
val model: String = "gpt-4o",
val messages: List<ChatMessage>,
val temperature: Double = 0.7
)
data class ChatResponse(
val choices: List<Choice>
) {
data class Choice(val message: ChatMessage)
}
// data/api/OpenAIService.kt
interface OpenAIService {
@POST("v1/chat/completions")
suspend fun chat(
@Header("Authorization") token: String,
@Body request: ChatRequest
): ChatResponse
}3. AI 生成 ViewModel 业务逻辑
告诉 AI:"帮我写 ChatViewModel,管理消息列表状态,调用 OpenAI API,处理 loading 和错误状态。" 生成结果:
// ui/ChatViewModel.kt
class ChatViewModel : ViewModel() {
private val _messages = MutableStateFlow<List<ChatMessage>>(emptyList())
val messages: StateFlow<List<ChatMessage>> = _messages.asStateFlow()
private val _isLoading = MutableStateFlow(false)
val isLoading: StateFlow<Boolean> = _isLoading.asStateFlow()
private val service = RetrofitClient.create(OpenAIService::class.java)
fun sendMessage(userInput: String) {
if (userInput.isBlank() || _isLoading.value) return
val userMsg = ChatMessage(role = "user", content = userInput)
_messages.value = _messages.value + userMsg
_isLoading.value = true
viewModelScope.launch {
try {
val history = _messages.value.takeLast(10) // 保留最近10条上下文
val response = service.chat(
token = "Bearer ${BuildConfig.OPENAI_API_KEY}",
request = ChatRequest(messages = history)
)
val reply = response.choices.firstOrNull()?.message
?: ChatMessage("assistant", "无响应")
_messages.value = _messages.value + reply
} catch (e: Exception) {
val errMsg = ChatMessage("assistant", "请求失败:${e.message}")
_messages.value = _messages.value + errMsg
} finally {
_isLoading.value = false
}
}
}
}4. AI 生成 Jetpack Compose UI
提示词:"用 Material3 实现聊天界面,消息气泡左右区分 user/assistant,底部固定输入框,发送时显示 loading 指示器。" AI 生成完整 Composable:
// ui/ChatScreen.kt
@Composable
fun ChatScreen(viewModel: ChatViewModel = viewModel()) {
val messages by viewModel.messages.collectAsStateWithLifecycle()
val isLoading by viewModel.isLoading.collectAsStateWithLifecycle()
var inputText by remember { mutableStateOf("") }
val listState = rememberLazyListState()
// 新消息自动滚动到底部
LaunchedEffect(messages.size) {
if (messages.isNotEmpty()) listState.animateScrollToItem(messages.size - 1)
}
Scaffold(
bottomBar = {
ChatInputBar(
value = inputText,
onValueChange = { inputText = it },
onSend = {
viewModel.sendMessage(inputText)
inputText = ""
},
isLoading = isLoading
)
}
) { padding ->
LazyColumn(
state = listState,
contentPadding = PaddingValues(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp),
modifier = Modifier.padding(padding)
) {
items(messages) { msg ->
MessageBubble(message = msg)
}
if (isLoading) {
item { LoadingBubble() }
}
}
}
}
@Composable
fun MessageBubble(message: ChatMessage) {
val isUser = message.role == "user"
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = if (isUser) Arrangement.End else Arrangement.Start
) {
Surface(
shape = RoundedCornerShape(12.dp),
color = if (isUser) MaterialTheme.colorScheme.primary
else MaterialTheme.colorScheme.surfaceVariant,
modifier = Modifier.widthIn(max = 280.dp)
) {
Text(
text = message.content,
modifier = Modifier.padding(12.dp),
color = if (isUser) MaterialTheme.colorScheme.onPrimary
else MaterialTheme.colorScheme.onSurfaceVariant
)
}
}
}5. AI 辅助调试与优化
开发中遇到问题,直接把错误信息粘给 AI:"运行时报 NetworkOnMainThreadException,代码如下..." AI 会立即定位问题并给出修复方案。常见优化场景:
性能优化:让 AI 分析 Compose 重组频率,建议用
key()避免不必要重组安全加固:提示 AI "帮我把 API Key 移到 local.properties,通过 BuildConfig 注入,避免硬编码"
测试生成:描述业务逻辑,AI 自动生成 ViewModel 的单元测试用例
代码审查:让 AI 审查整个文件,指出潜在的内存泄漏和线程安全问题
6. 最佳实践:如何与 AI 高效协作
描述要具体:不要说"帮我写网络请求",要说"用 Retrofit 2 + OkHttp 4,Kotlin 协程,MVVM 架构,调用 POST /api/users 接口,参数是 {name, email}"
分步迭代:先让 AI 生成框架,再逐步添加细节,每步验证通过再继续
保留人工判断:AI 生成的代码需要 Code Review,尤其是安全相关逻辑(鉴权、加密、输入校验)
利用上下文:在 Cursor 等工具中,把相关文件都加入上下文,AI 能生成更贴合项目风格的代码
AI 工具不会替代 Android 工程师,但会大幅放大有经验开发者的产出。善用 AI 生成样板代码、辅助调试、自动写测试,把时间留给真正需要创造力的架构设计和产品决策。
发布评论
热门评论区: