byf3332/Baofeng-ALERVITES-AT2-Android
GitHub: byf3332/Baofeng-ALERVITES-AT2-Android
面向 Baofeng AT2 对讲机的开源 Android 控制应用,用开源编解码方案替代官方闭源库,实现 BLE 控制、读写频和离网消息通信。
Stars: 0 | Forks: 0
# AT2 HT
AT2 HT 是一个针对 Baofeng / ALERVITES AT2 手持对讲机的开源 Android 控制应用程序。
本项目实现了 AT2 BLE 控制和离网消息协议,并使用开源实现替代了官方 Ola Radio 应用程序使用的闭源媒体库:
- 使用 OpenCORE-AMR 替代官方的 `libtalkie.so` 进行 AMR-NB MR475 语音编码和解码;
- 使用开源的 Go 实现替代官方的 `libgojni.so` 图像处理链,并与原始闭源库输出保持 bit-exact 兼容;
- 支持 BLE 控制、读写频、文本 / 图片 / 语音 / 位置消息、实时 PTT 和 SmartLink 控制。
本项目在正常的本地使用中不需要 Ola Radio 账户或任何官方服务器。
本项目使用 Android Studio 开发。
## 技术特性
- 完整实现了 AT2 BLE 端控制和消息协议;
- 识别并验证了 AT2 / Baofeng GMSK 语音路径使用 AMR-NB MR475;
- OpenCORE-AMR 生成的 MR475 语音帧已成功被真实的 AT2 硬件解码;
- AT2 BLE 语音帧为 12 bytes / 20 ms,对应于移除了 1-byte ToC/header 的 12-byte AMR-NB MR475 IETF payload;
- 开源 Go 实现复现了官方的图像处理 pipeline,与原始闭源 `libgojni.so` 相比,输出达到 bit-exact。
## AT2 对讲机拓扑
```
Main MCU (JieLi AC696X)
│ ├─── BLE connection
│ ├─── A2DP / HFP connection
│ └─── Controls UCChip UC8288
RF transceiver SoC (UCChip UC8288)
├─── Analog radio
├─── GMSK digital radio
└─── AMR-NB MR475 voice codec
```
## 功能
- BLE 扫描、连接、已知设备管理和自动重连
- BLE 控制主页
- 当前信道显示
- 双守状态和 A/B 焦点切换
- 30 个信道的快速切换
- 常用功能设置
- 信道读写
- 读取 30 个信道
- 编辑单个信道
- 写入或清除单个信道
- 写入完整信道表
- 离网通信
- 文本消息
- 图片消息
- 语音消息
- 位置消息
- SOS 消息
- 接收时的振动提醒
- 实时 PTT
- 聊天模式下的实时接收和播放
- PTT 页面上的发送和接收
- SmartLink
- 启用 / 禁用控制
- 主 PTT 长按映射设置
## 当前范围和限制
本项目专注于 AT2 BLE 端的日常使用功能,包括控制、读写频、离网消息、实时 PTT 和 SmartLink。
以下内容目前不在本项目的范围内:
- USB-C 读写频和固件更新协议;
- AC696X / UC8288 固件修改;
- 直接控制非 BLE 的 Baofeng GMSK 16 信道对讲机;
- 完整的 RF 空口解码器、FEC 和交织逆向工程。
固件更新仍应使用官方的 PC CPS 执行。
## 如何获取官方 CPS
本项目不重新分发官方 CPS 安装程序。如果您需要官方 CPS 进行固件更新、USB-C 读写频或其他官方维护操作,请从官方 Ola Radio 应用程序获取下载链接。
步骤:
1. 打开官方 Ola Radio 应用程序。
2. 连接到 AT2 对讲机。
3. 点击设备卡片右上角的三个点菜单。
4. 选择 `Device Detail`。
5. 在 `Device Detail` 页面中,点击 `Firmware Update Tool`。
6. 复制应用程序显示的 Google Drive 链接。
7. 从该链接下载并安装 CPS 包。
安装后,CPS 前端资源位于:
```
\Bluetooth_User_Series\resources\app\app\dist\assets
```
如果您想使用本仓库提供的 CPS dealer UI 补丁脚本(`tools\CPS_mod`),请将该脚本放入上述 `assets` 目录,与 `index-*.js` 位于同一目录下,然后运行它。
## 要求
- 最低 Android 版本:Android 8.1 (API 27)
- 具备音频输入/输出、BLE 和定位功能的设备
## 运行时权限
应用程序根据 Android 版本请求以下权限:
- 蓝牙扫描
- 蓝牙连接
- 位置
- 录音
- 存储访问
- 振动
## 兼容性
已测试设备:
| 设备 | BLE 控制 | 读写频 | 文本 | 图片 | 语音消息 | 实时 PTT | SmartLink |
|---|---|---|---|---|---|---|---|
| Baofeng / ALERVITES AT2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
其他廉价的 Baofeng GMSK 16 信道对讲机不受本应用程序直接支持。这些对讲机可以在 GMSK 数字语音模式下与 AT2 互操作,但数字信道参数必须完全匹配,并且对讲机还必须具有匹配的 `subSystemId` 值。
`subSystemId` 是一个隐藏参数,可能由对讲机经销商决定。它不特定于某个信道;每台对讲机只有一个这样的值。两台对讲机必须具有相同的值才能在数字模式下互操作。模拟模式不受影响。
对于这些 16 信道 GMSK 对讲机,目前尚无修改 `subSystemId` 的方法,但可以通过以下方式进行查看:关闭对讲机,将信道旋钮转到信道 3,按住 PTT 和 SK1,然后打开对讲机。语音提示将播报 `X 开机 3`;`X` 即为 `subSystemId`。
对于 AT2,请参阅 `tools\CPS_mod` 下的 README。修补 CPS 以公开 dealer 设置后,即可更改 AT2 的 `subSystemId`。
## 项目结构
```
app/src/main/java/com/byf3332/at2ht
├─ core/ble BLE session and connection
├─ core/protocol AT2 protocol encoding/decoding and state parsing
├─ core/chat Image, voice, and message playback
├─ core/ptt Real-time PTT transmit and receive
├─ widget Custom widgets
└─ *.kt Page controllers and UI coordination layer
```
Native 和 Go 源码:
```
app/src/main
├─ cpp
│ ├─ opencore-amr/ vendored OpenCORE-AMR 0.1.3
│ ├─ CMakeLists.txt
│ └─ talkie_jni.cpp
├─ go
│ ├─ resizer/ Image resizing implementation and golden tests
│ ├─ go.mod
│ ├─ go.sum
│ └─ build-android.ps1
└─ jniLibs/arm64-v8a
└─ libgojni.so Prebuilt artifact generated from this project's Go source
```
主要入口点:
- `MainActivity.kt`:主 UI 装配和控制器初始化
- `BleEventController.kt`:BLE 响应分发
- `ChatFlowController.kt`:离网通信接收路径
- `ChatInteractionController.kt`:离网通信发送路径
- `ReadWriteUiController.kt`:信道编辑和写回
- `SmartLinkUiController.kt`:SmartLink 页面控制
## 开源 `libtalkie.so` 替代
官方 Ola Radio 应用程序使用 `libtalkie.so` 对 AT2 语音数据进行编码和解码。本项目保持原有的 JNI 边界不变,并使用 OpenCORE-AMR 作为兼容的替代品。
Kotlin 入口点保持为:
- `app/src/main/java/com/ucchip/sdk/codec/talkie/TalkieCodec.kt`
Native 实现:
- `app/src/main/cpp/talkie_jni.cpp`
- `app/src/main/cpp/CMakeLists.txt`
- `app/src/main/cpp/opencore-amr`
当前固定契约:
- `getFrameSize() = 320`
- `getEncodedFrameSize() = 12`
- `getSampleRate() = 8000`
- `getFrameDuration() = 20`
- `encoder()`:`320-byte PCM16LE @ 8 kHz -> 12-byte AT2 payload`
- `decoder()`:`12-byte AT2 payload -> 320-byte PCM16LE @ 8 kHz`
AT2 语音帧每帧为 20 ms。AMR-NB MR475 在 IETF 存储格式中为 13 bytes:
```
[1-byte ToC/header][12-byte MR475 payload]
```
`0x04` 表示 MR475 良好语音帧。AT2 BLE 协议传输的 12-byte 语音帧相当于移除了 ToC/header 的 MR475 payload。对于解码,只需在 12-byte AT2 payload 前加上 `0x04`。
本项目不包含来自 Ola Radio 的原始闭源 `libtalkie.so`。
## 开源 `libgojni.so` 替代
官方 Ola Radio 应用程序使用 GoMobile native 库来处理图像。本项目重新实现了该图像处理链,并使用开源组件生成了一个新的 `libgojni.so`。
当前 pipeline:
```
Android reads image
-> rotate according to EXIF orientation
-> re-encode as Android JPEG quality 100
-> Go image.Decode
-> nfnt/resize Lanczos3 resize, max long side 300 px
-> Go image/jpeg quality 75 encode
```
该实现已通过黄金样本测试,与原始闭源 `libgojni.so` 相比,可以产生逐字节一致的输出。有关详细信息,请参阅 `tools/verification/README.md`。
本仓库中的 `app/src/main/jniLibs/arm64-v8a/libgojni.so` 文件是由本项目的 Go 源码生成的预构建产物。它不是来自 Ola Radio 的原始闭源库。
## 构建
### 1. 安装工具
- 带有捆绑 JDK 的 Android Studio
- Android SDK Platform 36
- Android SDK Build-Tools 36.1.0 或兼容版本
- CMake 3.22.1
- Android NDK `28.2.13676358`
- Go `1.24.0`(仅在重新构建 `libgojni.so` 时需要)
- gomobile `v0.0.0-20250305212854-3a7bc9f8a4de`(仅在重新构建 `libgojni.so` 时需要)
上述 Android 组件可以在 **Android Studio -> SDK Manager -> SDK Tools -> Show Package Details** 中安装。
克隆仓库后,使用 Android Studio 打开项目,并让 IDE 生成 `local.properties`。此文件不应被提交。
需要重新构建 Go 库的开发者应自行安装 Go。Go、gomobile、Android SDK 和构建缓存可以放置在任何磁盘上。所有路径均配置在:
`app/src/main/go/toolchain.properties`
```
GO_ROOT=/path/to/go
GO_TOOLS_ROOT=/path/to/go-tools
ANDROID_SDK_ROOT=/path/to/Android/Sdk
BUILD_CACHE_ROOT=/path/to/build-cache
```
当移动到另一台计算机时,只需更改这四个变量。
以下示例将 gomobile 及其安装时的缓存放置在 D 盘上。这些目录应与 `toolchain.properties` 匹配:
```
$env:GOPATH='D:\path\to\go-tools\install-gopath'
$env:GOMODCACHE='D:\path\to\go-tools\install-gopath\pkg\mod'
$env:GOCACHE='D:\path\to\go-tools\install-cache'
$env:GOBIN='D:\path\to\go-tools\bin'
$env:TEMP='D:\path\to\go-tools\tmp'
$env:TMP=$env:TEMP
$env:GOTELEMETRY='off'
& 'D:\path\to\go\bin\go.exe' install golang.org/x/mobile/cmd/gomobile@v0.0.0-20250305212854-3a7bc9f8a4de
& 'D:\path\to\go\bin\go.exe' install golang.org/x/mobile/cmd/gobind@v0.0.0-20250305212854-3a7bc9f8a4de
```
仓库脚本不安装依赖项,也不修改系统或用户环境配置。它们只在自己的进程内临时设置 `PATH`,以便 gomobile 能够找到 Go,并在退出前恢复原始值。
所有可写缓存都放置在 `BUILD_CACHE_ROOT/libgojni/` 下,可通过 `toolchain.properties` 进行配置:
- `GOPATH` 和 Go module cache
- Go build cache
- `TEMP` / `TMP`
- Android user home
`.toolchains/` 包含在 `.gitignore` 中,可以随时删除,而不会污染源码树或用户目录。
### 2. 在需要时生成开源 `libgojni.so`
Windows PowerShell:
```
cd app/src/main/go
./build-android.ps1
```
Linux 或 Git Bash:
```
cd app/src/main/go
bash ./build-android.sh
```
脚本执行以下步骤:
1. 检查已安装的 Go 1.24.0 和 gomobile 版本。
2. 从 `go.mod` / `go.sum` 解析固定版本的依赖项。
3. 为 `arm64-v8a`、API 27 生成一个 Android AAR。
4. 将 `jni/arm64-v8a/libgojni.so` 提取到 `app/src/main/jniLibs/arm64-v8a/`。
有关完整的 Windows/Linux 构建说明,请参阅 `docs/BUILDING.md`。
## 许可证
本项目在 Apache License 2.0 下发布。有关全文,请参阅根目录下的 `LICENSE` 文件。
第三方组件保留其各自的许可证,包括:
- OpenCORE-AMR 0.1.3:位于 `app/src/main/cpp/opencore-amr/`,保留其上游的 `LICENSE` 和 `opencore/NOTICE`;
- `github.com/nfnt/resize`:版本固定在 `app/src/main/go/go.mod`,上游使用 ISC 风格的许可证;
- `golang.org/x/mobile` / gomobile:版本固定在 `app/src/main/go/go.mod` 和构建脚本中,上游使用 BSD-3-Clause;
- AndroidX、Material Components、JUnit 和其他构建依赖项:根据各自的上游许可证分发。
完整的第三方归属和分发说明可在仓库根目录中找到:
- `NOTICE`
- `THIRD_PARTY_NOTICES.md`
注意:
- 在分发包含此组件的源码时,必须保留 `app/src/main/cpp/opencore-amr/opencore/NOTICE`;
- OpenCORE-AMR 的上游声明包含针对 AMR / AMR-WB 标准实现的专利相关提醒。用户应评估其各自管辖范围内的合规性要求。
## 调试建议
- BLE 和协议日志仅在 `debug` 构建中打印。
- 修改与协议相关的逻辑后,请先测试这些场景:
- 扫描和连接
- BLE 控制页面状态读取
- 信道读写
- 离网文本、图片和语音消息
- 实时 PTT
- SmartLink 启用/禁用和主 PTT 映射
## 注意
请确保您的频率、功率和发射行为符合您所在管辖范围的无线电法规。
本项目与 Baofeng、ALERVITES、Ola Radio、UCChip 或任何相关的制造商或经销商无关。
固件更新、USB-C 编程和 AC696X / UC8288 件修改不在本项目的范围内。固件更新仍应使用官方 PC CPS 执行。
# AT2 HT
AT2 HT 是一个面向 Baofeng / ALERVITES AT2 手台的开源 Android 控制应用。
本项目实现了 AT2 的 BLE 控制与无网通信协议,并使用开源实现替代官方 Ola Radio App 中的闭源媒体库:
- 使用 OpenCORE-AMR 替代官方 `libtalkie.so`,实现 AMR-NB MR475 语音编解码;
- 使用开源 Go 图像处理链替代官方 `libgojni.so`,并与原始闭源库输出达到 bit-exact 兼容;
- 支持蓝牙控制、读写频、文本 / 图片 / 语音 / 定位消息、实时 PTT 与 SmartLink 控制。
本项目不依赖 Ola Radio 账号,也不需要官方服务器即可使用。
本项目使用 Android Studio 开发。
## 技术特性
- 完整实现 AT2 BLE 侧控制与消息协议;
- 识别并验证 AT2 / Baofeng GMSK 语音链路使用 AMR-NB MR475;
- OpenCORE-AMR 生成的 MR475 语音帧已通过真实 AT2 硬件解码测试;
- AT2 BLE 语音帧为 12 bytes / 20 ms,对应 AMR-NB MR475 IETF payload 去除 1-byte ToC/header 后的 12-byte payload;
- 使用开源 Go 实现复现官方图片处理流程,输出与原闭源 `libgojni.so` bit-exact。
## AT2 对讲机拓扑
```
主 MCU(杰理 AC696X)
│ ├─── BLE 连接
│ ├─── A2DP / HFP 连接
│ └─── 控制御芯微 UC8288
射频收发器 SoC(御芯微 UC8288)
├─── 模拟对讲
├─── GMSK 数字对讲
└─── AMR-NB MR475 语音编解码
```
## 功能
- 蓝牙扫描、连接、已知设备管理、自动回连
- 蓝牙控制主页
- 当前信道显示
- 双频守候状态与 A/B 焦点切换
- 30 个信道快捷切换
- 常用功能设置
- 读写频
- 30 信道读取
- 单信道编辑
- 单信道写入与清空
- 整表写入
- 无网通信
- 文本消息
- 图片消息
- 语音消息
- 定位消息
- 求助消息
- 接收振动提醒
- 实时 PTT
- 聊天模式下实时接收播放
- PTT 页面发射与接收
- SmartLink
- 开关控制
- 主 PTT 长按映射设置
## 当前范围与限制
当前项目聚焦 AT2 的 BLE 侧日常功能,包括控制、写频、无网消息、实时 PTT 与 SmartLink。
以下内容暂不在本项目范围内:
- USB-C 写频与固件升级协议;
- AC696X / UC8288 固件修改;
- 非 BLE Baofeng GMSK 16 信道机的直接控制;
- RF 空口完整解码器、FEC 与交织逆向。
固件升级建议继续使用官方 PC CPS。
## 官方 CPS 获取方式
本项目不重新分发官方 CPS 安装包。如需使用官方 CPS 进行固件升级、USB-C 写频或其他官方维护操作,可以从官方 Ola Radio App 获取下载链接。
获取方式:
1. 打开官方 Ola Radio App。
2. 连接 AT2 手台。
3. 在设备卡片右上角点击三个点菜单。
4. 选择 `Device Detail`。
5. 在 `Device Detail` 页面点击 `Firmware Update Tool`。
6. 复制弹出的 Google Drive 链接。
7. 从该链接下载 CPS 安装包并安装。
安装后 CPS 的前端资源位于:
```
\Bluetooth_User_Series\resources\app\app\dist\assets
```
如果需要使用本仓库提供的 CPS dealer UI patch 脚本(`tools\CPS_mod`),应将脚本放入上述 `assets` 目录,也就是与 `index-*.js` 位于同一目录后再执行。
## 运行要求
- 最低 Android 版本:8.1(API 27)
- 拥有音频输入输出(扬声器、麦克风)、蓝牙 BLE、定位功能
## 运行权限
应用运行时会按系统版本申请以下权限:
- 蓝牙扫描
- 蓝牙连接
- 定位
- 录音
- 存储空间访问
- 振动
## 兼容性
已测试设备:
| 设备 | BLE 控制 | 读写频 | 文本 | 图片 | 语音消息 | 实时 PTT | SmartLink |
|---|---|---|---|---|---|---|---|
| Baofeng / ALERVITES AT2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
其他 Baofeng GMSK 廉价 16 信道机不适用于本应用。这类机器能与 AT2 在 GMSK 数字语音模式下互通,但数字信道参数完全匹配的同时还需要机器的 `subSystemId` 匹配。
`subSystemId` 是一个隐藏参数,疑似由机器的经销商决定。该参数不随信道变化,整机只有一个。两台机器要互通,该参数必须一致(模拟模式不受影响)。
对于这些 16 信道 GMSK 机器,目前没有找到 `subSystemId` 的修改方法,但可以按照以下方法查看:关机,信道旋钮转到 3,按住 PTT 和 SK1,开机,语音播报“X 开机 3”,这里的 X 即为 `subSystemId`。
对于 AT2,参考 `tools\CPS_mod` 下的 README.md,对 CPS 进行修改,暴露经销商设置以后即可修改 `subSystemId`。
## 项目结构
```
app/src/main/java/com/byf3332/at2ht
├─ core/ble BLE 会话与连接
├─ core/protocol AT2 协议编解码与状态解析
├─ core/chat 图片、语音、消息播放
├─ core/ptt 实时 PTT 发送与接收
├─ widget 自定义控件
└─ *.kt 页面控制器与界面协调层
```
Native 与 Go 源码:
```
app/src/main
├─ cpp
│ ├─ opencore-amr/ vendored OpenCORE-AMR 0.1.3
│ ├─ CMakeLists.txt
│ └─ talkie_jni.cpp
├─ go
│ ├─ resizer/ 图片缩放实现与黄金测试
│ ├─ go.mod
│ ├─ go.sum
│ └─ build-android.ps1
└─ jniLibs/arm64-v8a
└─ libgojni.so 由本项目 Go 源码生成的预构建产物
```
主要入口:
- `MainActivity.kt`:主界面装配与控制器初始化
- `BleEventController.kt`:BLE 回包分发
- `ChatFlowController.kt`:无网通信接收链
- `ChatInteractionController.kt`:无网通信发送链
- `ReadWriteUiController.kt`:读写频编辑与写回
- `SmartLinkUiController.kt`:SmartLink 页面控制
## `libtalkie.so` 开源替换
官方 Ola Radio App 使用 `libtalkie.so` 对 AT2 的语音数据进行编解码。本项目保持原 JNI 边界不变,并使用 OpenCORE-AMR 实现兼容替代。
Kotlin 入口保持为:
- `app/src/main/java/com/ucchip/sdk/codec/talkie/TalkieCodec.kt`
Native 实现位于:
- `app/src/main/cpp/talkie_jni.cpp`
- `app/src/main/cpp/CMakeLists.txt`
- `app/src/main/cpp/opencore-amr`
当前固定契约:
- `getFrameSize() = 320`
- `getEncodedFrameSize() = 12`
- `getSampleRate() = 8000`
- `getFrameDuration() = 20`
- `encoder()`:`320-byte PCM16LE @ 8 kHz -> 12-byte AT2 payload`
- `decoder()`:`12-byte AT2 payload -> 320-byte PCM16LE @ 8 kHz`
AT2 的语音帧为 20 ms 一帧。AMR-NB MR475 在 IETF storage format 中为 13 bytes:
```
[1-byte ToC/header][12-byte MR475 payload]
```
其中 `0x04` 表示 MR475 good speech frame。AT2 BLE 协议中传输的 12-byte 语音帧等价于去掉 ToC/header 后的 MR475 payload。解码时只需在 12-byte AT2 payload 前补回 `0x04`。
本项目不包含官方 Ola Radio 的原始闭源 `libtalkie.so`。
## `libgojni.so` 开源替换
官方 Ola Radio App 使用 GoMobile native 库处理图片。本项目重新实现该图片处理链,并使用开源组件生成新的 `libgojni.so`。
当前流程为:
```
Android 读取图片
-> 按 EXIF orientation 旋转
-> Android JPEG quality 100 重编码
-> Go image.Decode
-> nfnt/resize Lanczos3 缩放,长边最大 300 px
-> Go image/jpeg quality 75 编码
```
该实现已通过黄金样本测试,输出可与原始闭源 `libgojni.so` 达到 byte-for-byte 一致。具体请参考 `tools/verification/README.md`。
本项目仓库中的 `app/src/main/jniLibs/arm64-v8a/libgojni.so` 是由本项目 Go 源码生成的预构建产物,不是官方 Ola Radio 的原始闭源库。
## 开始构建
### 1. 安装工具
- Android Studio(附带 JDK)
- Android SDK Platform 36
- Android SDK Build-Tools 36.1.0 或兼容版本
- CMake 3.22.1
- Android NDK `28.2.13676358`
- Go `1.24.0`(仅重新生成 `libgojni.so` 时需要)
- gomobile `v0.0.0-20250305212854-3a7bc9f8a4de`(仅重新生成 `libgojni.so` 时需要)
以上 Android 组件可在 Android Studio 的 **SDK Manager → SDK Tools → Show Package Details** 中安装。
克隆仓库后用 Android Studio 打开项目,让 IDE 生成 `local.properties`。该文件不应提交。
需要重建 Go 库的开发者应自行安装 Go。Go、gomobile、Android SDK 和构建缓存都可以位于用户选择的任意磁盘。所有路径集中配置在:
`app/src/main/go/toolchain.properties`
```
GO_ROOT=/path/to/go
GO_TOOLS_ROOT=/path/to/go-tools
ANDROID_SDK_ROOT=/path/to/Android/Sdk
BUILD_CACHE_ROOT=/path/to/build-cache
```
更换电脑时只需修改以上四个变量。
以下示例把 gomobile 及安装时产生的缓存放在 D 盘;目录应与 `toolchain.properties` 保持一致:
```
$env:GOPATH='D:\path\to\go-tools\install-gopath'
$env:GOMODCACHE='D:\path\to\go-tools\install-gopath\pkg\mod'
$env:GOCACHE='D:\path\to\go-tools\install-cache'
$env:GOBIN='D:\path\to\go-tools\bin'
$env:TEMP='D:\path\to\go-tools\tmp'
$env:TMP=$env:TEMP
$env:GOTELEMETRY='off'
& 'D:\path\to\go\bin\go.exe' install golang.org/x/mobile/cmd/gomobile@v0.0.0-20250305212854-3a7bc9f8a4de
& 'D:\path\to\go\bin\go.exe' install golang.org/x/mobile/cmd/gobind@v0.0.0-20250305212854-3a7bc9f8a4de
```
仓库脚本不会安装依赖,也不会修改系统或用户环境配置。它只在自身进程中临时设置 PATH,以满足 gomobile 查找 go 的要求,并在退出前恢复原值。
以下所有可写缓存都集中到 `BUILD_CACHE_ROOT/libgojni/`,用户可通过 `toolchain.properties` 自行选择位置:
- `GOPATH` 与 Go module cache
- Go build cache
- `TEMP` / `TMP`
- Android user home
`.toolchains/` 已加入 `.gitignore`,可随时整体删除,不会污染源码或用户目录。
### 2. 生成开源 `libgojni.so`(首次发布或修改 Go 源码时)
Windows PowerShell:
```
cd app/src/main/go
./build-android.ps1
```
Linux 或 Git Bash:
```
cd app/src/main/go
bash ./build-android.sh
```
脚本进行以下操作:
1. 检查用户已安装的 Go 1.24.0 与 gomobile。
2. 从 `go.mod` / `go.sum` 解析固定版本依赖。
3. 为 Android `arm64-v8a`、API 27 生成 AAR。
4. 提取 `jni/arm64-v8a/libgojni.so` 到 `app/src/main/jniLibs/arm64-v8a/`。
完整的 Windows/Linux 构建说明见 `docs/BUILDING.md`。
## 开源许可证
本项目整体以 Apache License 2.0 开源,许可证全文位于仓库根目录的 `LICENSE` 文件。
第三方组件仍分别保留各自许可证,主要包括:
- OpenCORE-AMR 0.1.3:位于 `app/src/main/cpp/opencore-amr/`,保留其上游 `LICENSE` 与 `opencore/NOTICE`;
- `github.com/nfnt/resize`:版本固定在 `app/src/main/go/go.mod`,上游采用 ISC 风格许可证;
- `golang.org/x/mobile` / gomobile:版本固定在 `app/src/main/go/go.mod` 与构建脚本,上游采用 BSD-3-Clause 许可证;
- AndroidX、Material Components、JUnit 等构建依赖:按各自上游许可证分发。
完整第三方归属与分发说明见仓库根目录:
- `NOTICE`
- `THIRD_PARTY_NOTICES.md`
注意:
- `app/src/main/cpp/opencore-amr/opencore/NOTICE` 必须随包含该组件的源码分发一起保留;
- OpenCORE-AMR 的上游说明中包含与 AMR / AMR-WB 标准实现相关的专利提醒,使用者应自行评估所在法域的合规要求。
## 调试建议
- BLE 和协议相关日志仅在 `debug` 构建中输出。
- 修改协议相关逻辑后,优先验证以下场景:
- 扫描与连接
- 蓝牙控制页状态读取
- 读写频读写
- 无网通信文本、图片、语音
- 实时 PTT
- SmartLink 开关与主 PTT 映射
## 注意事项
请确保使用频率、功率和发射行为符合所在地区的无线电法规。
本项目与 Baofeng、ALERVITES、Ola Radio、UCChip 等厂商无官方关联。
固件升级、USB-C 写频、AC696X / UC8288 固件修改不属于本项目范围。固件升级建议继续使用官方 PC CPS。
标签:AMR编解码, Bash脚本, UML, 业余无线电, 安卓应用, 宝峰对讲机, 日志审计, 硬件控制, 离网通信, 蓝牙低功耗