一个简洁、现代的倒数日 / 纪念日 Android 应用,用 Kotlin + Jetpack Compose 全新编写。
记录每一个重要的日子 —— 生日、纪念日、考试、旅行……倒数或累计,陪伴你的时光。
- 事件管理:新增、编辑、删除事件,支持名称、日期、描述和配图
- 倒数/累计:自动计算距今天数,未来事件显示「还有 N 天」,过去事件显示「已 N 天」,今天显示「就是今天」
- 置顶 & 搜索:重要事件一键置顶,顶部搜索框实时筛选
- 时间线节点:为每个事件添加多个时间线节点,用竖线串联按时间顺序展示,记录每个重要时刻
- 图片自适应:事件配图按方向智能布局 —— 横版铺满顶部、竖版左侧竖条、方框顶部居中
- 主题模式:跟随系统 / 浅色 / 深色三种模式,切换即时生效
- 动态取色:Android 12+ 支持从壁纸动态提取主题色
- Material 3:采用最新 Material Design 3 设计语言,大圆角卡片、柔和层次
- 治愈系图标:像素风格的小太阳,圆润脸庞配柔和光芒
| 分类 | 技术 |
|---|---|
| 语言 | Kotlin |
| UI | Jetpack Compose + Material 3 |
| 架构 | 单 Activity + Navigation Compose + MVVM |
| 数据库 | Room (KSP) |
| 异步 | Kotlin Coroutines + Flow + StateFlow |
| 图片加载 | Coil |
| 图片选择 | ActivityResultContracts.PickVisualMedia(系统 Photo Picker) |
| 构建 | Gradle Kotlin DSL + Version Catalog |
| CI/CD | 构建机本地脚本(R8 混淆,仅 arm64-v8a) |
app/src/main/java/com/example/countdowndays/
├── CountdownApp.kt # Application + 依赖容器
├── MainActivity.kt # 入口 Activity,主题驱动
├── data/ # 数据层
│ ├── EventEntity.kt # 事件表
│ ├── TimelineNodeEntity.kt # 时间线节点表
│ ├── EventWithNodes.kt # 事件 + 节点关联
│ ├── EventDao.kt # Room DAO
│ ├── AppDatabase.kt # 数据库
│ └── EventRepository.kt # 仓库
├── util/ # 工具类
│ ├── DateUtils.kt # 日期计算
│ ├── ImageStorage.kt # 图片存储
│ └── PrefsManager.kt # 主题偏好
└── ui/ # UI 层
├── theme/ # 主题、配色、字体
├── navigation/ # 路由导航
├── common/ # 公共组件(EventCard、ViewModel 工厂)
├── main/ # 主页
├── editevent/ # 新增/编辑事件
├── detail/ # 事件详情 + 时间线
├── settings/ # 设置
└── about/ # 关于
需要 JDK 17 + Android SDK 36。
# 编译 Release APK
./gradlew assembleRelease
# 产物路径
app/build/outputs/apk/release/app-release.apk需要 JDK 17 + Android SDK 36。
# 编译 Release APK(开启 R8 + 资源压缩,只打包 arm64-v8a)
./gradlew assembleRelease
# 产物路径
app/build/outputs/apk/release/app-release.apkRelease 包使用独立签名密钥,签名信息从仓库根目录的 keystore.properties 读取(该文件不入库):
storeFile=/absolute/path/to/days-release.jks
storePassword=******
keyAlias=days
keyPassword=******没有该文件时会自动回退到 debug 签名,方便任意机器验证构建,但这种包不能用于正式发布。
发布不再依赖 GitHub Actions,由构建机本地脚本完成(构建 → 校验 → 打 tag → 上传 Release):
./scripts/release.sh # 构建并发布
./scripts/release.sh --build-only # 只构建,产物在 dist/
./scripts/release.sh --draft # 发布为 draft脚本会强制:
- release 构建(R8 混淆 + 资源压缩),不会误发 debug 包
- 只保留
arm64-v8a单一 ABI,产物名days-v<version>-arm64-v8a.apk - ABI 与签名校验通过才上传
- Release Notes 从 CHANGELOG.md 自动提取对应版本内容
发布前请先提升 app/build.gradle.kts 中的 versionCode 与 versionName。
最新版本请前往 Releases 页面下载 APK 安装。
v2.3 起改用独立签名密钥,与旧版本签名不一致,覆盖安装会失败,需要先卸载旧版本。
- 作者:高翔
- 联系方式:gx13598483383