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