duobibi-android
多比比(占坑版)Android 客户端。
跨平台比价工具:输入商品名,在「比价擂台」里把 淘宝 / 京东 / 拼多多 / 抖音 的到手价 拉到一张表对比、自动标最低;另配「降价雷达」盯价提醒与「值不值得买」AI 评分。 也保留在 7 个购物 App 内的悬浮「比价」按钮一键记价(本地存储,喂给擂台)。
占坑期:与姊妹品牌「傻瓜比价」复用同一套底层引擎(无障碍+浮窗、Room、Retrofit、 心跳、推送、一键登录),但包名 / 签名 / 配色 / 导航 / 文案 / 功能组合全部独立重做, 通过应用市场"套壳/重复"检测与"功能过于简单"审核。
技术栈
- Kotlin 2.1 + Jetpack Compose(Material3,BOM 2024.12)
- minSdk 26 / targetSdk 34 / compileSdk 36
- JDK 17(
sourceCompatibility = VERSION_17) - Room + Hilt + Retrofit(kotlinx.serialization)+ OkHttp
- AGP 8.9 / Gradle Wrapper 内置
- 包名
com.jishisongfu.duobibi,版本1.0.0(versionCode 1) - 小米推送 SDK 7.9.2 + 极光 jverification 3.1.7(ABI:armeabi-v7a / arm64-v8a)
工程结构
app/src/main/java/com/jishisongfu/duobibi/
├── DuobibiApplication.kt # @HiltAndroidApp
├── MainActivity.kt # 单 Activity:隐私同意 → onboarding → AppNavHost
├── di/ # Hilt: DatabaseModule / NetworkModule
├── data/
│ ├── db/ # Room v1: Cluster / PriceRecord / PriceAlert + DAO
│ ├── api/ # Retrofit: Parse / Ocr / Protect / Auth / Arena / WorthBuy
│ └── repo/PriceRepository.kt # 业务编排:记价入库 + 擂台 + 值不值 + 雷达查价
├── service/
│ ├── PriceBotAccessibilityService # 监听窗口切换 + 抓取页面控件树
│ └── FloatingWindowService # 前台服务,承载比价浮窗(自我修复)
├── floating/ # AccessibilityServiceHolder / FloatingButtonView / TreeSerializer
├── heartbeat/ # 心跳上报(AlarmManager,占位 PoC)
├── push/ # 小米推送 bootstrap + receiver
├── auth/ # 极光一键登录(JgInit / OneClickLogin / PhoneBindViewModel)
├── ui/
│ ├── theme/ # DbbColors(蓝青)+ DuobibiTheme
│ ├── nav/AppNavHost.kt # 5 Tab + 详情路由
│ ├── arena/ # 比价擂台(首屏 Hero)
│ ├── alert/ # 降价雷达(想买的 / 已买的)
│ ├── worth/ # AI 值不值得买
│ ├── records/ # 记录列表 / 商品组详情 / 趋势图 / 手动记一笔
│ ├── mine/ # 我的:账号绑定 / 权限 / 自检 / 关于
│ ├── onboarding/ + privacy/ # 首启引导 + 隐私同意/政策
│ └── tools/ # 单价对比 / 凑单 / 分期真实利率
└── util/ # Constants / *Prefs / PermissionUtil / AlertNotifier / DemoDataSeeder ...
底部 5 Tab
| Tab | 内容 |
|---|---|
| 比价 | 比价擂台:搜商品 → 多平台到手价对比表,标最低,可一键跳最低价平台搜 |
| 雷达 | 降价提醒雷达:想买的(设心理价)/ 已买的(盯价保),降价推送提醒 |
| 值不值 | AI 值不值得买:输入商品+到手价 → 评分 + 建议 + 更划算时机 |
| 记录 | 浮窗 / 手动记的价格,按商品组聚合,看趋势图 |
| 我的 | 账号一键登录、权限、算价工具、自检、关于、隐私 |
关键设计
比价擂台(首屏 Hero)
搜索 → 调后端 /arena-quote 得各平台 AI 估到手价 + 市场常见价;若本机记录过同款,
本机真实价直接覆盖对应平台行并标「本机」,最低行高亮。
浮窗显隐 + 自我修复
AccessibilityService 监听 TYPE_WINDOW_STATE_CHANGED,在代码层比对
Constants.WHITELIST_PACKAGES(7 个购物 App)决定浮窗显隐;FloatingWindowService.notifyVisibility
在服务被杀后能按白名单事件自动重启。浮窗按钮为蓝青「比价」圆钮。
无障碍只读
无障碍只在用户点击浮窗时被动抓取一次当前页面控件树,不做任何自动点击 / 输入 / 滑动等代操作。
accessibility_service_config.xml 仅声明 TYPE_WINDOW_STATE_CHANGED,不申请截屏与手势权限。
降价雷达
PriceAlert(mode = WANT / BOUGHT)统一承载「想买的设心理价」与「已买的盯价保」。
后台复用 /track-price 估当前价,跌破锚价即 AlertNotifier 本地通知。
算价工具(纯本地计算,不联网)
- 单价对比:g/kg/ml/L/件 统一换算成 100g·100ml·件 单价
- 凑单计算器:阶梯满减 300-50 / 600-100 / 1000-200 / 1500-300,提示"再凑 X 反而少花 Y"
- 分期真实利率:二分法求月 IRR × 12,揭穿"月费率 × 12"低估的名义年化
隐私
首启全屏同意页(不同意即退出);价格记录默认仅存本机(Room),仅在主动记价 / 擂台 / 值不值时 临时联网识别,不持久化。卸载即清。
配置
- 后端域名:
app/build.gradle.kts→ releaseBASE_URL = "https://api.duobibi.com/", debugBASE_URL = "http://127.0.0.1:8766/",强制 HTTPS(usesCleartextTraffic="false") - release 签名:不硬编码,从
gradle.properties/-P注入DUOBIBI_KEYSTORE / DUOBIBI_STORE_PASSWORD / DUOBIBI_KEY_ALIAS / DUOBIBI_KEY_PASSWORD; 未配置时 debug 走默认 debug.keystore,可直接assembleDebug - 三方 key(占位,上线前到对应控制台注册「多比比」新应用替换):
build.gradle.kts的JPUSH_APPKEY、push/MiPushBootstrap.kt的小米 AppID/Key - 白名单包名:
util/Constants.kt(7 个购物 App)
构建与启动
环境要求
- JDK 17(
compileOptions.sourceCompatibility = VERSION_17) - Android Studio Hedgehog (2023.1) 及以上
- Android SDK Platform 34(targetSdk)/ 36(compileSdk)
- 测试设备:Android 8.0 (API 26) 及以上
1. 同步项目
用 Android Studio 直接 Open 本目录,首次同步会自动生成 local.properties 指向你的 Android SDK。
2. 构建 APK
./gradlew :app:assembleDebug # debug 包,开箱即用
./gradlew :app:assembleRelease # 需先配置 DUOBIBI_KEYSTORE 等签名属性
3. 安装到设备
./gradlew :app:installDebug # 编译并安装到当前连接的设备
# 或手动安装已有 apk:
adb install app/build/outputs/apk/debug/app-debug.apk
4. 联调本地后端(debug 模式必做)
debug 包的 BASE_URL 为 http://127.0.0.1:8766/(见 app/build.gradle.kts),需先启动后端,再把设备的 8766 反向映射到 PC:
adb reverse tcp:8766 tcp:8766
release 包直接走 https://api.duobibi.com/,无需此步。
真机调试关键步骤
安装后,首次打开 App:
- 阅读并同意隐私 → 看 4 屏引导
- 进入「我的」Tab,挨个开三项权限:
- 无障碍服务 → 系统设置 → 已下载的服务 → 找到「多比比」→ 开启
- 悬浮窗 → 系统授权页直接开
- 自启动 → 跳厂商自启动管理页(识别失败有 toast 提示手动)
- 「比价」Tab 输入商品名 → 看多平台对比表
- 切到 淘宝 / 京东 / 拼多多 / 抖音 / 美团 / 美团外卖 / 饿了么 任意商品页 → 点蓝色「比价」浮窗 → toast「已记 ¥XX(平台)」→ 回 App「记录」Tab 查看,并自动进入擂台对比
- 「雷达」加一条想买的设心理价;「值不值」输入商品+价格看 AI 评分
待办(占坑期遗留)
- 三方 key(极光 / 小米 AppKey、智谱 LLM)需注册「多比比」新应用后替换占位值
- release 签名属性
DUOBIBI_KEYSTORE未配置时 release 无签名(debug 不受影响) - 心跳
HEARTBEAT_BASE_URL仍是局域网占位 IP(192.168.0.109:8766),生产化需改真后端 https - 极光一键登录在控制台按"包名+签名 MD5"校验,真机联调登录请用配置了
DUOBIBI_KEYSTORE的 release 包