1# OpenHarmony系统动态库分类及管理规则
2
3
4
5## 1. OpenHarmony系统动态库分类定义
6
7OpenHarmony系统采用组件化架构,总体分为系统组件(system.img)和芯片组件(vendor.img),每个组件中有不同类型的进程,每个进程会加载不同的动态库。本文结合组件化架构及进程模型,介绍系统中动态库的分类及管理规则。系统中的进程总体分为以下三类:
8
9- 应用进程:系统及三方应用运行时的进程,每个进程都通过appspawn孵化,有独立的沙箱运行环境。
10- 系统组件进程:system.img中的native进程,每个进程都通过init拉起;默认所有系统组件进程都运行在一个共同的系统组件沙箱环境里。
11- 芯片组件进程:vendor.img中的native进程,每个进程都通过init拉起;默认所有芯片组件进程也都运行在一个共同的芯片组件沙箱环境里。
12
13每种进程加载的动态库分类如下:
14
15### 1.1 CAPI
16
17CAPI是OpenHarmony对应用开放的C语言接口API,应用进程的native模块都基于CAPI开发。
18
19系统中提供的CAPI的模块集合称之为NDK(Native Development Kit),在[categorized-libraries.json](./categorized-libraries.json)中通过以下类型来标识:
20
21- ndk:应用可直接使用的ndk模块列表。
22
23### 1.2 NAPI
24
25NAPI模块是OpenHarmony对应用开放的ArkTS接口的Native实现模块,其实现遵循了业界Node-API的接口规范。NAPI模块都安装在/system/lib{64}/module目录下,不需要在[categorized-libraries.json](./categorized-libraries.json)中单独标识。
26
27### 1.3 Platform SDK
28
29Platform SDK是指被应用进程通过NAPI模块或NDK模块加载的动态库模块集合,Platform SDK也分为两类,在[categorized-libraries.json](./categorized-libraries.json)中通过以下类型来标识:
30
31- platformsdk: NAPI/NDK模块直接依赖的系统组件模块
32- platformsdk_indirect: platform模块间接依赖的系统组件模块
33
34### 1.4 Chipset SDK
35
36Chipset SDK是指允许被芯片组件进程加载的系统组件动态库模块集合。
37
38Chipset SDK集合中的单个模块称之为Chipset SDK模块。Chipset SDK模块分为两类,在[categorized-libraries.json](./categorized-libraries.json)中通过以下类型来标识:
39
40- chipsetsdk: 芯片组件直接依赖的系统组件模块
41- chipsetsdk_indirect: chipsetsdk模块间接依赖的系统组件模块
42
43### 1.5 Passthrough SDK
44
45Passthrough SDK是指允许被应用/系统组件进程直接加载的芯片组件模块集合。
46
47Passthrough SDK集合中的单个模块称之为Passthrough SDK模块。Passthrough SDK模块分为两类,在[categorized-libraries.json](./categorized-libraries.json)中通过以下类型来标识:
48
49- passthrough: 应用或系统组件进程直接依赖的芯片组件模块
50- passthrough_indirect: passthrough模块间接依赖的模块
51
52### 1.6 动态库模块的类别标识方式
53
54在OH4.1及早期版本,动态库模块都是在BUILD.gn中通过shlib_type和innerapi_tags来区分,示例如下:
55
56```go
57ohos_shared_library(sample_chipsetsdk_module) {
58    ...
59    shlib_type = "ndk"
60    innerapi_tags = [ "platformsdk|platformsdk-indirect|chipsetsdk|chipsetsdk_indirect|passthrough|passthrough_indirect" ]
61    ...
62}
63```
64
65OH5.0开始,对各种类型的动态库进行了集中治理,统一通过[categorized-libraries.json](./categorized-libraries.json)文件进行集中管控,其格式内容如下:
66
67```json
68{
69  "//base/security/access_token/interfaces/innerkits/accesstoken:libaccesstoken_sdk": {
70    "so_file_name": "libaccesstoken_sdk.z.so",
71    "categories": [ "chipsetsdk", "platformsdk" ]
72  },
73  "//foundation/resourceschedule/ffrt:libffrt": {
74    "so_file_name": "libffrt.so",
75    "categories": [ "chipsetsdk" ]
76  },
77  "//base/security/access_token/frameworks/common:accesstoken_common_cxx": {
78    "so_file_name": "libaccesstoken_common_cxx.z.so",
79    "categories": [ "platformsdk-indirect" ]
80  }
81}
82```
83
84每个动态库通过其编译标签唯一确定,categories字段标识其具体类型,so_file_name是动态库的最终文件名。
85
86## 2. 动态库分类规则
87
88### 2.1 安装目录及运行时沙盒隔离规则
89
90分类好的动态库,会根据其类型安装到指定的目录;不同类型的进程运行在不同的沙盒环境下,只能访问与进程类型相匹配的动态库目录。详细范围如下:
91
92| 类型                            | 安装路径                          | 应用进程 | 系统组件进程 | 芯片组件进程 | 说明                      |
93| ------------------------------- | --------------------------------- | -------- | ------------ | ------------ | ------------------------- |
94| ["ndk*",...]                    | /system/lib{64}/ndk/*             | Y        | Y            | Y            | 所有进程都可以访问NDK库。 |
95| ["napi"]                        | /system/lib{64}/module/*          | Y        | Y            | N            | 只有应用进程需要访问。    |
96| ["platformsdk*"]                | /system/lib{64}/platformsdk/*     | Y        | Y            | N            |                           |
97| ["chipsetsdk*"]                 | /system/lib{64}/chipset-sdk/*     | N        | Y            | Y            |                           |
98| ["platformsdk*", "chipsetsdk*"] | /system/lib{64}/chipset-pub-sdk/* | Y        | Y            | Y            |                           |
99|                                 | /system/lib{64}                   | N        | Y            | Y            |                           |
100|                                 | /chipset/lib{64}                  | N        | N            | Y            |                           |
101| ["passthrough*"]                | /chipset/lib{64}/chipsetsdk       | Y        | Y            | Y            |                           |
102
103### 2.2 linker的动态库搜索规则
104
105
106
107