OpenHarmony-2.0-Canary 編譯構(gòu)建流程
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
OpenHarmony-2.0-Canary
2.0版本的編譯發(fā)生了很大的變化,由hb命令,變成了build.sh。經(jīng)過(guò)分析發(fā)現(xiàn),build.sh也是調(diào)用各種的python腳本來(lái)進(jìn)行構(gòu)建。這樣看來(lái)1.1.0用json寫配置,用python的 hb 解析,再調(diào)用gn、ninja來(lái)執(zhí)行編譯構(gòu)建反而更簡(jiǎn)單了。估計(jì)下個(gè)版本還會(huì)改,我估計(jì)會(huì)統(tǒng)一成hb命令。
所以這次先簡(jiǎn)單分析下。
- -x #回顯參數(shù)和命令
 - -v #回顯執(zhí)行的源碼
 - 打開(kāi) OpenHarmony\build\build_scripts 下的 build.sh、build_common.sh、build_ohos.sh、build_standard.sh、parse_params.sh
 - 將set -e 改為 set -exv 開(kāi)啟調(diào)試模式
 
build.sh
加了調(diào)試參數(shù),我們來(lái)分析下 build.sh 在編譯構(gòu)建中做了什么。
- # 各種判斷和獲取參數(shù)
 - # preloader 一.預(yù)加載
 - ${PYTHON3} ${source_root_dir}/build/loader/preloader/preloader.py \
 - --product-name ${product_name} \
 - --source-root-dir ${source_root_dir} \
 - --products-config-dir "productdefine/common/products" \
 - --preloader-output-root-dir "out/build_configs"
 - # 設(shè)置環(huán)境變量
 - source ${source_root_dir}/out/build_configs/${product_name}/preloader/build.prop
 - # source /home/bright/OpenHarmony/out/build_configs/Hi3516DV300/preloader/build.prop
 - # call build 二.編譯構(gòu)建
 - ${source_root_dir}/build/build_scripts/build_${system_type}.sh \
 - --product-name ${product_name} \
 - --device-name ${device_name} \
 - --target-os ${target_os} \
 - --target-cpu ${target_cpu} \
 - ${build_params}
 
一、預(yù)加載
debug的方法,用單步調(diào)試來(lái)看看這個(gè) preloader.py 的作用。
調(diào)試參數(shù):
- {
 - // 使用 IntelliSense 了解相關(guān)屬性。
 - // 懸停以查看現(xiàn)有屬性的描述。
 - // 欲了解更多信息,請(qǐng)?jiān)L問(wèn): https://go.microsoft.com/fwlink/?linkid=830387
 - "version": "0.2.0",
 - "configurations": [
 - {
 - "name": "preloader.py",
 - "type": "python",
 - "request": "launch",
 - "program": "./build/loader/preloader/preloader.py",
 - "console": "integratedTerminal",
 - "args": [
 - "--product-name","Hi3516DV300",
 - "--source-root-dir","",
 - "--products-config-dir","productdefine/common/products",
 - "--preloader-output-root-dir","out/build_configs"
 - ],
 - "stopOnEntry": true
 - }
 - ]
 - }
 
調(diào)用了2個(gè)python文件,Z:\OpenHarmony\build\loader\preloader\preloader.py 和 Z:\OpenHarmony\build\scripts\util\file_utils.py
這個(gè)函數(shù)有4個(gè)參數(shù)。
- python3 build/loader/preloader/preloader.py \
 - --product-name Hi3516DV300 \
 - --source-root-dir "" \
 - --products-config-dir productdefine/common/products \
 - --preloader-output-root-dir out/build_configs
 - Z:\OpenHarmony\build\loader\preloader\preloader.py:180
 - # 建議斷點(diǎn)打在這,跳過(guò)import
 - parser = argparse.ArgumentParser()
 
