开发环境搭建:QNX/Android Automotive系统选择、SDK安装、交叉编译工具链配置、ADB与SSH调试环境

说实话,做高通8295的项目,第一步就卡住的人我见过太多了。不是SDK装不上,就是交叉编译链配不对。今天咱们就把这块硬骨头啃下来。

我个人习惯先把整个环境搭建的流程画出来,心里有个谱再动手。你看下面这张图,基本就是我们这章要干的事。

开发环境搭建总览 Step 1: 系统选择 QNX 实时系统 Android Automotive QNX SDK + Momentics IDE Android Studio + SDK Manager 交叉编译链 + SSH 交叉编译链 + ADB 目标:可编译、可烧录、可调试 两条路线,按需选择

系统选择: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 同步,日志时间戳对不上,排查问题会非常痛苦。

重要提醒:量产项目中,一定要把调试接口做成可配置的。开发阶段可以全开,但到了产线测试和最终交付阶段,该关的端口一定要关掉。安全第一。