当前位置: 首页 > 科技观察

OpenHarmony-3.0编译构建过程

时间:2023-03-12 07:38:47 科技观察

更多内容请访问:Harmonyos.51cto.com,与华为官方联合成立的鸿蒙技术社区前言OpenHarmony-2.0编译构建过程早就计划学习OH3编译框架了of.0准备好了,最近也在做移植,终于有了一些进展。花点时间分析一下3.0的编译框架。总的来说,和2.0的区别不是很大。OHOS3.0的packageimage脚本完全由原来的2.0build\adapter\build_image.sh修改,替换为build\ohos\images\build_image.py,使packageimage镜像部分变成build_target,原来是通过shell脚本调用,但现在通过gn和ninja调用。主要文件位于文件夹build\ohos\images中。没有修改的部分我就不说了。有需要的可以看我之前的帖子。本文主要说说区别,看看OH3.0是如何将编译后的文件打包成镜像的。1、添加编译参数3.0后,在build\build_scripts\build_common.sh中添加build_cmd+="build_target=images",这句话的意思大致相当于执行默认的编译命令./build.sh--product-nameHi3516DV300会有一个默认参数--build-targetimages,具体过程如下:build\build_scripts\build_common.sh=>build\core\gn\BUILD.gn=>build\ohos\images\BUILD.gnaction_with_pydeps("${_platform}_${_image_name}_image"){script="//build/ohos/images/build_image.py"depfile="$target_gen_dir/$target_name.d"deps=["//build/ohos/包:${_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,应该也是内置的target类型检查官方手册中的Inputs和DepfilesList将操作读取(或执行)的所有文件作为输入。仅按依赖目标列出输入是不够的。它们必须由使用它们的目标直接列出,或由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镜像已经被build\ohos\images知道了\build_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='{}:{}'。格式(env_path,参数s.build_image_tools_path)os.environ['PATH']='{}:{}'.format(env_path,os.environ.get('PATH'))mkimages.mk_images(mk_image_args)#并使用真实镜像下面的函数=======================================================================#build\ohos\images\mkimage\mkimages.pydefmk_images(args):......如果“system.img"indevice:src_dir=build_rootdir(src_dir)mkfs_tools,mk_configs=load_config(config_file)mk_configs=src_dir+""+device+""+mk_configsres=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"==========================================================================#build\ohos\images\mkimage\mkextimage.py#Makeext4文件系统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(块))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:makeimagefile不管前面做什么操作,最终都是执行mke2fs和e2fsdroid关于这两个命令:mke2fs:Linux下的命令,用于创建ext文件系统。e2fsdroid:来自第三方库,third_party\e2fsprogs。详情请参考http://e2fsprogs.sourceforge.net更多信息请访问:与华为官方共建的Harmonyos技术社区https://harmonyos.51cto.com