从 0 到 1 用 AI 搭建一个完整 App:需求分析→设计→开发→上线
一、引言:一个人就是一个团队
AI Coding 的进化:从”代码补全”到”全流程协作”
还记得 2021 年 GitHub Copilot 刚出来的时候吗?那时候我们觉得”AI 帮你补全一行代码”就已经很神奇了。
转眼到了 2025 年,Claude Code、Cursor、Codex 等工具已经能理解整个项目上下文,自主创建文件、修改代码、运行测试、甚至 debug。AI 不再是那个只会补全括号的实习生,它更像是一个什么都能干的全栈工程师——虽然偶尔还是会犯傻。
这个变化意味着什么?意味着一个人就能完成一个完整 App 的全流程开发。以前需要产品经理、架构师、UI 设计师、前端、后端、测试……现在,你可以一个人带一个 AI 团队。
本文要做什么
我不会给你讲空洞的理论,也不会给你看一堆 Hello World 级别的 demo。本文会用一个真实项目,带你走完从需求分析到上线的完整流程。
每一步我都会告诉你:
-
• 🗣️ 怎么和 AI 沟通(Prompt 示例) -
• 📝 AI 输出了什么(真实文档示例) -
• ⚠️ 踩了什么坑(血泪经验)
项目介绍:个人记账 App
为什么选记账 App?
-
• 功能实用:每个人都需要记账,有真实需求 -
• 复杂度适中:有数据持久化、UI 交互、统计图表,但不会复杂到写不完 -
• 读者有共鸣:大部分开发者都写过或想写过类似项目 -
• 可扩展:做完了基础版,还能加云同步、AI 分析等高级功能
我们的记账 App 叫 「轻记账」,核心功能包括:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
二、第一步:需求分析(让 AI 做你的产品经理)
为什么要让 AI 做需求分析?
你可能会想:需求分析我自己搞不就行了?
确实能。但一个人做项目最容易犯的错就是上来就写代码。没有产品经理把关,你大概率会:
-
• 做了一堆用不上的功能 -
• 漏掉关键的用户场景 -
• 边做边改,代码一团糟
让 AI 做产品经理,不是让它替你决策,而是让它帮你系统化地思考。
怎么给 AI 提供需求上下文
下面是我在 Claude Code 中使用的第一个 Prompt:
我想开发一个 Android 个人记账 App,叫「轻记账」。请帮我做一次完整的需求分析。以下是我的初步想法:1. 支持记录收入和支出2. 有分类功能(餐饮、交通、购物等)3. 可以按月查看统计4. 界面要好看,支持暗色模式5. 数据存在本地目标用户:像我一样的上班族,想记账但嫌市面上的 App 太复杂。请输出:1. 功能清单(含优先级 P0/P1/P2)2. 核心用户故事(User Story)3. MVP 范围建议4. 可能被我忽略的功能点
AI 输出了什么
Claude 的输出质量让我很惊喜。它给出了一个结构化的需求文档:
P0(必须有):
-
• 收支记录(金额、分类、备注、日期) -
• 分类管理(预设 + 自定义) -
• 月度统计(支出/收入汇总 + 分类饼图) -
• 本地数据存储(Room 数据库) -
• 暗色模式
P1(应该有):
-
• 标签系统 -
• 日历视图 -
• 搜索功能 -
• 预算设置与提醒 -
• 数据导出
P2(可以有):
-
• 图表趋势分析 -
• 周期性账单 -
• 云端同步 -
• Widget 小组件
还补充了我完全没想到的:
-
• 预算提醒:设置月度预算,超支时提醒 -
• 周期性账单:房租、会员费等固定支出自动记录 -
• 数据备份:防止卸载丢数据
技巧:如何写好需求 Prompt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
关键原则:AI 是你的副驾,不是自动驾驶。你提供方向和约束,AI 帮你填充细节和发现盲点。
三、第二步:技术方案设计(让 AI 做你的架构师)
技术选型分析
有了需求,下一步是确定”用什么技术实现”。这也是一个容易踩坑的地方——选错了技术栈,后面改起来会很痛苦。
我的 Prompt:
基于上面的需求分析,请帮我设计「轻记账」App 的技术方案。我的技术偏好:- 语言:Kotlin- UI:Jetpack Compose- 我希望用最新的 Android 技术栈请输出:1. 技术选型分析(为什么推荐某个技术)2. 整体架构设计(推荐用 MVVM + Clean Architecture)3. 数据库设计(表结构、字段定义)4. 核心模块划分5. 第三方库推荐(注明用途和选型理由)
技术选型结果
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
架构设计
AI 给出了一个清晰的分层架构:

