# frameworks_runtimes_feature
**Repository Path**: open-vela/frameworks_runtimes_feature
## Basic Information
- **Project Name**: frameworks_runtimes_feature
- **Description**: Feature runtime for OpenVela
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: dev
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-01-29
- **Last Updated**: 2026-02-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# README
## Feature框架
在快应用开发中, 需要为快应用增加一些新的能力, 这些能力都是通过C/C++语言编写。Feature框架就是一个帮助系统开发者为快应用扩展功能的框架, SDK以及工具集。
## Feature框架能力
由Feature框架提供的运行时框架, API, 以及JIDL语言及工具组成.
- 提供JS层调用Native代码的执行框架
- Feature框架API提供一组Native代码与JS交互的接口
- JIDL则是一个接口描述语言, 用于自动生成JS和Native相互调用的接口.
### Feature的概念模型
#### 静态概念模型
由于Feature是由Native向JS提供的接口, 所以 Feature的概念也遵循JS的概念.
Feature有3层概念:
1. Module: 一个Feature就是一个模块, 它等同于C语言里面的程序模块. 它没有实例, 是全局存在的;
2. Prototype: 原型, 等同于JS中的原型对象, 类似C++里面的类, 但是又有所不同. 一个快应用实例会产生一个Prototype. 所有的Feature上的函数, 属性都是在Prototype上管理的;
3. Instance: 实例, 一个APP内有多个实例 (每Require一次就会产生一个实例), 实例上保存了所有的处理数据.
具体到快应用中:
1. 一个快应用实例只有一个Prototype;
2. 一个快应用页面一般只包含一个Feature的Instance.
从系统角度上看Feature的概念
#### 运行时概念模型
每个Feature都可以关联Native数据, 所关联的内容有所区别;运行时概念模型如下;
#### Feature的生命周期
### Feature框架提供的接口能力
#### 自动生成Feature Prototype和Instance
Feature框架帮助开发者创建Feature的Prototype和Instance.
1. Feature开发者需要提供一个FeatureDescription: 描述Feature的信息, 包括
1. Feature的名字
2. Feature的成员组成
- Feature支持的方法, 包括方法名, 参数列表, 返回值,以及实现回调函数
- 属性的名字, 类型, 以及实现函数
- 其他等
2. 根据FeatureDescription生成FeaturePrototype和FeatureInstance, 并以`FeatureProtoHandle`和`FeatureInstanceHandle`的方式反馈给开发者
#### 提供参数转换
从JS到Native, Feature框架提供参数转换能力, 将JS参数转换为普通参数, 下表提供了基本的转换能力
| **JS类型** | **C类型** | **说明** |
| ------------------ | ------------------------ | ------------------------------------------------------------ |
| number/boolean类型 | Int, float, double, bool | JS的number类型以浮点数形式存在. 根据JIDL的描述, 可以转换成int, float等可兼容类型. 转成int/bool类型会导致小数部分丢失 |
| string | FtString | Const char*的typedef |
| object | struct 指针FtAny指针 | 如果在JIDL中定义了struct结构, 则会转成对应的C语言struct指针;如果在JIDL中定义为object/any类型, 则直接定义为 |
| array | FtArray指针 | 转成一个C结构的FtArray |
| function | FtCallbackId | 转成一个整数, 表示CallbackId |
| promise | FtPromiseId | 转成一个整数, 表示PromiseId |
- 指针对象是自带引用计数, 可以通过`FeatureDupValue`和`FeatureFreeValue`来释放.
- 通过参数传递的指针, 不需要额外释放
下图展示了对Callback和Promise的管理机制
Feature框架通过隐藏细节, 达到两个目的
1. Feature开发者无需关心细节, 也无需管理Callback和Promise的生命周期
2. FeatureInstance提供托底的内存管理方法
#### 异步编程模型
Feature的代码和JS代码运行在同一个uvloop内, Feature开发者需要注意它们调用时长. 在普通函数中不能阻塞.
- 可添加一个任务到worker队列
- 任意线程可以调用`FeaturePost`添加任务到主循环队列
### JIDL提供的接口描述
JIDL用于描述Feature的接口, 下面是一个简单feature文件
```C++
// 模块名称
module test@1.0
callback cb(int a, int b);
void foo(int a, float b, string c);
void goo(int a, cb cb1);
property string name;
property int age;
```
- 类似C++语言的注释风格
- 总是以`module`开头, 包括模块名和版本
- 可以定义属性, 函数, 接口等
文件定义上
1. 文件名以`.jidl`结束
2. 文件名字一般是`_<版本号>.jdil`, 但不强求
模块命名上, 可以使用`.`号, 如`system.fetch`