当前位置: 首页 > news >正文

OpenHarmony-4.0-Release 源码编译记录

本文基于 Ubuntu 20.04.4 LTS

1、环境准备

这个没啥好说的,都是搞机的,用之前编译 aosp 的 linux 环境就行,有小伙伴担心会把之前的环境搞崩,

也有用 docker 编译的,我这里就直接在 aosp 环境下搞了,还省事。

安装下面这三东西,是为了下载 Harmony 源码

sudo apt install curl
sudo apt install python3-pip
sudo apt install git-lfs

安装下面这五个东西,是为了解决编译到最后报错(头铁不信的,你可以试试,等最后再安装)

sudo apt install default-jdk
sudo apt install mtd-utils
sudo apt install scons
sudo apt install gcc-arm-none-eabi
sudo apt install gcc-arm-linux-gnueabi

2、安装 repo

务必按照此步骤安装repo。ubuntu默认提供的repo每次启动都会访问googlge服务器,会被墙。
此外20.04下需要root身份执行–否则提示没权限。
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo
chmod a+x /usr/local/bin/repo
pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests

3、下载源码

[官网版本更新说明}(https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes)

目前最新为 4.0 版本,内核基于 5.10,老版本 2.x 1.x 已经停止维护,内核基于 4.19

参考官网下载方式

repo init -u https://gitee.com/openharmony/manifest -b OpenHarmony-4.0-Release --no-repo-verify
repo sync -c
repo forall -c ‘git lfs pull’

注意那个 4.0 之前没有 v,以前的版本是有这个 v 的,不然会初始化失败,还有就是注意检查电脑是否断网了

4、下载编译依赖工具包

源码下载完成后,进入根目录执行 bash build/prebuilts_download.sh

看你网速快慢,我这大概20分钟,下载完成后会多出 openharmony_prebuilts 文件夹

5、编译源码

./build.sh --product-name rk3568 --ccache

第一次编译前面阶段 2W 多个文件,后面阶段 6W 多个文件,整体时间看你电脑性能。

编译中间要是出错看提示就行,少啥就自行安装,比如这种

default-jdk is not installed. please install it.
mtd-utils is not installed. please install it.
scons is not installed. please install it.
gcc-arm-none-eabi is not installed. please install it.
gcc-arm-linux-gnueabi is not installed. please install it.
Missing dependencies, please check!
[OHOS INFO] Set cache size limit to 100.0 GB
[OHOS INFO] generated build prop info to /hom

6、烧写固件(劝你先别烧写)

最终固件路径 out\rk3568\packages\phone\images\

里面文件和普通 rk3568 aosp 项目大差不差,所以烧写方式也是一样的。

打开 rk 烧写工具,选择加载配置,选择 images 里的 config.cfg,把对应的 image

都重新选择替换就行。想要看图的可以去参考这个OpenHarmony 入门

7、内核及驱动移植

没有任何修改编译后的固件肯定是无法在板子上跑起来的,我这里修改了很长时间也没有搞定,这里记录一下一些心得。

主要原因就是内核版本差异太大,无法平行移植,有些小伙伴直接整个 kernel 替换了就成功跑起来了。

3568 有些版本的内核用的是 4.19(我这里就是),而最新的 harmony 都是基于 5.10 了

harmony 内核源码修改路径 out\kernel\src_tmp\linux-5.10

你要是内核版本一致就可以直接替换所有文件,然后稍微修改一下如下编译规则文件

out\kernel\src_tmp\linux-5.10\make-ohos.sh

替换原有 TOYBRICK_DTB 为你自己的,比如 MY3568_DTB, 总共 4 处修改

