Bootstrap

Openharmony的编译构建--进阶篇1

上一篇中说明了Openharmony V3.1的编译构建流程,如何在标准系统即L2设备添加一个模块呢,在Openharmony上如何编译与运行HelloWorld此篇中有所提及,此篇对此进行详细的说明。

一、标准系统添加一个模块

在Openharmony中添加模块可以分以下三种情况,对原有的配置文件时行不同程度的修改

  • 在原有的部件中添加一个模块

  • 新建部件并在其中添加模块

  • 新建子系统并在该子系统的部件下添加模块

以下分三种方式对添加一个模块的过程来分别分析。

二、 在原有部件中添加一个模块

1.在模块目录下配置BUILD.gn,根据类型选择对应的模板

支持的模板类型:

ohos_executable		#可执行程序
ohos_shared_library #动态库
ohos_static_library #静态库

# 预编译模板
ohos_prebuilt_executable 		#预编译可执行程序
ohos_prebuilt_shared_library 	#预编译动态库
ohos_prebuilt_etc				#预编译配置

以下例子中对BUILD.gn文件中各模板的属性及配置项的注释说明

例子:

ohos_shared_library示例

import("//build/ohos.gni")
ohos_shared_library("helloworld") {
  source = ["",""]		# 包含的C或C++文件
  include_dir = ["",""] # 包含的头文件
  cflags = []			# 编译选项
  cflags_c = []
  cflags_CC = []
  ldflags = []
  configs = []
  deps = []				# 部件内模块依赖
  
  external_deps = [
    "part_name:module_name",
  ]
  # 跨部件模块依赖定义
  # 定义格式为 "部件名:模块名称"
  # 这里依赖的模块必须是部件声明在inner_kits中的模块
  
  defines += ["",""]	# 宏定义
  
  output_name = "" 		# 可选,模块输出名
  output_extension = "" # 可选,模块名后缀
  module_install_dir = ""	# 可选,缺省在/system/lib64或/system/lib下,模块安装路径,模块安装路径,从system/,vendor/后开始指定
  relative_install_dir = ""	# 可选,模块安装相对路径,相对于/system/lib64或/system/lib;如果有module_install_dir配置时,该配置项不生效
  
  part_name = ""		# 必选,所属部件名称
  subsystem_name = ""	# 可选,子系统名称
}

ohos_executable示例

ohos_executable模板属性和ohos_shared_library基本一致。

ohos_executable("helloworld") {
  source = ["",""]		# 包含的C或C++文件
  include_dir = ["",""] # 包含的头文件
...
  install_enable = true	# 编译后的镜像烧录后,可执行模块默认是不安装在开发板内,如果要安装需要指定install_enable为true.
}

ohos_prebuilt_etc示例

ohos_prebuilt_etc就是将预编译的文件安装在开发板内,一般会是配置文件,例如xml,cfg等。

ohos_prebuilt_etc("helloworld") {
  source = ""		
  deps = [] 	# 部件内模块依赖
  module_install_dir = ""	# 可选,模块安装路径,从system/,vendor/后开始指定
  relative_install_dir = ""	# 可选,模块安装相对路径,相对于/system/etc;如果有module_install_dir配置时,该配置项不生效
  part_name = ""		# 必选,所属部件名称
}

2.修改包含该模块所属部件的bundle.json

以base/account/os_account/bundle.json为例:

此模块的BUILD.gn文件所在目录为//base/account/os_account/,

则在“sub_component”中添加"//base/account/os_account:helloworld"。

{
  "name": "@ohos/os_account",
  "description": "Allowing apps to use OS account-related functions",
  "version": "3.1",
  "license": "Apache License 2.0",
  "publishAs": "code-segment",
  "segment": {
    "destPath": "base/account/os_account"
  },
...
  "component": {
    "name": "os_account_standard",
    "subsystem": "account",
...
    "build": {
      "sub_component": [
        "//base/account/os_account/services:services_target",
        "//base/account/os_account/services/accountmgr/src/appaccount:app_account_service_core",
        "//base/account/os_account/frameworks/appaccount/native:app_account_innerkits",
        "//base/account/os_account/frameworks/osaccount/core:os_account_core",
        "//base/account/os_account/frameworks/common:common_target",
        "//base/account/os_account/frameworks/osaccount/native:os_account_innerkits",
        "//base/account/os_account/interfaces/kits/napi/appaccount:appaccount",
        "//base/account/os_account/interfaces/kits/napi/distributedaccount:distributedaccount",
        "//base/account/os_account/interfaces/kits/napi/osaccount:osaccount",
        "//base/account/os_account/sa_profile:account_sa_profile",
        "//base/account/os_account/tools:os_account_tools",
        "//base/account/os_account:helloworld"
      ],
...
   }
  }
}

此时再在Openharmony里执行

./build.sh --product-name rk3568

编译完成后,在//out/rk3568/account/os_account_standard/目录下可以找到编译完成的可执行文件与动态库。

三、新建部件并在其中添加模块

  1. 在模块目录下配置BUILD.gn,根据类型选择需要的模板

此步与在原部件中添加一个模块的方法基本上一致,只需要注意该模块对应BUILD.gn文件中的part_name为新建部件的名称即可。

2.修改或者新建bundle.json

在原有子系统中添加一个新的部件,有两种方法,一种就是如第二点所述,在原有的bundle.json文件中添加该部件。另一种就是新建一个。注意无论哪种方式该bundle.json文件均在对应子系统所在的文件目录下。除非你修改了//build/subsystem_config.json中关于此子系统对应的路径信息。参考Openharmony的编译构建--基础篇

以account子系统为例,添加新的子部件os_account_test.

  • 首先base/account下创建目录os_account_test,此目录下新建bundle.json。内容如下

{
  "name": "@ohos/os_account",
  "description": "Allowing apps to use OS account-related functions",
  "version": "3.1",
  "license": "Apache License 2.0",
  "publishAs": "code-segment",
  "segment": {
    "destPath": "base/account/os_account"
  },
...
  "component": {
    "name": "os_account_test",		# 新建的部件名称
    "subsystem": "account",			# 所属的子系统
...
    },
    "build": {
      "sub_component": [			# 部件包含的模块的gn目标
...                                  
      ],
      "inner_kits": [
...
     ],
     "test": [
...
     ]
   }
  }
}
  • 添加BUILD.gn

如果在base/account/os_account_test新建BUILD.gn,则sub_component添加如下

"//base/account/os_account_test:helloworld"
  • inner_kits与test

假如有提供给其它部件的接口,需要在inner_kits说明,假如有测试用例,需要在test中说明,inner_kits与test不是必选项,可以不添加。

3.//productdefine/common/products/rk3568.json文件添加部件"account:os_account_test":{}

{
  "product_name": "rk3568",
  "product_company": "hihope",
  "product_device": "rk3568",
  "version": "2.0",
  "type": "standard",
  "product_build_path": "device/hihope/build",
  "parts":{
    "ace:ace_engine_standard":{},
    "ace:napi":{},
    "account:os_account_standard":{},
    "account:os_account_test":{},
    "barrierfree:accessibility":{},
......
    }
}

至此,重新编译。在//out/rk3568/account/os_account_test/目录下会得到新增的模块下可执行文件或动态库。

后续更精彩

1.Openharmony编译构建--进阶篇2

;