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