企业服务 · 财税合规 · AI 落地 · 技术定制
联系人:展欣 咨询热线:188 1922 9158 邮箱:huaqidao@qq.com

一个单词 App 的十年:泡单词 Android 项目史

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

一个单词 App 的十年:泡单词 Android 项目史
4,682COMMITS
46TAGS
37BRANCHES
10.5YEARS

从 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-0424立项,第一天 2587 个文件
2016-05189基础框架、登录、学习卡片
2016-06265计划 / 复习 / 单词本
2016-07286v1.9.0_r1 起版本号
2016-08237会员、支付、分享
2016-09238离线下载
2016-10190竞技场起步
2016-11246多人竞技、RTC
2016-12296包体积优化,.so 开始被排除

四条线同时推进

单词 127复习 119计划 118竞技 113 下载 76离线 62分享 51会员 31 支付 20优惠券 11

上排数字是当年 commit message 里关键词出现的次数。

两个“减法”定下了后来的规矩

2016-12-01 zxy 提交「优化包大小」,删掉 libgdx.so、libjpush219.so 的多个 ABI。
2016-12-16 nukix 提交「本地添加 x86 库,添加 .gitignore 进行过滤」——从此 jniLibs/{arm64-v8a,armeabi-v7a,x86} 被排除在版本控制外。

“二进制不进 repo” 的约定,就是这两天定下的。代价是 2026 年 clone 下来一个 .so 都没有。

第二幕 · 2017

2214 个 non-merge commit,项目绝对高峰:1 月 333 笔,5 月 329 笔。

版本线:几乎每两周一个 release

v3.0.1.1 · 02-21v3.0.5 · 02-28v3.0.6/.1 · 03-22 v3.0.8 · 04-06v3.1.0 · 04-11v3.1.2 · 04-27 v3.1.4/.1/.2/.3 · 05-09~15v3.1.6/.1 · 05-26 / 06-01 v3.1.7_527 · 06-19v3.1.7.6/.7/.8 · 07 v3.1.8 · 08-10v3.1.10 · 09-14v3.2.0 · 10-17v3.2.2 · 11-06

5 月那串 .1/.2/.3 是最典型的“线上出问题 → 当天修 → 当天发”。

分支动物园(30 条)

3.1.4_msg_push3.1.4_msg_puss23.1.9_download 3.1.9_mix3.1.7.6_hotfix3.2.0_retrofit 3.2.1_dev3.2.1_opt3.2.3_dev f_3.2.2_af_3.2.2_baseactivity_optf_jenkins code_slicestudy_opt

第二条把 push 拼成了 puss,一直没改。f_jenkins 说明有人认真试过 CI,但 repo 至今没有任何 pipeline 配置。

2017-01-11:一次大规模回滚

时间作者动作文件数
09:56cenzeren修改卡片的单词显示,加入一个自定义 view—
14:44zhouxiaoyi回滚到 2cf1ae4…2345
14:57zhouxiaoyi未 push 的 commit1798

五小时内完成“整体回滚 + 重放”,没有一条说明。

从堆功能转向修 bug

崩溃 相关提交:2016 年 71 笔 → 2017 年 190 笔;内存 22 笔。功能堆到一定程度,一年里近十分之一的提交在修崩溃。

一种很特别的 commit message 文化

625 条 message 用了统一模板(占全部 non-merge commit 的 15%):

[泡单词]:<一句话变更>
变更原因:Bug/需求/崩溃/CodeReview
适用机型:All 关联变更项: 验证建议:无

这是提测 / 发版流程的痕迹:提交信息不只是给自己看的,是给测试和发布用的。2018 年 “all in” 之后,这个模板再没出现过——流程随团队一起消失了。

2017-11-08 17:06 → 2018-08-30 00:43 294 天

第三幕 · 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 笔。

2020-10-12 → 2021-08-26 318 天

第四幕 · 2021 — 2023