#!/bin/bashset -eSCRIPTPATH=$(dirname $realpath "$0")
export PATH=$(realpath $SCRIPTPATH/../../../../)/prebuilts/clang/ohos/linux-x86_64/llvm/bin/:$(realpath $SCRIPTPATH/../../../../)/prebuilts/develop_tools/pahole/bin/:$PATH
export PRODUCT_PATH=vendor/hihope/rk3568
IMAGE_SIZE=64  # 64M
IMAGE_BLOCKS=4096
ENABLE_LTO_O0=${3}CPUs=`sed -n "N;/processor/p" /proc/cpuinfo|wc -l`
MAKE="make LLVM=1 LLVM_IAS=1 CROSS_COMPILE=aarch64-linux-gnu-"
[ "${ENABLE_LTO_O0}" == "enable_lto_O0" ] && MAKE="${MAKE} KCFLAGS=-Wl,--lto-O0"
BUILD_PATH=boot_linux
EXTLINUX_PATH=${BUILD_PATH}/extlinux
EXTLINUX_CONF=${EXTLINUX_PATH}/extlinux.conf
# TOYBRICK_DTB=toybrick.dtb
MY3568_DTB=rk3568-evb1-ddr4-v10.dtb
if [ ${KBUILD_OUTPUT} ]; thenOBJ_PATH=${KBUILD_OUTPUT}/
fiID_MODEL=1
ID_ARCH=2
ID_UART=3
ID_DTB=4
ID_IMAGE=5
ID_CONF=6
model_list=("TB-RK3568X0   arm64 0xfe660000 rk3568-toybrick-x0-linux  Image rockchip_linux_defconfig""TB-RK3568X10  arm64 0xfe660000 rk3568-toybrick-x10-linux Image rockchip_linux_defconfig""MYBOARD3568   arm64 0xfe660000 rk3568-evb1-ddr4-v10 Image rockchip_linux_defconfig"
)function help()
{echo "Usage: ./make-ohos.sh {BOARD_NAME}"echo "e.g."for i in "${model_list[@]}"; doecho "  ./make-ohos.sh $(echo $i | awk '{print $1}')"done
}function make_extlinux_conf()
{dtb_path=$1uart=$2image=$3echo "label rockchip-kernel-5.10" > ${EXTLINUX_CONF}echo "	kernel /extlinux/${image}" >> ${EXTLINUX_CONF}# echo "	fdt /extlinux/${TOYBRICK_DTB}" >> ${EXTLINUX_CONF}echo "	fdt /extlinux/${MY3568_DTB}" >> ${EXTLINUX_CONF}cmdline="append earlycon=uart8250,mmio32,${uart} root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 rw rootwait rootfstype=ext4"echo "  ${cmdline}" >> ${EXTLINUX_CONF}
}function make_kernel_image()
{arch=$1conf=$2dtb=$3if [ "$GPUDRIVER" == "mesa3d" ]; then config_base="arch/${arch}/configs/${conf}"config_frag="../../../../device/soc/rockchip/panfrost.config"ARCH=${arch} ./scripts/kconfig/merge_config.sh ${config_base} ${config_frag}else${MAKE} ARCH=${arch} ${conf}fiif [ $? -ne 0 ]; thenecho "FAIL: ${MAKE} ARCH=${arch} ${conf}"return -1fi${MAKE} ARCH=${arch} ${dtb}.img -j${CPUs}if [ $? -ne 0 ]; thenecho "FAIL: ${MAKE} ARCH=${arch} ${dtb}.img"return -2fireturn 0
}function make_ext2_image()
{blocks=${IMAGE_BLOCKS}block_size=$((${IMAGE_SIZE} * 1024 * 1024 / ${blocks}))if [ "`uname -m`" == "aarch64" ]; thenecho y | sudo mke2fs -b ${block_size} -d boot_linux -i 8192 -t ext2 boot_linux.img ${blocks}elsegenext2fs -B ${blocks} -b ${block_size} -d boot_linux -i 8192 -U boot_linux.imgfireturn $?
}function make_boot_linux()
{arch=${!ID_ARCH}uart=${!ID_UART}dtb=${!ID_DTB}image=${!ID_IMAGE}conf=${!ID_CONF}if [ ${arch} == "arm" ]; thendtb_path=arch/arm/boot/dtselsedtb_path=arch/arm64/boot/dts/rockchipfirm -rf ${BUILD_PATH}mkdir -p ${EXTLINUX_PATH}make_kernel_image ${arch} ${conf} ${dtb}if [ $? -ne 0 ]; thenexit 1fimake_extlinux_conf ${dtb_path} ${uart} ${image}cp -f ${OBJ_PATH}arch/${arch}/boot/${image} ${EXTLINUX_PATH}/# cp -f ${OBJ_PATH}${dtb_path}/${dtb}.dtb ${EXTLINUX_PATH}/${TOYBRICK_DTB}cp -f ${OBJ_PATH}${dtb_path}/${dtb}.dtb ${EXTLINUX_PATH}/${MY3568_DTB}cp -f logo*.bmp ${BUILD_PATH}/if [ "enable_ramdisk" != "${ramdisk_flag}" ]; thenmake_ext2_imagefi
}ramdisk_flag=$2
found=0
for i in "${model_list[@]}"; doif [ "$(echo $i | awk '{print $1}')" == "$1" ]; thenmake_boot_linux $ifound=1fi
done

device\board\hihope\rk3568\kernel\build_kernel.sh

修改内核编译指定使用刚刚的 MYBOARD3568,替换原来 TB-RK3568X0

# eval $MAKE_OHOS_ENV ./make-ohos.sh TB-RK3568X0 $RAMDISK_ARG ${ENABLE_LTO_O0}
eval $MAKE_OHOS_ENV ./make-ohos.sh MYBOARD3568 $RAMDISK_ARG ${ENABLE_LTO_O0}

