15f9996aaSopenharmony_ci# OpenHarmony系统动态库分类及管理规则
25f9996aaSopenharmony_ci
35f9996aaSopenharmony_ci
45f9996aaSopenharmony_ci
55f9996aaSopenharmony_ci## 1. OpenHarmony系统动态库分类定义
65f9996aaSopenharmony_ci
75f9996aaSopenharmony_ciOpenHarmony系统采用组件化架构,总体分为系统组件(system.img)和芯片组件(vendor.img),每个组件中有不同类型的进程,每个进程会加载不同的动态库。本文结合组件化架构及进程模型,介绍系统中动态库的分类及管理规则。系统中的进程总体分为以下三类:
85f9996aaSopenharmony_ci
95f9996aaSopenharmony_ci- 应用进程:系统及三方应用运行时的进程,每个进程都通过appspawn孵化,有独立的沙箱运行环境。
105f9996aaSopenharmony_ci- 系统组件进程:system.img中的native进程,每个进程都通过init拉起;默认所有系统组件进程都运行在一个共同的系统组件沙箱环境里。
115f9996aaSopenharmony_ci- 芯片组件进程:vendor.img中的native进程,每个进程都通过init拉起;默认所有芯片组件进程也都运行在一个共同的芯片组件沙箱环境里。
125f9996aaSopenharmony_ci
135f9996aaSopenharmony_ci每种进程加载的动态库分类如下:
145f9996aaSopenharmony_ci
155f9996aaSopenharmony_ci### 1.1 CAPI
165f9996aaSopenharmony_ci
175f9996aaSopenharmony_ciCAPI是OpenHarmony对应用开放的C语言接口API,应用进程的native模块都基于CAPI开发。
185f9996aaSopenharmony_ci
195f9996aaSopenharmony_ci系统中提供的CAPI的模块集合称之为NDK(Native Development Kit),在[categorized-libraries.json](./categorized-libraries.json)中通过以下类型来标识:
205f9996aaSopenharmony_ci
215f9996aaSopenharmony_ci- ndk:应用可直接使用的ndk模块列表。
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_ci### 1.2 NAPI
245f9996aaSopenharmony_ci
255f9996aaSopenharmony_ciNAPI模块是OpenHarmony对应用开放的ArkTS接口的Native实现模块,其实现遵循了业界Node-API的接口规范。NAPI模块都安装在/system/lib{64}/module目录下,不需要在[categorized-libraries.json](./categorized-libraries.json)中单独标识。
265f9996aaSopenharmony_ci
275f9996aaSopenharmony_ci### 1.3 Platform SDK
285f9996aaSopenharmony_ci
295f9996aaSopenharmony_ciPlatform SDK是指被应用进程通过NAPI模块或NDK模块加载的动态库模块集合,Platform SDK也分为两类,在[categorized-libraries.json](./categorized-libraries.json)中通过以下类型来标识:
305f9996aaSopenharmony_ci
315f9996aaSopenharmony_ci- platformsdk: NAPI/NDK模块直接依赖的系统组件模块
325f9996aaSopenharmony_ci- platformsdk_indirect: platform模块间接依赖的系统组件模块
335f9996aaSopenharmony_ci
345f9996aaSopenharmony_ci### 1.4 Chipset SDK
355f9996aaSopenharmony_ci
365f9996aaSopenharmony_ciChipset SDK是指允许被芯片组件进程加载的系统组件动态库模块集合。
375f9996aaSopenharmony_ci
385f9996aaSopenharmony_ciChipset SDK集合中的单个模块称之为Chipset SDK模块。Chipset SDK模块分为两类,在[categorized-libraries.json](./categorized-libraries.json)中通过以下类型来标识:
395f9996aaSopenharmony_ci
405f9996aaSopenharmony_ci- chipsetsdk: 芯片组件直接依赖的系统组件模块
415f9996aaSopenharmony_ci- chipsetsdk_indirect: chipsetsdk模块间接依赖的系统组件模块
425f9996aaSopenharmony_ci
435f9996aaSopenharmony_ci### 1.5 Passthrough SDK
445f9996aaSopenharmony_ci
455f9996aaSopenharmony_ciPassthrough SDK是指允许被应用/系统组件进程直接加载的芯片组件模块集合。
465f9996aaSopenharmony_ci
475f9996aaSopenharmony_ciPassthrough SDK集合中的单个模块称之为Passthrough SDK模块。Passthrough SDK模块分为两类,在[categorized-libraries.json](./categorized-libraries.json)中通过以下类型来标识:
485f9996aaSopenharmony_ci
495f9996aaSopenharmony_ci- passthrough: 应用或系统组件进程直接依赖的芯片组件模块
505f9996aaSopenharmony_ci- passthrough_indirect: passthrough模块间接依赖的模块
515f9996aaSopenharmony_ci
525f9996aaSopenharmony_ci### 1.6 动态库模块的类别标识方式
535f9996aaSopenharmony_ci
545f9996aaSopenharmony_ci在OH4.1及早期版本,动态库模块都是在BUILD.gn中通过shlib_type和innerapi_tags来区分,示例如下:
555f9996aaSopenharmony_ci
565f9996aaSopenharmony_ci```go
575f9996aaSopenharmony_ciohos_shared_library(sample_chipsetsdk_module) {
585f9996aaSopenharmony_ci    ...
595f9996aaSopenharmony_ci    shlib_type = "ndk"
605f9996aaSopenharmony_ci    innerapi_tags = [ "platformsdk|platformsdk-indirect|chipsetsdk|chipsetsdk_indirect|passthrough|passthrough_indirect" ]
615f9996aaSopenharmony_ci    ...
625f9996aaSopenharmony_ci}
635f9996aaSopenharmony_ci```
645f9996aaSopenharmony_ci
655f9996aaSopenharmony_ciOH5.0开始,对各种类型的动态库进行了集中治理,统一通过[categorized-libraries.json](./categorized-libraries.json)文件进行集中管控,其格式内容如下:
665f9996aaSopenharmony_ci
675f9996aaSopenharmony_ci```json
685f9996aaSopenharmony_ci{
695f9996aaSopenharmony_ci  "//base/security/access_token/interfaces/innerkits/accesstoken:libaccesstoken_sdk": {
705f9996aaSopenharmony_ci    "so_file_name": "libaccesstoken_sdk.z.so",
715f9996aaSopenharmony_ci    "categories": [ "chipsetsdk", "platformsdk" ]
725f9996aaSopenharmony_ci  },
735f9996aaSopenharmony_ci  "//foundation/resourceschedule/ffrt:libffrt": {
745f9996aaSopenharmony_ci    "so_file_name": "libffrt.so",
755f9996aaSopenharmony_ci    "categories": [ "chipsetsdk" ]
765f9996aaSopenharmony_ci  },
775f9996aaSopenharmony_ci  "//base/security/access_token/frameworks/common:accesstoken_common_cxx": {
785f9996aaSopenharmony_ci    "so_file_name": "libaccesstoken_common_cxx.z.so",
795f9996aaSopenharmony_ci    "categories": [ "platformsdk-indirect" ]
805f9996aaSopenharmony_ci  }
815f9996aaSopenharmony_ci}
825f9996aaSopenharmony_ci```
835f9996aaSopenharmony_ci
845f9996aaSopenharmony_ci每个动态库通过其编译标签唯一确定,categories字段标识其具体类型,so_file_name是动态库的最终文件名。
855f9996aaSopenharmony_ci
865f9996aaSopenharmony_ci## 2. 动态库分类规则
875f9996aaSopenharmony_ci
885f9996aaSopenharmony_ci### 2.1 安装目录及运行时沙盒隔离规则
895f9996aaSopenharmony_ci
905f9996aaSopenharmony_ci分类好的动态库,会根据其类型安装到指定的目录;不同类型的进程运行在不同的沙盒环境下,只能访问与进程类型相匹配的动态库目录。详细范围如下:
915f9996aaSopenharmony_ci
925f9996aaSopenharmony_ci| 类型                            | 安装路径                          | 应用进程 | 系统组件进程 | 芯片组件进程 | 说明                      |
935f9996aaSopenharmony_ci| ------------------------------- | --------------------------------- | -------- | ------------ | ------------ | ------------------------- |
945f9996aaSopenharmony_ci| ["ndk*",...]                    | /system/lib{64}/ndk/*             | Y        | Y            | Y            | 所有进程都可以访问NDK库。 |
955f9996aaSopenharmony_ci| ["napi"]                        | /system/lib{64}/module/*          | Y        | Y            | N            | 只有应用进程需要访问。    |
965f9996aaSopenharmony_ci| ["platformsdk*"]                | /system/lib{64}/platformsdk/*     | Y        | Y            | N            |                           |
975f9996aaSopenharmony_ci| ["chipsetsdk*"]                 | /system/lib{64}/chipset-sdk/*     | N        | Y            | Y            |                           |
985f9996aaSopenharmony_ci| ["platformsdk*", "chipsetsdk*"] | /system/lib{64}/chipset-pub-sdk/* | Y        | Y            | Y            |                           |
995f9996aaSopenharmony_ci|                                 | /system/lib{64}                   | N        | Y            | Y            |                           |
1005f9996aaSopenharmony_ci|                                 | /chipset/lib{64}                  | N        | N            | Y            |                           |
1015f9996aaSopenharmony_ci| ["passthrough*"]                | /chipset/lib{64}/chipsetsdk       | Y        | Y            | Y            |                           |
1025f9996aaSopenharmony_ci
1035f9996aaSopenharmony_ci### 2.2 linker的动态库搜索规则
1045f9996aaSopenharmony_ci
1055f9996aaSopenharmony_ci
1065f9996aaSopenharmony_ci
107