OpenHarmony北向开发基础之SysCap系统能力机制

以 rk3588j_isdt-2 产品为例,完整梳理 SysCap 从声明、编译、打包到运行时查询的全链路。


一、SysCap 是什么

SysCap(System Capability)是 OpenHarmony 的设备能力标识机制。每个 SysCap 字符串代表设备的一项系统能力,例如:

复制代码
SystemCapability.Multimedia.Camera.Core          # 相机能力
SystemCapability.Communication.WiFi.STA          # WiFi STA 能力
SystemCapability.DistributedHardware.khDistributedScreen  # 凯鸿定制:分布式屏幕

它解决的核心问题是:不同设备硬件能力不同,应用如何知道当前设备支持哪些功能?


二、SysCap 全链路总览

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                        编译阶段                                  │
│                                                                  │
│  ① 各部件 bundle.json 声明 syscap                                │
│       ↓                                                         │
│  ② vendor/config.json 选择编译哪些部件(间接决定 syscap 集合)     │
│       ↓                                                         │
│  ③ hb preloader 汇总所有 syscap(中间产物)                        │
│       → out/preloader/{product}/syscap.json                     │
│       → out/preloader/{product}/SystemCapability.json           │
│       ↓                                                         │
│  ③' hb loader 过滤/排序,生成最终文件                              │
│       → out/preloader/{product}/system/etc/syscap.json           │
│       → out/preloader/{product}/system/etc/SystemCapability.json │
│       → out/preloader/{product}/system/etc/param/syscap.para    │
│       ↓                                                         │
│  ④ syscap_tool 编码 PCID                                        │
│       → out/.../system/etc/pcid.sc                              │
│       ↓                                                         │
│  ⑤ 打包进 system 镜像                                           │
│       /system/etc/param/syscap.para                             │
│       /system/etc/SystemCapability.json                         │
│       /system/etc/pcid.sc                                       │
│                                                                  │
├─────────────────────────────────────────────────────────────────┤
│                        运行阶段                                  │
│                                                                  │
│  ⑥ init 启动时加载 syscap.para → 系统参数                        │
│       const.SystemCapability.Multimedia.Camera.Core=true        │
│       ↓                                                         │
│  ⑦ canIUse("SystemCapability.Multimedia.Camera.Core")           │
│       → HasSystemCapability → 读系统参数 → 返回 true/false       │
│                                                                  │
│  ⑧ 应用安装时 BMS 读取 HAP 中的 rpcid.sc                         │
│       → 与设备 pcid.sc 比对 → 不满足则拒绝安装                    │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

三、SysCap 声明位置(第①步)

3.1 各部件的 bundle.json

SysCap 的源头声明 在各个部件的 bundle.json 中:

json 复制代码
// foundation/multimedia/camera_framework/bundle.json
{
  "component": {
    "name": "camera_framework",
    "subsystem": "multimedia",
    "syscap": ["SystemCapability.Multimedia.Camera.Core"],
    ...
  }
}

当前产品中有 SysCap 声明的关键部件:

部件 bundle.json 路径 声明的 SysCap
Camera 框架 foundation/multimedia/camera_framework/ SystemCapability.Multimedia.Camera.Core
分布式硬件框架 foundation/distributedhardware/distributed_hardware_fwk/ SystemCapability.DistributedHardware.DistributedHardwareFWK
分布式屏幕(kh) extension/distributed/distributedhardware/distributed_screen/ SystemCapability.DistributedHardware.khDistributedScreen
Miracast(kh) extension/multimedia/miracast_framework/ SystemCapability.Multimedia.khMiracast.Core
GPIO(kh) extension/peripheralmanager/gpio/ SystemCapability.PeripheralManager.khGpio
NetManager(kh) extension/communication/netmanager/ SystemCapability.Communication.khNetManager
Bluetooth(kh) extension/communication/bluetooth/ SystemCapability.Communication.khBluetooth.Core

