1# 标准系统如何添加一个模块
2
3要添加的模块可以分为以下三种情况,对原有的配置文件进行不同程度的修改。
4
5+ 在原有部件中添加一个模块
6+ 新建部件并在其中添加模块
7+ 新建子系统并在该子系统的部件下添加模块
8
9## 在原有部件中添加一个模块
10
111. 在模块目录下配置BUILD.gn,根据类型选择对应的模板。
12
13   **支持的模板类型:**
14
15   ```
16   ohos_executable
17   ohos_shared_library
18   ohos_static_library
19   ohos_source_set
20
21   # 预编译模板:
22   ohos_prebuilt_executable
23   ohos_prebuilt_shared_library
24   ohos_prebuilt_etc
25   ```
26
27   **例子:**
28
29   *ohos_shared_library示例*
30
31
32   ```
33   import("//build/ohos.gni")
34   ohos_shared_library("helloworld") {
35     sources = []
36     include_dirs = []
37     cflags = []
38     cflags_c = []
39     cflags_cc = []
40     ldflags = []
41     configs = []
42     deps =[]                    # 部件内模块依赖
43
44     # 跨部件模块依赖定义,
45     # 定义格式为 "部件名:模块名称"
46     # 这里依赖的模块必须是依赖的部件声明在inner_kits中的模块
47     external_deps = [
48       "part_name:module_name",
49     ]
50
51     output_name = ""            # 可选,模块输出名
52     output_extension = ""       # 可选,模块名后缀
53     module_install_dir = ""     # 可选,缺省在/system/lib64/system/lib下, 模块安装路径,模块安装路径,从system/,vendor/后开始指定
54     relative_install_dir = ""   # 可选,模块安装相对路径,相对于/system/lib64/system/lib;如果有module_install_dir配置时,该配置不生效
55
56     part_name = ""              # 必选,所属部件名称
57   }
58   ```
59
60   _ohos\_executable示例:_
61
62   ohos\_executable模板属性和ohos\_shared\_library基本一致
63
64   _注意:可执行模块(即ohos\_executable模板定义的)默认是不安装的,如果要安装,需要指定install\_enable = true_
65
66   _ohos\_prebuilt\_etc示例:_
67
68   ```
69   import("//build/ohos.gni")
70   ohos_prebuilt_etc("etc_file") {
71     source = "file"
72     deps = []  				 # 部件内模块依赖
73     module_install_dir = "" 	 # 可选,模块安装路径,从system/,vendor/后开始指定
74     relative_install_dir = ""  # 可选,模块安装相对路径,相对于system/etc;如果有module_install_dir配置时,该配置不生效
75     part_name = "" 			 # 必选,所属部件名称
76   }
77   ```
78
792. 修改包含该模块所属部件的ohos.build配置文件
80
81   以下是一个ohos.build文件
82
83   ```build
84   {
85     "subsystem": "arkui",
86     "parts": {
87       "napi": {
88         "module_list": [
89           "//foundation/arkui/napi:napi_packages"
90         ],
91         "inner_kits": [
92         ],
93         "test_list": [
94           "//foundation/arkui/napi:napi_packages_test",
95           "//foundation/arkui/napi/test/unittest:unittest"
96         ]
97       }
98     }
99   }
100   ```
101
102   **文件说明:**
103
104   subsystem定义了子系统的名称;parts定义了子系统包含的部件。
105
106   一个部件包含部件名,部件包含的模块module_list,部件提供给其它部件的接口inner_kits,部件的测试用例test_list。
107
108   **修改内容:**
109
110   要添加一个模块到已有部件中去,只需要在该部件的module_list中添加新加模块的gn编译目标;假如该模块提供给其它模块接口,需要在inner_kits中添加对应的配置;如果有该模块的测试用例,需要添加到test_list中去。
111
112## 新建部件并在其中添加模块
113
1141. 在模块目录下配置BUILD.gn,根据类型选择对应的模板。
115
116   这一步与在原有部件中添加一个模块的方法基本一致,只需注意该模块对应BUILD.gn文件中的part_name为新建部件的名称即可。
117
1182. 修改或者新建ohos.build配置文件
119
120   ```build
121   {
122     "subsystem": "子系统名",
123     "parts": {
124       "新建部件名": {
125         "module_list": [
126           "部件包含模块的gn目标"
127         ],
128         "inner_kits": [
129         ],
130         "test_list": [
131           "测试用例",
132         ]
133       }
134     }
135   }
136   ```
137
138   在原有子系统中添加一个新的部件,有两种方法,一种是在该子系统原有的ohos.build文件中添加该部件,另一种是新建一个ohos.build文件,注意无论哪种方式该ohos.build文件均在对应子系统所在文件夹下。
139
140   ohos.build文件包含两个部分,第一部分subsystem说明了子系统的名称,parts定义了该子系统包含的部件,要添加一个部件,需要把该部件对应的内容添加进parts中去。添加的时候需要指明该部件包含的模块module_list,假如有提供给其它部件的接口,需要在inner_kits中说明,假如有测试用例,需要在test_list中说明,inner_kits与test_list没有也可以不添加。
141
1423. 在productdefine/common/products目录下的产品配置文件(json格式)中添加对应的部件,直接添加到原有部件后即可。
143
144   ```json
145   {
146       "parts":{
147           "部件所属子系统名:部件名":{}
148       }
149   }
150   ```
151
152## 新建子系统并在该子系统的部件下添加模块
153
1541. 在模块目录下配置BUILD.gn,根据类型选择对应的模板。这一步与新建部件并在其中添加模块中对应的步骤并无区别。
155
1562. 在新建的子系统目录下每个部件对应的文件夹下创建ohos.build文件,定义部件信息。这一步与新建部件并在其中添加模块中对应的步骤并无区别。
157
1583. 修改build目录下的subsystem_config.json文件
159
160   ```json
161   {
162     "子系统名": {
163       "path": "子系统目录",
164       "name": "子系统名",
165       ...
166     }
167   }
168   ```
169
170   该文件定义了有哪些子系统以及这些子系统所在文件夹路径,添加子系统时需要说明子系统path与name,分别表示子系统路径和子系统名。
171
1724. 在productdefine/common/products目录下的产品配置如Hi3516DV300.json中添加对应的部件,直接添加到原有部件后即可。
173
174   ```json
175   {
176   	...
177       "parts":{
178           "部件所属子系统名:部件名":{}
179       }
180   }
181   ```
182
183   **成功添加验证:**
184
185   + 在输出文件夹的对应子系统文件夹下的部件文件夹下的BUILD.gn文件中module_list包含了新建模块的BUILD.gn中定义的目标。
186   + 编译完成后打包到image中去,生成对应的so文件或者二进制文件
187
188## 配置文件说明
189
190鸿蒙操作系统的配置文件主要有四个
191
1921. productdefine/common/products目录下的产品名.json文件
193
194   ```json
195   {
196     "product_name": "Hi3516DV300",
197     "product_company": "hisilicon",
198     "product_device": "hi3516dv300",
199     "version": "2.0",
200     "type": "standard",
201     "parts":{
202       "arkui:ace_engine_standard":{},
203       "arkui:napi":{},
204       "account:os_account":{},
205       "distributeddatamgr:native_appdatamgr":{},
206       "distributeddatamgr:distributeddatamgr":{},
207       "distributeddatamgr:appdatamgr_jskits":{}
208     }
209   }
210   ```
211
212   指明了产品名,产品厂商,产品设备,版本,要编译的系统类型,以及产品包含的部件。
213
2142. build目录下的subsystem_config.json文件
215
216   ```json
217   {
218     "arkui": {
219       "project": "hmf/ace",
220       "path": "foundation/arkui",
221       "name": "arkui",
222       "dir": "foundation"
223     }
224   }
225   ```
226
227   该文件对子系统进行了说明,我们需要该子系统定义中的name与path,分别表示子系统的名称和所在文件夹路径。
228
2293. 子系统中ohos.build文件
230
231   ```build
232   {
233     "subsystem": "arkui",
234     "parts": {
235       "napi": {
236         "module_list": [
237           "//foundation/arkui/napi:napi_packages"
238         ],
239         "inner_kits": [
240         ],
241         "test_list": [
242           "//foundation/arkui/napi:napi_packages_test",
243           "//foundation/arkui/napi/test/unittest:unittest"
244         ]
245       }
246     }
247   }
248   ```
249
250   ohos.build文件定义了子系统包含的部件。
251
252   每个部件定义它所包含的模块目标module_list,以及部件间交互的接口inner_kits,测试用例test_list。部件包含的模块目标module_list是必须要说明的。
253
2544. 每个模块对应的BUILD.gn文件
255
256   可以使用提供的模板,也可以使用gn语法规则自定义编写。
257
258