• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1## 模块依赖分析
2
3
4
5### 生成部件依赖
6
7生成步骤:
8
91. 编译代码生成中间文件,只执行gn阶段,并打开check_deps属性
10
11   ```shell
12   ./build.sh --product-name product_name --ccache --gn-args pycache_enable=true --gn-args check_deps=true --build-only-gn
13   ```
14
15   打开check_deps属性后,在输出产物目录下会生成out/{product_name}/deps_files目录,该目录下放置的是各个模块的依赖关系列表,以rk3568产品(下面都是以该产品为例进行举例)的目标//foundation/ability/ability_runtime/test/mock/services_abilitymgr_test/libs/aakit:aakit_mock为例,生成的依赖文件如下,包含了deps和external_deps以及该模块所在的路径。
16
17   ```
18   {
19     "deps": [
20       "//foundation/ability/ability_runtime/interfaces/inner_api/app_manager:app_manager",
21       "//foundation/systemabilitymgr/safwk/interfaces/innerkits/safwk:system_ability_fwk",
22       "//foundation/systemabilitymgr/samgr/interfaces/innerkits/samgr_proxy:samgr_proxy",
23       "//third_party/jsoncpp:jsoncpp"
24     ],
25     "external_deps": [
26       "ability_base:base",
27       "ability_base:configuration",
28       "ability_base:session_info",
29       "ability_base:want",
30       "bundle_framework:appexecfwk_base",
31       "bundle_framework:appexecfwk_core",
32       "c_utils:utils",
33       "ffrt:libffrt",
34       "hilog:libhilog",
35       "ipc:ipc_core"
36     ],
37     "module_label": "//foundation/ability/ability_runtime/test/mock/services_abilitymgr_test/libs/aakit:aakit_mock(//build/toolchain/ohos:ohos_clang_arm)",
38     "part_name": "ability_runtime"
39   }
40   ```
41
42   上述的依赖关系与该模块的BUILD.gn文件是对应的:
43
44   ```
45   ohos_source_set("aakit_mock") {
46     sources = [
47       "src/ability_scheduler.cpp",
48       "src/mock_ability_connect_callback.cpp",
49     ]
50
51     configs = [ ":aakit_mock_config" ]
52     cflags = []
53     if (target_cpu == "arm") {
54       cflags += [ "-DBINDER_IPC_32BIT" ]
55     }
56     deps = [
57       "${ability_runtime_innerkits_path}/app_manager:app_manager",
58       "${distributedschedule_path}/safwk/interfaces/innerkits/safwk:system_ability_fwk",
59       "${distributedschedule_path}/samgr/interfaces/innerkits/samgr_proxy:samgr_proxy",
60       "//third_party/jsoncpp:jsoncpp",
61     ]
62     external_deps = [
63       "ability_base:base",
64       "ability_base:configuration",
65       "ability_base:session_info",
66       "ability_base:want",
67       "bundle_framework:appexecfwk_base",
68       "bundle_framework:appexecfwk_core",
69       "c_utils:utils",
70       "ffrt:libffrt",
71       "hilog:libhilog",
72       "ipc:ipc_core",
73     ]
74
75     subsystem_name = "ability"
76     part_name = "ability_runtime"
77   }
78   ```
79
80   可以看出,上面的模块依赖关系里面已经包含了三分部件的依赖关系。
81
822. 运行依赖生成脚本
83
84   ```shell
85   # 比如在源码根目录下执行
86   build/tools/module_dependence/part_deps.py --deps-files-path out/{product_name}/deps_files
87   ```
88
89   基于产生的模块依赖关系,运行上述的脚本,会生成模块依赖关系文件和部件间的依赖关系文件,如果加上--graph参数,会生成依赖图。
90
913. 脚本参数说明
92
93   ```
94   --deps-files-path  # 必选  模块依赖数据文件目录,gn执行完成后输出在out/{product_name}/deps_files目录下,如果不在源码目录执行,需要配置到正确的路径。
95   --graph            # 可选  生成部件依赖图。使用该选项,需要安装对应的库pyecharts
96   ```
97
984. 关于依赖图的生成
99
100   如果需要生成部件依赖图,使用--graph参数指定;本地机器需要安装依赖库:pyecharts
101
102   ```
103   # 使用pip安装python3的依赖库
104   pip3 install pyecharts
105
106   # 如果pip3没有安装,请先安装pip3
107   sudo apt install python3-pip
108   ```
109
1105. 输出
111
112   脚本运行后会在 `--deps-files-path` 指定的deps_files的同级目录下,创建parts_deps_info文件夹输出结果数据。
113   parts_deps_info:
114
115   ```
116   parts_deps_info/all_deps_data.json       # 生成的模块依赖信息
117   parts_deps_info/part_deps_info.json      # 生成的部件依赖
118   parts_deps_info/part-deps-grahp.html     # 生成的部件依赖图,只有指定--graph参数时才生成
119   ```
120
121**图1** 所有部件依赖关系图
122
123![image-20231116153818510](./../../docs/figures/all_parts_deps.png)
124
125**图2**  单个部件的依赖关系
126
127![image-20231116154103637](./../../docs/figures/single_part_deps.png)
128
129
130
131将指针悬停在单个部件上,可以查看单个部件的依赖状况。
132
133### 生成模块依赖
134
135
136
137生成步骤:
138
1391. 编译代码生成中间文件,只执行gn阶段,并打开check_deps属性
140
141   ```shell
142   ./build.sh --product-name product_name --ccache --gn-args pycache_enable=true --gn-args check_deps=true --build-only-gn
143   ```
144
145   打开check_deps属性后,运行上述脚本,在out目录下会生成out/{product_name}/deps_files文件。该文件下列表以模块的粒度铺开,描述了各个模块之间的依赖关系列表。
146
1472. 运行依赖生成脚本
148
149   ```shell
150   # 比如在源码根目录下执行
151   build/tools/module_dependence/module_deps.py --deps-files-path out/{product_name}/deps_files
152   ```
153
154   运行module_deps.py脚本,并传入上面的模块依赖关系列表,将生成module_deps_info文件,该文件下会描述模块之间的依赖关系。
155
1563. 脚本参数说明
157
158   ```
159   --deps-files-path  # 必选  模块依赖数据文件目录,gn执行完成后输出在out/{product_name}/deps_files目录下,如果不在源码目录执行,需要配置到正确的路径。
160   ```
161
1624. 输出
163
164   脚本运行后会在 `--deps-files-path` 指定的deps_files的同级目录下,创建module_deps_info文件夹输出结果数据。
165
166   ```
167   module_deps_info/all_deps_data.json        # 生成的模块依赖信息
168   module_deps_info/module_deps_info.json     # 生成的模块依赖
169   ```
170
171   all_deps_data.json中的文件,以模块ability_base:want为例,会输出模块的deps和external_deps信息。
172
173   ```
174     "ability_base:want": {
175       "deps": [
176         "//foundation/ability/ability_base:base",
177         "//foundation/ability/ability_base:zuri",
178         "//third_party/json:nlohmann_json_static",
179         "//third_party/jsoncpp:jsoncpp"
180       ],
181       "external_deps": [
182         "c_utils:utils",
183         "hilog:libhilog",
184         "ipc:ipc_single"
185       ],
186       "module_label": "//foundation/ability/ability_base:want(//build/toolchain/ohos:ohos_clang_arm)",
187       "part_name": "ability_base",
188       "external_deps_label": [
189         "//commonlibrary/c_utils/base:utils(//build/toolchain/ohos:ohos_clang_arm)",
190         "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog(//build/toolchain/ohos:ohos_clang_arm)",
191         "//foundation/communication/ipc/interfaces/innerkits/ipc_single:ipc_single(//build/toolchain/ohos:ohos_clang_arm)"
192       ]
193     },
194   ```
195
196   module_deps_info.json的文件中,会将deps和external_deps进行合并。
197
198   ```
199     "ability_base:want": [
200       "c_utils:utils",
201       "hilog:libhilog",
202       "ability_base:base",
203       "ipc:ipc_single",
204       "jsoncpp:jsoncpp",
205       "ability_base:zuri",
206       "json:nlohmann_json_static"
207     ],
208   ```
209
210
211
2125. 生成单个模块的依赖树
213
214   (1) 依赖pyecharts组件,需要安装:
215
216      ```
217   pip3 install pyecharts
218      ```
219
220   (2) 生成命令:
221
222      ```
223   # 比如在源码根目录下执行
224   build/tools/module_dependence/module_deps_tree.py --module-name 部件名:模块名 --module-deps-file out/{product_name}/module_deps_info/module_deps_info.json
225      ```
226
227   (3) 参数说明:
228
229      ```
230   --module-name        # 必选 要生成模块的名称,结构为"部件名:模块名"
231   --module-deps-file   # 必选 模块依赖信息文件module_deps_info.json所在路径
232      ```
233
234   (4) 输出:
235
236      脚本运行后会在module_deps_info.json的同级目录下输出模块依赖树图
237
238      ```
239   module_deps_info/部件名__模块名.html
240      ```
241
242   用浏览器打开这个文件,会展示模块依赖树,默认展开第一层依赖。实心点表示一个模块还有未展开的其它模块依赖,点击实心点可以展开它的依赖。一个模块第一次出现时显示为黑色,之后出现显示为红色。
243
244**图3**  单个模块的依赖关系(展开前)
245
246![image-20231116160702422](./../../docs/figures/module_deps_before_expand.png)
247
248**图4**  单个模块的依赖关系(展开后)
249
250![image-20231116160822903](./../../docs/figures/module_deps_after_expand.png)
251
252
253
254**注意:**
255*工具能力在完善中,使用脚本和步骤会随时变化。*
256
257
258### 门禁CI部件依赖关系(含三方部件)
259
260门禁的依赖关系基于上述工具生成,打开单个部件可以看出包含了各子系统部件以及三方部件的依赖列表。
261
262   **图5**  CI门禁上部件的依赖关系
263
264   ![image-20231116160822904](./../../docs/figures/parts_deps_CI.png)
265
266门禁CI上依赖关系:http://ci.openharmony.cn/workbench/coding/codeInsight/part
267