byf3332/Baofeng-ALERVITES-AT2-Android

GitHub: byf3332/Baofeng-ALERVITES-AT2-Android

面向 Baofeng AT2 对讲机的开源 Android 控制应用,用开源编解码方案替代官方闭源库,实现 BLE 控制、读写频和离网消息通信。

Stars: 0 | Forks: 0

English · 中文

# 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, 业余无线电, 安卓应用, 宝峰对讲机, 日志审计, 硬件控制, 离网通信, 蓝牙低功耗