From cec3bb27b3d47895786ec901438524c97781e3b9 Mon Sep 17 00:00:00 2001 From: NEEN Date: Fri, 31 Dec 2021 18:32:19 +0800 Subject: [PATCH] update release notes Signed-off-by: NEEN --- zh-cn/contribute/template/README-template.md | 162 +++++++ .../contribute/template/figures/figure01.png | Bin 0 -> 22578 bytes .../contribute/template/figures/figure02.png | Bin 0 -> 39933 bytes zh-cn/contribute/template/xxboard-template.md | 82 ++++ zh-cn/release-notes/OpenHarmony-v3.1-beta.md | 215 +++++++++ zh-cn/release-notes/Readme.md | 2 + .../v3.1-beta/changelog-v3.1-beta.md | 43 ++ .../v3.1-beta/js-apidiff-v3.1-beta.md | 427 ++++++++++++++++++ .../v3.1-beta/native-apidiff-v3.1-beta.md | 16 + 9 files changed, 947 insertions(+) create mode 100644 zh-cn/contribute/template/README-template.md create mode 100644 zh-cn/contribute/template/figures/figure01.png create mode 100644 zh-cn/contribute/template/figures/figure02.png create mode 100644 zh-cn/contribute/template/xxboard-template.md create mode 100644 zh-cn/release-notes/OpenHarmony-v3.1-beta.md create mode 100644 zh-cn/release-notes/api-change/v3.1-beta/changelog-v3.1-beta.md create mode 100644 zh-cn/release-notes/api-change/v3.1-beta/js-apidiff-v3.1-beta.md create mode 100644 zh-cn/release-notes/api-change/v3.1-beta/native-apidiff-v3.1-beta.md diff --git a/zh-cn/contribute/template/README-template.md b/zh-cn/contribute/template/README-template.md new file mode 100644 index 0000000000..8579a44e52 --- /dev/null +++ b/zh-cn/contribute/template/README-template.md @@ -0,0 +1,162 @@ +# xxx子系统/组件 + +- [简介](#简介) +- [目录](#目录) +- [约束](#约束) +- [编译构建](#编译构建) +- [说明](#说明) + - [接口说明](#接口说明) + - [使用说明](#使用说明) +- [Changelog](#changelog) +- [相关仓](#相关仓) + +【标题说明】根据当前Readme的类型,使用 **子系统**或者 **组件**。 + + +![子系统readme](figures/figure01.png) + + +## 简介 + + +【写作要求】 必选**,简介中包含2部分内容: **内容介绍、架构图介绍。 + +**内容介绍:**从以下几个方面介绍该子系统:出现背景(在整个OpenHarmony架构中的作用)、实现的功能、使用场景、支持的设备等。 + +**架构图:**使用架构图说明该子系统【组件】架构,对架构中的主要组成部分进行必要的解释说明 + +**如果本组件仓库只是子系统一部分,需要理解子系统相关概念,建议给出:** + +**更多XXX子系统相关概念,请参考:xxx。(给出到子系统readme的链接)** + + +写作注意事项如下: + + +| 要求项 | 内容要求 | +| -------- | -------- | +| **A.1** | **用语要求** | +| A.1.1 | 行文风格:用语正式,避免口语化。 | +| A.1.2 | 合规要求:不能使用第三方知识产权特有概念等存在合规和法务风险的词汇。 | +| A.1.3 | 内容简洁:内容采用信息必备、最小化原则,旨在指导开发者在尽量短的时间完成操作。 | +| A.1.4 | 内容正确:文档的代码、需要设置的参数等需要跟产品实际情况实时保持一致。 | +| A.1.5 | 用语准确:应当确切,不能出现多义性的描述。 | +| A.1.6 | 用语一致:同一叫法,全文保持一致,术语与术语库保持一致,正文中缩略语首次出现要给出全称。 | +| A.1.7 | 用语具体:如表示数量或程度时,避免用笼统的“多”“少”“大”,建议用具体数字表示。 | +| **A.2** | **格式要求** | +| A.2.1 | 标点符号正确、句尾有符号结尾。 | +| A.2.2 | 内容尽量用项目列表或分类的方式清晰呈现。不要有单个项目列表;不要有多余空行。 | +| A.2.3 | 英文字母和中文字之间不要有空格。 | +| A.2.4 | 链接必须有效,具体,可直接跳转或下载。Gitee内部建议使用相对链接,避免使用绝对链接。 | +| A.2.5 | 如果是内容的辅助说明,请使用“说明”式样;如果提前申明事项,请使用“须知”式样,不用“注意”格式 | +| **A.3** | **表格** | +| A.3.1 | 表格有表注,表头风格一致,采用名词或名词词组形式。 | +| A.3.2 | 表格有表头,至少为2行2列,避免出现单行或单列表。 | +| A.3.3 | 表格无内容用“_”,不出现空白的单元格。 | +| **A.4** | **图形** | +| A.4.2 | 避免涉及宗教信仰类截图。 | +| A.4.3 | 图文并茂,行文应力求简明,如有可能,配以适当的图,表。 | +| A.4.4 | 图形有图注(不可直接粘贴图形),图注风格一致,采用名词或名词词组形式。 | +| A.4.5 | 图形应清晰可辩识,信息表达完整,易于阅读。如流程图不可缺少“开始”和“结束”。 | +| A.4.6 | 图形逻辑清晰,图文配合使用,切忌图文分离。 | +| A.4.7 | 图片的高度建议在640px左右,宽度不超过820px,一般为.png格式,图片的大小建议不超过150k。 | +| A.4.8 | 图形建议尽量不要用文字,中文图用中文,英文图用英文。 | + + +架构图参考如下,注意需要绘图的 **颜色,格式有规范要求**,请参照: + +**图1** 子系统架构图 +![架构图](figures/figure02.png) + + + +## 目录 + +【写作要求】 必选**,明确本项目仓的代码 **目录结构**以及对应目录的 **功能描述 + +```undefined +/foundation/ace +├── frameworks # 框架代码 +│ └── lite +│ ├── examples # 示例代码目录 +│ ├── include # 对外暴露头文件存放目录 +│ ├── packages # 框架JS实现存放目录 +│ ├── src # 源代码存放目录 +│ ├── targets # 各目标设备配置文件存放目录 +│ └── tools # 工具代码存放目录 +├── interfaces # 对外接口存放目录 +│ └── innerkits # 对内部子系统暴露的头文件存放目录 +│ └── builtin # JS应用框架对外暴露JS三方module API接口存放目录 +``` + + + +## 约束 + +【写作要求】 **可选**,明确项目运行的特定条件,如特定的编程语言或特定的操作系统的特定版本。 + +| 要求项 | 内容要求 | +| -------- | -------- | +| D.1.1 | 明确功能限制或操作限制。 | +| D.1.2 | 约束对指导任务开发有影响或体验有感知,否则不用体现。 | +| D.1.3 | 容易出错的操作在步骤里描述,不在此体现。 | + + +## 编译构建/使用方法 + +【写作要求】 可选,子系统Readme不需要提供,对于组件仓的Readme,根据实际情况,提供编译构建的说明。 + + +## 说明 + + +### 接口说明 + +【写作要求】 **可选**,描述本开发指导相关的接口有哪些,旨在要开发者在开发前有大体了解,提升开发效率。 **子系统readme无需提供**,仓库的readme根据需要判断是否提供,如果已经有API接口参考无需提供;写作要求见下: + +| 要求项 | 内容要求 | +| -------- | -------- | +| J.1.1 | 不在本开发任务的接口无需提供。 | +| J.1.2 | 如果接口太多,可以提供主要的接口 | + + +### 使用说明 + +【写作要求】 **可选**, *子系统Readme中偏向于概念介绍;仓Readme偏向于具体功能介绍*;如果已经提供开发指南可直接链接到对应指南,无需再写使用说明。 + +写作要求见下,完成写作后,请逐项自检。 + +| 要求项 | 内容要求 | +| -------- | -------- | +| **F.1** | **如何写好步骤** | +| F.1.1 | 步骤完整:提供必须的步骤,顺利指导完成操作,无缺失。 | +| F.1.2 | 脉络清楚:文档逻辑清晰、合理。文档前面的概述、准备、操作围绕一条线描述,不能章节断裂或前后矛盾的现象。 | +| F.1.3 | 任务句式:标题或句子尽量使用“动词+名词”的句式表述动作。 | +| F.1.4 | 预防提前:操作过程中的限制、易错的、有潜在风险的,要提前描述。 | +| F.1.5 | 步骤清晰-1:无论步骤简单或复杂,都需要写步骤目的,即为什么做。 | +| F.1.6 | 步骤清晰-2:明确在什么环境下,使用什么工具,做什么操作,怎么做该操作。 | +| F.1.7 | 步骤具体:如果操作可选,要明确可选条件。 | +| F.1.8 | 在开发步骤执行完成后,及时明确操作正确的标准。 | +| **F.2** | **如何写好代码段** | +| F.2.1 | 代码涉及开发者拷贝的命令,必须用可编辑的报文呈现,避免截图,使用代码片段包裹样式 | +| F.2.2 | 代码中关键段,关键步骤要有注释说明。 | +| F.2.3 | 代码显示符合代码缩进要求。 | +| F.2.4 | 步骤涉及接口调用,清晰给出接口及其使用说明或示例代码,代码来源于具体实例。 | + + +## Changelog + +【写作要求】 **可选**,当此readme所在的仓,在做版本升级或其他调整时,需要在changelog中维护变化信息【本次开源中,如果涉及升级更新的,需要提供】 + + +## 相关仓 + +【写作要求】 **必选**。列出当前仓所在子系统的所有相关仓的链接,并加粗标识当前的仓 + +[xxx子系统](https://gitee.com/openharmony) + +[组件1](https://gitee.com/openharmony) + +**[组件2](https://gitee.com/openharmony)** + +[组件3](https://gitee.com/openharmony) \ No newline at end of file diff --git a/zh-cn/contribute/template/figures/figure01.png b/zh-cn/contribute/template/figures/figure01.png new file mode 100644 index 0000000000000000000000000000000000000000..62e5ec7c6248ed9219503c85b076dc9a22da6c78 GIT binary patch literal 22578 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

}LN7{3iXadYdT*fxLJ0|H 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 literal 0 HcmV?d00001 diff --git a/zh-cn/contribute/template/xxboard-template.md b/zh-cn/contribute/template/xxboard-template.md new file mode 100644 index 0000000000..24021f3f4c --- /dev/null +++ b/zh-cn/contribute/template/xxboard-template.md @@ -0,0 +1,82 @@ +# XXX开发板名称 +*本模板定位:OpenHarmony生态引入第三方开发板时,第三方开发板厂商需提供开发板介绍,便于开发者快速了解此开发板。* + +## 介绍 + +【写作说明】 + +*文字描述开发板的功能,面向场景,主要支持的特性能力。* + +*提供开发板外观图片。* + +*底板图片。* + +*功能框图及介绍。* + +**图片名称以开发板名称命名。* + +*参考文档:https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/oem_minitinier_des_3861.md* + +******** +## 开发板规格 + +*【写作说明】提供开发板模组规格清单,硬件规格列表。* + +## 约束和限制(可选) + +*【写作说明】如果开发板在某些功能、特性、规格等使用上,有一定的约束和建议,需要明确说明。* + +******** + + +## 关键特性 +*【写作说明】支持的OpenHarmony关键特性列表。* + +## 引脚定义 +*【写作说明】介绍单板的管脚定义等,描述单板I/O引脚,PIN,以及如何配置PIN、如何使用PIN连接外部组件。* + +## 搭建开发环境 + +### 系统要求 + +*【写作说明】描述开发板对OpenHarmony系统依赖、软、硬件环境系统依赖。* + +### 工具要求 + +*【写作说明】提供从哪里下载开发板编译调试工具链。* + +### 搭建过程 + +*【写作说明】Step by Step介绍环境搭建详细步骤。* + +## 编译调试 + +### 编译 + +*【写作说明】如何在此开发板上使用OpenHarmony,以及如何在此单板上刷新OpenHarmony二进制文件及设备。* + +### 烧录 + +*【写作说明】Step by Step介绍如何烧录参考步骤。* + +### 运行 + +*【写作说明】如何判断开发板正常点亮、运行、输出正常。* + + +### 调试 + +*【写作说明】如何调试开发板常见报错等。* + +## 首个示例 + +*【写作说明】基于此开发板给出一个快速上手的示例,运行效果,或者给出demo示例源码链接。* + +## 参考资源 + +*【写作说明】给出更多详细参考文档、sample示例、FAQ、官网等内容链接。* + +## 感谢(可选) + +*【写作说明】致谢做出突出贡献的三方开发者。* + diff --git a/zh-cn/release-notes/OpenHarmony-v3.1-beta.md b/zh-cn/release-notes/OpenHarmony-v3.1-beta.md new file mode 100644 index 0000000000..2fd499071a --- /dev/null +++ b/zh-cn/release-notes/OpenHarmony-v3.1-beta.md @@ -0,0 +1,215 @@ +# OpenHarmony 3.1 Beta + +- [版本概述](#版本概述) +- [配套关系](#配套关系) +- [源码获取](#源码获取) + - [通过repo获取](#通过repo获取) + - [从镜像站点获取](#从镜像站点获取) +- [更新说明](#更新说明) + - [特性变更](#特性变更) + - [API变更](#api变更) + - [芯片及开发板适配](#芯片及开发板适配) + - [Samples & Codelabs](#samples-amp-codelabs) + - [新增Samples](#新增samples) + - [新增Codelabs](#新增codelabs) +- [修复缺陷列表](#修复缺陷列表) +- [遗留缺陷列表](#遗留缺陷列表) + + +## 版本概述 + +当前版本在OpenHarmony 3.0 LTS的基础上,更新支持了以下能力: + +- 标准系统OS基础能力增强:内核提升CMA利用率特性、图形新增支持RenderService渲染后端引擎、短距离通信支持STA(Station)和SoftAP基础特性、支持地磁场的算法接口、传感器驱动模型能力增强、支持应用帐号信息查询和订阅等、全球化特性支持、编译构建支持统一的构建模板、编译运行时提供Windows/MacOS/Linux的前端编译工具链、JS运行时支持预览器、新增支持JSON处理、Eventbus、Vcard、Protobuf、RxJS、LibphoneNumber等6个JS三方库、新增时间时区管理、DFX新增支持HiSysEvent部件提供查询和订阅接口。 + +- 标准系统分布式能力增强:包括新增支持分布式DeviceProfile特性、分布式数据管理支持跨设备同步和订阅、分布式软总线支持网络切换组网、分布式文件系统支持Statfs API能力等。 + +- 标准系统应用程序框架能力增强:新增ArkUI自定义绘制能力和Lottie动画能力、新增包管理探秘隐式查询和多hap包安装、事件通知支持权限管理、设置通知振动、通知声音设置和查询、通知免打扰、会话类通知等。 + +- 标准系统系统应用能力增强:输入法应用支持文本输入和横屏下布局显示、短信应用信息管理、联系人应用通话记录和拨号盘显示、设置应用更多设置项。 + +- 轻量系统能力增强:HiStreamer轻量级支持可定制的媒体管线框架、Linux版本init支持热插拔、OS轻内核&驱动启动优化、快速启动能力支持。 + + +## 配套关系 + +**表1** 版本软件和工具配套关系 + +| 软件 | 版本 | 备注 | +| -------- | -------- | -------- | +| OpenHarmony | 3.1 Beta | NA | +| SDK | Ohos_sdk 3.1 Beta  (API Version 8 Beta) | NA | +| HUAWEI DevEco Studio(可选) | 3.0 Beta2 | OpenHarmony应用开发推荐使用。 | +| HUAWEI DevEco Device Tool(可选) | 3.0 Beta2 | OpenHarmony智能设备集成开发环境推荐使用。 | + + +## 源码获取 + + +### 通过repo获取 + +**方式一(推荐)** + +通过repo + ssh 下载(需注册公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191))。 + +``` +repo init -u git@gitee.com:openharmony/manifest.git -b OpenHarmony-3.1-Beta --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +**方式二** + +通过repo + https 下载。 + +``` +repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.1-Beta --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +### 从镜像站点获取 + +**表2** 获取源码路径 + +| 版本源码 | **版本信息** | **下载站点** | **SHA256校验码** | +| -------------------------------- | ------------ | ------------ | ---------------- | +| 全量代码(标准、轻量和小型系统) | 3.1 Beta | [站点](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/code-v3.1-Beta.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/code-v3.1-Beta.tar.gz.sha256) | +| Hi3516标准系统解决方案(二进制) | 3.1 Beta | [站点](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/standard_hi3516.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/standard_hi3516.tar.gz.sha256) | +| RK3568标准系统解决方案(二进制) | 3.1 Beta | [站点](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/standard_rk3568.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/standard_rk3568.tar.gz.sha256) | +| Hi3861解决方案(二进制) | 3.1 Beta | [站点](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/hispark_pegasus.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/hispark_pegasus.tar.gz.sha256) | +| Hi3516解决方案-LiteOS(二进制) | 3.1 Beta | [站点](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/hispark_taurus.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/hispark_taurus.tar.gz.sha256) | +| Hi3516解决方案-Linux(二进制) | 3.1 Beta | [站点](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/hispark_taurus_linux.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/hispark_taurus_linux.tar.gz.sha256) | +| 标准系统包(Mac) | 3.1 Beta | [站点](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/ohos -sdk-mac.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/ohos -sdk-mac.tar.gz.sha256) | +| 标准系统包(Windows\Linux) | 3.1 Beta | [站点](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/ohos -sdk-tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.1-Beta/ohos -sdk-tar.gz .sha256) | +| 编译工具链获取清单 | - | [站点](https://repo.huaweicloud.com/harmonyos/os/2.0/tool_chain/) | | + + +## 更新说明 + +本版本在OpenHarmony 3.0 LTS的基础上有如下变更。 + + +### 特性变更 + +**表3** 版本新增特性表 + +| 子系统名称 | 标准系统 | 轻量、小型系统 | +| -------- | -------- | -------- | +| 包管理子系统 | - I4MBSE:提供桌面包管理客户端
- I4MBSF:支持缓存清除能力
- I4MBSG:支持安装包信息查询
- I4MBSD:支持多hap包安装
- I4MBSH:支持多hap安装的签名校验
- I4MBSC:支持Module和Ability的srcPath字段 | NA | +| 分布式任务调度子系统 | -I4MBRW:SAMGR新增服务进程内的System Ability名单管控
-I4MBRV:SAMGR新增系统服务状态列表维护
-I4MBRZ:SAMGR新增全量服务列表初始化
-I4MBRY:SAMGR新增系统服务进程状态列表维护
-I4MBRX:SAMGR新增加载指定系统服务 | NA | +| DeviceProfile子系统 | -I4NY23:本地设备Profile的插入、删除、查询
-I4NY1X:远程设备Profile的查询
-I4NY1T:订阅远程Profile变化的通知
-I4NY1W:跨设备同步Profile | NA | +| 帐号子系统 | -I4MBQW:支持应用帐号的新增和删除
-I4MBQV:应用帐号基础信息约束
-I4MBQU:支持应用帐号订阅及取消订阅
-I4MBQT:支持应用帐号功能设置与内容修改
-I4MBQS:支持应用帐号信息查询
-I4IT3U:支持应用帐号基础信息管理 | NA | +| 泛sensor服务子系统 | -I3NJ96:加速度传感器数据上报
-I3NJ8H:陀螺仪传感器数据上报
-I3NJ7J:环境光传感器数据上报
-I3NJ76:磁力计传感器数据上报
-I4MBRP:地磁场偏角和倾角
-I4MBRQ:地磁场水平强度、总强度 | NA | +| USB服务子系统 | I410OZ:
- 查询已连接的USB设备列表
- 获取USB设备临时访问权限
- 设置USB设备配置、接口
- 与USB设备进行数据传输 | NA | +| 语言编译器运行时子系统 | - I4MBUK:JavaScript/TypeScript默认运行时从quickjs替换为方舟运行时。
- I4MBUJ:方舟运行时内存回收功能增强,支持并发标记算法以及并发压缩算法,支持选择部分region进行压缩GC(Partial CompressionGC),优化GC pause time减少30%。 | NA | +| 全球化子系统 | - 支持国际化特性:单复数规则、字符串排序、电话号码处理、日历&本地历法、度量衡体系和格式化、区域表示和属性、时间段格式化、字母表检索、unicode字符属性、断词换行
- 支持系统资源、rawfile资源 | NA | +| 分布式软总线子系统 | -I4FZ29:软总线提供传输ExtAPI接口
-I4FZ25:软总线支持网络切换组网 | -I4FZ29:软总线提供传输ExtAPI接口
-I4FZ25:软总线支持网络切换组网 | +| 启动子系统 | NA | -I3XGJH:init基础环境构建
-I3XGKV:sytemparameter管理
-I3XGLN:init 脚本管理
-I3XGMQ:基础权限管理
-I3XGN8:bootimage构建和加载
-I3XGKV:uevent 管理
-I3XGKV:sytemparameter管理
-I3XGNM:烧写模式支持 | +| 媒体子系统 | NA | -I4BX5Z:HiStreamer支持音频播放和控制
-I4BX8A:HiStreamer支持常见音频格式mp3/wav的播放
-I4BX9E:HiStreamer播放引擎框架需求
-I4DK89:HiStreamer插件框架需求
-I4DK8D:HiStreamer性能和DFX需求 | +| 图形子系统 | 全新设计OpenHarmony 图形栈:
新增UI框架渲染后端特性支持
新增ArkUI控件接入RenderService渲染后端 | NA | +| 内核子系统 | 内核(Linux 5.10)
-I4LUG4 CMA内存区域复用(目前仅支持Hi3516DV300,暂不支持RK平台)
-I4LX4G 支持anonymous vma命名(目前仅支持Hi3516DV300,暂不支持RK平台) | -I3ND6Y:【性能】OS内核&驱动启动优化 | +| 启动恢复子系统 | NA | -I3NTCT:Linux版本init支持热插拔 | +| 分布式数据对象管理子系统 | NA | -I4H3JJ:分布式对象支持小型系统设备 | +| 电话子系统 | NA | -I4JQ2N:提供Http JS API
-I4JQ3G:提供Http 2.0协议 | +| Misc软件服务子系统 | I4MBQE:
支持应用读取时间
支持应用读取时区
支持时间修改通知
支持时区修改通知
支持分钟变化通知 | NA | +| 编译构建子系统 | I4K7E3:支持使用统一的编译命令作为编译入口
- I4KCNB:支持使用统一的gn模板 | -I4MBQN:支持统一的编译入口、支持使用build.sh编译轻量、小型系统
-I4MBQP:支持统一的编译流程
-I4MBQR:支持统一的产品配置 | +| 文件存储子系统 | -I4MBS2:statfs获取设备总空间与剩余空间JS接口 | NA | +| 驱动子系统 | -I4L3KK:传感器器件驱动能力增强,支持传感器采样率动态配置,三轴方向静态可配置,环境光增益调节。
-I4L3LF:传感器驱动模型能力增强,支持传感器HDI跨进程服务获取和调用。
-I4MBTS:HDF-Input设备能力丰富,支持摇杆设备数据上报。
-I4MBTR:Display HDI接口针对标准系统的参考实现,针对DRM显示架构,提供针对标准系统的Display HDI默认参考实现,有助于厂商参考适配HDI。
-I4HPR7:提供hcs宏式解析机制,编译时使用hc-gen工具把驱动的配置参数解析为宏定义参数,驱动通过hcs宏格式的接口访问宏定义参数。
-I4KVJQ:支持linux/liteos内核系统级休眠唤醒。
-I4L3ZZF:支持同步/异步电源管理调用,提供同步/异步的管理HDF设备进入休眠或者被唤醒的机制。 | -I4L3KK:传感器器件驱动能力增强,支持传感器采样率动态配置,三轴方向静态可配置,环境光增益调节。
-HDF-Input设备能力丰富(linux系统),支持摇杆设备数据上报。
-I4HPR7:提供hcs宏式解析机制,编译时使用hc-gen工具把驱动的配置参数解析为宏定义参数,驱动通过hcs宏格式的接口访问宏定义参数。
-I4KVJQ:支持linux/liteos内核系统级休眠唤醒。
-I4L3ZZF:支持同步/异步电源管理调用,提供同步/异步的管理HDF设备进入休眠或者被唤醒的机制。 | +| ArkUI子系统 | - I4MBUY:事件中增加Target获取尺寸
- I4MBUZ:Swiper组件支持设置缓存cache
- I4MBV1:Image组件支持同步、异步渲染设置
- I4MBV3:样式设置特性增加组件多态样式设置
- I4MBV5:字母索引条组件增加提示菜单内容扩展
- I4MBV6:组件自定义特性增加自定义容器组件规格
- I4MBV7:滚动条样式自定义能力
- I4MBV8:Swiper组件新增切换禁用规格
- I4MBV9:Tabs组件新增TabBar内容自定义规格
- I4MBVA:Navigation组件新增标题栏设置规格
- I4MBVB:工具栏组件增加工具栏显隐控制规格
- I4MBVC:工具栏组件增加内容自定义能力规格
- I4MBVD:新增SysCap声明编译特性
- I4MBVE:新增JSSDK编译特性
- I4MBVF:新增Config.json编译特性
- I4MBVG:新增断点调试特性支持单实例调试
- I4MBVH:新增attach调试特性支持单实例调试
- I4MBVI:新增声明式范式编译特性支持编译和校验规格
- I4MBVJ:新增JS模块共享编译特性
- I4MBVK:新增HAR引用和编译特性
- I4MBVL:新增NPM引用和编译特性、
- I4MBVN:纵向显示滑动条组件特性
- I4MBVO:Popup组件增加内容自定义规格
- I4MBVP:Canvas绘制能力支持
- I4MBVQ:Canvas能力增强
- I4MBVR:触摸响应热区设置
- I4MBVS:Lottie动画支持
- I4MBVT:组件尺寸获取特性
- I4MBVU:Menu组件增加内容自定义规格
- I4MBVV:Swipe手势特性
- I4MBVW:UI预览支持Inspector能力
- I4MBVX:新增非路由文件预览特性
- I4MBVY:新增NAPI预览特性
- I4MBVZ:新增声明式范式预览特性。支持基础预览规格
- I4MBW2:新增声明式范式热加载特性,支持已有节点修改规格
- I4MBW3:新增声明式范式热加载特性,支持新增节点规格
- I4MBW4:新增声明式范式热加载特性,支持删除节点规格
- I4MBW5:新增组件预览特性,支持页面组件预览规格
通用属性新增点击控制 touchable:设置组件是否可以被触摸。
基础组件新增Marquee:跑马灯组件。
基础组件新增Gauge:数据量规图表组件。
基础组件新增TextArea:多行文本输入组件。
基础组件新增TextInput:单行文本输入组件。
基础组件新增Toggle:状态组件。
容器组件新增Stepper:步骤导航器组件。
容器组件新增StepperItem:步骤导航器导航项组件。
新增全局UI方法ActionSheet:列表选择弹窗。 | NA | +| DFX子系统 | -I4MBQH:支持HiSysEvent部件,提供查询、订阅接口
-I4MBQJ:提供工具查询或者订阅系统事件
-I4MBQL:支持Hiappevent部件的C接口 | NA | +| 应用子系统 | -I4MBU1:支持Settings数据管理API
-I4MBU3:支持时间设置
- I4MBU5:支持声音管理
-I4MBU6:支持Settings数据管理
-I4MBU7:支持Settings数据默认值管理
-I4MBU8:支持Settings多设备形态差异化构建
-I4MBU9:通知组件化 | NA | + + +### API变更 + +API变更请参考: + +_[JS API 差异报告](api-change/v3.1-beta/js-apidiff-v3.1-beta.md)_ + +_[Native API差异报告](api-change/v3.1-beta/native-apidiff-v3.1-beta.md)_ + +_[Changelog](api-change/v3.1-beta/changelog-v3.1-beta.md)_ + + +### 芯片及开发板适配 + +芯片及开发板适配状态请参考[SIG-Devboard](https://gitee.com/openharmony/community/blob/master/sig/sig-devboard/sig_devboard_cn.md)信息。 + + +### Samples & Codelabs + + +#### 新增Samples + +**表1** Samples列表 + +| 名称 | 简介 | 开发语言 | +| -------- | -------- | -------- | +| [Ets公共事件](https://gitee.com/openharmony/app_samples/tree/master/ability/EtsCommonEvent) | 本示例展示了在eTS中如何使用CommonEvent的接口完成创建订阅者、订阅公共事件、发布公共事件、取消订阅的功能。 | eTS | +| [空气质量](https://gitee.com/openharmony/app_samples/tree/master/common/AirQuality) | 本示例使用JS实现了一个简单空气质量应用,使用折行显示能力显示空气质量信息,使用柱形图展示历史记录。 | JS | +| [分布式计算器](https://gitee.com/openharmony/app_samples/tree/master/common/DistributeCalc) | 本示例使用JS分布式能力实现了一个简单的计算器应用,可以进行简单的数值计算,支持远程拉起另一个计算器FA,两个FA进行协同计算。 | JS | +| [EtsNotification](https://gitee.com/openharmony/app_samples/tree/master/common/EtsNotification) | 本示例展示了在eTS中如何创建和删除Slot通道,如何发布和取消通知。 | eTS | +| [Ets资源管理](https://gitee.com/openharmony/app_samples/tree/master/common/EtsResourceManager) | 本示例展示了在eTS中如何调用资源管理的API接口实现字符串和图片资源信息的获取。 | eTS | +| [kikainput](https://gitee.com/openharmony/app_samples/tree/master/CompleteApps/KikaInput) | kikainput是一个轻量级的输入法应用,支持在运行OpenHarmony OS的智能终端上。 | JS | +| [eTS分布式数据管理](https://gitee.com/openharmony/app_samples/tree/master/data/eTSKvStore) | 本示例展示了在eTS中分布式数据管理的使用,包括KVManager对象实例的创建和KVStore数据流转的使用。 | eTS | +| [轻量级数据存储](https://gitee.com/openharmony/app_samples/tree/master/data/eTSLiteStorage) | 轻量级数据存储主要提供轻量级Key-Value操作,支持本地应用存储少量数据。本示例通过对购物车商品的添加和删除并保存退出的操作,使得再次打开应用时依然可以保留退出前的购物车信息,体现了轻量级存储在保存轻量级数据时的作用。 | eTS | +| [Ets进程信息](https://gitee.com/openharmony/app_samples/tree/master/ETSUI/EtsProcess) | 本示例展示了在eTS中如何获取进程信息和启动一个子进程运行一段shell,包括当前系统运行时间、获取进程当前工作目录、更改进程当前工作目录、发送signal到指定的进程、启动一个子进程、关闭子进程、退出当前系统的功能。 | eTS | +| [Ets运行锁](https://gitee.com/openharmony/app_samples/tree/master/ETSUI/eTSRunninglock) | 本示例展示了阻止系统休眠的运行锁功能,通过黑白色壁纸模拟息屏、亮屏状态,来展示系统的休眠状态,从而对运行锁的功能进行测试,使得该运行锁在打开后可以阻止系统休眠。 | eTS | +| [字符串编解码](https://gitee.com/openharmony/app_samples/tree/master/ETSUI/StringCodec) | 本示例对字符串进行了特定格式的输出,对错误码的内容进行了文本输出,对字符串的编码和解码做了演示结果。 | eTS | +| [Js音频播放和管理](https://gitee.com/openharmony/app_samples/tree/master/media/JsAudioPlayer) | 本示例展示了JS音频播放的使用方法,以及音频的音量大小设置。 | JS | +| [JsVideo](https://gitee.com/openharmony/app_samples/tree/master/media/JsVideo) | 本示例使用JS UI中的<video/>组件,实现视频播放。可以通过video自带的控制栏进行播放、暂停等操作。 | JS | +| [测试打点](https://gitee.com/openharmony/app_samples/tree/master/security/JsDotTest) | 本示例展示了测试打点功能,包括应用打点与性能打点两部分。 | JS | +| [JsWorker](https://gitee.com/openharmony/app_samples/tree/master/thread/JsWorker) | 本示例展示了在JS中如何启动一个worker线程,并实现worker线程和宿主线程的通信。 | JS | +| [画布组件](https://gitee.com/openharmony/app_samples/tree/master/UI/JsCanvas) | <canvas/>组件可以自定义绘制图形,本示例展示了<canvas\>组件的使用方法 | JS | +| [JS页面弹窗](https://gitee.com/openharmony/app_samples/tree/master/UI/JsDialog) | JS中支持用户自定义弹窗,<dialog/>组件作为容器组件,用户可以自定义弹窗的样式和布局。本示例完成了添加和删除联系人功能,在添加和删除时使用自定义弹窗来实现。 | JS | +| [JSList商品列表](https://gitee.com/openharmony/app_samples/tree/master/UI/JsList) | 本示例展示了list控件在商品分类列表中的应用,在listGroup里采用两个list-item分别展示了Group收缩和Group展开的两种列表形态,点击后会弹出相应的list列表。 | JS | +| [JSPanel](https://gitee.com/openharmony/app_samples/tree/master/UI/JsPanel) | JS提供一种轻量级的内容展示面板,此面板可滑动,可自定义触发方式、弹出高度等属性。本示例通过可滑动面板展示了商品详细信息与平台保障。 | JS | +| [JsSvg](https://gitee.com/openharmony/app_samples/tree/master/UI/JsSvg) | 本示例展示了JS中<svg/>组件及其子组件的使用,包括 。 | JS | +| [JS自定义组件](https://gitee.com/openharmony/app_samples/tree/master/UI/JSUICustomComponent) | 自定义组件是用户根据业务需求,将已有的组件组合,封装成的新组件,可以在工程中多次调用,提高代码的可读性。本示例展示了JS中自定义组件的使用,包括基本用法、自定义事件、Props和事件参数。 | JS | + + +#### 新增Codelabs + +**表2** Codelabs列表 + +| 名称 | 简介 | 开发语言 | +| -------- | -------- | -------- | +| [分布式手写板(eTS)](https://gitee.com/openharmony/codelabs/tree/master/Distributed/DistributeDatabaseDrawEts) | 基于分布式能力,实现多设备同步书写互动。 | eTS | +| [分布式数据库](https://gitee.com/openharmony/codelabs/tree/master/Data/JsDistributedData) | 基于分布式数据接口,实现多种设备上一致的数据访问体验。 | JS | +| [关系型数据库](https://gitee.com/openharmony/codelabs/tree/master/Data/JSRelationshipData) | 基于关系型数据库和数据管理能力,实现数据库相关应用服务的快速开发。 | JS | +| [极简声明式UI范式(eTS)](https://gitee.com/openharmony/codelabs/tree/master/ETSUI/SimpleGalleryEts) | 基于OpenHarmony eTS UI,实现一个图库应用。 | eTS | +| [一次开发多端部署(eTS)](https://gitee.com/openharmony/codelabs/tree/master/ETSUI/MultiDeploymentEts) | 基于OpenHarmony eTS UI,实现一次布局,多端部署。 | eTS | +| [购物应用(eTS)](https://gitee.com/openharmony/codelabs/tree/master/ETSUI/ShoppingEts) | 基于OpenHarmony eTS UI丰富的组件实现购物商城应用。 | eTS | +| [Page内和Page间导航跳转](https://gitee.com/openharmony/codelabs/tree/master/Ability/PageAbility) | 入门教程,学习如何完成Page内和Page间的页面导航跳转。 | eTS | +| [转场动画的使用(eTS)](https://gitee.com/openharmony/codelabs/tree/master/ETSUI/TransitionAnimtaionEts) | 基于OpenHarmony eTS UI转场动画,实现了页面间转场、组件内转场以及共享元素转场。 | eTS | +| [基础组件Slider的使用(eTS)](https://gitee.com/openharmony/codelabs/tree/master/ETSUI/SliderApplicationEts) | 基于OpenHarmony eTS UI,使用slider组件,实现可调节风车大小和转速的动画效果。 | eTS | +| [流式布局(eTS)](https://gitee.com/openharmony/codelabs/tree/master/ETSUI/FlowLayoutEts) | 基于OpenHarmony eTS UI,实现流式布局效果。 | eTS | +| [弹窗(eTS)](https://gitee.com/openharmony/codelabs/tree/master/ETSUI/CustomDialogEts) | 基于OpenHarmony eTS UI,实现警告弹窗和自定义弹窗。 | eTS | + + +## 修复缺陷列表 + +**表4** 修复缺陷ISSUE列表 + +| ISSUE单号 | 问题描述 | +| -------- | -------- | +| [I48IM7](https://gitee.com/openharmony/hiviewdfx_hilog/issues/I48IM7) | 运行hilog压力测试,hilogd异常重启,且hilog命令一直无法使用。 | +| [I48YPH](https://gitee.com/openharmony/security_deviceauth/issues/I48YPH) | 【软总线-组网】测试发现和组网性能(循环离网-发现-组网)110次组网失败3次。 | +| [I4BVVW](https://gitee.com/openharmony/communication_dsoftbus/issues/I4BVVW) | 【软总线-组网】标准系统与手机开关网络自组网成功率97%失败3次需分析失败原因。 | +| [I4BXY1](https://gitee.com/openharmony/multimedia_camera_standard/issues/I4BXY1) | 视频录制后前几秒没声音,播放声画不同步,在板子播放会卡顿,音源较远时,有杂音。 | +| [3ZJ1D](https://gitee.com/openharmony/kernel_liteos_a/issues/I3ZJ1D) | XTS权限用例压测用户态概率失败。 | + + +## 遗留缺陷列表 + +**表6** 遗留缺陷列表 + +| ISSUE | 问题描述 | 影响 | 计划解决日期 | +| -------- | -------- | -------- | -------- | +| [I4NRS5](https://gitee.com/openharmony/kernel_linux_5.10/issues/I4NRS5) | 【内核子系统】存在cve漏洞 | Linux内核还未发布补丁,暂时挂起,待社区发布补丁后升级同步。 | 待社区发布补丁 | +| [I4MGJM](https://gitee.com/openharmony/drivers_peripheral/issues/I4MGJM) | 【hdf/camera】RK3568单板跑camera HDI用例失败 | 拍照和预览正常,可以正常录像,点击结束按钮,不能结束。 | 2021/12/31 | +| [I4OECR](https://gitee.com/openharmony/ark_js_runtime/issues/I4OECR) | XTS运行报ark异常栈(低概率问题) | XTS压力测试低概率偶现(48小时出现1次),仅Log中上报异常栈,对功能无影响。 | 2022/1/5 | +| [I4OBTW](https://gitee.com/openharmony/aafwk_standard/issues/I4OBTW) | 全量执行XTS用例,安装应用后出现批量aa start 失败,影响社区流水线稳定性测试 | XTS压力测试,短时间内批量安装100个应用包,低概率(2个/100个)出现应用无法启动。用户使用无影响。 | 2022/1/5 | +| [I4OLHF](https://gitee.com/openharmony/ark_js_runtime/issues/I4OLHF?from=project-issue) | 【Ark子系统】 由进程com.amsst.amsMissionSnapshotTest导致测试进程异常 | 低概率、偶现,高压力测试偶现问题。 | 2022/1/5 | +| [I4OLUK](https://gitee.com/openharmony/ark_js_runtime/issues/I4OLUK) | 【Ark子系统】 由进程com.ohos.systemui导致进程栈异常 | 低概率、偶现,高压力测试偶现问题。 | 2022/1/5 | diff --git a/zh-cn/release-notes/Readme.md b/zh-cn/release-notes/Readme.md index 25ccc11bc6..380e214554 100644 --- a/zh-cn/release-notes/Readme.md +++ b/zh-cn/release-notes/Readme.md @@ -1,5 +1,7 @@ # OpenHarmony Release Notes ## OpenHarmony 3.x Releases +[OpenHarmony v3.1 Beta(2021-12-31)](OpenHarmony-v3.1-beta.md) + [OpenHarmony v3.0 LTS (2021-09-30)](OpenHarmony-v3.0-LTS.md) ## OpenHarmony 2.x Releases diff --git a/zh-cn/release-notes/api-change/v3.1-beta/changelog-v3.1-beta.md b/zh-cn/release-notes/api-change/v3.1-beta/changelog-v3.1-beta.md new file mode 100644 index 0000000000..5e7ba47b26 --- /dev/null +++ b/zh-cn/release-notes/api-change/v3.1-beta/changelog-v3.1-beta.md @@ -0,0 +1,43 @@ +# ChangeLog +##### 关键的接口/组件变更 +## 进程间通信子系统 +#### cl.rpc.1 sendRequest返回值类型变更 + +##### 变更影响 + +js的RemoteProxy和RemoteObject的sendRequest变更为异步接口,返回Promise,兑现值是SendRequestResult的实例。原有应用需要适配。 + +##### 关键的接口/组件变更 + +``` +模块:ohos.rpc.IRemoteObject, ohos.rpc.RemoteProxy和ohos.rpc.RemoteObject +接口:sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption): boolean + +变更后接口: +sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption): Promise +``` + +**适配指导** + +``` +import rpc from "@ohos.rpc" + +let option = new rpc.MessageOption() +let data = rpc.MessageParcel.create() +let reply = rpc.MessageParcel.create() +proxy.sendRequest(1, data, reply, option) + .then(function(result) { + console.info("send request done") + if (result.errCode === 0) { + // read result from result.reply + } + }) + .catch(function(e) { + console.error("send request failed: " + e) + }) + .finally(() => { + data.reclaim() + reply.reclaim() + }) +``` + diff --git a/zh-cn/release-notes/api-change/v3.1-beta/js-apidiff-v3.1-beta.md b/zh-cn/release-notes/api-change/v3.1-beta/js-apidiff-v3.1-beta.md new file mode 100644 index 0000000000..500ed00a4f --- /dev/null +++ b/zh-cn/release-notes/api-change/v3.1-beta/js-apidiff-v3.1-beta.md @@ -0,0 +1,427 @@ +# JS API 差异报告 + +OpenHarmony 3.1 Beta1相较于OpenHarmony 3.0 LTS版本的API变更如下: + +## 标准系统接口变更 + +| 模块名称 | 接口名称 | 变更类型 | 变更说明 | +| -------- | -------- | -------- | -------- | +| 系统应用-settings | getUri(name: string): string | 新增 | 新增获取设置数据URI | +| 系统应用-settings | getValue(dataAbilityHelper: DataAbilityHelper, name: string, defValue: string): string | 新增 | 新增获取设置数据库值 | +| 系统应用-settings | setValue(dataAbilityHelper: DataAbilityHelper, name: string, value: string): boolean | 新增 | 新增设置设置数据库值 | +| 杂散软件服务-systemTime | getCurrentTime(callback: AsyncCallback): void | 新增 | 获取自 Unix 纪元以来经过的毫秒数。 | +| 杂散软件服务-systemTime | getCurrentTime(): Promise | 新增 | 获取自 Unix 纪元以来经过的毫秒数。 | +| 杂散软件服务-systemTime | getCurrentTimeNs(callback: AsyncCallback): void | 新增 | 获取自 Unix 纪元以来经过的纳秒数。 | +| 杂散软件服务-systemTime | getCurrentTimeNs(): Promise | 新增 | 获取自 Unix 纪元以来经过的纳秒数。 | +| 杂散软件服务-systemTime | getRealActiveTime(callback: AsyncCallback): void | 新增 | 获取自系统启动以来经过的毫秒数,不包括深度睡眠时间。 | +| 杂散软件服务-systemTime | getRealActiveTime(): Promise | 新增 | 获取自系统启动以来经过的毫秒数,不包括深度睡眠时间。 | +| 杂散软件服务-systemTime | getRealActiveTimeNs(callback: AsyncCallback): void | 新增 | 获取自系统启动以来经过的纳秒数,不包括深度睡眠时间。 | +| 杂散软件服务-systemTime | getRealActiveTimeNs(): Promise | 新增 | 获取自系统启动以来经过的纳秒数,不包括深度睡眠时间。 | +| 杂散软件服务-systemTime | getRealTime(callback: AsyncCallback): void | 新增 | 获取自系统启动以来经过的毫秒数,包括深度睡眠时间。 | +| 杂散软件服务-systemTime | getRealTime(): Promise | 新增 | 获取自系统启动以来经过的毫秒数,包括深度睡眠时间。 | +| 杂散软件服务-systemTime | getRealTimeNs(callback: AsyncCallback): void | 新增 | 获取自系统启动以来经过的纳秒数,包括深度睡眠时间。 | +| 杂散软件服务-systemTime | getRealTimeNs(): Promise | 新增 | 获取自系统启动以来经过的纳秒数,包括深度睡眠时间。 | +| 杂散软件服务-systemTime | getDate(callback: AsyncCallback): void | 新增 | 获取当前时间。 | +| 杂散软件服务-systemTime | getDate(): Promise | 新增 | 获取当前时间。 | +| 杂散软件服务-systemTime | getTimeZone(callback: AsyncCallback): void | 新增 | 获取系统时区。 | +| 杂散软件服务-systemTime | getTimeZone(): Promise | 新增 | 获取系统时区。 | +| Ark UI框架-通用事件 | 组件区域变化事件 onAreaChange | 新增 | 新增组件区域(包括大小和位置)变化事件。 | +| Ark UI框架-通用属性 | 触摸热区设置 responseRegion | 新增 | 新增组件触摸热区设置。 | +| Ark UI框架-通用属性 | 点击控制 touchable | 新增 | 新增设置组件是否可以被触摸。 | +| Ark UI框架-通用属性 | 多态样式 stateStyle | 新增 | 新增设置组件按压态和禁用态的样式。 | +| Ark UI框架-通用手势 | SwipeGesture | 新增 | 新增滑动手势。 | +| Ark UI框架-基础组件 | Marquee | 新增 | 新增跑马灯组件。 | +| Ark UI框架-基础组件 | PluginComponent | 新增 | 新增插件组件。 | +| Ark UI框架-基础组件 | TextArea | 新增 | 新增输入区域组件。 | +| Ark UI框架-基础组件 | TextInput | 新增 | 新增输入框组件。 | +| Ark UI框架-基础组件 | Toggle | 新增 | 新增状态组件。 | +| Ark UI框架-容器组件 | ScrollBar | 新增 | 新增滚动条组件。 | +| Ark UI框架-容器组件 | Navigation | 新增 | 新增页面导航组件。 | +| Ark UI框架-容器组件 | Stepper | 新增 | 新增步骤导航器组件。 | +| Ark UI框架-容器组件 | StepperItem | 新增 | 新增步骤导航器导航项组件。 | +| Ark UI框架-画布组件 | Canvas | 新增 | 新增画布组件。 | +| Ark UI框架-画布组件 | Lottie | 新增 | 新增Lottie库的支持。 | +| Ark UI框架-全局UI方法 | ActionSheet | 新增 | 新增列表选择弹窗。 | +| USB服务-usb | getDevices(): Array> | 新增 | 新增获取USB设备列表的接口 | +| USB服务-usb | connectDevice(device: USBDevice): Readonly | 新增 | 新增根据{@link getDevices()}返回的设备信息打开USB设备的接口 | +| USB服务-usb | hasRight(deviceName: string): boolean | 新增 | 新增判断是否有权访问设备的接口 | +| USB服务-usb | requestRight(deviceName: string): Promise | 新增 | 新增请求给定软件包的临时权限以访问设备的接口 | +| USB服务-usb | claimInterface(pipe: USBDevicePipe, iface: USBInterface, force?: boolean): number | 新增 | 新增获取接口的接口 | +| USB服务-usb | releaseInterface(pipe: USBDevicePipe, iface: USBInterface): number | 新增 | 新增释放接口的接口 | +| USB服务-usb | setConfiguration(pipe: USBDevicePipe, config: USBConfig): number | 新增 | 新增设置设备配置的接口 | +| USB服务-usb | setInterface(pipe: USBDevicePipe, iface: USBInterface): number | 新增 | 新增设置设备接口的接口 | +| USB服务-usb | getRawDescriptor(pipe: USBDevicePipe): Uint8Array | 新增 | 新增获取原始的USB描述符的接口 | +| USB服务-usb | getFileDescriptor(pipe: USBDevicePipe): number | 新增 | 新增获取文件描述符的接口 | +| USB服务-usb | controlTransfer(pipe: USBDevicePipe, contrlparam: USBControlParams, timeout?: number): Promise | 新增 | 新增控制传输的接口 | +| USB服务-usb | bulkTransfer(pipe: USBDevicePipe, endpoint: USBEndpoint, buffer: Uint8Array, timeout?: number): Promise | 新增 | 新增批量传输的接口 | +| USB服务-usb | closePipe(pipe: USBDevicePipe): number | 新增 | 新增关闭USBDevicePipe的接口 | +| 用户程序框架-bundle | function cleanBundleCacheFiles(bundleName: string, callback: AsyncCallback): void;
function cleanBundleCacheFiles(bundleName: string): Promise; | 新增 | 新增清理应用缓存接口 | +| 用户程序框架-bundle | function setApplicationEnabled(bundleName: string, isEnable: boolean, callback: AsyncCallback): void;
function setApplicationEnabled(bundleName: string, isEnable: boolean): Promise; | 新增 | 新增设置应用使能接口 | +| 用户程序框架-bundle | function setAbilityEnabled(info: AbilityInfo, isEnable: boolean, callback: AsyncCallback): void;
function setAbilityEnabled(info: AbilityInfo, isEnable: boolean): Promise; | 新增 | 新增设置ability使能接口 | +| 用户程序框架-bundle.innerBundleManager | function getLauncherAbilityInfos(bundleName: string, userId: number, callback: AsyncCallback>) : void;
function getLauncherAbilityInfos(bundleName: string, userId: number) : Promise>; | 新增 | 新增通过包名获取应用LauncherAbility接口 | +| 用户程序框架-bundle.innerBundleManager | function on(type:"BundleStatusChange", bundleStatusCallback : BundleStatusCallback, callback: AsyncCallback) : void;
function on(type:"BundleStatusChange", bundleStatusCallback : BundleStatusCallback): Proimise; | 新增 | 新增注册监听包状态变化接口 | +| 用户程序框架-bundle.innerBundleManager | function off(type:"BundleStatusChange", callback: AsyncCallback) : void;
function off(type:"BundleStatusChange"): Proimise; | 新增 | 新增注销监听包状态变化接口 | +| 用户程序框架-bundle.innerBundleManager | function getAllLauncherAbilityInfos(userId: number, callback: AsyncCallback>) : void;
function getAllLauncherAbilityInfos(userId: number) : Promise>; | 新增 | 新增通过userId获取所有launcher上应用的ability接口 | +| 用户程序框架-bundle.innerBundleManager | function getShortcutInfos(bundleName :string, callback: AsyncCallback>) : void;
function getShortcutInfos(bundleName : string) : Promise>; | 新增 | 新增通过bundleName获取应用的shortcutInfo接口 | +| 分布式软总线-rpc.MessageParcel | writeNoException(): void | 新增 | - | +| 分布式软总线-rpc.MessageParcel | readException(): void | 新增 | - | +| 分布式软总线-rpc.MessageParcel | writeRemoteObjectArray(objectArray: IRemoteObject[]): boolean | 新增 | - | +| 分布式软总线-rpc.MessageParcel | readSequenceableArray(sequenceableArray Sequenceable[]): void | 新增 | - | +| 分布式软总线-rpc.MessageParcel | readRemoteObjectArray(objects: IRemoteObject[]): void | 新增 | - | +| 分布式软总线-rpc.MessageParcel | readRemoteObjectArray(): IRemoteObject[] | 新增 | - | +| 分布式软总线-rpc.MessageParcel | static closeFileDescriptor(fd: number): void | 新增 | - | +| 分布式软总线-rpc.MessageParcel | static dupFileDescriptor(fd: number) :number | 新增 | - | +| 分布式软总线-rpc.MessageParcel | containFileDescriptors(): boolean | 新增 | - | +| 分布式软总线-rpc.MessageParcel | writeFileDescriptor(fd: number): boolean | 新增 | - | +| 分布式软总线-rpc.MessageParcel | readFileDescriptor(): number | 新增 | - | +| 分布式软总线-rpc.MessageParcel | writeAshmem(ashmem: Ashmem): boolean | 新增 | - | +| 分布式软总线-rpc.MessageParcel | readAshmem(): Ashmem | 新增 | - | +| 分布式软总线-rpc.MessageParcel | getRawDataCapacity(): number | 新增 | - | +| 分布式软总线-rpc.MessageParcel | writeRawData(rawData: number[], size: number): boolean | 新增 | - | +| 分布式软总线-rpc.MessageParcel | readRawData(size: number): number[] | 新增 | - | +| 分布式软总线-rpc | interface SendRequestResult {
errCode: number;

code: number;

data: MessageParcel;

reply: MessageParcel;
} | 新增 | - | +| 分布式软总线-rpc.Ashmem | PROT_EXEC = 4 | 新增 | - | +| 分布式软总线-rpc.Ashmem | PROT_NONE = 0 | 新增 | - | +| 分布式软总线-rpc.Ashmem | PROT_READ = 1 | 新增 | - | +| 分布式软总线-rpc.Ashmem | PROT_WRITE = 2 | 新增 | - | +| 分布式软总线-rpc.Ashmem | static createAshmem(name: string, size: number): Ashmem | 新增 | - | +| 分布式软总线-rpc.Ashmem | static createAshmemFromExisting(ashmem: Ashmem): Ashmem | 新增 | - | +| 分布式软总线-rpc.Ashmem | closeAshmem(): void | 新增 | - | +| 分布式软总线-rpc.Ashmem | unmapAshmem(): void | 新增 | - | +| 分布式软总线-rpc.Ashmem | getAshmemSize(): number | 新增 | - | +| 分布式软总线-rpc.Ashmem | mapAshmem(mapType: number): boolean | 新增 | - | +| 分布式软总线-rpc.Ashmem | mapReadAndWriteAshmem(): boolean | 新增 | - | +| 分布式软总线-rpc.Ashmem | mapReadOnlyAshmem(): boolean | 新增 | - | +| 分布式软总线-rpc.Ashmem | setProtection(protectionType: number): boolean | 新增 | - | +| 分布式软总线-rpc.Ashmem | writeToAshmem(buf: number[], size: number, offset: number): boolean | 新增 | - | +| 分布式软总线-rpc.Ashmem | readFromAshmem(size: number, offset: number): number[] | 新增 | - | +| 分布式软总线-rpc.IRemoteObject | sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption): boolean | 废弃 | 替换为异步接口,使用返回Promise或者回调的接口 | +| 分布式软总线-rpc.IRemoteObject | sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption): Promise | 新增 | - | +| 分布式软总线-rpc.IRemoteObject | sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption, callback: AsyncCallback): void | 新增 | - | +| 分布式软总线-rpc.RemoteProxy | sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption): boolean | 废弃 | 替换为异步接口,使用返回Promise或者回调的接口 | +| 分布式软总线-rpc.RemoteProxy | sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption): Promise | 新增 | - | +| 分布式软总线-rpc.RemoteProxy | sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption, callback: AsyncCallback): void | 新增 | - | +| 分布式软总线-rpc.RemoteObject | sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption): boolean | 废弃 | 替换为异步接口,使用返回Promise或者回调的接口 | +| 分布式软总线-rpc.RemoteObject | sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption): Promise | 新增 | - | +| 分布式软总线-rpc.RemoteObject | sendRequest(code: number, data: MessageParcel, reply: MessageParcel, options: MessageOption, callback: AsyncCallback): void | 新增 | - | +| 分布式软总线-rpc.IRemoteObject | PING_TRANSACTION | 删除 | API 7没有实现,不影响已有应用 | +| 分布式软总线-rpc.IRemoteObject | DUMP_TRANSACTION | 删除 | API 7没有实现,不影响已有应用 | +| 分布式软总线-rpc.IRemoteObject | INTERFACE_TRANSACTION | 删除 | API 7没有实现,不影响已有应用 | +| 分布式软总线-rpc.IRemoteObject | MIN_TRANSACTION_ID | 删除 | API 7没有实现,不影响已有应用 | +| 分布式软总线-rpc.IRemoteObject | MAX_TRANSACTION_ID | 删除 | API 7没有实现,不影响已有应用 | +| 分布式软总线-rpc.Sequenceable | hasFileDescriptor(): boolean | 删除 | API 7可序列化对象定义的方法,rpc框架不会调用,不影响已有应用 | +| 分布式软总线-rpc.MessageOption | constructor(syncFlags?: number, waitTime = TF_WAIT_TIME) | 新增 | - | +| 分布式软总线-rpc.MessageOption | getFlags(): number | 新增 | - | +| 分布式软总线-rpc.MessageOption | setFlags(flags: number): void | 新增 | - | +| 分布式软总线-rpc.MessageOption | getWaitTime(): number | 新增 | - | +| 分布式软总线-rpc.MessageOption | setWaitTime(waitTime: number): void | 新增 | - | +| 分布式软总线-rpc.MessageOption | MAX_WAIT_TIME = 3000 | 删除 | API 7没有实现,不影响已有应用 | +| 分布式软总线-rpc.RemoteObject | constructor(descriptor: string) | 新增 | - | +| 分布式软总线-rpc.RemoteObject | queryLocalInterface(descriptor: string): IRemoteBroker | 修改 | API 7有误,返回类型更正为IRemoteBroker,不影响已有应用 | +| 分布式软总线-rpc.Proxy | PING_TRANSACTION | 新增 | - | +| 分布式软总线-rpc.Proxy | DUMP_TRANSACTION | 新增 | - | +| 分布式软总线-rpc.Proxy | INTERFACE_TRANSACTION | 新增 | - | +| 分布式软总线-rpc.Proxy | MIN_TRANSACTION_ID = 0x1 | 新增 | - | +| 分布式软总线-rpc.Proxy | MAX_TRANSACTION_ID = 0x00FFFFFF | 新增 | - | +| 分布式软总线-rpc.Proxy | queryLocalInterface(interface: string): IRemoteBroker | 修改 | API 7有误,返回类型更正为IRemoteBroker,不影响已有应用 | +| 分布式软总线-wifi | function getLinkedInfo(): Promise;
function getLinkedInfo(callback: AsyncCallback): void;| 新增 | - | +| 分布式软总线-wifi | function isConnected(): boolean;| 新增 | - | +| 分布式软总线-wifi | function getSupportedFeatures(): number;| 新增 | - | +| 分布式软总线-wifi | function isFeatureSupported(featureId: number): boolean;| 新增 | - | +| 分布式软总线-wifi | function getDeviceMacAddress(): string[];| 新增 | - | +| 分布式软总线-wifi | function getIpInfo(): IpInfo;| 新增 | - | +| 分布式软总线-wifi | function getCountryCode(): string;| 新增 | - | +| 分布式软总线-wifi | function reassociate(): boolean;| 新增 | - | +| 分布式软总线-wifi | function reconnect(): boolean;| 新增 | - | +| 分布式软总线-wifi | function getDeviceConfigs(): Array;| 新增 | - | +| 分布式软总线-wifi | function updateNetwork(config: WifiDeviceConfig): number;| 新增 | - | +| 分布式软总线-wifi | function disableNetwork(netId: number): boolean;| 新增 | - | +| 分布式软总线-wifi | function removeAllNetwork(): boolean;| 新增 | - | +| 分布式软总线-wifi | function removeDevice(id: number): boolean;| 新增 | - | +| 分布式软总线-wifi | function enableHotspot(): boolean;| 新增 | - | +| 分布式软总线-wifi | function disableHotspot(): boolean;| 新增 | - | +| 分布式软总线-wifi | function isHotspotActive(): boolean;| 新增 | - | +| 分布式软总线-wifi | function setHotspotConfig(config: HotspotConfig): boolean;| 新增 | - | +| 分布式软总线-wifi | function getHotspotConfig(): HotspotConfig;| 新增 | - | +| 分布式软总线-wifi | function getStations(): Array;| 新增 | - | +| 分布式软总线-wifi | function on(type: "wifiStateChange", callback: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function off(type: "wifiStateChange", callback?: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function on(type: "wifiConnectionChange", callback: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function off(type: "wifiConnectionChange", callback?: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function on(type: "wifiScanStateChange", callback: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function off(type: "wifiScanStateChange", callback?: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function on(type: "wifiRssiChange", callback: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function off(type: "wifiRssiChange", callback?: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function on(type: "hotspotStateChange", callback: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function off(type: "hotspotStateChange", callback?: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function on(type: "hotspotStaJoin", callback: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function off(type: "hotspotStaJoin", callback?: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function on(type: "hotspotStaLeave", callback: Callback): void;| 新增 | - | +| 分布式软总线-wifi | function off(type: "hotspotStaLeave", callback?: Callback): void;| 新增 | - | +| 全球化-resourceManager | getRawFile(path: string, callback: AsyncCallback);
getRawFile(path: string): Promise;| 新增 | - | +| 全球化-Intl | RelativeTimeFormat.constructor(); | 新增 | 构造函数 | +| 全球化-Intl | RelativeTimeFormat.constructor(locale: string \| Array, options?: RelativeTimeFormatInputOptions); | 新增 | 构造函数 | +| 全球化-Intl | RelativeTimeFormat.format(value: number, unit: string): string; | 新增 | 相对时间格式化 | +| 全球化-Intl | RelativeTimeFormat.formatToParts(value: number, unit: string): Array; | 新增 | 相对时间格式化,结果分为多部份分别存储 | +| 全球化-Intl | RelativeTimeFormat.formatToParts(value: number, unit: string): Array; | 新增 | 相对时间格式化,结果分为多部份分别存储 | +| 全球化-Intl | PluralRules.constructor(); | 新增 | 构造函数 | +| 全球化-Intl | PluralRules.constructor(locale: string \| Array, options?: PluralRulesOptions); | 新增 | 构造函数 | +| 全球化-Intl | PluralRules.select(n: number): string; | 新增 | 计算一个数字的单复数类别 | +| 全球化-Intl | Collator.constructor(); | 新增 | 构造函数 | +| 全球化-Intl | Collator.constructor(locale: string \| Array, options?: CollatorOptions); | 新增 | 构造函数 | +| 全球化-Intl | Collator.compare(first: string, second: string): number; | 新增 | 比较两个字符串 | +| 全球化-Intl | Collator.resolvedOptions(): CollatorOptions; | 新增 | 获取排序对象相关属性 | +| 全球化-I18N | function unitConvert(fromUnit: UnitInfo, toUnit: UnitInfo, value: **number**, locale: **string**, style?: **string**): **string**; | 新增 | 新增转换单位接口 | +| 全球化-I18N | function **constructor**(country: **string**, options?: PhoneNumberFormatOptions);
function isValidNumber(**number**: **string**): boolean;
function format(**number**: **string**): **string**; | 新增 | 新增电话号码格式化接口 | +| 全球化-I18N | function setTime(date: Date);
function setTime(time: **number**);
function **set**(year: **number**, month: **number**, date:**number**, hour?: **number**, minute?: **number**, second?: **number**);
function setTimeZone(timezone: **string**);
function getTimeZone(): **string**;
function getFirstDayOfWeek(): **number**;
function setFirstDayOfWeek(value: **number**);
function getMinimalDaysInFirstWeek(): **number**;
function setMinimalDaysInFirstWeek(value: **number**);
function **get**(field: **string**): **number**;
function getDisplayName(locale: **string**): **string**;
function isWeekend(date?: Date): boolean;
function **export** **function** getCalendar(locale: **string**, **type**?: **string**): Calendar; | 新增 | 新增日历接口 | +| 全球化-I18N | **function** isRTL(locale: **string**): boolean; | 新增 | 判断区域语言是否是从右到左语言 | +| 全球化-I18N | **function** getLineInstance(locale: **string**): BreakIterator;
function current(): **number**;
function first(): **number**;
function last(): **number**;
function next(index?: **number**): **number**;
function previous(): **number**;
function setLineBreakText(text: **string**): **void**;
function following(offset: **number**): **number**;
function getLineBreakText(): **string**;
function isBoundary(offset: **number**): boolean; | 新增 | 新增断词换行接口 | +| 全球化-I18N | function getInstance(locale?:**string**): IndexUtil;
function getIndexList(): Array<**string**>; | 新增 | 新增获取字母表索引接口 | +| 全球化-I18N | function addLocale(locale: **string**);
function getIndex(text: **string**): **string**;
function isDigit(char: **string**): boolean;
function isSpaceChar(char: **string**): boolean;
function isWhitespace(char: **string**): boolean;
function isRTL(char: **string**): boolean;
function isIdeograph(char: **string**): boolean;
function isLetter(char: **string**): boolean;
function isLowerCase(char: **string**): boolean;
function isUpperCase(char: **string**): boolean;
function getType(char: **string**): **string**; | 新增 | 新增获取字符属性接口 | +| 事件通知-DoNotDisturbDate | type: notification.DoNotDisturbType | 新增 | 免打扰设置的时间类型 | +| 事件通知-DoNotDisturbDate | begin: Date | 新增 | 免打扰设置的起点时间 | +| 事件通知-DoNotDisturbDate | end: Date | 新增 | 免打扰设置的终点时间 | +| 事件通知-DoNotDisturbDate | export enum DoNotDisturbType {
TYPE_NONE = 0, // 非通知勿扰类型
TYPE_ONCE = 1, // 以设置时间段一次执行勿扰
TYPE_DAILY = 2, // 以设置时间段(只看小时和分钟)每天执行勿扰
TYPE_CLEARLY = 3, // 以设置时间段(明确年月日时分)执行勿扰
} | 新增 | 免打扰时间类型 | +| 事件通知-notification | function setDoNotDisturbDate(date DoNotDisturbDate, callback: AsyncCallback): void | 新增 | 设置免打扰时间接口 | +| 事件通知-notification | function setDoNotDisturbDate(date DoNotDisturbDate): Promise | 新增 | 设置免打扰时间接口 | +| 事件通知-notification | function getDoNotDisturbDate(callback: AsyncCallback): void | 新增 | 查询免打扰时间接口 | +| 事件通知-notification | function getDoNotDisturbDate(): Promise | 新增 | 查询免打扰时间接口 | +| 事件通知-notification | function supportDoNotDisturbMode(callback: AsyncCallback): void | 新增 | 是否支持勿扰模式功能 | +| 事件通知-notification | function supportDoNotDisturbMode(): Promise | 新增 | 是否支持勿扰模式功能 | +| 事件通知-notification | function cancelGroup(groupName: string, callback: AsyncCallback): void | 新增 | 取消本应用指定组通知 | +| 事件通知-notification | function cancelGroup(groupName: string): Promise | 新增 | 取消本应用指定组通知 | +| 事件通知-notification | function removeGroupByBundle(bundle: BundleOption, groupName: string, callback: AsyncCallback): void | 新增 | 删除指定应用指定组通知 | +| 事件通知-notification | function removeGroupByBundle(bundle: BundleOption, groupName: string): Promise | 新增 | 删除指定应用指定组通知 | +| 事件通知-NotificationSubscriber | onDoNotDisturbDateChange?:(mode: notification.DoNotDisturbDate) => void | 新增 | 免打扰设置信息变更后的通知给订阅者 | +| 事件通知-NotificationRequest | smallIcon?: image.PixelMap | 新增 | 小图标 | +| 事件通知-NotificationRequest | largeIcon?: image.PixelMap; | 新增 | 大图标 | +| 事件通知-NotificationRequest | groupName?: string; | 新增 | 通知分组名称 | +| 事件通知-NotificationUserInput | | 新增 | 用户输入对象 | +| 事件通知-NotificationUserInput | inputKey: string | 新增 | 用户输入时用于标识此输入的key | +| 事件通知-NotificationActionButton | userInput?: NotificationUserInput | 新增 | 用户输入对象实例 | +| 事件通知-emitter | function on(event: InnerEvent, callback: Callback): void | 新增 | 持续订阅某个事件以及接收事件的回调处理 | +| 事件通知-emitter | function once(event: InnerEvent, callback: Callback): void | 新增 | 单次订阅某个事件以及接收事件的回调处理,接收到回调处理后自动取消订阅 | +| 事件通知-emitter | function off(eventId: number): void | 新增 | 取消订阅某个事件 | +| 事件通知-emitter | function emit(event: InnerEvent, data?: EventData): void | 新增 | 发送一个事件到事件队列 | +| 分布式文件-statfs | function getFreeBytes(path: string, callback: AsyncCallback): void | 新增 | 以callback形式异步获取设备剩余空间,单位为字节 | +| 分布式文件-statfs | function getFreeBytes(path: string): Promise | 新增 | 以promise形式异步获取设备剩余空间,单位为字节 | +| 分布式文件-statfs | function getTotalBytes(path: string, callback: AsyncCallback): void | 新增 | 以callback形式异步获取设备总空间,单位为字节 | +| 分布式文件-statfs | function getTotalBytes(path: string): Promise | 新增 | 以promise形式异步获取设备总空间,单位为字节 | +| 分布式任务调度-featureAbility | function continueAbility(options: ContinueAbilityOptions, callback: AsyncCallback): void;
function continueAbility(options: ContinueAbilityOptions): Promise; | 新增 | - | +| 语言编译运行时-URI | constructor(uri: string); | 新增 | | +| 语言编译运行时-URI | toString(): string | 新增 | | +| 语言编译运行时-URI | equals(other: URI): boolean; | 新增 | | +| 语言编译运行时-URI | checkIsAbsolute(): boolean; | 新增 | | +| 语言编译运行时-URI | normalize(): URI; | 新增 | | +| 语言编译运行时-URI | scheme: string; | 新增 | | +| 语言编译运行时-URI | userinfo: string; | 新增 | | +| 语言编译运行时-URI | host: string; | 新增 | | +| 语言编译运行时-URI | port: string; | 新增 | | +| 语言编译运行时-URI | path: string; | 新增 | | +| 语言编译运行时-URI | query: string; | 新增 | | +| 语言编译运行时-URI | query: string; | 新增 | | +| 语言编译运行时-URI | authority: string; | 新增 | | +| 语言编译运行时-URI | ssp: string; | 新增 | | +| 语言编译运行时-RationalNumber | constructor(numerator: number, denominator: number); | 新增 | | +| 语言编译运行时-RationalNumber | static createRationalFromString(rationalString: string): RationalNumber; | 新增 | | +| 语言编译运行时-RationalNumber | compareTo(another :RationalNumber): number; | 新增 | | +| 语言编译运行时-RationalNumber | equals(obj: Object): boolean; | 新增 | | +| 语言编译运行时-RationalNumber | valueOf(): number; | 新增 | | +| 语言编译运行时-RationalNumber | static getCommonDivisor(number1: number, number2: number): number; | 新增 | | +| 语言编译运行时-RationalNumber | getDenominator(): number; | 新增 | | +| 语言编译运行时-RationalNumber | getNumerator(): number; | 新增 | | +| 语言编译运行时-RationalNumber | isFinite() : boolean; | 新增 | | +| 语言编译运行时-RationalNumber | isNaN(): boolean; | 新增 | | +| 语言编译运行时-RationalNumber | isZero(): boolean; | 新增 | | +| 语言编译运行时-RationalNumber | toString(): string; | 新增 | | +| 语言编译运行时-LruBuffer | constructor(capacity?:number); | 新增 | | +| 语言编译运行时-LruBuffer | updateCapacity(newCapacity: number):void | 新增 | | +| 语言编译运行时-LruBuffer | toString():string | 新增 | | +| 语言编译运行时-LruBuffer | length:number | 新增 | | +| 语言编译运行时-LruBuffer | getCapacity(): number; | 新增 | | +| 语言编译运行时-LruBuffer | clear(): void; | 新增 | | +| 语言编译运行时-LruBuffer | getCreateCount(): number; | 新增 | | +| 语言编译运行时-LruBuffer | getMissCount(): number; | 新增 | | +| 语言编译运行时-LruBuffer | getRemovalCount(): number; | 新增 | | +| 语言编译运行时-LruBuffer | getMatchCount(): number; | 新增 | | +| 语言编译运行时-LruBuffer | getPutCount(): number; | 新增 | | +| 语言编译运行时-LruBuffer | isEmpty(): boolean; | 新增 | | +| 语言编译运行时-LruBuffer | get(key: K): V \| undefined; | 新增 | | +| 语言编译运行时-LruBuffer | put(key: K, value: V): V; | 新增 | | +| 语言编译运行时-LruBuffer | values(): V[]; | 新增 | | +| 语言编译运行时-LruBuffer | keys(): K[]; | 新增 | | +| 语言编译运行时-LruBuffer | remove(key: K): V \| undefined; | 新增 | | +| 语言编译运行时-LruBuffer | afterRemoval(isEvict: boolean, key: K, value: V, newValue: V): void; | 新增 | | +| 语言编译运行时-LruBuffer | contains(key: K): boolean; | 新增 | | +| 语言编译运行时-LruBuffer | createDefault(key: K): V; | 新增 | | +| 语言编译运行时-LruBuffer | entries(): IterableIterator<[K, V]>; | 新增 | | +| 语言编译运行时-LruBuffer | [Symbol.iterator](): IterableIterator<[K, V]>; | 新增 | | +| 语言编译运行时-Scope | constructor(lowerObj: ScopeType, upperObj: ScopeType); | 新增 | | +| 语言编译运行时-Scope | toString(): string; | 新增 | | +| 语言编译运行时-Scope | intersect(range: Scope): Scope; | 新增 | | +| 语言编译运行时-Scope | intersect(lowerObj: ScopeType, upperObj: ScopeType): Scope; | 新增 | | +| 语言编译运行时-Scope | getUpper(): ScopeType; | 新增 | | +| 语言编译运行时-Scope | getLower(): ScopeType; | 新增 | | +| 语言编译运行时-Scope | expand(lowerObj: ScopeType, upperObj: ScopeType): Scope; | 新增 | | +| 语言编译运行时-Scope | expand(range: Scope): Scope; | 新增 | | +| 语言编译运行时-Scope | expand(value: ScopeType): Scope; | 新增 | | +| 语言编译运行时-Scope | contains(value: ScopeType): boolean; | 新增 | | +| 语言编译运行时-Scope | contains(range: Scope): boolean; | 新增 | | +| 语言编译运行时-Scope | clamp(value: ScopeType): ScopeType; | 新增 | | +| 语言编译运行时-Base64 | constructor(); | 新增 | | +| 语言编译运行时-Base64 | encodeSync(src: Uint8Array): Uint8Array; | 新增 | | +| 语言编译运行时-Base64 | encodeToStringSync(src: Uint8Array): string; | 新增 | | +| 语言编译运行时-Base64 | decodeSync(src: Uint8Array \| string): Uint8Array; | 新增 | | +| 语言编译运行时-Base64 | encode(src: Uint8Array): Promise; | 新增 | | +| 语言编译运行时-Base64 | encodeToString(src: Uint8Array): Promise; | 新增 | | +| 语言编译运行时-Base64 | decode(src: Uint8Array \| string): Promise; | 新增 | | +| 语言编译运行时-types | constructor(); | 新增 | | +| 语言编译运行时-types | isAnyArrayBuffer(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isArrayBufferView(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isArgumentsObject(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isArrayBuffer(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isAsyncFunction(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isBigInt64Array(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isBigUint64Array(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isBooleanObject(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isBoxedPrimitive(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isDataView(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isDate(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isExternal(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isFloat32Array(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isFloat64Array(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isGeneratorFunction(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isGeneratorObject(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isInt8Array(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isInt16Array(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isInt32Array(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isMap(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isMapIterator(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isModuleNamespaceObject(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isNativeError(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isNumberObject(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isPromise(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isProxy(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isRegExp(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isSet(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isSetIterator(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isSharedArrayBuffer(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isStringObject(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isSymbolObject(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isTypedArray(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isUint8Array(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isUint8ClampedArray(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isUint16Array(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isUint32Array(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isWeakMap(value: Object): boolean; | 新增 | | +| 语言编译运行时-types | isWeakSet(value: Object): boolean; | 新增 | | +| 语言编译运行时-process | const tid: number; | 新增 | | +| 语言编译运行时-process | function isIsolatedProcess(): boolean; | 新增 | | +| 语言编译运行时-process | function isAppUid(v: number): boolean; | 新增 | | +| 语言编译运行时-process | function is64Bit(): boolean; | 新增 | | +| 语言编译运行时-process | function getUidForName(v: string): number; | 新增 | | +| 语言编译运行时-process | function getThreadPriority(v: number): number; | 新增 | | +| 语言编译运行时-process | function getStartRealtime(): number; | 新增 | | +| 语言编译运行时-process | function getAvailableCores(): number[]; | 新增 | | +| 语言编译运行时-process | function getPastCpuTime(): number; | 新增 | | +| 语言编译运行时-process | function getSystemConfig(name: number): number; | 新增 | | +| 语言编译运行时-process | function getEnvironmentVar(name: string): string; | 新增 | | +| 语言编译运行时-ConvertOptions | trim: boolean; | 新增 | | +| 语言编译运行时-ConvertOptions | ignoreDeclaration?: boolean; | 新增 | | +| 语言编译运行时-ConvertOptions | ignoreInstruction?: boolean; | 新增 | | +| 语言编译运行时-ConvertOptions | ignoreAttributes?: boolean; | 新增 | | +| 语言编译运行时-ConvertOptions | ignoreComment?: boolean; | 新增 | | +| 语言编译运行时-ConvertOptions | ignoreCdata?: boolean; | 新增 | | +| 语言编译运行时-ConvertOptions | ignoreDoctype?: boolean; | 新增 | | +| 语言编译运行时-ConvertOptions | ignoreText?: boolean; | 新增 | | +| 语言编译运行时-ConvertOptions | declarationKey: string; | 新增 | | +| 语言编译运行时-ConvertOptions | instructionKey: string; | 新增 | | +| 语言编译运行时-ConvertOptions | attributesKey: string; | 新增 | | +| 语言编译运行时-ConvertOptions | textKey: string; | 新增 | | +| 语言编译运行时-ConvertOptions | cdataKey: string; | 新增 | | +| 语言编译运行时-ConvertOptions | doctypeKey: string; | 新增 | | +| 语言编译运行时-ConvertOptions | commentKey: string; | 新增 | | +| 语言编译运行时-ConvertOptions | parentKey: string; | 新增 | | +| 语言编译运行时-ConvertOptions | typeKey: string; | 新增 | | +| 语言编译运行时-ConvertOptions | nameKey: string; | 新增 | | +| 语言编译运行时-ConvertOptions | elementsKey: string; | 新增 | | +| 语言编译运行时-ConvertXML | convert(xml: string, options?: ConvertOptions) : Object; | 新增 | | +| 语言编译运行时-XmlSerializer | constructor(buffer: ArrayBuffer \| DataView, encoding?: string); | 新增 | | +| 语言编译运行时-XmlSerializer | setAttributes(name: string, value: string): void; | 新增 | | +| 语言编译运行时-XmlSerializer | addEmptyElement(name: string): void; | 新增 | | +| 语言编译运行时-XmlSerializer | setDeclaration(): void; | 新增 | | +| 语言编译运行时-XmlSerializer | startElement(name: string): void; | 新增 | | +| 语言编译运行时-XmlSerializer | endElement(): void; | 新增 | | +| 语言编译运行时-XmlSerializer | setNamespace(prefix: string, namespace: string): void; | 新增 | | +| 语言编译运行时-XmlSerializer | setCommnet(text: string): void; | 新增 | | +| 语言编译运行时-XmlSerializer | setCData(text: string): void; | 新增 | | +| 语言编译运行时-XmlSerializer | setText(text: string): void; | 新增 | | +| 语言编译运行时-XmlSerializer | setDocType(text: string): void; | 新增 | | +| 语言编译运行时-ParseOptions | supportDoctype?: boolean; | 新增 | | +| 语言编译运行时-ParseOptions | ignoreNameSpace?: boolean; | 新增 | | +| 语言编译运行时-ParseOptions | tagValueCallbackFunction?: (name: string, value: string) => boolean; | 新增 | | +| 语言编译运行时-ParseOptions | attributeValueCallbackFunction?: (name: string, value: string) => boolean; | 新增 | | +| 语言编译运行时-ParseOptions | tokenValueCallbackFunction?: (eventType: EventType, value: ParseInfo) => boolean; | 新增 | | +| 帐号-account.appAccount | createAppAccountManager | 新增 | 获取实例 | +| 帐号-account.appAccount | addAccount(name: string, callback: AsyncCallback): void;
addAccount(name: string, extraInfo: string, callback: AsyncCallback): void;
addAccount(name: string, extraInfo?: string): Promise; | 新增 | 添加应用帐户 | +| 帐号-account.appAccount | deleteAccount(name: string, callback: AsyncCallback): void;
deleteAccount(name: string): Promise; | 新增 | 删除应用帐户 | +| 帐号-account.appAccount | disableAppAccess(name: string, bundleName: string, callback: AsyncCallback): void;
disableAppAccess(name: string, bundleName: string): Promise; | 新增 | 使指定的package拒绝访问给定的应用帐号 | +| 帐号-account.appAccount | enableAppAccess(name: string, bundleName: string, callback: AsyncCallback): void;
enableAppAccess(name: string, bundleName: string): Promise; | 新增 | 使指定的package允许访问给定的应用帐号 | +| 帐号-account.appAccount | checkAppAccountSyncEnable(name: string, callback: AsyncCallback): void;
checkAppAccountSyncEnable(name: string): Promise; | 新增 | 检查指定的应用帐号是否允许应用程序同步数据 | +| 帐号-account.appAccount | setAccountCredential(name: string, credentialType: string, credential: string,
callback: AsyncCallback): void;
setAccountCredential(name: string, credentialType: string, credential: string): Promise; | 新增 | 设置指定应用程序帐号的认证凭据 | +| 帐号-account.appAccount | setAccountExtraInfo(name: string, extraInfo: string, callback: AsyncCallback): void;
setAccountExtraInfo(name: string, extraInfo: string): Promise; | 新增 | 设置指定应用帐号的附加信息 | +| 帐号-account.appAccount | setAppAccountSyncEnable(name: string, isEnable: boolean, callback: AsyncCallback): void;
setAppAccountSyncEnable(name: string, isEnable: boolean): Promise; | 新增 | 设置指定的应用程序帐号是否允许应用程序同步数据 | +| 帐号-account.appAccount | setAssociatedData(name: string, key: string, value: string, callback: AsyncCallback): void;
setAssociatedData(name: string, key: string, value: string): Promise; | 新增 | 设置应用帐号关联信息 | +| 帐号-account.appAccount | getAllAccessibleAccounts(callback: AsyncCallback>): void;
getAllAccessibleAccounts(): Promise>; | 新增 | 获取本应用帐号信息和已授权给本应用的第三方应用帐号的信息 | +| 帐号-account.appAccount | getAllAccounts(owner: string, callback: AsyncCallback>): void;
getAllAccounts(owner: string): Promise>; | 新增 | 获取执行应用下全部帐号信息 | +| 帐号-account.appAccount | getAccountCredential(name: string, credentialType: string, callback: AsyncCallback): void;
getAccountCredential(name: string, credentialType: string): Promise; | 新增 | 获取指定应用程序帐号的认证凭据 | +| 帐号-account.appAccount | getAccountExtraInfo(name: string, callback: AsyncCallback): void;
getAccountExtraInfo(name: string): Promise; | 新增 | 获取应用帐号附加信息 | +| 帐号-account.appAccount | getAssociatedData(name: string, key: string, callback: AsyncCallback): void;
getAssociatedData(name: string, key: string): Promise; | 新增 | 获取应用帐号关联信息 | +| 帐号-account.appAccount| on(type: 'change', owners: Array, callback: Callback>): void; | 新增 | 订阅指定应用帐号的更改事件 | +| 帐号-account.appAccount | off(type: 'change', callback?: Callback): void; | 新增 | 取消订阅应用帐号的更改事件 | +| 帐号-account.appAccount | interface AppAccountInfo | 新增 | 应用帐号信息 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_ACCELEROMETER, callback: AsyncCallback,options?: Options): void | 新增 | 监听加速度传感器的数据变化 | +| 泛Sensor服务-sensor | on(type:SensorType.SENSOR_TYPE_ID_LINEAR_ACCELERATION,callback:AsyncCallback, options?: Options): void | 新增 | 监听线性加速度传感器的数据变化 | +| 泛Sensor服务-sensor | on(type:SensorType.SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED,callback:AsyncCallback, options?: Options): void | 新增 | 监听未校准加速度计传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_GRAVITY, callback: AsyncCallback,options?: Options): void | 新增 | 监听重力传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_GYROSCOPE, callback: AsyncCallback, options?: Options): void | 新增 | 监听陀螺仪传感器的数据变化 | +| 泛Sensor服务-sensor | on(type:SensorType.SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED,callback:AsyncCallback, options?: Options): void | 新增 | 监听未校准陀螺仪传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_SIGNIFICANT_MOTION, callback: AsyncCallback, options?: Options): void | 新增 | 监听大幅动作传感器数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_PEDOMETER_DETECTION, callback: AsyncCallback, options?: Options): void | 新增 | 监听计步检测传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_PEDOMETER, callback: AsyncCallback, options?: Options): void | 新增 | 监听计步传感器的数据变化 | +| 泛Sensor服务-sensor | on(type:SensorType.SENSOR_TYPE_ID_AMBIENT_TEMPERATURE,callback:AsyncCallback, options?: Options): void | 新增 | 监听环境温度传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD, callback: AsyncCallback,options?: Options): void | 新增 | 监听磁场传感器的数据变化 | +| 泛Sensor服务-sensor | on(type:SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED,callback:AsyncCallback, options: Options): void | 新增 | 监听未校准磁场传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_PROXIMITY, callback: AsyncCallback,options?: Options): void | 新增 | 监听接近光传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_HUMIDITY, callback: AsyncCallback,options?: Options): void | 新增 | 监听湿度传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_BAROMETER, callback: AsyncCallback,options?: Options): void | 新增 | 监听气压计传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_HALL, callback: AsyncCallback, options?: Options): void | 新增 | 监听霍尔传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_AMBIENT_LIGHT, callback: AsyncCallback, options?: Options): void | 新增 | 监听环境光传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_ORIENTATION, callback: AsyncCallback, options?: Options): void | 新增 | 监听方向传感器的数据变化 | +| 泛Sensor服务-sensor | on(type:SensorType.SENSOR_TYPE_ID_ROTATION_VECTOR,callback:AsyncCallback,options?: Options): void | 新增 | 监听旋转矢量传感器的数据变化 | +| 泛Sensor服务-sensor | on(type: SensorType.SENSOR_TYPE_ID_WEAR_DETECTION, callback: AsyncCallback,options?: Options): void | 新增 | 监听佩戴检测传感器的数据变化 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_ACCELEROMETER, callback: AsyncCallback): void | 新增 | 监听加速度传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type:SensorType.SENSOR_TYPE_ID_LINEAR_ACCELERATION,callback:AsyncCallback): void | 新增 | 监听线性加速度传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type:SensorType.SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED,callback:AsyncCallback): void | 新增 | 监听未校准加速度计传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_GRAVITY, callback: AsyncCallback): void | 新增 | 监听重力传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_GYROSCOPE, callback: AsyncCallback): void | 新增 | 监听陀螺仪传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type:SensorType.SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED,callback:AsyncCallback, options?: Options): void | 新增 | 监听未校准陀螺仪传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_SIGNIFICANT_MOTION, callback: AsyncCallback): void | 新增 | 监听大幅动作传感器数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_PEDOMETER_DETECTION, callback: AsyncCallback): void | 新增 | 监听计步检测传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_PEDOMETER, callback: AsyncCallback): void | 新增 | 监听计步传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type:SensorType.SENSOR_TYPE_ID_AMBIENT_TEMPERATURE,callback:AsyncCallback): void | 新增 | 监听环境温度传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD, callback: AsyncCallback): void | 新增 | 监听磁场传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type:SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED,callback:AsyncCallback): void | 新增 | 监听未校准磁场传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_PROXIMITY, callback: AsyncCallback): void | 新增 | 监听接近光传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_HUMIDITY, callback: AsyncCallback): void | 新增 | 监听湿度传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_BAROMETER, callback: AsyncCallback): void | 新增 | 监听气压计传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_HALL, callback: AsyncCallback): void | 新增 | 监听霍尔传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_AMBIENT_LIGHT, callback: AsyncCallback): void | 新增 | 监听环境光传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_ORIENTATION, callback: AsyncCallback): void | 新增 | 监听方向传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type:SensorType.SENSOR_TYPE_ID_ROTATION_VECTOR,callback:AsyncCallback): void | 新增 | 监听旋转矢量传感器的数据变化一次 | +| 泛Sensor服务-sensor | once(type: SensorType.SENSOR_TYPE_ID_WEAR_DETECTION, callback: AsyncCallback): void | 新增 | 监听佩戴检测传感器的数据变化一次 | +| 泛Sensor服务-sensor | off(type: SensorType, callback?: AsyncCallback): void | 新增 | 取消订阅传感器数据 | +| 泛Sensor服务-sensor | getGeomagneticField(locationOptions: LocationOptions, timeMillis: number, callback: AsyncCallback): void
getGeomagneticField(locationOptions: LocationOptions, timeMillis: number): Promise | 新增 | 获取地球上特定位置的地磁场 | +| 泛Sensor服务-vibrator | vibrate(duration: number): Promise
vibrate(duration: number, callback?: AsyncCallback): void | 新增 | 按照指定持续时间触发马达振动 | +| 泛Sensor服务-vibrator | vibrate(effectId: EffectId): Promise
vibrate(effectId: EffectId, callback?: AsyncCallback): void | 新增 | 按照指定振动效果触发马达振动 | +| 泛Sensor服务-vibrator | stop(stopMode: VibratorStopMode): Promise
stop(stopMode: VibratorStopMode, callback?: AsyncCallback): void | 新增 | 停止马达振动 | diff --git a/zh-cn/release-notes/api-change/v3.1-beta/native-apidiff-v3.1-beta.md b/zh-cn/release-notes/api-change/v3.1-beta/native-apidiff-v3.1-beta.md new file mode 100644 index 0000000000..822ece2814 --- /dev/null +++ b/zh-cn/release-notes/api-change/v3.1-beta/native-apidiff-v3.1-beta.md @@ -0,0 +1,16 @@ +# Native API 差异报告 + +OpenHarmony 3.1 Beta相较于OpenHarmony 3.0 LTS版本的API变更如下: + +## 标准系统接口变更 + +| 模块名称 | 接口名称 | 变更类型 | 变更类型 | +| ------------------ | ------------------------------------------------------------ | -------- | ------------------------------------------------- | +| bundle | napi_value ClearBundleCache(napi_env env, napi_callback_info info) | 新增 | 新增清理应用缓存接口 | +| bundle | napi_value SetApplicationEnabled(napi_env env, napi_callback_info info) | 新增 | 新增设置应用使能接口 | +| bundle | napi_value SetAbilityEnabled(napi_env env, napi_callback_info info) | 新增 | 新增设置ability使能接口 | +| innerbundlemanager | napi_value JSGetLauncherAbilityInfos(napi_env env, napi_callback_info info) | 新增 | 新增通过包名获取应用LauncherAbility接口 | +| innerbundlemanager | napi_value JSLauncherServiceOn(napi_env env, napi_callback_info info) | 新增 | 新增注册监听包状态变化接口 | +| innerbundlemanager | napi_value JSLauncherServiceOff(napi_env env, napi_callback_info info) | 新增 | 新增注销监听包状态变化接口 | +| innerbundlemanager | napi_value JSGetAllLauncherAbilityInfos(napi_env env, napi_callback_info info) | 新增 | 新增通过userId获取所有launcher上应用的ability接口 | +| innerbundlemanager | napi_value JSGetShortcutInfos(napi_env env, napi_callback_info info) | 新增 | 新增通过bundleName获取应用的shortcutInfo接口 | \ No newline at end of file -- GitLab