# 薪尽自然凉 · 安装说明（v6.9.1 / versionCode 41）

> 版本：**v6.9.1**（`versionName=6.9.1`，`versionCode=41`）
> 包名：`com.koudouma.attendance`
> 应用名：薪尽自然凉
> 交付包：`薪尽自然凉-v6.9.1-41.apk`（492,606 字节）

---

## 一、系统要求

| 项 | 值 |
|---|---|
| 最低系统 | **Android 7.0（API 24）** |
| 目标系统 | **Android 13（API 33）** |
| 兼容范围 | Android API 24 ~ 最新 |
| 签名方案 | v1 + v2 + v3（侧载安装无需 v4） |
| 权限 | WRITE_EXTERNAL_STORAGE（仅 Android 9 及以下，用于导出）+ READ_CALENDAR（只读）。Android 10 及以上导出走系统媒体库，**不需要任何权限** |
| 网络 | **零联网权限**（含 INTERNET 在内一条都没申请）。长图与二维码都是本机画出来的像素 |

---

## 二、安装步骤

1. 将 `薪尽自然凉-v6.9.1-41.apk` 拷贝到手机（U 盘 / 数据线 / 浏览器下载后本地打开均可）。
2. 在文件管理器中点击该 APK。
3. 若系统提示「未知来源 / 安装未知应用」，进入 **设置 → 应用 → 特殊应用权限 → 安装未知应用**，为本文件管理器放行后重试。
4. 点击「安装」，等待完成，桌面出现「薪尽自然凉」图标即安装成功。

> **校验安装包完整性（可选，推荐）**：安装前可对 APK 计算 SHA256，与交付包内
> `SHA256SUMS.txt` 比对一致，方可安装。
> ```bash
> sha256sum "薪尽自然凉-v6.9.1-41.apk"
> # 8f69f2e10c335849fb84abd79876c81de5dd64ae03ef8d644c428397a4edef27
> ```

---

## 三、升级用户必读：与 v6.0.2 起同一正式签名

本版使用与 **v6.0.2 ~ v6.9.0 完全相同的正式发布密钥**签名
（证书主题 `CN=Koudouma Attendance Release, OU=Release Engineering, ...`，
SHA-256 指纹 `DA:01:96:33:0F:27:87:43:59:60:E0:A8:A0:40:C1:E7:6B:9D:8F:DC:7D:D4:32:6C:08:0F:91:03:FE:67:FE:D9`）。

因此：

- **若手机里已装 v6.0.2 ~ v6.9.0 正式版**：直接点击新 APK **覆盖升级即可，全部考勤与薪资数据自动保留**，无需卸载。本版只动「分享图片」与「导出 PDF」两个动作。
- **若手机里装的是更早的开发版（dev 签名）**：Android 要求同签名才能覆盖，
  需**先卸载旧版再安装本版**；本应用 `allowBackup=false`，卸载会清空本地数据，
  请先在旧版「设置 → 导出」中导出 CSV 留档。
- **全新安装**：直接安装即可。此后升级均使用同一正式密钥，可持续覆盖升级、数据保留。

---

## 四、本版更新要点（v6.9.1 · 分享图片修好，PDF 改从卷首语起）

- **周报 / 月报的「分享图片」不再提示「获取资源失败」**：根因是图片写在应用内部目录、
  分享用的内容提供器却去外部目录找同一个文件名 —— 提供器打不开这张图，微信就报取资源失败。
  现在**读写走同一个目录入口**（应用私有 Pictures 目录，拿不到时才回落内部目录），
  这条口径全 App 只有一处，海报页与报表页共用。
- **导出 PDF 也从卷首语起**：周报 / 月报的 PDF 不再带页首的标题卡、主数字卡、档位单选和屏上按钮，
  起点与分享图**完全同一个锚点**（记住的是卷首语那张卡，不是第几块），一路带到正文末尾含页底二维码。
  月报同样从卷首语裁，卷首语之前的静态数据表不进 PDF。
- **旧图会被收走**：清空临时图片时现在两个候选目录都扫，
  所以从 v6.8.0 ~ v6.9.0 升级上来不会在内部目录里留下一堆没人认领的 PNG。
- **上一版的长图行为照旧**：一整张、8,000,000 像素预算、超预算等比缩、
  缩到 0.5 以下不交糊图而是退回分页且**带着同一个裁切起点**拆。
- **屏上排版一个像素都没动**：改的只是「出图与出 PDF 时从哪里起画」。
- **零逻辑变更**：金额一律 `long` 分、三锚点（1,078.80 / 109.47 / 10,039.73）、`DB_VERSION 6`、
  权限仍 2 条（**没有任何新增权限**）、`res/layout` 仍 15 个、零图片/字体素材、零第三方依赖、
  不联网不上传；`build.sh` 一行未改。打码口径也没动：每次导出 / 分享仍先问「打码后导出 / 原样导出」，
  出图结束在 `finally` 里复位。