注意 :产品仓 vendor/kaihong/rk3588j_isdt-2/bundle.json"syscap": [] 为空,产品仓自身不声明 SysCap,它的能力集由所有被编译的部件汇总而来。

3.2 产品仓间接决定 SysCap

产品的 config.json 通过继承和部件选择间接决定最终 SysCap 集合:

复制代码
vendor/kaihong/rk3588j_isdt-2/config.json
    ├── inherit: productdefine/common/inherit/rich.json        # 标准系统丰富部件集
    ├── inherit: productdefine/common/inherit/chipset_common.json  # 芯片通用部件
    ├── inherit: productdefine/common/inherit/extension.json    # 凯鸿扩展部件
    └── subsystems: 额外指定 kh 定制部件

config.json 还支持部件级 SysCap 开关覆盖(当前产品未使用此功能):

json 复制代码
// config.json 中可以这样覆盖
{
  "subsystems": [{
    "subsystem": "multimedia",
    "components": [{
      "component": "camera_framework",
      "syscap": ["SystemCapability.Multimedia.Camera.Core=false"]  // 关闭某个 syscap
    }]
  }]
}

四、编译阶段详解

4.1 Preloader 阶段 --- SysCap 初步汇总(第③步)

关键脚本build/hb/services/preloader.py

复制代码
_generate_syscap_json()
    ├── 遍历所有被选中的部件
    ├── 从各部件 bundle.json 中提取 syscap 列表
    ├── 合并去重
    └── 输出到 out/preloader/rk3588j_isdt-2/syscap.json

_generate_systemcapability_json()
    └── 输出到 out/preloader/rk3588j_isdt-2/SystemCapability.json

Preloader 生成两个中间文件 (位于 out/preloader/{product}/ 根目录,不在 system/etc/ 下):

生成文件 内容格式 用途
syscap.json 按 component 分组的 syscap 列表 + syscap 开关覆盖 Loader 阶段的输入
SystemCapability.json 产品元数据(api_version 等) Loader 阶段和 PCID 编码的输入

Preloader 输出路径

复制代码
out/preloader/rk3588j_isdt-2/
├── syscap.json              # Preloader 输出(中间产物,根目录)
└── SystemCapability.json    # Preloader 输出(中间产物,根目录)

注意 :Preloader 阶段不生成 syscap.para,该文件由下一步 Loader 阶段生成。

相关代码链路

复制代码
build/hb/services/preloader.py
    → _generate_syscap_json()              # 汇总各部件 syscap → syscap.json
    → _generate_systemcapability_json()    # 生成产品元数据 → SystemCapability.json

build/hb/util/loader/load_ohos_build.py
    → get_syscap_from_bundle()             # 从 bundle.json 解析 syscap

build/hb/util/preloader/parse_vendor_product_config.py
    → get_syscap()                         # 解析 config.json 中的 syscap 覆盖

4.2 Loader 阶段 --- 生成最终文件(第③步续)

关键脚本build/hb/services/loader.py

Loader 读取 Preloader 输出的中间产物,进行最终过滤、排序和格式化,生成三个最终文件out/preloader/{product}/system/etc/ 下:

python 复制代码
def _generate_syscap_files():
    # 1. 读取 Preloader 输出的 syscap.json 和 SystemCapability.json
    # 2. 根据实际选中的部件过滤 syscap
    # 3. 处理 config.json 中的 syscap=true/false 覆盖
    # 4. 生成 system/etc/SystemCapability.json(更新 os syscap 列表)
    # 5. 生成 system/etc/syscap.json(按部件分组,仅含选中部件)
    # 6. 生成 system/etc/param/syscap.para(const.SystemCapability.Xxx=true 格式)

Loader 最终输出路径