六年不到 50 笔提交,Jeffrey(归并后 885 笔,跨越 2016—2023)几乎一个人完成。

年份commits主要动作
202114权限授权弹窗显示逻辑、去掉 X5 申请设备权限、手机号正则、versionCode 851/852
20224优化隐私弹窗逻辑、去掉友盟统计
20236更新 SDK 版本、适配隐私政策审核

中间的空档:351 天(2021-09 → 2022-09)、161 天(2022-10 → 2023-03)。

做的不是功能,是让应用还能上架:去推送、去统计、去高德定位、升级 SDK、补隐私弹窗、收敛权限。

2023-05-07 20:42,最后一笔。

2023-05-07 → 2026-10-17 1258 天

第五幕 · 2026

一天之内发生的事:

时间作者内容
00:02huaqidao同步 target35 工作版:迁移 androidx、升级 targetSdk 35、接入局域网调试后端(1278 个文件)
03:43huaqidao支持无网络登录与离线学习
11:15shopv2统一新增文件权限:与仓库既有约定一致(100755)
19:03–19:27shopv2README、项目史、.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,682HEAD 文件数3,008
non-merge4,241.java1,665
merge441.kt1
tag46.xml650
branch37root commit1

细节与彩蛋

  • 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 / shichaohui1,1452016-04 → 2017-11第一笔提交的人,提交数第一,三个邮箱
Jeffrey / caiwenqiang8852016-07 → 2023-05跨越七年半,最后三年的唯一维护者
nukix8302016-04 → 2017-08第一天就开始,第一笔 message 是 123
zhouxiaoyi / zxy / zhouxy4252016-05 → 2018-08“all in” 的作者,2026 整合的起点
cenzeren2302016-07 → 2017-02
huangxirong2052016-11 → 2017-05
tanyang1302017-09 → 2017-11项目停止前的最后一批人
lihuanbin / Lee1082016-12 → 2017-02
xuliwen1042016-07 → 2016-10
王宇飞(wangyufei)492017-04 → 2017-05
欧读书(oudushu)472017-04 → 2017-05
gr19901105382016-04 → 2016-06
Eleven362017-04 → 2017-05
Wensj72017-05阿里推送改造
Weity42019 → 20202019 年唯一的提交
huaqidao22026-10androidx / targetSdk 35 迁移
shopv252026-102026 收尾与文档

一句话

一群人在 2016—2017 两年里写了 4000 多笔提交,把产品做到能打;
2018 年有人用一条 “all in” 重开了历史;之后六年靠一个人守着合规底线;
2026 年又被重新捡起来迁到 AndroidX,最后把断掉的历史全部接回同一个 root commit。

分享素材

以下素材可直接保存转发。朋友圈海报上的二维码指向本页,长按识别或扫码即可阅读全文。

全文下载

HTML 版(39 KB) · Markdown 版(11 KB) · PDF 版(728 KB)

朋友圈

泡单词 Android 十年项目史 · 朋友圈海报
朋友圈海报 · 1080×1460 · 竖版,二维码指向本页
泡单词 Android 十年项目史 · 竖版封面
竖版封面 · 1080×1260 · 公众号 / 视频号头图

公众号

泡单词 Android 十年项目史 · 公众号头条封面
头条封面 · 1800×766(2.35:1,微信标准 900×383 的 2 倍图)
泡单词 Android 十年项目史 · 公众号链接分享卡
链接分享卡 · 1080×1080(1:1,聊天 / 朋友圈卡片缩略图)

下载原图:朋友圈海报 PNG · 竖版封面 PNG · 公众号头条封面 PNG · 链接分享卡 PNG

使用建议:朋友圈发竖版海报;公众号头条用 2.35:1 那张;文章链接分享到聊天或朋友圈时,微信抓取的缩略图建议用 1:1 那张(可在公众号后台「分享设置」或页面 og:image 指定);引用时请保留二维码。

数据来源:git log --all / rev-list / ls-tree(2026-10-17)。