> 完整清单见应用内「帮助中心 → 更新日志」。

---

## 五、数据存储与隐私

- 全部考勤、工资、设置数据仅存于**本机 App 私有目录**，不上传、不联网。
- **本版没有出现任何网络行为**：出图与出 PDF 全程在本机完成，页面上那枚二维码只是画给你手机浏览器看的格子，App 自身既不访问它，也不知道有没有人扫。
- **导出的 PDF 落到系统 Download 目录**，由你自己决定要不要转发；分享用的临时图片写在 App 私有目录（本版起读写同源），每次分享前先清空上一批，不会在手机上越积越多。
- 分享通过系统内容提供器（content URI）逐包授权，只有你在那一刻选中的目标应用能读到这张图，**不会把文件路径整个交出去**。
- 分享图与导出 PDF **默认不脱敏**，但每次点导出 / 分享都会先弹「打码后导出 / 原样导出」的选择，**每次都问、不替你记选择**；打码只动金额与百分比，天数、工时、日期与图表形状全部保留。
- `allowBackup=false`：数据不允许通过 ADB 备份 / 云备份被整体导出。
- **卸载即删除**全部本地数据，请自行导出 CSV 留档。
- `READ_CALENDAR` **只读**：仅在设置页「日历同步（只读）」被显式开启后读取本机日历的全天事件日期与标题，
  用于识别法定节假日与调休上班日；绝不申请写入权限，数据不出本机；拒绝或授权缺失时静默降级为内置节假日表。
- 报表文案与海报文案的随机种子同样只存本机 `SharedPreferences`，不存在任何服务端。

---

## 六、本版交付档案

| 文件 | 说明 |
|---|---|
| `薪尽自然凉-v6.9.1-41.apk` | 正式签名安装包（v1+v2+v3），492,606 字节 |
| `MD5SUMS.txt` | `8439e9c0d369c479ac8774a716cc8b1f` |
| `SHA256SUMS.txt` | `8f69f2e10c335849fb84abd79876c81de5dd64ae03ef8d644c428397a4edef27` |
| `安装说明.md` | 本文件 |

构建链：Windows 便携链 `scripts/win_build.sh`（aapt2 compile 88 res → link `--java` → javac 70 源（69 个 `.java` + `R.java`）/ 288 class → d8 → package → zipalign，产出 474,383 字节 aligned.apk）→ `scripts/win_sign.sh 6.9.1 41`（正式重签 + 四路验签 + 归档）。Linux 侧 `scripts/resign.sh` + `build.sh` 契约不变。
验签四路全过：apksig（v1/v2/v3）→ `ApkVerifyTool` API 21~33 R1~R4 全 true → `verify_apk.py` 13/13 → `jarsigner -verify` verified，且证书指纹与 v6.0.2 起一致。
QA：全量回归 **3,228 条断言通过 / 1 条已知平台误报**（`V30RenameTest` E01 的 Windows 路径分隔符误报，按惯例不改代码）。本版新增 `V691ExportPathTest` 16 条：A 段用 `Context` 桩**真跑**分享图的落盘与清理（断言「写进去的目录」与「提供器读出来的目录」是同一个、外部目录不可用时两处同回落、目录不存在先建、清理两处都扫且不误伤海报 PNG）；B 段是接线与红线闸门（PDF 透传裁切起点、`exportPdf` 用同一个 `shareStartTop`、无裁切的三参重载已删净、长图画不下时退回分页仍带同一 `fromTop`、打码复位仍在 `finally` 里）。另迁移 2 条既有断言：`V69ShareLongImageTest` F01 改为「起点 0 即整篇全量」、G07 反转为「PDF 与分享图共用卷首语锚点」—— 这是按用户要求反转的红线，不是弱化；`V681QrWiringTest` A04 版本锁随发布回合从 `6.9.0 / 40` 迁到 `6.9.1 / 41`。

**尚未在真机验证的项**（如实标注）：本机无 adb 设备 / 模拟器，也无微信客户端，因此「手机上点分享真的把图发出去了」「PDF 打开后第一页就是卷首语」这两条本版的**目标行为**只在桌面 JVM 的 `Context`/图形桩与源码闸门层面验证过，未经实机走查。已验证的是：编译与打包、签名与四路验签、包内版本与更新日志资源真实性、分享图读写落点同源的**真实落盘**、PDF 裁切起点的透传链路、长图与分页的几何与回收（沿 v6.9.0）。
