给两个人记录每次旅行开支的原生安卓应用。全中文、离线、本地保存,不需要注册。
从 1.1.0 开始以 MIT 许可证公开源码。源码、项目文档和应用图标见 LICENSE;第三方组件保持各自许可证,见 THIRD_PARTY_NOTICES.md。图标公开分发与修改已获用户确认。项目部署至 GitHub 的步骤见 上传指南。
本地安装包放在 dist/trip-cent-1.3.0.apk;GitHub 发布后从仓库 Releases 下载,安装包不提交到源码历史。支持 Android 8.0 及以上。这是使用调试签名的可安装测试版,未上架应用商店;自行构建的 APK 可能具有不同签名,无法覆盖安装此前交付的版本。
- 将 APK 发送到安卓手机,打开并允许对应文件管理器安装此应用。
- 在“旅行”页点击“新建旅行”,填写目的地及起止日期。同一目的地每次出行分别创建。
- 打开旅行,点击“记一笔”,输入金额,选择分类及付款来源:我、女朋友、小荷包。
- “开支分析”查看分类环形饼图和付款来源条形图,可按付款来源筛选分类。
- “对比”选择至少两次旅行,切换总开支和日均开支。
- “设置”可修改两人的称呼,导出完整 JSON 备份、恢复备份或导出中文 CSV。
直接覆盖安装 1.3.0,保留原有数据,不要先卸载。包名和签名保持一致;数据库升级至版本3,提供版本1、2的保留数据迁移。
- “记一笔”新增“支出/收入”,收入可记录彩票奖金等,并选择收款人;旅行列表、详情和所有旅行汇总显示收入与净花费。收入不增加总开支,不参与支出分析、付款来源统计或日均;净花费 = 总开支 − 收入。
- “+ 添加分类”右侧新增红色“删除分类”。选择分类、二次确认后,所有旅行中该分类的历史账单自动归入“其他”,金额、收支类型和日均开关不变。支持删除内置与自定义分类,“其他”保留;已删除的分类可重新添加。
- 底部圆角导航栏悬浮在页面上,移除外围米白色底板,支持浅色和深色模式。
- 缓存旅行统计、账单排序和封面位图,将数据整理放到后台,减少滑动时的重复计算与解码。
- 完整 JSON 备份升级至格式3,包含收入与已删除分类,继续兼容1.0.0、1.1.0和1.2.0的备份;CSV 新增“收支类型”列。
直接覆盖安装 1.2.0,保留现有旅行、账单、称呼、自定义分类、封面和外观设置,不要先卸载。包名与签名保持一致,数据库结构不变。
- “旅行/对比/设置”可左右滑动,也可点击圆角底部导航栏,切换时有滑动动画;旅行详情的“账单明细/开支分析”也支持滑动。
- 对比选择至少两次旅行后,图表展开;取消到不足两次时收起;增减旅行时图表高度平滑调整。
- 账单可按消费时间或消费金额排序,可选升序/降序;同金额按消费时间沿同一方向排列。
- 点击“旅行”页的“一起走过的旅程”查看所有旅行的分类和付款来源分析,包含所有账单,可按来源筛选分类。
- 桌面小部件改为更细的圆角胶囊,无应用图标,显示开始日期最新的旅行名称。显示和点击目标与旅行列表排序一致;编辑、删除或恢复旅行后同步更新,没有旅行时点击新建。
直接覆盖安装 1.1.0,保留 1.0.0 的旅行、账单和称呼;不要先卸载。应用名称固定为 trip cent,图标使用提供的蓝色“旅”字与牵手爱心图片。保留原应用包名和签名以支持覆盖升级。
- 在“记一笔”点“+ 添加分类”,输入名称并保存。分类在所有旅行中可选,重启后保留,完整备份也会保存。最多100个自定义分类,每个最多20个字符。
- 新建或编辑旅行时可添加、更换、移除封面照片。照片保存压缩副本到应用内,列表和详情展示,删除相册原图后封面仍可用;完整JSON备份包含封面。
- “设置 → 外观”可选跟随系统、浅色、深色,选择长期保留。
- 选择“特殊支出”默认关闭“计入日均计算”。所有分类均可逐笔打开或关闭;总开支、分类分析和付款统计仍包含所有账单。1.0.0 的旧账单升级后继续计入日均,需自行编辑想排除的账单。
- 长按安卓桌面,从小部件列表添加“trip cent · 记一笔”。默认横向2格、纵向1格,实际尺寸受桌面启动器影响。1.1.0 点击最近查看的旅行;1.2.0 已改为始终使用开始日期最新的旅行。没有旅行时先创建旅行。
- 兼容恢复1.0.0的JSON备份;新版完整备份上限50MB,CSV新增“计入日均”列。
- 每次旅行有独立编号。列表按开始日期倒序,同日按创建时间倒序;账单默认按消费时间倒序,同一时间按创建时间倒序;支持时间或金额升降序,金额相同时按消费时间排序。
- 金额使用整数“分”保存,人民币显示两位小数。每笔金额必须大于零,最多一千万元。
- 天数包含开始和结束当天,同日往返为一天。日均为勾选“计入日均计算”的支出总额除以天数,显示时四舍五入到两位小数。收入单独汇总,不影响支出分析和日均;净花费可为负数。
- 预订机票等早于出发日期的账单也可归属旅行,不改变旅行天数。
- 小荷包是独立第三种付款来源,只计一次;不做存取流水、余额、预算、AA或欠款结算。
- 更改旅行日期会自动重算日均;删除旅行会连同账单删除,并事先要求确认。
数据保存在手机应用私有 Room 数据库中,无网络权限。卸载会清除数据,请定期把 JSON 备份保存到手机以外的位置。
JSON 为版本3的中文字段格式,包含旅行、账单、收入标记、称呼、自定义分类、已删除分类、外观设置和封面照片,金额单位为分;付款或收款来源使用固定值“本人/伴侣/小荷包”,个人自定义称呼单独保存,保证改名后历史账单统计正确。兼容格式1、2,旧账单默认是支出。恢复前校验文件大小、格式版本、日期、金额、已注册分类、付款来源、重复编号及旅行归属,确认后在数据库事务内替换所有数据,失败会回滚。
CSV 使用带 BOM 的 UTF-8 编码,中文表头、人民币元金额,兼容 Excel;包含旅行编号和日期以区分重复目的地。用户文本中的引号、逗号与换行会正确转义,并处理公式开头字符。CSV 仅用于分析,不能恢复。
技术栈:Kotlin 2.0.21、Jetpack Compose、Material 3、Room 2.6.1、Android Gradle Plugin 8.9.2、Gradle 8.11.1。JDK 17或21;Android SDK 35、Build Tools 35.0.0。
Android Studio 中打开项目根目录,设置 JDK 和 SDK 路径后同步。命令行可运行:
.\scripts\build.ps1
# 已下载依赖时离线构建
.\scripts\build.ps1 -Offline
# 连接测试用模拟器时运行设备测试(仅连接测试用模拟器,会清理其中的测试应用数据)
.\scripts\build.ps1 -Offline -ConnectedTests脚本优先使用当前项目 .tools 中已准备的工具;其他电脑可以使用 Gradle wrapper 和 ANDROID_HOME 或 Android Studio 生成的 local.properties。
主要模块:Models.kt 负责输入验证及统计;Database.kt 负责本地持久化;Backup.kt 负责中文导出和备份校验;TravelViewModel.kt 连接数据库与页面;TravelUi.kt 提供全部中文页面。
- JVM 测试覆盖自然日、跨月跨年及闰年、金额精度、日均舍入、排序、三种来源汇总、预订账单、备份往返及无效备份、中文 CSV。
- 设备测试覆盖 Room 更新、级联删除、事务回滚,以及创建旅行、小荷包记账、账单修改、图表、重复目的地和日均对比。
- Android Lint 检查代码和资源;依赖版本固定,不自动追随新版本。
实际执行结果及截图见 docs/验收记录.md。