数据库设计
// 账单表@Entity(tableName = "transactions")dataclassTransaction(@PrimaryKey(autoGenerate = true)val id: Long = 0,val amount: Double, // 金额val type: TransactionType, // INCOME / EXPENSEval categoryId: Long, // 分类 IDval note: String = "", // 备注val date: Long, // 时间戳val tags: String = "", // 标签(逗号分隔)val createdAt: Long = System.currentTimeMillis())// 分类表@Entity(tableName = "categories")dataclassCategory(@PrimaryKey(autoGenerate = true)val id: Long = 0,val name: String, // 分类名称val icon: String, // 图标名称val color: Long, // 颜色值val type: TransactionType, // INCOME / EXPENSEval isDefault: Boolean = false, // 是否为预设分类val sortOrder: Int = 0)// 预算表@Entity(tableName = "budgets")dataclassBudget(@PrimaryKey(autoGenerate = true)val id: Long = 0,val amount: Double, // 预算金额val month: String, // 格式 "2025-01"val createdAt: Long = System.currentTimeMillis())

四、第三步:项目搭建与核心开发
CLAUDE.md:给 AI 的项目说明书
在开始写代码之前,最重要的一步是创建 CLAUDE.md 文件。这是 Claude Code 的工作指南,相当于给新入职的开发者一份 Onboarding 文档。
一个写得好的 CLAUDE.md,能让 AI 的代码质量提升一个档次。以下是我的 CLAUDE.md:
# 轻记账 App - 项目规范## 项目概述个人记账 Android App,使用 Kotlin + Jetpack Compose + Room 开发。## 技术栈- Kotlin + Coroutines + Flow- Jetpack Compose + Material 3- Room Database- Hilt 依赖注入- MVVM + Clean Architecture## 代码规范- 遵循 Kotlin 官方编码规范- 使用协程处理异步操作,不要用回调- Repository 层返回 Flow- ViewModel 暴露 StateFlow- Compose 组件要支持暗色模式- 所有字符串资源放在 strings.xml 中## 项目结构com.example.expensetracker/├── data/│ ├── local/ # Room DAO、Database、Entity│ └── repository/ # Repository 实现├── domain/│ ├── model/ # 领域模型│ └── usecase/ # 用例├── ui/│ ├── theme/ # 主题、颜色、字体│ ├── components/ # 可复用组件│ ├── screen/ # 页面│ └── viewmodel/ # ViewModel└── di/ # Hilt 模块## 注意事项- 不要硬编码字符串,使用 stringResource- 颜色使用 MaterialTheme 中的颜色,不要硬编码- 列表使用 LazyColumn,注意 key 参数- 金额显示保留两位小数- 日期格式统一使用 "yyyy年M月d日"
分阶段开发策略
不要让 AI 一次性写完所有代码——那一定会出问题。正确的做法是分阶段、小步快跑:
阶段一:基础框架(Day 1)
-
• 项目搭建、依赖配置 -
• 数据库定义 -
• 基础主题和导航框架
阶段二:核心功能(Day 2-3)
-
• 记账页面(增删改查) -
• 分类管理 -
• 首页账单列表
阶段三:统计与图表(Day 4)
-
• 月度统计页面 -
• 分类饼图 -
• 日历视图
阶段四:完善细节(Day 5-6)
-
• 暗色模式适配 -
• 搜索功能 -
• 空状态和错误处理 -
• 动画和交互优化
阶段五:测试与上线(Day 7)
-
• 单元测试 -
• UI 测试 -
• 性能优化 -
• 打包签名
Prompt 对比:好 Prompt vs 差 Prompt
让我用”创建记账页面”这个任务来展示差异。
❌ 差 Prompt:
帮我写一个记账页面
AI 会给你一个通用的、大概率的半成品。没有上下文,没有约束,没有明确预期。
✅ 好 Prompt:
请创建记账页面(AddEditTransactionScreen)。功能需求:1. 顶部显示"记一笔"标题和关闭按钮2. 金额输入区域:大字号显示输入金额,支持小数点3. 类型切换:支出/收入 Tab 切换4. 分类选择:网格布局显示分类图标和名称5. 备注输入:单行文本框6. 日期选择:默认今天,点击可选择日期7. 保存按钮:底部固定技术要求:- 使用 Compose + Material 3- ViewModel 名称为 AddEditTransactionViewModel- 使用 Hilt 注入- 分类数据从 Room 数据库获取- 保存时校验金额不能为 0- 保存成功后返回上一页并传递结果请同时创建:1. Screen Composable2. ViewModel3. UI State 定义
差距一目了然。好 Prompt 的核心要素:
-
• 明确功能需求:列出每个 UI 元素和交互 -
• 技术约束:指定使用的技术和模式 -
• 边界条件:校验规则、异常处理 -
• 输出清单:明确需要创建哪些文件
遇到问题怎么让 AI 自主修复
开发过程中肯定会遇到编译错误、运行时崩溃等问题。不要自己去找 bug,让 AI 帮你修。
编译错误:
编译报错了,错误信息如下:[粘贴完整错误日志]请分析原因并修复。只修改出问题的文件,不要改动其他代码。
运行时崩溃:
App 运行时崩溃了,崩溃日志如下:[粘贴 logcat 输出]这个崩溃在什么场景下会发生?请修复并提供测试方案。
关键技巧:粘贴完整的错误信息,不要只描述”报错了”。AI 需要看到具体的错误才能准确定位问题。
五、第四步:UI 设计与打磨
让 AI 根据 Material Design 规范生成 UI
我不会 UI 设计,这是让 AI 大放异彩的地方。
首页设计 Prompt:
请设计轻记账 App 的首页(HomeScreen)。设计要求:1. 顶部:当月支出汇总卡片 - 显示"本月支出 ¥3,256.80" - 小字显示"收入 ¥12,000.00 | 结余 ¥8,743.20" - 卡片使用渐变背景2. 中间:快捷操作栏 - "记一笔"按钮(FAB 风格,醒目) - "预算"和"统计"入口3. 下方:今日账单列表 - 按时间倒序排列 - 每项显示:分类图标、分类名、备注、金额 - 支出金额红色,收入金额绿色 - 空状态显示"今天还没有记录"插画4. 底部导航栏:首页、统计、+(记账)、日历、我的请遵循 Material Design 3 规范:- 使用动态颜色(Material You)- 适当的间距和圆角- 支持暗色模式- 列表项之间有分隔线或适当间距