全部操作主要就是def _run(args):這一個(gè)函數(shù)
- Z:\OpenHarmony\build\loader\preloader\preloader.py:133
 - def _run(args):
 - # 忽略不重要的步驟,直接看核心部分
 - # 生成 out/build_configs/Hi3516DV300/preloader/parts.json
 - write_json_file(parts_info_file, parts_config_info)
 - # 獲取 OpenHarmony/build/loader/preloader/platforms.template 這個(gè)模板
 - platforms_template_file = _get_platform_template_file(args.source_root_dir)
 - # 復(fù)制 OpenHarmony\out\build_configs\standard_system\platforms.build
 - _copy_platforms_config(platforms_template_file, parts_info_file,
 - platform_config_output_path)
 - _build_info_list = []
 - build_info_file = os.path.join(product_info_output_path, 'build.prop')
 - for k, v in build_configs.items():
 - _build_info_list.append('{}={}'.format(k, v))
 - # 生成 out/build_configs/Hi3516DV300/preloader/build.prop
 - write_file(build_info_file, '\n'.join(_build_info_list))
 
簡(jiǎn)單來(lái)說(shuō)就是通過(guò)產(chǎn)品形態(tài)配置倉(cāng)調(diào)取3個(gè)json文件+1個(gè)platforms.template,生成3個(gè)配置文件
產(chǎn)品形態(tài)配置倉(cāng)調(diào)取3個(gè)json文件,具體可以參考:https://gitee.com/openharmony/productdefine_common
配置文件:
- 配置文件:
 - productdefine/common
 - ├── base # 不同系統(tǒng)類型的最小系統(tǒng),開(kāi)發(fā)者不用配置,系統(tǒng)提供
 - │ └── standard_system.json
 - ├── device # device配置,配置文件按照device name命名
 - │ └── hi3516dv300.json
 - └── products # 產(chǎn)品配置,配置文件按照product name命名
 - └── Hi3516DV300.json
 - 輸出文件:
 - ├── Hi3516DV300
 - │ └── preloader
 - │ ├── build.prop
 - │ └── parts.json
 - └── standard_system
 - └── platforms.build
 
來(lái)個(gè)更直觀的對(duì)比圖吧。
二、編譯構(gòu)建 build_standard.sh
這個(gè)腳本有2個(gè)任務(wù):
準(zhǔn)備好參數(shù)執(zhí)行g(shù)n、ninja構(gòu)建命令。
將編譯好的文件打包成鏡像。
- build/build_scripts/build_standard.sh --product-name Hi3516DV300 --device-name hi3516dv300 --target-os ohos --target-cpu arm
 - # 換個(gè)姿勢(shì),方便查看
 - build_standard.sh
 - --product-name Hi3516DV300
 - --device-name hi3516dv300
 - --target-os ohos
 - --target-cpu arm
 
接下來(lái)先分析下 build_standard.sh
- Z:\OpenHarmony\build\build_scripts\build_standard.sh
 - # 忽略不重要的步驟,直接看核心部分
 - function main() {
 - # build ohos
 - do_make_ohos # 這個(gè)函數(shù)在 OpenHarmony\build\build_scripts\build_common.sh 文件中。
 - # 而最終這個(gè)函數(shù)會(huì)生成,下面這條構(gòu)建腳本,主要的編譯工作都是由 build_ohos.sh 來(lái)完成的。
 - + build/build_scripts/build_ohos.sh device_type=Hi3516DV300 target_os=ohos target_cpu=arm gn_args=is_standard_system=true
 - ... ...
 - # build images
 - build/adapter/images/build_image.sh --device-name ${device_name} \
 - --ohos-build-out-dir ${ohos_build_root_dir}/packages/phone
 - # 第二部分重要工作是生成鏡像。參考:2.【生成鏡像】
 - + build/adapter/images/build_image.sh --device-name hi3516dv300 --ohos-build-out-dir /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone
 - }
 
1.build_ohos.sh【編譯構(gòu)建】
這個(gè)腳本的結(jié)構(gòu)就簡(jiǎn)單了
- 參數(shù)初始化
 - 執(zhí)行編譯構(gòu)建gn、ninjia
 - 統(tǒng)計(jì)分析結(jié)果
 
