国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

OpenHarmony-3.0 編譯構建流程

開發 前端
早就打算研究下OH3.0的編譯框架了,最近一直在搞移植,總算有點進展了,抽個空來分析下3.0的編譯框架。

[[437383]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

前言

OpenHarmony-2.0 編譯構建流程

早就打算研究下OH3.0的編譯框架了,最近一直在搞移植,總算有點進展了,抽個空來分析下3.0的編譯框架。大體看了下和2.0的差別不是特別大,OHOS3.0的打包鏡像腳本由原來2.0的build\adapter\build_image.sh 全部修改替換為 build\ohos\images\build_image.py 將打包image鏡像的部分制作成build_target,以前是通過shell腳本來調用,現在是通過gn和ninja來調用。主要文件在build\ohos\images這個文件夾下。沒有修改的部分就不說了,有需要的可以看我之前的帖子 這篇主要說下不一樣的地方,看OH3.0是如何將編譯好的文件打包成鏡像的。

一、增加編譯參數

3.0之后在build\build_scripts\build_common.sh 增加了 build_cmd+=" build_target=images",這句的意思約等于在執行默認編譯命令 ./build.sh --product-name Hi3516DV300 會有個默認的參數 --build-target images,具體流程是這樣的:

  1. build\build_scripts\build_common.sh => build\core\gn\BUILD.gn => build\ohos\images\BUILD.gn 
  2.  
  3. action_with_pydeps("${_platform}_${_image_name}_image") { 
  4.     script = "//build/ohos/images/build_image.py" 
  5.     depfile = "$target_gen_dir/$target_name.d" 
  6.     deps = [ "//build/ohos/packages:${_platform}_install_modules" ] 
  7.  
  8.     image_config_file = 
  9.     "//build/ohos/images/mkimage/${_image_name}_image_conf.txt" 
  10.     output_image_file = "$current_platform_dir/images/${_image_name}.img" 
  11.  
  12.     image_input_path = "$current_platform_dir/${_image_name}" 
  13.     if (_image_name == "userdata") { 
  14.         image_input_path = "$current_platform_dir/data" 
  15.     } 
  16.  
  17.     sources = [ 
  18.         image_config_file, 
  19.         system_module_info_list, 
  20.         system_modules_list, 
  21.     ] 
  22.     outputs = [ output_image_file ] 
  23.     args = [ 
  24.         "--depfile"
  25.         rebase_path(depfile, root_build_dir), 
  26.         "--image-name"
  27.         _image_name, 
  28.         "--input-path"
  29.         rebase_path(image_input_path, root_build_dir), 
  30.         "--image-config-file"
  31.         rebase_path(image_config_file, root_build_dir), 
  32.         "--output-image"
  33.         rebase_path(output_image_file, root_build_dir), 
  34.         "--build-image-tools-path"
  35.         rebase_path(build_image_tools_path, root_build_dir), 
  36.     ] 
  37.     if (sparse_image) { 
  38.         args += [ "--sparse-image" ] 
  39.     } 

通常情況下,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。

  1. image_list = [ 
  2.   "system"
  3.   "vendor"
  4.   "userdata"
  5.   "updater"
  6. foreach(_image_name, image_list) {... ...} 

二、調用python腳本

既然知道了img鏡像是由 build\ohos\images\build_image.py 來創建的,那就來分析下這個python腳本。

  1. if os.path.exists(args.output_image_path): 
  2.         os.remove(args.output_image_path)           # 刪除之前生成的鏡像文件夾 
  3.     if args.image_name == 'userdata'
  4.         _prepare_userdata(args.input_path)          # 準備好 userdata.img 需要的文件 
  5.     if os.path.isdir(args.input_path): 
  6.         _make_image(args) 
  7.         _dep_files = [] 
  8.         for _root, _, _files in os.walk(args.input_path): 
  9.             for _file in _files: 
  10.                 _dep_files.append(os.path.join(_root, _file)) 
  11.         build_utils.write_depfile(args.depfile, 
  12.                                   args.output_image_path, 
  13.                                   _dep_files, 
  14.                                   add_pydeps=False
  15. =================================================================== 
  16. def _make_image(args): 
  17.     if args.image_name == 'system'
  18.         _prepare_root(args.input_path)              # 準備好 system.img 需要的文件 
  19.     elif args.image_name == 'updater'
  20.         _prepare_updater(args.input_path)           # 準備好 updater.img 需要的文件 
  21.     image_type = "raw" 
  22.     if args.sparse_image: 
  23.         image_type = "sparse" 
  24.     mk_image_args = [ 
  25.         args.input_path, args.image_config_file, args.output_image_path, 
  26.         image_type 
  27.     ] 
  28.     env_path = "../../build/ohos/images/mkimage" 
  29.     if args.build_image_tools_path: 
  30.         env_path = '{}:{}'.format(env_path, args.build_image_tools_path) 
  31.     os.environ['PATH'] = '{}:{}'.format(env_path, os.environ.get('PATH')) 
  32.     mkimages.mk_images(mk_image_args)           # 而真正制作鏡像使用的下面的函數 
  33. =================================================================== 
  34. # build\ohos\images\mkimage\mkimages.py 
  35. def mk_images(args): 
  36.     ... ... 
  37.     if "system.img" in device: 
  38.         src_dir = build_rootdir(src_dir) 
  39.     mkfs_tools, mk_configs = load_config(config_file) 
  40.     mk_configs = src_dir + " " + device + " " + mk_configs 
  41.  
  42.     res = run_cmd(mkfs_tools + " " + mk_configs)    # 制作鏡像命令使用的是mkfs_tools 
  43. =================================================================== 
  44.     if "ext4" in mk_configs: 
  45.         fs_type = "ext4" 
  46.         mkfs_tools = "mkextimage.py"                # 而mkfs_tools根據文件系統類型,分別調用對應的python腳本 
  47.     elif "f2fs" in mk_configs: 
  48.         mkfs_tools = "mkf2fsimage.py" 
  49.         fs_type = "f2fs" 
  50. =================================================================== 
  51. # build\ohos\images\mkimage\mkextimage.py # 制作ext4文件系統 
  52. def build_run_mke2fs(args): 
  53.     .. ... 
  54.     blocks = int(int(args.fs_size) / BLOCKSIZE) 
  55.     mke2fs_cmd += ("mke2fs " + str(mke2fs_opts) + " -t " + FS_TYPE + " -b " 
  56.                    + str(BLOCKSIZE) + " " + args.device + " " + str(blocks)) 
  57.     res = run_cmd(mke2fs_cmd)       # mke2fs:制作文件系統 
  58. =================================================================== 
  59. def build_run_e2fsdroid(args): 
  60.     ... ... 
  61.     e2fsdroid_cmd += ("e2fsdroid" + e2fsdroid_opts + " -f " + 
  62.                       args.src_dir + " -a " + args.mount_point + 
  63.                       " " + args.device) 
  64.     res = run_cmd(e2fsdroid_cmd)    # e2fsdroid:制作鏡像文件   

無論前面執行了什么操作,最終都是為了執行mke2fs、e2fsdroid。

關于這兩個命令:

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

e2fsdroid:來自三方庫,third_party\e2fsprogs。詳情可以參考 http://e2fsprogs.sourceforge.net

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-06-28 09:38:50

鴻蒙HarmonyOS應用

2024-07-26 16:39:33

鴻蒙系統開源構建系統

2023-06-12 15:43:44

鴻蒙智能家居開發

2022-02-21 14:49:26

OpenHarmon操作系統鴻蒙

2021-09-16 15:04:28

鴻蒙HarmonyOS應用

2024-01-03 15:31:16

網格布局ArkTSGrid

2023-07-17 16:13:21

組件模塊開發的鴻蒙

2021-10-09 10:12:39

鴻蒙HarmonyOS應用

2023-08-11 14:06:58

鴻蒙Windows

2022-01-11 15:41:18

鴻蒙HarmonyOS應用

2023-07-27 14:38:33

開源鴻蒙

2021-12-03 09:50:39

鴻蒙HarmonyOS應用

2021-10-14 15:48:28

鴻蒙HarmonyOS應用

2021-07-27 11:54:51

windows系統OpenHarmony

2022-05-07 16:13:59

DevEcoTool鴻蒙

2022-05-27 15:04:53

鴻蒙操作系統

2023-02-09 15:28:19

鴻蒙編譯速度

2023-04-26 15:29:35

NAPI模塊鴻蒙

2023-07-28 15:32:26

鴻蒙操作系統

2023-02-28 15:49:09

鴻蒙應用開發
點贊
收藏

51CTO技術棧公眾號

xfplay精品久久| 精品一区二区三区在线播放视频| 精品久久久视频| 亚洲欧洲一区二区在线观看| 丁香一区二区| 日韩精品在线一区二区| 黄网站免费观看| 国产suv精品一区二区883| 亚洲自拍偷拍第一页| 日韩免费一级| 国产黄色大片在线观看| 精彩视频一区二区三区| 中文字幕9999| 日av中文字幕| 日韩大片在线| 亚洲精品白浆高清久久久久久| 日日噜噜夜夜狠狠久久丁香五月| 羞羞答答一区二区| 青青青在线观看视频| 91精品国产乱码久久久久久| 免费成人高清视频| 毛片电影在线| 欧美日本韩国一区| 极品粉嫩饱满一线天在线| 91视频免费观看| 一本一生久久a久久精品综合蜜| 欧美激情 亚洲a∨综合| 欧美在线观看网站| 亚洲高清影院| 中文字幕国产亚洲2019| 成人女同在线观看| 欧美日韩国产首页在线观看| 天堂在线视频中文网| 国产偷国产偷亚洲高清人白洁| 成年在线观看视频| 日韩av不卡在线观看| 国产99午夜精品一区二区三区| 国产成人精品一区二区免费看京| 久热精品视频在线观看| 欧美大片网站| 伊人亚洲福利一区二区三区| 欧美xxxx黑人又粗又长| 欧美一级欧美三级| 特级毛片在线| 免费在线观看黄| 欧美在线观看禁18| 中国大陆高清aⅴ毛片| 久久午夜国产精品| 日韩欧美在线一区二区| 你懂的亚洲视频| 国产欧美一区二区| 天天插综合网| 久久免费视频这里只有精品| 日韩激情电影| 亚洲男人天堂九九视频| 姬川优奈av一区二区在线电影| 日韩精品第1页| 国产亚洲精品久久久久婷婷瑜伽| 成人淫片在线看| 国产精品最新| 日产精品久久久一区二区福利| 欧美啪啪网站| 久久精品国产成人| 日韩av中文字幕一区| 91精品久久久久久久久久另类 | 亚洲免费小视频| 丰满爆乳一区二区三区| 一区在线免费| 国产精品乱子乱xxxx| 99精品欧美一区二区三区综合在线| 欧美成人精品一级| 天天综合色天天综合色h| 香蕉网站在线| 欧美色综合天天久久综合精品| 番号在线播放| 日韩精品黄色网| 亚洲欧美日韩天堂| 亚洲美女久久| 日本久久高清视频| 欧美午夜宅男影院在线观看| 头脑特工队2免费完整版在线观看| 亚洲成年人影院在线| 在线观看爽视频| 久久99精品久久久久久秒播放器| 国产真实伦在线观看| 懂色aⅴ精品一区二区三区蜜月| 自拍视频在线免费观看| 日韩av一区二区在线| 日本在线一区二区三区| 国产精品午夜国产小视频| 西西裸体人体做爰大胆久久久| 国产女人18毛片| 一区二区三区欧美在线观看| 免费看a在线观看| 国产亚洲激情视频在线| 视频精品在线观看| 亚洲精品成人自拍| 一区二区三区四区蜜桃| 精品精品导航| 欧美日韩一本到| 99热国内精品| 免费a在线观看| 日韩暖暖在线视频| 国产丶欧美丶日本不卡视频| 一级毛片在线看| 久久久久久91| 粉嫩一区二区三区在线看| 一二三区在线观看| 五月天亚洲视频| 国产精品一品视频| 中文字幕av高清在线观看| 亚洲精品综合久久中文字幕| 成人av在线播放| 国产视频在线观看网站| 91高清视频免费看| 中国av一区| 宅男午夜在线| 国产成人综合久久| 亚洲视频图片小说| 99久久婷婷国产综合精品青牛牛 | 麻豆精品传媒视频| 性久久久久久久久| 日韩视频在线一区二区三区 | 丁香色欲久久久久久综合网| 国产大陆精品国产| 国产精品伊人| 黄色美女网站在线观看| 国产三级在线| аⅴ资源天堂资源库在线| 国产精品久久久久久久美男 | 欧美一级在线播放| 国产一区二区三区国产| fc2ppv完全颜出在线播放| 57pao国产成人免费| 精品日韩中文字幕| 男男视频亚洲欧美| 性欧美videos高清hd4k| 国产成人精品免费视频大全最热| 精品少妇一区二区三区在线播放| 麻豆精品视频在线观看| av影片在线一区| 亚洲美女偷拍久久| 国产超碰精品| 日韩欧美激情一区二区| 欧美日韩在线播放一区| 三区四区不卡| 色免费在线视频| 欧美大秀在线观看| 成人avav在线| 欧美日韩国产网站| 免费观看中文字幕| 亚洲精品在线观| 日韩精品91亚洲二区在线观看| av网站无病毒在线| 日韩高清二区| 欧美一二区在线观看| 欧美精品久久久久久久久久丰满| 国产有码一区二区| 国产精品成人v| 国产一区二区美女视频| 中文字幕高清不卡| 国产尤物一区二区| 任你弄精品视频免费观看| 黄页网站在线| 高清在线观看av| 五月婷婷在线视频| 亚州精品一二三区| 伊人伊人伊人久久| 91啪九色porn原创视频在线观看| 99精品国自产在线| 国产成人综合一区| 亚洲精品中文字幕无码蜜桃| 日韩欧美亚洲在线| 91九色单男在线观看| 日韩中文字幕精品视频| 91精品国产福利在线观看| 亚洲电影第三页| 亚洲视频一区二区在线| av资源网一区| 国产成人午夜99999| 久久超碰97中文字幕| 日本欧美韩国一区三区| 麻豆国产精品官网| 麻豆视频一区二区| 一区二区三区在线电影| 蜜臀va亚洲va欧美va天堂| 亚洲成人99| 欧美fxxxxxx另类| 欧美性aaa| 佐山爱痴汉视频一区二区三区| 国产精品一区在线免费观看| 亚洲女人毛片| www在线免费观看视频| 国产福利一区二区三区在线视频| 欧美黄色www| 亚洲高清免费观看| 在线综合亚洲| 中文字幕乱码中文乱码51精品 | 精品久久99| 亚洲成人在线观看视频|