《白嫖党的逆袭:我作为一个学生,如何用免费 AI 工具手搓了一款 Android AI 日记 App》
摘要:你是否也像我一样,总是立 flag 要写日记,却总是坚持不过三天?本文讲述了我如何被一个 iOS 视频"破防",作为一名囊中羞涩的 Android 学生党,利用 Windsurf、Cursor 以及 Google Antigravity (Claude Opus) 等 AI 工具,从零开始打造一款基于 Clean Architecture、集成多种 LLM、支持语音转文字的硬核 AI 日记应用的故事。这是一场关于技术、白嫖和 AI 赋能的奇妙冒险。
1. 引言:该死的 YouTube 算法
一切的开始,都要怪 YouTube 的推荐算法。
那是一个平平无奇的周五下午,我正瘫在宿舍床上刷视频,突然刷到了这一条:YouTube Link。视频里的博主展示了一个极其优雅的工作流:对着 Apple Watch 随口说几句碎碎念,手机上的快捷指令自动运行,背后的 AI 默默地把这些零碎的语音整理成一篇结构清晰、文笔优美的日记。
那一刻,我心动了。
作为一个典型的"差生文具多"型选手,我买过精装本子,下过 Notion,甚至自己搭过服务器部署日记服务,但结局只有一个:太麻烦,坚持不下来。
视频里的思路直击痛点:降低输入的门槛。只管说,剩下的交给 AI。
但是,视频看了一半我才意识到一个严峻的问题------我手里拿的是一台 Android 手机。
iOS 有快捷指令,我们 Android 有什么?Tasker?太折腾。市面上的 App?要么收费昂贵,要么界面丑到即使是亲妈也下不去手。
既然我是学计算机的(虽然还在入门阶段),既然现在 AI 编程这么火,为什么我不自己写一个?
于是,这个名为 "ai日记(journal)"(暂定名,听起来是不是很像大佬写的?)的项目,正式立项了。
2. 第一阶段:免费 AI 的"甜蜜陷阱" (Windsurf + Cursor)
作为一个每个月生活费有限的学生,"白嫖"是我的核心竞争力。听说现在 AI 编程工具很强,我首先把目光投向了市面上最火的两个工具:Windsurf 和 Cursor。
2.1 起步的快感
刚开始的时候,体验简直是梦幻的。我打开 Cursor,开启了 Auto 模式(毕竟免费额度还在),在对话框里敲下:
"帮我创建一个 Android Compose 项目,我要一个主页,上面有个麦克风按钮,按住可以录音。"
几秒钟后,代码生成了。复制,粘贴,运行。卧槽?真的跑起来了!屏幕中间出现了一个按钮,按下去真的有反应。那一刻,我觉得自己就是乔布斯转世,Android 开发不过如此嘛!
2.2 噩梦降临
然而,好景不长。随着我要求的功能越来越多,AI 开始"发疯"了。
我想加入数据库保存录音文本。
Cursor 给了我一段 Room 数据库的代码。
我想加入 Retrofit 调用 OpenAI 接口。
Windsurf 给了我一段网络请求代码。
当我把这两段代码合在一起时,整个项目炸了。
-
报错满天飞 :
Unresolved reference,Type mismatch。 -
逻辑死循环:AI 经常写出"点击按钮保存数据库",但忘了写"在协程中运行",导致主线程阻塞,App 直接 ANR(无响应)。
-
上下文丢失 :免费版的模型记忆力有限。我刚告诉它"把数据库表名改成
diary_entries",过了三句话,它又开始查询diaries表,导致程序崩溃。
最让我崩溃的是代码结构。为了图省事,AI 把 UI 逻辑、数据库操作、网络请求全部塞进了 MainActivity.kt 里。那个文件迅速膨胀到 1000 多行,像一团煮烂的意大利面。
那几天的状态是:
我:"报错了,这里显示找不到 Dao。"
AI:"对不起,我忘了生成 Dao,这是代码。"
我:"不行,在这个位置调用会报错。"
AI:"非常抱歉,请尝试这样修改。"(给了一段完全不相关的代码)
我被迫停下来,去翻阅 Android 官方文档,去学什么是 suspend 函数,去查 Room 的注解到底怎么写。虽然勉强拼凑出了一个能跑的版本,但在这个烂摊子上继续开发,我感觉我在给自己挖坑。
项目被迫搁置。我看着那一坨代码,陷入了深深的自我怀疑。
3. 转折点:Google Antigravity 与 Claude Opus 的降临
时间来到了 12 月 8 日 。我在浏览技术论坛时,偶然发现了一个叫 Google Antigravity 的东西。听说那里可以免费使用 Anthropic 最强的模型 ------ Claude Opus。
Opus?那是传说中智商碾压 GPT 的存在啊!但平时用它太贵了,现在居然有免费额度?
我抱着试一试的心态,把那坨"意大利面代码"的一部分发给了 Claude Opus,并附带了一句:
"这代码太乱了,能不能帮我用 Clean Architecture 重构一下?"
3.1 降维打击
Claude Opus 的回复让我震惊了。它没有直接甩代码,而是先分析了我的问题:
"你目前的代码将 UI 和数据逻辑强耦合在了一起,这会导致后期维护非常困难。对于 Android 开发,推荐使用 Clean Architecture(整洁架构),将项目分为
Data(数据层)、Domain(领域层)和Presentation(表现层)。"
接着,它给出了极其清晰的文件夹结构建议,并分模块生成了代码。
没有对比就没有伤害。
-
Cursor/Windsurf (Free):像个听话但粗心的实习生,你让它干嘛它就干嘛,不管后果。
-
Claude Opus:像个经验丰富的架构师,它会告诉你"你这样做不对,应该那样做",然后手把手教你写出优雅的代码。
我决定:推倒重来! 抱紧 Claude Opus 的大腿,重写这个 App。
4. 技术栈与架构设计:从草台班子到正规军
在 Opus 的指导下,我的项目技术栈终于像个正经的 Android App 了。
4.1 技术选型
-
语言: Kotlin (必须的,Java 已经是时代的眼泪了)
-
UI 框架: Jetpack Compose (Material 3)。声明式 UI 写起来真的爽,再也不用跟 XML 布局文件搏斗了。
-
架构: Clean Architecture + MVVM。
-
数据库: Room + Flow。利用 Flow 的响应式特性,数据库一更新,UI 自动刷新,丝滑。
-
AI 核心: 支持多模型切换(OpenAI, DeepSeek, 通义千问, Moonshot, 智谱, Ollama)。既然是 AI 日记,当然要能换大脑。
-
语音识别 : Android 原生
SpeechRecognizer。为了省钱(划重点),没有接收费的语音 API,原生的离线识别其实够用了。
4.2 为什么是 Clean Architecture?
这得感谢 Opus 的坚持。一开始我觉得分层好麻烦,写个简单的增删改查要写 Entity、Dao、Repository、UseCase、ViewModel 这么多文件。
但后来我真香了。
当我需要把原本的"仅支持 OpenAI"改成"支持 DeepSeek 和 Ollama"时,我发现我只需要修改 Data 层的一个实现类,UI 层完全不用动!这就是解耦的快乐。
5. 核心功能实现与踩坑实录
开发过程并非一帆风顺,即使有 Opus 加持,现实世界的 bug 依然千奇百怪。以下是几个让我印象深刻的"名场面"。
5.1 功能一:语音碎片自动保存
需求 :点击麦克风,说话,松手,文字自动存入数据库。
坑点:Room 数据库的 Schema 变更。
有一天,我决定给日记条目增加一个 mood(情绪)字段。我直接在 Entity 类里加了一行:
@Entity(tableName = "thoughts")
data class Thought(
// ... 其他字段
val mood: String = "neutral" // 新增字段
)
一点运行,App 直接崩溃:Room cannot verify the data integrity.
AI 的救援 :
我把报错扔给 Opus。它立刻指出:"你修改了数据库结构,但没有提供迁移策略(Migration)。"
它给出了两个方案:
-
写繁琐的 Migration SQL 语句。
-
开发阶段直接暴力清除数据。
作为懒人,我选了方案 2。Opus 帮我修改了 Database Builder:
Room.databaseBuilder(context, AppDatabase::class.java, "app.db")
.fallbackToDestructiveMigration() // 加上这句,版本不匹配直接重建
.build()
问题解决。虽然数据丢了,但作为学生项目,谁在乎呢?(正式上线可不能这么干!)
5.2 功能二:AI 待办事项提取
需求:每天晚上,AI 自动读取今天的碎碎念,分析出我明天要做的事,生成待办列表。
坑点 :幻觉字段与 DAO 崩溃。
为了实现这个,我需要查询当天的所有记录。我让 Opus 帮我写 DAO。它自信地写道:
@Query("SELECT * FROM todos WHERE priority > 3 AND completedAt IS NULL")
fun getHighPriorityTodos(): Flow<List<Todo>>
我一运行,编译器红了一片。
报错 :no such column: priority。
原来,我的 Todo 表里根本没有 priority 和 completedAt 这两个字段!Opus 以为我有,或者是它觉得"待办事项表理应有优先级",于是它幻觉了。
解决过程 :
这让我意识到,即使是 Opus 这样的强模型,也不可能时刻记住我所有的代码细节。
我学会了一招:Context Feeding(投喂上下文) 。
每次提问前,我会先把最新的 Entity 代码块贴给它:"这是我目前的 Todo 表结构,请基于此帮我写查询语句。"
加上这个步骤后,错误率几乎降到了零。
5.3 功能三:多模型支持的"类型地狱"
需求:用户可以在设置里选是用 DeepSeek 还是 OpenAI。
坑点:Kotlin 的枚举与 Int 类型的冲突。
为了存储用户的选择,我定义了一个枚举:
enum class AiProvider {
OPENAI, DEEPSEEK, MOONSHOT
}
存入 DataStore 时,Opus 建议存 Int 索引。但在读取并传给 UI 时,逻辑写岔了。
// 错误代码示例
val currentProvider = AiProvider.values()[preferences.providerId]
当我在后续版本中删除了中间的一个枚举值,所有的 ID 全乱套了!原本选 DeepSeek 的用户突然变成了 Moonshot。
反思 :
Opus 帮我重构了这段逻辑,建议直接存储 String 类型的 name,虽然多占几个字节,但稳得一匹。这让我学到了:稳健性比微小的性能优化更重要。
6. AI 编程工具深度对比:Windsurf vs Cursor vs Antigravity
经历了这一个月的开发,我对这几个工具感触良多。
| 维度 | Windsurf / Cursor (Free/Auto) | Google Antigravity (Claude Opus) |
|---|---|---|
| 代码生成速度 | 🚀 极快,秒出 | 🐢 稍慢,需要思考时间 |
| 代码准确性 | ⚠️ 经常有小错误,需人工修补 | ✅ 极高,逻辑严密 |
| 架构理解能力 | ❌ 弱,倾向于把代码堆在一起 | 🧠 强,懂设计模式和解耦 |
| 上下文记忆 | 🐟 金鱼记忆,几轮对话就忘 | 🐘 大象记忆,能记住较长背景 |
| 适合场景 | 生成简单的工具函数、补全代码 | 系统设计、复杂重构、疑难杂症 |
我的建议 :
如果你是学生党,强烈建议组合使用。
-
用 Claude Opus 做"总指挥":设计数据库、定义接口、解决复杂的架构问题。
-
用 Cursor 做"搬砖工":在 Opus 定好的框架内,快速生成 UI 布局代码(Compose 的 UI 代码写起来真的很繁琐,Cursor 补全这种死板代码是一绝)。
7. 成果展示:它真的能用!
经过两周的肝代码(其实大部分时间是在看 Opus 写代码),MindFlow 终于成型了!
✨ 核心功能清单
-
极速语音流:打开 App 就是一个巨大的麦克风,说完即存。
-
AI 智能整理 :每天晚上,点击"生成日报",DeepSeek 会帮我把一天的废话整理成一篇Markdown 格式的精美日记,还能自动打上
Emoji标签。 -
情绪分析:AI 会根据我的文字,分析我今天的心情指数(0-10分),并生成趋势图。
-
待办收割机 :如果我在日记里说"明天要交作业",AI 会自动识别并在"待办"页生成一条任务。



