| + | ++ | ++ | +
|---|---|---|
| + | ++ | ++ | +
| + | ++ | +|
| + | ++ | +|
| + | ++ | +|
| + | ++ | ++ | +
| + | ++ | +|
| + | ++ | +
| + | ++ | ++ | ++ | ++ | +
|---|---|---|---|---|
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | ++ | ++ | ++ | +
|---|---|---|---|---|
| + | ++ | ++ | ++ | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | ++ | ++ | ++ | +
|---|---|---|---|---|
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | ++ | ++ | +
|---|---|---|---|
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | ++ | ++ | +
|---|---|---|---|
| + | ++ + | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | ++ | ++ | +
|---|---|---|---|
| + | +cntlr: 结构体指针,核心层spi控制器;msg: 结构体指针,Spi消息;count: uint32_t,消息个数 + |
++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | ++ | ++ | ++ | +
|---|---|---|---|---|
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| 功能分类 | +接口名 | +描述 | +
| PWM句柄操作 | +PwmOpen | +获取PWM设备驱动句柄 | +
| PwmClose | +释放PWM设备驱动句柄 | +|
| 使能/禁用PWM | +PwmEnable | +使能PWM | +
| PwmDisable | +禁用PWM | +|
| PWM配置操作 | +PwmSetPeriod | +设置PWM周期 | +
| PwmSetDuty | +设置PWM占空时间 | +|
| PwmSetPolarity | +设置PWM极性 | +|
| 设置/获取PWM配置信息 | +PwmSetConfig | +设置PWM设备参数 | +
| PwmGetConfig | +获取PWM设备参数 | +
int32_t SetBatch(int64_t samplingInterval, int64_t reportInterval)
@@ -261,23 +258,21 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考表3 接口实现参考[SENSOR](#section257750691)章节。 -## 开发指导 +## 开发步骤 Sensor驱动是基于HDF框架、PLATFORM和OSAL基础接口进行开发,不区分操作系统和芯片平台,为不同Sensor器件提供统一的驱动模型。本篇开发指导以加速度计传感器为例,介绍传感器驱动开发。 -### 开发步骤 - 1. 加速度计传感器驱动注册。HDF驱动框架会提供统一的驱动管理模型,通过加速计传感器模块配置信息,识别并加载对应模块驱动。 2. 加速度计传感器驱动初始化和去初始化。HDF驱动框架通过init入口函数,依次启动传感器设备驱动加载和分配传感器设备数据配置资源。HDF驱动框架通过release函数,释放驱动加载的资源和配置。 3. 加速度计传感器寄存器组配置解析。不同类型传感器需要在hcs里配置器件对应的HCS配置文件,然后再设备驱动启动过程中探测器件是否在位,然后加载对应的配置文件,生成配置的结构体对象。 4. 加速度计传感器驱动操作接口实现。实现各个类型传感器归一化驱动接口,如init,GetInfo,Enable,Disable,SetBatch,SetMode,SetOption,ReadSensorData等函数,完成传感器驱动配置下发和数据上报功能。 -> **说明:** +> **说明:** >传感器驱动模型已经提供一部分能力集,包括驱动设备管理能力,抽象总线和平台操作接口能力,通用配置操作接口能力,配置解析操作接口能力,接口参考[表2](#table1156812588320)。需要开发人员实现部分有:1、传感器部分操作接口([表3](#table1083014911336));2、传感器HCS差异化数据配置;3、驱动基本功能验证。 ## 开发实例 -基于HDF驱动模型,加载启动加速度计传感器驱动,代码形式如下,具体原理可参考[HDF驱动开发指南](/pages/00030001)。加速度传感器选择通讯接口方式为I2C,厂家选择博世BMI160加速度传感器。 +基于HDF驱动模型,加载启动加速度计传感器驱动,代码形式如下,具体原理可参考[HDF驱动开发指南](/pages/0004010001)。加速度传感器选择通讯接口方式为I2C,厂家选择博世BMI160加速度传感器。 1. 加速度计传感器驱动入口注册 @@ -299,7 +294,7 @@ HDF_INIT(g_sensorAccelDevEntry); - 加速度计传感器设备配置描述 -加速度传感器模型使用HCS作为配置描述源码,HCS配置字段详细介绍参考[配置管理](/pages/00030004)介绍。 +加速度传感器模型使用HCS作为配置描述源码,HCS配置字段详细介绍参考[配置管理](/pages/0004010004)介绍。 ``` /* 加速度计传感器设备HCS配置 */ diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" index 4d576a7cedb77232e18a5a5d40f2aef92d8b4273..7d5aa11efce5d5b06d66a4fbe34f426182141a5d 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" @@ -1,6 +1,6 @@ --- title: WLAN -permalink: /pages/00030303 +permalink: /pages/0004010303 navbar: true sidebar: true prev: true @@ -9,31 +9,27 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # WLAN - [概述](#section729758162218) - [WLAN驱动接口架构](#section178022416377) - - [接口说明](#section149681312202415) - -- [开发指导](#section15957746172412) - - [开发步骤](#section11776186132513) +- [接口说明](#section7331102018815) +- [开发步骤](#section15957746172412) - [开发实例](#section1395253612512) ## 概述 -WLAN是基于HDF(Hardware Driver Foundation)驱动框架开发的模块,该模块可实现跨操作系统迁移,自适应器件差异,模块化拼装编译等功能。各WLAN厂商驱动开发人员可根据WLAN模块提供的向下统一接口适配各自的驱动代码,实现如下能力:建立/关闭WLAN热点、扫描、关联WLAN热点等;对HDI层向上提供能力如下:设置MAC地址、设置发射功率、获取设备的MAC地址等。[WLAN模块框架图](#fig967034316227)如下: - -**图 1** WLAN框架 - +WLAN是基于HDF(Hardware Driver Foundation)驱动框架开发的模块,该模块可实现跨操作系统迁移,自适应器件差异,模块化拼装编译等功能。各WLAN厂商驱动开发人员可根据WLAN模块提供的向下统一接口适配各自的驱动代码,实现如下能力:建立/关闭WLAN热点、扫描、关联WLAN热点等;对HDI层向上提供能力如下:设置MAC地址、设置发射功率、获取设备的MAC地址等。[WLAN模块框架图](#fig4415112614415)如下: - +**图 1** WLAN框架 + ### WLAN驱动接口架构 -WLAN模块有三部分对外开放的API接口,如[下图2](#fig15016395217)所示: +WLAN模块有三部分对外开放的API接口,如[下图2](#fig1492411431166)所示: 1. 对HDI层提供的能力接口。 @@ -41,12 +37,10 @@ WLAN模块有三部分对外开放的API接口,如[下图2](#fig15016395217) 3. 提供给各厂商实现的能力接口。 -**图 2** WLAN模块开放能力分布图 +**图 2** WLAN模块开放能力分布图 + - - - -### 接口说明 +## 接口说明 WLAN驱动模块提供给驱动开发人员可直接调用的能力接口,主要功能有:创建/释放WifiModule、关联/取消关联、申请/释放NetBuf、lwip的pbuf和NetBuf的相互转换等。提供的部分接口说明如[表1](#table1521573319472)所示: @@ -245,12 +239,10 @@ WLAN驱动模块对HDI层提供的能力接口,主要功能有:创建/销毁 -## 开发指导 +## 开发步骤 WLAN驱动基于HDF框架和PLATFORM框架开发,不区分OS和芯片平台,为不同厂商的WLAN模组提供统一的驱动模型,各WLAN模组厂商根据如下指导适配WLAN驱动框架。 -### 开发步骤 - 1. 通过wifi\_config.hcs文件,配置硬件参数:module\(不同feature\),芯片等。 2. 解析配置文件, 生成全量配置的结构体对象。 3. Module初始化,创建Module。 @@ -258,7 +250,7 @@ WLAN驱动基于HDF框架和PLATFORM框架开发,不区分OS和芯片平台, 5. 总线初始化。 6. 上层wpa业务挂接。 -> **说明:** +> **说明:** >以上驱动框架适配步骤一部分已经提供(详细见开发实例),待开发人员实现的部分有:1、根据硬件,修改配置参数;2、适配挂接chip;3、测试自验证。 ## 开发实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/05.USB.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/05.USB.md" new file mode 100644 index 0000000000000000000000000000000000000000..667528c594effafd99a48ab767ef3fca4ee9d239 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/05.USB.md" @@ -0,0 +1,1564 @@ +--- +title: USB +permalink: /pages/0004010304 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:32 +--- +# USB + +- [概述](#section127mcpsimp) + - [接口说明](#section141mcpsimp) + +- [开发指导](#section581mcpsimp) + - [Host DDK API驱动开发步骤](#section584mcpsimp) + - [Host RAW API驱动开发步骤](#section594mcpsimp) + - [Device DDK API驱动开发步骤](#section600mcpsimp) + +- [开发实例](#section607mcpsimp) + - [Host DDK API驱动开发](#section609mcpsimp) + - [Host RAW API驱动开发](#section612mcpsimp) + - [Device DDK API驱动开发](#section615mcpsimp) + + +## 概述 + +USB Host部分,主要包括协议封装、设备管理、驱动安装与卸载等。 + +USB Device部分,支持USB功能设备的开发,提供USB设备相关功能,主要包括设备管理、配置管理、IO管理,实现USB功能设备创建、配置、数据通信等。 + +USB Host驱动模型如下图1所示: + +**图 1** USB Host驱动模型图 + + +**图 2** USB Device驱动模型图 + + +USB驱动模型对外开放的API接口能力如下: + +- Usb Host DDK提供给用户态可直接调用的驱动能力接口,按照功能分类三大类:DDK初始化类、对interface对象操作类、对request对象操作类,可以提供DDK初始化、interface绑定和释放,打开和关闭操作,request的申请和释放,同步和异步传输等。 +- Usb Deivce DDK提供设备管理、IO管理、配置管理,主要功能有:创建和删除设备、获取和打开接口、同步和异步传输等。 + +### 接口说明 + +USB驱动模型Host侧开放的API接口功能,参考[图1](#fig1649563542917)。 + +**表 1** USB驱动模型Host侧开放的API接口功能介绍 + + +| + | ++ | ++ | +
|---|---|---|
| + | ++ | ++ | +
| + | ++ | +|
const struct UsbInterface *UsbClaimInterface(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr, uint8_t interfaceIndex); + |
++ | +|
int UsbReleaseInterface(const struct UsbInterface *interfaceObj); + |
++ | +|
int UsbAddOrRemoveInterface(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr, uint8_t interfaceIndex, UsbInterfaceStatus status); + |
++ | +|
UsbInterfaceHandle *UsbOpenInterface(const struct UsbInterface *interfaceObj); + |
++ | +|
int32_t UsbCloseInterface(const UsbInterfaceHandle *interfaceHandle); + |
++ | +|
int32_t UsbSelectInterfaceSetting(const UsbInterfaceHandle *interfaceHandle, uint8_t settingIndex, struct UsbInterface **interfaceObj); + |
++ | +|
int32_t UsbGetPipeInfo(const UsbInterfaceHandle *interfaceHandle, uint8_t settingIndex, uint8_t pipeId, struct UsbPipeInfo *pipeInfo); + |
++ | +|
int32_t UsbClearInterfaceHalt(const UsbInterfaceHandle *interfaceHandle, uint8_t pipeAddress); + |
++ | +|
struct UsbRequest *UsbAllocRequest(const UsbInterfaceHandle *interfaceHandle, int isoPackets, int length); + |
++ | +|
| + | ++ | +|
int UsbSubmitRequestAsync(const struct UsbRequest *request); + |
++ | +|
int32_t UsbFillRequest(const struct UsbRequest *request, const UsbInterfaceHandle *interfaceHandle, const struct UsbRequestParams *params); + |
++ | +|
| + | ++ | +|
| + | ++ | +|
| + | ++ | ++ | +
| + | ++ | +|
UsbRawHandle *UsbRawOpenDevice(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr); + |
++ | +|
| + | ++ | +|
int UsbRawSendControlRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbControlRequestData *requestData); + |
++ | +|
int UsbRawSendBulkRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRequestData *requestData); + |
++ | +|
int UsbRawSendInterruptRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRequestData *requestData); + |
++ | +|
int UsbRawGetConfigDescriptor(const UsbRawDevice *rawDev, uint8_t configIndex, struct UsbRawConfigDescriptor **config); + |
++ | +|
void UsbRawFreeConfigDescriptor(const struct UsbRawConfigDescriptor *config); + |
++ | +|
int UsbRawGetConfiguration(const UsbRawHandle *devHandle, int *config); + |
++ | +|
int UsbRawSetConfiguration(const UsbRawHandle *devHandle, int config); + |
++ | +|
int UsbRawGetDescriptor(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawDescriptorParam *param, const unsigned char *data); + |
++ | +|
UsbRawDevice *UsbRawGetDevice(const UsbRawHandle *devHandle); + |
++ | +|
int UsbRawGetDeviceDescriptor(const UsbRawDevice *rawDev, struct UsbDeviceDescriptor *desc); + |
++ | +|
int UsbRawClaimInterface(const UsbRawHandle *devHandle, int interfaceNumber); + |
++ | +|
int UsbRawReleaseInterface(const UsbRawHandle *devHandle, int interfaceNumber); + |
++ | +|
| + | ++ | +|
struct UsbRawRequest *UsbRawAllocRequest(const UsbRawHandle *devHandle, int isoPackets, int length); + |
++ | +|
| + | ++ | +|
int UsbRawFillBulkRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData); + |
++ | +|
int UsbRawFillControlSetup(const unsigned char *setup, const struct UsbControlRequestData *requestData); + |
++ | +|
int UsbRawFillControlRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData); + |
++ | +|
int UsbRawFillInterruptRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData); + |
++ | +|
int UsbRawFillIsoRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData); + |
++ | +|
int UsbRawSubmitRequest(const struct UsbRawRequest *request); + |
++ | +|
int UsbRawCancelRequest(const struct UsbRawRequest *request); + |
++ | +|
| + | ++ | +
| + | ++ | ++ | +
|---|---|---|
| + | +const struct UsbFnDevice *UsbFnCreateDevice(const char *udcName, const struct UsbFnDescriptorData *descriptor); + |
++ | +
| + | ++ | +|
const struct UsbFnDevice *UsbFnGetDevice(const char *udcName); + |
++ | +|
| + | +int UsbFnStartRecvInterfaceEvent(struct UsbFnInterface *interface, uint32_t eventMask, UsbFnEventCallback callback, void *context); + |
++ | +
int UsbFnStopRecvInterfaceEvent(struct UsbFnInterface *interface); + |
++ | +|
UsbFnInterfaceHandle UsbFnOpenInterface(struct UsbFnInterface *interface); + |
++ | +|
| + | ++ | +|
int UsbFnGetInterfacePipeInfo(struct UsbFnInterface *interface, uint8_t pipeId, struct UsbFnPipeInfo *info); + |
++ | +|
int UsbFnSetInterfaceProp(const struct UsbFnInterface *interface, const char *name, const char *value); + |
++ | +|
| + | +struct UsbFnRequest *UsbFnAllocCtrlRequest(UsbFnInterfaceHandle handle, uint32_t len); + |
++ | +
struct UsbFnRequest *UsbFnAllocRequest(UsbFnInterfaceHandle handle, uint8_t pipe, uint32_t len); + |
++ | +|
| + | ++ | +|
| + | ++ | +|
int UsbFnSubmitRequestSync(struct UsbFnRequest *req, uint32_t timeout); + |
++ | +|
| + | ++ | +
- 音频解码:支持MPEG-4 AAC Profile (AAC LC)格式解码,支持单/双声道,支持MPEG-4(.mp4,.m4a)容器格式。
- 视频解码:支持H.265 HEVC/H.264 AVC格式解码(限自身编码码流),支持MPEG-4(.mp4)容器格式。
- 音频解码:支持MPEG-4 AAC Profile (AAC LC)、MPEG Audio Layer 3 (MP3)格式解码,支持单/双声道,支持MPEG-4(.mp4,.m4a)、MP3(.mp3)容器格式。
- 视频解码:支持H.265 HEVC/H.264 AVC格式解码(限自身编码码流),支持MPEG-4(.mp4)容器格式。
- 音频编码:支持音频AAC_LC编码,支持单/双声道,支持MPEG-4(.mp4)容器格式。
- 视频编码:支持视频H.264/H.265编码,支持MPEG-4(.mp4)容器格式。
- 音频解码:支持MPEG-4 AAC Profile (AAC LC)格式解码,支持单/双声道,支持MPEG-4(.mp4,.m4a)容器格式。
- 视频解码:-
- 音频解码:支持MPEG-4 AAC Profile (AAC LC)、MPEG Audio Layer 3 (MP3)格式解码,支持单/双声道,支持MPEG-4(.mp4,.m4a)、MP3(.mp3)容器格式。
- 视频解码:-
- 音频编码:支持音频AAC_LC编码,支持单/双声道,支持MPEG-4(.mp4)容器格式。
- 视频编码:支持视频H.264/H.265编码,支持MPEG-4(.mp4)容器格式。
| + | ++ | +
|---|---|
const HRilOps *RilInitOps(const struct HRilReport * reportOps) + |
++ + + | +
| + | ++ | +
|---|---|
void ReqDial(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + |
++ + + + + | +
void (*OnCallReport)(struct ReportInfo reportInfo, const void *data, size_t dataLen); + |
+接口功能:对通话业务执行结果进行响应,即当请求业务执行完成后,Modem将该请求执行的结果上报给RIL Adapter。 + + + + + |
+
| + | ++ | +
|---|---|
| + | ++ + + + | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | +
| + | ++ | ++ | ++ | +
|---|---|---|---|
| + | ++ | ++ | ++ | +
| + | ++ | ++ | ++ | +
| + | ++ | ++ | +
|---|---|---|
| + | ++ | ++ | +
| + | ++ | ++ | +
| + | ++ | ++ | +
| + | ++ | ++ | +
|---|---|---|
| + | ++ | ++ | +
| + | ++ | ++ | +
| + | ++ | ++ | +
| + | ++ | ++ | +
|---|---|---|
| + | ++ | ++ | +
| + | ++ | ++ | +
| + | ++ | ++ | +
| + | ++ | ++ | +
| + | ++ | +
|---|---|
| + | ++ | +
| + | ++ | +
| + | +同步等待指定key名称的系统参数值与value匹配。value可支持模糊匹配,如"*"表示任何值,"val*"表示只匹配前三个val字符。 + |
+
| + | ++ | +
| @@ -41,126 +343,136 @@ LiteOS-M内核和LiteOS-A内核的平台,包括:Hi3861平台,Hi3516DV300 | ||
|---|---|---|
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| - | + | |
| + | ||
| - | + | |
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ||
| + | ++ | +|
| + | ++ | +
| - | -- | -- | -
|---|---|---|
| - | -
|
-
|
-
| - | -- | -
|
-
| - | -- | -- | -
|---|---|---|
| - | -- | -- | -
| - | -- | -- | -
| - | -- | -- | -
| - | -- | -
|---|---|
| - | -测试用例执行不依赖Setup&Teardown。HWTEST对TEST增加了“用例级别”参数“TestSize.Level1”,例如HWTEST(CalculatorAddTest, TestPoint_001, TestSize.Level1)。 - |
-
| - | -测试用例(不带参数)执行依赖Setup&Teardown。HWTEST_F对TEST_F增加了“用例级别”参数“ TestSize.Level1”,例如HWTEST_F(CalculatorAddTest, TestPoint_001, TestSize.Level1)。 - |
-
| - | -测试用例(带参数)执行依赖Setup&Teardown。HWTEST_P对TEST_P增加了“用例级别”参数“ TestSize.Level1”,例如HWTEST_P(CalculatorAddTest, TestPoint_001, TestSize.Level1)。 - |
-
| - | -- | -- | -- | -
|---|---|---|---|
| - | -- | -- | -- | -
| - | -- | -- | -- | -
| - | -- | -- | -- | -
| - | -- | -- | -- | -
| - | -- | -
|---|---|
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
|---|---|
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
| - | -- | -
-
+
-
+
-
+
-
+
+ 采样是指将连续时域上的模拟信号按照一定的时间间隔采样,获取到离散时域上离散信号的过程。 + +- **采样率**
+ 采样率为每秒从连续信号中提取并组成离散信号的采样次数,单位用赫兹(Hz)来表示。通常人耳能听到频率范围大约在20Hz~20kHz之间的声音。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。 + +- **声道**
+ 声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。 + +- **音频帧**
+ 音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。 + +- **PCM**
+ PCM(Pulse Code Modulation),即脉冲编码调制,是一种将模拟信号数字化的方法,是将时间连续、取值连续的模拟信号转换成时间离散、抽样值离散的数字信号的过程。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/02.\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/02.\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..31585b30daee58ba9eb7f5e00cb39015d2bf5f6f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/02.\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,144 @@ +--- +title: 音频播放开发指导 +permalink: /pages/00070201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 音频播放开发指导 + +- [场景介绍](#场景介绍) +- [接口说明](#接口说明) + +## 场景介绍 + +音频播放的主要工作是将音频数据转码为可听见的音频模拟信号并通过输出设备进行播放,同时对播放任务进行管理。 + +**图1** 音频播放状态机 + + + +## 接口说明 + +**表1** media + +| 接口名 | 描述 | +| -------- | -------- | +| media.createAudioPlayer() | 创建AudioPlayer实例。 | +| AudioPlayer | 提供音频播放相关功能,具体见表 音频播放相关的interface AudioPlayer。 | + +**表2** 音频播放相关的interface **AudioPlayer** + +| 接口名 | 描述 | +| -------- | -------- | +| release() | 释放音频资源。 | +| play() | 开始播放音频源。 | +| pause() | 暂停播放。 | +| stop() | 停止播放。 | +| reset()7+ | 重置播放音频源。 | +| setVolume(vol: number) | 改变音频播放音量 | +| seek(timeMs: number) | 改变播放位置。 | +| src:string | 音频播放的媒体URI。 | +| state:AudioState | 播放的状态属性。 | +| currentTime:number | 音频的当前播放位置。 | +| duration:number | 音频播放的时长(当数据源不支持改变播放位置时返回-1, 比如实时流媒体场景)。 | +| loop:boolean | 音频的循环播放属性。 | +| on('play', function callback) | 订阅音频播放开始事件。 | +| on('pause', function callback) | 订阅音频播放暂停事件。 | +| on('stop', function callback) | 订阅音频播放停止事件。 | +| on('reset', function callback) | 订阅音频播放重置事件。 | +| on('finish',function callback) | 订阅音频播放结束事件。 | +| on('error', function callback) | 订阅音频播放错误事件。 | +| on('dataload', function callback) | 订阅音频播放加载数据事件。 | +| on('volumeChange', function callback) | 订阅音频播放音量变化事件。 | +| on('timeUpdate', function callback) | 订阅音频播放进度改变事件。 | + + +1. 创建音频播放器。 + ``` + import media from '@ohos.multimedia.media'; + var player = media.createAudioPlayer(); + ``` + +2. 设置消息订阅事件。 + ``` + player.on('play', (err, action) => { + if (err) { + console.error('Error returned in the play() callback.'); + return; + } + console.info('Current player duration: '+ player.duration); + console.info('Current player time: ' + player.currentTime); + console.info('Current player status: '+player.state); + console.info('Pause MP3'); + player.pause(); + }); + player.on('pause', (err, action) => { + if (err) { + console.error('Error returned in the pause() callback.'); + return; + } + console.info('Current player status: ' + player.state); + console.info('Current player time: ' + player.currentTime); + player.seek(30000); // Seek for 30 seconds. + }); + player.on('stop', (err, action) => { + if (err) { + console.error('Error returned in the stop() callback.'); + return; + } + console.info('stop callback invoked. State:' + player.state); + player.reset(); + }); + player.on('dataLoad', (err, action) => { + if (err) { + console.error('Error returned in the dataLoad() callback.'); + return; + } + console.info('dataLoad callback invoked. Current time: ' + player.currentTime); + console.info('Duration of the source:' + player.duration); + player.play(); + }); + player.on('reset', (err, action) => { + if (err) { + console.error('Error returned in the reset() callback.'); + return; + } + console.info('reset callback invoked.'); + player.release(); + }); + player.on('finish', (err, action) => { + if (err) { + console.error('Error returned in the finish() callback.'); + return; + } + console.info('finish callback invoked.'); + }); + player.on('timeUpdate', (seekTime, action) => { + console.info('Seek time: ' + seekTime); + console.info('Current player time: ' + player.currentTime); + var newTime = player.currentTime; + if(newTime == 30000) { + console.info('Seek succeeded. New time: ' + newTime); + } else { + console.error('Seek failed: ', + newTime); + } + player.stop(); + }); + player.on('error', (err) => { + console.error('Player error: ${err.message}'); + }); + ``` + +3. 启动播放。 + ``` + var audioSourceMp3 = 'file://test.mp3'; + player.src = audioSourceMp3; + player.loop = true; + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/03.\351\237\263\351\242\221\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/03.\351\237\263\351\242\221\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..9d61101b504e4b29bcd70a86e09a39013a55cf7f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/03.\351\237\263\351\242\221\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,111 @@ +--- +title: 音频管理开发指导 +permalink: /pages/00070202 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 音频管理开发指导 + +- [场景介绍](#场景介绍) +- [接口说明](#接口说明) +- [开发步骤](#开发步骤) + +## 场景介绍 + +音频管理的主要工作是音量调节与音量查询,以及输入/输出设备查询。 + + +## 接口说明 + +**表1** audio的相关接口 + +| 接口名 | 描述 | +| -------- | -------- | +| getAudioManager(): AudioManager | 获得音频管理器。 | +| AudioManager | 音频管理器。具体参考表 音频管理相关的interface AudioManager。 | +| AudioDeviceDescriptor | 描述音频设备。 | +| AudioVolumeType | 表示音频流类型的枚举。 | +| DeviceFlag | 表示可获取的设备种类的枚举。 | +| DeviceRole | 表示设备角色的枚举。 | +| DeviceType | 表示设备类型的枚举。 | + +**表2** 音频管理相关的interface **AudioManager** + +| 接口名 | 描述 | +| -------- | -------- | +| setVolume(audioType: AudioVolumeType,volume: number,callback: AsyncCallback<void>): void | 改变某个流的音量。 | +| setVolume(audioType: AudioVolumeType,volume: number): Promise<void> | 改变某个流的音量。 | +| getVolume(audioType: AudioVolumeType, callback: AsyncCallback<number>): void | 获得某个流的音量。 | +| getVolume(audioType: AudioVolumeType): Promise<number> | 获得某个流的音量。 | +| getMinVolume(audioType: AudioVolumeType, callback: AsyncCallback<number>): void | 获得某个流的最小音量。 | +| getMinVolume(audioType: AudioVolumeType): Promise<number> | 获得某个流的最小音量。 | +| getMaxVolume(audioType: AudioVolumeType, callback: AsyncCallback<number>): void | 获得某个流的最大音量。 | +| getMaxVolume(audioType: AudioVolumeType): Promise<number> | 获得某个流的最大音量。 | +| getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback<AudioDeviceDescriptors>): void | 获得设备列表。 | +| getDevices(deviceFlag: DeviceFlag): Promise<AudioDeviceDescriptors> | 获得设备列表。 | + +**表3** 表示音频设备的interface **AudioDeviceDescriptor** + +| 属性 | 描述 | +| -------- | -------- | +| deviceRole: DeviceRole | 设备角色。 | +| deviceType: DeviceType | 设备类型。 | + +**表4** 表示音频流类型的枚举**AudioVolumeType** + +| 枚举值 | 描述 | +| -------- | -------- | +| MEDIA = 1 | 媒体声音。 | +| RINGTONE = 2 | 铃声。 | + +**表5** 表示可获取的设备种类的枚举**DeviceFlag** + +| 枚举值 | 描述 | +| -------- | -------- | +| OUTPUT_DEVICES_FLAG = 1 | 输出设备。 | +| INPUT_DEVICES_FLAG = 2 | 输入设备。 | +| ALL_DEVICES_FLAG = 3 | 所有设备。 | + +**表6** 表示设备角色的枚举**DeviceRole** + +| 枚举值 | 描述 | +| -------- | -------- | +| INPUT_DEVICE = 1 | 输入设备。 | +| OUTPUT_DEVICE = 2 | 输出设备。 | + +**表7** 表示设备类型的枚举**DeviceType** + +| 枚举值 | 描述 | +| -------- | -------- | +| INVALID = 0 | 无效。 | +| SPEAKER = 1 | 扬声器。 | +| WIRED_HEADSET = 2 | 有线耳机。 | +| BLUETOOTH_SCO = 3 | 蓝牙设备。 | +| BLUETOOTH_A2DP = 4 | 支持A2DP的蓝牙设备。 | +| MIC = 5 | 麦克风。 | + + +## 开发步骤 + +1. 获取音频控制器。 + ``` + const audioManager = audio.getAudioManager(); + ``` + +2. 改变媒体流的声音。 + ``` + audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error(`failed to get volume ${err.message}`); + return; + } + console.log(`Media getVolume ${value}`); + }); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/04.\351\237\263\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/04.\351\237\263\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..8b0ef27d050c10eae86e26f299b741fee9bc8e2d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/04.\351\237\263\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,133 @@ +--- +title: 音频录制开发指导 +permalink: /pages/00070203 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 音频录制开发指导 + +- [场景介绍](#场景介绍) +- [接口说明](#接口说明) + +## 场景介绍 + +音频录制的主要工作是将音频信号记录并保存下来,同时提供包括采样率、声道数、码率、编码格式、封装格式、文件路径等设置功能。 + + +## 接口说明 + +**表1** media + +| 接口名 | 描述 | +| -------- | -------- | +| media.createAudioRecorder() | 创建AudioRecorder实例。 | +| AudioRecorder | 提供音频录制相关功能。 | +| AudioRecorderConfig | 提供音频录制相关参数设置。 | + +**表2** 音频录制相关的interface **AudioRecorder** + +| 接口名 | 描述 | +| -------- | -------- | +| prepare(config: AudioRecorderConfig): void | 准备音频录制并设置参数。 | +| start(): void | 开始音频录制。 | +| pause(): void | 暂停音频录制。(暂不支持) | +| resume(): void | 恢复音频录制。(暂不支持) | +| stop(): void | 停止音频录制。 | +| release(): void | 释放音频录制资源。 | +| reset(): void | 重置音频录制。 | +| on('prepare', function callback) | 订阅音频录制准备事件。 | +| on('start', function callback) | 订阅音频录制开始事件。 | +| on('pause', function callback) | 订阅音频录制暂停事件。 | +| on('resume', function callback) | 订阅音频录制恢复事件。 | +| on('stop',function callback) | 订阅音频录制结束事件。 | +| on('release', function callback) | 订阅音频录制释放资源事件。 | +| on('reset', function callback) | 订阅音频录制重置事件。 | +| on('error', function callback) | 订阅音频录制错误事件。 | + +**表3** 音频录制的相关参数的interface **AudioRecorderConfig** + +| 接口名 | 描述 | +| -------- | -------- | +| audioEncoder?: AudioEncoder | 音频编码格式,默认值是AAC_LC。 | +| audioEncodeBitRate?: number | 音频编码的比特率,默认值为48000。 | +| audioSampleRate?: number | 音频编码的采样率,默认值为48000。 | +| numberOfChannels?:number | 音频的声道数,默认值为2。 | +| format?: AudioOutputFormat | 音频的输出格式,默认值是MPEG_4。 | +| uri: string | 音频的输出路径。(file://path 或者 file://fd) | + +**表4** AudioEncoder的相关参数的interface **AudioEncoder** + +| 接口名 | 描述 | +| -------- | -------- | +| AAC_LC = 3 | 表示AAC_LC编码格式。 | + +**表5** 音频输出格式的相关参数的interface **AudioOutputFormat** + +| 接口名 | 描述 | +| -------- | -------- | +| MPEG_4 = 2 | 表示MPEG_4编码格式。 | +| AAC_ADTS= 6 | 表示AAC_ADTS编码格式。 | + +1. 创建音频录制器。 + ``` + import media from '@ohos.multimedia.media'; + var recorder = media.createAudioRecorder(); + ``` + +2. 准备音频录制参数。 + ``` + let audioRecorderConfig = { + audioEncoder : AAC_LC , + audioEncodeBitRate : 22050, + audioSampleRate : 22050, + numberOfChannels : 2, + format : AAC_ADTS, + uri : 'file:///data/accounts/account_0/appdata/appdata/recorder/test.m4a', + } + recorder.prepare(audioRecorderConfig); + ``` + +3. 设置消息订阅事件。 + ``` + recorder.on('prepare', () => { + console.info('setCallback prepare() case callback is called'); + recorder.start(); + }); + recorder.on('start', () => { + console.info('setCallback start() case callback is called'); + setTimeout(function(){ + recorder.pause(); + }, 10000); // 开始录音10秒后,暂停录音。 + }); + recorder.on('pause', () => { + console.info('setCallback pause() case callback is called'); + setTimeout(function(){ + recorder.resume(); + }, 10000); // 暂停录音10秒后,恢复录音。 + }); + recorder.on('resume', () => { + console.info('setCallback resume() case callback is called'); + setTimeout(function(){ + recorder.stop(); + }, 10000); // 恢复录音10秒后,停止录音。 + }); + recorder.on('stop', () => { + console.info('setCallback stop() case callback is called'); + recorder.release(); + }); + recorder.on('release', () => { + console.info('setCallback release() case callback is called'); + }); + recorder.on('error', (err) => { + console.info(`case error called,errCode is ${err.code}`); + console.info(`case error called,errMessage is ${err.message}`); + recorder.reset(); + }); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" similarity index 72% rename from "website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" index c13280f611d82506b8d5cc148e9a2a492a06d8e4..3397c55b8f146753220ac8dbd96247f5410581e7 100644 --- "a/website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: IPC与RPC通信概述 -permalink: /pages/000c00 +permalink: /pages/00070300 navbar: true sidebar: true prev: true @@ -9,25 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:35 --- -# IPC与RPC通信概述 +# IPC与RPC通信概述 -- [基本概念](#section175012297491) -- [约束与限制](#section2029921310472) -- [相关模块](#section1189019299446) +- [基本概念](#基本概念) +- [约束与限制](#约束与限制) +- [相关模块](#相关模块) -## 基本概念 +## 基本概念 IPC(Inter-Process Communication)与RPC(Remote Procedure Call)机制用于实现跨进程通信,不同的是前者使用Binder驱动,用于设备内的跨进程通信,而后者使用软总线驱动,用于跨设备跨进程通信。IPC和RPC通常采用客户端-服务器(Client-Server)模型,服务请求方(Client)可获取提供服务提供方(Server)的代理 (Proxy),并通过此代理读写数据来实现进程间的数据通信。通常,Server会先注册系统能力(System Ability)到系统能力管理者(System Ability Manager,缩写SAMgr)中,SAMgr负责管理这些SA并向Client提供相关的接口。Client要和某个具体的SA通信,必须先从SAMgr中获取该SA的代理,然后使用代理和SA通信。下文使用Proxy表示服务请求方,Stub表示服务提供方。 -## 约束与限制 + +## 约束与限制 目前暂不支持的场景: 跨设备RPC -## 相关模块 -分布式任务调度子系统 +## 相关模块 +分布式任务调度子系统 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/02.IPC\344\270\216RPC\351\200\232\344\277\241\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/02.IPC\344\270\216RPC\351\200\232\344\277\241\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..963026eeff3870bd1e6f211443b37efbb3cde1d0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/02.IPC\344\270\216RPC\351\200\232\344\277\241\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,146 @@ +--- +title: IPC与RPC通信开发指导 +permalink: /pages/00070301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# IPC与RPC通信开发指导 + +- [场景介绍](#场景介绍) +- [接口说明](#接口说明) +- [开发步骤](#开发步骤) + +## 场景介绍 + +IPC/RPC的主要工作是让运行在不同进程的Proxy和Stub互相通信,包括Proxy和Stub运行在不同设备的情况。 + + +## 接口说明 + +**表1** Native侧IPC接口 + +| 类/接口 | 方法 | 功能说明 | +| -------- | -------- | -------- | +| IRemoteBroker | sptr<IRemoteObject> AsObject() | 返回通信对象。派生类需要实现,Stub端返回RemoteObject对象本身,Proxy端返回代理对象。 | +| IRemoteStub | virtual int OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) | 请求处理方法,派生类需要重写,处理Proxy的请求并返回结果。 | +| IRemoteProxy | | 业务Proxy类派生自IRemoteProxy类。 | + + +## 开发步骤 + +**Native侧开发步骤** + +1. 定义IPC接口ITestAbility + SA接口继承IPC基类接口IRemoteBroker,接口里定义描述符、业务函数和消息码,其中业务函数在Proxy端和Stub端都需要实现。 + + ``` + class ITestAbility : public IRemoteBroker { + public: + // DECLARE_INTERFACE_DESCRIPTOR是必须的,入参需使用std::u16string; + DECLARE_INTERFACE_DESCRIPTOR(u"test.ITestAbility"); + int TRANS_ID_PING_ABILITY = 1; // 定义消息码 + virtual int TestPingAbility(const std::u16string &dummy) = 0; // 定义业务函数 + }; + ``` + +2. 定义和实现服务端TestAbilityStub + 该类是和IPC框架相关的实现,需要继承 IRemoteStub<ITestAbility>。Stub端作为接收请求的一端,需重写OnRemoteRequest方法用于接收客户端调用。 + + ``` + class TestAbilityStub : public IRemoteStub
只由以下字符组成:0-9、a-z、_。
非数字以及下划线开头。 | 忽略该事件,不执行打点。 | +| -2 | 无效的事件基本参数类型 | 事件名称参数必须为string。
事件类型参数必须为number类型。
keyValues参数必须为object类型。 | 忽略该事件,不执行打点。 | +| -99 | 应用打点功能被关闭 | 应用打点功能被关闭。 | 忽略该事件,不执行打点。 | +| -100 | 未知错误 | 无。 | 忽略该事件,不执行打点。 | +| 1 | 无效的key参数名称 | 非空且长度在16个字符以内(含)。
只由以下字符组成:0-9、a-z、_。
非数字以及下划线开头。
非下划线结尾。 | 忽略该键值对参数后,继续执行打点。 | +| 2 | 无效的key参数类型 | Key参数必须为字符串类型。 | 忽略该键值对参数后,继续执行打点。 | +| 3 | 无效的value参数类型 | value参数只支持以下类型:
boolean、number、string、Array[基本类型]。
| 忽略该键值对参数后,继续执行打点。 | +| 4 | value参数值过长 | 参数值长度必须在8*1024个字符以内(含)。 | 忽略该键值对参数后,继续执行打点。 | +| 5 | key-value参数对数过多 | key-value参数对数必须在32对以内(含)。 | 忽略后面多余的键值对参数后,继续执行打点。 | +| 6 | List类型的value参数容量过大 | List类型的value参数容量必须在100个以内(含)。 | 对List进行截断(只保留前100个元素)后,继续执行打点。 | +| 7 | 无效的List类型value参数 | List的泛型类型只能为基本类型。
List内的参数必须为同一类型。 | 忽略该键值对参数后,继续执行打点。 | \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271/02.\345\272\224\347\224\250\344\272\213\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271/02.\345\272\224\347\224\250\344\272\213\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..e5df03f45fa11a88a1aed14eb63927c43f53a4bf --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271/02.\345\272\224\347\224\250\344\272\213\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,130 @@ +--- +title: 应用事件开发指导 +permalink: /pages/00070401 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 应用事件开发指导 + +## 场景介绍 + +应用事件打点的主要工作是在应用运行过程中,帮助应用记录在运行过程中发生的各种信息。 + +## 接口说明 + +应用事件JS打点接口由hiAppEvent模块提供。 + +**打点接口功能介绍:** + +| 接口名 | 返回值 | 描述 | +| ------------------------------------------------------------ | -------------- | ---------------------------------------------------- | +| write(string eventName, EventType type, object keyValues, AsyncCallback\
- 新增支持OpenHarmony SDK的管理,开发者可通过DevEco Studio的SDK Manager功能来下载和管理OpenHarmony SDK。
- 在编译构建HAP包时,新增支持对单个Module进行编译,对于多Module工程中只需要编译其中一个Module的场景,可以提升编译构建速度;同时还新增支持一键重构建HAP包,即在编译构建HAP前,会自动执行Clean Project操作。
**增强特性:**
- 编译构建插件更新至3.0.3.2版本。
- Json编辑器增强,资源索引错误支持快速修复,并支持快速查看资源的取值。
- 工程视图支持Ohos视图,默认视图为Project视图,开发者可手动切换。
- OpenHarmony工程支持ark方舟编译。
- OpenHarmony工程类型标识字段supportSystem "standard",由模块级build.gradle调整至工程级build.gradle。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/03.\351\205\215\347\275\256OpenHarmonySDK.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/03.\351\205\215\347\275\256OpenHarmonySDK.md" new file mode 100644 index 0000000000000000000000000000000000000000..4db81efdd0163c7608bdf6143e6d79c26b042023 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/03.\351\205\215\347\275\256OpenHarmonySDK.md" @@ -0,0 +1,188 @@ +--- +title: 配置OpenHarmonySDK +permalink: /pages/00070502 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 配置OpenHarmony SDK + +- [前提条件](#前提条件) +- [配置SDK信息](#配置sdk信息) +- [参考信息](#参考信息) + - [配置DevEco Studio代理](#配置deveco-studio代理) + - [配置NPM代理](#配置npm代理) + - [设置Gradle代理](#设置gradle代理) + +在设置OpenHarmony应用开发环境时,需要开发者在DevEco Studio中配置对应的SDK信息。 + + +> **说明:**
+>请注意,OpenHarmony SDK版本精简了部分工具链,因此不适用于HarmonyOS应用开发。 + + +## 前提条件 + +已下载并安装好DevEco Studio 3.0 Beta1及以上版本,点击[链接下载](https://developer.harmonyos.com/cn/develop/deveco-studio#download)。 + + +## 配置SDK信息 + +DevEco Studio通过SDK Manager统一管理SDK及工具链,OpenHarmony包含如下SDK包: + +| 类别 | 包名 | 说明 | +| -------- | -------- | -------- | +| SDK | JS | JS语言SDK包。 | +| SDK Tool | Toolchains | SDK工具链,OpenHarmony应用开发必备工具集,包括编译、打包、签名、数据库管理等工具的集合。 | +| | Previewer | OpenHarmony应用预览器,可以在应用开发过程中查看界面UI布局效果。 | + +1. 运行已安装的DevEco Studio,首次使用,请选择 **Do not import settings**,点击OK。 + +2. 进入配置向导页面,设置 **npm registry**,DevEco Studio已预置对应的仓,直接点击 **Start using DevEco Studio**进入下一步。 + >  **说明:**
+ > 如果配置向导界面出现的是设置 **Set up HTTP Proxy**界面,说明网络受限,请根据[参考信息](#参考信息)配置DevEco Studio代理、NPM代理和Gradle代理后,再下载OpenHarmony SDK。 + + +  + +3. DevEco Studio向导指引开发者下载SDK,默认下载OpenHarmony SDK。SDK下载到user目录下,也可以指定对应的存储路径,SDK存储路径不支持中文字符,然后点击 **Next**。 +  + + >  **说明:**
+ > 如果不是首次安装DevEco Studio,可能无法查看进入该界面,可通过欢迎页的 **Configure (** **或** **图标** **)> Settings > SDK Manager > OpenHarmony SDK**界面,点击 **OpenHarmony SDK Location**加载SDK。 + +4. 在弹出的SDK下载信息页面,点击 **Next**,并在弹出的 **License Agreement**窗口,点击 **Accept**开始下载SDK。 + + + >  **说明:**
+ > 下载SDK过程中,如果出现下载JS SDK失败,提示“Install js dependencies failed”,请根据[JS SDK安装失败处理指导](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/faq-development-environment-0000001168829643#section1311117111474)进行处理。 + + +  + +5. 等待OpenHarmony SDK及工具下载完成,点击 **Finish**,界面会进入到DevEco Studio欢迎页。 +  + + +## 参考信息 + +DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用。 + +一般来说,如果使用的是个人或家庭网络,是不需要设置代理信息的;只有部分企业网络受限的情况下,才需要设置代理信息。 + +如果是第一次打开DevEco Studio,配置向导界面出现设置 **Set up HTTP Proxy**界面,说明网络受限,可以通过配置代理的方式来解决,需要配置DevEco Studio代理、NPM代理和Gradle代理。 + + + + +### 配置DevEco Studio代理 + +1. 启动DevEco Studio,配置向导进入 **Set up HTTP Proxy**界面,勾选 **Manual proxy configuration**,设置DevEco Studio的HTTP Proxy。 + >  **说明:**
+ > 如果非首次设置向导进入HTTP Proxy,可以通过如下方式进入HTTP Proxy配置界面: + > + > - 在欢迎页点击 **Configure(或** **图标) > Settings > Appearance & Behavior > System Settings > HTTP Proxy**进入HTTP Proxy设置界面(Mac系统为 **Configure > Preferences > Appearance & Behavior > System Settings > HTTP Proxy**)。 + > + > - 在打开了工程的情况下,可以点击 **File > Settings > Appearance & Behavior > System Settings > HTTP Proxy**进入HTTP Proxy设置界面(Mac系统为 **DevEco Studio > Preferences > Appearance & Behavior > System Settings > HTTP Proxy**) + + - **HTTP**配置项,设置代理服务器信息。 **如果不清楚代理服务器信息,可以咨询你们的网络管理人员**。 + - **Host name**:代理服务器主机名或IP地址。 + - **Port number**:代理服务器对应的端口号。 + - **No proxy for**:不需要通过代理服务器访问的URL或者IP地址(地址之间用英文逗号分隔)。 + - **Proxy authentication**配置项,如果代理服务器需要通过认证鉴权才能访问,则需要设置。否则,请跳过该配置项。 + - **Login**:访问代理服务器的用户名。 + - **Password**:访问代理服务器的密码。 + - **Remember**:勾选,记住密码。 +  + +2. 配置完成后,点击 **Check connection**,输入网络地址(如:https://developer.harmonyos.com),检查网络连通性。提示Connection successful表示代理设置成功。 + +3. 点击 **Next: Configure npm**继续设置NPM代理信息,请参考[配置NPM代理](#配置npm代理)。 + + +### 配置NPM代理 + +通过DevEco Studio的设置向导设置NPM代理信息,代理信息将写入用户“users/用户名/”目录下的 **.npmrc**文件。 +>  **说明:**
+> 该向导只有第一次安装DevEco Studio才会出现。如果未出现该向导,可以直接在“users/用户名/”目录下的 **.npmrc**文件中,添加代理配置信息。 + +- npm registry:设置npm仓的地址信息,建议勾选。 + +- HTTP proxy:代理服务器信息,默认会与DevEco Studio的HTTP proxy设置项保持一致。 + +- Enable Https Proxy:同步设置HTTPS Proxy配置信息,建议勾选。 + + + +然后点击 **Start using DevEco Studio**继续下一步操作。 + +如果代理服务器需要认证(需要用户名和密码),请先根据如下指导配置代理服务器的用户名和密码信息,然后再下载OpenHarmony SDK;否则,请跳过该操作,参考[配置SDK信息](#配置sdk信息)进行操作即可。 + + + +1. 进入用户的users目录,打开 **.npmrc**文件。 + +2. 修改npm代理信息,在proxy和https-proxy中,增加user和password字段,具体取值请以实际代理信息为准。示例如下所示: + ``` + proxy=http://user:password@proxy.server.com:80 + https-proxy=http://user:password@proxy.server.com:80 + ``` + + >  **说明:**
+ > 如果password中存在特殊字符,如\@、\#、\*等符号,可能导致配置不生效,建议将特殊字符替换为ASCII码,并在ASCII码前加百分号%。常用符号替换为ASCII码对照表如下: + > + > - !:%21 + > + > - \@:%40 + > + > - \#:%23 + > + > - ¥:%24 + > + > - &:%26 + > + > - \*:%2A + +3. 代理设置完成后,打开命令行工具,执行如下命令进行验证网络是否正常。 + ``` + npm info express + ``` + + 执行结果如下图所示,则说明代理设置成功。 + +  + +4. 网络设置完成后,然后再[配置SDK信息](#配置sdk信息)。 + + +### 设置Gradle代理 + +1. 打开“此电脑”,在文件夹地址栏中输入 **%userprofile%**(Mac系统请点击 **前往 > 个人**),进入个人用户文件夹。 +  + +2. 创建一个文件夹,命名为 **.gradle**。如果已有.gradle文件夹,请跳过此操作。 + >  **说明:**
+ > macOS系统创建.gradle文件夹前,请将系统设置为“显示隐藏文件”。 + +3. 进入.gradle文件夹,新建一个文本文档,命名为 **gradle**,并修改后缀为 **.properties**。 + +4. 打开 **gradle.properties**文件中,添加如下脚本,然后保存。 + 其中代理服务器、端口、用户名、密码和不使用代理的域名,请根据实际代理情况进行修改。其中不使用代理的nonProxyHosts的配置间隔符是 “|”。 + ``` + systemProp.http.proxyHost=proxy.server.com + systemProp.http.proxyPort=8080 + systemProp.http.nonProxyHosts=*.company.com|10.*|100.* + systemProp.http.proxyUser=userId + systemProp.http.proxyPassword=password + systemProp.https.proxyHost=proxy.server.com + systemProp.https.proxyPort=8080 + systemProp.https.nonProxyHosts=*.company.com|10.*|100.* + systemProp.https.proxyUser=userId + systemProp.https.proxyPassword=password + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/01.\344\275\277\347\224\250\345\267\245\347\250\213\345\220\221\345\257\274\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/01.\344\275\277\347\224\250\345\267\245\347\250\213\345\220\221\345\257\274\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..d77fc09c00145d94b14c6b3506bb9feedd056de6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/01.\344\275\277\347\224\250\345\267\245\347\250\213\345\220\221\345\257\274\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" @@ -0,0 +1,58 @@ +--- +title: 使用工程向导创建新工程 +permalink: /pages/0007050300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 使用工程向导创建新工程 + +- [前提条件](#前提条件) +- [操作步骤](#操作步骤) + +通过工程向导创建一个OpenHarmony工程,该功能只有DevEco Studio 2.2 Beta1及以上版本支持。如果是DevEco Studio 2.1 Release版本,请根据[通过导入Sample方式创建新工程](/pages/0007050301)进行操作。 + + +## 前提条件 + +已安装OpenHarmony SDK,具体请参考[配置OpenHarmony SDK](/pages/00070502)。 + + +## 操作步骤 + +1. 通过如下两种方式,打开工程创建向导界面。 + - 如果当前未打开任何工程,可以在DevEco Studio的欢迎页,选择 **Create Project**开始创建一个新工程。 + - 如果已经打开了工程,可以在菜单栏选择 **File > New > New Project**来创建一个新工程。 + +2. 根据工程创建向导,选择 **[Standard]Empty Ability**模板,点击 **Next**。 +  + +3. 点击 **Next**,进入到工程配置阶段,需要根据向导配置工程的基本信息。 + - **Project Name**:工程的名称,可以自定义。 + - **Project Type**:工程的类型,标识该工程是一个[原子化服务](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/atomic-service-definition-0000001090840664)(Service)或传统方式的需要安装的应用(Application)。 + >  **说明:**
+ > 如果是创建的原子化服务,则: + > + > - 原子化服务调试、运行时,在设备桌面上没有应用图标,请使用DevEco Studio的调试和运行功能,来启动原子化服务。 + > + > - 原子化服务是免安装的,config.json中自动添加 **installationFree**字段,取值为“true”。 + > + > - 如果entry模块的 **installationFree**字段为true,则其相关的所有hap模块的 **installationFree**字段都默认为true;如果entry模块的 **installationFree**字段为false,则其相关的所有hap模块可以配置为true或false。 + > + > - 编译构建App时,每个hap包大小不能超过10MB。 + - **Package Name**:软件包名称,默认情况下,应用ID也会使用该名称,应用发布时,应用ID需要唯一。 + - **Save Location**:工程文件本地存储路径。 + - **Compatible API Version**:兼容的SDK最低版本。 + >  **说明:**
+ > OpenHarmony工程如果配置了compileSdkVersion 7以上,对应模块默认使用方舟编译器进行编译,如果要修改编译方式为非方舟编译,在模块级build.gradle的 **ohos**闭包中添加 **arkEnable false**字段。 + - **Language**:支持的开发语言。 + - **Device Type**:该工程模板支持的设备类型。
+  + +4. 点击 **Finish**,工具会自动生成示例代码和相关资源,等待工程创建完成。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/02.\351\200\232\350\277\207\345\257\274\345\205\245Sample\346\226\271\345\274\217\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/02.\351\200\232\350\277\207\345\257\274\345\205\245Sample\346\226\271\345\274\217\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..71bc12a9cd543332f5e71a2ec062b4ebe6ea03ff --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/02.\351\200\232\350\277\207\345\257\274\345\205\245Sample\346\226\271\345\274\217\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" @@ -0,0 +1,39 @@ +--- +title: 通过导入Sample方式创建新工程 +permalink: /pages/0007050301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 通过导入Sample方式创建新工程 + +>  **说明:** +> 该功能适用于通过DevEco Studio 2.1 Release及以上版本,创建OpenHarmony工程。 + + +OpenHarmony SDK配置完成后,便可以启动应用开发。针对OpenHarmony应用开发, **可以通过导入Sample工程的方式来创建一个新工程**。 + + +1. 在DevEco Studio的欢迎页,进入 **Configure (** **或** **图标** **) > Settings > Version Control > Git**界面,点击Test按钮检测是否安装Git工具。 + - 已安装,请根据**步骤2**开始导入Sample。 +  + - 未安装,请点击 **Download and Install**,DevEco Studio会自动下载并安装。安装完成后,请根据**步骤2**开始导入Sample。 +  + +2. 在DevEco Studio的欢迎页,点击 **Import Sample**按钮,导入Sample工程。 +  + +3. 选择OpenHarmony Samples > common下的 **JsHelloWorld**工程,然后点击 **Next**。 +  + +4. 设置 **App Name**和 **Project Location**,然后点击 **Finish**,等待Sample工程导入完成。 +  + +5. 等待工程同步完成,同步成功后,便可以进行OpenHarmony应用开发了。 +  diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/05.\351\205\215\347\275\256OpenHarmony\345\272\224\347\224\250\347\255\276\345\220\215\344\277\241\346\201\257.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/05.\351\205\215\347\275\256OpenHarmony\345\272\224\347\224\250\347\255\276\345\220\215\344\277\241\346\201\257.md" new file mode 100644 index 0000000000000000000000000000000000000000..9353c97be318086ec99b1337fc64a996ca605ac7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/05.\351\205\215\347\275\256OpenHarmony\345\272\224\347\224\250\347\255\276\345\220\215\344\277\241\346\201\257.md" @@ -0,0 +1,219 @@ +--- +title: 配置OpenHarmony应用签名信息 +permalink: /pages/00070504 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 配置OpenHarmony应用签名信息 + +- [生成密钥和证书请求文件](#生成密钥和证书请求文件) +- [生成应用证书文件](#生成应用证书文件) +- [生成应用Profile文件](#生成应用profile文件) +- [配置应用签名信息](#配置应用签名信息) + +使用真机设备运行和调试OpenHarmony应用前,需要对应用进行签名才能正常运行。该指导用于OpenHarmony应用的签名配置。除此章节以外,DevEco Studio的其余操作指导无差别,具体请访问[HUAWEI DevEco Studio使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/tools_overview-0000001053582387)。配置应用签名信息的流程如下图所示。 + + + + + +## 生成密钥和证书请求文件 + +OpenHarmony应用通过数字证书(.cer文件)和Profile文件(.p7b文件)来保证应用的完整性,需要通过DevEco Studio来生成密钥文件(.p12文件)和证书请求文件(.csr文件)。同时,也可以使用命令行工具的方式来生成密钥文件和证书请求文件。 + +### 使用DevEco Studio生成密钥和证书请求文件 + +1. 在主菜单栏点击**Build > Generate Key** **and CSR**。 + + > **说明** + > + > 如果本地已有对应的密钥,无需新生成密钥,可以在**Generate Key**界面中点击下方的Skip跳过密钥生成过程,直接使用已有密钥生成证书请求文件。 + +2. 在**Key Store File**中,可以点击**Choose Existing**选择已有的密钥库文件(存储有密钥的.p12文件);如果没有密钥库文件,点击**New**进行创建。下面以新创建密钥库文件为例进行说明。 + +  + +3. 在**Create Key Store**窗口中,填写密钥库信息后,点击**OK**。 + + - **Key Store File**:选择密钥库文件存储路径。 + - **Password**:设置密钥库密码,必须由大写字母、小写字母、数字和特殊符号中的两种以上字符的组合,长度至少为8位。请记住该密码,后续签名配置需要使用。 + - **Confirm Password**:再次输入密钥库密码。 + +  + +4. 在**Generate Key**界面中,继续填写密钥信息后,点击**Next**。 + + - **Alias**:密钥的别名信息,用于标识密钥名称。请记住该别名,后续签名配置需要使用。 + - **Password**:密钥对应的密码,与密钥库密码保持一致,无需手动输入。 + - **Validity**:证书有效期,建议设置为25年及以上,覆盖应用的完整生命周期。 + - **Certificate**:输入证书基本信息,如组织、城市或地区、国家码等。 + +  + +5. 在**Generate CSR**界面,选择密钥和设置CSR文件存储路径。 + +  + +6. 点击**OK**按钮,创建CSR文件成功,可以在存储路径下获取生成的密钥库文件(.p12)和证书请求文件(.csr)。 + +  + +### 使用命令行工具生成证书请求文件 + +使用Open JDK携带的Keytool工具生成证书请求文件。 + +1. 使用管理员身份运行命令行工具。 + +  + +2. 切换到keytool工具所在路径,实际路径请根据DevEco Studio安装目录进行修改。 + +  + + +3. 执行如下命令,生成公私钥文件。例如,生成的密钥库名称为ide_demo_app.p12,以存储到D盘根目录下为例 + + ``` + keytool -genkeypair -alias "ide_demo_app" -keyalg EC -sigalg SHA256withECDSA -dname "C=CN,O=HUAWEI,OU=HUAWEI IDE,CN=ide_demo_app" -keystore d:\\idedemokey.p12 -storetype pkcs12 -validity 9125 -storepass 123456Abc -keypass 123456Abc + ``` + + 生成公私钥文件的参数说明如下: + + > 说明 + > + > 请记录下**alias、storepass和keypass**的值,在后续[配置签名信息](#配置应用签名信息)操作会使用到。 + + - **alias**:密钥的别名信息,用于标识密钥名称。 + + - **sigalg**:签名算法,固定为**SHA256withECDSA**。 + - **dname**:按照操作界面提示进行输入。 + - C:国家/地区代码,如CN。 + - O:组织名称,如HUAWEI。 + - OU:组织单位名称,如HUAWEI IDE。 + - CN:名字与姓氏,建议与别名一致。 + - **validity**:证书有效期,建议设置为9125(25年)。 + - **storepass**:设置密钥库密码,必须由大写字母、小写字母、数字和特殊符号中的两种以上字符的组合,长度至少为8位。请记住该密码,后续签名配置需要使用。 + - **keypass**:设置密钥的密码,请与**storepass**保持一致。 + +4. 执行如下命令,执行后需要输入**storepass**密码,生成证书请求文件,后缀格式为.csr。 + + ``` + keytool -certreq -alias "ide_demo_app" -keystore d:\\idedemokey.p12 -storetype pkcs12 -file d:\\idedemokey.csr + ``` + + 生成证书请求文件的参数说明如下: + + - **alias**:与[3](#label001)中输入的alias保持一致。 + - **file**:生成的证书请求文件名称,后缀为.csr。 + + +## 生成应用证书文件 + +使用[生成密钥和证书请求文件](#生成密钥和证书请求文件)中生成的证书请求文件,来生成应用签名所需的数字证书文件。生成方法如下: + +进入DevEco Studio安装目录的 **Sdk\toolchains\lib**文件夹下(该SDK目录只能是OpenHarmony SDK,配置方法可参考[配置OpenHarmony SDK](/pages/00070502)),打开命令行工具,执行如下命令(如果keytool命令不能执行,请在系统环境变量中添加JDK的环境变量)。其中,只需要修改输入和输出即可快速生成证书文件,即修改 **-infile**指定证书请求文件csr文件路径, **-outfile**指定输出证书文件名及路径。 + +``` +keytool -gencert -alias "OpenHarmony Application CA" -infile myApplication_ohos.csr -outfile myApplication_ohos.cer -keystore OpenHarmony.p12 -sigalg SHA384withECDSA -storepass 123456 -ext KeyUsage:"critical=digitalSignature" -validity 3650 -rfc +``` + +关于该命令的参数说明如下: + +- **alias**:用于签发证书的CA私钥别名,OpenHarmony社区CA私钥存于OpenHarmony.p12密钥库文件中,该参数不能修改。 + +- **infile**:证书请求(CSR)文件的路径。 + +- **outfile**:输出证书链文件名及路径。 + +- **keystore**:签发证书的CA密钥库路径,OpenHarmony密钥库文件名为OpenHarmony.p12,文件在OpenHarmony SDK中 **Sdk\toolchains\lib**路径下,该参数不能修改。请注意,该OpenHarmony.p12文件并不是[生成密钥和证书请求文件](#生成密钥和证书请求文件)中生成的.p12文件。 + +- **sigalg**:证书签名算法,该参数不能修改。 + +- **storepass**:密钥库密码,密码为123456,该参数不能修改。 + +- **ext**:证书扩展项,该参数不能修改。 + +- **validity**:证书有效期,自定义天数。 + +- **rfc**:输出文件格式指定,该参数不能修改。 + + +## 生成应用Profile文件 + +Profile文件包含OpenHarmony应用的包名、数字证书信息、描述应用允许申请的证书权限列表,以及允许应用调试的设备列表(如果应用类型为Release类型,则设备列表为空)等内容,每个应用包中均必须包含一个Profile文件。 + +进入 **Sdk\toolchains\lib**目录下,打开命令行工具,执行如下命令。 + +``` +java -jar provisionsigtool.jar sign --in UnsgnedReleasedProfileTemplate.json --out myApplication_ohos_Provision.p7b --keystore OpenHarmony.p12 --storepass 123456 --alias "OpenHarmony Application Profile Release" --sigAlg SHA256withECDSA --cert OpenHarmonyProfileRelease.pem --validity 365 --developer-id ohosdeveloper --bundle-name 包名 --permission 受限权限名(可选) --permission 受限权限名(可选) --distribution-certificate myApplication_ohos.cer +``` + +关于该命令的参数说明如下: + +- **provisionsigtool**:Profile文件生成工具,文件在OpenHarmony SDK的 **Sdk\toolchains\lib**路径下。 + +- **in**:Profile模板文件所在路径,文件在OpenHarmony SDK中 **Sdk\toolchains\lib**路径下,该参数不能修改。 + +- **out**:输出的Profile文件名和路径。 + +- **keystore**:签发证书的密钥库路径,OpenHarmony密钥库文件名为OpenHarmony.p12,文件在OpenHarmony SDK中 **Sdk\toolchains\lib**路径下,该参数不能修改。 + +- **storepass**:密钥库密码,密码为123456,该参数不能修改。 + +- **alias**:用于签名Profile私钥别名,OpenHarmony社区CA私钥存于OpenHarmony.p12密钥库文件中,该参数不能修改。 + +- **sigalg**:证书签名算法,该参数不能修改。 + +- **cert**:签名Profile的证书文件路径,文件在OpenHarmony SDK中 **Sdk\toolchains\lib**路径下,该参数不能修改。 + +- **validity**:证书有效期,自定义天数。 + +- **developer-id**:开发者标识符,自定义一个字符串。 + +- **bundle-name**:填写应用包名。 + +- **permission**:可选字段,如果不需要,则可以不用填写此字段;如果需要添加多个受限权限,则如示例所示重复输入。受限权限列表如下:ohos.permission.READ_CONTACTS、ohos.permission.WRITE_CONTACTS。 + +- **distribution-certificate**:[生成应用证书文件](#生成应用证书文件)中生成的证书文件。 + + +## 配置应用签名信息 + +在真机设备上调试前,需要使用到制作的私钥(.p12)文件、证书(.cer)文件和Profile(.p7b)文件对调试的模块进行签名。 + +打开 **File > Project Structure**,点击 **Project > Signing Configs > debug**窗口中,去除勾选“Automatically generate signing”,然后配置指定模块的调试签名信息。 + +- **Store File**:选择密钥库文件,文件后缀为.p12,该文件为[生成密钥和证书请求文件](#生成密钥和证书请求文件)中生成的.p12文件。 + +- **Store Password**:输入密钥库密码,该密码为[生成密钥和证书请求文件](#生成密钥和证书请求文件)中填写的密钥库密码保持一致。 + +- **Key Alias**:输入密钥的别名信息,与[生成密钥和证书请求文件](#生成密钥和证书请求文件)中填写的别名保持一致。 + +- **Key Password**:输入密钥的密码,与 **Store Password**保持一致。 + +- **Sign Alg**:签名算法,固定为SHA256withECDSA。 + +- **Profile File**:选择[生成应用Profile文件](#生成应用profile文件)中生成的Profile文件,文件后缀为.p7b。 + +- **Certpath File**:选择[生成应用证书文件](#生成应用证书文件)中生成的数字证书文件,文件后缀为.cer。 + + + +设置完签名信息后,点击 **OK**进行保存,然后可以在工程下的build.gradle中查看签名的配置信息。 + + + +默认情况下,DevEco Studio编译hap包的类型为debug类型,如果需要编译release类型的hap包,请打开工程左下角的OhosBuild Variants,设置模块的编译构建类型为release。关于编译构建hap的详细说明请参考[HUAWEI DevEco Studio使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/build_hap-0000001053342418)。 + + + +编译完成后,OpenHarmony应用的Hap包可以从工程的bulid目录下获取。 + + \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/05.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/06.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" similarity index 48% rename from "website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/05.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/06.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" index b56c4ab39efbd723621f67bbec7534188c66e539..6e0608394ad5ba8b50800f5d31e38d5e609dd932 100644 --- "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/05.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/06.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" @@ -1,6 +1,6 @@ --- title: 安装运行OpenHarmony应用 -permalink: /pages/00090004 +permalink: /pages/00070505 navbar: true sidebar: true prev: true @@ -9,46 +9,46 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:36 --- -# 安装运行OpenHarmony应用 +# 安装运行OpenHarmony应用 安装OpenHarmony应用需要使用hdc工具,通过手动执行命令行完成应用的安装。 -hdc工具本身需要手动从开源仓中获取。然后使用工具将编译后的hap包发送至设备侧,然后通过hdc命令完成app的安装。 -相关命令如下: +hdc工具本身需要手动从开源仓中获取。然后使用工具将编译后的hap包发送至设备侧,然后通过hdc命令完成app的安装。 -- 文件发送命令 - **file send _localpath remotepath_** +相关命令如下: - 命令示例: - ``` - hdc_std file send E:\hwadmin.hap /data/local/tmp/hwadmin.hap - ``` +- 文件发送命令 + **file send *localpath remotepath*** -- 安装命令 + 命令示例: - **install \[-r/-d/-g\] _package_** + ``` + hdc_std file send E:\hwadmin.hap /data/local/tmp/hwadmin.hap + ``` - 命令示例: +- 安装命令 + **install [-r/-d/-g] *package*** - ``` - hdc_std install hwadmin.hap - ``` + 命令示例: -- 日志抓取命令 + ``` + hdc_std install hwadmin.hap + ``` - **hilog** +- 日志抓取命令 + **hilog** - 命令示例: + 命令示例: - ``` - hdc_std hilog - ``` + ``` + hdc_std hilog + ``` -完整的hdc工具使用指导及命令格式请参见[hdc_std使用指导.md](/pages/00040e01)。 +完整的hdc工具使用指导及命令格式请参见[hdc_std使用指导](/pages/00080101)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/01.\346\265\213\350\257\225\347\224\250\344\276\213\345\274\200\345\217\221.md" "b/website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/01.\346\265\213\350\257\225\347\224\250\344\276\213\345\274\200\345\217\221.md" new file mode 100644 index 0000000000000000000000000000000000000000..bf05afe94a82d31604c8449f467e74ce59babbba --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/01.\346\265\213\350\257\225\347\224\250\344\276\213\345\274\200\345\217\221.md" @@ -0,0 +1,881 @@ +--- +title: 测试用例开发 +permalink: /pages/000800 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 测试子系统 +OpenHarmony为开发者提供了一套全面的自测试框架,开发者可根据测试需求开发相关测试用例,开发阶段提前发现缺陷,大幅提高代码质量。 + +本文从基础环境构建,用例开发,编译以及执行等方面介绍OpenHarmony测试框架如何运行和使用。 +## 基础环境构建 +测试框架依赖于python运行环境,在使用测试框架之前可参阅以下方式进行配置。 + - [环境配置](/pages/extra/bab7f0/) + - [源码获取](/pages/000102) + + +## 测试框架目录简介 +以下是测试框架的目录层级架构,在使用测试框架过程中可在相应目录查找对应组件。 +``` +test # 测试子系统 +├── developertest # 开发者测试组件 +│ ├── aw # 测试框架的静态库 +│ ├── config # 测试框架配置 +│ │ │ ... +│ │ └── user_config.xml # 用户使用配置 +│ ├── examples # 测试用例示例 +│ ├── src # 测试框架源码 +│ ├── third_party # 测试框架依赖第三方组件适配 +│ ├── reports # 测试结果报告 +│ ├── BUILD.gn # 测试框架编译入口 +│ ├── start.bat # 开发者测试入口(Windows) +│ └── start.sh # 开发者测试入口(Linux) +└── xdevice # 测试框架依赖组件 +``` +## 测试用例编写 +### 测试用例目录规划 +使用测试框架过程中,可根据以下层级关系规划测试用例目录。 +``` +subsystem # 子系统 +├── partA # 部件A +│ ├── moduleA # 模块A +│ │ ├── include +│ │ ├── src # 业务代码 +│ │ └── test # 测试目录 +│ │ ├── unittest # 单元测试 +│ │ │ ├── common # 公共用例 +│ │ │ │ ├── BUILD.gn # 测试用例编译配置 +│ │ │ │ └── testA_test.cpp # 单元测试用例源码 +│ │ │ ├── phone # 手机形态用例 +│ │ │ ├── ivi # 车机形态用例 +│ │ │ └── liteos-a # ipcamera使用liteos内核的用例 +│ │ ├── moduletest # 模块测试 +│ │ ... +│ │ +│ ├── moduleB # 模块B +│ ├── test +│ │ └── resource # 依赖资源 +│ │ ├── moduleA # 模块A +│ │ │ ├── ohos_test.xml # 资源配置文件 +│ │ ... └── 1.txt # 资源 +│ │ +│ ├── ohos_build # 编译入口配置 +│ ... +│ +... +``` +> **注意:** 测试用例根据不同设备形态差异分为通用用例和非通用用例,建议将通用用例存放在common目录下,非通用用例存放在相应设备形态目录下。 + +### 测试用例编写 +本测试框架支持多种语言用例编写,针对不同语言提供了不同的模板以供编写参考。 + +**C++参考示例** + +- 用例源文件命名规范 + + 测试用例源文件名称和测试套内容保持一致,文件命名采用全小写+下划线方式命名,以test结尾,具体格式为:[功能]_[子功能]_test,子功能支持向下细分。 +示例: + ``` + calculator_sub_test.cpp + ``` + +- 用例示例 + ``` + /* + * Copyright (c) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #include "calculator.h" + #include
| - | -- | -- | -
|---|---|---|
| - | -- | -- | -
| - | -- | -- | -
| - | -- | -- | -
| - | -- | -- | -
| - | -- | -- | -
| - | -- | -- | -
| - | -- | -- | -
| - | -- | -- | -
| - | -- | -- | -
|---|---|---|
| - | -- | -- | -
| - | -- | -|
| - | -- | -- | -
| - | -- | -
| + | ++ | ++ | ++ | ++ | +
|---|---|---|---|---|
| + | ++ | ++ | +swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker + |
++ | +
| + | ++ | +swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard + |
++ | +|
| + | ++ | ++ | +swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker + |
++ | +
| - | -- | -
|---|---|
| - | -text、image、progress、rating、span、marquee、image-animator、divider、search、menu、chart - |
-
| - | -div、list、list-item、stack、swiper、tabs、tab-bar、tab-content、list-item-group、refresh、dialog - |
-
| - | -- | -
8:返回包含permissions的app信息 | + | userId | 只读 | number | 是 | 用户ID | + +* 返回值 + + Promise
8:返回包含permissions的app信息 | + | userId | 只读 | number | 是 | 用户ID | + | callback | 只读 | AsyncCallback
1:返回包含abilityInfo的BundleInfo | + +* 返回值 + + Promise
1:返回包含abilityInfo的BundleInfo | + | callback | 只读 | AsyncCallback