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

> 全部依据 git 记录写成：4682 个 commit（4241 个 non-merge、441 个 merge），时间跨度 2016-04-27 → 2026-10-17。
> 作者身份按 name/email 归并，**多个 id 很可能指向同一个人**，归并结论标注为推断。

## 序章：2016 年 4 月 27 日

`53835d5` — "first commit."，作者 `shichaohui <464206200@qq.com>`，一次提交 **2587 个文件**。

同一天还有两笔：
- `nukix` 的 message 只有一个 `123`
- 同一个 `nukix` 的 `Delete ._.DS_Store`

还有一个 `guangmomo <your_email>` 的占位提交（邮箱都没改），以及一条作者是 `unknown` 的记录。

**这个项目从第一天起就不是一个人的项目。** 首周里出现的身份就有五个以上：shichaohui、nukix、gr19901105、zhouxiaoyi（当时用 `zhouxy`、`zxy`、`周孝义` 几个 id）、cenzeren。

## 第一幕 2016：一个月 200 笔

**1971 个 non-merge commit。**

| 月份 | commits |
|---|---:|
| 2016-04 | 24 |
| 2016-05 | 189 |
| 2016-06 | 265 |
| 2016-07 | 286 |
| 2016-08 | 237 |
| 2016-09 | 238 |
| 2016-10 | 190 |
| 2016-11 | 246 |
| 2016-12 | **296** |

从 5 月开始就稳定在每月 200 笔上下——这是一个"全速开发"的节奏，而且不是修修补补，是四条产品线同时铺：

- **学习核心**：单词、复习、计划。全年 `单词` 出现 127 次、`复习` 119 次、`计划` 118 次
- **离线能力**：`下载` 76 次、`离线` 62 次。断点下载的 Demo 是 `2016-11-22 03:05` 提交的（nukix）
- **竞技场**：`竞技` 113 次。双人 PK、多人房间、匹配、RTC 音视频都在这一年从零做出来
- **商业化**：`会员` 31 次、`支付` 20 次、`优惠券` 11 次、`分享` 51 次

版本节奏也很密：`v1.9.0_r1`（7-22）→ `v2.0.0`（8-24）→ `v2.1.x`（9 月）→ `v2.2.x`（10 月）→ `v2.3.x`（11-12 月）→ `v2.4.0`（12-22）。**半年走了六个 minor 版本。**

这一年的两个"减法"值得记下来：

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

**"二进制不进 repo" 的约定，就是这两天定下的。**

## 第二幕 2017：2214 笔、30 条分支、40 个 tag

**2214 个 non-merge commit，项目的绝对高峰。** 峰值月份：

| 月份 | commits |
|---|---:|
| 2017-01 | **333** |
| 2017-05 | **329** |
| 2017-04 | 270 |
| 2017-03 | 223 |
| 2017-09 | 193 |
| 2017-08 | 188 |

### 版本线：几乎每两周一个 release

`v3.0.1.1`（2-21）→ `v3.0.5`（2-28）→ `v3.0.6/.1`（3-22）→ `v3.0.8`（4-06）→ `v3.1.0`（4-11）→ `v3.1.2`（4-27）→ `v3.1.4/.1/.2/.3`（5-09 ~ 5-15，**一周内四个补丁版本**）→ `v3.1.6/.1`（5-26、6-01）→ `v3.1.7_527`（6-19）→ `v3.1.7.6/.7/.8`（7 月）→ `v3.1.8`（8-10）→ `v3.1.10`（9-14）→ `v3.2.0`（10-17）→ `v3.2.2`（11-06）

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

### 分支动物园

30 条 branch，名字本身就是一部开发史：

- `3.1.4_msg_push` / `3.1.4_msg_puss2`（后面这条把 push 拼成了 puss，也没改）
- `3.1.9_download`、`3.1.9_mix`、`3.1.7.6_hotfix`
- `3.2.0_retrofit`（网络层换 Retrofit）、`3.2.0_dev`、`3.2.1_dev`、`3.2.1_opt`、`3.2.3_dev`
- `f_3.2.2_a`、`f_3.2.2_baseactivity_opt`（`f_` 前缀像是 feature 分支）
- `f_jenkins`（有人试图把构建搬上 Jenkins）
- `code_slice`、`study_opt`、`target35`

### 2017-01-11：一次大规模回滚

这一天值得单独写：