迭代优化:从”能用”到”好用”
第一版 UI 能用,但离”好用”还有距离。通过多轮迭代,逐步打磨:
第一轮反馈:
首页整体不错,但需要改进:1. 金额卡片太普通了,加个微妙的渐变或者磨砂效果2. 账单列表项的间距太小,显得拥挤3. 空状态太单调,加个可爱的插画(用 vector drawable)4. 底部导航栏的"记账"按钮要突出,用 FAB 风格
第二轮反馈:
进步很大!还需要:1. 添加下拉刷新功能2. 长按账单项弹出删除/编辑菜单3. 金额数字的字体换成等宽字体,小数点对齐

暗色模式适配
暗色模式不是简单地把白色换成黑色。需要仔细处理颜色对比度、阴影、图片色调等。
// theme/Color.kt// 亮色主题val LightColors = lightColorScheme( primary = Color(0xFF4CAF50), onPrimary = Color.White, background = Color(0xFFF5F5F5), surface = Color.White, onBackground = Color(0xFF212121), onSurface = Color(0xFF212121),// 收支颜色 expenseColor = Color(0xFFE53935), // 支出-红色 incomeColor = Color(0xFF43A047), // 收入-绿色)// 暗色主题val DarkColors = darkColorScheme( primary = Color(0xFF66BB6A), onPrimary = Color.Black, background = Color(0xFF121212), surface = Color(0xFF1E1E1E), onBackground = Color(0xFFE0E0E0), onSurface = Color(0xFFE0E0E0), expenseColor = Color(0xFFEF5350), // 暗色模式下稍亮 incomeColor = Color(0xFF66BB6A),)
关键要点:
动画和交互细节
// 账单列表项的进入动画@ComposablefunTransactionItem( transaction: Transaction, modifier: Modifier = Modifier) {var visible by remember { mutableStateOf(false) } LaunchedEffect(Unit) { visible = true } AnimatedVisibility( visible = visible, enter = fadeIn(animationSpec = tween(300)) + slideInVertically( initialOffsetY = { it / 3 }, animationSpec = tween(300) ), modifier = modifier ) {// 列表项内容 }}// 金额输入时的数字滚动效果@ComposablefunAnimatedAmount(amount: Double) {val text = String.format("%.2f", amount)// 使用 AnimatedContent 实现数字切换动画 AnimatedContent( targetState = text, transitionSpec = { slideInVertically { it } togetherWith slideOutVertically { -it } } ) { target -> Text( text = "¥$target", style = MaterialTheme.typography.displayLarge ) }}
六、第五步:测试与上线
AI 生成单元测试
测试是很多人(包括我)最不愿意写的东西。好消息是,AI 擅长写测试。
Prompt:
请为 TransactionRepository 的以下方法生成单元测试:- insertTransaction(transaction)- getTransactionsByMonth(month)- getMonthlySummary(month)- deleteTransaction(id)使用:- JUnit 5- kotlinx-coroutines-test- MockK 做 mock- Turbine 测试 Flow测试要覆盖:- 正常插入和查询- 空结果- 删除后查询为空- 月份边界情况
AI 生成的测试示例:
classTransactionRepositoryTest {privateval dao = mockk<TransactionDao>(relaxed = true)privateval repository = TransactionRepositoryImpl(dao)privateval testDispatcher = StandardTestDispatcher()@Beforefunsetup() { Dispatchers.setMain(testDispatcher) }@AfterfuntearDown() { Dispatchers.resetMain() }@Testfun `getTransactionsByMonth returns filtered results`() = runTest {// Givenval aprilTransactions = listOf( Transaction(amount = 100.0, type = EXPENSE, categoryId = 1, date = april1TimeMillis), Transaction(amount = 200.0, type = INCOME, categoryId = 2, date = april15TimeMillis) ) every { dao.getByDateRange(any(), any()) } returns flowOf(aprilTransactions)// Whenval result = repository.getTransactionsByMonth("2025-04") .test {// Then assertEquals(aprilTransactions, awaitItem()) awaitComplete() } }@Testfun `deleteTransaction removes from database`() = runTest {val transaction = Transaction(id = 1, amount = 50.0, type = EXPENSE, categoryId = 1, date = System.currentTimeMillis()) repository.deleteTransaction(1) coVerify { dao.deleteById(1) } }}
性能优化建议
让 AI 帮你做性能分析:
请分析轻记账 App 可能存在的性能问题,并给出优化建议。已知情况:- 账单数据量可能达到几千条- 统计页面需要聚合计算- 图表渲染可能比较耗时
AI 给出的优化清单:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 数据库索引优化@Entity( tableName = "transactions", indices = [ Index(value = ["date"]), Index(value = ["categoryId"]), Index(value = ["type", "date"]) ])dataclassTransaction(...)
打包签名与上架准备
最后的步骤让 AI 帮你生成配置:
请帮我准备 App 上架所需的配置:1. 生成签名配置(gradle 代码)2. 配置 ProGuard 规则(针对 Room 和 Hilt)3. 生成 release 构建配置4. 列出上架 Google Play 需要准备的材料清单
签名配置:
// app/build.gradle.ktsandroid { signingConfigs { create("release") { storeFile = file("release.keystore") storePassword = System.getenv("KEYSTORE_PASSWORD") keyAlias = System.getenv("KEY_ALIAS") keyPassword = System.getenv("KEY_PASSWORD") } } buildTypes { release { isMinifyEnabled = true isShrinkResources = true signingConfig = signingConfigs.getByName("release") proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro" ) } }}
上架材料清单:
-
• App 图标(512×512) -
• Feature Graphic(1024×500) -
• 截图(手机 + 平板,至少 2 张) -
• 应用描述(简短 + 详细) -
• 隐私政策 URL -
• 内容分级问卷 -
• 目标 API Level ≥ 33(Google Play 要求)
七、总结:AI 改变了什么,没改变什么
效率提升数据对比
用一个真实的数据来回答”AI 到底提升了多少效率”:
|
|
|
|
|
|
|
|
|
10x |
|
|
|
|
10x |
|
|
|
|
4x |
|
|
|
|
5x |
|
|
|
|
4x |
|
|
|
|
10x |
| 总计 | 20-30 天 | 2-5 天 | ~6x |
一周 vs 一个月。这就是 AI Coding 的真实效率提升。
AI 的边界:什么该交给 AI,什么必须自己来
AI 很强大,但它不是万能的。经过这个项目,我总结了一条清晰的边界:
✅ 应该交给 AI 的:
-
• 需求拆解和功能清单 -
• 技术选型分析 -
• 代码实现(遵循明确的设计) -
• 单元测试生成 -
• 文档编写 -
• 性能优化建议
⚠️ 需要人把关的:
-
• 产品方向和优先级决策 -
• 架构设计的最终确认 -
• 代码审查(AI 写的代码不一定最优) -
• 用户体验的细节判断
❌ 必须自己来的:
-
• 需求的初始想法(AI 不能替你想要做什么) -
• 上架审核和合规 -
• 真机测试和兼容性验证 -
• 与用户的沟通和反馈收集
给开发者的建议
如果你也想用 AI 从零搭一个 App,这里有五条建议:
-
• 先想清楚再动手。花半天时间做好需求分析和技术方案,比上来就写代码省一周的时间。 -
• 写好 CLAUDE.md。这是你和 AI 沟通的桥梁。写得越清晰,AI 的输出质量越高。 -
• 分阶段、小步快跑。每次让 AI 做一个明确的小任务,不要一次性要求太多。 -
• Prompt 要具体。”帮我写个页面”和”帮我写一个包含金额输入、分类选择、日期选择的记账页面”是两个完全不同的结果。 -
• 保持代码审查习惯。AI 写的代码能跑,但不一定是最优的。养成审查的习惯,逐步优化。
写在最后
AI Coding 不是要取代开发者,而是让开发者从”搬砖”中解放出来,把精力放在真正有价值的事情上——想清楚要做什么,以及为什么要做。
技术实现的部分,AI 已经能做得很好了。但产品的灵魂——你的想法、你的审美、你对用户需求的理解——这些是 AI 给不了的。
一个人加 AI,真的可以是一个团队。前提是,你要做好那个”指挥官”的角色。
希望这篇文章能给你一些启发。如果 你也想试试用 AI 搭建自己的 App,不妨就从今天开始。
关注我的公众号,后续会分享更多 AI Coding 实战经验。 🐉
本文作者:loongwind 🐉一个热爱技术、相信 AI 改变开发方式的技术写作者
夜雨聆风