0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

剖析OpenHarmony3.0编译构建流程

OpenHarmony技术社区 来源:HarmonyOS技术社区 作者:亮子力 2021-12-07 10:54 3398次阅读

早就打算研究下 OH3.0 的编译框架了,最近一直在搞移植,总算有点进展了,抽个空来分析下 3.0 的编译框架。

大体看了下和 2.0 的差别不是特别大:《OpenHarmony 2.0 Canary编译构建流程》。

OHOS3.0 的打包镜像脚本由原来 2.0 的 buildadapteruild_image.sh,全部修改替换为 buildohosimagesuild_image.py,将打包 image 镜像的部分制作成 build_target。

以前是通过 shell 脚本来调用,现在是通过 gn 和 ninja 来调用。主要文件在 buildohosimages 这个文件夹下。

没有修改的部分就不说了,有需要的可以看我之前的帖子 这篇主要说下不一样的地方,看 OH3.0 是如何将编译好的文件打包成镜像的。

增加编译参数

3.0 之后在 builduild_scriptsuild_common.sh 增加了 build_cmd+=" build_target=images"。

这句的意思约等于在执行默认编译命令 ./build.sh --product-name Hi3516DV300 会有个默认的参数 --build-target images。

具体流程是这样的:

builduild_scriptsuild_common.sh→buildcoregnBUILD.gn→buildohosimagesBUILD.gn
action_with_pydeps("${_platform}_${_image_name}_image"){
script="//build/ohos/images/build_image.py"
depfile="$target_gen_dir/$target_name.d"
deps=["//build/ohos/packages:${_platform}_install_modules"]

image_config_file=
"//build/ohos/images/mkimage/${_image_name}_image_conf.txt"
output_image_file="$current_platform_dir/images/${_image_name}.img"

image_input_path="$current_platform_dir/${_image_name}"
if(_image_name=="userdata"){
image_input_path="$current_platform_dir/data"
}

sources=[
image_config_file,
system_module_info_list,
system_modules_list,
]
outputs=[output_image_file]
args=[
"--depfile",
rebase_path(depfile,root_build_dir),
"--image-name",
_image_name,
"--input-path",
rebase_path(image_input_path,root_build_dir),
"--image-config-file",
rebase_path(image_config_file,root_build_dir),
"--output-image",
rebase_path(output_image_file,root_build_dir),
"--build-image-tools-path",
rebase_path(build_image_tools_path,root_build_dir),
]
if(sparse_image){
args+=["--sparse-image"]
}
}

通常情况下,gn 会使用 action 运行一个脚本来生成一个文件,但是这里使用的是 action_with_pydeps,应该也是内置的目标类型。查看官方手册是这么说明的:

输入和文件,将操作读取(或执行)的所有文件列为 inputs:

  • 仅按从属目标列出输入是不够的。它们必须由使用它们的目标直接列出,或者由 depfile 添加。

  • 非系统 Python 导入是输入!对于导入此类模块的脚本,请使用 action_with_pydeps 来确保将所有依赖的 Python 文件捕获为输入。

前面还定义了一个 image_list,然后使用 foreach 执行 action_with_pydeps,要生成几个 img 文件,就执行几次 action_with_pydeps。
image_list=[
"system",
"vendor",
"userdata",
"updater",
]
foreach(_image_name,image_list){......}

调用 python 脚本

既然知道了 img 镜像是由 buildohosimagesuild_image.py 来创建的,那就来分析下这个 python 脚本。
ifos.path.exists(args.output_image_path):
os.remove(args.output_image_path)#删除之前生成的镜像文件夹
ifargs.image_name=='userdata':
_prepare_userdata(args.input_path)#准备好userdata.img需要的文件
ifos.path.isdir(args.input_path):
_make_image(args)
_dep_files=[]
for_root,_,_filesinos.walk(args.input_path):
for_filein_files:
_dep_files.append(os.path.join(_root,_file))
build_utils.write_depfile(args.depfile,
args.output_image_path,
_dep_files,
add_pydeps=False)
===================================================================
def_make_image(args):
ifargs.image_name=='system':
_prepare_root(args.input_path)#准备好system.img需要的文件
elifargs.image_name=='updater':
_prepare_updater(args.input_path)#准备好updater.img需要的文件
image_type="raw"
ifargs.sparse_image:
image_type="sparse"
mk_image_args=[
args.input_path,args.image_config_file,args.output_image_path,
image_type
]
env_path="../../build/ohos/images/mkimage"
ifargs.build_image_tools_path:
env_path='{}:{}'.format(env_path,args.build_image_tools_path)
os.environ['PATH']='{}:{}'.format(env_path,os.environ.get('PATH'))
mkimages.mk_images(mk_image_args)#而真正制作镜像使用的下面的函数
===================================================================
#buildohosimagesmkimagemkimages.py
defmk_images(args):
......
if"system.img"indevice:
src_dir=build_rootdir(src_dir)
mkfs_tools,mk_configs=load_config(config_file)
mk_configs=src_dir+""+device+""+mk_configs

res=run_cmd(mkfs_tools+""+mk_configs)#制作镜像命令使用的是mkfs_tools
===================================================================
if"ext4"inmk_configs:
fs_type="ext4"
mkfs_tools="mkextimage.py"#而mkfs_tools根据文件系统类型,分别调用对应的python脚本
elif"f2fs"inmk_configs:
mkfs_tools="mkf2fsimage.py"
fs_type="f2fs"
===================================================================
#buildohosimagesmkimagemkextimage.py#制作ext4文件系统
defbuild_run_mke2fs(args):
.....
blocks=int(int(args.fs_size)/BLOCKSIZE)
mke2fs_cmd+=("mke2fs"+str(mke2fs_opts)+"-t"+FS_TYPE+"-b"
+str(BLOCKSIZE)+""+args.device+""+str(blocks))
res=run_cmd(mke2fs_cmd)# mke2fs:制作文件系统
===================================================================
defbuild_run_e2fsdroid(args):
......
e2fsdroid_cmd+=("e2fsdroid"+e2fsdroid_opts+"-f"+
args.src_dir+"-a"+args.mount_point+
""+args.device)
res=run_cmd(e2fsdroid_cmd)# e2fsdroid:制作镜像文件

无论前面执行了什么操作,最终都是为了执行 mke2fs、e2fsdroid。

关于这两个命令:

  • mke2fs:Linux 下的命令,用于建立 ext 文件系统。

  • e2fsdroid:来自三方库,third_partye2fsprogs。

详情可以参考:

http://e2fsprogs.sourceforge.net
编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11382

    浏览量

    211546
  • 编译
    +关注

    关注

    0

    文章

    669

    浏览量

    33275
  • OpenHarmony
    +关注

    关注

    25

    文章

    3776

    浏览量

    17187

原文标题:OpenHarmony3.0编译构建流程!

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    相关推荐

    KiCad直播活动(三):在 Windows上编译KiCad 手把手教您编译/构建 KiCad 源码

    Developer Ethan 同学,手把手教您编译/构建 KiCad 源码: 开发工具安装 环境变量配置 使用 VS2022 构建 KiCad 参与直播的小伙伴还有机会获得 KiCon Badge
    的头像 发表于 03-24 11:14 43次阅读
    KiCad直播活动(三):在 Windows上<b class='flag-5'>编译</b>KiCad 手把手教您<b class='flag-5'>编译</b>/<b class='flag-5'>构建</b> KiCad 源码

    2K0300 OpenHarmony源码构建指南

    2K0300 OpenHarmony源码构建参考如下 2K0300先锋派OpenHarmony源码构建指南 2K0300 源码编译wiki
    发表于 02-05 09:36

    OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

    本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程,触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系
    的头像 发表于 12-30 10:08 360次阅读
    <b class='flag-5'>OpenHarmony</b>源码<b class='flag-5'>编译</b>后烧录镜像教程,RK3566鸿蒙开发板演示

    基于系统设备树的构建流程

    用于构建 AMD embeddedsw 组件的旧方法将 .xsa 用作来自硬件人员的交接文件,并将 mdd、mld 和 mss 文件用于不同的软件配置。这使得旧方法依赖于 AMD 专属工具,如软件
    的头像 发表于 11-01 13:38 367次阅读

    鸿蒙OpenHarmony南向/北向快速开发教程-迅为RK3568开发板

    源码 P3_初次编译OpenHarmony源码 P4_OpenHarmony镜像简介以及烧写工具配置 P5_优化开发流程-搭建windows开发环境 P6_优化开发
    发表于 07-23 10:44

    AI编译器技术剖析

    随着人工智能技术的飞速发展,AI编译器作为一种新兴的编译技术逐渐进入人们的视野。AI编译器不仅具备传统编译器的功能,如将高级语言编写的源代码转换为机器可执行的代码,还融入了人工智能技术
    的头像 发表于 07-17 18:28 2034次阅读

    开源鸿蒙 编译OpenHarmony轻量系统QEMU RISC-V版本

    本文将介绍如何为QEMU RISC-V虚拟平台构建OpenHarmony轻量系统。得益于QEMU的CPU指令集模拟执行能力,该方法可以在没有开发板的情况下调试和运行OpenHarmony系统源码。本文介绍的该方法,可以用于
    的头像 发表于 07-15 10:36 1312次阅读
    开源鸿蒙 <b class='flag-5'>编译</b><b class='flag-5'>OpenHarmony</b>轻量系统QEMU RISC-V版本

    鸿蒙OpenHarmony【轻量系统 编译】 (基于Hi3861开发板)

    OpenHarmony支持hb和build.sh两种编译方式。此处介绍hb方式,build.sh脚本编译方式请参考[使用build.sh脚本编译源码]。
    的头像 发表于 05-14 17:53 1573次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>【轻量系统 <b class='flag-5'>编译</b>】 (基于Hi3861开发板)

    鸿蒙OpenHarmony开发:【编译构建指导】

    OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统,该系统提供以下基本功能
    的头像 发表于 05-13 09:31 2128次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>开发:【<b class='flag-5'>编译</b><b class='flag-5'>构建</b>指导】

    鸿蒙OpenHarmony:【常见编译问题和解决方法】

    常见编译问题和解决方法
    的头像 发表于 05-11 16:09 2847次阅读

    鸿蒙OpenHarmony【小型系统 编译】(基于Hi3516开发板)

    OpenHarmony支持hb和build.sh两种编译方式。此处介绍hb方式,build.sh脚本编译方式请参考[使用build.sh脚本编译源码]。
    的头像 发表于 05-10 15:59 850次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>【小型系统 <b class='flag-5'>编译</b>】(基于Hi3516开发板)

    鸿蒙OpenHarmony开发板解析:【Rust模块配置规则和指导】

    Rust是一门静态强类型语言,具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译OpenHarmony为了集成
    的头像 发表于 05-10 11:32 1506次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>开发板解析:【Rust模块配置规则和指导】

    鸿蒙OpenHarmony【标准系统 编译】(基于RK3568开发板)

    OpenHarmony支持hb和build.sh两种编译方式。此处介绍hb方式,build.sh脚本编译方式请参考[使用build.sh脚本编译源码]。
    的头像 发表于 05-08 17:37 1543次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>【标准系统 <b class='flag-5'>编译</b>】(基于RK3568开发板)

    鸿蒙OpenHarmony:【 编译异常处理】

    Linux编译服务器终端输入不识别的命令时提示“ImportError: No module named apt_pkg”
    的头像 发表于 04-30 17:37 1357次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>:【 <b class='flag-5'>编译</b>异常处理】

    OpenHarmony开发学习:【源码下载和编译

    本文介绍了如何下载鸿蒙系统源码,如何一次性配置可以编译三个目标平台(`Hi3516`,`Hi3518`和`Hi3861`)的编译环境,以及如何将源码编译为三个目标平台的二进制文件。
    的头像 发表于 04-14 09:36 1092次阅读
    <b class='flag-5'>OpenHarmony</b>开发学习:【源码下载和<b class='flag-5'>编译</b>】