1. 项目架构与核心依赖:模块划分、Gradle 依赖配置、最小 SDK 版本要求

1.1 模块化架构概览

本项目采用多模块 Android 工程结构,将蓝牙通信、数据缓存、网络上传和 UI 分离为独立 Gradle 模块。模块划分遵循“关注点分离”原则:bluetooth 模块只处理设备发现、连接和原始数据读写;data 模块负责离线缓存与数据清洗;network 模块封装 OkHttp 上传逻辑;app 模块作为宿主,绑定 UI 与业务调度。

设计意图:模块化可以单独替换蓝牙协议栈(如 BLE 经典蓝牙)或上传策略(如 MQTT 替换 OkHttp),不影响其他层。每个模块编译成 AAR,支持并行构建和独立测试。

1.2 模块职责表

模块名称 Gradle 路径 核心职责
:bluetooth ./modules/bluetooth/ 蓝牙设备扫描、GATT 连接、特征值读写、原始 Byte 流采集
:data ./modules/data/ 离线 SQLite 缓存、数据校验、脱敏、队列管理与重试逻辑
:network ./modules/network/ OkHttp 请求封装、 管理、多文件分片上传、网络状态监听
:app ./app/ UI 层(Activity/Fragment)、ViewModel 调度、DI 注入、模块协调
依赖方向::app → :data → :bluetooth 和 :app → :data → :network。避免模块间循环依赖。:bluetooth 和 :network 不直接通信,所有数据统一经过 :data 模块中转。

1.3 模块架构流程图

下图展示了数据从蓝牙采集到云端上传的全链路模块协作关系:

模块架构与数据流 Bluetooth 模块 设备扫描 · 连接 · 特征读写 Data 模块 离线缓存 · 校验 · 队列管理 Network 模块 OkHttp 上传 · 管理 App 模块 UI · ViewModel · DI 容器 云端服务器 REST API · 数据存储 原始数据 已缓存数据 HTTPS 上传 状态控制 通过 Data 模块协调 ⚠ 关键约束 Network 模块不直接访问蓝牙模块;Data 模块是唯一的数据中枢,保证离线与在线数据一致性。

1.4 核心 Gradle 依赖配置

以下为项目顶层 build.gradle.kts(或其他模块公共依赖)的关键片段。注意使用版本目录(libs.versions.toml)统一管理版本号。

// 顶层 build.gradle.kts(项目级)
plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.android.library) apply false
    alias(libs.plugins.kotlin.android) apply false
    alias(libs.plugins.kotlin.kapt) apply false
}

// modules/data/build.gradle.kts
plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.kotlin.android)
}

android {
    namespace = "com.example.data"
    compileSdk = 34
    defaultConfig {
        minSdk = 26
        targetSdk = 34
    }
}

dependencies {
    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.room.runtime)
    implementation(libs.androidx.room.ktx)
    kapt(libs.androidx.room.compiler)
    implementation(project(":bluetooth"))
}

// modules/network/build.gradle.kts 中的 OkHttp 相关
dependencies {
    implementation(libs.squareup.okhttp3)
    implementation(libs.squareup.okhttp3.logging.interceptor)
    implementation(libs.squareup.okio)
    implementation(libs.google.gson)
}

// modules/app/build.gradle.kts
dependencies {
    implementation(project(":data"))
    implementation(project(":bluetooth"))
    implementation(project(":network"))
    implementation(libs.androidx.lifecycle.viewmodel.ktx)
}
⚠ 版本陷阱:OkHttp 4.x 基于 Kotlin 协程(内部使用 Okio 3.x),与 RxJava 混用时注意添加 implementation("com.squareup.okhttp3:okhttp-sse:4.12.0") 避免同步回调冲突。建议统一使用 4.12.0 或更高版本。

1.5 最小 SDK 版本要求

项目设定 minSdk = 26(Android 8.0),理由如下:

  • 蓝牙 BLE 稳定性:Android 8.0 修复了大量蓝牙扫描 SCAN_FAILED_INTERNAL_ERROR 问题,且支持 SCAN_RESULT_TRANSPORT_LE 回调。
  • OkHttp 最小要求:OkHttp 4.x 官方要求 minSdk 21,但 libs.versions.toml 中 okio = "3.9.0" 对 minSdk 26 以上有性能优化。
  • Room 离线缓存:Room 2.6+ 使用 SQLite 3.x FTS5 等特性,minSdk 26 可避免旧版本数据库兼容问题。
  • HTTPS 与 TLS:Android 8.0 内置 System Trust Store 更新机制,减少 javax.net.ssl.SSLHandshakeException 证书问题。
// 在 gradle/libs.versions.toml 中定义
[versions]
agp = "8.5.2"
kotlin = "1.9.22"
okhttp = "4.12.0"
okio = "3.9.0"
room = "2.6.1"
gson = "2.10.1"

[libraries]
squareup-okhttp3 = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }
squareup-okhttp3-logging-interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "okhttp" }
squareup-okio = { group = "com.squareup.okio", name = "okio", version.ref = "okio" }