最近在折腾OpenHarmony设备开发的朋友应该都深有体会——每次想测试个新功能都要烧录实体开发板,不仅效率低还容易把板子刷成砖。其实官方早就给出了解决方案:用QEMU模拟真实硬件环境。但问题来了,Windows下直接跑QEMU会遇到各种兼容性问题,而WSL2这个Linux子系统恰好能完美解决这个痛点。
我刚开始用WSL2编译QEMU时踩过不少坑,比如依赖库缺失、架构不兼容、路径配置错误等等。后来发现只要掌握几个关键步骤,整个过程其实比用实体开发板方便多了。举个例子,上周调试OpenHarmony的CSKY架构驱动时,用QEMU模拟器5分钟就能完成一次完整测试,而用实体板子至少要折腾半小时。
首先确认你的WSL2已经启用Ubuntu 20.04或更高版本。我强烈建议在开始前执行:
bash复制sudo apt update && sudo apt upgrade -y
这个操作能避免很多因软件包版本过旧导致的问题。记得有一次我卡在libglib编译错误两小时,最后发现就是没升级基础库。
官方文档里列出的依赖往往不全,这是我整理的超全清单:
bash复制sudo apt install -y build-essential zlib1g-dev pkg-config \
libglib2.0-dev binutils-dev libboost-all-dev autoconf \
libtool libssl-dev libpixman-1-dev virtualenv flex bison \
libgcrypt20-dev ninja-build libjpeg-dev libsnappy-dev \
libspice-server-dev libvdeplug-dev libbluetooth-dev
特别注意libpng的处理方式比较特殊:
bash复制sudo add-apt-repository ppa:linuxuprising/libpng12
sudo apt-get update
sudo apt install libpng12-dev
曾经有个坑是Ubuntu 20.04默认只有libpng16,而QEMU某些架构模拟需要libpng12。这个PPA源是我试过最稳定的解决方案。
官网下载qemu-6.2.0.tar.xz速度感人,我推荐这两种方式:
bash复制# 方法1:国内镜像站(速度快3倍以上)
wget https://mirrors.ustc.edu.cn/qemu/qemu-6.2.0.tar.xz
# 方法2:GitHub仓库(方便后续更新)
git clone --depth 1 -b v6.2.0 https://github.com/qemu/qemu.git
实测用镜像站下载500MB的源码包只要2分钟,而官网链接经常中途断开。GitHub方式虽然要多占点磁盘空间,但以后切换版本更方便。
解压后你会看到这些关键目录:
/target:包含各架构的模拟代码/hw:设备模拟的核心实现/roms:预置的固件镜像特别提醒:如果打算开发OpenHarmony的Xtensa架构支持,需要重点研究target/xtensa下的代码。
先创建安装目录避免污染系统路径:
bash复制sudo mkdir /opt/qemu
sudo chown -R $USER:$USER /opt/qemu
配置时建议加上调试符号,方便后续排错:
bash复制./configure --prefix=/opt/qemu --enable-debug
这里有个小技巧:用--target-list参数可以只编译特定架构,比如专为OpenHarmony开发的话可以:
bash复制./configure --target-list=xtensa-softmmu,cskyv2-softmmu
make时根据你CPU核心数调整参数,我16核的笔记本用:
bash复制make -j16
但要注意WSL2的内存限制。如果遇到OOM(内存不足)错误,建议降到-j8或-j4。
从OpenHarmony的gitee仓库下载预编译包后,经常会遇到库版本问题。比如典型的libbrlapi报错:
bash复制ldd qemu-system-cskyv2 | grep "not found"
我的解决方案是创建符号链接:
bash复制sudo ln -s /usr/lib/x86_64-linux-gnu/libbrlapi.so.0.7.0 \
/usr/lib/x86_64-linux-gnu/libbrlapi.so.0.6
这种方案比降级系统库更安全,实测在Ubuntu 20.04上完美运行。
ESP32模拟需要额外安装:
bash复制sudo apt install libgcrypt20-dev libnettle-dev
编译时如果遇到undefined reference to 'png_xxx'错误,记得检查之前安装的libpng12是否生效。
从OpenHarmony官方下载预编译的镜像:
bash复制wget https://repo.huaweicloud.com/harmonyos/os/1.0/OH-1.0.img
对于CSKY架构的启动命令示例:
bash复制/opt/qemu/bin/qemu-system-cskyv2 \
-machine smartl \
-kernel zImage \
-drive file=OH-1.0.img,format=raw \
-append "root=/dev/mmcblk0 console=ttyS0" \
-serial stdio
关键参数说明:
-machine:指定开发板类型-append:内核启动参数-serial:将串口输出重定向到当前终端在QEMU启动参数中添加:
bash复制-s -S
然后另开终端运行:
bash复制gdb-multiarch vmlinux
(gdb) target remote :1234
这样就可以单步调试OpenHarmony内核了,对于驱动开发特别有用。
WSL2默认的内存限制可能影响QEMU性能,建议在%USERPROFILE%\.wslconfig中添加:
ini复制[wsl2]
memory=8GB
swap=4GB
同时关闭Windows Defender对WSL2目录的实时扫描,能显著提升IO性能。