From 2cbe1dc0d41889d45b597ab5e382aa9a4b72f289 Mon Sep 17 00:00:00 2001 From: zhongluping <278527840@qq.com> Date: Fri, 16 Dec 2022 14:50:42 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=BA=93=E7=A7=BB=E6=A4=8D=E6=96=87=E6=A1=A3=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhongluping <278527840@qq.com> --- .../port_thirdparty/README.md | 131 +++++++++--------- 1 file changed, 62 insertions(+), 69 deletions(-) diff --git a/docs/openharmony_getstarted/port_thirdparty/README.md b/docs/openharmony_getstarted/port_thirdparty/README.md index 5634b13..0e851fc 100755 --- a/docs/openharmony_getstarted/port_thirdparty/README.md +++ b/docs/openharmony_getstarted/port_thirdparty/README.md @@ -12,7 +12,7 @@ ### 运行时依赖 -运行时依赖主要包括系统API,运行C库以及硬件相关。一般的库都不会有这方面的依赖,除非一些专门针对硬件处理的库(比如针对GPU加速),介于这硬件依赖关系,本文不对这类库做详细讲解,我们只需通过API扫描工具对库进行扫描,分析是否有这类依赖。 +运行时依赖主要包括系统API,运行C库以及硬件相关。一般的库都不会有这方面的依赖,除非一些专门针对硬件处理的库(比如针对GPU加速),介于这硬件依赖关系,本文不对这类库做详细讲解,我们只需通过API扫描工具对库进行扫描,分析是否有这类依赖。依赖工具使用和下载地址:[C/C++三方库E2E扫描工具](https://gitee.com/han_jin_fei/e2e/tree/master/thirdparty_compare) ### 编译结构不兼容 @@ -58,7 +58,7 @@ cmake .. -DCMAKE_BUILD_TYPE=Release #### 分析编译依赖 -##### 外部看依赖分析 +##### 外部库依赖分析 分析生成Makefile过程中的日志信息,找到本库对其他库的依赖关系,分析日志过程中,一般存在如下几种情况: @@ -72,7 +72,7 @@ cmake .. -DCMAKE_BUILD_TYPE=Release ##### 原文件依赖分析 -执行make指令进行编译,通过编译过程可以分析对应库以及可执行文件需要的依赖文件: +执行make指令进行编译,通过编译过程可以分析对应库以及可执行文件需要的源文件: ```shell water@ubuntu:~/openjpeg/openjpeg/build$ make @@ -348,77 +348,73 @@ ohos_executable("test_title_decoder") { 标准系统编译构建可以参考文档[标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md). -##### 定义子系统并加入到编译框架 - -+ 在系统源码根目录下创建一个目录作为子系统目录,子系统目录可创建在OpenHarmony源码目录任意位置。 - - 本项目以 third_party/openjpeg 做为子系统目录,子系统名字即为openjpeg 。 - -+ 子系统目录下创建ohos.build文件,构建时会先读取该文件。 - - ```shell - ##third_party/openjpeg/ohos.build文件内容: - - { - "subsystem": "openjpeg", - "parts": { - "openjpeg_lib": { - "module_list":[ - "//third_party/openjpeg/tests:test_tile_decoder", #新增测试文 test_tile_decoder - "//third_party/openjpeg/tests:test_tile_encoder", #新增测试文 test_tile_encoder - ........... #添加其他测试文件 - ] - } +##### 定义组件 + +三方库默认添加到thirdparty子系统中,移植的三方库做为thirdparty子系统的一个组件。我们需要在third_party/openjpeg目录下新建一个bundle.json(该文件的选项说明参照文档[编译构建](https://gitee.com/openharmony/build#%E8%AF%B4%E6%98%8E)中的bundle.json部分): + + ```json + { + "name": "@ohos/openjpeg", + "description": "", + "version": "2.1", + "license": "BSD", + "publishAs": "code-segment", + "segment": { + "destPath": "third_party/openjpeg" + }, + "dirs": {}, + "scripts": {}, + "readmePath": { + "en": "README" + }, + "component": { + "name": "iconv", + "subsystem": "thirdparty", + "syscap": [], + "features": [], + "adapted_system_type": [], + "rom": "", + "ram": "", + "deps": { + "components": [], + "third_party": [] + }, + "build": { + "sub_component": ["//third_party/openjpeg:openjpeg"], + "inner_kits": [], + "test": [] + } } - } - ``` - -+ 把子系统配置到build/subsystem_config.json. - - ```shell - "openjpeg": { - "path": "third_party/openjpeg", - "name": "openjpeg" - } +} ``` -##### 定义组件并加入子系统 - -在定义子系统的时添加的ohos.build文件中,我们已经定义好了对应的组件openjpeg_lib,module_list所定义的为该组件的目标,目标可以为动态库,静态库,可执行文件。 +##### 引用组件 -##### 定义目标并加入组件 - -在构建gn的时候,我们定义的动态库以及可执行程序都是我们的目标模块,在每个目标模块中添加对应的组件名后即将我们的目标模块加入到该组件中: +在构建gn的时候,我们定义的动态库以及可执行程序都是我们的目标模块,为了编译完后目标模块能被系统自动打包到固件中,我们需要引用对应的组件: ```shell -part_name = "openjpeg_lib" +part_name = "openjpeg" ``` -#### 产品引用 +##### 产品引用 -添加完子系统后,我们还需要将子系统及其组件加入产品定义中,以rk3568为例,产品定义文件存在vendor/hihope/rk3568/config.json,我们需要将以下内容添加到config.json中: +定义完组件后,我们还需要将组件加入产品定义中,以rk3568为例,产品定义文件存在vendor/hihope/rk3568/config.json,我们需要将以下内容添加到config.json中: ```shell { - "subsystem":"thirdparty", - "component":[ - { - "component":"musl", - "features":[] - } - ] -}, -## 以下新加子系统信息 -{ - "subsystem":"openjpeg", - "component":[ - { - "component":"openjpeg_lib", - "features":[] - } + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, +## 以下新加组件信息 + { + "component": "openjpeg", + "features": [] + } ] } -## ``` #### 编译 @@ -518,16 +514,13 @@ ls -l out/rk3568/packages/phone/system/bin/test_* 适配脚本分为2种 - 1. gn脚本:适合OpenHarmony源码上编译的应用调用的三方库,此时三方库编译的so最终会打包到rom中。 - 2. cmake脚本:适合IDE上开发NAPI接口时调用,此时三方库编译的so会和应用一起打包到hap中。 - -+ 配置文件 - - 原生库通过make或者cmake时生成的一些配置文件。如比较通用的config.h配置文件,config.h文件为原生库生成文件,原则上也不做修改,为了避免文件上仓进行代码扫码,可以将文件文件修改后缀名(config.h.in)。相关文档中需要将配置文件使用方法说明。 + 1. gn脚本:适合OpenHarmony源码上编译的应用调用的三方库,此时三方库编译的so最终会和系统固件一起打包到系统rom中。 + 2. cmake脚本:适合IDE上开发NAPI接口时调用,此时三方库编译的so会和应用一起打包到hap包中。 -+ 改动的代码文件 ++ 适配文件 - 如果移植的三方库中涉及到OpenHarmony不支持的API或驱动,需要重新适配相关代码,适配后的代码需要提交。 + 1. 原生库根据当前配置通过make或者cmake时生成的一些配置文件。如比较通用的config.h配置文件等。 + 2. 如果移植的三方库中涉及到OpenHarmony不支持的API或驱动,重新适配的相关代码文件。 + 适配使用说明文档 @@ -538,7 +531,7 @@ ls -l out/rk3568/packages/phone/system/bin/test_* 3. 对于IDE上使用的三方库还需要说明IDE的版本以及对应工程中的model的配置 4. 涉及到工具链的需要提供工具链版本 5. 文件有修改的需要说明修改点以及修改的原因 - 6. 配置文件的使用 + 6. 适配文件的使用 + 涉及源码提交的还需要提供OAT.xml, OAT开源审查配置,详细信息参考[OAT开源审查](https://gitee.com/openharmony-sig/tools_oat). -- Gitee From 4ce8dac3a3d9e0bfa2e19b4fe8c0d9cca1522e2a Mon Sep 17 00:00:00 2001 From: zhongluping <278527840@qq.com> Date: Fri, 16 Dec 2022 14:59:31 +0800 Subject: [PATCH 2/3] thirdparty_port doc add image Signed-off-by: zhongluping <278527840@qq.com> --- .../port_thirdparty/README.md | 4 +++- .../port_thirdparty/media/depends_3rdlib.png | Bin 0 -> 35958 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100755 docs/openharmony_getstarted/port_thirdparty/media/depends_3rdlib.png diff --git a/docs/openharmony_getstarted/port_thirdparty/README.md b/docs/openharmony_getstarted/port_thirdparty/README.md index 0e851fc..006e979 100755 --- a/docs/openharmony_getstarted/port_thirdparty/README.md +++ b/docs/openharmony_getstarted/port_thirdparty/README.md @@ -26,7 +26,7 @@ ## 三方库移植流程 -三方库的移植大致可以分为4个部分,如下图所示: +三方库的移植大致可以分为4个部分,如下图所示:
![移植流程](media/porting.png) 接下来我们将以手动构建gn的方式移植openjpeg到OpenHamony 3.2 Beta1为例具体介绍整个移植流程。
@@ -62,6 +62,8 @@ cmake .. -DCMAKE_BUILD_TYPE=Release 分析生成Makefile过程中的日志信息,找到本库对其他库的依赖关系,分析日志过程中,一般存在如下几种情况: +![其他三方库依赖](./media/depends_3rdlib.png) + + 在日志中找不到库名,有部分三方库在生成Makefile文件时,能够在系统下找到相对应的库时,并不会在日志中打印出来,该类情况在移植到OpenHarmony后,编译过程会报错中体现出来,比较典型的就是,找不到头文件路径或者链接时提示函数符号缺失。 + 在日志中找不到库名,有部分三方库在生成Makefile文件时,能够在系统下找到相对应的库时,并不会在日志中打印出来,该类情况在移植到OpenHarmony后,编译过程会报错中体现出来,比较典型的就是,找不到头文件路径或者链接时提示函数符号缺失 1. os已开发的库,这些库可以在OpenHarmony的third_party目录下找到。 diff --git a/docs/openharmony_getstarted/port_thirdparty/media/depends_3rdlib.png b/docs/openharmony_getstarted/port_thirdparty/media/depends_3rdlib.png new file mode 100755 index 0000000000000000000000000000000000000000..6ba4e4e26666fd512fb3d5f5b01339eb4fd4117c GIT binary patch literal 35958 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 JS?83{1OPnu+E@Sp literal 0 HcmV?d00001 -- Gitee From 7c2908d41be6fa7e42fdc151af7eea8c2ec16bfa Mon Sep 17 00:00:00 2001 From: zhongluping <278527840@qq.com> Date: Fri, 16 Dec 2022 16:04:17 +0800 Subject: [PATCH 3/3] modify port thirdparty docs Signed-off-by: zhongluping <278527840@qq.com> --- .../port_thirdparty/README.md | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/docs/openharmony_getstarted/port_thirdparty/README.md b/docs/openharmony_getstarted/port_thirdparty/README.md index 006e979..350aaa3 100755 --- a/docs/openharmony_getstarted/port_thirdparty/README.md +++ b/docs/openharmony_getstarted/port_thirdparty/README.md @@ -12,11 +12,11 @@ ### 运行时依赖 -运行时依赖主要包括系统API,运行C库以及硬件相关。一般的库都不会有这方面的依赖,除非一些专门针对硬件处理的库(比如针对GPU加速),介于这硬件依赖关系,本文不对这类库做详细讲解,我们只需通过API扫描工具对库进行扫描,分析是否有这类依赖。依赖工具使用和下载地址:[C/C++三方库E2E扫描工具](https://gitee.com/han_jin_fei/e2e/tree/master/thirdparty_compare) +运行时依赖主要包括系统API,运行C库以及硬件相关。一般的库都不会涉及硬件相关的依赖,除非一些专门针对硬件处理的库(比如针对GPU加速),本文不对这类库做详细讲解,我们只需通过API扫描工具对库进行扫描,分析是否有这类的依赖。依赖扫描工具的使用说明以及下载地址:[C/C++三方库E2E扫描工具](https://gitee.com/han_jin_fei/e2e/tree/master/thirdparty_compare) ### 编译结构不兼容 -如今的编译结构种类繁多,如何加入到OpenHarmony编译构建系统,这是移植过程中比较常见,也是无法避免的一个问题。OpenHarmony编译构建如今支持几种形式: +如今的编译结构种类繁多,如何加入到OpenHarmony编译构建系统,这是移植过程中比较常见,也是无法避免的一个问题。OpenHarmony编译构建支持以下几种形式: + 纯GN编译 + GN加action/exec_script @@ -42,7 +42,7 @@ ```shell cd OpenHarmony/third_party/ -git clone git@github.com:uclouvain/openjpeg.git -b openjpeg-2.1 +git clone git@github.com:uclouvain/openjpeg.git -b v2.5.0 ``` #### 生成Makefile @@ -60,12 +60,14 @@ cmake .. -DCMAKE_BUILD_TYPE=Release ##### 外部库依赖分析 -分析生成Makefile过程中的日志信息,找到本库对其他库的依赖关系,分析日志过程中,一般存在如下几种情况: +分析生成Makefile过程中的日志信息,找到本库对其他库的依赖关系,分析日志过程中,一般存在如下几种情况: -![其他三方库依赖](./media/depends_3rdlib.png) ++ 在日志中找不到库名,有部分三方库在生成Makefile文件时,能够在系统下找到相对应的库时,并不会在日志中打印出来,该类情况在移植到OpenHarmony后,编译过程会报错中体现出来,比较典型的就是,找不到头文件路径或者链接时提示函数符号缺失。 ++ 在日志中能找到 found 或 not found 的库 + + ![其他三方库依赖](./media/depends_3rdlib.png) -+ 在日志中找不到库名,有部分三方库在生成Makefile文件时,能够在系统下找到相对应的库时,并不会在日志中打印出来,该类情况在移植到OpenHarmony后,编译过程会报错中体现出来,比较典型的就是,找不到头文件路径或者链接时提示函数符号缺失。 -+ 在日志中找不到库名,有部分三方库在生成Makefile文件时,能够在系统下找到相对应的库时,并不会在日志中打印出来,该类情况在移植到OpenHarmony后,编译过程会报错中体现出来,比较典型的就是,找不到头文件路径或者链接时提示函数符号缺失 + 我们默认这些库在OpenHarmony上都是不存在的,所以需要对这些库进行分析 1. os已开发的库,这些库可以在OpenHarmony的third_party目录下找到。 2. 未开发的库,且在计划内的库,可以优先移植这些库,上报并重新评估工作量。 3. 未开发的库,且未在计划内的库,分析这些库,一般这些库分为两大类,①对库功能存在影响,②对库功能不存在影响; 这部分需要找到库相关的地方分析代码,若对功能不影响,可以考虑忽略,否则上报,重新评估工作量问题。 @@ -346,11 +348,11 @@ ohos_executable("test_title_decoder") {  ![build.gn](media/gn.png) -#### 加入编译构建体系 +### 加入编译构建体系 标准系统编译构建可以参考文档[标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md). -##### 定义组件 +#### 定义组件 三方库默认添加到thirdparty子系统中,移植的三方库做为thirdparty子系统的一个组件。我们需要在third_party/openjpeg目录下新建一个bundle.json(该文件的选项说明参照文档[编译构建](https://gitee.com/openharmony/build#%E8%AF%B4%E6%98%8E)中的bundle.json部分): @@ -390,7 +392,7 @@ ohos_executable("test_title_decoder") { } ``` -##### 引用组件 +#### 引用组件 在构建gn的时候,我们定义的动态库以及可执行程序都是我们的目标模块,为了编译完后目标模块能被系统自动打包到固件中,我们需要引用对应的组件: @@ -398,7 +400,7 @@ ohos_executable("test_title_decoder") { part_name = "openjpeg" ``` -##### 产品引用 +#### 产品引用 定义完组件后,我们还需要将组件加入产品定义中,以rk3568为例,产品定义文件存在vendor/hihope/rk3568/config.json,我们需要将以下内容添加到config.json中: @@ -419,7 +421,7 @@ part_name = "openjpeg" } ``` -#### 编译 +### 编译 所有内容添加完后,执行以下命令进行编译: @@ -444,7 +446,7 @@ ls -l out/rk3568/packages/phone/system/bin/test_* -rwxr-xr-x 1 root root 286148 Mar 23 18:59 test_tile_encoder ``` -#### 测试 +### 测试 在开源库的 tests 目录下有很多测试用例,在 test 目录下的 CMakeLists.txt 文件会生成一些测试文件来进行验证,其中会给出一些测试方法,具体如下: -- Gitee