网站首页 > 技术文章 正文
适用版本:OpenHarmony 4.0 / 5.0 Standard
目标人群:想在 x86 PC、RK3568 开发板或自有硬件 上裁剪、加品牌、预装应用并生成可刷机镜像的开发者 / 团队
目录
- 环境准备
- 获取 & 管理源码
- 创建专属 Product(产品)配置
- “十大自定义”示例
- 设备移植要点(以 RK3568 为例)
- 构建、打包与刷机
- OTA 升级包生成
- 发行版签名与合规
- 持续维护与更新
1 | 环境准备
主机系统 | 推荐 | 说明 |
Ubuntu 22.04 LTS | 官方 CI 同款 | |
内存 / 磁盘 | ≥ 16 GB / 100 GB | repo sync 镜像 ~ 40 GB |
依赖 | git curl python3 ninja-build gcc g++ openjdk-17-jdk ccache | 4.x 起默认 JDK 17 |
sudo apt update && sudo apt install \
git repo curl python3 ninja-build gcc g++ make \
openjdk-17-jdk ccache -y
2 | 克隆源码并锁定版本
mkdir ~/ohm && cd ~/ohm
# ① 初始化指定分支 / 标签
repo init -u https://gitee.com/openharmony/manifest.git \
-b refs/tags/OpenHarmony-4.0-Release
# ② 下载所有子仓
repo sync -c -j$(nproc)
# ③ 可选:设置本地镜像加速
git config --global http.sslVerify false
若需长期维护,可 Fork manifest 并在其中锁定子仓 commit。
3 | 创建你的
Product
(核心定制入口)
- 复制一个基线产品
cp -r vendor/hihope/rk3568 vendor/mycorp/myboard
- 重命名与修改 config.json
"name": "myboard"
"device_company": "mycorp"
"subsystems": 增删自己需要的子系统组件
- 声明分区 & 镜像格式(如启用 A/B、ext4/erofs)
- 注册到编译系统
./build.sh --product-name myboard -p
编译系统即能解析出新的 product_path
4 | “十大自定义”实操示例
# | 自定义项 | 方法 |
① 品牌 Logo / 启动动画 | 替换 device/board/<vendor>/<board>/kernel/logo*.bmp、bootvideo.mp4,清空 out/ 后全量编译 | |
② 默认壁纸 & 主题 | applications/standard-systemui/resources/ | |
③ 预装自研 App | 在 vendor/mycorp/apps 里放 .hap,并在 config.json -> prebuilt_haps 列出 | |
④ 自定义系统属性 | 编辑 | |
⑤ 调整分区大小 | config.json -> partitions 设置 system/vendor/userdata 大小 | |
⑥ 关闭/裁剪子系统 | 去掉 subsystems 中如 telephony, bt 等条目 | |
⑦ 添加内核模块 |
| |
⑧ 专属系统服务 | 在 | |
⑨ UI 业务事件埋点 | 引入 common_event_service 并在 hisysevent JSON 定义事件 | |
⑩ 系统默认语言/时区 | init_rc/ohos.para 配置 persist.sys.locale 等键 |
5 | 设备移植要点(RK3568 示例)
- Board 目录
- device/board/rockchip/rk3568:设备树 .dts、uboot、fastboot.cfg
- Kernel
- 同步 Rockchip 分支或 mainline,保持与 BSP 补丁一致
- 驱动适配清单
- LCD/TP:drivers/gpu/drm + drivers/input
- Wi-Fi/BT:替换固件 + vendor/.../wifi.cfg
- Camera:media 子系统 HAL + sensor_list.h
开源官方已提供 DAYU200 (RK3568) 全链路适配示例,可参考步骤迅速复刻并裁剪。
6 | 编译、生成镜像并刷机
# 建议开启 ccache,加快二次编译
export USE_CCACHE=1 && ccache -M 20G
./build.sh --product-name myboard \
--target-cpu arm64 \
-j$(nproc)
- 成功后镜像位于 out/myboard/images/
- 常见产物
文件 | 用途 |
boot.img | Kernel & ramdisk |
system.img | /system 分区 |
vendor.img | /vendor 分区 |
update.img | 一键刷机包(部分板卡) |
刷机
# U 盘镜像
sudo dd if=update.img of=/dev/sdX bs=4M status=progress
# Android-fastboot 设备
fastboot flash boot boot.img
fastboot flash system system.img
...
fastboot reboot
7 | OTA 升级包制作
cd build/ohos
./ota_packaging.sh \
--product-name myboard \
--target-dir out/myboard \
--version v1.0.0 \
--output ../ota/myboard_v1.0.0.zip
脚本会比较 old/new 镜像生成增量包;客户端可使用 update_tool 下发升级指令。
8 | 签名、隐私合规与发布
- 生成 Vendor 密钥
openssl genrsa -out mycorp_private.pem 2048
openssl rsa -in mycorp_private.pem -pubout -out mycorp_public.pem
- 配置签名链 build/security/signing_profile.json
- 隐私合规
- 明示收集项 → ohos.permission.* 权限对齐
- 敏感日志屏蔽 → hisysevent 白名单
- 开源许可证:保留 Apache-2.0 / BSD / LGPL 文件头、NOTICE
9 | 持续集成与版本升级
内容 | 建议 |
CI | GitLab Runner + build.sh + 缓存 ccache |
上游合并 | 每月 repo sync + git rebase;冲突集中在 device/ & vendor/ |
回归测试 | 核心能力:启动、音视频、网络、分布式 FA/PA、OTA |
结语
通过 Product 配置 + 设备板级目录 + 资源替换 + 签名打包,你就能在 30 分钟跑通编译,1 ~ 2 天完成品牌化定制,1 周交付可刷机镜像。
无论是PC、开发板还是独立硬件,OpenHarmony 都提供了足够开放的接口与文档支持。赶紧动手,打造属于你的国产鸿蒙发行版吧!
猜你喜欢
- 2025-07-07 公司代码在内网的gitlab上,但是又想访问github,该怎么配置呢?
- 2025-07-07 Git分布式版本控制器常用命令和使用
- 2025-07-07 macbook 上安装git和将github作为托管服务器
- 2025-07-07 Jenkins实战(六)基于Jenkinsfile文件流水线发布
- 2025-07-07 Git基本使用,分布式版本控制(git fench)
- 2025-07-07 手把手教你如何上传代码到gitee服务器
- 2025-07-07 「工具」代码管理工具Git(git源代码管理工具)
- 2025-07-07 掌握git命令,图解一目了然(掌握git命令,图解一目了然的步骤)
- 2025-07-07 Git 2.47发布:引入增量多包索引、自动合并VS Code配置等
- 2025-07-07 Git安装避坑指南(git安装过程)
- 1509℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 530℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 493℃MySQL service启动脚本浅析(r12笔记第59天)
- 473℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 470℃启用MySQL查询缓存(mysql8.0查询缓存)
- 451℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 430℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 427℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)