# Ubuntu 24.04环境配置:OpenHarmony移植开发环境搭建指南
在Ubuntu 24.04系统上构建OpenHarmony命令行开发环境,为跨平台应用开发提供基础支持。本文将详细解析环境配置步骤,并展示核心编译工具的部署流程。
## 系统准备与环境依赖
OpenHarmony开发环境对系统配置有明确要求,首先进行基础环境检测:
```bash
#!/bin/bash
# 环境检测脚本:openharmony_env_check.sh
echo "=== OpenHarmony开发环境检测 ==="
echo "检测时间:$(date)"
echo ""
# 系统信息检测
echo "1. 系统信息:"
lsb_release -a
echo "内核版本:$(uname -r)"
echo ""
# 内存与存储检查
echo "2. 资源检测:"
MEM_GB=$(free -g | awk '/^Mem:/ {print $2}')
SWAP_GB=$(free -g | awk '/^Swap:/ {print $2}')
DISK_FREE=$(df -h / | awk 'NR==2 {print $4}')
echo "物理内存:${MEM_GB}GB"
echo "交换空间:${SWAP_GB}GB"
echo "根目录可用空间:${DISK_FREE}"
if [ "$MEM_GB" -lt 8 ]; then
echo "警告:建议内存不低于8GB"
fi
if [ "$SWAP_GB" -lt 8 ]; then
echo "提示:建议配置8GB以上交换空间"
fi
echo ""
# 依赖包检查
echo "3. 必要依赖检查:"
REQUIRED_PKGS=("python3.9" "git" "curl" "wget" "unzip" "tar" "make" "gcc" "g++" "cmake" "ninja-build")
for pkg in "${REQUIRED_PKGS[@]}"; do
if command -v "$pkg" >/dev/null 2>&1; then
echo "✓ $pkg 已安装"
else
echo "✗ $pkg 未安装"
fi
done
# Python版本检查
PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}')
echo "Python版本:$PYTHON_VERSION"
if [[ "$PYTHON_VERSION" == 3.9.* ]] || [[ "$PYTHON_VERSION" == 3.10.* ]]; then
echo "✓ Python版本符合要求"
else
echo "✗ 需要Python 3.9或3.10"
fi
echo ""
echo "=== 检测完成 ==="
```
## 开发环境完整配置流程
### 步骤1:系统依赖安装
```bash
#!/bin/bash
# 系统依赖安装脚本:install_dependencies.sh
echo "开始安装OpenHarmony开发依赖..."
# 更新包管理器
sudo apt update
sudo apt upgrade -y
# 安装基础编译工具
sudo apt install -y \
git \
git-lfs \
curl \
wget \
tar \
unzip \
python3.10 \
python3.10-venv \
python3-pip \
python3-dev \
build-essential \
gcc-11 \
g++-11 \
gcc-arm-none-eabi \
binutils-arm-none-eabi \
cmake \
ninja-build \
scons \
pkg-config \
libssl-dev \
libffi-dev \
libncurses5-dev \
libxml2-dev \
libusb-1.0-0-dev \
mtools \
dosfstools
# 设置Python3.10为默认Python3
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
# 安装Python必要模块
pip3 install --upgrade pip
pip3 install wheel setuptools
# 安装rust工具链(用于部分组件编译)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source $HOME/.cargo/env
# 验证安装
echo "验证安装结果:"
gcc --version | head -n1
g++ --version | head -n1
cmake --version | head -n1
python3 --version
rustc --version
echo "依赖安装完成"
```
### 步骤2:OpenHarmony源码获取与配置
```bash
#!/bin/bash
# OpenHarmony源码获取脚本:clone_openharmony.sh
# 设置工作目录
OH_WORKSPACE="$HOME/openharmony"
mkdir -p "$OH_WORKSPACE"
cd "$OH_WORKSPACE"
echo "工作目录:$OH_WORKSPACE"
# 配置Git参数
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global core.precomposeunicode true
git config --global core.quotepath false
# 安装repo工具
REPO_URL="https://gitee.com/oschina/repo/raw/fork_flow/repo-py3"
curl -o /tmp/repo $REPO_URL
sudo install /tmp/repo /usr/local/bin/repo
chmod a+x /usr/local/bin/repo
# 配置镜像源加速(国内环境)
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
# 拉取OpenHarmony源码
echo "开始拉取OpenHarmony 4.0 Release代码..."
repo init -u https://gitee.com/openharmony/manifest.git \
-b refs/tags/OpenHarmony-4.0-Release \
--no-repo-verify --depth=1
# 同步代码(可选择性同步,减少下载量)
repo sync -c --no-tags \
--current-branch \
--optimized-fetch \
-j$(nproc) \
--no-clone-bundle
echo "源码同步完成"
# 显示代码结构
echo "代码结构:"
find . -maxdepth 2 -type d -name "*.git" | head -10
```
### 步骤3:编译工具链配置
```bash
#!/bin/bash
# 编译工具链配置:setup_toolchain.sh
OH_WORKSPACE="$HOME/openharmony"
TOOLCHAIN_DIR="$OH_WORKSPACE/prebuilts"
echo "设置编译工具链..."
# 创建工具链目录
mkdir -p "$TOOLCHAIN_DIR"
cd "$TOOLCHAIN_DIR"
# 下载并配置编译工具
TOOLS=(
"gcc_riscv32-linux-musl"
"gcc_arm-none-eabi"
"clang"
"ninja"
"nodejs"
"gn"
"hc-gen"
)
for tool in "${TOOLS[@]}"; do
echo "配置 $tool..."
if [ ! -d "$tool" ]; then
# 从OpenHarmony镜像下载预编译工具
wget -q "https://repo.huaweicloud.com/harmonyos/compiler/${tool}/latest/linux/${tool}.tar.gz"
tar -xzf "${tool}.tar.gz"
rm "${tool}.tar.gz"
fi
done
# 设置环境变量
echo "设置环境变量..."
cat > "$HOME/.openharmony_env" << EOF
# OpenHarmony开发环境变量
export OH_WORKSPACE="$OH_WORKSPACE"
export PATH="\$OH_WORKSPACE/prebuilts/clang/ohos/linux-x86_64/llvm/bin:\$PATH"
export PATH="\$OH_WORKSPACE/prebuilts/gcc/linux-x86/arm/gcc-arm-none-eabi/bin:\$PATH"
export PATH="\$OH_WORKSPACE/prebuilts/gcc/linux-x86/riscv32-linux-musl/bin:\$PATH"
export PATH="\$OH_WORKSPACE/prebuilts/cmake/bin:\$PATH"
export PATH="\$OH_WORKSPACE/prebuilts/ninja/linux-x86_64:\$PATH"
export PATH="\$OH_WORKSPACE/prebuilts/nodejs/linux-x86_64/bin:\$PATH"
export PATH="\$OH_WORKSPACE/prebuilts/python/linux-x86_64/bin:\$PATH"
# 编译配置
export OHOS_TARGET_CPU=arm
export OHOS_BUILD_TYPE=release
export OHOS_COMPILER=clang
export OHOS_ROOT="\$OH_WORKSPACE"
EOF
# 使环境变量生效
source "$HOME/.openharmony_env"
echo "工具链配置完成"
```
### 步骤4:编译配置与内核构建
```python
#!/usr/bin/env python3
# 编译配置脚本:build_config.py
import os
import subprocess
import json
import sys
class OpenHarmonyBuilder:
def __init__(self, workspace_path):
self.workspace = os.path.expanduser(workspace_path)
self.config_file = os.path.join(self.workspace, "build_config.json")
self.setup_environment()
<"s2.p5k3.org.cn"><"f5.p5k3.org.cn"><"z1.p5k3.org.cn">
def setup_environment(self):
"""设置编译环境"""
env_file = os.path.expanduser("~/.openharmony_env")
if os.path.exists(env_file):
with open(env_file, 'r') as f:
for line in f:
if line.strip() and not line.startswith('#'):
key, value = line.strip().split('=', 1)
os.environ[key] = value.strip('"')
# 添加工作目录到环境
os.environ['OHOS_ROOT'] = self.workspace
def create_build_config(self, target_platform="pc"):
"""创建编译配置文件"""
config = {
"platform": target_platform,
"target_cpu": "x86_64",
"build_type": "debug",
"kernel_type": "linux",
"features": {
"enable_ace": True,
"enable_ark": True,
"enable_hdf": True,
"enable_drivers": True,
"enable_applications": True
},
"toolchain": {
"cc": "clang",
"cxx": "clang++",
"ar": "llvm-ar",
"ld": "lld"
},
"output_dir": os.path.join(self.workspace, "out", target_platform)
}
os.makedirs(os.path.dirname(self.config_file), exist_ok=True)
with open(self.config_file, 'w') as f:
json.dump(config, f, indent=2)
print(f"编译配置已生成: {self.config_file}")
return config
def run_gn_gen(self):
"""执行gn生成ninja文件"""
build_dir = os.path.join(self.workspace, "out", "pc")
gn_path = os.path.join(self.workspace, "build", "tools", "gn")
if not os.path.exists(gn_path):
# 使用预构建的gn
gn_path = os.path.join(self.workspace, "prebuilts", "gn", "linux-x86_64", "gn")
cmd = [
gn_path,
"gen",
build_dir,
f'--root="{self.workspace}"',
'--args=target_os="ohos" target_cpu="x86_64"',
'--export-compile-commands'
]
print(f"执行: {' '.join(cmd)}")
result = subprocess.run(cmd, cwd=self.workspace, capture_output=True, text=True)
if result.returncode != 0:
print(f"gn生成失败: {result.stderr}")
return False
print("gn生成成功")
return True
def run_ninja_build(self, target=None):
"""执行ninja编译"""
build_dir = os.path.join(self.workspace, "out", "pc")
ninja_path = os.path.join(self.workspace, "prebuilts", "ninja", "linux-x86_64", "ninja")
cmd = [ninja_path, "-C", build_dir]
if target:
cmd.append(target)
else:
cmd.append("all")
print(f"执行编译: {' '.join(cmd)}")
result = subprocess.run(cmd, cwd=self.workspace, capture_output=True, text=True)
if result.returncode != 0:
print(f"编译失败: {result.stderr}")
return False
print("编译成功")
return True
if __name__ == "__main__":
builder = OpenHarmonyBuilder("~/openharmony")
# 创建配置
config = builder.create_build_config("pc")
# 生成构建文件
if builder.run_gn_gen():
# 开始编译
success = builder.run_ninja_build("//kernel/linux:linux_kernel")
if success:
print("OpenHarmony PC版编译完成")
else:
print("编译过程中出现错误")
sys.exit(1)
```
### 步骤5:示例应用开发与编译
```c
// 示例:简单的OpenHarmony PC应用
// apps/demo/hello_world/src/main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
// 任务函数
static void HelloTask(void *arg) {
(void)arg;
for (int i = 0; i < 5; i++) {
printf("[OpenHarmony PC] Hello World! Count: %d\n", i);
osDelay(1000); // 延时1秒
}
printf("任务执行完成\n");
}
// 应用入口
static void AppEntry(void) {
osThreadAttr_t attr;
// 配置任务属性
attr.name = "HelloTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 4096; // 4KB栈空间
attr.priority = osPriorityNormal;
// 创建任务
if (osThreadNew(HelloTask, NULL, &attr) == NULL) {
printf("创建任务失败\n");
return;
}
printf("OpenHarmony PC应用启动成功\n");
}
// 注册应用
APP_FEATURE_INIT(AppEntry);
```
```python
# 示例应用的BUILD.gn配置文件
# apps/demo/hello_world/BUILD.gn
import("//build/ohos.gni")
# 定义可执行文件
ohos_executable("hello_world") {
sources = [
"src/main.c",
"src/utils.c"
]
include_dirs = [
"include",
"//kernel/liteos_a/kernel/include",
"//foundation/arkui/ace_engine/frameworks/core/common",
]
cflags = [
"-Wall",
"-Werror",
"-fPIC",
"-m64"
]
ldflags = [
"-lpthread",
"-lm"
]
deps = [
"//base/startup/bootstrap_lite/services/source:bootstrap",
"//foundation/arkui/ace_engine/frameworks/core/common:core_common",
]<"j8.p5k3.org.cn"><"n0.p5k3.org.cn"><"w4.p5k3.org.cn">
subsystem_name = "demo"
part_name = "hello_world"
install_enable = true
install_images = [ "system" ]
}
# 定义测试
ohos_unittest("hello_world_test") {
sources = [
"test/test_main.cpp",
"test/test_utils.cpp"
]
deps = [
":hello_world",
"//third_party/googletest:gtest_main"
]
}
```
### 步骤6:环境验证与测试
```bash
#!/bin/bash
# 环境验证脚本:verify_environment.sh
echo "=== OpenHarmony开发环境验证 ==="
echo ""
OH_WORKSPACE="$HOME/openharmony"
# 1. 检查关键目录
echo "1. 目录结构验证:"
required_dirs=(
"$OH_WORKSPACE"
"$OH_WORKSPACE/kernel"
"$OH_WORKSPACE/device"
"$OH_WORKSPACE/vendor"
"$OH_WORKSPACE/build"
"$OH_WORKSPACE/prebuilts"
)
for dir in "${required_dirs[@]}"; do
if [ -d "$dir" ]; then
echo "✓ $dir"
else
echo "✗ $dir (缺失)"
fi
done
echo ""
# 2. 检查工具链
echo "2. 工具链验证:"
tools=(
"python3"
"cmake"
"ninja"
"gn"
"clang"
"clang++"
"arm-none-eabi-gcc"
"riscv32-unknown-linux-gnu-gcc"
)
for tool in "${tools[@]}"; do
if command -v "$tool" >/dev/null 2>&1; then
version=$($tool --version 2>/dev/null | head -n1)
echo "✓ $tool: $version"
else
echo "✗ $tool (未找到)"
fi
done
echo ""
# 3. 编译测试
echo "3. 简单编译测试:"
TEST_SRC="$OH_WORKSPACE/build_test"
mkdir -p "$TEST_SRC"
cat > "$TEST_SRC/test.c" << 'EOF'
#include <stdio.h>
int main() {
printf("OpenHarmony编译测试通过\n");
return 0;
}
EOF
# 使用OpenHarmony工具链编译
if command -v clang >/dev/null 2>&1; then
clang "$TEST_SRC/test.c" -o "$TEST_SRC/test_output"
if [ -f "$TEST_SRC/test_output" ]; then
"$TEST_SRC/test_output"
echo "✓ 编译测试成功"
else
echo "✗ 编译测试失败"
fi
else
echo "✗ clang编译器未找到"
fi
echo ""
# 4. 环境变量检查
echo "4. 环境变量检查:"
env_vars=(
"OHOS_ROOT"
"PATH"
"PYTHONPATH"
)
for var in "${env_vars[@]}"; do
value="${!var}"
if [ -n "$value" ]; then
echo "✓ $var: 已设置"
else
echo "✗ $var: 未设置"
fi
done
echo ""
echo "=== 验证完成 ==="
```
## 常见问题解决
```bash
#!/bin/bash
# 问题排查脚本:troubleshoot_openharmony.sh
echo "=== OpenHarmony环境问题排查 ==="
# 1. 权限问题
echo "1. 检查权限..."
if [ "$EUID" -eq 0 ]; then
echo "警告:不建议使用root用户编译"
fi
# 2. 磁盘空间
echo "2. 检查磁盘空间..."
df -h /home
# 3. 内存使用
echo "3. 检查内存..."
free -h
# 4. 已知问题修复
echo "4. 应用已知修复..."
# 修复Python环境
if ! python3 -c "import ssl" 2>/dev/null; then
echo "修复Python SSL..."
sudo apt install -y libssl-dev
fi
# 修复git大文件支持
git lfs install --skip-smudge
# 修复编译缓存
echo "5. 清理编译缓存..."
find ~/openharmony/out -name "*.o" -type f -delete 2>/dev/null
find ~/openharmony -name "ninja.log" -delete 2>/dev/null
echo "=== 排查完成 ==="
```
通过以上步骤,可以在Ubuntu 24.04上成功搭建OpenHarmony命令行开发环境。该环境支持PC平台的OpenHarmony应用开发与移植工作,为开发者提供了完整的编译、调试和测试能力。在配置过程中,需特别注意系统依赖版本匹配和工具链路径配置,这些是确保编译成功的关键因素。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3109559/ ,如需转载,请注明出处,否则将追究法律责任。