3. 高通8155硬件架构
做智能座舱开发,环境搭建是第一道坎。很多人觉得装个系统、下个SDK有什么难的?但我在项目里见过太多人卡在这一步——不是QNX license激活失败,就是AOSP编译到一半磁盘爆了。说白了,这一步要是没走稳,后面全是坑。
今天我就把整套流程拆开揉碎了讲。你跟着我的节奏来,保证一次过。
3.1 硬件选型与Ubuntu 20.04配置
先说说硬件。高通8155的开发板,我建议你至少准备一台i7-12700以上、64GB内存、1TB NVMe固态的机器。为什么?因为AOSP全量编译一次,32GB内存直接吃满,编译时间动辄两三个小时。我团队里有个兄弟用16GB笔记本编译,结果swap撑爆,系统直接卡死。
操作系统我推荐Ubuntu 20.04 LTS。别问为什么不用22.04——QNX SDP 7.1对20.04的支持最成熟,我在22.04上踩过驱动兼容的坑,后来老老实实换回来了。
- /(根分区):100GB,ext4
- /home:剩余空间,ext4(AOSP源码放这里)
- swap:32GB(编译时内存不够就靠它救命)
装完系统后,第一件事装基础依赖:
sudo apt update && sudo apt upgrade -y
sudo apt install -y git-core gnupg flex bison build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev \
lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
嗯,这里要注意:libncurses5在20.04的源里可能找不到,需要手动添加一下。我一般直接装libncurses5-dev的替代包,或者从旧源里拉。
3.2 QNX SDP 7.1安装与License激活
QNX SDP(Software Development Platform)是QNX开发的基石。你从黑莓官网下载到的通常是.bin安装包,大概2GB左右。
安装步骤其实不复杂:
- 给安装包加执行权限:
chmod +x qnx-sdp-7.1.0.bin - 运行安装:
./qnx-sdp-7.1.0.bin - 选择安装路径,我习惯放在
/opt/qnx710 - 等待安装完成(大约10分钟)
ifconfig确认激活时用的是哪个MAC。最好把无线网卡禁掉,只用有线网卡。
激活完成后,配置环境变量:
# 在 ~/.bashrc 末尾添加
export QNX_HOST=/opt/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH
source ~/.bashrc
验证安装:
qcc --version
# 应该输出类似 QCC 7.1.0 的版本信息
3.3 Android Studio与AOSP源码下载
Android Studio是开发Android应用的IDE,而AOSP(Android Open Source Project)源码是定制系统的基础。两者都要装,但用途不同。
3.3.1 Android Studio安装
从developer.android.com下载Linux版,解压到/opt:
sudo tar -xzf android-studio-2022.3.1-linux.tar.gz -C /opt
cd /opt/android-studio/bin
./studio.sh
第一次启动会引导你安装SDK。我建议把SDK路径设到/home/你的用户名/Android/Sdk,方便管理。
3.3.2 AOSP源码下载
AOSP源码大概有40GB+,下载前确保磁盘空间充足。我用的是清华大学的镜像站,速度比Google官方快很多:
# 安装repo工具
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
# 初始化AOSP仓库(以android-13.0.0_r41为例)
mkdir ~/aosp
cd ~/aosp
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest \
-b android-13.0.0_r41 --depth=1
# 同步源码(这一步最耗时,我建议用screen或tmux跑)
repo sync -c -j8
为什么要用--depth=1?因为只拉最新提交,不拉历史记录,能省一半的下载量。我第一次没加这个参数,下了整整一天。
3.4 交叉编译工具链配置
交叉编译,说白了就是在x86的电脑上编译出能在ARM架构的8155上跑的程序。QNX和Android各有一套工具链,你得搞清楚什么时候用哪套。
| 目标平台 | 工具链 | 编译器前缀 | 典型路径 |
|---|---|---|---|
| QNX 7.1 (aarch64) | QCC | aarch64-unknown-nto-qnx7.1.0- | /opt/qnx710/host/linux/x86_64/usr/bin |
| Android 13 (aarch64) | Clang/LLVM | aarch64-linux-android33- | prebuilts/clang/host/linux-x86/clang-r450784e/bin |
3.4.1 QNX工具链配置
QNX的工具链其实装完SDP就有了。你只需要确认$QNX_HOST/usr/bin在PATH里。写个简单的测试程序:
# hello_qnx.c
#include <stdio.h>
int main() {
printf("Hello from QNX on 8155!\n");
return 0;
}
# 编译
qcc -Vgcc_ntoaarch64le hello_qnx.c -o hello_qnx
# 查看生成的文件类型
file hello_qnx
# 输出: ELF 64-bit LSB executable, ARM aarch64
看到ARM aarch64就对了。如果显示x86,说明你用的不是交叉编译器。
3.4.2 Android NDK工具链配置
Android的交叉编译稍微复杂一点。我推荐用NDK自带的独立工具链:
# 在AOSP根目录下
cd prebuilts/ndk
# 找到NDK版本,比如r25c
cd r25c
# 生成独立工具链(只需执行一次)
python build/tools/make_standalone_toolchain.py \
--arch arm64 \
--api 33 \
--install-dir /opt/android-toolchain
# 配置环境变量
export PATH=/opt/android-toolchain/bin:$PATH
export CC=aarch64-linux-android33-clang
export CXX=aarch64-linux-android33-clang++
- QNX用
qcc,链接的是QNX的libc和libm - Android用
clang,链接的是Bionic libc - 两者生成的ELF格式相同,但动态链接器和系统库完全不同,不能混用
3.5 环境验证与常见问题
所有东西装完后,我习惯写一个验证脚本,一键检查所有工具链是否就绪:
#!/bin/bash
echo "=== 环境验证脚本 ==="
# 检查QNX
if command -v qcc &> /dev/null; then
echo "[OK] QNX QCC: $(qcc --version | head -1)"
else
echo "[FAIL] QNX QCC not found"
fi
# 检查Android NDK
if command -v aarch64-linux-android33-clang &> /dev/null; then
echo "[OK] Android NDK: $(aarch64-linux-android33-clang --version | head -1)"
else
echo "[FAIL] Android NDK not found"
fi
# 检查AOSP源码
if [ -f ~/aosp/build/envsetup.sh ]; then
echo "[OK] AOSP source: found"
else
echo "[FAIL] AOSP source missing"
fi
# 检查磁盘空间
df -h ~ | awk 'NR==2{print "[INFO] Disk free: "$4}'
跑一遍,绿色通过就说明环境搭好了。如果哪个环节红了,别慌——我遇到过最多的问题是PATH没配对,或者source ~/.bashrc忘了执行。
repo sync -c -j8只拉最新代码,不要保留多个分支。另外,out/目录下的编译产物可以删掉重编,别心疼。
最后,我把整个环境搭建的流程画了张图,方便你对照检查: