花粉乐分享平台宣传视频
> 华为资讯 > 华为资讯 > 鸿蒙编程 > OpenHarmony-3.0 编译构建流程
OpenHarmony-3.0 编译构建流程
来源:亮子力
2022-12-02 14:17:42
494
管理
前言

OpenHarmony-2.0 编译构建流程

早就打算研究下OH3.0的编译框架了,最近一直在搞移植,总算有点进展了,抽个空来分析下3.0的编译框架。大体看了下和2.0的差别不是特别大,OHOS3.0的打包镜像脚本由原来2.0的buildadapterbuild_image.sh 全部修改替换为 buildohosimagesbuild_image.py 将打包image镜像的部分制作成build_target,以前是通过shell脚本来调用,现在是通过gn和ninja来调用。主要文件在buildohosimages这个文件夹下。没有修改的部分就不说了,有需要的可以看我之前的帖子 这篇主要说下不一样的地方,看OH3.0是如何将编译好的文件打包成镜像的。

一、增加编译参数

3.0之后在buildbuild_scriptsbuild_common.sh 增加了 build_cmd =" build_target=images",这句的意思约等于在执行默认编译命令 ./build.sh --product-name Hi3516DV300 会有个默认的参数 --build-target images,具体流程是这样的:

buildbuild_scriptsbuild_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 and Depfiles

List all files read (or executed) by an action as inputs.

It is not enough to have inputs listed by dependent targets. They must be listed directly by targets that use them, or added by a depfile.

Non-system Python imports are inputs! For scripts that import such modules, use action_with_pydeps to ensure all dependent Python files are captured as inputs.

前面还定义了一个image_list,然后使用 foreach 执行 action_with_pydeps,要生成几个img文件,就执行几次action_with_pydeps。

image_list = [ "system", "vendor", "userdata", "updater", ] foreach(_image_name, image_list) {... ...}二、调用python脚本

既然知道了img镜像是由 buildohosimagesbuild_image.py 来创建的,那就来分析下这个python脚本。

if os.path.exists(args.output_image_path): os.remove(args.output_image_path) # 删除之前生成的镜像文件夹 if args.image_name == 'userdata': _prepare_userdata(args.input_path) # 准备好 userdata.img 需要的文件 if os.path.isdir(args.input_path): _make_image(args) _dep_files = [] for _root, _, _files in os.walk(args.input_path): for _file in _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): if args.image_name == 'system': _prepare_root(args.input_path) # 准备好 system.img 需要的文件 elif args.image_name == 'updater': _prepare_updater(args.input_path) # 准备好 updater.img 需要的文件 image_type = "raw" if args.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" if args.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.pydef mk_images(args): ... ... if "system.img" in device: 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" in mk_configs: fs_type = "ext4" mkfs_tools = "mkextimage.py" # 而mkfs_tools根据文件系统类型,分别调用对应的python脚本 elif "f2fs" in mk_configs: mkfs_tools = "mkf2fsimage.py" fs_type = "f2fs"===================================================================# buildohosimagesmkimagemkextimage.py # 制作ext4文件系统def build_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:制作文件系统===================================================================def build_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

花粉社群VIP加油站

2
点赞
赏礼
赏钱
0
收藏
免责声明:本文仅代表作者个人观点,与花粉乐分享无关。其原创性以及文中陈述文字和内容未经本网证实,对本文以及其中全部或者 部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
凡本网注明 “来源:XXX(非花粉乐分享)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对 其真实性负责。
如因作品内容、版权和其它问题需要同本网联系的,请在一周内进行,以便我们及时处理。
QQ:2443165046 邮箱:info@hflfx.com
关于作者
coco(花粉渠道)
文章
608
主题
0
关注
0
粉丝
1
点击领取今天的签到奖励!
签到排行
随手拍
54个圈友 0个话题
华为手机随手拍,记录生活点滴之美好
华为P30pro
51个圈友 0个话题
这里是华为P30pro手机交流圈,欢迎华为P30pro用户进群交流
体验官
60个圈友 2个话题
华为花粉体验官,体验官专属的交流群
登录后查看您创建的圈子
登录后查看您创建的圈子
所有圈子
杭州互联网违法和不良信息举报平台 网络110报警服务 浙ICP备17046585号
2
0
分享
请选择要切换的马甲:

个人中心

每日签到

我的消息

内容搜索