添加编译构建过程

首先在源码根目录vendor下添加 vendor/xingyun/t113_nand此目录,可参考hisilicon/hispark_taurus_linux/实现,创建好自己产品目录之后开始添加文件,首先需要创建的文件为编译文件,BUILD.gn,添加配置文件config.json,添加hals目录,目录暂时可以为空。其中BUILD.gn中的内容可以暂时先只有如下语句即可,注意,双引号内容最好与当前目录名称相同

group(“t113_nand”) {
 }

然后打开config.json文件,添加相应的字段描述。如下为我添加构建初期的文件内容

{
 “product_name”: “xingyun_t113_nand_board”,
 “ohos_version”: “OpenHarmony 3.0”,
 “device_company”: “xingyunelec”, //对应源码目录下/device/目录下的文件夹 xingyunelec
 “board”: “t113_nand_linux”, //对应device/xingyunelec/目录下的文件夹t113_nand_linux
 “kernel_type”: “linux”,
 “kernel_version”: “5.4”,
 “subsystems”: [
 ],
 “third_party_dir”: “//third_party”,
 “product_adapter_dir”: “//vendor/xingyun/t113_nand/hals”
 }

所以你需要在device目录下创建该有的文件夹,示例我这里需要的目录则为device/xingyunelec/t113_nand_linux,创建完成目录后我们可以进行hb set操作了,可以看到出现我们的选择项了,选择我们自己的产品,然后回车

Android APP移植到鸿蒙 安卓代码迁移鸿蒙_linux

回车之后出现如下图错误信息,因为我们没有配置产品的相关信息,现在我们开始配置产品信息

Android APP移植到鸿蒙 安卓代码迁移鸿蒙_harmonyos_02


首先同样需要一个编译文件BUILD.gn,里面内容同上文大同小异,内容为如下。

group(“t113_nand_linux”) {
 }

然后创建文件夹sdk_linux,改名字可以随意起,然后在device/xingyunelec/t113_nand_linux/sdk_linux目录里面创建文件config.gni。打开文件,其中内容做个介绍

kernel_type = “linux” //使用的内核,一般有"linux", “liteos_a”, “liteos_m”.
 kernel_version = “5.4” //使用的内核版本
 board_cpu = “cortex-a7” //使用的芯片架构, “cortex-a7”, “riscv32”
 board_arch = “” //使用的芯片架构 “armv7-a”, “rv32imac”
 board_toolchain = “” //使用的工具链gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang
 board_toolchain_path = “” //使用的工具链路径,直接把交叉编译器的全路径放进来即可
 board_toolchain_prefix = “” //gcc-arm-none-
 board_toolchain_type = “clang” //“gcc” or “clang”
 board_cflags = [ //编译c的选项
 “-mfloat-abi=softfp”,
 “-mfpu=neon-vfpv4”,
 ]
 board_cxx_flags = [
 “-mfloat-abi=softfp”,
 “-mfpu=neon-vfpv4”,
 ]
 board_ld_flags = [] //链接库选项board_include_dirs = [] //包含的第三方源码头文件
board_adapter_dir = “”
board_configed_sysroot = “”
storage_type = “”

填写以上内容即可。

然后我们再去执行hb set,选择我们添加的产品执行结果如下图,不会报错了。

Android APP移植到鸿蒙 安卓代码迁移鸿蒙_json_03


接着我们尝试开始进行编译,直接运行hb build。

Android APP移植到鸿蒙 安卓代码迁移鸿蒙_harmonyos_04


然后发现报错了,而且编译的还是5.10的内核,这是怎么回事,其实是会去build/ohos/kernel/kernel.gni读取这里面的值去默认编译内核版本,为什么会这样,目前还不知道,知道的可以告知下。那我们先添加内核组件尝试下,可能不能去编译我们选定的内核版本,修改

vendor/xingyun/t113_nand/config.json文件,在组件里面添加内核编译组件,添加的内容如下
 {
 “subsystem”: “kernel”,
 “components”: [
 { “component”: “linux_5_4”, “features”:[] }
 ]
 }

添加后完整的文件内容如下图所示

