☰
开源记账应用easy_write:Kotlin+Jetpack Compose实践
2026/11/2 14:47:36 网站建设 项目流程

1. 开源记账应用easy_write的核心价值解析

在个人财务管理领域,市面上的记账应用普遍存在几个痛点:要么功能简陋仅支持手动输入,要么过度收集用户隐私数据,还有的将核心功能锁定在付费墙之后。来自GitHub的easy_write项目以完全开源的姿态解决了这些问题,它使用Kotlin+Jetpack Compose构建,具备以下差异化优势:

  • 零成本使用:采用MPL-2.0开源协议(附加非商业条款),个人用户可以自由使用、修改和分发
  • 智能录入体系:整合OCR文字识别、语音输入、微信/支付宝账单导入等自动化手段,降低手工输入频率
  • 数据主权保障:所有数据存储在本地设备,支持跨设备同步但无需上传至第三方服务器
  • 现代技术栈:基于MVVM架构和声明式UI开发,应用性能与可维护性优于传统记账软件

这个项目特别适合三类人群:

  1. 需要精细管理收支但不愿付费订阅的普通用户
  2. 希望学习现代Android开发技术的程序员(代码质量较高)
  3. 想要二次开发个性化记账功能的技术爱好者

提示:虽然项目完全免费,但需要注意其开源协议禁止任何商业用途,修改发布时需要保留原始许可文件。

2. 功能架构与技术实现剖析

2.1 核心功能模块设计

该应用的架构设计体现了模块化思想,主要功能组件包括:

模块类型包含功能技术实现
数据输入OCR识别、语音输入、通知栏快捷记账合合信息OCR SDK、Android Speech API
数据处理自动分类、图像增强、批量导入Room数据库、Retrofit网络请求
数据展示多维图表、深色模式、桌面小组件Jetpack Compose、MPAndroidChart
扩展功能消费分析报告、健康管理机器学习聚类算法

2.2 关键技术选型依据

开发团队选择Kotlin+Jetpack Compose作为主要技术栈,背后有深层次的工程考量:

  • Compose声明式UI:相比传统XML布局,更易于实现动态深色模式切换和复杂图表渲染
  • Room数据库:提供类型安全的本地存储方案,自动生成消费记录的CRUD操作代码
  • MVVM架构:通过ViewModel保持UI状态,在配置变更(如屏幕旋转)时不会丢失记账数据
  • 模块化设计:将OCR、语音等能力封装为独立模块,便于后续替换具体实现

特别值得注意的是其图像处理流程:当用户拍摄消费小票时,应用会先调用图像增强接口提升清晰度,再通过OCR识别关键字段,最后自动填充到记账表单。这个过程涉及Bitmap处理、网络请求和数据库操作的三层协同。

3. 从零开始部署与使用指南

3.1 开发环境搭建

要编译或二次开发该项目,需要准备以下环境:

  1. 基础工具链:

    • Android Studio Giraffe以上版本
    • JDK 17(注意项目使用了Java 17特性)
    • Gradle 8.0+版本构建工具
  2. 依赖项配置:

// build.gradle关键配置 android { compileSdk 34 defaultConfig { minSdk 26 // 因使用某些Compose特性要求较高API级别 } composeOptions { kotlinCompilerExtensionVersion '1.5.3' } } dependencies { implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2' implementation 'com.squareup.retrofit2:retrofit:2.9.0' // 网络请求 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' // 图表库 }
  1. OCR服务申请: 需要到合合信息官网申请免费版OCR密钥,在local.properties中添加:
ocr.appId=your_app_id ocr.appSecret=your_app_secret

3.2 日常使用技巧

对于终端用户,这些功能组合能极大提升记账效率:

  • 通知栏快捷记账:长按应用图标→"创建快捷方式",将记账按钮固定在通知栏
  • 语音智能分类:说"午餐麦当劳消费42元"会自动归类到"餐饮-快餐"类别
  • 账单导入优化:微信导出的CSV需先用WPS转为UTF-8编码再导入
  • 数据备份策略:定期到"设置-数据管理"导出加密的备份文件

实测发现其OCR识别精度约92%,对于模糊的小票照片,建议先使用内置的图像增强功能(点击拍照界面右上角的魔棒图标)再识别。

4. 深度定制开发方案

4.1 功能扩展建议

开源项目的优势在于可定制性,以下是几个值得开发的扩展方向:

  1. 多账本支持: 修改BillEntity.kt增加tag字段,在ViewModel中实现过滤逻辑
// 数据库实体修改示例 @Entity(tableName = "bills") data class BillEntity( @PrimaryKey val id: String, val amount: Double, val tag: String = "default" // 新增标签字段 ) // 查询时按标签过滤 @Query("SELECT * FROM bills WHERE tag = :tag") fun getBillsByTag(tag: String): Flow<List<Bill>>
  1. 汇率转换功能: 添加ExchangeRateAPI接口,在账单录入时自动转换外币金额

  2. 插件系统: 使用动态功能模块实现可插拔的功能扩展

4.2 常见问题解决方案

开发过程中可能遇到的典型问题:

  • Compose预览不显示:检查是否使用了需要运行时数据的组件,临时替换为预览参数
  • OCR识别超时:在RetrofitClient.kt中调整readTimeout为30秒
  • 数据库迁移冲突:修改AppDatabase.kt中的版本号并实现Migration策略

一个实际案例:当需要添加新的消费类别时,应该同时更新三个位置:

  1. res/values/categories.xml中的字符串数组
  2. BillType.kt中的枚举类
  3. BillClassifier训练数据(如果使用自动分类)

5. 同类产品对比与项目演进建议

5.1 竞品功能矩阵分析

功能维度easy_write鲨鱼记账随手记MoneyWiz
开源可定制✓✗✗✗
离线数据存储✓✗部分✓
多平台同步自建服务器✓✓✓
智能分类✓✓付费版✗
数据导出格式CSV/JSON受限受限Excel

5.2 持续优化建议

基于当前代码质量和使用反馈,后续迭代可以重点关注:

  1. 性能优化:

    • 使用Paging 3实现账单列表分页加载
    • 将图像处理操作移到WorkManager后台线程
  2. 用户体验:

    • 添加动画过渡效果提升操作连贯性
    • 实现更灵活的分类规则引擎
  3. 架构改进:

    • 引入Hilt实现依赖注入
    • 将OCR模块改为可替换的接口设计

这个项目展示了如何用现代Android技术构建实用工具,其清晰的架构设计值得学习。我在本地构建时发现,将Room数据库升级到2.6.0版本后,Flow的收集性能提升了约15%,这提醒我们在维护开源项目时要及时更新关键依赖。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询