复制代码
out/preloader/rk3588j_isdt-2/
└── system/etc/
    ├── syscap.json              # 按部件分组的最终 syscap
    ├── SystemCapability.json    # 产品 SysCap 全集 + 元数据(PCID 编码的输入)
    └── param/
        └── syscap.para          # 当前产品共 305 条(含 28 条 kh 定制),运行时 canIUse 的数据源

4.3 PCID 编码(第④步)

关键文件developtools/syscap_codec/BUILD.gn

gn 复制代码
build_ext_component("generate_pcid") {
  outputs = [ "$root_out_dir/pcid.sc" ]
  deps = [ ":syscap_tool_bin_linux" ]
  # 执行: syscap_tool -P -e -i SystemCapability.json
  # 将 SystemCapability.json 中的 syscap 列表编码为二进制 PCID 文件
}

ohos_prebuilt_etc("pcid.sc") {
  deps = [ ":generate_pcid" ]
  source = "$root_out_dir/pcid.sc"      # 默认安装到 /system/etc/pcid.sc
  subsystem_name = "developtools"
  part_name = "syscap_codec"
}

编码工具源码

文件 作用
developtools/syscap_codec/src/main.c 命令行入口:-P(pcid) -R(rpcid) -e(encode) -d(decode)
developtools/syscap_codec/src/create_pcid.c PCID 编码/解码核心算法
developtools/syscap_codec/src/syscap_tool.c RPCID 编解码、PCID/RPCID 比较

SysCap 编号字典

c 复制代码
// developtools/syscap_codec/include/codec_config/syscap_define.h
typedef enum SystemCapabilityNum {
    ACCOUNT_APPACCOUNT,              // 0
    ACCOUNT_OSACCOUNT,               // 1
    AI_AIENGINE,                     // 2
    ...
    MULTIMEDIA_CAMERA_CORE,          // N
    ...
    // 凯鸿定制项(kh 前缀,无额外下划线分隔)
    DISTRIBUTEDHARDWARE_KHDISTRIBUTEDSCREEN,
    MULTIMEDIA_KHMIRACAST_CORE,
    ...
} SystemCapabilityNum;

每个 SysCap 字符串对应一个枚举编号,PCID 用位图(bitmap)方式存储------每个 bit 代表一个 SysCap 是否启用。

4.4 打包进镜像(第⑤步)

关键文件base/startup/init/services/etc/BUILD.gn

gn 复制代码
ohos_prebuilt_etc("syscap.para") {
  source = "${preloader_output_dir}/system/etc/param/syscap.para"
  module_install_dir = "etc/param/"      # → /system/etc/param/syscap.para
  part_name = "init"
  subsystem_name = "startup"
}

ohos_prebuilt_etc("syscap.json") {
  source = "${preloader_output_dir}/system/etc/syscap.json"
  part_name = "init"                     # 未指定 module_install_dir,默认 → /system/etc/syscap.json
  subsystem_name = "startup"
}

ohos_prebuilt_etc("systemcapability.json") {
  source = "${preloader_output_dir}/system/etc/SystemCapability.json"
  part_name = "init"                     # 未指定 module_install_dir,默认 → /system/etc/SystemCapability.json
  subsystem_name = "startup"
}

五、设备上的 SysCap 文件

产品编译后,设备上安装以下 SysCap 相关文件:

复制代码
/system/etc/
├── param/
│   └── syscap.para              # 305行,每行 const.SystemCapability.Xxx=true
├── syscap.json                  # 按部件分组的 syscap JSON
├── SystemCapability.json        # 产品 SysCap 全集 + 元数据
└── pcid.sc                      # PCID 二进制文件(位图编码)

syscap.para 示例(产品实际输出)

ini 复制代码
const.SystemCapability.AI.IntelligentVoice.Core=true
const.SystemCapability.Ability.AbilityBase=true
const.SystemCapability.Ability.AbilityRuntime.Core=true
const.SystemCapability.Ability.khAbilityRuntime=true          # kh 定制
const.SystemCapability.Communication.khNetManager=true        # kh 定制
const.SystemCapability.DistributedHardware.khDistributedScreen=true  # kh 定制
const.SystemCapability.Multimedia.Camera.Core=true
const.SystemCapability.Multimedia.khMiracast.Core=true        # kh 定制
...
# 共 305 条,其中 kh 定制 28 条