Android APP移植到鸿蒙 安卓代码迁移鸿蒙_linux_05


添加完成后开始编译,执行hb build -f,很好,又报错了,报错内容如下,很明显,找不到组件编译规则

[OHOS INFO] ERROR at //build/lite/BUILD.gn:60:9: Assertion failed.
 [OHOS INFO] assert(
 [OHOS INFO] ^-----
 [OHOS INFO] Component “linux_5_4” not found, please check your product configuration.
 [OHOS INFO] See //build/lite/BUILD.gn:61:13:
 [OHOS INFO] component_found,
 [OHOS INFO] ^--------------
 [OHOS INFO] This is where it was set.
 [OHOS INFO] ohos_build_compiler: clang
 [OHOS ERROR] you can check build log in /home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board/build.log
 [OHOS ERROR] command: “/home/d1/openHarmony/t113/prebuilts/build-tools/linux-x86/bin/gn gen /home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board --root=/home/d1/openHarmony/t113 --dotfile=/home/d1/openHarmony/t113/build/lite/.gn --script-executable=/usr/bin/python3 --args=ohos_build_compiler_specified=“clang” ohos_build_compiler_dir=”//prebuilts/clang/ohos/linux-x86_64/llvm" product_path="/home/d1/openHarmony/t113/vendor/xingyun/t113_nand" device_path="/home/d1/openHarmony/t113/device/xingyunelec/t113_nand_linux/sdk_linux" ohos_kernel_type=“linux” ohos_build_type=“debug” ohos_build_time=“1648698057822” ohos_build_datetime=“2022-03-31 19:40:57” ohos_full_compile=true" failed
 [OHOS ERROR] return code: 1
 [OHOS ERROR] execution path: /home/d1/openHarmony/t113

所以需要我们去解决,通过对比,发现在hisilicon下面有使用其他版本的内核的组件,最后定位到的文件为 build/lite/components/kernel.json,尝试在此处添加我们自定义内核的编译规则。添加如下内容即可。文件正确性有待验证,主要是"output": [ “uImage_hi3516dv300_smp” ],{

“component”: “linux_5_4”,
 “description”: “linux 5.4”,
 “optional”: “false”,
 “dirs”: [
 “kernel/linux/build”
 ],
 “targets”: [
 “//kernel/linux/build:linux_kernel”
 ],
 “rom”: “”,
 “ram”: “”,
 “output”: [
 “uImage_hi3516dv300_smp”
 ],
 “features”: [],
 “adapted_board”: [
 “t113_nand_linux”
 ],
 “adapted_kernel”: [ “linux” ],
 “deps”: {
 “components”: [],
 “third_party”: []
 }
 }

然后修改文件kernel/linux/build/BUILD.gn,将文中内容对比修改为如下内容

-command = “./kernel_module_build.sh ${outdir} ${build_type} ${clang_dir} ${product_path_rebase} ${board_name} ${linux_kernel_version}”
 +command = “./kernel_module_build.sh ${outdir} ${build_type} ${clang_dir} ${product_path_rebase} {kernel_version}”

然后把对应的内核源文件放入到kernel/linux/目录下,如下图,增加linux-5.4目录,里面即为内核源码

Android APP移植到鸿蒙 安卓代码迁移鸿蒙_linux_06


然后开始执行编译hb build,发现报错,报错信息如下。

[OHOS ERROR] [6/17] ACTION //kernel/linux/build:linux_kernel(//build/lite/toolchain:linux_x86_64_ohos_clang)
 [OHOS ERROR] FAILED: obj/kernel/linux/build/linux_kernel_build_ext_components.txt
 [OHOS ERROR] /usr/bin/python3 …/…/…/build/lite/build_ext_components.py --path=…/…/…/kernel/linux/build --command=./kernel_module_build.sh\ /home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board\ small\ /home/d1/openHarmony/t113/prebuilts/clang/ohos/linux-x86_64/llvm\ vendor/xingyun/t113_nand\ t113_nand_linux\ linux-5.4 --target_dir=/home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board/obj/kernel/linux/build/build.log --out_dir=/home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board/error.log
 [OHOS ERROR] echo “build kernel…”
 [OHOS ERROR] build kernel…
 [OHOS ERROR] rm -rf /home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board/kernel/linux-5.4;mkdir -p /home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board/kernel/linux-5.4;cp -arfL /home/d1/openHarmony/t113/kernel/linux/linux-5.4/* /home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board/kernel/linux-5.4/
 [OHOS ERROR] cd /home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board/kernel/linux-5.4 && patch -p1 < /home/d1/openHarmony/t113/kernel/linux/patches/linux-5.4/_patch/hdf.patch && patch -p1 < /home/d1/openHarmony/t113/kernel/linux/patches/linux-5.4/_patch/.patch
 [OHOS ERROR] /bin/sh: /home/d1/openHarmony/t113/kernel/linux/patches/linux-5.4/_patch/hdf.patch: No such file or directory
 [OHOS ERROR] kernel.mk:73: recipe for target ‘/home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board/kernel/linux-5.4/arch/arm/boot/uImage’ failed
 [OHOS ERROR] make: *** [/home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board/kernel/linux-5.4/arch/arm/boot/uImage] Error 1
 [OHOS ERROR] you can check build log in /home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board/build.log
 [OHOS ERROR] command: “/home/d1/openHarmony/t113/prebuilts/build-tools/linux-x86/bin/ninja -w dupbuild=warn -C /home/d1/openHarmony/t113/out/t113_nand_linux/xingyun_t113_nand_board” failed
 [OHOS ERROR] return code: 1
 [OHOS ERROR] execution path: /home/d1/openHarmony/t113

可以看到报错信息中有如下这样一句话,提示没有patch文件

/bin/sh: /home/d1/openHarmony/t113/kernel/linux/patches/linux-5.4/_patch/hdf.patch: No such file or directory

增加patch文件,首先需要修改kernel/linux/build/kernel_module_build.sh文件,增加自己板卡对应的设备名,后面会根据这个名字自动寻找对应的patch文件,修改内容如下

diff --git a/kernel/linux/build/kernel_module_build.sh b/kernel/linux/build/kernel_module_build.sh
 index 826bd6c3e6…74f7f68340 100755
 — a/kernel/linux/build/kernel_module_build.sh
 +++ b/kernel/linux/build/kernel_module_build.sh
 @@ -30,6 +30,8 @@ if [ “$2” == “small” ];then
 fi
 if [ “$5” == “hispark_taurus” ];then
 export DEVICE_NAME=hi3516dv300
 +elif [ “$5” == “t113_nand_linux” ];then //对应device/xingyunelec/目录下的t113_nand_linux文件夹名称
 +export DEVICE_NAME=t113_nand_linux
 fi
 elif [ “$2” == “standard” ];then
 export BUILD_TYPE=standard

然后在kernel/linux/patches目录下增加linux-5.4目录,在linux-5.4/目录下增加t113_nand_linux_patch目录,此目录是根据上一步添加的DEVICE_NAME + _patch构成,创建目录之后,在此目录中添加如下几个文件hdf.patch,t113_nand_linux.patch,t113_nand_linux_small.patch,当前文件里面还没有内容,只是为了让编译能够通过,至于为什么是这几个文件,可以从kernel.mk中如下语句看出为什么是这几个文件。

$(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(HDF_PATCH_FILE) && patch -p1 < (KERNEL_VERSION), linux-5.10) $(hide) $(KERNEL_MAKE) -C (KERNEL_ARCH) (DEVICE_NAME),t113_nand_linux) +$(hide) $(KERNEL_MAKE) -C (KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) -j64 uImage LOADADDR=0x40008000 +else
 $(hide) $(KERNEL_MAKE) -C (KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) -j64 uImage endif
 +endif
 .PHONY: build-kernel
 build-kernel: $(KERNEL_IMAGE_FILE)

主要是需要 在我们自己的内核编译过程中添加字段LOADADDR=0x40008000,然后重新进行编译,编译成功,结果如下图所示。说明初步添加内核到openharmony成功。

Android APP移植到鸿蒙 安卓代码迁移鸿蒙_spark_07