宇树科技 APP 技术架构分析报告
基于
UnitreeGo.zip、Unitree_Explore.zip解包后的 Manifest、DEX、so 库与 assets 静态对比;UnitreeGo 模拟器另经 ADB 运行时交叉验证。未做二进制逆向。
目录
- 一、核心结论
- [二、两款 App 对比概览](#二、两款 App 对比概览)
- [三、UnitreeGo 分析](#三、UnitreeGo 分析)
- [3.4 Go2 模拟器:WebView 实现](#3.4 Go2 模拟器:WebView 实现)
- [四、Unitree Explore 分析](#四、Unitree Explore 分析)
- 五、共有技术底座
- [六、WebView 与混合开发](#六、WebView 与混合开发)
- [6.4 模拟器加载链路](#6.4 模拟器加载链路)
- [6.5 dist 工程概览](#6.5 dist 工程概览)
- [6.6 目录结构与分包](#6.6 目录结构与分包)
- [6.7 功能页面与操控 UI](#6.7 功能页面与操控 UI)
- [6.8 3D / SLAM / 编程技术栈](#6.8 3D / SLAM / 编程技术栈)
- [6.9 原生桥接与通信](#6.9 原生桥接与通信)
- [6.10 Go 与 Explore 前端差异](#6.10 Go 与 Explore 前端差异)
- [七、Blockly 可视化编程](#七、Blockly 可视化编程)
- 八、原生库技术栈
- [8.2 共有 so 详解](#8.2 共有 so 详解)
- [8.3 Explore 独有 so 详解](#8.3 Explore 独有 so 详解)
- [8.4 汇总:已知库 vs 自研](#8.4 汇总:已知库 vs 自研)
- [九、第三方 SDK 集成](#九、第三方 SDK 集成)
- 十、应用架构特点
- 十一、技术架构总结
- 十二、总结
一、核心结论
宇树科技旗下 UnitreeGo 与 Unitree Explore 均采用 Kotlin/Java 原生 Android + WebView 混合架构,共享同一 H5 资源底座与大部分原生库,未使用 Flutter、React Native、Hippy 等跨端 UI 框架。UnitreeGo 面向 Go2 四足机器狗,侧重 BLE 控制、3D 仿真与 SLAM;Unitree Explore 面向多产品线(B2/G1/H2/R1/A2),扩展 AR8030 无线图传与更完整的机型运维能力。
技术栈概览
- 原生开发 --- Kotlin 1.8 + Android Gradle Plugin 8.0.2 + Java 17
- 模块化 --- ARouter 路由,按产品线拆分
doggo2/godog/g1/h2/r1/a2等模块 - 混合 H5 --- Vite + Vue + TypeScript,内嵌
assets/dist/;大量操控 UI(遥控、编程、SLAM/地图、图传窗口)在 WebView 内实现 - 机器人编程 --- 自研 Blockly → Python(
high_level_api+rt/api/sport/request) - 3D 仿真(WebView) --- Go2 模拟器由
WebActivity加载simulator.html;Three.js + Ammo + PCD/SLAM Worker + Go2 GLB(Go 版更重,非 Unity 等原生引擎) - 连接 --- BLE(
lib_ble);Explore 额外集成 AR8030 图传链路 - 语音 --- 科大讯飞 MSC(
libmsc.so+assets/iflytek/) - 媒体 --- FFmpegKit(
libffmpegkit.so+ libav*) - 存储 --- MMKV(
libmmkv.so) - 加固与监控 --- 百度加固 + 阿里 EMAS + Firebase Crashlytics
二、两款 App 对比概览
| 维度 | UnitreeGo | Unitree Explore |
|---|---|---|
| 包名 | com.unitree.doggo2 |
com.unitree.b2dog |
| 版本 | 1.12.9 | 2.0.0 |
| APK 体积(zip) | ~165 MB | ~182 MB |
| DEX | 4 个(约 22.3 MB) | 4 个(约 23.7 MB) |
| 原生 so | 20 个 | 27 个(多 7 个 AR8030 相关) |
| 主业务模块 | doggo2(Go2) |
godog(B2 壳) + 多机型 |
| 支付 | 含微信/支付宝 | 无 |
| H5 dist 同源度 | 68 个相同路径中 66 个 MD5 一致 | 同左 |
| 3D 模拟器 | 有(WebView + simulator.html) |
无独立 simulator 入口 |
| 定位 | Go2 消费控制 + 3D 仿真 | 多机型探索/运维 + 图传 |
关系判断: 二者为宇树自研、同源双 App 策略;Explore 可视为面向 B2 与多产品线的「超集」版本,Go 聚焦 Go2 体验与仿真能力。
三、UnitreeGo 分析
3.1 架构定性
UnitreeGo 为原生 + WebView 混合架构:
- 无 Flutter :未发现
libflutter.so - 无 React Native :未发现
libreactnativejni.so、libhermes.so - 无 Hippy / Weex 运行时:DEX 中无 Weex 核心类引用
- 4 个 DEX:代码规模中等
3.2 业务模块
| 模块 | 职责 |
|---|---|
com.unitree.doggo2 |
主界面、自检、固件升级、Web、设置等 |
com.unitree.lib_ble |
蓝牙绑定、连接、遥控 |
com.unitree.login |
登录 |
com.unitree.pay |
支付(含 WXPayEntryActivity) |
com.unitree.a2 |
A2 人形机器人设置/数据 |
典型 Activity:
com.unitree.doggo2.ui.activity.main.MainActivitycom.unitree.lib_ble.ui.remote.RemoteActivitycom.unitree.lib_ble.ui.dog.DogBluetoothActivitycom.unitree.doggo2.ui.activity.web.WebActivitycom.unitree.doggo2.ui.activity.update.HardwareUpdate2Activity
3.3 Go 版 H5 特点
入口:
assets/dist/index.html--- 主 H5(main bundle ~8.2 MB)assets/dist/simulator.html--- 独立 3D 仿真页(Explore 无此入口)
Go 独有或更完整的 3D/仿真资源:
models/Go2.glb, Go2Root.glb, environment.glb
assets/ammo-CP2eG2rD.js # Ammo.js 物理引擎
js/PCDLoader/PCDLoader.*.js # 点云加载
js/slam/Slam.*.js, slam.worker-*.js # SLAM 模块
111.pcd # 示例点云
assets/libvoxel-*.wasm # 体素 WASM
models/forestGround*.jpg, grass_*.png # 环境贴图
分析: Go 版 H5 更重仿真与 SLAM 可视化,适合 Go2 遥控、建图与环境预览。
3.4 Go2 模拟器:WebView 实现
结论:UnitreeGo 内的 Go2「模拟器」不是原生 OpenGL/Unity 页面,而是由原生 WebActivity 作为容器,加载本地 H5 页 assets/dist/simulator.html 实现;3D 渲染发生在 WebView 内的 WebGL + JS Worker,而非独立原生游戏引擎。
3.4.1 静态证据(APK 解包)
| 证据 | 说明 |
|---|---|
| 独立 H5 入口 | assets/dist/simulator.html → assets/simulator-*.js(Vite 独立 build target) |
| 与主 H5 同工程 | 同目录下还有 index.html / main-*.js,模拟器是第二入口而非单独 App |
| 3D 资源全在 assets | Go2.glb、ammo-*.js、PCDLoader、slam.worker、three.worker 等均在 assets/dist/ |
| 无原生 3D 引擎 so | lib/arm64-v8a/ 中无 Unity/Unreal 等库,仅有 FFmpeg、语音、加固等通用 so |
| 原生容器类 | DEX 存在 com.unitree.doggo2.ui.activity.web.WebActivity |
| 本地加载方式 | DEX 字符串含 file:///android_asset/、WebContainerImpl loadUrl |
| H5 桥接 | com.unitree.provider.router.IWebEventService --- 原生与 H5 事件通信 |
simulator.html 结构(节选):
html
<script type="module" crossorigin src="/assets/simulator-DCwy8tEZ.js"></script>
<link rel="modulepreload" href="/js/store/store.C-MxpaM3.js">
<link rel="modulepreload" href="/js/PCDLoader/PCDLoader.CtejSKyB.js">
3.4.2 运行时验证(ADB)
在真机(USB 调试)打开 UnitreeGo 模拟器页后,通过 ADB 确认:
bash
adb devices
adb shell "dumpsys activity activities"
观测结果:
| 检查项 | 结果 |
|---|---|
| 前台 Activity | topResumedActivity = com.unitree.doggo2/.ui.activity.web.WebActivity |
| 进程 | com.unitree.doggo2(非独立模拟器进程) |
| WebView 实现 | 系统 WebView com.google.android.webview 148.0.7778.178 |
| Release 包 | run-as com.unitree.doggo2 → package not debuggable |
| WebView 远程调试 | 进程无 webview_devtools_remote_<pid> socket,chrome://inspect 通常看不到该 WebView |
分析: 静态结构与运行时行为一致------用户进入模拟器即进入 WebActivity;logcat 中可见 WebActivity 持续 RenderInspector 输出,符合 WebGL 页面刷新特征。Release 包未开放 WebView 调试,不影响「模拟器 = WebView H5」的判断,仅影响 DevTools attach。
3.4.3 架构示意
用户打开「模拟器」
→ WebActivity(原生壳)
→ loadUrl("file:///android_asset/dist/simulator.html")
→ Vite/Vue 应用 + Three.js/Ammo/SLAM Worker
→ WebGL 在 WebView 内渲染 Go2 模型
↔ IWebEventService / BLE(必要时与真机或遥控数据交互)
与 Explore 对比: Explore 解包无 simulator.html,模拟器为 UnitreeGo(Go2)特有能力。
四、Unitree Explore 分析
4.1 架构定性
Unitree Explore(包名 com.unitree.b2dog,主模块 godog)在 UnitreeGo 共有栈基础上扩展:
- AR8030 无线图传 --- 7 个专属 so
- 多机型原生模块 --- G1/H2/R1/A2 等
- G1 资源包 ---
g1_description.tar.xz(~17 MB) - H5 编程页 --- 独立
Programming模块 - 无支付模块
4.2 多产品线模块
| 模块 | 典型能力 |
|---|---|
godog |
主壳:Main、Function、DataBill、DogAudio、DogFollow、HardwareUpdate |
g1 / g1_d |
G1 人形:BaseInfo、RobotSetting、RemoteBind、LogReport、Limb/Motor/Imu |
h2 |
H2 系列:BaseInfo、Battery、Log、Limb、Motor |
r1 |
R1 系列:BaseInfo、Log、Limb |
a2 |
A2 人形:设置/数据页(与 Go 版部分共用) |
lib_ble |
与 Go 相同的 BLE 连接/遥控 |
godog 典型 Activity:
com.unitree.godog.ui.activity.main.MainActivitycom.unitree.godog.ui.activity.function.FunctionActivitycom.unitree.godog.ui.activity.dataBill.DataBillActivitycom.unitree.godog.ui.activity.dogAudio.DogAudioActivitycom.unitree.godog.ui.activity.dogFollow.DogFollowActivity
4.3 AR8030 无线图传(Explore 独有)
仅 Explore 存在的 so:
libar8030_client.so
libar8030_helper.so
libar8030_helper_jni.so
libar8030_ota.so
libar8030_ota_upgrade.so
libsky_ar8030_comm.so
libsky_serialport.so
配套 assets:
assets/ar8030_helper_socketassets/data_stream
分析: AR8030 常见于无线 HD 图传/数传模组;结合 DogAudioActivity 与更大包体,Explore 面向 B2 等需远程音视频/数据链路的场景,Go 版更偏本地 BLE 控制与仿真。
4.4 Explore 版 H5 差异
| 项目 | UnitreeGo | Unitree Explore |
|---|---|---|
| 主 Bundle | main-*.js (~8.2 MB) |
index-*.js (~3.9 MB) |
| 仿真页 | 有 simulator.html |
无 |
| 编程页 | Blockly 资源 + 共用逻辑 | 独立 Programming-*.js/css |
| 3D 环境 | 完整 forest/grass 大贴图 | 共享 Go2 模型,环境资源更少 |
| G1 描述 | 无 | g1_description.tar.xz |
| 调试 | 无 vConsole | 内置 vconsole.min.*.js |
五、共有技术底座
5.1 构建信息
两份 APK 构建配置一致:
androidGradlePluginVersion=8.0.2
Kotlin 1.8.0
Java source/targetCompatibility=17
5.2 DEX 架构
| App | DEX 文件 | 大小 |
|---|---|---|
| UnitreeGo | classes.dex ~ classes4.dex | 7.13 + 7.18 + 6.16 + 1.87 MB |
| Unitree Explore | classes.dex ~ classes4.dex | 6.94 + 6.02 + 3.15 + 7.62 MB |
5.3 跨端框架排除
| 框架 | UnitreeGo | Unitree Explore |
|---|---|---|
| Flutter | 未发现 | 未发现 |
| React Native | 未发现 | 未发现 |
| Hippy | 未发现 | 未发现 |
| Weex 运行时 | 未发现 | 未发现 |
六、WebView 与混合开发
本章是操控体验的核心: 宇树 App 中用户可见的大部分机器人交互界面,均来自
assets/dist/内的 Vite/Vue 工程;原生层提供连接与桥接。
6.1 前端技术栈
assets/dist/ 为 Vite 构建产物,HTML 标题为 「Vite + Vue + TS」 ,同时包含 legacy 与现代双构建(polyfills-legacy-*.js、main-legacy-*.js)。
共有 Worker:
slam.worker-*.js--- SLAM 计算three.worker-*.js--- Three.js 渲染videoTransform.worker-*.js--- 视频变换
Explore 额外包含 workerSolver.worker-*.js。
6.2 原生桥接
DEX 中存在:
com.unitree.doggo2.ui.activity.web.WebActivity/godog同名 Web 页com.unitree.provider.router.IWebEventService--- H5 与原生事件桥接AgentWeb--- Web 容器(Manifest 字符串)
6.3 dist 同源分析
- 相同相对路径:68 个
- MD5 完全一致:66 个(joystick、Go2.glb、polyfills 等)
- 说明:同一前端工程多 target 构建,Go/Explore 已开始业务 Bundle 分化
6.4 模拟器加载链路
UnitreeGo 模拟器是混合架构的典型实例:
| 层级 | 实现 |
|---|---|
| 原生入口 | WebActivity 启动,Intent 携带 H5 路径(推断为 simulator.html 或等效 URL) |
| H5 入口 | assets/dist/simulator.html |
| 主逻辑 | simulator-*.js + 共享 js/store/、js/PCDLoader/ |
| 3D/物理 | three.worker-*.js、ammo-*.js、models/Go2.glb |
| SLAM | js/slam/、slam.worker-*.js、111.pcd |
| 调试 | Go 版无 vConsole;Release 包 chrome://inspect 多不可用,可依赖 ADB 看前台 Activity |
排除项: 非 Flutter/RN 页面;非 Unity/Unreal 原生仿真;Explore 无同名 simulator 入口。
6.5 dist 工程概览
assets/dist/ 是宇树 App 最核心的前端交付物 :原生 WebActivity 加载本地 HTML 后,用户看到的遥控、编程、建图、图传预览等交互,基本都运行在这一目录内的 Vue 应用里;原生层主要负责 WebView 容器、BLE/图传连接、以及 H5↔机器狗的数据桥接。
| 项 | UnitreeGo | Unitree Explore |
|---|---|---|
| 文件数 | 107 | 99 |
H5 版本(time.json) |
v1.2.43(2026-05-11 构建) | 同左(两 App 同源) |
| APK 版本 | 1.12.9 | 2.0.0 |
| 总体积(dist) | ~80 MB+(含大贴图/模型) | ~70 MB+(含 g1_description.tar.xz) |
工程特征:
- 构建工具: Vite(HTML 标题「Vite + Vue + TS」,产物带 content hash)
- 框架: Vue 3 + TypeScript(scoped CSS 中大量
[data-v-xxx]) - 兼容性: modern + legacy 双构建(
polyfills-legacy-*.js+@vitejs/plugin-legacy典型结构) - 多页应用(MPA): 非单页唯一入口,至少 3 个 HTML entry
- 状态/依赖: 独立
js/store/chunk(~700 KB),被index.html/simulator.html预加载
三个 HTML 入口:
| 入口 | 主 Bundle | 用途推断 |
|---|---|---|
index.html |
main-*.js(Go)/ index-*.js(Explore) |
主操控应用:遥控、编程、雷达/地图、音视频、聊天等 |
simulator.html |
simulator-*.js |
Go 专用 3D 仿真(见 §3.4) |
blank.html |
无脚本 | 空壳页,可能供原生动态注入 URL 或占位 |
6.6 目录结构与分包
assets/dist/
├── index.html | simulator.html | blank.html # MPA 入口
├── time.json # H5 版本与构建时间
├── assets/ # Vite 主 chunk(JS/CSS/worker)
├── js/
│ ├── store/ # 公共状态与框架依赖(两 App 预加载)
│ ├── pages/ # 路由懒加载页(如 Bluetooth)
│ ├── PCDLoader/ # 点云加载(Go 仿真/雷达)
│ ├── slam/ # SLAM 模块(Go)
│ └── Programming/ # Blockly 编程页(Explore 独立 chunk)
├── models/ # Go2.glb、环境贴图、HDR、PCD 等
├── imageBlockly/ # 可视化编程块图标(~35 个)
├── imageRemoteControl/ # 遥控摇杆 UI 素材
└── sprites/ # 通用图标(photo/video/volume 等)
Vite 分包策略(从 preload / 体积推断):
| Chunk | 体积级 | 职责 |
|---|---|---|
main / index |
~4--8 MB | 主应用 + 大部分业务 Vue 页面 |
store |
~700 KB | 全局 store、路由、公共依赖 |
simulator |
~70 KB | 仿真入口壳(重逻辑在 store/PCDLoader/slam) |
Programming |
~420 KB | Explore 编程子应用 |
PCDLoader |
~1.1 MB | 点云解析 |
slam |
~130--240 KB | SLAM 前端模块 |
ammo-*.js |
~1.8 MB | Ammo.js 物理(Go) |
*.worker.js |
4--51 KB | Three / SLAM / 视频 / 求解器(Worker 线程) |
Explore 额外:g1_description.tar.xz(~17 MB,G1 机器人描述/模型资源包)、vconsole.min.*.js(H5 调试面板)。
同源关系: 68 个相同相对路径、66 个 MD5 一致 → 同一 monorepo/前端仓库、按 App 打不同 target;Go 多仿真资源,Explore 多任务/地图/编程分包。
6.7 功能页面与操控 UI
JS 经压缩混淆后,字符串中的路由名不易直接提取;但从 scoped CSS 组件类名(Vue SFC 编译产物)可还原主要功能页:
UnitreeGo main 应用(main-*.js + CSS)
| CSS / 页面特征 | 功能推断 |
|---|---|
joystick-component、left/right-joystick-component |
双摇杆遥控 |
control-body、control-cont |
遥控操作区布局 |
remote_data_wrapper |
遥控数据展示/状态 |
programme-wrapper、programming_top_bar_wrapper、blockly_field_wrapper |
Blockly 可视化编程 |
lidar_page |
雷达/点云相关页 |
three-dimensional-map |
三维地图视图 |
video-wrapper、video_window、photo-bar-component |
图传/拍照/录像 |
chat_wrapper、btn_chat、audio_player_page |
语音/聊天/音频播放 |
bolt |
快捷动作(「闪电」类操作按钮) |
disconnect_mark |
断连状态提示 |
UnitreeGo simulator 应用(simulator-*.js + CSS)
| 特征 | 功能 |
|---|---|
lidar_preview_page |
雷达预览 |
simulator、operation-wrapper、opera-bar-body |
仿真主界面与操作栏 |
mode_switch_btn |
模式切换 |
双 joystick-component |
仿真内遥控 |
three-dimensional-map |
3D 场景(配合 Go2.glb + Ammo) |
Unitree Explore index 应用
在 Go 共有遥控/视频/音频基础上,CSS 显示 更强的巡检/建图/Task 能力:
| 特征 | 功能 |
|---|---|
map_page、map_list、btn_add_map |
地图管理 |
slam_page、slam_model、slam_top_bar_wrapper |
SLAM 页 |
task_list、task_item、btn_task、btn_add_route |
任务/路线 |
all_task_list、curr_selected_task |
任务列表与选中态 |
joystick-component |
同样含双摇杆遥控 |
show_video_type |
图传类型切换 |
Explore 的 Blockly 编程在 独立 js/Programming/Programming.*.js(CSS 中对应组件较少暴露在 index 主 CSS,编程为懒加载/独立子路由)。
结论: 用户对机器狗的大部分 交互式操控(摇杆、动作、编程块、地图/SLAM、图传 UI)都在 dist 的 Vue 应用内完成;这与「WebView 很重要」的体感一致。
6.8 3D / SLAM / 编程技术栈
| 技术 | 证据 | 作用 |
|---|---|---|
| Three.js | three.worker-*.js |
WebGL 3D 渲染(Worker offload) |
| Ammo.js | ammo-CP2eG2rD.js(Go) |
物理仿真 |
| PCD 点云 | PCDLoader.*.js、111.pcd |
雷达/点云可视化 |
| SLAM | js/slam/、slam.worker-*.js |
建图/定位前端计算 |
| WASM | libvoxel-*.wasm(Go) |
体素/占用网格加速 |
| 3D 资产 | Go2.glb、Go2Root.glb、environment.glb、立方体贴图 |
Go2 模型与环境 |
| Blockly | imageBlockly/ 图标 + programme-wrapper CSS + assets/program_text_1.txt |
可视化编程 UI;生成 Python 下发机器狗(§7) |
| DDS 字样 | main/index bundle 中出现 DDS 字符串 |
与宇树机器人 DDS 中间件 命名一致;H5 侧可能通过 原生桥间接使用,而非浏览器直连 DDS |
Explore 额外:workerSolver.worker-*.js(求解器 Worker,可能用于路径/任务规划)。
6.9 原生桥接与通信
H5 不能直接访问 BLE;操控指令需经原生转发。DEX 中的桥接结构:
WebActivity
└─ AgentWeb / WebContainerImpl.loadUrl("file:///android_asset/dist/...")
├─ setWebViewClient / setWebChromeClient
├─ setWebClientProxy / setWebEventProxy
└─ IWebEventService
├─ UnitreeGo: WebEventServiceImpl (doggo2)
└─ Explore: GlobalWebEventServiceImpl (godog)
| 组件 | 说明 |
|---|---|
WebActivity |
全屏 WebView 容器,承载 dist 各入口 |
AgentWeb |
增强 WebView 封装(文件访问、ChromeClient 等) |
IWebEventService |
H5 ↔ Native 事件协议(ARouter IProvider) |
AppRouteService |
与 Web 路由/跳转相关的原生服务 |
通信分层(推断):
Vue 操控 UI(摇杆/编程/地图)
│ JS 调用 / WebEvent 桥
▼
Native(WebEventServiceImpl、lib_ble、AR8030...)
│ BLE / WiFi / DDS / rt/api/sport/request
▼
机器狗 onboard(Python high_level_api 等)
Bundle 内 未见 postMessage / webkit.messageHandlers 等典型字符串(可能被压缩或封装在 store 内),但 DEX 侧 WebEventProxy 体系明确,说明 官方路径是 Unitree 自研 H5 桥,而非通用 JSBridge 框架。
js/pages/Bluetooth.*.js 体积极小(懒加载占位),蓝牙列表/配对 UI 可能仍在主 bundle,连接 establishment 在原生 lib_ble,H5 只发「已连接/指令」类事件。
6.10 Go 与 Explore 前端差异
| 维度 | UnitreeGo | Unitree Explore |
|---|---|---|
| 主入口 JS | main-*.js(~8 MB) |
index-*.js(~4 MB) |
| 仿真 MPA | 有 simulator.html |
无 |
| 3D 环境资源 | forest/grass 大贴图、environment.glb | 精简,共享 Go2 模型 |
| 编程 | 合入 main 应用 CSS |
独立 Programming.*.js chunk |
| 地图/任务/SLAM 页 | lidar_page 为主 |
map_page、slam_page、完整 task/route UI |
| 调试 | 无 vConsole | 内置 vConsole |
| G1 资源 | 无 | g1_description.tar.xz |
| 独有 dist 文件 | ~39 个(仿真/PCD/ammo 等) | ~31 个(Programming/vConsole/g1 等) |
产品化解读:
- UnitreeGo: 前端重心 = Go2 消费遥控 + 仿真预演 + 内嵌 Blockly 编程 + 雷达/3D 地图
- Unitree Explore: 前端重心 = 多机型运维 + 地图/任务/SLAM 工单流 + 独立编程模块 + 图传,仿真弱于 Go
七、Blockly 可视化编程
7.1 核心证据
assets/dist/imageBlockly/--- Blockly 图标资源(两 App 均有)assets/program_text_1.txt--- 示例程序,含 Blockly JSON + 生成 Python- Explore 独立
js/Programming/Programming.*.js(~420 KB)
7.2 生成代码与机器人 API
示例 program_text_1.txt 显示调用链:
python
from high_level_api import *
processAction('rt/api/sport/request', 1016, ''); # 握手等动作
poseDynamic(...); # 姿态控制
Blockly 块类型示例:
shakeHands_command、jumpForward_command、happy_commandpose_dynamic_command--- 姿态动态控制(roll/pitch/yaw/height)my_procedure_def/my_procedure_call--- 自定义过程
分析: App 内 Blockly 编辑器生成 Python,通过 rt/api/sport/request 等接口下发至机器狗 onboard 运行时(programming_actuator),而非纯本地模拟。
7.3 语音语法资源
assets/call.bnf # 科大讯飞语法:打电话场景
assets/grammar_sample.abnf # ABNF 语法样例
assets/userwords # 用户词表
assets/iattest.wav # 语音测试音频
八、原生库技术栈
两 App 在 lib/arm64-v8a/ 中共打包 20 个相同 so ;Unitree Explore 额外多 7 个 AR8030 图传相关库。绝大多数可对应到已知开源或国内常见 SDK;无 Unity/Flutter/React Native/OpenCV/TensorFlow 等业务向原生引擎 so。
8.1 so 清单(按类别)
共有(20 个): FFmpeg 系 9 个 + 讯飞 MSC 1 个 + MMKV 1 个 + 百度加固 1 个 + 崩溃/监控 8 个。
Explore 独有(7 个): AR8030 模组 SDK 5 个 + 宇树 sky 封装 2 个。
8.2 共有 so 详解
媒体 / FFmpeg(9 个)
| so | 已知库 | 在 App 中的作用 |
|---|---|---|
libavcodec.so |
FFmpeg 编解码 | H.264/H.265 等音视频解码 |
libavformat.so |
FFmpeg 封装格式 | mp4、rtsp 等容器读写 |
libavutil.so |
FFmpeg 工具库 | 基础数据结构、日志 |
libavfilter.so |
FFmpeg 滤镜 | 缩放、裁剪等 |
libavdevice.so |
FFmpeg 设备 | 采集/输出设备抽象 |
libswresample.so |
FFmpeg 重采样 | 音频采样率/声道转换 |
libswscale.so |
FFmpeg 缩放 | 视频分辨率/像素格式转换 |
libffmpegkit.so |
FFmpegKit | Android 上对 FFmpeg 的封装,供 Java/Kotlin 调用 |
libffmpegkit_abidetect.so |
FFmpegKit 附属 | 运行时检测 CPU ABI,选择对应 FFmpeg 实现 |
分析: 用于视频预览、录播、图传相关解码/转码等,与 assets/standard_h1.mp4 及媒体场景一致。
语音(1 个)
| so | 已知库 | 在 App 中的作用 |
|---|---|---|
libmsc.so |
科大讯飞 MSC(Mobile Speech Client) | 语音识别、合成、语法理解 |
配套 assets/iflytek/、call.bnf、grammar_sample.abnf 等。
存储(1 个)
| so | 已知库 | 在 App 中的作用 |
|---|---|---|
libmmkv.so |
腾讯 MMKV | 高性能 key-value 本地存储(配置、缓存、用户偏好) |
加固(1 个)
| so | 已知库 | 在 App 中的作用 |
|---|---|---|
libbaiduprotect.so |
百度加固(Baidu Protect) | APK 壳、反调试、防篡改(非业务功能库) |
Release 包不可 run-as、WebView 难以 chrome://inspect,与加固策略一致。
崩溃 / 性能监控(8 个)
| so | 已知库 | 在 App 中的作用 |
|---|---|---|
libcrashlytics-anr.so |
Firebase Crashlytics | ANR(主线程卡死)检测 |
libcrash-analysis.so |
阿里 EMAS 崩溃分析 | 采集 native/Java 崩溃 |
libcrash-analysis-common.so |
EMAS 公共模块 | 崩溃上报基础设施 |
libcrash-analysis-handler.so |
EMAS 信号处理 | 捕获 SIGSEGV 等 |
libcrash-analysis-trampoline.so |
EMAS 跳板 | 崩溃 hook 跳转 |
libemas-hprof-dump.so |
阿里 EMAS | 内存 hprof dump,OOM 排查 |
libxhook-emas.so |
阿里 xHook(EMAS 版) | PLT/GOT hook,监控/插桩 |
libtbmarsxlog.so |
腾讯 Mars xlog | 高性能日志(常与 EMAS 监控配合) |
8.3 Explore 独有 so 详解
| so | 类型 | 在 App 中的作用 |
|---|---|---|
libar8030_client.so |
AR8030 模组 SDK | 无线图传/数传协议栈客户端 |
libar8030_helper.so |
AR8030 辅助层 | 连接、会话管理 |
libar8030_helper_jni.so |
AR8030 JNI 桥 | Java/Kotlin ↔ native |
libar8030_ota.so |
AR8030 OTA | 图传模组固件升级 |
libar8030_ota_upgrade.so |
AR8030 OTA 升级流程 | 同上 |
libsky_ar8030_comm.so |
宇树/Sky 自研封装 | AR8030 之上的通信封装(命名带 sky) |
libsky_serialport.so |
宇树/Sky 自研 | 串口读写(连图传模组或外设) |
分析: AR8030 常见于无人机/机器人无线 HD 图传模组;Explore 面向 B2 等需远程音视频/数传的场景。配套 assets:ar8030_helper_socket、data_stream。UnitreeGo 无上述 7 个 so,更偏 BLE + 本地 WebView 仿真。
8.4 汇总:已知库 vs 自研
| 类型 | 数量 | 代表 |
|---|---|---|
| 开源 / 国际常用 | 8 | FFmpeg 全家桶(libav*、libsw*) |
| 国内常见 SDK | 11 | MMKV、讯飞 MSC、百度加固、Firebase Crashlytics、阿里 EMAS/xHook、Mars xlog、FFmpegKit |
| 硬件厂商 + 宇树封装 | 7(仅 Explore) | AR8030 系列 + libsky_* |
未发现的业务向库: libflutter.so、libreactnative*.so(跨端)、libunity.so / libil2cpp.so(Unity)、libopencv*.so、libtensorflow*.so 等------Go2 模拟器为 WebView + Three.js,非 Unity 原生引擎。
功能对应(一句话):
FFmpeg 系 → 视频/音频处理
libmsc → 语音控制
libmmkv → 本地配置缓存
libbaiduprotect → 防逆向
EMAS/Crashlytics/Mars → 线上监控
AR8030 + sky → Explore 远程图传(Go 无)
8.5 加固配套(assets)
assets/baiduprotect-sec.dex
assets/baiduprotect1~5.jar
assets/baiduprotect1~5.i.dex
assets/libbaiduprotect_x86_64
九、第三方 SDK 集成
9.1 共有 SDK
| 类别 | 选型 | 证据 |
|---|---|---|
| 路由 | 阿里 ARouter | DEX com/alibaba/android/arouter |
| 网络 | Retrofit + OkHttp | DEX + okhttp3/ 资源 |
| JSON | Fastjson | DEX |
| 图片 | Glide | DEX |
| 数据库 | Room | DEX |
| 异步 | RxJava + Coroutines | DEX + kotlinx.coroutines META-INF |
| 事件 | EventBus | DEX |
| Web 容器 | AgentWeb | Manifest 字符串 |
| 屏幕适配 | AndroidAutoSize | Manifest autosize-init-provider |
| 工具库 | UtilCode | Manifest utilcode.provider |
| 崩溃监控 | Firebase + 阿里 EMAS | so + DEX |
| 存储 | MMKV | libmmkv.so |
| 语音 | 科大讯飞 MSC | libmsc.so + assets/iflytek/ |
| 媒体 | FFmpegKit | libffmpegkit.so |
| 加固 | 百度加固 | libbaiduprotect.so + assets |
9.2 UnitreeGo 独有 SDK
| 类别 | 选型 |
|---|---|
| 支付 | 微信 OpenSDK(WXPayEntryActivity)+ 支付宝 |
| 业务 | com.unitree.pay 支付模块 |
9.3 权限与能力(综合 Manifest + DEX)
Manifest 可见(部分): 蓝牙、相机、录音、电话、网络、振动、Wake Lock 等。
DEX 额外引用: 精/粗定位、存储读写、通知、网络状态等。
与 BLE 连狗、语音控制、相机/图传、固件升级等场景一致;需关注 Android 12+ BLE 与新存储权限适配。
十、应用架构特点
10.1 架构分层
┌─────────────────────────────────────────┐
│ Android 原生层 (Kotlin) │
│ ARouter │ lib_ble │ doggo2/godog │ 多机型 │
│ AR8030 图传 (仅 Explore) │
├─────────────────────────────────────────┤
│ WebView + assets/dist (Vite/Vue/TS) │
│ Blockly │ 3D 仿真/SLAM │ 编程页 │
├─────────────────────────────────────────┤
│ 机器狗/人形 onboard │
│ Python high_level_api │ sport/request │
└─────────────────────────────────────────┘
10.2 双 App 策略
- 底座复用 --- 20 个 so、66/68 个 H5 资源完全一致,降低维护成本
- 按产品分化 --- Go 强化 3D 仿真;Explore 强化图传与多机型
- 原生握连接 --- BLE/AR8030 在 native,实时性有保障
- H5 承载复杂 UI --- 3D、Blockly、仿真可独立迭代
10.3 潜在挑战
- 包体积大 --- 3D 资源、G1 描述包、JS legacy/modern 双构建
- H5 分叉 --- dist 已开始分化,长期需防 Go/Explore 前端债务
- 加固 --- 百度加固增加逆向与自动化测试难度
- 跨平台 --- 纯 Android 原生,iOS 需独立开发
十一、技术架构总结
11.1 架构特点
- 原生 + WebView 混合 --- 硬件控制走原生,复杂 UI/3D/编程走 H5
- 无跨端 UI 框架 --- 未使用 Flutter/RN,机器人类 App 重 BLE/图传 SDK
- 模块化清晰 --- ARouter + 多 product module,Explore 覆盖 G1/H2/R1/A2/B2
- 可视化编程 --- 自研 Blockly → Python,对接 onboard API
- 双 App 同源 --- 共享底座,按产品线拆分客户端
11.2 技术选型分析
| 技术领域 | 选型 | 原因 |
|---|---|---|
| 整体架构 | 原生 + WebView 混合 | 连接与实时控制走 native;3D/编程快速迭代 |
| 跨端 | 未使用 RN/Flutter | 重 BLE/图传/原生 SDK,H5 只包局部 |
| 模块化 | ARouter + 多 module | 多机型共用底座 |
| 编程 | Blockly → Python | 降低编程门槛,对接 onboard |
| 3D 模拟器 | WebView + Three + Ammo + WASM | Go 版 simulator.html 在 WebActivity 内 WebGL 渲染 |
| 图传 | AR8030 native(Explore) | B2 远程音视频/数据 |
| 语音 | 科大讯飞 MSC | 语音识别与语法 |
| 媒体 | FFmpegKit | 视频编解码 |
| 存储 | MMKV | 高性能 KV |
| 安全 | 百度加固 | 保护控制逻辑 |
| 监控 | EMAS + Crashlytics | 崩溃与性能 |
11.3 两款 App 一句话总结
| App | 总结 |
|---|---|
| UnitreeGo | Go2 专用:BLE + Blockly + WebView 3D 模拟器(simulator.html)+ 支付,v1.12.9 |
| Unitree Explore | 多机型平台:AR8030 图传 + G1/H2/R1/A2 + 编程页,v2.0.0,无支付 |
十二、总结
宇树科技 UnitreeGo 与 Unitree Explore 均为自研、同源双 App ,采用 Kotlin 原生 + Vite/Vue H5 混合 架构,在 BLE 连接、Blockly 编程、FFmpeg 媒体、科大讯飞语音等方面高度共享。UnitreeGo 聚焦 Go2 消费体验与 WebView 3D 模拟器 (WebActivity + simulator.html);Unitree Explore 扩展 AR8030 图传与多产品线运维,是面向 B2 及 G1/H2/R1/A2 的平台型客户端。
核心优势:
- 原生把控 BLE/图传,实时性有保障
- H5 承载 3D、Blockly 等复杂交互,迭代灵活
- 双 App 底座复用率高,多产品线扩展清晰
- 可视化编程降低机器狗使用门槛
改进方向:
- 优化包体积(3D 资源、双构建 JS、G1 描述包)
- 统一 Go/Explore 前端工程,减少 dist 分叉
- 完善 Android 12+ 权限声明与适配
- 评估 iOS 端能力对齐(当前仅 Android 分析)
附录:分析环境与数据来源
- 样本路径 (解包目录,略):
UnitreeGo/、UnitreeGo.zipUnitree_Explore/、Unitree_Explore.zip
- 主要依据:
AndroidManifest.xml(UTF-16 字符串提取)、classes*.dex、lib/arm64-v8a/*.so、assets/dist/(含time.json、CSS 组件类名、Worker 分包)、kotlin-tooling-metadata.json、assets/program_text_1.txt - 模拟器运行时验证(UnitreeGo): ADB
dumpsys activity activities(前台WebActivity)、run-as(Release 不可调试)、/proc/net/unix(无 WebView devtools socket);真机 USB 调试,App v1.12.9 - 说明: 静态结论来自可读包结构;模拟器 WebView 判定由静态 + ADB 交叉印证;加固与混淆部分类名可能不完整
分析基于 UnitreeGo(v1.12.9)与 Unitree Explore(v2.0.0)解包样本;模拟器链路经 ADB 运行时验证