DriftLedger/docs/android-build-guide.md
fengmengqi 76a5853ab6 feat: 重构渠道模型与管道架构,全面升级 UI 主题和报表功能
核心重构 — 去除 channel 字段,引入 sourceAccount 模型:
- 从 ImportedEvent、Rule、EnhancedRule、OcrRule 等接口中彻底移除 channel 字段
- rules.ts 中 resolveChannelAccount → resolveSourceAccount,规则匹配与账户解析不再依赖渠道概念
- dedup.ts 重写去重逻辑:从基于渠道匹配改为基于交易对手(counterparty)匹配,支持相同金额/交易对手/时间窗口的多级置信度判断
- transferRecognizer.ts 增加资产负债表账户校验,确保转账双方均为 Assets/Liabilities 类账户
- 全局替换影响:types、rules、ocr、adapters、adapters-migrations、所有服务层和测试
新增基础设施:
- domain/constants.ts — 统一常量定义(支付包名、截图关键词、去重参数、方向检测函数 detectDirection()),消除 OCR/SMS/截图等模块的重复定义
- domain/channelConfig.ts — 渠道配置系统(支付宝/微信/银行),支持按包名和名称查找
- domain/pipelineSingleton.ts — 共享 BillPipeline 单例,解决 importStore/automationStore 的互斥锁共享问题
- domain/transactionBuilder.ts — 统一交易构建入口 buildAndSaveTransaction(),同时服务手动录入和无障碍监听
OCR 增强:
- 新增账单详情页解析(parseDetailPageBill),支持支付宝/微信详情页结构化提取
- checkIsDetailPage() 识别详情页特征词,防止误提取(如"消费1次"被误读为金额)
- 金额正则支持千分位逗号分隔,商户名正则改用 lookahead 边界匹配
- 时间解析支持中文格式(年月日)和跨年推断
- OcrProcessor 新增详情页路由,跳过 Layer 1 规则匹配
UI 全面升级:
- 主题重设计:accent 色从绿色改为靛蓝(#4F46E5),深色模式适配 OLED 纯黑,引入 Quicksand/Caveat 字体
- 新增 commonStyles.ts 统一 chip/input/modal 等通用样式
- 首页 Bento 网格布局:净资产英雄卡片 + 定期账单/月度统计并排展示
- 报表新增周报标签页,月报整合日历视图(支持点击查看当日交易明细)
- TrendLine 图表从 View 条形图重写为 SVG 贝塞尔曲线
- CategoryPicker 从水平滚动改为 4 列网格 + emoji 图标
- Button/Card 增加 press 缩放动画
管道与自动化改进:
- automationPipeline.ts 新增 handleIncomingBillEvent() 实时账单处理(悬浮账单卡片 + 前台 Alert 确认)
- 新增无障碍文本直解析 parseAndProcessAccessibilityTexts(),微信/支付宝详情页绕过 OCR
- rules.ts 新增智能还款检测(花呗/信用卡还款自动路由)和退款视为收入处理
- metadataStore 默认规则精简为 6 条通用规则,移除约 20 条个人化硬编码规则
存储与同步:
- storePersistence.ts 原子写入 + 崩溃恢复 + 重试机制
- 备份升级到 v2 格式,包含 settings 和 metadata
- 同步路径统一从 mobile.bean 改为 main.bean
- _layout.tsx 启动时自动迁移旧 mobile.bean 到 main.bean
其他:
- 删除独立日历页面,功能合并到报表月报标签
- i18n 清理:移除渠道相关翻译,新增 50+ 翻译键
- docs/android-build-guide.md 重写为 APK 体积优化指南
- 新增 design-system/beancount-mobile/MASTER.md 设计系统文档
- 测试全面更新覆盖以上所有变更
2026-07-18 18:02:45 +08:00

4.5 KiB
Raw Permalink Blame History

Android 安装包打包与体积优化指南 (Android Build Guide)

在引入机器学习引擎ONNX Runtime及 React Native 新架构后,本项目的原生 C/C++ SO 库体积大幅增加。为避免将无意义的冗余架构包打包给最终手机用户,本项目对 Android 构建配置进行了专项体积优化。

本篇指南将为您介绍项目中的打包机制、优化细节,以及如何通过命令行进行差异化编译。


1. 体积优化核心原理

1.1 ABI 分包 (ABI Splits)

在 Android 系统的 build.gradle 中,我们启用了分包编译:

splits {
    abi {
        enable true
        reset()
        include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
        universalApk true
    }
}
  • 效果:系统会为每种 CPU 架构单独输出一个体积小巧的 APK并额外保留一个兼容所有架构的通用包Universal APK
  • 独立包大小~35MB - ~40MB
  • 通用包大小~140MB - ~170MB

1.2 默认编译架构限制

我们在 android/gradle.properties 中指定了默认编译目标为:

reactNativeArchitectures=arm64-v8a
  • 为什么只包含 arm64-v8a:目前 99% 的主流现代 Android 实体机都是 64 位 ARM 架构(arm64-v8a)。在进行日常分发与本地 Release 测试时,默认只编译 arm64-v8a能够省去编译另外 3 个架构的机器指令时间,编译速度提升 3~4 倍,且输出的包体最小。

1.3 Expo 持续原生生成 (Config Plugin) 的自动应用

Important

由于 android/ 目录被 Git 忽略,不要直接手动在其他设备上提交原生配置变更。 本项目已编写了专门的本地 Config Pluginsize-optimization。 当在新设备上重新 git clone 项目后,运行以下指令即可自动拉起 Config Plugin 并在重新生成的 android/ 目录中完美注入上述所有的体积优化配置ABI 分包、默认单架构编译):

