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