夜雨聆风学习资料网

ARTICLE · 983717

我给自己做了一个离线背单词 App,顺便上了一堂工程课

我给自己做了一个离线背单词 App,顺便上了一堂工程课
项目手记
PROJECT STORY · 01

OFFLINE · ANDROID · 一个人的项目

我给自己做了一个离线背单词 App,顺便上了一堂工程课

事情的起因很简单:我想在手机上刷一本词根词汇书。结果刷着刷着,刷出了 30 个单元、1,200 个词条、3,220 道题,还有一个不联网、没账号、没广告的安卓应用。这篇文章讲讲它是怎么长出来的。

2026 年 8 月 · 文中截图全部来自真机操作,未裁切未修图

30
个完整单元
1,200
个双语词条
180
组测验
3,220
道题

最终回归成绩

193 项全部通过 · 设备测试 5/5

Android 8 起可用 · 无网络权限 · 无账户 · 无广告 · 无云同步

01 · 先看看成品

一个书架,从第 1 单元滑到第 30 单元

我对“做完”的定义很朴素:打开应用,从第一单元一路滑到第三十单元,每一张卡片点进去都有真东西。

图 1
书架首页。30 个单元全部就位,当前学的单元用浅色卡片标出来。
图 2
滑到底,Unit 27–30 还在,编号连续,没有空壳卡片凑数。
图 3
点开一个单元:40 个词、8 个拉丁词根、108 道题、学习进度,一眼看清。

底部五个入口各管一件事:书架选内容,概览看进度,课程负责学,测验负责考,练习负责用。各管各的,互不抢戏。

02 · 课程

五个学习阶段,是数据说了算
图 4
每个单元拆成五个主题阶段。阶段标题、词根顺序、配色,全部来自数据,不是写死在界面里的。

做 Unit 1 的时候,我偷了个懒,差点把阶段信息直接写进代码。Unit 2 一来就发现不行——于是把整套结构搬进数据模型。后来的事实证明这一步很关键:之后 28 个单元只需要喂数据,一行界面代码都不用改。

03 · 双语设计

中文默认藏起来,想看再点开
图 5
词条默认全英文:释义、例句、词源故事,还能点喇叭听系统朗读。
图 6
看不懂?点开这一个词的中文就行,别处的英文氛围不受影响。

我的想法是:先逼自己用英文理解,实在扛不住再叫中文来救场。中文是脚手架,不是天花板。而且展开精度可以到单个词条、单段词根,很克制。

04 · 测验

原书题目一道不动,反馈体验拉满
图 7
答题前,界面干干净净,不会提前泄题。
图 8
答错了:错的标红、对的标绿,你选了什么、答案是什么,写得明明白白。
图 9
有的题本来就有两个正确答案,界面自动从单选圈变成复选框,而不是硬把题改成单选。

测验题严格保留原书的题干和选项——内容忠实,交互现代。即时出分、逐题解析、最佳成绩存在本地。

05 · 练习

四种刷题姿势,全部本地生成

题目从已审核的单元数据里现场出,不要网络,也不会冒出莫名其妙的随机知识。

图 10
词义辨认:看着单词挑释义。
图 11
答对立刻反馈,顶部的正确率同步刷新。
图 12
拼写:给中文提示和音标,自己把单词敲出来。
图 13
词根分类:把单词送回它的词根老家。
图 14
例句填空:从真实例句里挖空,让单词回到语境里去。

四种模式分别练识别、主动回忆、结构归类、语境运用——同一份数据,四条记忆通路。

06 · 写作工坊

最有意思的部分:本机检查 + 外援 AI
图 15
每个词要写三个不同的原创句子。会认不算会,能用才算。
图 16
本机先做一轮“老实人检查”:含不含目标词、首字母大写没、结尾标点有没有、词数够不够、三句重不重。逐条列给你看。
图 17
检查全过后,才解锁“复制批改请求”和“分享到 AI 应用”。
图 18
应用只把整理好的请求交到你手上,自己绝不联网偷跑。

为什么这么绕?

因为简单规则判不了“地不地道”,而一个号称离线的应用又不该偷偷联网调大模型。所以分工:本机管形式,透明、确定、离线;AI 管语感,可选、外部、你说了算。

一次真实的批改长这样
图 19
拿 elevation 造三个句子,形式检查全绿,放行。
图 20
句子 1 拿了三项高分,评语原样存回本地。
图 21
句子 2 被抓出搭配问题:“elevation map”不地道,改法也给了。
图 22
句子 3 加总评。AI 的反馈存进应用,变成以后复习的材料,不是聊完就散的记录。

07 · 隐私

“离线”不是宣传语,是权限清单
图 23
每个单元的进度各记各的账,互不干扰。
图 24
应用被系统杀掉再打开,还会回到你上次学的那个单元。
  • 所有内容打包进安装包,运行时一个字节都不下载;
  • 应用根本没申请网络权限——想联网都没门;
  • 没有账号、没有统计上报、没有广告、没有云同步;
  • 连系统备份都关了,学习记录不会悄悄跑进云端;
  • 发音用的是手机系统自带的 TTS。