- build/build_scripts/build_ohos.sh
 - device_type=Hi3516DV300
 - target_os=ohos
 - target_cpu=arm
 - gn_args=is_standard_system=true
 - # 忽略不重要的步驟,直接看核心部分
 - main()
 - {
 - source ${BUILD_SCRIPT_DIR}/pre_process.sh
 - pre_process "$@" # 再執(zhí)行a.參數(shù)初始化
 - source ${BUILD_SCRIPT_DIR}/make_main.sh
 - do_make "$@" # 再執(zhí)行b.Gn和ninja的命令都是在這個(gè)腳本執(zhí)行
 - source ${BUILD_SCRIPT_DIR}/post_process.sh
 - post_process "$@" # 再執(zhí)行c.構(gòu)建完成之后進(jìn)行的收尾工作
 - gn_args=is_standard_system=true
 - exit $RET
 - }
 - main "$@"
 - ================================================================================================================================
 - 【參數(shù)設(shè)置】
 - + BIN_PATH=/home/bright/OpenHarmony/build/build_scripts
 - + BASE_HOME=/home/bright/OpenHarmony
 - + BUILD_SCRIPT_DIR=/home/bright/OpenHarmony/build/core/build_scripts
 - 【腳本執(zhí)行】
 - + pre_process device_type=Hi3516DV300 target_os=ohos target_cpu=arm gn_args=is_standard_system=true
 - + main device_type=Hi3516DV300 target_os=ohos target_cpu=arm gn_args=is_standard_system=true
 - + post_process device_type=Hi3516DV300 target_os=ohos target_cpu=arm
 
a.pre_process.sh
對(duì)各種參數(shù)進(jìn)行初始化
- pre_process()
 - {
 - echo "pre_process"
 - case $(uname -s) in
 - Darwin)
 - HOST_DIR="darwin-x86"
 - HOST_OS="mac"
 - ;;
 - Linux)
 - HOST_DIR="linux-x86"
 - HOST_OS="linux"
 - ;;
 - *)
 - echo "Unsupported host platform: $(uname -s)"
 - RET=1
 - exit $RET
 - esac
 - export PATH=${BASE_HOME}/prebuilts/python/${HOST_DIR}/3.8.5/bin:${BASE_HOME}/prebuilts/build-tools/${HOST_DIR}/bin:$PATH
 - python --version
 - # 初始化了4個(gè)腳本,對(duì)參數(shù)進(jìn)行初始化,這塊先不展開(kāi)了,下個(gè)版本不改再來(lái)分析
 - source ${BUILD_SCRIPT_DIR}/init_parameters.sh # 給參數(shù)賦值
 - source ${BUILD_SCRIPT_DIR}/parse_cmdline.sh
 - source ${BUILD_SCRIPT_DIR}/common_fun.sh
 - source ${BUILD_SCRIPT_DIR}/trap_ctrlc.sh
 - init_parameter "$@" # 這個(gè)腳本沒(méi)啥好說(shuō)的,就是參數(shù)賦值
 - parse_cmdline "$@" # 解析命令行
 - # Trap SIGINT
 - trap "trap_ctrlc" 2
 - if [ "${PYCACHE_ENABLE}" == true ];then
 - source ${BUILD_SCRIPT_DIR}/set_pycache.sh
 - set_pycache
 - fi
 - }
 - ================================================================================================================================
 - 【生成環(huán)境變量】
 - + export PATH=/home/bright/OpenHarmony/prebuilts/python/linux-x86/3.8.5/bin:/home/bright/OpenHarmony/prebuilts/build-tools/linux-x86/bin: /home/bright/.local/bin:/home/bright/OpenHarmony/prebuilts/build-tools/common/nodejs/node-v12.18.4-linux-x64/bin:/home/bright/.local/bin: /home/bright/.local/bin:/home/bright/developtools:/home/bright/developtools/xpack-openocd-0.10.0-15/bin:/home/bright/developtools/gcc-lin aro-arm-linux-gnueabihf-4.9-2014.07_linux/bin:/home/bright/developtools/gcc_riscv32/bin:/home/bright/developtools/hc-gen:/home/bright/dev eloptools/llvm/bin:/home/bright/developtools/ninja:/home/bright/developtools/gn:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/ bin:/usr/games:/usr/local/games:/snap/bin
 - 【執(zhí)行腳本】
 - + init_parameter device_type=Hi3516DV300 target_os=ohos target_cpu=arm gn_args=is_standard_system=true
 - + parse_cmdline device_type=Hi3516DV300 target_os=ohos target_cpu=arm gn_args=is_standard_system=true
 - + trap trap_ctrlc 2 # trap運(yùn)行 trap_ctrlc 腳本。TODO
 
