一个单词 App 的十年:泡单词 Android 项目史
一个 Android 单词 App 从 2016 到 2026 的完整项目史——4,682 次提交、七次断档、四条并行历史,2026 年重新迁到 AndroidX 并接回同一个 root commit。

从 2016 年 4 月 27 日的一笔 first commit.,到 2026 年 10 月 17 日四条历史被接回同一个 root commit。中间有两年写掉 4000 多笔提交的高峰,也有长达 1258 天的空白。这个故事完全由 git 记录还原。
案例概览
| 项目 | 泡单词 Android(paoword)——移动端背单词应用 |
|---|---|
| 行业 | 互联网 / 在线教育 / 移动应用 |
| 服务内容 | 代码仓库考古与历史整合、Android 现代化迁移(AndroidX + targetSdk 35)、离线可用性改造、工程规范梳理 |
| 项目跨度 | 2016-04-27 — 2026-10-17(10.5 年) |
| 交付成果 | 四条并行历史合并为单一 root commit;Java + support 库升级到 Kotlin 2.0 + AndroidX;支持无网络登录与离线学习 |
全文下载:HTML 版(39 KB) · Markdown 版(11 KB) · PDF 版(728 KB) (PDF 适合存档与转发,Markdown 适合二次编辑)
序章 · 2016-04-27
53835d5 —— “first commit.”,作者 shichaohui(邮箱已隐去),一次提交 2587 个文件。
同一天还有两笔:nukix 的 message 只有一个 123;同一个 nukix 的 Delete ._.DS_Store。甚至还有一条 guangmomo <your_email> 的占位提交——邮箱都没改。
这个项目从第一天起就不是一个人的项目。首周出现的身份就有五个以上。
第一幕 · 2016
1971 个 non-merge commit。从 5 月起稳定在每月 200 笔上下,四条产品线同时铺开。
| 月份 | commits | 主线 |
|---|---|---|
| 2016-04 | 24 | 立项,第一天 2587 个文件 |
| 2016-05 | 189 | 基础框架、登录、学习卡片 |
| 2016-06 | 265 | 计划 / 复习 / 单词本 |
| 2016-07 | 286 | v1.9.0_r1 起版本号 |
| 2016-08 | 237 | 会员、支付、分享 |
| 2016-09 | 238 | 离线下载 |
| 2016-10 | 190 | 竞技场起步 |
| 2016-11 | 246 | 多人竞技、RTC |
| 2016-12 | 296 | 包体积优化,.so 开始被排除 |
四条线同时推进
上排数字是当年 commit message 里关键词出现的次数。
两个“减法”定下了后来的规矩
2016-12-01 zxy 提交「优化包大小」,删掉 libgdx.so、libjpush219.so 的多个 ABI。
2016-12-16 nukix 提交「本地添加 x86 库,添加 .gitignore 进行过滤」——从此 jniLibs/{arm64-v8a,armeabi-v7a,x86} 被排除在版本控制外。
.so 都没有。第二幕 · 2017
2214 个 non-merge commit,项目绝对高峰:1 月 333 笔,5 月 329 笔。
版本线:几乎每两周一个 release
5 月那串 .1/.2/.3 是最典型的“线上出问题 → 当天修 → 当天发”。
分支动物园(30 条)
第二条把 push 拼成了 puss,一直没改。f_jenkins 说明有人认真试过 CI,但 repo 至今没有任何 pipeline 配置。
2017-01-11:一次大规模回滚
| 时间 | 作者 | 动作 | 文件数 |
|---|---|---|---|
| 09:56 | cenzeren | 修改卡片的单词显示,加入一个自定义 view | — |
| 14:44 | zhouxiaoyi | 回滚到 2cf1ae4… | 2345 |
| 14:57 | zhouxiaoyi | 未 push 的 commit | 1798 |
五小时内完成“整体回滚 + 重放”,没有一条说明。
从堆功能转向修 bug
崩溃 相关提交:2016 年 71 笔 → 2017 年 190 笔;内存 22 笔。功能堆到一定程度,一年里近十分之一的提交在修崩溃。
一种很特别的 commit message 文化
625 条 message 用了统一模板(占全部 non-merge commit 的 15%):
[泡单词]:<一句话变更>
变更原因:Bug/需求/崩溃/CodeReview
适用机型:All关联变更项:验证建议:无
这是提测 / 发版流程的痕迹:提交信息不只是给自己看的,是给测试和发布用的。2018 年 “all in” 之后,这个模板再没出现过——流程随团队一起消失了。
第三幕 · 2018 — 2020
18-08-30 00:43 的 “all in”
作者 zhouxiaoyi,message 只有两个词:
all in
1409 个文件变更,tree 里 2972 个文件,父提交是 2017-11-02 的 master。
这条 commit 是分水岭:对老仓库(A)它是“另一条线”的起点,对新仓库(B)它是 root commit,对 2026 年的整合它是必须被 graft 的那一个点。
1c68c5b 在另一条历史里——两条历史的差异只有 message 末尾的换行(\n\n vs \n),SHA 因此不同。2019:一笔
272 天后,Weity 提交 “new version”。全年 2 笔。
2020:隐私合规的开端
447 天后(2020-08-18),Weity 升级 targetSdk;8 月底 Jeffrey 连续提交:改 gradle 配置(compileSdk 26)、加隐私协议弹窗、改第三方注册失败提示。全年 21 笔。
第四幕 · 2021 — 2023
六年不到 50 笔提交,Jeffrey(归并后 885 笔,跨越 2016—2023)几乎一个人完成。
| 年份 | commits | 主要动作 |
|---|---|---|
| 2021 | 14 | 权限授权弹窗显示逻辑、去掉 X5 申请设备权限、手机号正则、versionCode 851/852 |
| 2022 | 4 | 优化隐私弹窗逻辑、去掉友盟统计 |
| 2023 | 6 | 更新 SDK 版本、适配隐私政策审核 |
中间的空档:351 天(2021-09 → 2022-09)、161 天(2022-10 → 2023-03)。
做的不是功能,是让应用还能上架:去推送、去统计、去高德定位、升级 SDK、补隐私弹窗、收敛权限。
2023-05-07 20:42,最后一笔。
第五幕 · 2026
一天之内发生的事:
| 时间 | 作者 | 内容 |
|---|---|---|
| 00:02 | huaqidao | 同步 target35 工作版:迁移 androidx、升级 targetSdk 35、接入局域网调试后端(1278 个文件) |
| 03:43 | huaqidao | 支持无网络登录与离线学习 |
| 11:15 | shopv2 | 统一新增文件权限:与仓库既有约定一致(100755) |
| 19:03–19:27 | shopv2 | README、项目史、.so 现状、术语统一 |
从 2016 年的 Java + support 库,到 2026 年的 Kotlin 2.0 + AndroidX + targetSdk 35——这个项目跨过了 Android 生态的两个时代。
同一天晚上,四条历史(A / B / C / D)被合到一个 repo:单 root commit 53835d5,v2 线与 master 线共享前 6 个 commit,在 d71e161(2020-08-26)分叉。
九年前那个 “first commit.”,重新变成所有 branch 的起点。
尾声 · 数字
| commit 总数 | 4,682 | HEAD 文件数 | 3,008 |
| non-merge | 4,241 | .java | 1,665 |
| merge | 441 | .kt | 1 |
| tag | 46 | .xml | 650 |
| branch | 37 | root commit | 1 |
细节与彩蛋
- 133 条 message 长度 ≤ 4 个字,最多的是「优化代码」,其次「优化布局」「修改文案」「增加注释」。
- 4 次回滚(
回滚/revert),最狠的一次动了 2345 个文件。 - 有一条 message 叫 「未 push 的 commit」,动了 1798 个文件。
- 5 个 lightweight tag(
v2.4.0、v2.4.6、v3.0.0、v3.1.7、v3.4.1-debug-841),其中v3.4.1-debug-841指向 2026-10-17 的提交——一个 2017 年风格的名字,挂在了 2026 年的代码上。 - 空档一览:294 / 272 / 447 / 318 / 351 / 161 / 1258 天。七次,一次比一次长。
人物志
按 email / name 归并,多个 id 很可能指向同一个人,归并结论为推断;邮箱信息已隐去。
| 推断身份 | commits | 活跃期 | 说明 |
|---|---|---|---|
| chaohui / shichaohui | 1,145 | 2016-04 → 2017-11 | 第一笔提交的人,提交数第一,三个邮箱 |
| Jeffrey / caiwenqiang | 885 | 2016-07 → 2023-05 | 跨越七年半,最后三年的唯一维护者 |
| nukix | 830 | 2016-04 → 2017-08 | 第一天就开始,第一笔 message 是 123 |
| zhouxiaoyi / zxy / zhouxy | 425 | 2016-05 → 2018-08 | “all in” 的作者,2026 整合的起点 |
| cenzeren | 230 | 2016-07 → 2017-02 | |
| huangxirong | 205 | 2016-11 → 2017-05 | |
| tanyang | 130 | 2017-09 → 2017-11 | 项目停止前的最后一批人 |
| lihuanbin / Lee | 108 | 2016-12 → 2017-02 | |
| xuliwen | 104 | 2016-07 → 2016-10 | |
| 王宇飞(wangyufei) | 49 | 2017-04 → 2017-05 | |
| 欧读书(oudushu) | 47 | 2017-04 → 2017-05 | |
| gr19901105 | 38 | 2016-04 → 2016-06 | |
| Eleven | 36 | 2017-04 → 2017-05 | |
| Wensj | 7 | 2017-05 | 阿里推送改造 |
| Weity | 4 | 2019 → 2020 | 2019 年唯一的提交 |
| huaqidao | 2 | 2026-10 | androidx / targetSdk 35 迁移 |
| shopv2 | 5 | 2026-10 | 2026 收尾与文档 |
一句话
一群人在 2016—2017 两年里写了 4000 多笔提交,把产品做到能打;
2018 年有人用一条 “all in” 重开了历史;之后六年靠一个人守着合规底线;
2026 年又被重新捡起来迁到 AndroidX,最后把断掉的历史全部接回同一个 root commit。
分享素材
以下素材可直接保存转发。朋友圈海报上的二维码指向本页,长按识别或扫码即可阅读全文。
全文下载
HTML 版(39 KB) · Markdown 版(11 KB) · PDF 版(728 KB)
朋友圈
公众号
下载原图:朋友圈海报 PNG · 竖版封面 PNG · 公众号头条封面 PNG · 链接分享卡 PNG
使用建议:朋友圈发竖版海报;公众号头条用 2.35:1 那张;文章链接分享到聊天或朋友圈时,微信抓取的缩略图建议用 1:1 那张(可在公众号后台「分享设置」或页面 og:image 指定);引用时请保留二维码。
数据来源:git log --all / rev-list / ls-tree(2026-10-17)。