8. 反思与总结:AI 时代的个人开发者
看着手机里这个自己亲手(虽然大部分是 AI 手)打造的 App,我感慨万千。
8.1 既然 AI 能写代码,我还需要学编程吗?
绝对需要。
在使用 Opus 的过程中,我发现:AI 只是放大器,不是魔法师。
-
如果我不懂什么是
Main Thread,我就看不懂为什么 App 会卡死。 -
如果我不懂
Room的基础概念,我就不知道为什么数据库升级会崩溃。 -
如果我不懂
Clean Architecture,我就无法理解 Opus 为什么要让我建那么多文件夹。
以前,开发者是砌砖工 ,需要一块砖一块砖地往上垒。
现在,开发者变成了包工头(或者说产品经理 + 架构师)。你需要告诉 AI 还要盖什么楼,检查它盖得歪不歪,在它犯蠢的时候及时纠正。
核心能力从"默写代码"变成了"阅读代码"、"系统设计"和"精准提问"。
8.2 给想用 AI 做开发的朋友的建议
-
不要迷信"一键生成 App":现在的 AI 还没强到那个地步。复杂的逻辑必须分模块一步步来。
-
学会"Prompt Engineering" :与其说"帮我写个日记 App",不如说"请基于 Jetpack Compose 和 Room,帮我写一个 NoteEntity 类,包含 id, content, timestamp 字段"。指令越具体,代码越好用。
-
拥抱"白嫖":多关注 Antigravity 这种平台,或者 GitHub Copilot 的学生包。穷不是不学习的理由,信息差才是。
9. 未来计划
虽然app 已经能用了,但我还有很多脑洞:
-
RAG (检索增强生成):让 AI 能回答"我上个月哪天最开心?"或者"我上次提到想吃火锅是什么时候?"。
-
图片理解:支持上传图片,AI 自动描述图片内容并写入日记。
-
桌面小组件:不打开 App 也能一键录音。
这就去问问 Claude Opus 怎么实现 RAG......
最后,感谢那个周五下午的 YouTube 视频,感谢 Antigravity,也感谢那个没有因为报错而放弃的自己,同时也欢迎大家批评指导。
如果你也想做自己的 App,别犹豫了,打开 IDE,召唤你的 AI 助手,开始吧!
附录:git仓库地址:https://github.com/kai200407/AI-Diary-App-Android