b.make_main.sh丨gn、ninja
【重點(diǎn)】來(lái)看這個(gè)腳本,Gn和ninja的命令都是在這個(gè)腳本執(zhí)行
參數(shù): device_type=Hi3516DV300 target_os=ohos target_cpu=arm gn_args=is_standard_system=true
- build\core\build_scripts\make_main.sh
 - do_make()
 - {
 - TARGET_OUT_DIR=${BASE_HOME}/${OUT_DIR}/${TARGET_OS}-${TARGET_ARCH}-${BUILD_VARIANT} # 設(shè)置輸出目錄
 - # 忽略不重要的步驟,直接看核心部分
 - # prepare to save build log
 - LOG_FILE=${TARGET_OUT_DIR}/build.log
 - log_prepare $LOG_FILE # 生成編譯構(gòu)建的log文件,OpenHarmony/out/ohos-arm-release/build.log
 - log "$@"
 - BEGIN_TIME=$(date "+%s") # 記錄當(dāng)前時(shí)間
 - source ${BUILD_SCRIPT_DIR}/get_gn_parameters.sh
 - get_gn_parameters # 這個(gè)腳本用來(lái)獲取gn的參數(shù)
 - if [ "${SKIP_GN_PARSE}"x = falsex ]; then # 這里執(zhí)行了gn命令,并將過(guò)程寫入log文件,參考下面【gn命令】
 - ${BUILD_TOOLS_DIR}/gn gen ${TARGET_OUT_DIR} \
 - --args="target_os=\"${TARGET_OS}\" target_cpu=\"${TARGET_ARCH}\" is_debug=false \
 - device_type=\"${DEVICE_TYPE}\" is_component_build=true use_custom_libcxx=true \
 - ${GN_ARGS} ${TEST_BUILD_PARA_STRING} ${IS_ASAN} \
 - release_test_suite=${RELEASE_TEST_SUITE}" 2>&1 | tee -a $log
 - # 忽略部分代碼,到這里腳本調(diào)用了gn,這部分的內(nèi)容是gn命令產(chǎn)生的,可以在OpenHarmony/out/ohos-arm-release/build.log中找到
 - log "Starting Ninja..."
 - NINJA_START_TIME=$(date +%s%N)
 - echo python version: $(python --version)
 - ninja_build_args="--source-root-dir ${BASE_HOME} --root-build-dir ${TARGET_OUT_DIR} \ # 設(shè)置ninja的參數(shù)
 - --build-target-name ${BUILD_TARGET_NAME}"
 - if [ "${TARGET_PLATFORM}" != "" ];then
 - ninja_build_args="$ninja_build_args --target-platform ${TARGET_PLATFORM}"
 - fi
 - # 在執(zhí)行ninja命令前,還得調(diào)用一個(gè)python腳本,參考:【構(gòu)建目標(biāo)處理程序】
 - real_build_target=$(python ${BASE_HOME}/build/scripts/build_target_handler.py $ninja_build_args)
 - echo "build_target: "$real_build_target
 - if [ "${USE_NARUTO}"x = "truex" ];then
 - ${BUILD_TOOLS_DIR}/naruto -d keepdepfile -p ${BASE_HOME}/.naruto_cache -C ${TARGET_OUT_DIR} ${real_build_target} ${NINJA_ARGS} 2>&1 | tee -a $log
 - else
 - # 整個(gè)構(gòu)建腳本最核心的部分,此時(shí)構(gòu)建腳本全部交由ninja處理,打印編譯信息,將結(jié)果寫入log。參考:【ninja命令】
 - ${BUILD_TOOLS_DIR}/ninja -d keepdepfile -C ${TARGET_OUT_DIR} ${real_build_target} ${NINJA_ARGS} 2>&1 | tee -a $log
 - fi
 - # 忽略部分代碼
 - }
 - ================================================================================================================================
 - 【gn命令】
 - + /home/bright/OpenHarmony/prebuilts/build-tools/linux-x86/bin/gn gen /home/bright/OpenHarmony/out/ohos-arm-release '--args=target_os="ohos" target_cpu="arm" is_debug=false device_type="Hi3516DV300" is_component_build=true use_custom_libcxx=true is_standard_system=true release_test_suite=false'
 - 【ninja參數(shù)】
 - + ninja_build_args='--source-root-dir /home/bright/OpenHarmony --root-build-dir /home/bright/OpenHarmony/out/ohos-arm-release --build-target-name packages'
 - 【構(gòu)建目標(biāo)處理程序】
 - + python /home/bright/OpenHarmony/build/scripts/build_target_handler.py \
 - --source-root-dir /home/bright/OpenHarmony \
 - --root-build-dir /home/bright/OpenHarmony/out/ohos-arm-release \
 - --build-target-name packages
 - 【ninja命令】
 - + ninja -d keepdepfile -C /home/bright/OpenHarmony/out/ohos-arm-release packages
 
c.post_process.sh
構(gòu)建完成之后進(jìn)行的收尾工作。
參數(shù):device_type=Hi3516DV300 target_os=ohos target_cpu=arm gn_args=is_standard_system=true
- build\core\build_scripts\post_process.sh
 - # 忽略統(tǒng)計(jì)時(shí)間、pycache等部分代碼,總結(jié)下來(lái)就是執(zhí)行了幾個(gè)python腳本
 - 【這個(gè)python腳本,生成 sorted_action_duration.txt 排序構(gòu)建各個(gè)模塊的操作時(shí)間】
 - + python3 /home/bright/OpenHarmony/build/scripts/ninja2trace.py \
 - --ninja-log /home/bright/OpenHarmony/out/ohos-arm-release/.ninja_log \
 - --trace-file /home/bright/OpenHarmony/out/ohos-arm-release/build.trace \
 - --ninja-start-time 1623461510200574308 \
 - --duration-file /home/bright/OpenHarmony/out/ohos-arm-release/sorted_action_duration.txt
 - 【計(jì)算C目標(biāo)重疊率統(tǒng)計(jì)】
 - + python3 /home/bright/OpenHarmony/build/ohos/statistics/build_overlap_statistics.py \
 - --build-out-dir /home/bright/OpenHarmony/out/ohos-arm-release \
 - --subsystem-config-file /home/bright/OpenHarmony/build/subsystem_config.json \
 - --root-source-dir /home/bright/OpenHarmony
 - 【獲取構(gòu)建警告列表】
 - + python3 /home/bright/OpenHarmony/build/scripts/get_warnings.py \
 - --build-log-file /home/bright/OpenHarmony/out/ohos-arm-release/build.log \
 - --warning-out-file /home/bright/OpenHarmony/out/ohos-arm-release/packages/WarningList.txt
 
2.build_image.sh【生成鏡像】
這個(gè)腳本的主要工作
- 復(fù)制 root 目錄
 - 生成鏡像
 
- build/adapter/images/build_image.sh --device-name hi3516dv300 \
 - --ohos-build-out-dir /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone
 - ... ...
 - prepare_root # a.復(fù)制 root 目錄
 - build_vendro_image # b.生成 vendr.image
 - build_system_image # c.生成 system.image
 - build_userdata_image # d.生成 userdata.image
 - if [[ "${device_name}" == "hi3516dv300" ]]; then
 - source ${OHOS_ROOT_PATH}/build/adapter/images/updater/build_updater_image.sh
 - fi
 
a.復(fù)制 root 目錄
- function prepare_root() {
 - if [[ -d "${ohos_build_out_dir}/images/root" ]]; then
 - rm -rf ${ohos_build_out_dir}/images/root
 - fi
 - cp -arf prebuilts/aosp_prebuilt_libs/minisys/root ${ohos_build_out_dir}/images/
 - local dir_list=(acct apex cache config data debug_ramdisk dev mnt oem proc sbin storage sys system vendor)
 - pushd ${ohos_build_out_dir}/images/root # 【pushd 把當(dāng)前工作目錄壓棧,成為棧頂】
 - for _path in ${dir_list[@]}
 - do
 - if [[ ! -d "${_path}" ]]; then
 - mkdir ${_path} # 【新建 dir_list 里的目錄】
 - fi
 - done
 - popd # 【popd 將目錄彈出目錄?!?nbsp;
 - }
 - ================================================================================================================================
 - 【復(fù)制root過(guò)來(lái)】
 - cp -arf prebuilts/aosp_prebuilt_libs/minisys/root /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/
 - 【然后新建下面列表的文件夾】
 - (acct apex cache config data debug_ramdisk dev mnt oem proc sbin storage sys system vendor)
 
