纯 Android + Jetpack Compose 日历应用,支持农历/节气/节日、个人班次排期,提供月/周/年三种视图。
- 流畅的视图切换 —— 月视图、周视图、年视图三种模式,拖拽手势驱动月↔周折叠,弹簧动画自动吸附
- 无限滑动分页 —— 基于
Int.MAX_VALUE的虚拟分页,前后无边界翻页 - 完整中式日历 —— 公历 + 农历 + 二十四节气 + 传统节日,ISO 8601 周起始(周一)
- 个人排班周期 —— 自定义工作/休息循环,与公共节假日独立
- Material 3 设计 —— 动态配色,深色模式
- 双账号朋友圈 —— 小白与小鸡毛各自拥有主页、头像和封面,支持图文发布、点赞、评论回复、私密动态、搜索、相册与互动消息;通过独立后端同步
- Kotlin 2.3 · Jetpack Compose · Material 3
kotlinx-datetime处理所有日期逻辑tyme4kt提供农历、节气与传统节日sketch渲染动画 WebP- 三模块:
:core(UI + 逻辑) ·:app(薄壳) ·:macrobenchmark(Baseline Profile / Startup Profile 生成) - 朋友圈后端:
server/,Rust Axum + PostgreSQL,独立于 Gradle 构建
启动、依赖版本、接口、备份和集成测试见 server/README.md。应用使用当前构建的默认后端地址,也可在「工具」页底部的服务器设置中修改(朋友圈与经期记录共用),然后直接选择小白或小鸡毛,不使用密码。两个账号的主页和通知独立,公开动态可互相查看、点赞和评论。
日历功能保持离线可用。旧版本本机朋友圈数据保留原样,不会自动上传或猜测作者归属。朋友圈写入以服务器确认成功为准,失败保留草稿供重试。
朋友圈动态、评论、头像和封面统一支持最多 50 MiB 的静态 JPEG、PNG、WebP 图片。选图时自动生成上传副本:普通照片最长边 2560 像素、目标约 2 MiB,长截图优先保留文字清晰度,透明图片保留透明通道;较小图片可直接上传。相册原图保持原样,草稿保存处理结果及已上传图片供失败重试。处理过程中显示进度,动态图与无法处理的图片提示重新选择。
本机开发可以先在一个终端运行 make server,然后在另一个终端执行:
make emulator # 启动或复用 Pixel_10:GPU/CPU 硬件加速、4 核、2 GiB 内存
make install # 编译并安装 Debug APK启动脚本需要 adb、emulator 和 python3 位于 PATH 中。make emulator 在独立会话中启动模拟器,等待系统启动完成,清除模拟器代理,并自动转发本机 8088 端口及检查后端健康状态。服务器设置可选「ADB 转发」即 http://127.0.0.1:8088;默认的 http://10.0.2.2:8088 在 Android 17 上首次访问时会申请附近设备权限。可用 AVD=名称、BACKEND_PORT=端口 覆盖默认值,启动日志位于 logs/emulator.log。
朋友圈默认地址由 core/build.gradle.kts 的 BuildConfig.MOMENTS_DEFAULT_URL 在构建时注入:
| 构建类型 | 默认服务地址 |
|---|---|
Debug(make build / make install) |
http://10.0.2.2:8088 |
Release(make / make release) |
https://yaya.rua.plus |
| trace / benchmark | https://yaya.rua.plus,沿用 Release 配置 |
手动修改时填写服务根地址,不带 /api/v1。Debug 与 Release 分别保存手动地址,trace / benchmark 共用 Release 设置;覆盖安装时会读取当前环境的设置,没有保存值时使用构建默认地址。首次升级会将旧 HTTP 地址迁入 Debug 设置;旧 HTTPS 地址不再覆盖默认值,Release 首次使用线上地址,之后仍可在「工具 → 服务器」修改。服务器卡片会检查连接并显示朋友圈、经期同步是否可用;局域网地址在卡片里申请本地网络权限。公网地址不申请本地网络权限,Release 只接受 HTTPS;本机的 HTTP 与 ADB 转发用于 Debug 调试。
# Debug
./gradlew :app:assembleDebug # 构建 debug APK
./gradlew :app:installDebug # 安装 debug APK 到设备
# Release
./gradlew :app:assembleRelease # 构建 release APK
./gradlew :app:installBenchmark # 安装 benchmark(release + 可调试)APK
# 测试
./gradlew :core:testDebugUnitTest # 运行全部测试
./gradlew :core:testDebugUnitTest --tests "plus.rua.project.ui.CalendarUtilsTest" # 运行单个测试
# Baseline Profile / Startup Profile(需要连接设备)
./gradlew :macrobenchmark:updateBaselineProfile # 生成并复制两份 Profile 到 :core
./gradlew :macrobenchmark:connectedBenchmarkAndroidTest # 仅运行基准测试
# 性能 Profiling(需要连接设备)
./scripts/profile.sh # 默认 8 秒
./scripts/profile.sh 15 # 自定义时长构建产物位于 app/build/outputs/apk/<variant>/ 目录。
Android 和朋友圈后端分别维护版本与 changelog:
| 组件 | 版本文件 | 更新记录 | 发布 tag | 产物 |
|---|---|---|---|---|
| Android | gradle.properties 的 app.version.base |
CHANGELOG.md |
vX.Y.Z |
APK |
| 后端 | server/Cargo.toml 的 package.version |
server/CHANGELOG.md |
server-vX.Y.Z |
GHCR amd64/arm64 镜像 |
Android 发布前更新基础版本、递增 app/build.gradle.kts 中的 versionCode,并在根目录 changelog 整理对应版本的更新记录。执行 python3 scripts/release.py android vX.Y.Z 校验,提交并推送代码,然后仅推送对应 tag:
git push origin main
git tag vX.Y.Z
git push origin vX.Y.ZAndroid CI 校验 tag、版本与 changelog 后运行格式检查、单元测试和 APK 构建,自动创建 YaYa vX.Y.Z Release,并使用该版本的 changelog 作为正文。日常 Android CI 跳过仅涉及 server/ 或后端工作流的修改。
后端发布流程见 server/README.md,后端 tag 只触发后端发布。日常 Server CI 检查后端、发布脚本和相关构建配置;任一组件发版都无需同步提升另一个组件的版本号。
线条小狗表情包来自 https://www.douban.com/group/topic/264788645/?_i=9181692phrDzjR,9241256phrDzjR