以 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 树的增删查操作(FindTrieNode、AddTrieNode) |
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) |
权限校验必须走内核的核心原因:
- 内核模块也需要查权限------如 Binder 驱动在传输时需校验调用方权限,发生在内核态,无法访问用户态共享内存
- 防篡改------内核 BST 只有 ATMServ 能通过 ioctl 写入,其他进程只能读,安全性高于用户态共享内存
- 数据动态变化------权限可以被授予或撤销,需要一个可靠的同步机制
SysCap 使用共享内存就足够的原因:
- 数据完全静态------设备有什么硬件能力开机就确定,无需动态更新
- 无内核态消费者------没有内核模块需要查"设备有没有相机能力"
- 性能已是最优------mmap 后的 Trie 查找是纯内存操作,比 ioctl 更快(无需陷入内核)
- 安全要求低------即使查询结果被篡改,最多导致 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 为例)
-
在部件的 bundle.json 中声明 (假设部件位于
foundation/foo/bar/):文件:foundation/foo/bar/bundle.jsonjson"syscap": ["SystemCapability.Foo.Bar"] -
在 syscap 编号字典中注册(追加到枚举末尾,不可删除已有项):
文件:developtools/syscap_codec/include/codec_config/syscap_define.hcFOO_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 扩展字典路径 -
确保部件被产品选中(在产品 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 -
重新编译,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 二进制位图(应用安装校验用) |