b.生成 vendr.image
- function build_vendro_image() {
 - cp -arf prebuilts/aosp_prebuilt_libs/minisys/vendor ${ohos_build_out_dir}/images/
 - if [[ -d "${ohos_build_out_dir}/vendor" ]]; then
 - cp -arf ${ohos_build_out_dir}/vendor/* ${ohos_build_out_dir}/images/vendor/
 - fi
 - # remove img
 - rm -rf ${ohos_build_out_dir}/images/vendor.img
 - # build system image
 - PATH=prebuilts/aosp_prebuilt_libs/host_tools/bin:$PATH prebuilts/aosp_prebuilt_libs/host_tools/releasetools/build_image.py \
 - ${ohos_build_out_dir}/images/vendor \
 - prebuilts/aosp_prebuilt_libs/minisys/vendor_image_info.txt \
 - ${ohos_build_out_dir}/images/vendor.img \
 - ${ohos_build_out_dir}/images/system
 - if [[ "${PIPESTATUS[0]}" -ne 0 ]]; then
 - echo "\033[31m build: build vendor image error.\033[0m"
 - exit 1
 - fi
 - echo -e "\033[32m build vendor image successful.\033[0m"
 - }
 - ================================================================================================================================
 - 【vendor的來(lái)源有兩個(gè)】
 - # 1.prebuilts/aosp_prebuilt_libs/minisys/vendor
 - # 2.out/ohos-arm-release/packages/phone/vendor
 - + cp -arf prebuilts/aosp_prebuilt_libs/minisys/vendor /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/
 - + cp -arf /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/vendor/* /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/vendor/
 - 【設(shè)置環(huán)境變量】
 - PATH=prebuilts/aosp_prebuilt_libs/host_tools/bin:/home/bright/.local/bin:/home/bright/OpenHarmony/prebuilts/build-tools/common/nodejs/node-v12.18.4-linux-x64/bin:/home/bright/.local/bin:/home/bright/.local/bin:/home/bright/developtools:/home/bright/developtools/xpack-openocd-0.10.0-15/bin:/home/bright/developtools/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin:/home/bright/developtools/gcc_riscv32/bin:/home/bright/developtools/hc-gen:/home/bright/developtools/llvm/bin:/home/bright/developtools/ninja:/home/bright/developtools/gn:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
 - 【生成鏡像】
 - + prebuilts/aosp_prebuilt_libs/host_tools/releasetools/build_image.py \
 - /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/vendor \
 - prebuilts/aosp_prebuilt_libs/minisys/vendor_image_info.txt \
 - /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/vendor.img \
 - /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/system
 
c.生成 system.image
- function _update_build_prop() {
 - local system_build_prop_file=${ohos_build_out_dir}/images/system/build.prop
 - local ohos_build_prop_file=${OHOS_ROOT_PATH}/build/adapter/makefiles/ohos_system.prop
 - if [[ -f "${ohos_build_prop_file}" ]] && [[ -f "${system_build_prop_file}" ]]; then
 - echo '' >> ${system_build_prop_file}
 - cat ${ohos_build_prop_file} >> ${system_build_prop_file}
 - fi
 - }
 - function build_system_image() {
 - if [[ ! -d "${ohos_build_out_dir}/images" ]]; then
 - mkdir ${ohos_build_out_dir}/images
 - fi
 - cp -arf prebuilts/aosp_prebuilt_libs/minisys/system ${ohos_build_out_dir}/images/
 - cp -arf ${ohos_build_out_dir}/system/* ${ohos_build_out_dir}/images/system/
 - # update build.prop
 - _update_build_prop
 - # remove img
 - rm -rf ${ohos_build_out_dir}/images/system.img
 - # build system image
 - PATH=prebuilts/aosp_prebuilt_libs/host_tools/bin:$PATH prebuilts/aosp_prebuilt_libs/host_tools/releasetools/build_image.py \
 - ${ohos_build_out_dir}/images/system \
 - prebuilts/aosp_prebuilt_libs/minisys/system_image_info.txt \
 - ${ohos_build_out_dir}/images/system.img \
 - ${ohos_build_out_dir}/images/system
 - if [[ "${PIPESTATUS[0]}" -ne 0 ]]; then
 - echo "\033[31m build: build system image error.\033[0m"
 - exit 1
 - fi
 - echo -e "\033[32m build system image successful.\033[0m"
 - }
 - ================================================================================================================================
 - 【local命令用于在函數(shù)內(nèi)定義局部變量】
 - + local system_build_prop_file=/home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/system/build.prop
 - + local ohos_build_prop_file=/build/adapter/makefiles/ohos_system.prop
 - 【system的來(lái)源也有2個(gè)】
 - # 1.prebuilts/aosp_prebuilt_libs/minisys/system
 - # 2.out/ohos-arm-release/packages/phone/system
 - cp -arf prebuilts/aosp_prebuilt_libs/minisys/system /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/
 - cp -arf /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/system/* /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/system/
 - 【環(huán)境變量】
 - PATH=prebuilts/aosp_prebuilt_libs/host_tools/bin:/home/bright/.local/bin:/home/bright/OpenHarmony/prebuilts/build-tools/common/nodejs/node-v12.18.4-linux-x64/bin:/home/bright/.local/bin:/home/bright/.local/bin:/home/bright/developtools:/home/bright/developtools/xpack-openocd-0.10.0-15/bin:/home/bright/developtools/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin:/home/bright/developtools/gcc_riscv32/bin:/home/bright/developtools/hc-gen:/home/bright/developtools/llvm/bin:/home/bright/developtools/ninja:/home/bright/developtools/gn:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
 - 【鏡像生成】
 - prebuilts/aosp_prebuilt_libs/host_tools/releasetools/build_image.py \
 - /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/system \
 - prebuilts/aosp_prebuilt_libs/minisys/system_image_info.txt \
 - /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/system.img \
 - /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/system
 
d.生成 userdata.image
- function build_userdata_image() {
 - if [[ -d "${ohos_build_out_dir}/images/data" ]]; then
 - rm -rf ${ohos_build_out_dir}/images/data
 - fi
 - mkdir ${ohos_build_out_dir}/images/data
 - # build userdat image
 - PATH=prebuilts/aosp_prebuilt_libs/host_tools/bin:$PATH prebuilts/aosp_prebuilt_libs/host_tools/releasetools/build_image.py \
 - ${ohos_build_out_dir}/images/data \
 - prebuilts/aosp_prebuilt_libs/minisys/userdata_image_info.txt \
 - ${ohos_build_out_dir}/images/userdata.img \
 - ${ohos_build_out_dir}/images/system
 - if [[ "${PIPESTATUS[0]}" -ne 0 ]]; then
 - echo "\033[31m build: build userdata image error.\033[0m"
 - exit 1
 - fi
 - echo -e "\033[32m build userdata image successful.\033[0m"
 - }
 - ================================================================================================================================
 - 【新建data目錄】
 - out/ohos-arm-release/packages/phone/images/data
 - 【環(huán)境變量】
 - PATH=prebuilts/aosp_prebuilt_libs/host_tools/bin:/home/bright/.local/bin:/home/bright/OpenHarmony/prebuilts/build-tools/common/nodejs/node-v12.18.4-linux-x64/bin:/home/bright/.local/bin:/home/bright/.local/bin:/home/bright/developtools:/home/bright/developtools/xpack-openocd-0.10.0-15/bin:/home/bright/developtools/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin:/home/bright/developtools/gcc_riscv32/bin:/home/bright/developtools/hc-gen:/home/bright/developtools/llvm/bin:/home/bright/developtools/ninja:/home/bright/developtools/gn:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
 - 【鏡像生成】
 - prebuilts/aosp_prebuilt_libs/host_tools/releasetools/build_image.py \
 - /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/data \
 - prebuilts/aosp_prebuilt_libs/minisys/userdata_image_info.txt \
 - /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/userdata.img \
 - /home/bright/OpenHarmony/out/ohos-arm-release/packages/phone/images/system
 
3.關(guān)于build_image.py
這個(gè)python腳本多次被調(diào)用,如果下次版本升級(jí)還用它,我們?cè)賮?lái)深挖一下,這次先放他一馬。
- properties_file
 - build_image.py [輸入目錄](méi) [屬性文件] [輸出文件] [輸出錄了]
 - in_dir = argv[0]
 - glob_dict_file = argv[1]
 - out_file = argv[2]
 - target_out = argv[3]
 
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)





















 
 
 







 
 
 
 