README_zh.md
1# SBOM
2
3## 简介
4
5本工具基于 **GN 构建元数据**,遵循 **OpenHarmony SBOM 中间态元数据格式**,生成标准化的中间实例,并输出符合 SPDX 2.3 规范的 SBOM 文件。
6
7无需依赖任何外部服务,满足OH社区**安全治理**、**开源合规治理**、**开源软件管理**述求。
8
9## 目录
10
11```
12/sbom # SBOM工具根目录
13
14├── __pycache__
15├── analysis/ # 依赖关系构建,包括依赖图、文件依赖关系和包依赖关系构建
16├── common/ # 工具类
17├── converters/ # 转换器,将SBOM元数据转换为各种标准的JSON格式
18├── data/ # `gn_gen`、`manifest`等元数据模型字段集中配置管理
19├── extraction/ # 负责加载构建系统生成的 `gn_gen.json`等关键资源并提取版权许可证信息
20├── pipeline/ # SBOM 生成核心流程控制器,将构建系统信息转化为标准化的SBOM 结构,是 SBOM 生成主入口
21├── sbom
22│ ├── builder/ # SBOM建造者,提供SBOM生成工具类
23│ └── config/ # SBOM 模型字段的集中配置与管理,提供基于 JSON 配置的字段元数据管理
24│ └── metadata/ # 定义 SBOM 元数据的核心数据模型,包括文档信息、软件包、文件、依赖关系等
25│ └── vaildation/ # SBOM字段级验证工具,支持通过声明式方式检查必填字段是否具有有效值
26├── generate_sbom.py*
27```
28
29
30## 说明
31
32**代码根目录下执行全量版本的编译命令**
33
34~~~shell
35sbom生成默认为关闭
36
37使用如下命令:
38```
39/build.sh --product-name {product_name} --sbom=true
40```
41
42sbom输出在 out/{product_name}/sbom/目录下。
43~~~
44
45**输出**
46
47```
48out/{product_name}/sbom/ # sbom输出根目录
49
50├── sbom_meta_date.json # SBOM中间态 json 文件
51├── spdx.json # SPDX格式 SBOM 文件
52```
53
541. **SBOM中间态文件**
55
56 包含以下四个字段
57
58 - document
59
60 本 SBOM 文档的元数据,包含标识、版本、时间戳、作者、工具等核心信息。
61
62 | 字段名 | 类型 | 是否必选 | 说明 |
63 | -------------------- | ------ | ------------------- | ------------------------ |
64 | `serialNumber` | 字符串 | 必选 | 文档的唯一标识符 |
65 | `docId` | 字符串 | SPDX 必选,其他可选 | 文档的唯一 ID |
66 | `name` | 字符串 | SPDX 必选,其他可选 | 文档所描述的软件名称 |
67 | `documentNamespace` | 字符串 | SPDX 必选,其他可选 | 文档的全局唯一命名空间 |
68 | `version` | 字符串 | 必选 | 文档的版本号 |
69 | `bomFormat` | 字符串 | 必选 | SBOM 的格式标识 |
70 | `specVersion` | 字符串 | 必选 | 所遵循规范的版本号 |
71 | `dataLicense` | 字符串 | 必选 | SBOM 数据的许可声明 |
72 | `licenseListVersion` | 字符串 | SPDX 必选,其他可选 | 许可证列表的版本号 |
73 | `timestamp` | 字符串 | 必选 | 文档生成的时间戳 |
74 | `authors` | 数组 | 必选 | 文档创建者的标识 |
75 | `lifecycles` | 数组 | 可选 | 覆盖的软件生命周期阶段 |
76 | `properties` | 数组 | 可选 | 用户自定义的附加属性 |
77 | `tools` | 数组 | 可选 | 生成文档所使用的工具信息 |
78 | `docComments` | 字符串 | 可选 | 对文档的整体说明或注释 |
79
80 - files
81
82 记录构成软件的各个文件的路径、校验和、许可证结论及版权声明等详细信息。
83
84 | 字段名 | 类型 | 是否必选 | 说明 |
85 | -------------------- | ------ | ------------------ | -------------------------- |
86 | `fileName` | 字符串 | 必选 | 文件名称或路径 |
87 | `fileAuthor` | 字符串 | 团标必选,其他可选 | 文件作者 |
88 | `fileId` | 字符串 | 必选 | 文件标识符 |
89 | `fileTypes` | 数组 | 可选 | 文件类型数组 |
90 | `checksums` | 数组 | 必选 | 文件的校验和信息 |
91 | `licenseConcluded` | 字符串 | 必选 | 许可证结论 |
92 | `licenseInfoInFiles` | 数组 | 可选 | 文件中声明的许可证信息数组 |
93 | `copyrightText` | 字符串 | 可选 | 版权声明 |
94
95 - packages
96
97 描述软件包的基本属性,包括名称、版本、供应商、许可证、唯一标识及哈希值等元数据。
98
99 | 字段名 | 类型 | 是否必选 | 说明 |
100 | ------------------ | ------ | ------------------------ | ------------------------------- |
101 | `type` | 字符串 | CycloneDX 必选,其他可选 | 组件类型 |
102 | `supplier` | 字符串 | 必选 | 供应商 |
103 | `group` | 字符串 | 必选 | 组件的组标识 |
104 | `name` | 字符串 | 必选 | 组件的名称 |
105 | `version` | 字符串 | 必选 | 组件的版本号 |
106 | `purl` | 字符串 | 必选 | 组件的唯一标识 |
107 | `licenseConcluded` | 字符串 | 必选 | 实际许可证 |
108 | `licenseDeclared` | 字符串 | 必选 | 作者声明的许可证 |
109 | `comCopyright` | 字符串 | 可选 | 版权声明 |
110 | `bom-ref` | 字符串 | 必选 | 文档内部唯一标识符,可复用 purl |
111 | `downloadLocation` | 字符串 | 可选 | 下载来源 |
112 | `hashes` | 数组 | 必选 | hash 值 |
113 | `compPlatform` | 字符串 | 团标必选,其他可选 | 组件平台架构 |
114
115 - relationships
116
117 定义组件与文件或其他组件之间的依赖或关联关系,明确软件结构与组成逻辑。
118
119 | 字段名 | 类型 | 是否必选 | 说明 |
120 | ------------------ | ------ | -------- | ---------------------------------------------------- |
121 | `bom-ref` | 字符串 | 必选 | 当前组件或服务的引用标识符 |
122 | `dependsOn` | 数组 | 必选 | 当前组件或服务所依赖的其他组件或服务的引用标识符列表 |
123 | `relationshipType` | 字符串 | 必选 | 依赖类型 |
124
1252. **SPDX文件**
126
127 目前输出SPDX2.3 格式,参考文档[SPDX Specification 2.3.0](https://spdx.github.io/spdx-spec/v2.3/)
128
129**输出示例**
130
1311. **镜像上文件**
132
133 ```json
134 # sbom 中间态格式
135 # 镜像上文件信息
136 # 以镜像上文件 system/app/com.ohos.adminprovisioning/adminprovisioning.hap 作为起点
137 {
138 "copyrightText": "NOASSERTION",
139 "fileAuthor": "NOASSERTION",
140 "fileId": "system/app/com.ohos.adminprovisioning/adminprovisioning.hap",
141 "fileName": "adminprovisioning.hap"
142 }
143 # 安装到镜像上文件依赖
144 # 此镜像上文件由 //out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap 拷贝产生
145 {
146 "bom-ref": "system/app/com.ohos.adminprovisioning/adminprovisioning.hap",
147 "dependsOn": [
148 "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap"
149 ],
150 "relationshipType": "COPY_OF"
151 }
152 # 构建生成文件
153 # 构建文件 //out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap 信息
154 {
155 "copyrightText": "NOASSERTION",
156 "fileAuthor": "NOASSERTION",
157 "fileId": "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap",
158 "fileName": "adminprovisioning.hap"
159 }
160 # 构建文件依赖其他文件
161 {
162 "bom-ref": "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap",
163 "dependsOn": [
164 "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning_hap/ResourceTable.h",
165 "//out/rk3568/clang_x64/arkcompiler/ets_frontend/es2abc",
166 "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning_hap/resources.zip",
167 "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning_hap/js_assets.zip",
168 "//out/rk3568/gen/applications/standard/admin_provisioning/adminprovisioning_hap.metadata",
169 "//out/rk3568/obj/developtools/packing_tool/jar/haptobin_tool.jar",
170 "//out/rk3568/obj/developtools/packing_tool/jar/app_unpacking_tool.jar",
171 "//out/rk3568/obj/developtools/packing_tool/jar",
172 "//out/rk3568/obj/developtools/packing_tool/jar/app_check_tool.jar",
173 "//out/rk3568/clang_x64/obj/arkcompiler/ets_frontend/es2panda/ts2abc.js",
174 "//out/rk3568/obj/developtools/packing_tool/jar/app_packing_tool.jar"
175 ],
176 "relationshipType": "GENERATED_FROM"
177 }
178 # 构建文件来源部件
179 # pkg:gitee/OpenHarmony/applications_admin_provisioning@94d3db73c8492ac0ace0b59e76b0c23b6ca6663f
180 {
181 "bom-ref": "pkg:gitee/OpenHarmony/applications_admin_provisioning@94d3db73c8492ac0ace0b59e76b0c23b6ca6663f",
182 "dependsOn": [
183 "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning_hap/ResourceTable.h",
184 "//out/rk3568/gen/applications/standard/admin_provisioning/adminprovisioning_app_profile.metadata",
185 "//out/rk3568/gen/applications/standard/admin_provisioning/adminprovisioning_js_assets.metadata",
186 "//out/rk3568/gen/applications/standard/admin_provisioning/adminprovisioning_hap.metadata",
187 "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning_hap/resources.zip",
188 "//out/rk3568/gen/applications/standard/admin_provisioning/adminprovisioning_resources.metadata",
189 "//out/rk3568/gen/applications/standard/admin_provisioning/adminprovisioning_resources/module.json",
190 "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning_hap/js_assets.zip",
191 "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap",
192 "//out/rk3568/gen/applications/standard/admin_provisioning/adminprovisioning_resources/ResourceTable.h"
193 ],
194 "relationshipType": "GENERATES"
195 }
196 ```
197
198 ---
199
200 ```json
201 # SPDX2.3 格式
202 # 镜像上文件信息
203 # 以镜像上文件 system/app/com.ohos.adminprovisioning/adminprovisioning.hap 作为起点
204 {
205 "SPDXID": "system/app/com.ohos.adminprovisioning/adminprovisioning.hap",
206 "copyrightText": "NOASSERTION",
207 "fileName": "adminprovisioning.hap"
208 }
209 # 安装到镜像上文件依赖
210 # 此镜像上文件由 //out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap 拷贝产生
211 {
212 "relatedSpdxElement": "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap",
213 "relationshipType": "COPY_OF",
214 "spdxElementId": "system/app/com.ohos.adminprovisioning/adminprovisioning.hap"
215 }
216 # 构建生成文件
217 # 构建文件 //out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap 信息
218 {
219 "SPDXID": "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap",
220 "copyrightText": "NOASSERTION",
221 "fileName": "adminprovisioning.hap"
222 }
223 # 构建文件依赖其他文件
224 {
225 "relatedSpdxElement": "//out/rk3568/obj/developtools/packing_tool/jar/app_check_tool.jar",
226 "relationshipType": "GENERATED_FROM",
227 "spdxElementId": "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap"
228 },
229 {
230 "relatedSpdxElement": "//out/rk3568/gen/applications/standard/admin_provisioning/adminprovisioning_hap.metadata",
231 "relationshipType": "GENERATED_FROM",
232 "spdxElementId": "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap"
233 } ...
234 # 构建文件来源部件
235 # pkg:gitee/OpenHarmony/applications_admin_provisioning@94d3db73c8492ac0ace0b59e76b0c23b6ca6663f
236 {
237 "relatedSpdxElement": "//out/rk3568/obj/applications/standard/admin_provisioning/adminprovisioning.hap",
238 "relationshipType": "GENERATES",
239 "spdxElementId": "pkg:gitee/OpenHarmony/applications_admin_provisioning@94d3db73c8492ac0ace0b59e76b0c23b6ca6663f"
240 }
241 ```
242
2432. **上游包**
244
245 ```json
246 # sbom 中间态格式
247 # 以 pkg:gitee/OpenHarmony/third_party_bounds_checking_function@2ae82839ecaaa7d031e66ccbd2076d671acfd615 为例
248 {
249 "bom-ref": "pkg:gitee/OpenHarmony/third_party_bounds_checking_function@2ae82839ecaaa7d031e66ccbd2076d671acfd615",
250 "compPlatform": "Linux",
251 "downloadLocation": "https://gitee.com/openharmony/third_party_bounds_checking_function/tree/2ae82839ecaaa7d031e66ccbd2076d671acfd615",
252 "group": "OpenHarmony",
253 "licenseDeclared": "NOASSERTION",
254 "name": "third_party_bounds_checking_function",
255 "purl": "pkg:gitee/OpenHarmony/third_party_bounds_checking_function@2ae82839ecaaa7d031e66ccbd2076d671acfd615",
256 "supplier": "Organization: OpenHarmony",
257 "type": "library",
258 "version": "master"
259 }
260 # 依赖信息
261 # 依赖关系是变体,上游包 ref 为 pkg:gitee/upstream/openEuler:libboundscheck@v1.1.16
262 {
263 "bom-ref": "pkg:gitee/OpenHarmony/third_party_bounds_checking_function@2ae82839ecaaa7d031e66ccbd2076d671acfd615",
264 "dependsOn": [
265 "pkg:gitee/upstream/openEuler:libboundscheck@v1.1.16"
266 ],
267 "relationshipType": "VARIANT_OF"
268 }
269 # 上游包信息
270 {
271 "bom-ref": "pkg:gitee/upstream/openEuler:libboundscheck@v1.1.16",
272 "downloadLocation": "https://gitee.com/openeuler/libboundscheck",
273 "licenseConcluded": "Mulan Permissive Software License,Version 2",
274 "name": "openEuler:libboundscheck",
275 "purl": "pkg:gitee/upstream/openEuler:libboundscheck@v1.1.16",
276 "supplier": "NOASSERTION",
277 "type": "library",
278 "version": "v1.1.16"
279 }
280 ```
281
282 ---
283
284 ```json
285 # SPDX 格式
286 # 以 pkg:gitee/OpenHarmony/third_party_bounds_checking_function@2ae82839ecaaa7d031e66ccbd2076d671acfd615 为例
287 {
288 "SPDXID": "pkg:gitee/OpenHarmony/third_party_bounds_checking_function@2ae82839ecaaa7d031e66ccbd2076d671acfd615",
289 "copyrightText": "NOASSERTION",
290 "downloadLocation": "https://gitee.com/openharmony/third_party_bounds_checking_function/tree/2ae82839ecaaa7d031e66ccbd2076d671acfd615",
291 "externalRefs": [
292 {
293 "referenceLocator": "pkg:gitee/OpenHarmony/third_party_bounds_checking_function@2ae82839ecaaa7d031e66ccbd2076d671acfd615",
294 "referenceType": "purl"
295 }
296 ],
297 "filesAnalyzed": false,
298 "licenseDeclared": "NOASSERTION",
299 "name": "third_party_bounds_checking_function",
300 "originator": "OpenHarmony",
301 "primaryPackagePurpose": "LIBRARY",
302 "supplier": "Organization: OpenHarmony",
303 "versionInfo": "master"
304 }
305 # 依赖信息
306 # 依赖关系是变体,上游包 ref 为 pkg:gitee/upstream/openEuler:libboundscheck@v1.1.16
307 {
308 "relatedSpdxElement": "pkg:gitee/upstream/openEuler:libboundscheck@v1.1.16",
309 "relationshipType": "VARIANT_OF",
310 "spdxElementId": "pkg:gitee/OpenHarmony/third_party_bounds_checking_function@2ae82839ecaaa7d031e66ccbd2076d671acfd615"
311 }
312 # 上游包信息
313 {
314 "SPDXID": "pkg:gitee/upstream/openEuler:libboundscheck@v1.1.16",
315 "copyrightText": "NOASSERTION",
316 "downloadLocation": "https://gitee.com/openeuler/libboundscheck",
317 "externalRefs": [
318 {
319 "referenceLocator": "pkg:gitee/upstream/openEuler:libboundscheck@v1.1.16",
320 "referenceType": "purl"
321 }
322 ],
323 "filesAnalyzed": false,
324 "licenseConcluded": "Mulan Permissive Software License,Version 2",
325 "name": "openEuler:libboundscheck",
326 "primaryPackagePurpose": "LIBRARY",
327 "supplier": "NOASSERTION",
328 "versionInfo": "v1.1.16"
329 }
330 ```
331
3323. **so文件依赖关系**
333
334 ```json
335 # sbom 中间态格式
336 # so 文件信息
337 {
338 "copyrightText": "NOASSERTION",
339 "fileAuthor": "NOASSERTION",
340 "fileId": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so",
341 "fileName": "libcj_calendar_manager_ffi.z.so"
342 }
343 # 源文件
344 {
345 "bom-ref": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so",
346 "dependsOn": [
347 "//applications/standard/calendardata/calendarmanager/cj/src/cj_native_calendar.cpp",
348 "//applications/standard/calendardata/calendarmanager/cj/src/cj_data_share_helper_manager.cpp",
349 "//applications/standard/calendardata/calendarmanager/native/src/calendar_env.cpp",
350 "//applications/standard/calendardata/calendarmanager/cj/src/cj_calendar_manager.cpp",
351 "//applications/standard/calendardata/calendarmanager/native/src/event_filter.cpp",
352 "//applications/standard/calendardata/calendarmanager/cj/src/cj_event_filter.cpp",
353 "//applications/standard/calendardata/calendarmanager/cj/src/cj_native_calendar_manager.cpp",
354 "//applications/standard/calendardata/calendarmanager/cj/src/cj_native_util.cpp",
355 "//applications/standard/calendardata/calendarmanager/cj/src/cj_calendar_env.cpp",
356 "//applications/standard/calendardata/calendarmanager/cj/src/calendar_manager_ffi.cpp",
357 "//applications/standard/calendardata/calendarmanager/cj/src/cj_calendar.cpp"
358 ],
359 "relationshipType": "GENERATED_FROM"
360 }
361 # 静态依赖
362 {
363 "bom-ref": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so",
364 "dependsOn": [
365 "libclang_rt.builtins.a",
366 "libc++abi.a"
367 ],
368 "relationshipType": "STATIC_LINK"
369 }
370 # 动态依赖
371 {
372 "bom-ref": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so",
373 "dependsOn": [
374 "//out/rk3568/distributeddatamgr/data_share/libdatashare_common.z.so",
375 "//out/rk3568/ability/ability_runtime/libnapi_base_context.z.so",
376 "libc++.so",
377 "//out/rk3568/arkui/ace_engine/libace_uicontent.z.so",
378 "libc.so",
379 "//out/rk3568/arkui/napi/libcj_bind_ffi.z.so",
380 "//out/rk3568/distributeddatamgr/data_share/libdatashare_consumer.z.so",
381 "//out/rk3568/security/access_token/libprivacy_sdk.z.so",
382 "libm.so",
383 "//out/rk3568/ability/ability_runtime/libability_context_native.z.so",
384 "//out/rk3568/hiviewdfx/hilog/libhilog.so",
385 "libunwind.so",
386 "//out/rk3568/ability/ability_base/libzuri.z.so",
387 "//out/rk3568/ability/ability_runtime/libdata_ability_helper.z.so",
388 "//out/rk3568/arkui/napi/libace_napi.z.so",
389 "//out/rk3568/ability/ability_runtime/libabilitykit_native.z.so",
390 "//out/rk3568/arkui/napi/libcj_bind_native.z.so",
391 "//out/rk3568/security/access_token/libaccesstoken_sdk.z.so",
392 "//out/rk3568/ability/ability_runtime/libability_manager.z.so",
393 "//out/rk3568/ability/ability_base/libwant.z.so",
394 "//out/rk3568/commonlibrary/c_utils/libutils.z.so",
395 "//out/rk3568/ability/ability_runtime/libability_connect_callback_stub.z.so",
396 "//out/rk3568/communication/ipc/libipc_single.z.so",
397 "libdl.so"
398 ],
399 "relationshipType": "DYNAMIC_LINK"
400 }
401 ```
402
403 ---
404
405 ```json
406 # SPDX 格式
407 # so 文件信息
408 {
409 "SPDXID": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so",
410 "copyrightText": "NOASSERTION",
411 "fileName": "libcj_calendar_manager_ffi.z.so"
412 }
413 # 源文件
414 {
415 "relatedSpdxElement": "//applications/standard/calendardata/calendarmanager/cj/src/cj_calendar.cpp",
416 "relationshipType": "GENERATED_FROM",
417 "spdxElementId": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so"
418 },
419 {
420 "relatedSpdxElement": "//applications/standard/calendardata/calendarmanager/cj/src/cj_native_calendar.cpp",
421 "relationshipType": "GENERATED_FROM",
422 "spdxElementId": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so"
423 },
424 {
425 "relatedSpdxElement": "//applications/standard/calendardata/calendarmanager/native/src/calendar_env.cpp",
426 "relationshipType": "GENERATED_FROM",
427 "spdxElementId": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so"
428 },
429 {
430 "relatedSpdxElement": "//applications/standard/calendardata/calendarmanager/cj/src/cj_event_filter.cpp",
431 "relationshipType": "GENERATED_FROM",
432 "spdxElementId": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so"
433 } ...
434 # 静态依赖
435 {
436 "relatedSpdxElement": "libclang_rt.builtins.a",
437 "relationshipType": "STATIC_LINK",
438 "spdxElementId": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so"
439 },
440 {
441 "relatedSpdxElement": "libc++abi.a",
442 "relationshipType": "STATIC_LINK",
443 "spdxElementId": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so"
444 }
445 # 动态依赖
446 {
447 "relatedSpdxElement": "//out/rk3568/security/access_token/libaccesstoken_sdk.z.so",
448 "relationshipType": "DYNAMIC_LINK",
449 "spdxElementId": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so"
450 },
451 {
452 "relatedSpdxElement": "//out/rk3568/hiviewdfx/hilog/libhilog.so",
453 "relationshipType": "DYNAMIC_LINK",
454 "spdxElementId": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so"
455 },
456 {
457 "relatedSpdxElement": "//out/rk3568/ability/ability_runtime/libability_context_native.z.so",
458 "relationshipType": "DYNAMIC_LINK",
459 "spdxElementId": "//out/rk3568/applications/calendar_data/libcj_calendar_manager_ffi.z.so"
460 } ...
461 ```
462
463
464