/ Android  AI  Kotlin  Jetpack Compose  OpenAI  Copilot  Cursor 

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


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 生成样板代码、辅助调试、自动写测试,把时间留给真正需要创造力的架构设计和产品决策。

发布评论

热门评论区: