【FAQ问题定位】模块如何单独编译构建

125 阅读4分钟

验证模块功能时能否不全量编译代码

背景

答案是肯定的!

众所周知,当前 OpenHarmony 模块十分庞大,非计算云全量编译代码十分耗时。如果修改、验证单一模块是没有必要全量编译的。注意镜像必须和本地代码日期尽量一致,代码可以稍晚于镜像。核心方法就是从每日构建下载烧录镜像,本地编译单一模块,烧录镜像,推送单一模块进行验证。以下以 RK3568 开发板,主线代码为例进行说明。

一、单模块编译准备

1. 拉取全量代码

即使编译单一模块建议要拉取全量代码

2. 从每日构建下载和本地代码日期一致的镜像

OpenHarmony 每日构建链接: ci.openharmony.cn/workbench/c…

3. 编译单一模块命令构成原理

1). 编译子系统命令构成

2). 子系统生成目录

3). 单元测试 bin 生成目录

4. 常见问题

1). 编译目标库名,编译时不认识,要求修改为 BUILD.gn 中的库名

出错信息

编译命令

./build.sh --product-name rk3568 --build-target libvibrator_decoder

编译输出

说明: 不含.z.so

2). 编译目标库名,编译时不认识,要求修改为 BUILD.gn 中的库名

出错信息

编译命令

./build.sh --product-name rk3568 --build-target deviceagent

编译输出

二、实践步骤

1. 编译 miscdevice 组件

定位组件名称

① 子系统代码目录 ② 子系统配置信息 ③ name 为组件名称,subsystem 为子系统名称

编译命令

./build.sh --product-name rk3568 --build-target miscdevice

编译输出

④ 组件编译指令 ⑤ 组件 so 生成目录,sensors 为子系统名称,miscdevice 为组件名称如上所述

2. 修改了 devicestatus_agent.cpp 文件,编译所在 so

定位所在库名

① 目标源文件 ② 距离目标文件最近的 BUILD.gn ③ BUILD.gn 中定义的目标产物,生成的 so 库名,不包括开始的'lib'和末尾的'.z.so' ④ 所在子系统\所在的组件

编译命令

./build.sh --product-name rk3568 --build-target deviceagent

说明:命令末尾添加上 --fast-rebuild, 除过首次,之后编译速度会大大加快!

编译输出

2. 编译对应模块 UT

运行 UT 会在单元测试文档进行详细说明。

DD一下:欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。
`欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

定位所在 bin 名称

① 目标源文件 ② 距离目标文件最近的 BUILD.gn ③ BUILD.gn 中定义的目标产物,生成的 bin ④ 生成物 bin 的输出目录,如后面图片所示

编译命令

绝对路径

./build.sh --product-name rk3568 --build-target base/msdp/device_status/frameworks/native/interaction/test/unittest:InteractionManagerTest

相对路径

./build.sh --product-name rk3568 --build-target InteractionManagerTest

说明:命令末尾添加上 --fast-rebuild, 除过首次,之后编译速度会大大加快!

编译输出

① 单独编译一个 bin 的指令 ② 关于单元测试 bin 输出的默认目录 ③ 所在组件名称

3. 烧录镜像

RK3568 烧录镜像参照链接:  forums.openharmony.cn/forum.php?m… 一般仅仅烧录一次,除非更换镜像。

4. 推送模块 so 等

关于 InteractionManagerTest 等测试 bin 文件和 HAP 的推送、执行会在我的其他文档中进行说明,以下以 so 的推送为例进行说明。

步骤 1,确定修改的 so, bin, hap 所在运行系统的目录

例如:替换这个文件 libinteraction_drag.z.so,按如下方法查找

>hdc shell
# ls
bin        config       eng_system  lost+found     storage   tmp
chip_ckm   data         etc         mnt            sys       updater
chip_prod  dev          init        module_update  sys_prod  vendor
chipset    eng_chipset  lib         proc           system
find ./lib/ ./system/lib/ -name "libinteraction_drag.z.so"
./lib/libinteraction_drag.z.so
./system/lib/libinteraction_drag.z.so

步骤 2,推送这些被修改的文件

细分为 “挂载”,“推送”

hdc shell mount -o rw,remount / 
hdc file send Z:\code_t62_0322\out\rk3568\msdp\device_status\libinteraction_drag.z.so ./system/lib/
hdc file send Z:\code_t62_0322\out\rk3568\msdp\device_status\libinteraction_drag.z.so ./lib/

步骤 3,重启板卡

按键 reset,或者执行 hdc shell reboot 以上步骤 2-3 完整脚本

hdc shell mount -o rw,remount / 
hdc file send Z:\code\out\rk3568\msdp\device_status\libinteraction_drag.z.so ./system/lib/
hdc file send Z:\code\out\rk3568\msdp\device_status\libinteraction_drag.z.so ./lib/
hdc shell power-shell setmode 602
pause
hdc shell reboot

步骤 4,更新完成,开始验证

始终亮屏设置 hdc shell power-shell setmode 602