syscap.para 的权限控制

复制代码
// base/startup/init/services/etc/param/ohos.para.dac
const.SystemCapability. = root:root:0775

六、运行时查询机制(第⑥⑦步)

6.1 系统参数加载

复制代码
设备启动 → init 进程读取 /system/etc/param/syscap.para
         → 解析每行 const.SystemCapability.Xxx=true
         → 写入 mmap 共享内存中的 Trie(前缀树)
         → 其他进程 mmap 同一块共享内存,直接读取

6.2 系统参数底层原理:共享内存 + Trie 树

syscap.para 文件只是磁盘上的静态文本,运行时不是直接读文件。实际的存储和查询机制如下:

存储结构 :init 进程启动时将 syscap.para 中的键值对写入一块 mmap 共享内存,数据组织为 Trie(前缀树) ,按参数名的 . 分隔层级索引。

c 复制代码
// base/startup/init/services/param/linux/param_osadp.c
// init 进程创建共享内存区域
void *areaAddr = (void *)mmap(NULL, spaceSize, prot, MAP_SHARED, fd, 0);

查询过程 :任意进程调用 SystemGetParameter() 时,实际调用链为:

复制代码
SystemGetParameter()
    → SystemReadParam()
        → CheckParamPermission_()       // DAC 权限检查
        → FindTrieNode(workspace, name)  // 在共享内存的 Trie 树中查找节点
        → ReadParamValue()               // 直接读取节点中的值

整个查询过程发生在用户态共享内存 中,是纯内存操作,不需要 IPC,不需要系统调用。每个进程启动时 mmap 映射同一块共享内存,之后所有读取都是零开销的内存访问。

关键代码位置