npx expo prebuild --platform android

2. 编译命令与打包指令

请在项目的根目录(若已在 android/ 目录中则不需要前缀 cd android)执行以下指令:

2.1 本地测试/实体分发(仅编译 arm64-v8a最快最推荐

直接运行默认编译,会使用 gradle.properties 中配置 of arm64-v8a

# 在 Windows Powershell 下执行:
$env:JAVA_HOME="C:\Program Files\Java\jdk-21"
$env:ANDROID_HOME="C:\Users\fmq\AppData\Local\Android\Sdk"
cd android
.\gradlew.bat :app:assembleRelease --offline --no-daemon

编译完成后,可在以下路径找到适合真机安装的轻量版 APK约 37MB

  • android\app\build\outputs\apk\release\app-arm64-v8a-release.apk

2.2 全量分包发布(适合多设备兼容测试/全网发布)

若需要同时生成适配所有手机架构的独立 APK 以及一个通用包,可以在命令行中通过参数覆盖默认架构

$env:JAVA_HOME="C:\Program Files\Java\jdk-21"
$env:ANDROID_HOME="C:\Users\fmq\AppData\Local\Android\Sdk"
cd android
.\gradlew.bat :app:assembleRelease -PreactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 --offline --no-daemon

编译完成后,在输出目录会产生 5 个文件:

  1. app-arm64-v8a-release.apk (推荐绝大多数真机,约 37MB)
  2. app-armeabi-v7a-release.apk (适合极少数老旧真机)
  3. app-x86-release.apk (适合 32 位模拟器)
  4. app-x86_64-release.apk (适合 64 位模拟器)
  5. app-universal-release.apk (包含上述全部架构的通用胖包,约 140MB)

2.3 模拟器专用打包 (x86_64)

若需要直接打包在 Windows/macOS 的 x86_64 原生安卓模拟器上测试:

.\gradlew.bat :app:assembleRelease -PreactNativeArchitectures=x86_64 --offline --no-daemon

即可秒级编译出专门针对模拟器的 app-x86_64-release.apk


3. 高级优化项Proguard/R8 与混淆 (选填)

如需进一步将独立包体积压缩到 25MB 左右,可以考虑在 gradle.properties 中开启混淆并做裁剪防御。

  1. gradle.properties 中添加:
    android.enableMinifyInReleaseBuilds=true
    android.enableShrinkResourcesInReleaseBuilds=true
    
  2. 注意:由于引入了 ONNX Runtime 动态调用,如果运行崩溃,需要在 android/app/proguard-rules.pro 中加入如下混淆保留白名单:
    -keep class com.microsoft.onnxruntime.** { *; }
    -dontwarn com.microsoft.onnxruntime.**