
1. 从零到一在VMWare虚拟机中构建HarmonyOS编译环境的心路历程拿到开发板的那一刻心情总是激动又带点忐忑。对于HarmonyOS这样一个全新的系统第一步的环境搭建往往就是最大的拦路虎。很多朋友可能和我一样手头并没有一台现成的Linux物理机在Windows上通过虚拟机来搭建环境就成了最现实的选择。我选择了经典的VMWare Workstation搭配Ubuntu系统这条路走下来确实踩了不少坑几次都想直接找个现成的镜像算了。但坚持自己一步步搭建完成之后回头再看那些折腾的时间一点都没白费。你不仅会得到一个干净、可控的编译环境更重要的是你会对整个鸿蒙的代码结构、依赖关系和构建流程有一个从根上建立起来的理解这远比直接拿到一个“黑盒”镜像要宝贵得多。这篇文章我就把自己在Windows 10上用VMWare 14搭建Ubuntu 16.04编译环境并成功运行第一个Hello World的完整过程、核心原理和那些官方文档里不会写的“坑”详细记录下来目标是让你看完就能动手动手就能成功。2. 环境搭建的整体设计与核心思路解析2.1 为什么选择VMWare Ubuntu 16.04的组合在开始动手之前理清为什么这么选很重要。编译HarmonyOS特别是早期的LiteOS-M/LiteOS-A内核版本对Linux环境有特定要求。官方文档通常基于Ubuntu进行说明生态和社区支持最完善。选择Ubuntu 16.04而非更新的版本主要是出于稳定性和兼容性考虑。很多嵌入式编译工具链如gcc-arm-none-eabi在较新的Ubuntu发行版上可能需要处理额外的库依赖问题而16.04作为一个长期支持版其软件库版本与HarmonyOS早期文档所依赖的环境最为匹配能最大程度减少因系统环境差异导致的诡异错误。VMWare Workstation则是虚拟化方案的成熟之选。相比VirtualBox它在与宿主机的资源调度、网络配置、特别是USB设备后续烧录会用到的直通支持上更加稳定和强大。虽然使用VMware的共享文件夹功能是个“坑”后面会详细说但其整体的性能和稳定性对于需要长时间编译的嵌入式开发任务来说是值得信赖的。这个组合方案的核心思路就是在Windows宿主上利用VMWare创建一个高度隔离、又可灵活交互的标准化Linux编译环境确保编译过程的可重复性和环境一致性。2.2 物理机与虚拟机资源规划的考量虚拟机的性能直接影响到后续代码编译的速度尤其是HarmonyOS全量编译可能相当耗时。这里有几个关键参数需要你根据自己电脑的硬件情况仔细规划处理器核心数不要贪心将所有核心都分配给虚拟机。建议将物理机总核心数的一半分配给虚拟机。例如你的CPU是4核8线程可以分配2个核心、4个线程给VM。这样既能保证虚拟机有足够的计算资源又不至于让宿主机卡死影响你查资料、写文档。内存大小这是重中之重。Ubuntu 16.04桌面版本身运行需要至少1GB内存而编译HarmonyOS尤其是较大的系统组件时对内存需求很高。建议分配不少于4GB的内存给虚拟机。如果你的物理内存有16GB分配6-8GB是更稳妥的选择能显著提升编译效率避免因内存不足导致的编译失败或系统卡顿。硬盘空间采用默认的“将虚拟磁盘存储为单个文件”即可。磁盘容量建议设置40GB以上并选择“立即分配所有磁盘空间”。这虽然会在初始时占用真实的物理磁盘空间但能避免后续在编译过程中因动态扩容导致的磁盘性能下降和碎片化问题。HarmonyOS源代码、编译输出的镜像文件以及各种工具链加起来空间占用不容小觑。注意网络连接模式推荐使用“桥接模式”。这样虚拟机会获得一个与宿主机同网段的独立IP地址就像一台真实的机器在局域网里一样。这对于后续配置Samba共享文件夹以及可能进行的网络调试都至关重要。NAT模式虽然简单但在IP地址访问和端口映射上有时会带来不必要的麻烦。3. Ubuntu系统初始化与关键工具链部署详解3.1 Ubuntu基础环境配置与避坑指南安装完Ubuntu 16.04后第一件事不是急着装编译工具而是进行系统更新和基础配置。打开终端首先执行sudo apt-get update和sudo apt-get upgrade更新软件源和系统包。这个步骤能解决很多因软件版本陈旧导致的依赖问题。接下来你需要安装一些编译和开发必备的基础软件包。执行以下命令sudo apt-get install -y git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip这一长串命令看起来复杂其实每一个包都有其作用git-core用于代码管理flex和bison是语法分析器生成器build-essential包含了GCC、Make等核心编译工具libc6-dev-i386等是多架构编译支持库。一次性安装好可以避免后续编译时频繁中断去补装依赖。实操心得国内的网络环境访问Ubuntu官方源可能较慢。强烈建议更换为国内镜像源如阿里云、清华大学的镜像源。修改/etc/apt/sources.list文件后再执行update下载速度会有质的飞跃。这是提升整个搭建过程体验的第一个关键技巧。3.2 HarmonyOS专用工具链的安装与版本控制HarmonyOS的编译依赖一系列特定版本的工具。官方文档是最高行动指南必须严格对照。这里我强调几个最容易出问题的点Python要求Python 3.7。Ubuntu 16.04默认可能安装的是Python 3.5。你需要通过deadsnakesPPA源来安装更新版本的Python 3.8。sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-get update sudo apt-get install python3.8 python3.8-dev安装后可能需要使用update-alternatives命令将系统默认的python3指向3.8或者直接在后续操作中显式指定python3.8。SCons这是一个用Python编写的构建工具HarmonyOS的编译系统基于它。正如原文提到的其官网scons.org可能访问不畅。最可靠的方法是使用Python的包管理工具pip进行安装。# 确保pip是针对python3.8的 python3.8 -m pip install --upgrade pip python3.8 -m pip install scons安装完成后运行scons -v验证版本确保是3.0.4以上。hbHarmonyOS的编译构建命令行工具。这是鸿蒙自研的构建工具用于管理组件和编译入口。通过pip安装python3.8 -m pip install ohos-build安装后在终端输入hb -h如果能看到帮助信息说明安装成功。这里有个隐藏的坑hb工具对Python环境非常敏感。如果你系统中有多个Python版本务必确保你调用hb时它关联的Python解释器是你安装依赖的那个本例中是3.8。否则可能会提示找不到ohos_build模块。LLVM鸿蒙的编译器工具链针对某些平台。需要从官方指定的链接下载并解压到特定目录例如/opt/llvm。然后需要将工具链路径添加到系统的PATH环境变量中。编辑~/.bashrc文件在末尾添加export PATH/opt/llvm/bin:$PATH之后执行source ~/.bashrc使配置生效。使用clang -v命令验证是否安装成功。注意事项工具链的版本管理务必严格。我的经验是完全按照官方文档指定的版本号安装可以规避99%的因环境导致的神秘编译错误。高版本的工具可能存在兼容性问题而低版本则肯定无法满足要求。将每一步安装的命令和输出的版本号记录下来是一个非常好的排错习惯。4. 源码获取与共享目录配置的终极方案4.1 源码下载镜像站与递归克隆的抉择获取HarmonyOS源代码主要有两种方式从Gitee镜像站下载压缩包或者使用repo工具递归克隆。对于初学者我强烈推荐从镜像站下载压缩包。理由如下repo克隆需要对Git有较深理解且国内网络克隆庞大的仓库特别是包含历史提交极易失败需要反复重试耗时漫长。而镜像站提供的tar.gz压缩包是代码在某个时间点的快照下载速度快解压即用非常适合快速搭建环境进行学习和开发。你可以访问OpenHarmony的官方Gitee镜像站选择与你开发板对应的版本分支例如OpenHarmony-3.2-Beta5下载code-v3.2-Beta5.tar.gz这样的完整代码包。记住一定要核对校验和如SHA256确保文件下载完整无误。4.2 共享目录的“坑”与Samba完美解决方案这是整个环境搭建中最关键、也最容易出错的一环。很多人的第一直觉包括最初的我是使用VMWare提供的“共享文件夹”功能。将宿主机的一个目录共享给Ubuntu虚拟机这样源码放在宿主机在虚拟机里编译感觉上管理起来很方便。但这是一个巨大的陷阱VMWare的共享文件夹其底层为了实现跨系统兼容通常模拟的是FAT32或类似的不支持Linux完整特性的文件系统。这导致了一个致命问题无法创建符号链接Soft Link。而HarmonyOS以及绝大多数大型开源项目的代码树中充满了符号链接用于管理目录结构、版本兼容等。在共享文件夹中解压源码这些链接会全部损坏导致编译时找不到头文件、找不到库错误信息千奇百怪极难排查。正确的解决方案是使用Samba。Samba是在Linux上实现SMB/CIFS协议的服务能让Linux的目录像Windows网络共享一样被访问。我们的方案是在Ubuntu虚拟机中解压并存放源代码然后通过Samba将源码目录共享给Windows宿主机。这样源码在Linux原生文件系统如ext4上符号链接完好无损我们在Windows上又能通过熟悉的资源管理器访问和编辑这些文件。配置步骤如下安装Samba服务sudo apt-get install samba samba-common配置Samba编辑配置文件/etc/samba/smb.conf。建议在文件末尾添加一个新的共享区块而不是修改默认配置。sudo vim /etc/samba/smb.conf在文件末尾添加如下内容假设你的Ubuntu用户名叫harmony想把/home/harmony/openharmony目录共享出来[openharmony] comment HarmonyOS Code Share path /home/harmony/openharmony browseable yes writable yes read only no guest ok no valid users harmony create mask 0775 directory mask 0775[openharmony]这是在Windows网络里看到的共享名。path要共享的Ubuntu本地绝对路径。writable yes和read only no确保有读写权限。guest ok no禁止匿名访问更安全。valid users harmony指定允许访问的用户。设置Samba用户密码这个密码是专门用于Samba访问的可以和你的Ubuntu登录密码不同。sudo smbpasswd -a harmony系统会提示你输入并确认密码。重启Samba服务sudo service smbd restart从Windows访问在Windows文件资源管理器的地址栏输入\\虚拟机IP地址\openharmony。例如\\192.168.1.100\openharmony。系统会弹出登录框用户名填harmony密码填你刚才设置的Samba密码。登录成功后就可以像操作本地文件夹一样操作代码了。实操心得为了访问稳定建议在Windows上将这个网络位置“映射网络驱动器”分配一个盘符如Z:。这样每次打开“此电脑”就能直接访问。另外确保Ubuntu虚拟机的防火墙放行了Samba所需的端口通常是139和445或者直接暂时关闭防火墙进行测试sudo ufw disable生产环境请谨慎。5. 编译配置与第一个Hello World的诞生5.1 源码准备与hb工具初始化假设你已经通过Samba共享将下载的code-v3.2-Beta5.tar.gz拷贝到了Ubuntu的/home/harmony/目录下。接下来在Ubuntu终端中操作cd /home/harmony tar -xzf code-v3.2-Beta5.tar.gz cd openharmony解压后进入代码根目录。首先需要初始化hb工具的环境。执行hb set这个命令会交互式地让你设置代码路径和产品。通常直接按回车使用当前路径即可。然后它会列出可编译的产品列表。这里的选择取决于你的开发板型号。例如对于Hi3861开发板你可能需要选择类似wifiiot_hispark_pegasus这样的产品配置。接下来执行hb build开始编译。如果是第一次编译它会下载一些必要的依赖如GN、Ninja等构建工具然后开始漫长的编译过程。你可以使用hb build -f进行全量编译或者后续修改代码后使用hb build进行增量编译。5.2 烧录工具的选择与实战避坑编译成功后会生成二进制固件文件如Hi3861_wifiiot_app_allinone.bin位于out/hispark_pegasus/wifiiot_hispark_pegasus/类似的目录下。接下来就是把这个固件烧录到开发板。官方推荐了Hiburn海思烧录工具或J-link。对于Hi3861这类开发板Hiburn是最常用的。这里有一个大坑不要完全依赖VSCode的DevEco Device Tool插件进行烧录。正如原文作者遇到的DevEco Device Tool的串口模块serialport在Windows环境下依赖非常复杂很容易出现“无法刷新端口号”的错误即使按照提示重装serialport也未必能解决。这个问题困扰了无数开发者。最稳定可靠的方案是直接使用独立的Hiburn工具。获取Hiburn从华为官方渠道或开发板供应商提供的资料包中获取Hiburn工具例如hiburn-3.0.5.exe它是一个绿色版的Windows软件无需安装。连接开发板用USB转串口线连接开发板和电脑。在Windows设备管理器中确认串口号如COM3。配置Hiburn打开Hiburn选择正确的串口号。在“Project” - “Setting”中选择正确的波特率Hi3861通常是2000000即2Mbps。点击“Select file”按钮选择你编译生成的.bin文件。关键一步勾选右下角的“Auto burn”复选框。执行烧录点击“Connect”按钮。此时Hiburn会等待设备连接状态栏显示“Connecting...”。按住开发板上的“RST”复位键不放然后按下并松开“BOOT”键如果有最后松开“RST”键。这个操作是让芯片进入烧录模式。如果操作正确Hiburn会立即开始自动烧录进度条走动并有日志显示“Downloading...”。烧录完成后日志会显示“Execution Successful”。运行程序烧录成功后先点击“Disconnect”断开连接。取消勾选“Auto burn”。再次点击“Connect”。按下开发板的“RST”复位键。此时芯片会正常启动你刚刚烧录的程序。在Hiburn的日志窗口或者使用独立的串口调试助手如Putty、MobaXterm打开对应的串口波特率通常改为115200就能看到程序输出的日志了。那一刻当你看到[DEMO] Hello Harmony!这行打印时所有的努力都值了。注意事项烧录失败大部分问题出在“上电时序”和“模式切换”上。一定要严格按照“先Connect再操作按键进入烧录模式”的流程。如果一直失败尝试降低波特率如115200看是否能连接连接成功后再改回高速波特率进行烧录。另外确保USB线质量良好并尝试更换电脑的USB端口。6. 常见问题排查与效能优化技巧实录6.1 编译失败问题速查表在编译过程中你可能会遇到各种错误。下面是一个常见错误及解决方法的速查表错误现象可能原因解决方案hb: command not found1.ohos-build未安装成功。2. Python环境混乱hb脚本指向错误的Python。1. 用python3.8 -m pip install ohos-build --force-reinstall重装。2. 检查which hb查看其内容确保第一行#!/usr/bin/env python3指向正确的Python3.8。或直接使用python3.8 -m hb代替hb命令。ImportError: No module named ...Python依赖包缺失。根据错误提示的模块名使用pip安装。例如pip install prompt_toolkit。确保pip对应的是python3.8。SCons error: ...或链接错误1. 源码损坏特别是在共享文件夹中解压。2. 工具链路径未正确设置。3. 磁盘空间不足。1.彻底检查在Ubuntu原生目录下重新解压源码。2. 检查llvm、gcc_riscv32等工具链是否在PATH中版本是否正确。3. 使用df -h命令检查磁盘空间。编译过程卡住内存占用飙升虚拟机分配内存不足。停止编译关闭虚拟机在VMWare设置中增加内存分配如从4GB增加到6GB或8GB。Permission denied操作了需要root权限的目录或文件。使用sudo执行命令或检查目录的读写权限 (ls -la)。6.2 虚拟机与编译效能优化环境搭好了如何让它跑得更快这里有几个提升体验的技巧启用SSH服务在Ubuntu中安装并启用SSH (sudo apt-get install openssh-server)然后使用如MobaXterm、Xshell等专业的SSH客户端从Windows连接虚拟机。这样你可以在一个功能强大的终端里工作支持多标签、文件传输、命令历史搜索等远比在VMWare窗口里操作方便。使用ccache加速编译ccache是一个编译器缓存工具。第二次及以后的编译如果文件未改动会直接使用缓存极大提升增量编译速度。在编译命令前加上ccache即可例如hb build可以尝试修改构建脚本或环境变量来集成ccache具体方法需参考鸿蒙构建系统说明。虚拟机快照在完成一个纯净、可用的基础环境搭建后安装好所有工具链但尚未下载源码立即在VMWare中创建一个“快照”。给它起个名字比如“Base_Env_Ready”。以后任何时候环境被玩坏了都可以一键回滚到这个干净的状态节省大量重装系统的时间。宿主机资源释放在虚拟机进行全量编译时尽量关闭宿主机上不用的软件特别是浏览器Chrome系是内存大户将更多物理资源留给虚拟机。搭建HarmonyOS的编译环境就像为一次长途旅行准备车辆。前期细致的检查和准备选择稳定的系统、分配足够的资源、正确配置网络和共享虽然花费时间但能确保整个开发旅程顺畅无阻。当你避开了共享文件夹的巨坑解决了烧录工具的玄学问题最终看到串口打印出第一行属于自己的日志时那种对系统掌控感带来的成就感是直接使用现成镜像无法比拟的。这个过程本身就是一次深刻的学习。希望这份详尽的记录能成为你鸿蒙之旅一块坚实的垫脚石。如果在实际操作中遇到新的问题不妨回到基本原理和步骤逐一排查社区和论坛里总有热心的开发者分享他们的解决方案。