运行环境与SDK版本
本文档说明 Android-JL_Health 健康 SDK 示例工程(HealthAide)的运行环境要求、SDK 版本(V1.14.0)、Android 构建工具链版本以及全部依赖库清单,帮助开发者在接入前完成环境准备与版本核对。
Purpose and Scope
本页面向运行环境与 SDK 版本这一主题,涵盖以下内容:
- 操作系统 / 硬件 / 开发平台的最低要求(源自 README.md)
- 仓库内示例工程对应的 SDK 版本号(
V1.14.0)与应用版本号(V1.1.0) - Android Gradle 构建工具链版本:AGP
8.10.0、compileSdk 36、buildToolsVersion 36.0.0、minSdk 21、targetSdk 35 - JL SDK 核心 AAR 库清单(
JL_Watch、jl_rcsp、jl_bluetooth_connect等)及第三方依赖版本 - 构建环境相关的注意事项(NDK ABI、仓库镜像、多 dex 等)
以下内容属于其他页面的主题,不在本页展开:具体接入步骤请参见"快速开始";工程目录结构参见"工程结构";鉴权与参数配置参见"配置说明"。
Overview
Android-JL_Health 是珠海市杰理科技股份有限公司为蓝牙穿戴类产品提供的健康数据与设备管理开发平台,基于 RCSP 协议(远程控制系统协议) 实现。仓库以示例工程形式交付,其中:
code/app/HealthAide_V1.1.0_SDK_V1.14.0/—— 主示例应用 HealthAide,应用版本1.1.0,内置 SDKV1.14.0code/tool/WatchTestTool_V0.9.0_SDK_V1.14.0/—— 配套测试工具,同样基于 SDKV1.14.0
SDK 以 AAR 文件形式提供(放置在工程 libs/ 目录下),通过 implementation fileTree(include: ['*.aar'], dir: 'libs') 引入。运行 SDK 需要 Android 5.1+(支持 BLE)的设备,以及内置支持 RCSP 功能的杰理芯片固件(如 AC701N、AC707N、AC695N 等)。
版本选择上,示例工程刻意将 compileSdk(36)与 targetSdk(35)分离:compileSdk 决定编译时可用 API 面,targetSdk 决定运行时系统行为兼容模式,这是 Android 生态中常见的"新编译、旧行为"策略,避免高 targetSdk 的系统行为变更(如后台限制、分区存储)影响现有业务。
Architecture
下图展示 HealthAide 示例应用的运行环境分层:从设备层(BLE + RCSP 固件)到操作系统层、应用层、JL SDK 层与第三方依赖,完整呈现一条数据从穿戴设备到应用的链路。
flowchart TD
subgraph sg_Device["设备层 (BLE)"]
Device1["AC701N / AC707N / AC695N 穿戴设备"]
Device2["RCSP 协议固件"]
end
subgraph sg_OS["操作系统层"]
Android51["Android 5.1+ (API 21+)"]
BLE["BLE 蓝牙栈"]
end
subgraph sg_App["应用层 (HealthAide V1.1.0)"]
App["com.jieli.healthaide"]
UI["Activity / Fragment / ViewModel"]
Biz["业务逻辑 (健康/运动/消息/OTA)"]
end
subgraph sg_SDK["JL SDK 层 (V1.14.0)"]
WatchSDK["JL_Watch SDK (核心)"]
BTConnect["jl_bluetooth_connect"]
RCSP["jl_rcsp (协议)"]
OTA["jl_bt_ota"]
HTTP["jl_health_http"]
end
subgraph sg_Third["第三方依赖"]
Retrofit["Retrofit / OkHttp"]
Room["Room 数据库"]
Glide["Glide 图片加载"]
MQTT["Eclipse Paho MQTT"]
end
Device1 -->|"BLE 广播/连接"| BLE
Device2 -->|"RCSP 指令"| Device1
BLE --> Android51
Android51 --> App
App --> UI
App --> Biz
Biz --> WatchSDK
WatchSDK --> BTConnect
WatchSDK --> RCSP
WatchSDK --> OTA
WatchSDK --> HTTP
BTConnect --> BLE
Biz --> Retrofit
Biz --> Room
Biz --> Glide
Biz --> MQTT
各层职责说明:
| 层次 | 组件 | 职责 |
|---|---|---|
| 设备层 | AC701N / AC707N / AC695N | 杰理蓝牙穿戴设备,固件内置 RCSP 协议,通过 BLE 与手机通信 |
| 操作系统层 | Android 5.1+ / BLE 栈 | 提供 BLE GATT 通信能力,是 SDK 与设备交互的物理通道 |
| 应用层 | com.jieli.healthaide | 示例业务代码,展示健康、运动、消息、OTA 等功能的调用方式 |
| SDK 层 | JL_Watch / jl_rcsp / jl_bluetooth_connect 等 | 封装 RCSP 协议与 BLE 连接细节,向应用提供面向业务的 API |
| 第三方依赖 | Retrofit / Room / Glide / MQTT | 支撑网络请求、本地持久化、图片加载与消息推送等通用能力 |
设计意图:SDK 层将"BLE 连接细节 + RCSP 协议编解码"与"业务 API"解耦,应用层开发者只需面向 JL_Watch 的业务接口编程,无需关心协议字节序与 GATT 服务;而协议层(jl_rcsp)与连接层(jl_bluetooth_connect)的拆分,则允许 OTA、文件传输等高带宽场景独立演进。
SDK 版本与工程目录
仓库以"应用版本 + SDK 版本"命名示例工程目录,直接反映版本配套关系:
| 工程目录 | 应用版本 | SDK 版本 | 用途 |
|---|---|---|---|
code/app/HealthAide_V1.1.0_SDK_V1.14.0/ | 1.1.0(versionCode 909) | V1.14.0 | 主示例应用 HealthAide |
code/tool/WatchTestTool_V0.9.0_SDK_V1.14.0/ | 0.9.0 | V1.14.0 | 设备调试测试工具 |
settings.gradle 将 HealthAide 定义为由 app 与 wheelview 两个模块组成的多模块工程,wheelview 是仓库内自带的滚轮选择器组件,被 app 以 implementation project(path: ':wheelview') 方式引用:
Source: settings.gradle
include ':wheelview'
include ':app'
rootProject.name = "HealthAide"
构建工具链版本
顶层 build.gradle 声明 Android Gradle Plugin 版本为 8.10.0,并配置了覆盖 mavenCentral、google、jitpack 以及国内阿里云镜像的仓库集合。仓库镜像(aliyun)的引入是为了在国内网络环境下加速依赖下载,这是面向国内开发者的关键可运维性设计:
Source: build.gradle
buildscript {
repositories {
mavenCentral()
//国内镜像
maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url 'https://maven.aliyun.com/repository/apache-snapshotse' }
google()
maven { url 'https://maven.google.com' }
maven { url 'https://jitpack.io' }
}
dependencies {
classpath 'com.android.tools.build:gradle:8.10.0'
}
}
app 模块的 Android 配置是环境要求的核心:
Source: app/build.gradle
android {
namespace 'com.jieli.healthaide'
compileSdk 36
buildToolsVersion '36.0.0'
defaultConfig {
applicationId "com.jieli.healthaide"
minSdk 21
targetSdk 35
versionCode 909
versionName "1.1.0"
multiDexEnabled true
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
}
构建工具链关系如下图所示:
flowchart LR
subgraph sg_Env["开发环境"]
AS["Android Studio (建议最新版)"]
JDK["JDK (source/target 1.8)"]
Gradle["Gradle + AGP 8.10.0"]
end
subgraph sg_Sdk["Android SDK"]
Compile["compileSdk 36 / BuildTools 36.0.0"]
Min["minSdk 21 (Android 5.0)"]
Target["targetSdk 35"]
end
subgraph sg_Mod["工程模块"]
App["app (com.jieli.healthaide)"]
Wheel["wheelview"]
end
AS --> Gradle
JDK --> Gradle
Gradle --> Compile
Compile --> Min
Compile --> Target
Gradle --> App
Gradle --> Wheel
关键点解读:
- compileSdk 36 / targetSdk 35 分离:编译使用最新 API 面,运行时保持 targetSdk 35 的兼容行为,降低系统行为变更风险。
- minSdk 21(Android 5.0):与 README 宣称的"Android 5.1+"基本对齐(BLE 功能完整可用从 5.1 起);
multiDexEnabled true表明方法数已超过 64K 单 dex 上限,需 multidex 支持。 - ABI 过滤:仅保留
armeabi-v7a与arm64-v8a,覆盖绝大多数 Android 手机,同时显著减小 APK 体积——这是穿戴类 APP 面向存量 32 位设备与主流 64 位设备的务实取舍。 - Java 8 兼容:
sourceCompatibility/targetCompatibility VERSION_1_8保证低版本 Android 设备上的字节码兼容。
JL SDK 核心 AAR 依赖
README 明确列出 SDK 以 AAR 形式交付的 8 个核心库,xxx 为版本号(本仓库配套 V1.14.0):
| AAR 库 | 职责 |
|---|---|
JL_Watch_Vxxx-release.aar | 杰理健康 SDK 核心库,提供穿戴设备主要功能 |
jl_bluetooth_connect_Vxxx-release.aar | 蓝牙连接相关 |
jl_bt_ota_Vxxx-release.aar | OTA 升级相关 |
jl_rcsp_Vxxx-release.aar | RCSP 基础协议相关 |
jl_health_http_Vxxx-release.aar | 杰理健康服务器相关 |
BmpConvert_Vxxx-release.aar | 图像转换(BMP/JPEG/PNG 等) |
GifConvert_Vxxx-release.aar | GIF 动态图片转换 |
jl_audio_decode_Vxxx-release.aar | Opus 和 Speex 音频解码 |
接入方式:将 AAR 放入模块 libs/ 目录,并在 build.gradle 声明 implementation fileTree(include: ['*.aar'], dir: 'libs') 与 implementation fileTree(include: ['*.jar'], dir: 'libs'),同时通过 sourceSets.main.jniLibs.srcDirs = ['libs'] 声明 so 库目录(见 app/build.gradle)。
第三方依赖清单
app/build.gradle 的 dependencies 块(见 app/build.gradle)按功能域整理如下:
| 功能域 | 依赖 | 版本 |
|---|---|---|
| 基础 UI | androidx.appcompat | 1.4.2 |
| 基础 UI | com.google.android.material:material | 1.6.1 |
| 布局 | androidx.constraintlayout | 2.1.4 |
| 架构组件 | lifecycle-livedata-ktx / lifecycle-viewmodel-ktx | 2.5.1 |
| 导航 | navigation-fragment / navigation-ui | 2.3.5 |
| 列表 | recyclerview / cardview | 1.2.1 / 1.0.0 |
| 列表适配器 | BaseRecyclerViewAdapterHelper | 3.0.4 |
| 刷新布局 | SmartRefreshLayout kernel | 2.0.3 |
| 图表 | MPAndroidChart | v3.1.0 |
| 本地持久化 | androidx.room:room-runtime / room-compiler | 2.3.0 |
| 图片加载 | Glide | 4.11.0 |
| 网络 | Retrofit + converter-gson | 3.0.0 |
| 网络 | OkHttp + logging-interceptor | 4.10.0 |
| JSON | Gson | 2.13.1 |
| JSON | fastjson | 1.2.83 |
| 消息推送 | Eclipse Paho MQTT | 1.1.0 |
| 动画 | Lottie | 5.2.0 |
| 扫码 | WeChatQRCode (opencv + wechat-qrcode) | 2.4.0 |
| 权限 | PermissionsDispatcher | 4.9.2 |
| 支付 | 支付宝 SDK (alipaysdk-android) | +@aar |
| 日期选择 | com.haibin:calendarview | 3.7.1 |
| 号码解析 | libphonenumber-android | 8.12.21 |
| 工具 | pinyin4j | 2.5.0 |
| 工具 | commons-text | 1.9 |
| 控件 | circleimageview / SwipeDelMenuLayout / SwitchButton | 3.1.0 / V1.2.5 / 2.0.0 |
| 测试 | junit / androidx.test.ext:junit / espresso-core | 4.+ / 1.1.3 / 3.4.0 |
设计说明:网络层选用 Retrofit + OkHttp 支撑健康数据上报与杰理健康服务器交互(jl_health_http);MQTT 用于设备消息的实时通道;Room 负责本地健康数据缓存。这些第三方库与 JL SDK 之间无强耦合,可按需替换。
Core Flow:从环境就绪到数据同步
下图展示在满足运行环境后,一次典型的"设备连接 → RCSP 数据交互 → 健康数据上报"完整链路。理解这条链路有助于定位环境问题:例如连接失败往往发生在 jl_bluetooth_connect 与 BLE 栈之间,而协议解析异常则集中在 jl_rcsp 层。
sequenceDiagram
participant App as HealthAide 应用
participant SDK as JL_Watch SDK (V1.14.0)
participant BT as jl_bluetooth_connect
participant Device as 穿戴设备 (RCSP 固件)
participant Svr as jl_health_http 服务器
App->>SDK: 初始化 SDK / 注册回调
SDK->>BT: 开始扫描 / 发起 BLE 连接
BT->>Device: BLE GATT 连接
Device-->>BT: 连接成功
BT-->>SDK: 设备上线通知
SDK->>Device: RCSP 命令 (健康/运动/OTA/表盘)
Device-->>SDK: RCSP 应答与数据回调
SDK-->>App: 业务回调 onNotify / 数据同步
App->>Svr: 健康数据上报 (Retrofit/HTTP)
各阶段与运行环境的对应关系:
- 初始化:应用启动时初始化
JL_WatchSDK 并注册回调,要求minSdk 21以上环境; - BLE 连接:
jl_bluetooth_connect通过系统 BLE 栈与设备建立 GATT 连接,依赖 Android 5.1+ 的稳定 BLE 实现; - 协议交互:连接建立后,SDK 通过
jl_rcsp层封装 RCSP 指令与设备交互,指令集覆盖健康数据、运动、消息、OTA、表盘、闹钟、文件传输等(详见 README 功能表); - 数据上报:业务层将同步到的健康数据经
jl_health_http/ Retrofit 上报杰理健康服务器,或经 MQTT 通道推送实时消息。
硬件与协议环境
| 类别 | 要求 | 说明 |
|---|---|---|
| 操作系统 | Android 5.1+ | 支持 BLE 功能 |
| 硬件要求 | 支持 RCSP 功能的 SDK | AC701N、AC707N、AC695N 等芯片方案 |
| 开发平台 | Android Studio | 建议使用最新版(与 AGP 8.10.0 兼容) |
| 语言支持 | Java / Kotlin | SDK 提供完整 API 支持,示例以 Java 为主 |
Source: README.md
RCSP(远程控制系统协议)是杰理私有协议,承载设备发现、配对、命令下发与数据上报。SDK 将协议细节封装在 jl_rcsp AAR 内,因此固件必须与 SDK 版本配套:仓库以 SDK_V1.14.0 命名工程,暗示固件/协议版本与 SDK 1.14.0 匹配的穿戴设备为预期目标。若接入时使用不同版本的 JL_Watch AAR,需要同步核对固件协议版本,避免命令字不兼容导致的静默失败。
Usage Examples
示例 1:添加 SDK AAR 依赖
将 JL_Watch_V1.14.0-release.aar 等 AAR 放入模块 libs/ 目录后,在 build.gradle 中声明依赖与 so 库路径:
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation fileTree(include: ['*.aar'], dir: 'libs')
}
android {
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
Sources:
示例 2:按渠道注入敏感配置(BuildConfig)
讯飞语音相关密钥通过 local.properties 读取并注入 BuildConfig,未配置时回退为空字符串,保证 CI/新环境可无密钥编译:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
buildConfigField("String", "IFLYTEK_APP_ID", getProps("IFLYTEK_APP_ID"))
buildConfigField("String", "IFLYTEK_API_KEY", getProps("IFLYTEK_API_KEY"))
buildConfigField("String", "IFLYTEK_API_SECRET", getProps("IFLYTEK_API_SECRET"))
}
debug {
signingConfig signingConfigs.debug
buildConfigField("String", "IFLYTEK_APP_ID", getProps("IFLYTEK_APP_ID"))
buildConfigField("String", "IFLYTEK_API_KEY", getProps("IFLYTEK_API_KEY"))
buildConfigField("String", "IFLYTEK_API_SECRET", getProps("IFLYTEK_API_SECRET"))
}
}
Source: app/build.gradle
def getProps(String propName) {
def propsFile = rootProject.file('local.properties')
if (propsFile.exists()) {
def props = new Properties()
props.load(new FileInputStream(propsFile))
return props.getProperty(propName, "\"\"")
} else {
return "\"\""
}
}
Source: app/build.gradle
示例 3:Room 数据库 schema 导出配置
通过 annotationProcessorOptions 指定 Room schema 输出目录,便于版本迁移时维护数据库结构变更记录:
defaultConfig {
//指定room.schemaLocation生成的文件路径
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
}
Source: app/build.gradle
Configuration Options
以下为 app 模块 build.gradle 中与环境、版本相关的全部关键配置项:
| 配置项 | 类型 | 值 | 说明 |
|---|---|---|---|
namespace | string | com.jieli.healthaide | 模块命名空间(AGP 8 要求) |
compileSdk | int | 36 | 编译使用的 Android API 版本 |
buildToolsVersion | string | 36.0.0 | Build Tools 版本 |
applicationId | string | com.jieli.healthaide | 应用包名 |
minSdk | int | 21 | 最低支持 Android 5.0(BLE 完整可用建议 5.1+) |
targetSdk | int | 35 | 目标 API 版本,决定运行时兼容行为 |
versionCode | int | 909 | 内部版本号 |
versionName | string | 1.1.0 | 对外版本名 |
multiDexEnabled | boolean | true | 开启 multidex 以突破 64K 方法数限制 |
ndk.abiFilters | list | armeabi-v7a, arm64-v8a | 支持的 so 架构 |
sourceCompatibility | JavaVersion | VERSION_1_8 | Java 源码兼容级别 |
targetCompatibility | JavaVersion | VERSION_1_8 | 字节码目标版本 |
buildFeatures.dataBinding | boolean | true | 启用 DataBinding |
buildFeatures.viewBinding | boolean | true | 启用 ViewBinding |
buildFeatures.buildConfig | boolean | true | 生成 BuildConfig 字段 |
signingConfigs.debug | file/pwd | debug.keystore / android | Debug 签名配置 |
lintOptions.checkReleaseBuilds | boolean | false | Release 构建跳过 lint 检查 |
lintOptions.abortOnError | boolean | false | lint 报错不中断构建 |
IFLYTEK_APP_ID/API_KEY/API_SECRET | string | 来自 local.properties | 讯飞密钥,缺失时为空串 |
| AGP 版本 | string | 8.10.0 | Android Gradle Plugin(顶层 build.gradle) |
环境变量与本地配置约定:
local.properties:存放IFLYTEK_APP_ID、IFLYTEK_API_KEY、IFLYTEK_API_SECRET(不入库),getProps()读取不到时回退空字符串;resValue:user_agreement_url、app_privacy_policy、icp_number在构建期注入资源(见 app/build.gradle);- 仓库镜像:阿里云镜像与
xiaomi-passport、oss.sonatype.org快照仓库已预置,网络受限环境无需额外配置。
失败模式、边界与注意事项
- minSdk 21 vs Android 5.1:
minSdk 21允许安装到 Android 5.0 设备,但 README 要求 Android 5.1+ 以保证 BLE 功能稳定。在 5.0 设备上可能出现扫描/连接异常,属预期边界。 - targetSdk 35 行为变更:若开发者擅自将
targetSdk提升至 36,可能触发 Android 16 的隐私与后台限制(如前台服务类型、BLE 扫描后台限制),导致原有连接逻辑失败;保持targetSdk 35是当前工程的兼容性约定。 - 固件与 SDK 版本配套:RCSP 为私有协议,命令字随版本演进。混用不同版本的
jl_rcsp与设备固件会造成"连接成功但命令无响应/数据解析错误"的静默失败,排查时应优先核对固件协议版本与SDK_V1.14.0的一致性。 - ABI 缺失:
abiFilters仅含armeabi-v7a/arm64-v8a,x86 模拟器(如部分 Android Studio 模拟器镜像)上运行会因缺少 so 库崩溃;建议使用 ARM 镜像或真机调试。 - 密钥缺失的降级:
IFLYTEK密钥读取失败时回退为空字符串,构建可成功但运行时语音功能不可用——属于"编译通过、功能缺失"类问题,需检查local.properties。 - debug 签名硬编码:debug 签名使用固定的
debug.keystore(密码android),仅用于开发调试,不得用于发布。
并发与一致性说明
- Room 数据库(
room 2.3.0)与多线程数据同步:健康数据通过 SDK 回调写入本地库时,建议在单一Executor/Coroutine上下文中串行写入,避免并发事务冲突;room.schemaLocation导出 schema 便于版本迁移的并发演进。 - BLE 连接状态机:
jl_bluetooth_connect内部维护连接状态,业务层应避免在回调中直接发起重连(可能造成状态机竞争),应通过 SDK 提供的能力队列串行下发命令。
性能与运维提示
- 多 dex 与构建体积:
multiDexEnabled true已开启,release 未启用 minify(minifyEnabled false),正式发布建议按需开启混淆并保持 AAR 中 so 的 ABI 过滤以控制体积。 - 镜像与缓存:国内环境优先命中阿里云镜像;CI 构建建议开启 Gradle 构建缓存与配置缓存,加速多模块(
app+wheelview)编译。
Extension Points
- 多模块结构:
settings.gradle采用模块化组织,新功能可新增独立 Gradle 模块并以project()方式引入,与wheelview模式一致。 - 依赖注入点:Retrofit、Room、Glide 均为可替换的第三方组件,若需替换网络栈或持久化方案,只需修改
dependencies块,不影响 JL SDK 层。 - 自定义命令:README 功能表明确 SDK 支持"自定义命令"扩展,客户可在 RCSP 协议框架下扩展私有指令(详见 SDK API 文档)。
Related Links
- README.md(运行环境与快速开始)
- HealthAide app/build.gradle
- HealthAide 顶层 build.gradle
- HealthAide settings.gradle
- WatchTestTool 工程(SDK V1.14.0 配套工具)
- 相邻页面:快速开始(工程导入与依赖添加)、工程结构(目录组织)、配置说明(业务参数与鉴权)