- `09:56` cenzeren 提交"修改卡片的单词显示，加入一个自定义 view"
- `14:44` zhouxiaoyi 提交 **"回滚到 2cf1ae419bd2fa254b0dc81128f62305f4daaf13"**，动了 **2345 个文件**
- `14:57` 同一个人的 **"未push的commit"**，动了 **1798 个文件**
- 之后照常继续合并、提交

从记录看，这是一次"把未推送的本地工作整体回滚再重放"的事故处理。全程 5 小时，没有一条说明。

### 从加功能转向修 bug

`崩溃` 相关的提交：2016 年 71 次，**2017 年 190 次**；`内存` 22 次。功能堆到一定程度后，一年里近十分之一的提交在修崩溃。

### 一种很特别的 commit message 文化

**625 条** message 用了统一模板（占全部 non-merge commit 的 15%）：

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

这是典型的"提测/发版流程"痕迹：提交信息不只是给自己看的，是给测试和发布用的。到了 2018 年"all in" 之后，这个模板就再也没出现过——**流程随团队一起消失了**。

### 2017-11-08，停

最后几笔停在 11-08 下午。之后 **294 天**没有任何提交。

## 幕间：294 天

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

三条主线 `master`、`3.2.1_dev`、`3.2.1_opt` 全部停在同一周。没有说明，没有 tag。

## 第三幕 2018-2020：all in 与断续的复活

### 2018-08-30 00:43 的 "all in"

`zhouxiaoyi <zhouxiaoyi@mac.pro>`，message 只有两个词，**1409 个文件变更**，tree 里 2972 个文件，父提交是 2017-11-02 的 `master`。

这条 commit 是分水岭：
- 对老仓库（A）来说，它是"另一条线"的起点
- 对新仓库（B）来说，它是 root commit
- 对 2026 年的整合来说，它是必须被 graft 的那一个点

同一秒，还有一条内容相同的 `1c68c5b` 在另一条历史里——两条历史的差异只有 message 末尾的换行。

### 2019：一笔

272 天后，`Weity` 提交 "new version"。全年 2 笔。

### 2020：隐私合规的开端

447 天后（2020-08-18），`Weity` 升级 targetSdk；8 月底 `Jeffrey` 连续提交：改 gradle 配置（compileSdk 26）、加隐私协议弹窗、改第三方注册失败提示。全年 21 笔。

然后 10-12 月又停了 **318 天**。

## 第四幕 2021-2023：一个人守住的合规长尾

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

中间的空档：351 天（2021-09 → 2022-09）、161 天（2022-10 → 2023-03）。

这六年不到 50 笔提交，`Jeffrey`（`caiwenqiang@nme.cn` / `caiwenqiang2010@163.com`，归并后 885 笔，跨越 2016–2023）几乎一个人完成。

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

**2023-05-07 20:42，最后一笔。之后 1258 天空白。**

## 第五幕 2026：复活与归一

**2026-10-17，一天之内发生的事：**

| 时间 | 作者 | 内容 |
|---|---|---|
| 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）diverge。

九年前那个 "first commit." 重新变成所有 branch 的起点。

## 尾声：现在的 repo

- **4682** 个 commit（**4241** non-merge + **441** merge）
- **46** 个 tag：`v1.6.6`（2016-09）… `v3.2.2`（2017-11），外加 5 个 lightweight tag
- **37** 个 branch：30 条 2016–2017 版本线 + 3 条 `v2/*` + `master`/`target35`/`gitlab_backup_top`
- HEAD 上 **3008** 个文件：1665 个 `.java`、1 个 `.kt`、650 个 `.xml`、588 个 `.png`
- **一个 root commit** `53835d5`

## 细节与彩蛋

- **133 条** message 长度 ≤ 4 个字，出现最多的是"优化代码"，其次"优化布局""修改文案""增加注释"
- **4 次**回滚（`回滚` / `revert`），其中 2017-01-11 那次动了 2345 个文件
- 有一条 message 叫 **"未push的commit"**，动了 1798 个文件
- 分支名 `3.1.4_msg_puss2` 把 push 拼错，一直没改
- `f_jenkins` 说明有人认真试过 CI，但 repo 至今没有任何 pipeline 配置
- 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 归并，推断）

| 推断身份 | commits | 活跃期 | 说明 |
|---|---:|---|---|
| chaohui / shichaohui | **1145** | 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 收尾与文档 |

**归并依据**：同一邮箱的不同 name（`zhouxiaoyi/zxy/zhouxy`）、同一 name 的不同邮箱（`chaohui` 的 paoword/nme/qq）。
无法确证的不强行归并。

## 一句话总结

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