进度和成绩存在本地,靠稳定 ID 挂靠:以后加新单元,旧的学习记录纹丝不动。

08 · 内容工程

最难的不是写代码,是搞内容

这本书有四份来源文件:结构化英文、英文 PDF、双语 PDF、OCR 文本。听起来很多?问题是它们互相打架。双语 PDF 里断词、错字、栏目错序是家常便饭,OCR 更是只能用来定位,不能直接信。

所以规则是:每一段中文、每一个音标、每一道答案,都要对着渲染出来的页面人工核一遍。程序能证明“这个字段有值”,但证明不了“这个翻译是对的”。

内容工程的坑,和搬数据不一样

搬数据的错误是“缺了”;内容工程的错误是“看着挺通顺,其实是错的”——地名对不上、音乐术语翻错、例句整段讲了两件事。这种坑只能靠逐页核对和人来拍板。

09 · 生产线

30 个单元怎么造出来的:并行干活,串行验收

Unit 1是探路:设了六道关卡,从工具链到样本、到完整数据、到网页预览、到原生预览、最后才打包安装。内容不靠谱之前,绝不动手写界面。

Unit 2逼着架构长大:书架、目录、数据驱动课程、双答案题、进度隔离,全在这一步补齐。Unit 3跑通了从审核到上架的完整流水线,还正式复了一次盘。

后面 27 个单元就上了流水线:最多三个单元同时备料,但真机验证只有一条通道,进“正式书架”也只有一条通道。备料可以乱序完成,上架必须按 4、5、6……30 排队——慢的不挡路,快的不插队。

关卡
干什么
留下什么证据
A0
定规矩
授权、范围、隔离方案、失败恢复预案
A1
审来源
英文比对、中文逐页核、答案与差异记录
A2
建内容
确定性构建、结构校验、来源引用
A3
做预览
自包含的离线网页版交互验证
A4
上真机
JVM、Lint、Compose、设备交互测试
A5
审安装包
权限、备份、依赖、资产、安装、冷启动
A6
复盘
误报漏报、证据缺口、下一批改进

10 · 踩坑记录

几个值得记住的坑
  • 校验规则太紧也会误伤
    :早期规则只认短词条,真实的三词词条被拒收。系统停下来,人工批准后才谨慎放宽——这种“拦错了”比“放错了”值钱。
  • 环境抽风 ≠ 产品坏了
    :构建缓存、沙箱权限抽风时,正确姿势是记录环境、重跑检查,而不是安慰自己“大概没问题”。
  • “我建了任务”不算数
    :批处理时一个内部子任务被误当成正式任务,其实根本没启动。从此任务必须绑定外部可见的 ID 和产出物。
  • 不可信的草稿整个扔
    :词数不对、题目缩水、占位题的旧草稿,不打补丁,回到原书完整重建。
  • 格式合法 ≠ 人人会读
    :有个字段允许为空数组,结果安卓端压根没处理这种情况,真机一跑就露馅——端到端验证省不得。

11 · 一点感想

这个项目真正教会我的事

模型会不会写代码,不是交付的关键。可信来自另外一些东西:明确的授权、每条结论背后的证据、人来做的内容判断、可复现的构建、受控的并行,以及——证据不够的时候敢于停下来。

  • 上下文长不等于记得清
    :窗口再长,也分不清“三个月前的禁令”和“昨天的新授权”,项目记忆得按事件建模。
  • 批准会漂移
    :同意做架构 ≠ 同意批量生产 ≠ 同意发布。授权最好变成机器可检查的清单,而不是靠回忆。
  • 并行有隐形成本
    :三个任务同时跑,速度不是乘三——模拟器、构建目录、状态文件都是共享的。这个项目最有效的一句话是:
让探索并行,让真相串行。
TRACE
一句话解释
底线要求
T
类型化授权
授权写成机器可读
范围、动作、基线、禁区一目了然
R
可复现制品
同样输入同样输出
确定性构建、稳定 ID、环境锁定
A
可审计代理
干的活都留痕
任务、工作区、状态、证据一一绑定
C
受控并发
并行不翻车
单一写入者、资源租约、显式回滚
E
专家人工复核
关键环节人来定
拿不准的升级给人,双轨审查

写在最后

结语

回头看,这个项目做的不只是一个背单词应用。它验证了一件事:当输入是四份互相矛盾的双语材料,当干活的是人加一堆 AI 代理,当任何一处“看着没问题”的错译都会顺着流水线灌进 30 个单元——工程要做的事,远比“生成代码”多。

1,200 个词条,变成了一套学习系统;30 个单元,变成了一条可审计的生产线;而“AI 会写代码”这件事,变成了“AI 要对证据、边界和后果负责”。

词根词汇训练 · Roots & Stories

一个私人自用、可侧载、完全离线的安卓词汇学习应用。

文中 24 张截图均来自真机实际操作,未裁切、未拼接、未修图。

● github.com/Page67/vocabularybuilder_clean

2026 年 8 月 · 私人项目记录 · 想找的人自然知道去哪儿找

相关学习资料