再次执行 ./build.sh --product-name rk3568 --ccache 重新编译

8、编译错误举例

错误1、内核版本差异,dts 文件属性不兼容,出现在 rk3568-dram-default-timing.dtsi 中 260 行,去修改注释即可

[OHOS ERROR] DTC arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtb
[OHOS ERROR] Error: /home/ubuntu/code/OpenHarmony4.0/out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi:260.27-28 syntax error
[OHOS ERROR] FATAL ERROR: Unable to parse input tree
[OHOS ERROR] make[3]: *** [scripts/Makefile.lib:329: arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtb] Error 1
[OHOS ERROR] make[2]: *** [/home/ubuntu/code/OpenHarmony4.0/out/kernel/src_tmp/linux-5.10/Makefile:1405: rockchip/rk3568-evb1-ddr4-v10.dtb] Error 2
[OHOS ERROR] make[2]: *** Waiting for unfinished jobs…
[OHOS ERROR] make[1]: *** [arch/arm64/Makefile:208: rk3568-evb1-ddr4-v10.img] Error 2
[OHOS ERROR] make[1]: Leaving directory ‘/home/ubuntu/code/OpenHarmony4.0/out/kernel/OBJ/linux-5.10’
[OHOS ERROR] make: *** [Makefile:185: __sub-make] Error 2

错误2、修改的配置文件有问题

[OHOS ERROR] FAILED: …/kernel/src_tmp/linux-5.10/boot_linux …/kernel/checkpoint/compile_check
[OHOS ERROR] /usr/bin/env …/…/device/board/hihope/rk3568/kernel/build_kernel.sh …/…/kernel/linux/linux-5.10 /home/ubuntu/code/OpenHarmony4.0/out/rk3568/packages/phone/images /home/ubuntu/code/OpenHarmony4.0/device/board/hihope/rk3568 vendor/hihope/rk3568 /home/ubuntu/code/OpenHarmony4.0 rockchip rk3568 hihope root default disable_lto_O0

9、开机 logo 替换

device\board\hihope\rk3568\kernel\logo.bmp

device\board\hihope\rk3568\kernel\logo_kernel.bmp

10、一些常见路径

applications\standard 系统核心应用,包括日历、电话、相机、联系人、Setting、SystemUI 等

out\kernel\src_tmp\linux-5.10 最终编译内核源码路径

out\kernel\OBJ\linux-5.10 内核源码编译 obj 路径

kernel\linux\linux-5.10 SDK自带原生 kernel 路径

device\board\hihope\rk3568 编译脚本路径

openharmony kernel 代码构成如下:

①、SDK 自带原生 kernel(kernel\linux\linux-5.10\)

②、openharmony HDF驱动补丁包 hdf.patch(kernel\linux\patches\linux-5.10\rk3568_patch\)

③、方案商需求的内核补丁包 kernel.patch(kernel\linux\patches\linux-5.10\rk3568_patch\)

由1中kernel加上2、3中的patch,组合成最终的kernel代码(out\kernel\src_tmp\linux-5.10)

该工作由 device\board\hihope\rk3568\kernel\build_kernel.sh完成

脚本每次执行会时开头都会删除 out\kernel\src_tmp\linux-5.10 目录,重新组合生成。

相关文章:

OpenHarmony-4.0-Release 源码编译记录

本文基于 Ubuntu 20.04.4 LTS 1、环境准备 这个没啥好说的,都是搞机的,用之前编译 aosp 的 linux 环境就行,有小伙伴担心会把之前的环境搞崩, 也有用 docker 编译的,我这里就直接在 aosp 环境下搞了,还省…...

HTML新手入门笔记整理:块元素和行内元素

块元素 在HTML中,块元素在浏览器显示状态下独占一行,并且排斥其他元素与其位于一行。一般情况下,块元素内部可以容纳其他块元素和行内元素。 常见块元素 块元素 说明 h1~h6 标题元素 p 段落元素 div div元素 hr 水平线 ol 有序列…...

Hook+jsdom 解决cookie逆向

前言 记录下如何破cookie逆向 目标 目标网址:https://q.10jqka.com.cn/ 目标接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 对抗:cookie反爬虫处理,关键字v,如图 解决步骤 1、JS中关键字查找 如上,我们找到了关键字 v,…...

【封装UI组件库系列】封装Icon图标组件

封装UI组件库系列第三篇封装Icon图标组件 🌟前言 🌟封装Icon 1.创建Icon组件 2.引用svg图标库 第一步 第二步 第三步 3.二次封装 4.封装自定义属性 🌟总结 🌟前言 在前端开发中,大家可能已经用过各种各样的UI组…...

STM32:基本定时器原理和定时程序

