OpenHarmony开发者论坛

标题: 【FAQ问题定位】模块如何单独编译构建 [打印本页]

作者: 诚迈_雨哥    时间: 2024-6-3 15:14
标题: 【FAQ问题定位】模块如何单独编译构建
[md]# 验证模块功能时能否不全量编译代码

# 背景

**答案是肯定的!**

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

# 一、单模块编译准备

## 1. 拉取全量代码

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

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

OpenHarmony 每日构建链接: http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist

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

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

![compile_subsystem_command.PNG](https://forums-obs.openharmony.c ... 79ahymkyzvlppo0.png "compile_subsystem_command.PNG")

![](./figures/compile_subsystem_command.png)

### 2). 子系统生成目录

![out_subsystem_so.PNG](https://forums-obs.openharmony.c ... 7jajisqj591j1ah.png "out_subsystem_so.PNG")

![](./figures/out_subsystem_so.png)

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

![out_ut_so.PNG](https://forums-obs.openharmony.c ... uce0u1lhou222cz.png "out_ut_so.PNG")

![](./figures/out_ut_so.png)

## 4. 常见问题

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

#### 出错信息

![libso_error.PNG](https://forums-obs.openharmony.c ... gc6vqondqhm4h77.png "libso_error.PNG")

![](./figures/libso_error.png)

#### 编译命令

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

#### 编译输出

![libso_ok.PNG](https://forums-obs.openharmony.c ... l6lpj6lmwz5glb5.png "libso_ok.PNG")

![](./figures/libso_ok.png)

**说明**: 不含.z.so

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

#### 出错信息

![out_libdeviceagent-error.PNG](https://forums-obs.openharmony.c ... 36zaz5j00rdbm9d.png "out_libdeviceagent-error.PNG")

![](./figures/out_libdeviceagent-error.png)

#### 编译命令

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

#### 编译输出

![out_deviceagent.PNG](https://forums-obs.openharmony.c ... q8m1donu8n5d2tz.png "out_deviceagent.PNG")

![](./figures/out_deviceagent.png)

# 二、实践步骤

## 1.  编译miscdevice 组件

### 定位组件名称

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

![COMPILE_subsystem.PNG](https://forums-obs.openharmony.c ... 8ua2d0azf08x6mk.png "COMPILE_subsystem.PNG")

![](./figures/COMPILE_subsystem.png)

### 编译命令

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

### 编译输出

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

![COMPILE_subsystem_out.PNG](https://forums-obs.openharmony.c ... dffe3p7zz5uineo.png "COMPILE_subsystem_out.PNG")

![](./figures/COMPILE_subsystem_out.png)

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

### 定位所在库名

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

![find_gn0.PNG](https://forums-obs.openharmony.c ... 5xzk2vivcev90q8.png "find_gn0.PNG")

![](./figures/find_gn0.png)

### 编译命令

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

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

### 编译输出

![out_deviceagent.PNG](https://forums-obs.openharmony.c ... 5jv0yvvsr5wppup.png "out_deviceagent.PNG")

![](./figures/libso_ok.png)

## 2. 编译对应模块UT

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

### 定位所在bin 名称

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

![local_ut.PNG](https://forums-obs.openharmony.c ... qzxjo3xzubrkxx9.png "local_ut.PNG")

![](./figures/local_ut.png)

### 编译命令

**绝对路径**

```
./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输出的默认目录
③ 所在组件名称

![unittest.PNG](https://forums-obs.openharmony.c ... b8ybz2owzo6e0iw.png "unittest.PNG")

![](./figures/unittest.png)

## 3. 烧录镜像

RK3568烧录镜像参照链接: https://forums.openharmony.cn/fo ... thread&tid=2143
一般仅仅烧录一次,除非更换镜像。

## 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`

# 三、结论

有所求,才有所获。当你时刻想提高工作、学习效率时,就会产生各种各样的问题,找到了这些问题的答案,并应用它们,必定会让你的效率事倍功半!祝小伙伴们工作顺利!
[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5