2. 高通8295硬件架构
说实话,做高通8295的项目,第一步就卡住的人我见过太多了。不是SDK装不上,就是交叉编译链配不对。今天咱们就把这块硬骨头啃下来。
我个人习惯先把整个环境搭建的流程画出来,心里有个谱再动手。你看下面这张图,基本就是我们这章要干的事。
系统选择:QNX 还是 Android Automotive?
这个问题我每次带新人都会被问到。我的回答很简单:看你的应用场景。
| 对比维度 | QNX | Android Automotive |
|---|---|---|
| 实时性 | 硬实时,微秒级响应 | 软实时,毫秒级响应 |
| 安全认证 | ASIL-D,ISO 26262 | ASIL-B(部分模块) |
| 生态丰富度 | 相对封闭,商业授权 | 开源,应用生态成熟 |
| 典型场景 | 仪表盘、ADAS、域控 | 信息娱乐、后排娱乐、语音 |
| 开发难度 | 较高,需要嵌入式功底 | 较低,Android 开发者友好 |
我的建议:如果你做的是仪表盘或者安全相关的功能,老老实实用 QNX。如果是中控娱乐、视频播放、第三方应用,Android Automotive 更合适。8295 芯片本身支持双系统同时运行,很多量产车就是 QNX 跑仪表 + Android 跑中控。
QNX 开发环境搭建
QNX 的 SDK 安装,说实话比 Android 要麻烦一些。我记得第一次装的时候,光 license 就折腾了半天。
1. 获取 QNX SDK
你需要从 BlackBerry QNX 官网申请评估版或者商业版。拿到之后,你会得到一个 .run 安装包。
2. 安装 Momentics IDE
Momentics 是基于 Eclipse 的 IDE,专门用来开发 QNX 应用。安装步骤很简单:
- 给 .run 文件加执行权限:
chmod +x qnx-sdk-xxx.run - 运行安装:
./qnx-sdk-xxx.run - 选择安装路径,我一般放在
/opt/qnx - 配置 license 文件
3. 配置交叉编译工具链
QNX 的交叉编译链是跟 SDK 一起打包的。安装完成后,你需要设置环境变量:
# 在 ~/.bashrc 中添加
export QNX_HOST=/opt/qnx/qnx700/host/linux/x86_64
export QNX_TARGET=/opt/qnx/qnx700/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH
# 验证是否生效
which qcc
# 应该输出 /opt/qnx/qnx700/host/linux/x86_64/usr/bin/qcc
小技巧:我习惯写一个 set_qnx_env.sh 脚本,每次开新终端就 source 一下。这样不会污染全局环境。
4. SSH 调试环境
QNX 目标板默认开启 SSH 服务。你只需要知道板子的 IP 地址:
# 连接目标板
ssh root@192.168.1.100
# 上传可执行文件
scp ./hello_world root@192.168.1.100:/tmp/
# 远程执行
ssh root@192.168.1.100 "/tmp/hello_world"
注意:QNX 的 SSH 默认使用密码认证。量产环境中一定要改成密钥认证,不然安全审计过不了。我曾经有个项目就是吃了这个亏,被客户打回来重新整改。
Android Automotive 开发环境搭建
Android Automotive 的搭建相对友好,毕竟 Google 的文档摆在那里。但针对 8295 平台,有几个坑你得注意。
1. 安装 Android Studio
这个不用多说,去 developer.android.com 下载最新版就行。我建议用 Arctic Fox 或更高版本,对 Automotive 的支持更好。
2. 下载 Automotive SDK
在 SDK Manager 里,你需要勾选这些:
- Android SDK Platform 12/12L(API 31/32)
- Android Automotive OS 系统映像
- NDK(交叉编译用)
- CMake 和 LLDB
3. 交叉编译工具链配置
Android 的交叉编译链通过 NDK 提供。配置起来比 QNX 简单:
# 设置 NDK 路径
export ANDROID_NDK_HOME=$HOME/Android/Sdk/ndk/25.2.9519653
export PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
# 编译一个简单的 C 程序
aarch64-linux-android31-clang -o hello_arm64 hello.c
# 查看生成的文件信息
file hello_arm64
# 输出:ELF 64-bit LSB executable, ARM aarch64
关键点:8295 是 ARM v8 架构,64位。编译时一定要用 aarch64 前缀的工具链。用 32 位的 armv7a 编译出来的程序跑不了,我见过有人在这上面浪费了一整天。
4. ADB 调试环境
ADB 是 Android 开发的标配。针对 8295 开发板,连接方式有两种:
| 连接方式 | 命令 | 适用场景 |
|---|---|---|
| USB 连接 | adb devices |
开发板在身边,调试初期 |
| 网络连接 | adb connect 192.168.1.100:5555 |
开发板在台架上,远程调试 |
我个人更推荐网络连接。开发板通常固定在台架上,插拔 USB 很麻烦。网络连接一次配好,后面就省心了。
# 第一步:开发板上开启网络 ADB
adb tcpip 5555
# 第二步:断开 USB,用网络连接
adb connect 192.168.1.100:5555
# 第三步:验证连接
adb devices
# 输出:192.168.1.100:5555 device
避坑指南:我曾经在调试多屏显示时,ADB 突然断开,怎么都连不上。后来发现是开发板的防火墙把 5555 端口封了。解决办法:在开发板上执行 setprop service.adb.tcp.port 5555 然后重启 adbd。
双系统共存时的调试策略
8295 的一大特色就是可以同时跑 QNX 和 Android。这时候调试就有点讲究了。
- QNX 侧:用 SSH 连接,调试仪表、HUD 等安全相关应用
- Android 侧:用 ADB 连接,调试中控、后排娱乐等应用
- 跨系统通信:通过 IVI(Inter-Vehicle Interface)或者共享内存,两边都要开调试端口
嗯,这里要注意。双系统调试时,时间同步是个大问题。QNX 和 Android 各自维护自己的系统时间,如果不做 NTP 同步,日志时间戳对不上,排查问题会非常痛苦。
重要提醒:量产项目中,一定要把调试接口做成可配置的。开发阶段可以全开,但到了产线测试和最终交付阶段,该关的端口一定要关掉。安全第一。