文件 作用
base/startup/init/services/param/linux/param_osadp.c 共享内存 mmap 创建/映射
base/startup/init/services/param/base/param_trie.c Trie 树的增删查操作(FindTrieNodeAddTrieNode
base/startup/init/services/param/manager/param_manager.c SystemReadParam()ReadParamValue() 读取流程

6.3 canIUse API 调用链路

复制代码
ArkTS 应用:  canIUse("SystemCapability.Multimedia.Camera.Core")
    ↓
JS 运行时:  base/startup/init/interfaces/kits/syscap_ts/src/syscap_ts.cpp
            → CanIUse() NAPI
    ↓
底层实现:   base/startup/init/interfaces/innerkits/syscap/init_syscap.c
            → HasSystemCapability("SystemCapability.Multimedia.Camera.Core")
    ↓
参数查询:   将 "SystemCapability.Multimedia.Camera.Core"
            → 转为 "const.SystemCapability.Multimedia.Camera.Core"
            → SystemGetParameter() → 在 mmap 共享内存 Trie 树中查找
            → 值为 "true" → 返回 true(零系统调用,纯内存访问)

核心实现代码

c 复制代码
// base/startup/init/interfaces/innerkits/syscap/init_syscap.c
#define SYSCAP_PREFIX_NAME "SystemCapability"
#define CONST_SYSCAP_PREFIX_NAME "const.SystemCapability"

bool HasSystemCapability(const char *cap)
{
    // 1. 校验入参以 "SystemCapability" 开头
    // 2. 拼接 "const." 前缀
    // 3. SystemGetParameter() 查询
    // 4. 值为 "true" 返回 true,否则 false
}

各层 API 实现位置汇总

层级 文件路径 接口
ArkTS/JS base/startup/init/interfaces/kits/syscap_ts/src/syscap_ts.cpp canIUse() 全局函数
NDK C base/startup/init/interfaces/kits/syscap/src/syscap_ndk.c canIUse()
内部接口 base/startup/init/interfaces/innerkits/syscap/init_syscap.c HasSystemCapability()
TypeScript 声明 interface/sdk-js/api/@internal/ets/global.d.ts declare function canIUse(syscap: string): boolean
NDK 头文件 interface/sdk_c/startup/init/syscap/include/syscap_ndk.h C 声明

6.4 为什么不像权限校验那样走内核 ioctl?

OpenHarmony 的应用权限校验(AccessToken)使用 misc 字符设备 + ioctl内核态 维护一棵 BST(二叉搜索树)进行快速查询(详见 Linux misc 设备与内核权限缓存设计方案),而 SysCap 仅使用用户态共享内存。两者采用不同技术路线的根本原因在于场景差异:

维度 权限校验(AccessToken) SysCap 查询
数据特性 动态(用户可授权/撤销) 静态(开机确定,运行期不变)
调用频率 极高(每次 API 调用都可能校验) 低(通常初始化时查一次)
读取者 用户态 + 内核态(Binder 驱动等) 仅用户态
安全敏感度 极高(绕过权限 = 安全漏洞) 低(仅功能有无的查询)
写入者 ATMServ 独占写入(通过 ioctl) init 启动时一次写入
访问方式 ioctl 系统调用 → 内核 BST bitmap 位运算 mmap 共享内存 → Trie 树查找(零系统调用)
缓存位置 内核内存(BST) 用户态共享内存(Trie)

权限校验必须走内核的核心原因:

  1. 内核模块也需要查权限------如 Binder 驱动在传输时需校验调用方权限,发生在内核态,无法访问用户态共享内存
  2. 防篡改------内核 BST 只有 ATMServ 能通过 ioctl 写入,其他进程只能读,安全性高于用户态共享内存
  3. 数据动态变化------权限可以被授予或撤销,需要一个可靠的同步机制

SysCap 使用共享内存就足够的原因:

  1. 数据完全静态------设备有什么硬件能力开机就确定,无需动态更新
  2. 无内核态消费者------没有内核模块需要查"设备有没有相机能力"
  3. 性能已是最优------mmap 后的 Trie 查找是纯内存操作,比 ioctl 更快(无需陷入内核)
  4. 安全要求低------即使查询结果被篡改,最多导致 UI 显示异常,不会造成权限越界

七、应用安装时的 SysCap 校验(第⑧步)

7.1 RPCID 机制

应用 HAP 包内可携带 rpcid.sc 文件(Required Product Compatibility ID),声明应用依赖的 SysCap 集合。

复制代码
HAP 包结构:
├── module.json5        # 声明依赖的 syscap
├── rpcid.sc            # 依赖的 syscap 编码为二进制
├── libs/
└── resources/

7.2 安装校验流程

复制代码
用户安装 HAP
    ↓
BMS (Bundle Manager Service) 解压 HAP
    ↓
提取 rpcid.sc → RPCIDStreamDecodeToBuffer() 解码
    ↓
读取设备 /system/etc/pcid.sc → 解码设备 SysCap 集合
    ↓
比对: 应用需要的 SysCap ⊆ 设备拥有的 SysCap ?
    ├── 是 → 允许安装
    └── 否 → 拒绝安装

关键代码位置

文件 作用
foundation/bundlemanager/bundle_framework/services/bundlemgr/src/bundle_parser.cpp 解压 HAP 中 rpcid.sc
foundation/bundlemanager/bundle_framework/services/bundlemgr/src/rpcid_decode/syscap_tool.c RPCIDStreamDecodeToBuffer() 解码
developtools/syscap_codec/interfaces/inner_api/syscap_interface.c 读取 /system/etc/pcid.sc 并解码

八、SysCap 编号字典

所有 SysCap 字符串与编号的映射关系定义在:

复制代码
developtools/syscap_codec/include/codec_config/syscap_define.h

这是一个全局唯一的枚举字典,PCID 和 RPCID 的编解码都依赖它。新增 SysCap 必须在此文件中追加枚举值。

当前产品的 kh 定制 SysCap 也已在此字典中注册(通过 syscap_config_merge.py 合并 base 字典和 extension 扩展字典)。

合并工具

复制代码
developtools/syscap_codec/tools/syscap_config_merge.py
    → 合并 base syscap_define.h + extern syscap_define.h
    → 配置路径: developtools/syscap_codec/config.gni
        syscap_codec_config_path        # 基础字典
        syscap_codec_config_extern_path # 扩展字典(kh 定制项)

九、产品 SysCap 统计

类别 数量
总 SysCap 数 305
其中 kh 定制 28
标准 OH SysCap 277

产品 kh 定制 SysCap 完整列表

SysCap 来源部件
SystemCapability.Ability.khAbilityRuntime kh_ability
SystemCapability.BundleManager.khBundleFramework kh_bundlemanager
SystemCapability.Communication.khBluetooth.Core kh_bluetooth
SystemCapability.Communication.khDeviceAuth kh_deviceauth
SystemCapability.Communication.khIotSdkNapi kh_iotsdk
SystemCapability.Communication.khNetManager kh_netmanager
SystemCapability.Communication.khNetManager.Bond kh_netmanager
SystemCapability.Communication.khNetManager.Bridge kh_netmanager
SystemCapability.Communication.khNetManager.NetRing kh_netmanager
SystemCapability.Communication.khNetStack kh_netstack
SystemCapability.Communication.khNetworkConfig kh_networkconfig
SystemCapability.Communication.khTelephony.CellularData kh_telephony
SystemCapability.DistributedHardware.khDistributedScreen kh_distributed_screen
SystemCapability.DistributedHardware.khDistributedScreenInput kh_distributed_screen_input
SystemCapability.HiviewDFX.khMonitor kh_monitor
SystemCapability.HiviewDFX.khSysLog kh_syslog
SystemCapability.License.khlicense kh_license
SystemCapability.Miscservices.khTime kh_time
SystemCapability.Multimedia.khAudioMagic.Core kh_audiomagic
SystemCapability.Multimedia.khAudioMagic.TTS kh_audiomagic
SystemCapability.Multimedia.khMiracast.Core kh_miracast
SystemCapability.Multimedia.khSharingWfd.Core kh_sharing_wfd
SystemCapability.Multimedia.khSharingWfd.WfdSink kh_sharing_wfd
SystemCapability.PeripheralManager.khGpio kh_gpio
SystemCapability.PeripheralManager.khUart kh_uart
SystemCapability.Startup.khSysInfo kh_sysinfo
SystemCapability.Update.khModuleUpdate kh_moduleupdate
SystemCapability.Update.khUpdateService kh_updateservice

十、如何新增/裁剪 SysCap

10.1 新增 SysCap(以新增 SystemCapability.Foo.Bar 为例)

  1. 在部件的 bundle.json 中声明 (假设部件位于 foundation/foo/bar/):

    复制代码
    文件:foundation/foo/bar/bundle.json
    json 复制代码
    "syscap": ["SystemCapability.Foo.Bar"]
  2. 在 syscap 编号字典中注册(追加到枚举末尾,不可删除已有项):

    复制代码
    文件:developtools/syscap_codec/include/codec_config/syscap_define.h
    c 复制代码
    FOO_BAR,  // 新增,必须加在最后

    如果是 kh 定制 SysCap,需要在扩展字典中添加,然后通过合并工具生成最终字典:

    复制代码
    合并工具:developtools/syscap_codec/tools/syscap_config_merge.py
    配置文件:developtools/syscap_codec/config.gni
        → syscap_codec_config_path          # 基础字典路径
        → syscap_codec_config_extern_path   # kh 扩展字典路径
  3. 确保部件被产品选中(在产品 config.json 的 subsystems 中包含该部件):

    复制代码
    文件:vendor/kaihong/rk3588j_isdt-2/config.json

    如果部件属于继承的部件集(如 rich.json),则无需额外配置:

    复制代码
    继承文件:productdefine/common/inherit/rich.json
             productdefine/common/inherit/chipset_common.json
             productdefine/common/inherit/extension.json
  4. 重新编译,preloader 会自动汇总,生成到以下文件:

    复制代码
    编译中间产物:
      out/preloader/rk3588j_isdt-2/system/etc/param/syscap.para   # 新增一行 const.SystemCapability.Foo.Bar=true
      out/preloader/rk3588j_isdt-2/system/etc/SystemCapability.json
      out/preloader/rk3588j_isdt-2/system/etc/syscap.json
    
    最终设备文件:
      /system/etc/param/syscap.para
      /system/etc/SystemCapability.json
      /system/etc/pcid.sc

10.2 裁剪 SysCap

方式一:在产品 config.json 中不选择对应部件

复制代码
文件:vendor/kaihong/rk3588j_isdt-2/config.json
操作:从 subsystems 中移除对应 component

方式二:在 config.json 中覆盖(推荐,不影响其他产品):

复制代码
文件:vendor/kaihong/rk3588j_isdt-2/config.json
json 复制代码
{
  "component": "camera_framework",
  "syscap": ["SystemCapability.Multimedia.Camera.Core=false"]
}

十一、关键文件索引

声明层

文件 角色
各部件/bundle.json SysCap 源头声明
vendor/kaihong/rk3588j_isdt-2/config.json 产品部件选型(间接决定 SysCap)

编译层

文件 角色
build/hb/services/preloader.py Preloader:汇总 SysCap → syscap.json / SystemCapability.json(中间产物)
build/hb/services/loader.py Loader:生成最终 SysCap 文件(syscap.json / SystemCapability.json / syscap.para)
build/hb/util/loader/load_ohos_build.py 从 bundle.json 解析 syscap
build/hb/util/preloader/parse_vendor_product_config.py 解析 config.json 中的 syscap 覆盖
developtools/syscap_codec/BUILD.gn PCID 编码 + 安装规则
developtools/syscap_codec/include/codec_config/syscap_define.h SysCap 编号字典
developtools/syscap_codec/tools/syscap_config_merge.py 合并 base + kh 扩展字典
base/startup/init/services/etc/BUILD.gn syscap.para / syscap.json 打包安装

运行层

文件 角色
base/startup/init/interfaces/innerkits/syscap/init_syscap.c HasSystemCapability() 底层实现
base/startup/init/interfaces/kits/syscap_ts/src/syscap_ts.cpp ArkTS canIUse() NAPI
base/startup/init/interfaces/kits/syscap/src/syscap_ndk.c NDK canIUse()
base/startup/init/services/param/linux/param_osadp.c 系统参数共享内存 mmap 创建/映射
base/startup/init/services/param/base/param_trie.c 系统参数 Trie 树增删查(FindTrieNode
base/startup/init/services/param/manager/param_manager.c SystemReadParam()ReadParamValue()
developtools/syscap_codec/interfaces/inner_api/syscap_interface.c PCID 读取/解码接口
developtools/syscap_codec/napi/napi_query_syscap.cpp querySystemCapabilities NAPI

安装校验层

文件 角色
foundation/bundlemanager/bundle_framework/services/bundlemgr/src/bundle_parser.cpp 解压 HAP 中 rpcid.sc
foundation/bundlemanager/bundle_framework/services/bundlemgr/src/rpcid_decode/syscap_tool.c RPCID 解码

设备上的文件

设备路径 内容
/system/etc/param/syscap.para const.SystemCapability.Xxx=true(canIUse 数据源)
/system/etc/SystemCapability.json 产品 SysCap 全集 + 元数据
/system/etc/syscap.json 按部件分组的 SysCap
/system/etc/pcid.sc PCID 二进制位图(应用安装校验用)