一、初识定时器TIM 定时器就是计数器,定时器的作用就是设置一个时间,然后时间到后就会通过中断等方式通知STM32执行某些程序。定时器除了可以实现普通的定时功能,还可以实现捕获脉冲宽度,计算PWM占空比,输出PWM波形&am…...

EntityFramework 批量删除操作

刚刚开始使用Entityframwork 来操作数据库。遇到了批量删除数据。 EF内部用的方法是:dbcontext.Datas.RemoveRange(list); 这总方法,少量数据是可行的。 但遇到大数据量的时候,这个方法完全不能用。 所以找了另一种方法: stri…...

springboot使用的设计模式

设计模式是在软件设计中常用的一些通用解决方案。在开发商城编码时,以下设计模式可能会有用: 工厂模式(Factory Pattern): 用于创建对象的模式。在商城中,可能会涉及到创建不同类型的商品、订单等对象&…...

IP地址定位技术发展与未来趋势

随着互联网的快速发展,人们对网络的需求和依赖程度越来越高。在海量的网络数据传输中,IP地址定位技术作为网络安全与信息追踪的重要手段,其精准度一直备受关注。近年来,随着技术的不断进步,IP地址定位的精准度得到了显…...

AI与交通运输

人工智能(AI)正在改变几乎所有行业,交通运输也不例外。 虽然与某些行业相比,我们运输货物和乘客的方式在过去 50 年里变化相对较小,但人工智能有望引发一场运输革命—如果你正在寻找人工智能的机会,不要错过…...

window.requestAnimationFrame+localStorage+canvas实现跨窗口小球连线效果

文章目录 前言效果代码后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端系列文章 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家…...

使用AndResGuard报错:copy res file not in resources.arsc file:Ezi.xml

Android使用AndResGuard进行资源混淆,压缩。 源码地址:GitHub - shwenzhang/AndResGuard: proguard resource for Android by wechat team 集成完成后编译过程中出现如下错误: 14:57:05 copy res file not in resources.arsc file:IUk.xml…...

插入排序(形象类比)

最近在看riscv手册的时候,里面有一段代码是插入排序,但是单看代码的时候有点迷,没看懂咋操作的,后来又查资料复习了一下,最终才把代码看明白,所以写篇博客记录一下。 插入排序像打扑克牌 这是我听到过比较形…...

ElasticSearch 同步的方式

ElasticSearch 同步的方式 ElasticSearch是一款强大的分布式搜索和分析引擎,支持多种方式同步数据和日志。下面介绍几种常见的同步方式: 1. Logstash Logstash 是 ElasticStack 的一部分,用于收集、处理和转发日志和事件数据。通过配置 Lo…...

easyExcel实现分批导入,动态表头分批导出,以及导出表格样式设置

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency> 一&#xff0c;分批导入 1.首先配置表格头映射类 Getter Setter EqualsAndHashCode public class …...

Android BottomNavigationView底部菜单栏文字显示问题

1. BottomNavigationView 如果tab栏数据小于等于3个&#xff0c;那么图标和文字都是展示出来&#xff1b; 2. BottomNavigationView 如果tab栏数据大于3个&#xff0c;那么图标会显示出来&#xff0c;但是文字会隐藏&#xff1b; 3. 解决方式&#xff1a; &#xff08;当底部…...

从零开始学习typescript——运算符(条件运算法、逻辑运算符、类型运算符、位运算)

条件运算符 条件运算符是一个根据条件返回不同运算结果的运算符 关键字&#xff1a;?: 三元运算符 它可以换成if …else 判断 ? true &#xff1a; false 判断为true&#xff0c;返回&#xff1f;号后面的&#xff0c;判断为false ,返回&#xff1a; 号后面的 逻辑运算符 用…...

【开源】基于Vue.js的康复中心管理系统

项目编号&#xff1a; S 056 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S056&#xff0c;文末获取源码。} 项目编号&#xff1a;S056&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员…...

抢先看|第二届世界直播电商大会邀您共话时代“新电商”

党的二十大报告指出&#xff0c;要加快发展数字经济&#xff0c;促进数字经济和实体经济深度融合。要深化国家数字经济创新发展试验区建设&#xff0c;打造一批具有国际竞争力的战略性新兴产业集群和数字产业集群。电子商务作为数字经济中规模最大、表现最活跃、发展势头最好的…...

火爆火爆!影响超250万读者,Python入门圣经全新升级!

人生苦短&#xff0c;快学Python&#xff01; 什么&#xff1f;你没用过&#xff0c;也没开始学习&#xff0c;甚至没有认真了解过这门语言&#xff1f;那你一定这一秒就开始发力——下面让我们先简单看看 Python 有多火。权威编程语言排行榜 TIOBE&#xff0c;2022 和 2023 都…...

大数据学习(23)-hive on mapreduce对比hive on spark

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...