乐于分享
好东西不私藏

从 0 到 1 用 AI 搭建一个完整 App:需求分析→设计→开发→上线

从 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

好的做法
差的做法
说明目标用户和使用场景
只说”做个记账 App”
给出你的初步想法,让 AI 补充完善
完全不提供任何上下文
要求结构化输出(功能清单、优先级等)
不指定输出格式
明确约束条件(本地存储、个人项目等)
什么都不限制,让 AI 随意发挥

关键原则:AI 是你的副驾,不是自动驾驶。你提供方向和约束,AI 帮你填充细节和发现盲点。


三、第二步:技术方案设计(让 AI 做你的架构师)

技术选型分析

有了需求,下一步是确定”用什么技术实现”。这也是一个容易踩坑的地方——选错了技术栈,后面改起来会很痛苦。

我的 Prompt:

基于上面的需求分析,请帮我设计「轻记账」App 的技术方案。我的技术偏好:- 语言:Kotlin- UI:Jetpack Compose- 我希望用最新的 Android 技术栈请输出:1. 技术选型分析(为什么推荐某个技术)2. 整体架构设计(推荐用 MVVM + Clean Architecture)3. 数据库设计(表结构、字段定义)4. 核心模块划分5. 第三方库推荐(注明用途和选型理由)

技术选型结果

类别
选择
理由
语言
Kotlin
Android 官方推荐,协程 + Flow 天然适合响应式
UI
Jetpack Compose
声明式 UI,开发效率高,状态管理直观
架构
MVVM + Clean Architecture
职责分离,易于测试和扩展
数据库
Room
官方 ORM,类型安全,支持 Flow 响应式查询
依赖注入
Hilt
Google 官方推荐,基于 Dagger,学习成本低
网络
Ktor(预留)
暂时用不到,但为云同步预留
图表
Vico
纯 Compose 图表库,API 简洁
导航
Compose Navigation
官方方案,与 Compose 集成好
日期时间
kotlinx-datetime
多平台时间处理

架构设计

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),)

关键要点:

  • • 对比度要够:暗色模式下文字颜色要够亮
  • • 不要用纯黑#121212 比 #000000 看着舒服
  • • 图片资源注意:深色背景上的图标要换浅色版本
  • • 测试真机效果:模拟器的暗色模式有时不准确

动画和交互细节

// 账单列表项的进入动画@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 给出的优化清单:

问题
优化方案
大列表卡顿
LazyColumn 使用 key 参数,避免不必要的重组
数据库查询慢
为 date 字段建索引,使用 @Index 注解
图表渲染卡顿
数据聚合放在 ViewModel 中,用 map 运算符预处理
首页启动慢
使用 remember + derivedStateOf 缓存计算结果
内存占用高
分页加载,使用 Paging 3
// 数据库索引优化@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 到底提升了多少效率”:

环节
传统开发
AI 辅助开发
提升幅度
需求分析
2-3 天
1 小时
10x
技术方案设计
2-3 天
1 小时
10x
项目搭建
1 天
2 小时
4x
核心功能开发
7-10 天
1-2 天
5x
UI 开发与打磨
5-7 天
1-2 天
4x
单元测试
3-5 天
2 小时
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 改变开发方式的技术写作者