From 4c6573e7ebba6e089115a807cbe0e83134e68c24 Mon Sep 17 00:00:00 2001 From: ql Date: Thu, 16 Sep 2021 16:19:07 +0800 Subject: [PATCH 1/8] fixed 5f4edfd from https://gitee.com/zjucx/docs/pulls/659 Update DMS README Signed-off-by: ql Change-Id: I0c11ebc4be9ca6942eddcb3b476a4d4c2b42784a --- zh-cn/readme/figures/dms-architecture_zh.png | Bin 0 -> 30187 bytes ...\246\345\255\220\347\263\273\347\273\237.md" | 15 +++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100755 zh-cn/readme/figures/dms-architecture_zh.png diff --git a/zh-cn/readme/figures/dms-architecture_zh.png b/zh-cn/readme/figures/dms-architecture_zh.png new file mode 100755 index 0000000000000000000000000000000000000000..10cafe44d6fcf73c8095ef6d91089519ea76245b GIT binary patch literal 30187 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∈ovlI7bSH;}-3MAAX}kmGl`Pl$ zCEzp+VNjFg+ zM%oxKG&tO(XZ5Wio - [简介](#section11660541593) +- [系统架构](#section13587185873516) - [目录](#section161941989596) - [相关仓](#section1371113476307) ## 简介 -在OpenHarmony系统中,分布式任务调度平台提供系统服务启动、注册、查询等功能。 +分布式任务调度模块负责跨设备组件管理,提供访问和控制远程组件的能力,支持分布式场景下的应用协同。主要功能如下: + +- 远程启动元能力:跨设备拉起远端设备上的指定元能力。 +- 远程迁移元能力:将元能力跨设备迁移到远端设备。 +- 远程绑定元能力:跨设备绑定远端设备上的指定元能力。 +- 系统服务管理:提供系统服务的本地启动、注册、查询等功能;提供系统服务的跨设备查询功能。 + +## 系统架构 **图 1** 子系统架构图 -![](figures/zh-cn_image_0000001162500331.png) +![](figures/dms-architecture_zh.png) ## 目录 @@ -39,5 +47,4 @@ distributedschedule\_safwk\_lite hdistributedschedule\_samgr\_lite -distributedschedule\_dms\_fwk\_lite - +distributedschedule\_dms\_fwk\_lite \ No newline at end of file -- Gitee From 36df6bebac7aa6df7f158a8d85726b9d21afadba Mon Sep 17 00:00:00 2001 From: Zachery Wu Date: Sun, 26 Sep 2021 17:25:52 +0800 Subject: [PATCH 2/8] modify kernel readme Signed-off-by: Zachery Wu --- .../kernel/kernel-standard-build.md | 43 +---- .../kernel/kernel-standard-overview.md | 5 +- .../kernel/kernel-standard-patch.md | 36 +++-- ...70\345\255\220\347\263\273\347\273\237.md" | 153 +++++++++--------- 4 files changed, 111 insertions(+), 126 deletions(-) diff --git a/zh-cn/device-dev/kernel/kernel-standard-build.md b/zh-cn/device-dev/kernel/kernel-standard-build.md index 1b52ac7b1f6..f83572008ee 100644 --- a/zh-cn/device-dev/kernel/kernel-standard-build.md +++ b/zh-cn/device-dev/kernel/kernel-standard-build.md @@ -1,47 +1,12 @@ # Linux内核编译与构建指导 -- [开发示例1](#section19369206113115) - - [场景1:版本级编译原生方式](#section1025111193220) - - [场景2:单独编译修改后的内核](#section17446652173211) - - -## 开发示例1 - -以hi3516dv300开源开发板+ubuntu x86主机开发环境为例。 - -### 场景1:版本级编译原生方式 +以hi3516dv300开源开发板+ubuntu x86主机开发环境为例 使用工程的全量编译命令,编译生成uImage内核镜像 ``` -./build.sh --product-name Hi3516DV300 # 编译hi3516dv300的uImage内核镜像 +./build.sh --product-name Hi3516DV300 # 编译hi3516dv300镜像 + --build-target build_kernel # 编译hi3516dv300的uImage内核镜像 + --gn-args linux_kernel_version=\"linux-5.10\" # 编译指定内核版本 ``` -### 场景2:单独编译修改后的内核 - -1. 准备工作 - - 1. 按[开发板Patch使用指导](kernel-standard-patch.md)打入所需补丁。 - 2. 准备编译环境,可以使用开源arm clang/gcc编译器。 - - 进入工程主目录配置环境变量: - - ``` - export PATH=`pwd`/prebuilts/clang/host/linux-x86/clang-r353983c/bin:`pwd`/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin/:$PATH # 配置编译环境 - MAKE_OPTIONES="ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- CC=clang HOSTCC=clang" # 使用工程项目自带的clang环境 - ``` - -2. 修改内核代码或内核config (OpenHarmony提供对应平台的defconfig供参考)。 -3. 创建编译目录及生成内核.config。 - - ``` - make ${MAKE_OPTIONES} hi3516dv300_emmc_smp_hos_l2_defconfig # 使用自带的默认config 构建内核 - ``` - -4. 编译生成对应的内核Image。 - - ``` - make ${MAKE_OPTIONES} -j32 uImage # 编译uImage内核镜像 - ``` - - diff --git a/zh-cn/device-dev/kernel/kernel-standard-overview.md b/zh-cn/device-dev/kernel/kernel-standard-overview.md index 0727fa97264..c60169d1584 100644 --- a/zh-cn/device-dev/kernel/kernel-standard-overview.md +++ b/zh-cn/device-dev/kernel/kernel-standard-overview.md @@ -15,7 +15,4 @@ LTS为长期支持版本,“长期支持”体现在对该版本内核的长 ## OpenHarmony内核版本选择 -OpenHarmony中的Linux内核从LTS版本中选择合适的版本作为内核基础版本,目前较多设备使用的4.19内核。4.4\~4.14LTS内核较旧,对新特性支持不足,且按计划在2023年左右会陆续不再维护,可使用周期较短,不适合作为首发版本。5.4LTS版本在已发产品中未广泛使用,4.19更为大家熟悉也可减少适配内核的周期,更新版本内核也会持续发布。 - -OpenHarmony 中的Linux内核推荐参考内存≥128MB的设备选用。 - +OpenHarmony中Linux内核从LTS版本中选择合适的版本作为内核的基础版本,目前已完成对Linux-4.19及Linux-5.10完成适配及支持。 diff --git a/zh-cn/device-dev/kernel/kernel-standard-patch.md b/zh-cn/device-dev/kernel/kernel-standard-patch.md index 87b3fea376c..4ec8244dcb6 100644 --- a/zh-cn/device-dev/kernel/kernel-standard-patch.md +++ b/zh-cn/device-dev/kernel/kernel-standard-patch.md @@ -1,17 +1,35 @@ # OpenHarmony开发板Patch使用指导 -Patch文件位于工程项目源码路径:kernel/linux/patches/linux-4.19,存放特定芯片架构驱动补丁。 +1. 合入HDF补丁 -如需使用特定芯片平台驱动的Patch,需要在内核仓代码完成对芯片平台驱动补丁合入。 + 在kernel/linux/build仓中,按照kernel.mk中HDF的补丁合入方法,合入不同内核版本对应的HDF内核补丁: + + ``` + $(OHOS_BUILD_HOME)/drivers/adapter/khdf/linux/patch_hdf.sh $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(HDF_PATCH_FILE) + ``` -合入芯片平台驱动补丁,针对不同芯片平台合入对应的patch: +2. 合入芯片平台驱动补丁 -以Hi3516dv300为例: + 以Hi3516DV300为例: + + 在kernel/linux/build仓中,按照kernel.mk中的芯片组件所对应的patch路径规则及命名规则,将对应的芯片组件patch放到对应路径下: + + ``` + DEVICE_PATCH_DIR := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch + DEVICE_PATCH_FILE := $(DEVICE_PATCH_DIR)/$(DEVICE_NAME).patch + ``` -``` -patch -p1 < device/hisilicon/hi3516dv300/sdk_linux/open_source/linux/hisi_linux-4.19_hos_l2.patch -``` +3. 修改自己所需要编译的config ->![](../public_sys-resources/icon-notice.gif) **须知:** ->由于OpenHarmony的编译构建流程中会拷贝kernel/linux-4.19的代码环境后进行打补丁动作,在使用OpenHarmony的版本级编译命令前,需要kernel/linux-4.19保持原代码环境。 + 在kernel/linux/build仓中,按照kernel.mk中的芯片组件所对应的patch路径规则及命名规则,将对应的芯片组件config放到对应路径下: + + ``` + KERNEL_CONFIG_PATH := $(OHOS_BUILD_HOME)/kernel/linux/config/${KERNEL_VERSION} + DEFCONFIG_FILE := $(DEVICE_NAME)_$(BUILD_TYPE)_defconfig + ``` + > **须知:** + > + >由于OpenHarmony工程的编译构建流程中会拷贝kernel/linux/linux-\*\.\*的代码环境后进行打补丁动作,在使用OpenHarmony的版本级编译命令前,需要kernel/linux/linux-\*\.\*原代码环境。 + > + >根据不同系统工程,编译完成后会在out目录下的kernel目录中生成对应实际编译的内核,基于此目录的内核,进行对应的config修改,将最后生成的\.config文件cp到config仓对应的路径文件里,即可生效。 diff --git "a/zh-cn/readme/\345\206\205\346\240\270\345\255\220\347\263\273\347\273\237.md" "b/zh-cn/readme/\345\206\205\346\240\270\345\255\220\347\263\273\347\273\237.md" index bf9da1b65ff..1c1f5ae1fff 100755 --- "a/zh-cn/readme/\345\206\205\346\240\270\345\255\220\347\263\273\347\273\237.md" +++ "b/zh-cn/readme/\345\206\205\346\240\270\345\255\220\347\263\273\347\273\237.md" @@ -9,17 +9,12 @@ - [LiteOS使用说明](#section118811457303) - [linux使用说明](#section1352114469620) -- [以hi3516dv300开源开发板+ubuntu x86主机开发环境为例](#section19369206113115) - - [场景1:版本级编译原生方式](#section1025111193220) - - [场景2:单独编译修改后的内核](#section17446652173211) - +- [构建说明](#section19369206113115) - [相关仓](#section27639463106) ## 简介 -OpenHarmony针对不同量级的系统,分别使用了不同形态的内核,分别为LiteOS和Linux。在轻量系统、小型系统和标准系统上,可以选用LiteOS;在标准系统上,可以选用Linux。 - -**表 1** +OpenHarmony针对不同量级的系统,分别使用了不同形态的内核,分别为LiteOS和Linux。在轻量系统、小型系统和标准系统上,可以选用LiteOS;在小型系统和标准系统上,可以选用Linux。 - - + @@ -64,37 +59,51 @@ OpenHarmonyLiteOS内核的源代码分为 kernel\_liteos\_a 和 kernel\_liteos\_ ## Linux -OpenHarmony的Linux内核基于开源Linux内核LTS 4.19.y分支演进,为满足不同的内核场景诉求,以内核 + patch的形式开展,其中内核在LTS 4.19内核的基础上合入CVE补丁 + OpenHarmony特性作为Common内核基线,针对性打上vendor厂商提供的板级芯片驱动补丁从而构成完整的内核。 - -Linux社区LTS 4.19.y分支信息请查看[kernel官网](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/log/?h=linux-4.19.y)。 - -内核组成模块,以开源Linux内核为基线, 合入了公共补丁:CVE补丁/OpenHarmony特性,在编译构建流程中针对具体芯片平台合入对应的架构驱动代码进行编译对应的内核镜像。所有补丁来源均遵守GPL-2.0协议。 - -1. CVE补丁 - - 补丁所涉及的CVE\(Common Vulnerabilities and Exposures\)安全漏洞是通过NVD \([https://nvd.nist.gov](内核子系统.md)/\)官方机构收集,且补丁已经进入LTS 4.19.y分支或主线,主要涉及存储\(btrfs/scsi/\)、网络\(net/bpf/mwifiex\) 、驱动\(xen/nfc\),对应CVE列表参考commit信息中CVE字段信息。 - - -1. OpenHarmony特性 - - HDF驱动、binder ipc转发功能等特性支持。 - -2. 特定芯片架构驱动补丁(比如Hi3516DV300) +OpenHarmony的Linux内核基于开源Linux内核LTS **4.19.y / 5.10.y** 分支演进,在此基线基础上,回合CVE补丁及OpenHarmony特性,作为OpenHarmony Common Kernel基线。针对不同的芯片,各厂商合入对应的板级驱动补丁,完成对OpenHarmony的基线适配。 - vendor厂商提供的特定芯片架构驱动代码: +Linux社区LTS 4.19.y分支信息请查看[kernel官网](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/log/?h=linux-4.19.y); - hisi\_linux-4.19\_hos\_l2.patch: 在Hi3516DV300芯片上支持arm架构的内核启动(DTS等)及对应的drm/mmc等驱动的支持。 +Linux社区LTS 5.10.y分支信息请查看[kernel官网](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/log/?h=linux-5.10.y)。 +内核的Patch组成模块,在编译构建流程中,针对具体芯片平台,合入对应的架构驱动代码,进行编译对应的内核镜像。所有补丁来源均遵守GPL-2.0协议。 ## 目录 ``` kernel/ -├── linux-4.19 # 4.19内核基线代码 -├── linux/config/linux-4.19 # 内核config -│ └── standard_common_defconfig # 标准系统的内核的common defconfig -│ └── hi3516dv300_emmc_smp_hos_l2_defconfig # 厂商Hisilicon对应的开源开发板Hi3516dv300标准系统的defconfig -├── linux/patches/linux-4.19 # 内核patch及编译脚本 +├── linux +│ ├── linux-4.19 # OpenHarmony linux-4.19 Common kernel +│ ├── linux-5.10 # OpenHarmony linux-5.10 Common kernel +│ ├── build +│ │ ├── BUILD.gn # 编译框架GN文件 +│ │ ├── kernel.mk # 内核编译文件 +│ │ └── ohos.build # 内核编译组件文件 +│ ├── patches +│ │ ├── linux-4.19 # linux-4.19 相关patch +│ │ │   └── hi3516dv300_patch +│ │ │   ├── hi3516dv300.patch # linux-4.19 hi3516dv300 SOC patch +│ │ │   └── hdf.patch # linux-4.19 hi3516dv300 hdf patch +│ │ └── linux-5.10 +│ │    └── hi3516dv300_patch +│ │    ├── hi3516dv300.patch # linux-5.10 hi3516dv300 SOC patch +│ │    └── hdf.patch # linux-5.10 hi3516dv300 hdf patch +│ └── config +│ ├── linux-4.19 +│ │   └── arch +│ │   └── arm +│ │   └── configs +│ │   ├── hi3516dv300_small_defconfig # 厂商Hisilicon对应的开源开发板Hi3516dv300小型系统的defconfig +│ │   ├── hi3516dv300_standard_defconfig # 厂商Hisilicon对应的开源开发板Hi3516dv300标准系统的defconfig +│ │   ├── small_common_defconfig # 小型系统的内核的common defconfig +│ │   └── standard_common_defconfig # 标准系统的内核的common defconfig +│ └── linux-5.10 +│ └── arch +│ └── arm +│ └── configs +│    ├── hi3516dv300_small_defconfig # 厂商Hisilicon对应的开源开发板Hi3516dv300小型系统的defconfig +│    ├── hi3516dv300_standard_defconfig # 厂商Hisilicon对应的开源开发板Hi3516dv300标准系统的defconfig +│    ├── small_common_defconfig # 小型系统的内核的common defconfig +│    └── standard_common_defconfig # 标准系统的内核的common defconfig └── liteos_a # liteos内核基线代码 ├── apps # 用户态的init和shell应用程序 ├── arch # 体系架构的目录,如arm等 @@ -148,57 +157,52 @@ Hi3518EV300默认使用jffs2文件系统,Hi3516DV300默认使用FAT文件系 ### linux使用说明 -如需使用上述patch,需要在内核代码完成对应芯片平台驱动补丁进行合入。 +1. 合入HDF补丁 -1. 合入芯片平台驱动补丁 + 在kernel/linux/build仓中,按照kernel.mk中HDF的补丁合入方法,合入不同内核版本对应的HDF内核补丁: + + ``` + $(OHOS_BUILD_HOME)/drivers/adapter/khdf/linux/patch_hdf.sh $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(HDF_PATCH_FILE) + ``` - 针对不同芯片平台合入对应的patch,以上述Hi3516DV300为例: +2. 合入芯片平台驱动补丁 - ``` - patch -p1 < device/hisilicon/hi3516dv300/sdk_linux/open_source/linux/hisi_linux-4.19_hos_l2.patch - ``` + 以Hi3516DV300为例: + + 在kernel/linux/build仓中,按照kernel.mk中的芯片组件所对应的patch路径规则及命名规则,将对应的芯片组件patch放到对应路径下: + + ``` + DEVICE_PATCH_DIR := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch + DEVICE_PATCH_FILE := $(DEVICE_PATCH_DIR)/$(DEVICE_NAME).patch + ``` - >![](public_sys-resources/icon-notice.gif) **须知:** - >由于OpenHarmony工程的编译构建流程中会拷贝kernel/linux-4.19的代码环境后进行打补丁动作,在使用OpenHarmony的版本级编译命令前,需要kernel/linux-4.19保持原代码环境。 +3. 修改自己所需要编译的config + 在kernel/linux/build仓中,按照kernel.mk中的芯片组件所对应的patch路径规则及命名规则,将对应的芯片组件config放到对应路径下: + + ``` + KERNEL_CONFIG_PATH := $(OHOS_BUILD_HOME)/kernel/linux/config/${KERNEL_VERSION} + DEFCONFIG_FILE := $(DEVICE_NAME)_$(BUILD_TYPE)_defconfig + ``` -## 以hi3516dv300开源开发板+ubuntu x86主机开发环境为例 + > **须知:** + > + >由于OpenHarmony工程的编译构建流程中会拷贝kernel/linux/linux-\*\.\*的代码环境后进行打补丁动作,在使用OpenHarmony的版本级编译命令前,需要kernel/linux/linux-\*\.\*原代码环境。 + > + >根据不同系统工程,编译完成后会在out目录下的kernel目录中生成对应实际编译的内核,基于此目录的内核,进行对应的config修改,将最后生成的\.config文件cp到config仓对应的路径文件里,即可生效。 -### 场景1:版本级编译原生方式 +## 构建说明 + +以hi3516dv300开源开发板+ubuntu x86主机开发环境为例 使用工程的全量编译命令,编译生成uImage内核镜像 ``` -./build.sh --product-name Hi3516DV300 # 编译hi3516dv300的uImage内核镜像 +./build.sh --product-name Hi3516DV300 # 编译hi3516dv300镜像 + --build-target build_kernel # 编译hi3516dv300的uImage内核镜像 + --gn-args linux_kernel_version=\"linux-5.10\" # 编译指定内核版本 ``` -### 场景2:单独编译修改后的内核 - -1. 准备工作 - - 准备编译环境,可以使用开源arm clang/gcc编译器,或者使用工程自带编译器。 - - 进入工程主目录配置环境变量: - - ``` - export PATH=`pwd`/prebuilts/clang/host/linux-x86/clang-r353983c/bin:`pwd`/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin/:$PATH # 配置编译环境 - MAKE_OPTIONES="ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- CC=clang HOSTCC=clang" # 使用工程项目自带的clang环境 - ``` - -2. 修改内核代码或内核config (OpenHarmony提供对应平台的defconfig供参考)。 -3. 创建编译目录及生成内核.config。 - - ``` - make ${MAKE_OPTIONES} hi3516dv300_emmc_smp_hos_l2_defconfig # 使用自带的默认config 构建内核 - ``` - -4. 编译生成对应的内核Image。 - - ``` - make ${MAKE_OPTIONES} -j32 uImage # 编译uImage内核镜像 - ``` - - ## 相关仓 **内核子系统** @@ -217,11 +221,12 @@ LiteOS: Linux: -kernel\_linux\_patches +[kernel\_linux\_patches](https://gitee.com/openharmony/kernel_linux_patches/blob/master/README_zh.md) -device\_hisilicon\_hi3516dv300 +[kernel\_linux\_config](https://gitee.com/openharmony/kernel_linux_config/blob/master/README_zh.md) -kernel\_linux\_config +[kernel\_linux\_build](https://gitee.com/openharmony/kernel_linux_build/blob/master/README_zh.md) -kernel\_linux-4.19 +[kernel\_linux\_4.19](https://gitee.com/openharmony/kernel_linux_4.19/blob/master/README) +[kernel\_linux\_5.10](https://gitee.com/openharmony/kernel_linux_5.10/blob/master/README) \ No newline at end of file -- Gitee From a922f1c6a0dc35cee6bac19f590826d3727cf97b Mon Sep 17 00:00:00 2001 From: conglin Date: Mon, 27 Sep 2021 16:36:45 +0800 Subject: [PATCH 3/8] update docker Signed-off-by: conglin --- docker/standard/CHANGELOG.md | 6 ++ docker/standard/CHANGELOG_en.md | 8 ++- docker/standard/Readme-en.md | 13 ++-- docker/standard/Readme.md | 13 ++-- docker/standard/build.sh | 2 +- docker/standard/dockerfile | 9 +-- docker/standard/prebuilts_download.sh | 67 --------------------- docker/standard/prepare.sh | 86 --------------------------- 8 files changed, 26 insertions(+), 178 deletions(-) delete mode 100755 docker/standard/prebuilts_download.sh delete mode 100755 docker/standard/prepare.sh diff --git a/docker/standard/CHANGELOG.md b/docker/standard/CHANGELOG.md index c6089a6645b..42434adbdc1 100644 --- a/docker/standard/CHANGELOG.md +++ b/docker/standard/CHANGELOG.md @@ -1,3 +1,9 @@ + ### 0.0.4(2021/09/18) + +1、删除编译依赖的工具预装。 + +2、增加安装ruby。 + ### 0.0.3(2021/08/30) 1、更新llvm版本从10.0.1-62608更新到10.0.1-69957。 diff --git a/docker/standard/CHANGELOG_en.md b/docker/standard/CHANGELOG_en.md index fa141e90b6f..c14f7da669e 100644 --- a/docker/standard/CHANGELOG_en.md +++ b/docker/standard/CHANGELOG_en.md @@ -1,4 +1,10 @@ - ### 0.0.2(2021/08/11) + ### 0.0.4(2021/09/18) + +1\. dropped pre-installed build dependency tools. + +2\. Added the installation of ruby. + + ### 0.0.3(2021/08/30) 1\. Updated LLVM from 10.0.1-62608 to 10.0.1-69957. diff --git a/docker/standard/Readme-en.md b/docker/standard/Readme-en.md index 43c04b716be..679d8e054a1 100755 --- a/docker/standard/Readme-en.md +++ b/docker/standard/Readme-en.md @@ -10,11 +10,11 @@ The Docker image of OpenHarmony is hosted on [HUAWEI Cloud SWR](https://auth.hua 1. Obtain the Docker image. ``` -docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 +docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` 2. Go to the root directory of OpenHarmony code and run the following command to access the Docker build environment: ``` -docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 +docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` ##### **Method 2: Using the Dockerfile to Build a Local Docker Image** @@ -30,15 +30,12 @@ cd docs/docker/standard ``` 3. Go to the root directory of OpenHarmony code and run the following command to access the Docker build environment: ``` -docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.3 +docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.4 ``` ### Building for Standard-System Devices (reference memory ≥ 128 MB) -1. Run the preprocessing script in the root directory of the source code. -``` -../scripts/prepare.sh -``` -2. Run the following script to start building for Standard-System Devices (reference memory ≥ 128 MB) +Run the following script to start building for Standard-System Devices (reference memory ≥ 128 MB) + ``` ./build.sh --product-name {product_name} ``` diff --git a/docker/standard/Readme.md b/docker/standard/Readme.md index a68037a0ad1..81e6c8a9656 100755 --- a/docker/standard/Readme.md +++ b/docker/standard/Readme.md @@ -10,11 +10,11 @@ OpenHarmony的Docker镜像托管在HuaweiCloud SWR上。开发者可以通过该 1. 获取Docker镜像。 ``` -docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 +docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` 2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 ``` -docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 +docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` ##### 方式二:通过Dockerfile 构建本地Docker镜像进行构建 @@ -30,15 +30,12 @@ cd docs/docker/standard ``` 3. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 ``` -docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.3 +docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.4 ``` ### 编译源码-标准系统类设备(参考内存≥128MB) -1. 在源码的根目录执行预处理脚本。 -``` -../scripts/prepare.sh -``` -2. 通过如下编译脚本启动标准系统类设备(参考内存≥128MB)的编译。 +通过如下编译脚本启动标准系统类设备(参考内存≥128MB)的编译。 + ``` ./build.sh --product-name {product_name} ``` diff --git a/docker/standard/build.sh b/docker/standard/build.sh index 5371886ecb6..7627d6123d5 100755 --- a/docker/standard/build.sh +++ b/docker/standard/build.sh @@ -13,4 +13,4 @@ #!/bin/sh -docker build -t openharmony-docker-standard:0.0.3 . +docker build -t openharmony-docker-standard:0.0.4 . diff --git a/docker/standard/dockerfile b/docker/standard/dockerfile index 9f17b6c9c2b..6e4ef8c3f48 100755 --- a/docker/standard/dockerfile +++ b/docker/standard/dockerfile @@ -17,14 +17,11 @@ WORKDIR /home/openharmony ARG DEBIAN_FRONTEND=noninteractive ARG PREBUILTS_DIR=/home/prebuilts ARG HOME_TOOLS=/home/tools -ARG HOME_SCRIPTS=/home/scripts RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak COPY sources.list /etc/apt -COPY prebuilts_download.sh prepare.sh $HOME_SCRIPTS/ - RUN apt-get update \ && apt-get install -y \ apt-utils \ @@ -85,9 +82,10 @@ RUN apt-get update \ libc6-dev-i386 \ lib32z-dev \ openjdk-8-jdk \ + ruby \ && rm -rf /bin/sh \ && ln -s /bin/bash /bin/sh \ - && mkdir -p $PREBUILTS_DIR/prebuilts $HOME_TOOLS $HOME_SCRIPTS + && mkdir -p $PREBUILTS_DIR/prebuilts $HOME_TOOLS RUN wget -P $HOME_TOOLS https://mirrors.huaweicloud.com/nodejs/v12.18.4/node-v12.18.4-linux-x64.tar.gz \ && wget -P $HOME_TOOLS https://mirrors.huaweicloud.com/nodejs/v12.18.4/node-v12.18.4-darwin-x64.tar.gz \ @@ -98,7 +96,4 @@ RUN wget -P $HOME_TOOLS https://mirrors.huaweicloud.com/nodejs/v12.18.4/node-v12 && export PATH=$PATH:$PREBUILTS_DIR/prebuilts/node-v12.18.4-linux-x64/bin \ && export PATH=$PATH:$PREBUILTS_DIR/prebuilts/hc-gen \ && rm -rf $HOME_TOOLS \ - && chmod -R 777 $HOME_SCRIPTS/*.sh \ - && $HOME_SCRIPTS/prebuilts_download.sh \ - && rm -rf /tmp/prebuilts \ && npm install -g @ohos/hpm-cli --registry https://registry.npm.taobao.org diff --git a/docker/standard/prebuilts_download.sh b/docker/standard/prebuilts_download.sh deleted file mode 100755 index 307b7069210..00000000000 --- a/docker/standard/prebuilts_download.sh +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (c) 2020 Huawei 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. - -#!/bin/bash -# 代码下载目录 -code_dir=/home/prebuilts -# 二进制所在目录,用于临时存放二进制,二进制整个大小约10G,请确保有足够的空间 -bin_dir=/tmp/prebuilts -# 二进制关系 -copy_config=""" -prebuilts/cmake,https://repo.huaweicloud.com/harmonyos/compiler/cmake/3.16.5/darwin/cmake-darwin-x86-3.16.5.tar.gz -prebuilts/cmake,https://repo.huaweicloud.com/harmonyos/compiler/cmake/3.16.5/linux/cmake-linux-x86-3.16.5.tar.gz -prebuilts/cmake,https://repo.huaweicloud.com/harmonyos/compiler/cmake/3.16.5/windows/cmake-windows-x86-3.16.5.tar.gz -prebuilts/build-tools/darwin-x86/bin,https://repo.huaweicloud.com/harmonyos/compiler/gn/1717/darwin/gn-darwin-x86-1717.tar.gz -prebuilts/build-tools/linux-x86/bin,https://repo.huaweicloud.com/harmonyos/compiler/gn/1717/linux/gn-linux-x86-1717.tar.gz -prebuilts/build-tools/darwin-x86/bin,https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.10.1/darwin/ninja-darwin-x86-1.10.1.tar.gz -prebuilts/build-tools/linux-x86/bin,https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.10.1/linux/ninja-linux-x86-1.10.1.tar.gz -prebuilts/python,https://repo.huaweicloud.com/harmonyos/compiler/python/3.8.5/darwin/python-darwin-x86-3.8.5.tar.gz -prebuilts/python,https://repo.huaweicloud.com/harmonyos/compiler/python/3.8.5/linux/python-linux-x86-3.8.5.tar.gz -prebuilts/mingw-w64/ohos/linux-x86_64,https://repo.huaweicloud.com/harmonyos/compiler/mingw-w64/7.0.0/clang-mingw.tar.gz -prebuilts,https://repo.huaweicloud.com/harmonyos/compiler/hc-gen/0.65/linux/hc-gen-0.65-linux.tar -prebuilts/gcc/linux-x86/arm,https://repo.huaweicloud.com/harmonyos/compiler/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi/1.0/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi.tar.gz -prebuilts/gcc/linux-x86/aarch64,https://repo.huaweicloud.com/harmonyos/compiler/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi/1.0/gcc-linaro-7.5.0-2019.12-x86_64-aarch64-linux-gnu.tar.xz -prebuilts/sdk/js-loader/build-tools,https://repo.huaweicloud.com/harmonyos/compiler/ace-loader/1.0/ace-loader.tar.gz -prebuilts/clang/ohos/linux-x86_64,https://repo.huaweicloud.com/harmonyos/compiler/clang/10.0.1-69957/linux/clang-69957-linux-x86_64.tar.bz2 -prebuilts/build-tools/common,https://repo.huaweicloud.com/harmonyos/compiler/restool/1.023-c/restool.tar.gz -""" -if [ ! -d "${bin_dir}" ];then - mkdir -p "${bin_dir}" -fi - -for i in `echo ${copy_config}` -do - unzip_dir=`echo $i|awk -F ',' '{print $1}'` - huaweicloud_url=`echo $i|awk -F ',' '{print $2}'` - md5_huaweicloud_url=`echo ${huaweicloud_url}|md5sum|awk '{print $1}'` - bin_file=`basename ${huaweicloud_url}` - bin_file_suffix=${bin_file#*.} - #huaweicloud_file_name=`echo ${huaweicloud_url}|awk -F '/' '{print $NF}'` - - if [ ! -d "${code_dir}/${unzip_dir}" ];then - mkdir -p "${code_dir}/${unzip_dir}" - fi - if [ ! -f "${bin_dir}/${md5_huaweicloud_url}.${bin_file_suffix}" ];then - # 代理不需要鉴权: wget -P ${bin_dir} -e "https_proxy=http://domain.com:port" ${huaweicloud_url} - # 代理需要鉴权(账号密码特殊字符均需要URL转义): wget -P ${bin_dir} -e "https_proxy=http://username:password@domain.com:port" ${huaweicloud_url} - # 不需要代理 - wget -O ${bin_dir}/${md5_huaweicloud_url}.${bin_file_suffix} ${huaweicloud_url} - fi - if [ "X${bin_file_suffix:0-3}" = "Xzip" ];then - unzip "${bin_dir}/${md5_huaweicloud_url}.${bin_file_suffix}" -d "${code_dir}/${unzip_dir}/" - elif [ "X${bin_file_suffix:0-6}" = "Xtar.gz" ];then - tar -xvzf "${bin_dir}/${md5_huaweicloud_url}.${bin_file_suffix}" -C "${code_dir}/${unzip_dir}" - else - tar -xvf "${bin_dir}/${md5_huaweicloud_url}.${bin_file_suffix}" -C "${code_dir}/${unzip_dir}" - fi -done diff --git a/docker/standard/prepare.sh b/docker/standard/prepare.sh deleted file mode 100755 index d3e3a1f65a7..00000000000 --- a/docker/standard/prepare.sh +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (c) 2020 Huawei 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. - -#!/bin/bash - -WORKDIR=/home/openharmony -TOOLSDIR=/home/prebuilts/prebuilts - -rm -rf /usr/bin/python -ln -s /usr/bin/python2.7 /usr/bin/python - -if [[ -d $WORKDIR/third_party/jsframework ]]; then - echo copy jsframework node_modules - cd $WORKDIR/third_party/jsframework - npm install --registry https://registry.npm.taobao.org -fi - -if [[ -d $TOOLSDIR/build-tools/common/js-framework ]]; then - rm -rf $TOOLSDIR/build-tools/common/js-framework -fi -mkdir -p $TOOLSDIR/build-tools/common/js-framework -cp -r $WORKDIR/third_party/jsframework/node_modules $TOOLSDIR/build-tools/common/js-framework - -if [[ -d $TOOLSDIR/build-tools/common/nodejs ]]; then - rm -rf $TOOLSDIR/build-tools/common/nodejs -fi - -mkdir -p $TOOLSDIR/build-tools/common/nodejs -cp -r $TOOLSDIR/node-v12.18.4-linux-x64 $TOOLSDIR/build-tools/common/nodejs -cp -r $TOOLSDIR/node-v12.18.4-darwin-x64 $TOOLSDIR/build-tools/common/nodejs - -if [[ -h $WORKDIR/prebuilts/cmake ]]; then - rm $WORKDIR/prebuilts/cmake -fi -echo link cmake -ln -s $TOOLSDIR/cmake $WORKDIR/prebuilts/cmake - -if [[ -h $WORKDIR/prebuilts/build-tools ]]; then - rm $WORKDIR/prebuilts/build-tools -fi -echo link build-tools -ln -s $TOOLSDIR/build-tools $WORKDIR/prebuilts/build-tools - -if [[ -h $WORKDIR/prebuilts/python ]]; then - rm $WORKDIR/prebuilts/python -fi -echo link python -ln -s $TOOLSDIR/python $WORKDIR/prebuilts/python - -if [[ -h $WORKDIR/prebuilts/mingw-w64 ]]; then - rm $WORKDIR/prebuilts/mingw-w64 -fi -echo link mingw-w64 -ln -s $TOOLSDIR/mingw-w64 $WORKDIR/prebuilts/mingw-w64 - -mv $TOOLSDIR/clang/ohos/linux-x86_64/clang-69957 $TOOLSDIR/clang/ohos/linux-x86_64/llvm -if [[ -h $WORKDIR/prebuilts/clang ]]; then - rm $WORKDIR/prebuilts/clang -fi -echo link clang -ln -snf 10.0.1 $TOOLSDIR/clang/ohos/linux-x86_64/llvm/lib/clang/current -ln -s $TOOLSDIR/clang $WORKDIR/prebuilts/clang - -mv $TOOLSDIR/gcc/linux-x86/arm/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi $TOOLSDIR/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi -if [[ -h $WORKDIR/prebuilts/gcc ]]; then - rm $WORKDIR/prebuilts/gcc -fi -echo link gcc -ln -s $TOOLSDIR/gcc $WORKDIR/prebuilts/gcc - -if [[ -h $WORKDIR/prebuilts/sdk ]]; then - rm $WORKDIR/prebuilts/sdk -fi -echo link sdk -ln -s $TOOLSDIR/sdk $WORKDIR/prebuilts/sdk - -- Gitee From 64208a9748ece33fb2ced53ae8cbe3aaca3d703f Mon Sep 17 00:00:00 2001 From: conglin Date: Mon, 27 Sep 2021 16:46:06 +0800 Subject: [PATCH 4/8] update readme Signed-off-by: conglin --- en/device-dev/get-code/gettools-acquire.md | 24 +++++++---------- .../quickstart-standard-docker-environment.md | 26 ++++++++----------- zh-cn/device-dev/get-code/gettools-acquire.md | 26 +++++++------------ .../quickstart-standard-docker-environment.md | 26 ++++++++----------- 4 files changed, 41 insertions(+), 61 deletions(-) diff --git a/en/device-dev/get-code/gettools-acquire.md b/en/device-dev/get-code/gettools-acquire.md index 854a055a195..1762f52d9ff 100644 --- a/en/device-dev/get-code/gettools-acquire.md +++ b/en/device-dev/get-code/gettools-acquire.md @@ -52,7 +52,7 @@ OpenHarmony provides the following two types of Docker environments for you to q -

系统级别

@@ -43,8 +38,8 @@ OpenHarmony针对不同量级的系统,分别使用了不同形态的内核,

Linux

    

×

+

swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard

0.0.3

+

0.0.4

HPM-based Docker environment

@@ -69,6 +69,7 @@ OpenHarmony provides the following two types of Docker environments for you to q
+ ## Preparations Before using the Docker environment, perform the following operations: @@ -178,7 +179,7 @@ hb set 1. Obtain the Docker image. ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` 2. Go to the root directory of OpenHarmony code and run the following command to access the Docker build environment: @@ -212,21 +213,15 @@ hb set ### Building for Standard-System Devices \(reference memory ≥ 128 MB\) -1. Run the preprocessing script in the root directory of the source code. - - ``` - ../scripts/prepare.sh - ``` - -2. Run the following script to start building for standard-system devices \(reference memory ≥ 128 MB\). +Run the following script to start building for standard-system devices \(reference memory ≥ 128 MB\). - ``` - ./build.sh --product-name {product_name} - ``` +``` +./build.sh --product-name {product_name} +``` - **product\_name** indicates the platform supported by the current distribution, for example, Hi3516D V300. +**product\_name** indicates the platform supported by the current distribution, for example, Hi3516D V300. - Files generated during building are stored in the **out/ohos-arm-release/** directory, and the generated image is stored in the **out/ohos-arm-release/packages/phone/images/** directory. +Files generated during building are stored in the **out/ohos-arm-release/** directory, and the generated image is stored in the **out/ohos-arm-release/packages/phone/images/** directory. >![](../public_sys-resources/icon-note.gif) **NOTE:** @@ -307,4 +302,3 @@ Start building. Docker can be automatically installed only in Ubuntu. If you are hpm run distWithDocker solution={product} ``` - diff --git a/en/device-dev/quick-start/quickstart-standard-docker-environment.md b/en/device-dev/quick-start/quickstart-standard-docker-environment.md index a40bf48c762..61ce7a9c1ae 100644 --- a/en/device-dev/quick-start/quickstart-standard-docker-environment.md +++ b/en/device-dev/quick-start/quickstart-standard-docker-environment.md @@ -44,6 +44,7 @@ Method 1 \(recommended\): Use the **repo** tool to download the source code ov repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify repo sync -c repo forall -c 'git lfs pull' +bash build/prebuilts_download.sh ``` Method 2: Use the **repo** tool to download the source code over HTTPS. @@ -52,6 +53,7 @@ Method 2: Use the **repo** tool to download the source code over HTTPS. repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify repo sync -c repo forall -c 'git lfs pull' +bash build/prebuilts_download.sh ``` ## Obtaining the Docker Environment @@ -61,13 +63,13 @@ repo forall -c 'git lfs pull' 1. Obtain the Docker image. ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` 2. Go to the root directory of OpenHarmony code and run the following command to access the Docker build environment: ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` @@ -89,27 +91,21 @@ repo forall -c 'git lfs pull' 3. Go to the root directory of OpenHarmony code and run the following command to access the Docker build environment: ``` - docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.3 + docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.4 ``` ## Building Source Code -1. Run the preprocessing script in the root directory of the source code. +1. Run the following script to start building for Standard-System Devices \(reference memory ≥ 128 MB\): - ``` - ../scripts/prepare.sh - ``` - -2. Run the following script to start building for Standard-System Devices \(reference memory ≥ 128 MB\): - - ``` - ./build.sh --product-name {product_name} - ``` + ``` + ./build.sh --product-name {product_name} + ``` - **product\_name** indicates the product supported by the current distribution, for example, **Hi3516DV300**. + **product\_name** indicates the product supported by the current distribution, for example, **Hi3516DV300**. - Files generated during the build are stored in the **out/ohos-arm-release/** directory, and the generated image is stored in the **out/ohos-arm-release/packages/phone/images/** directory. + Files generated during the build are stored in the **out/ohos-arm-release/** directory, and the generated image is stored in the **out/ohos-arm-release/packages/phone/images/** directory. 3. Burn the image. For details, see [Burning Images](quickstart-standard-burn.md). diff --git a/zh-cn/device-dev/get-code/gettools-acquire.md b/zh-cn/device-dev/get-code/gettools-acquire.md index a2c790b1188..8455c3195d2 100644 --- a/zh-cn/device-dev/get-code/gettools-acquire.md +++ b/zh-cn/device-dev/get-code/gettools-acquire.md @@ -52,7 +52,7 @@ OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完

swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard

-

0.0.3

+

0.0.4

HPM Docker环境

@@ -69,6 +69,7 @@ OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完 + ## 环境准备 在使用docker环境前需要先完成以下操作: @@ -178,13 +179,13 @@ hb set 1. 获取Docker镜像。 ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` 2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` @@ -212,21 +213,15 @@ hb set ### 编译源码-标准系统类设备(参考内存≥128MB) -1. 在源码的根目录执行预处理脚本。 - - ``` - ../scripts/prepare.sh - ``` - -2. 通过如下编译脚本启动标准系统类设备(参考内存≥128MB)的编译。 +通过如下编译脚本启动标准系统类设备(参考内存≥128MB)的编译。 - ``` - ./build.sh --product-name {product_name} - ``` +``` +./build.sh --product-name {product_name} +``` - \{product\_name\}为当前版本支持的平台。比如:Hi3516DV300等。 +\{product\_name\}为当前版本支持的平台。比如:Hi3516DV300等。 - 编译所生成的文件都归档在out/ohos-arm-release/目录下,结果镜像输出在 out/ohos-arm-release/packages/phone/images/ 目录下。 +编译所生成的文件都归档在out/ohos-arm-release/目录下,结果镜像输出在 out/ohos-arm-release/packages/phone/images/ 目录下。 >![](../public_sys-resources/icon-note.gif) **说明:** @@ -307,4 +302,3 @@ docker\_dist是一个[HPM](https://hpm.harmonyos.com/)系统中的模板组件 hpm run distWithDocker solution={product} ``` - diff --git a/zh-cn/device-dev/quick-start/quickstart-standard-docker-environment.md b/zh-cn/device-dev/quick-start/quickstart-standard-docker-environment.md index 7169920a198..9fb450cd325 100644 --- a/zh-cn/device-dev/quick-start/quickstart-standard-docker-environment.md +++ b/zh-cn/device-dev/quick-start/quickstart-standard-docker-environment.md @@ -44,6 +44,7 @@ OpenHarmony标准系统为开发者提供的Docker环境已经将对应的编译 repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify repo sync -c repo forall -c 'git lfs pull' +bash build/prebuilts_download.sh ``` 方式二:通过repo + https 下载。 @@ -52,6 +53,7 @@ repo forall -c 'git lfs pull' repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify repo sync -c repo forall -c 'git lfs pull' +bash build/prebuilts_download.sh ``` ## 获取Docker环境 @@ -61,13 +63,13 @@ repo forall -c 'git lfs pull' 1. 获取Docker镜像。 ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` 2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.3 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.4 ``` @@ -89,27 +91,21 @@ repo forall -c 'git lfs pull' 3. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 ``` - docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.3 + docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.4 ``` ## 编译 -1. 在源码的根目录执行预处理脚本。 +1. 通过如下编译脚本启动标准系统类设备(参考内存≥128MB)的编译。 - ``` - ../scripts/prepare.sh - ``` - -2. 通过如下编译脚本启动标准系统类设备(参考内存≥128MB)的编译。 - - ``` - ./build.sh --product-name {product_name} - ``` + ``` + ./build.sh --product-name {product_name} + ``` - \{product\_name\}为当前版本支持的平台,比如:Hi3516DV300 + \{product\_name\}为当前版本支持的平台,比如:Hi3516DV300 - 编译所生成的文件都归档在out/ohos-arm-release/目录下,结果镜像输出在 out/ohos-arm-release/packages/phone/images/ 目录下。 + 编译所生成的文件都归档在out/ohos-arm-release/目录下,结果镜像输出在 out/ohos-arm-release/packages/phone/images/ 目录下。 3. 编译源码完成,请进行镜像烧录,具体请参见[镜像烧录](quickstart-standard-burn.md)。 -- Gitee From 4c41ead7736895a92143aba16ddeffe12867416e Mon Sep 17 00:00:00 2001 From: zjucx Date: Tue, 28 Sep 2021 16:26:54 +0800 Subject: [PATCH 5/8] modify dms figure Signed-off-by: zjucx --- zh-cn/readme/figures/dms-architecture_zh.png | Bin 30187 -> 54526 bytes 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 zh-cn/readme/figures/dms-architecture_zh.png diff --git a/zh-cn/readme/figures/dms-architecture_zh.png b/zh-cn/readme/figures/dms-architecture_zh.png old mode 100755 new mode 100644 index 10cafe44d6fcf73c8095ef6d91089519ea76245b..588c33751dff097e9a8bb9b21d731a1ca1633ffd GIT binary patch literal 54526 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∈ovlI7bSH;}-3MAAX}kmGl`Pl$ zCEzp+VNjFg+ zM%oxKG&tO(XZ5Wio Date: Tue, 28 Sep 2021 20:24:56 +0530 Subject: [PATCH 6/8] Update audio_management.md Signed-off-by: Vaidegi B --- .../js-reference/audio-management.md | 269 ++++++++---------- 1 file changed, 118 insertions(+), 151 deletions(-) diff --git a/en/application-dev/js-reference/audio-management.md b/en/application-dev/js-reference/audio-management.md index e538c610ff6..195effeb78b 100644 --- a/en/application-dev/js-reference/audio-management.md +++ b/en/application-dev/js-reference/audio-management.md @@ -1,63 +1,63 @@ # Audio Management -- [Modules to Import](#s56d19203690d4782bfc74069abb6bd71) -- [Required Permissions](#section11257113618419) -- [getAudioManager\(\): AudioManager](#section84581011418) -- [AudioVolumeType](#section92261857172218) -- [DeviceFlag](#section11285183164210) -- [DeviceRole](#section380038142619) -- [DeviceType](#section11727420122710) -- [AudioRingMode7+](#section14948916131018) -- [AudioManager](#section8265143814015) - - [setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void](#section189141826104616) - - [setVolume\(volumeType: AudioVolumeType, volume: number\): Promise](#section102021249114612) - - [getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#section4387320194714) - - [getVolume\(volumeType: AudioVolumeType\): Promise](#section04121965119) - - [getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#section188714283511) - - [getMinVolume\(volumeType: AudioVolumeType\): Promise](#section41556389511) - - [getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#section690395418516) - - [getMaxVolume\(volumeType: AudioVolumeType\): Promise](#section155151345217) - - [mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void7+](#section13516136134613) - - [mute\(volumeType: AudioVolumeType, mute: boolean\): Promise7+](#section7519036144616) - - [isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+](#section10684183819585) - - [isMute\(volumeType: AudioVolumeType\): Promise7+](#section6920211145610) - - [isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+](#section380012544121) - - [isActive\(volumeType: AudioVolumeType\): Promise7+](#section1880315481216) - - [setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void7+](#section18572131483613) - - [setRingerMode\(mode: AudioRingMode\): Promise7+](#section55741914143615) - - [getRingerMode\(callback: AsyncCallback\): void7+](#section149044108162) - - [getRingerMode\(\): Promise7+](#section13908210101620) - - [setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void7+](#section1691957174818) - - [setAudioParameter\(key: string, value: string\): Promise7+](#section18121057174820) - - [getAudioParameter\(key: string, callback: AsyncCallback\): void7+](#section1415145714812) - - [getAudioParameter\(key: string\): Promise7+](#section3185577485) - - [getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void](#section11536182020523) - - [getDevices\(deviceFlag: DeviceFlag\): Promise](#section181733125210) - - [setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void7+](#section103558400222) - - [setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise7+](#section1235914401228) - - [isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void7+](#section12363240122219) - - [isDeviceActive\(deviceType: DeviceType\): Promise7+](#section18366184012213) - - [setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void7+](#section14703163618122) - - [setMicrophoneMute\(mute: boolean\): Promise7+](#section56287111791) - - [isMicrophoneMute\(callback: AsyncCallback\): void7+](#section6632141119912) - - [isMicrophoneMute\(\): Promise7+](#section196363111918) - -- [AudioDeviceDescriptor](#section164657411927) - - [Attributes](#section4947115405) - -- [AudioDeviceDescriptors](#section5181155710523) - -## Modules to Import + - [Modules to Import](#modules-to-import) + - [Required Permissions](#required-permissions) + - [getAudioManager\(\): AudioManager](#getaudiomanager-audiomanager) + - [AudioVolumeType](#audiovolumetype) + - [DeviceFlag](#deviceflag) + - [DeviceRole](#devicerole) + - [DeviceType](#devicetype) + - [ActiveDeviceType7+](#activedevicetype) + - [AudioRingMode7+](#audioringmode) + - [AudioManager](#audiomanager) + - [setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void](#setvolume-asynccallback) + - [setVolume\(volumeType: AudioVolumeType, volume: number\): Promise](#setvolume-promise) + - [getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#getvolume-asynccallback) + - [getVolume\(volumeType: AudioVolumeType\): Promise](#getvolume-promise) + - [getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#getminvolume-asynccallback) + - [getMinVolume\(volumeType: AudioVolumeType\): Promise](#getminvolume-promise) + - [getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#getmaxvolume-asynccallback) + - [getMaxVolume\(volumeType: AudioVolumeType\): Promise](#getmaxvolume-promise) + - [mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void7+](#mute-asynccallback) + - [mute\(volumeType: AudioVolumeType, mute: boolean\): Promise7+](#mute-promise) + - [isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+](#ismute-asynccallback) + - [isMute\(volumeType: AudioVolumeType\): Promise7+](#ismute-promise) + - [isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+](#isactive-asynccallback) + - [isActive\(volumeType: AudioVolumeType\): Promise7+](#isactive-promise) + - [setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void7+](#setringermode-asynccallback) + - [setRingerMode\(mode: AudioRingMode\): Promise7+](#setringermode-promise) + - [getRingerMode\(callback: AsyncCallback\): void7+](#getringermode-asynccallback) + - [getRingerMode\(\): Promise7+](#getringermode-promise) + - [setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void7+](#setaudioparameter-asynccallback) + - [setAudioParameter\(key: string, value: string\): Promise7+](#setaudioparameter-promise) + - [getAudioParameter\(key: string, callback: AsyncCallback\): void7+](#getaudioparameter-asynccallback) + - [getAudioParameter\(key: string\): Promise7+](#getaudioparameter-promise) + - [getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void](#getdevices-asynccallback) + - [getDevices\(deviceFlag: DeviceFlag\): Promise](#getdevices-promise) + - [setDeviceActive\(deviceType: ActiveDeviceType, active: boolean, callback: AsyncCallback\): void7+](#setdeviceactive-asynccallback) + - [setDeviceActive\(deviceType: ActiveDeviceType, active: boolean\): Promise7+](#setdeviceactive-promise) + - [isDeviceActive\(deviceType: ActiveDeviceType, callback: AsyncCallback\): void7+](#isdeviceactive-asynccallback) + - [isDeviceActive\(deviceType: ActiveDeviceType\): Promise7+](#isdeviceactive-promise) + - [setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void7+](#setmicrophonemute-asynccallback) + - [setMicrophoneMute\(mute: boolean\): Promise7+](#setmicrophonemute-promise) + - [isMicrophoneMute\(callback: AsyncCallback\): void7+](#ismicrophonemute-asynccallback) + - [isMicrophoneMute\(\): Promise7+](#ismicrophonemute-promise) + - [AudioDeviceDescriptor](#audiodevicedescriptor) + - [Attributes](#attributes) + - [AudioDeviceDescriptors](#audiodevicedescriptors) + + +## Modules to Import ``` import audio from '@ohos.multimedia.audio'; ``` -## Required Permissions +## Required Permissions None -## getAudioManager\(\): AudioManager +## getAudioManager\(\): AudioManager Obtains an **AudioManager** instance. @@ -78,13 +78,14 @@ Obtains an **AudioManager** instance. + **Example** ``` var audioManager = audio.getAudioManager(); ``` -## AudioVolumeType +## AudioVolumeType Enumerates audio stream types. @@ -114,7 +115,7 @@ Enumerates audio stream types. -## DeviceFlag +## DeviceFlag Enumerates audio device flags. @@ -151,7 +152,7 @@ Enumerates audio device flags. -## DeviceRole +## DeviceRole Enumerates audio device roles. @@ -181,65 +182,31 @@ Enumerates audio device roles. -## DeviceType +## DeviceType Enumerates audio device types. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Default Value

-

Description

-

INVALID

-

0

-

Invalid device

-

SPEAKER

-

1

-

Speaker

-

WIRED_HEADSET

-

2

-

Wired headset

-

BLUETOOTH_SCO

-

3

-

Bluetooth device using the synchronous connection oriented (SCO) link

-

BLUETOOTH_A2DP

-

4

-

Bluetooth device using the advanced audio distribution profile (A2DP)

-

MIC

-

5

-

Microphone

-
+| Name | Default Value | Description | +| -------------- | ------------- | --------------------------------------------------------------------- | +| INVALID | 0 | Invalid device | +| EARPIECE | 1 | Earpiece | +| SPEAKER | 2 | Speaker | +| WIRED_HEADSET | 3 | Wired headset | +| BLUETOOTH_SCO | 7 | Bluetooth device using the synchronous connection oriented (SCO) link | +| BLUETOOTH_A2DP | 8 | Bluetooth device using the advanced audio distribution profile (A2DP) | +| MIC | 15 | Microphone | + + +## ActiveDeviceType7+ + +Enumerates active device types. + +| Name | Default Value | Description | +| ------------- | ------------- | --------------------------------------------------------------------- | +| SPEAKER | 2 | Speaker | +| BLUETOOTH_SCO | 7 | Bluetooth device using the synchronous connection oriented (SCO) link | -## AudioRingMode7+ +## AudioRingMode7+ Enumerates ringer modes. @@ -280,7 +247,7 @@ Enumerates ringer modes. Implements audio volume and audio device management. -### setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void +### setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void Sets the volume for a stream. This method uses an asynchronous callback to return the execution result. @@ -343,7 +310,7 @@ audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ }) ``` -### setVolume\(volumeType: AudioVolumeType, volume: number\): Promise +### setVolume\(volumeType: AudioVolumeType, volume: number\): Promise Sets the volume for a stream. This method uses a promise to return the execution result. @@ -406,7 +373,7 @@ audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> ) ``` -### getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void +### getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void Obtains the volume of a stream. This method uses an asynchronous callback to return the query result. @@ -460,7 +427,7 @@ audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { }) ``` -### getVolume\(volumeType: AudioVolumeType\): Promise +### getVolume\(volumeType: AudioVolumeType\): Promise Obtains the volume of a stream. This method uses a promise to return the query result. @@ -514,7 +481,7 @@ audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => ) ``` -### getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void +### getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void Obtains the minimum volume allowed for a stream. This method uses an asynchronous callback to return the query result. @@ -568,7 +535,7 @@ audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value) => { }) ``` -### getMinVolume\(volumeType: AudioVolumeType\): Promise +### getMinVolume\(volumeType: AudioVolumeType\): Promise Obtains the minimum volume allowed for a stream. This method uses a promise to return the query result. @@ -622,7 +589,7 @@ audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => ) ``` -### getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void +### getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void Obtains the maximum volume allowed for a stream. This method uses an asynchronous callback to return the query result. @@ -676,7 +643,7 @@ audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { }) ``` -### getMaxVolume\(volumeType: AudioVolumeType\): Promise +### getMaxVolume\(volumeType: AudioVolumeType\): Promise Obtains the maximum volume allowed for a stream. This method uses a promise to return the query result. @@ -730,7 +697,7 @@ audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> ) ``` -### mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void7+ +### mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void7+ Mutes a stream. This method uses an asynchronous callback to return the execution result. @@ -793,7 +760,7 @@ audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { }) ``` -### mute\(volumeType: AudioVolumeType, mute: boolean\): Promise7+ +### mute\(volumeType: AudioVolumeType, mute: boolean\): Promise7+ Mutes a stream. This method uses a promise to return the execution result. @@ -856,7 +823,7 @@ audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => ) ``` -### isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ +### isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ Checks whether a stream is muted. This method uses an asynchronous callback to return the query result. @@ -910,7 +877,7 @@ audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { }) ``` -### isMute\(volumeType: AudioVolumeType\): Promise7+ +### isMute\(volumeType: AudioVolumeType\): Promise7+ Checks whether a stream is muted. This method uses a promise to return the execution result. @@ -964,7 +931,7 @@ audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => ) ``` -### isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ +### isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ Checks whether a stream is active. This method uses an asynchronous callback to return the query result. @@ -1018,7 +985,7 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { }) ``` -### isActive\(volumeType: AudioVolumeType\): Promise7+ +### isActive\(volumeType: AudioVolumeType\): Promise7+ Checks whether a stream is active. This method uses a promise to return the query result. @@ -1072,7 +1039,7 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => ) ``` -### setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void7+ +### setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void7+ Sets the ringer mode. This method uses an asynchronous callback to return the execution result. @@ -1126,7 +1093,7 @@ audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { }) ``` -### setRingerMode\(mode: AudioRingMode\): Promise7+ +### setRingerMode\(mode: AudioRingMode\): Promise7+ Sets the ringer mode. This method uses a promise to return the execution result. @@ -1180,7 +1147,7 @@ audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => ) ``` -### getRingerMode\(callback: AsyncCallback\): void7+ +### getRingerMode\(callback: AsyncCallback\): void7+ Obtains the ringer mode. This method uses an asynchronous callback to return the query result. @@ -1225,7 +1192,7 @@ audioManager.getRingerMode((err, value) => { }) ``` -### getRingerMode\(\): Promise7+ +### getRingerMode\(\): Promise7+ Obtains the ringer mode. This method uses a promise to return the query result. @@ -1258,7 +1225,7 @@ audioManager.getRingerMode().then((value) => ) ``` -### setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void7+ +### setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void7+ Sets an audio parameter. This method uses an asynchronous callback to return the execution result. @@ -1321,7 +1288,7 @@ audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { }) ``` -### setAudioParameter\(key: string, value: string\): Promise7+ +### setAudioParameter\(key: string, value: string\): Promise7+ Sets an audio parameter. This method uses a promise to return the execution result. @@ -1384,7 +1351,7 @@ audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => ) ``` -### getAudioParameter\(key: string, callback: AsyncCallback\): void7+ +### getAudioParameter\(key: string, callback: AsyncCallback\): void7+ Obtains the value of an audio parameter. This method uses an asynchronous callback to return the query result. @@ -1438,7 +1405,7 @@ audioManager.getAudioParameter('PBits per sample', (err, value) => { }) ``` -### getAudioParameter\(key: string\): Promise7+ +### getAudioParameter\(key: string\): Promise7+ Obtains the value of an audio parameter. This method uses a promise to return the query result. @@ -1492,7 +1459,7 @@ audioManager.getAudioParameter('PBits per sample').then((value) => ) ``` -### getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void +### getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void Obtains the audio devices with a specific flag. This method uses an asynchronous callback to return the query result. @@ -1546,7 +1513,7 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ }) ``` -### getDevices\(deviceFlag: DeviceFlag\): Promise +### getDevices\(deviceFlag: DeviceFlag\): Promise Obtains the audio devices with a specific flag. This method uses a promise to return the query result. @@ -1600,7 +1567,7 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> ) ``` -### setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void7+ +### setDeviceActive\(deviceType: ActiveDeviceType, active: boolean, callback: AsyncCallback\): void7+ Sets a device to the active state. This method uses an asynchronous callback to return the execution result. @@ -1619,7 +1586,7 @@ Sets a device to the active state. This method uses an asynchronous callback to

deviceType

-

DeviceType

+

ActiveDeviceType

Yes

@@ -1654,7 +1621,7 @@ None **Example** ``` -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { +audioManager.setDeviceActive(audio.ActiveDeviceType.SPEAKER, true, (err)=> { if (err) { console.error('Failed to set the active status of the device. ${err.message}'); return; @@ -1663,7 +1630,7 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { }) ``` -### setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise7+ +### setDeviceActive\(deviceType: ActiveDeviceType, active: boolean\): Promise7+ Sets a device to the active state. This method uses a promise to return the execution result. @@ -1682,7 +1649,7 @@ Sets a device to the active state. This method uses a promise to return the exec

deviceType

-

DeviceType

+

ActiveDeviceType

Yes

@@ -1721,12 +1688,12 @@ Sets a device to the active state. This method uses a promise to return the exec **Example** ``` -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> +audioManager.setDeviceActive(audio.ActiveDeviceType.SPEAKER, true).then(()=> console.log('Promise returned to indicate that the device is set to the active status.'); ) ``` -### isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void7+ +### isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void7+ Checks whether a device is active. This method uses an asynchronous callback to return the query result. @@ -1745,7 +1712,7 @@ Checks whether a device is active. This method uses an asynchronous callback to

deviceType

-

DeviceType

+

ActiveDeviceType

Yes

@@ -1771,7 +1738,7 @@ None **Example** ``` -audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { +audioManager.isDeviceActive(audio.ActiveDeviceType.SPEAKER, (err, value) => { if (err) { console.error('Failed to obtain the active status of the device. ${err.message}'); return; @@ -1780,7 +1747,7 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { }) ``` -### isDeviceActive\(deviceType: DeviceType\): Promise7+ +### isDeviceActive\(deviceType: ActiveDeviceType\): Promise7+ Checks whether a device is active. This method uses a promise to return the query result. @@ -1799,7 +1766,7 @@ Checks whether a device is active. This method uses a promise to return the quer

deviceType

-

DeviceType

+

ActiveDeviceType

Yes

@@ -1829,12 +1796,12 @@ Checks whether a device is active. This method uses a promise to return the quer **Example** ``` -audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => +audioManager.isDeviceActive(audio.ActiveDeviceType.SPEAKER).then((value) => console.log('Promise returned to indicate that the active status of the device is obtained.' + value); ) ``` -### setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void7+ +### setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void7+ Mutes or unmutes the microphone. This method uses an asynchronous callback to return the execution result. @@ -1888,7 +1855,7 @@ audioManager.setMicrophoneMute(true, (err) => { }) ``` -### setMicrophoneMute\(mute: boolean\): Promise7+ +### setMicrophoneMute\(mute: boolean\): Promise7+ Mutes or unmutes the microphone. This method uses a promise to return the execution result. @@ -1942,7 +1909,7 @@ audioManager.setMicrophoneMute(true).then(() => ) ``` -### isMicrophoneMute\(callback: AsyncCallback\): void7+ +### isMicrophoneMute\(callback: AsyncCallback\): void7+ Checks whether the microphone is muted. This method uses an asynchronous callback to return the query result. @@ -1987,7 +1954,7 @@ audioManager.isMicrophoneMute((err, value) => { }) ``` -### isMicrophoneMute\(\): Promise7+ +### isMicrophoneMute\(\): Promise7+ Checks whether the microphone is muted. This method uses a promise to return the query result. @@ -2020,11 +1987,11 @@ audioManager.isMicrophoneMute().then((value) => ) ``` -## AudioDeviceDescriptor +## AudioDeviceDescriptor Describes an audio device. -### Attributes +### Attributes

Name

@@ -2064,7 +2031,7 @@ Describes an audio device.
-## AudioDeviceDescriptors +## AudioDeviceDescriptors

Name

-- Gitee From 37ae86d9fc16c7d90674647fabfce9039296085b Mon Sep 17 00:00:00 2001 From: magekkkk Date: Wed, 29 Sep 2021 03:00:10 +0000 Subject: [PATCH 7/8] update js reference for audio manager Signed-off-by: magekkkk --- ...63\351\242\221\347\256\241\347\220\206.md" | 107 ++++++------------ 1 file changed, 37 insertions(+), 70 deletions(-) diff --git "a/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\347\256\241\347\220\206.md" "b/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\347\256\241\347\220\206.md" index d84cf90dfae..8fa663e5f71 100644 --- "a/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\347\256\241\347\220\206.md" +++ "b/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\347\256\241\347\220\206.md" @@ -6,7 +6,8 @@ - [AudioVolumeType](#section92261857172218) - [DeviceFlag](#section11285183164210) - [DeviceRole](#section380038142619) -- [DeviceType](#section11727420122710) +- [DeviceType](#devicetype) + - [ActiveDeviceType7+](#activedevicetype) - [AudioRingMode7+](#section14948916131018) - [AudioManager](#section8265143814015) - [setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void](#section189141826104616) @@ -33,10 +34,10 @@ - [getAudioParameter\(key: string\): Promise7+](#section3185577485) - [getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void](#section11536182020523) - [getDevices\(deviceFlag: DeviceFlag\): Promise](#section181733125210) - - [setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void7+](#section103558400222) - - [setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise7+](#section1235914401228) - - [isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void7+](#section12363240122219) - - [isDeviceActive\(deviceType: DeviceType\): Promise7+](#section18366184012213) + - [setDeviceActive\(deviceType: ActiveDeviceType, active: boolean, callback: AsyncCallback\): void7+](#section103558400222) + - [setDeviceActive\(deviceType: ActiveDeviceType, active: boolean\): Promise7+](#section1235914401228) + - [isDeviceActive\(deviceType: ActiveDeviceType, callback: AsyncCallback\): void7+](#section12363240122219) + - [isDeviceActive\(deviceType: ActiveDeviceType\): Promise7+](#section18366184012213) - [setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void7+](#section14703163618122) - [setMicrophoneMute\(mute: boolean\): Promise7+](#section56287111791) - [isMicrophoneMute\(callback: AsyncCallback\): void7+](#section6632141119912) @@ -181,63 +182,29 @@ var audioManager = audio.getAudioManager();
-## DeviceType +## DeviceType 枚举,设备类型。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

默认值

-

描述

-

INVALID

-

0

-

无效设备。

-

SPEAKER

-

1

-

扬声器。

-

WIRED_HEADSET

-

2

-

有线耳机。

-

BLUETOOTH_SCO

-

3

-

SCO(Synchronous Connection Oriented Link)蓝牙设备。

-

BLUETOOTH_A2DP

-

4

-

A2DP(Advanced Audio Distribution Profile )蓝牙设备。

-

MIC

-

5

-

麦克风。

-
+| 名称 | 默认值 | 描述 | +| -------------- | ------------- | ------------------------------------------------------- | +| INVALID | 0 | 无效设备。 | +| EARPIECE | 1 | 听筒。 | +| SPEAKER | 2 | 扬声器。 | +| WIRED_HEADSET | 3 | 有线耳机。 | +| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。 | +| BLUETOOTH_A2DP | 8 | 蓝牙设备A2DP连接(Advanced Audio Distribution Profile)。 | +| MIC | 15 | 麦克风。 | + + +## ActiveDeviceType7+ + +Enumerates active device types. + +| 名称 | 默认值 | 描述 | +| ------------- | ------------- | -------------------------------------------------------- | +| SPEAKER | 2 | 扬声器。 | +| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。 | ## AudioRingMode7+ @@ -1596,7 +1563,7 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> ) ``` -### setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void7+ +### setDeviceActive\(deviceType: ActiveDeviceType, active: boolean, callback: AsyncCallback\): void7+ 设置设备激活状态,使用callback方式返回异步结果。 @@ -1615,7 +1582,7 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=>

deviceType

-

DeviceType

+

ActiveDeviceType

@@ -1650,7 +1617,7 @@ audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> **示例:** ``` -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { +audioManager.setDeviceActive(audio.ActiveDeviceType.SPEAKER, true, (err)=> { if (err) { console.error('Failed to set the active status of the device. ${err.message}'); return; @@ -1659,7 +1626,7 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { }) ``` -### setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise7+ +### setDeviceActive\(deviceType: ActiveDeviceType, active: boolean\): Promise7+ 设置设备激活状态,使用promise方式返回异步结果。 @@ -1678,7 +1645,7 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> {

deviceType

-

DeviceType

+

ActiveDeviceType

@@ -1717,7 +1684,7 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { **示例:** ``` -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> +audioManager.setDeviceActive(audio.ActiveDeviceType.SPEAKER, true).then(()=> console.log('Promise returned to indicate that the device is set to the active status.'); ) ``` @@ -1741,7 +1708,7 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=>

deviceType

-

DeviceType

+

ActiveDeviceType

@@ -1767,7 +1734,7 @@ audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> **示例:** ``` -audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { +audioManager.isDeviceActive(audio.ActiveDeviceType.SPEAKER, (err, value) => { if (err) { console.error('Failed to obtain the active status of the device. ${err.message}'); return; @@ -1776,7 +1743,7 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { }) ``` -### isDeviceActive\(deviceType: DeviceType\): Promise7+ +### isDeviceActive\(deviceType: ActiveDeviceType\): Promise7+ 获取指定设备激活状态,使用promise方式返回异步结果。 @@ -1795,7 +1762,7 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => {

deviceType

-

DeviceType

+

ActiveDeviceType

@@ -1825,7 +1792,7 @@ audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { **示例:** ``` -audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => +audioManager.isDeviceActive(audio.ActiveDeviceType.SPEAKER).then((value) => console.log('Promise returned to indicate that the active status of the device is obtained.' + value); ) ``` -- Gitee From 00d7d41eb2989c9cb50c2227387c0fb93447b36c Mon Sep 17 00:00:00 2001 From: guduhanyan Date: Wed, 29 Sep 2021 19:54:38 +0800 Subject: [PATCH 8/8] 20210929DOClts19.54 Signed-off-by: guduhanyan --- .../figures/subsystem_architecture_zh.png | Bin 0 -> 823652 bytes ...32\346\227\266\346\234\215\345\212\241.md" | 245 ++++++++++++++++++ 2 files changed, 245 insertions(+) create mode 100644 zh-cn/application-dev/js-reference/figures/subsystem_architecture_zh.png create mode 100644 "zh-cn/application-dev/js-reference/\345\256\232\346\227\266\346\234\215\345\212\241.md" diff --git a/zh-cn/application-dev/js-reference/figures/subsystem_architecture_zh.png b/zh-cn/application-dev/js-reference/figures/subsystem_architecture_zh.png new file mode 100644 index 0000000000000000000000000000000000000000..49a5f627bb52581262718c18d90290db247c012b GIT binary patch literal 823652 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 literal 0 HcmV?d00001 diff --git "a/zh-cn/application-dev/js-reference/\345\256\232\346\227\266\346\234\215\345\212\241.md" "b/zh-cn/application-dev/js-reference/\345\256\232\346\227\266\346\234\215\345\212\241.md" new file mode 100644 index 00000000000..1fe45e7ca70 --- /dev/null +++ "b/zh-cn/application-dev/js-reference/\345\256\232\346\227\266\346\234\215\345\212\241.md" @@ -0,0 +1,245 @@ +# 时间组件 + +- [简介](#section11660541593) +- [目录](#section161941989596) +- [说明](#section38521239153117) + - [js接口说明](#section11908203714422) + - [js接口使用说明](#section9938411124317) + +- [相关仓](#section1371113476307) + +## 简介 + +时间组件提供管理系统时间时区和定时的能力。 + +**图 1** 子系统架构图 +![](figures/subsystem_architecture_zh.png "子系统架构图") + +## 目录 + +``` +/base/miscservices/time +├── etc # 组件包含的进程的配置文件 +├── figures # 构架图 +├── interfaces # 组件对外提供的接口代码 +│ └── innerkits # 服务间接口 +│ └── kits # 对应用提供的接口 +├── profile # 组件包含的系统服务的配置文件 +└── services # 时间服务实现 +``` + +## 说明 + +### js接口说明 + +**表 1** js组件systemTime开放的主要方法 + + + + + + + + + + + + + + + + + + + + + + + + + +

接口名

+

描述

+

function setTime(time : number) : Promise<boolean>

+

设置系统时间(1970-01-01至今毫秒数),Promise方式

+

function setTime(time : number, callback : AsyncCallback<boolean>) : void

+

设置系统时间(1970-01-01至今毫秒数),callback方式

+

function setDate(date: Date, callback: AsyncCallback<boolean>): void;

+

设置系统时间(Date格式),Promise方式

+

function setDate(date: Date): Promise<boolean>

+

设置系统时间(Date格式),callback方式

+

function setTimezone(timezone: string, callback: AsyncCallback<boolean>): void

+

设置系统时区,callback方式

+

function setTimezone(timezone: string): Promise<boolean>

+

设置系统时区,Promise方式

+
+ + +**表 2** js组件systemTimer开放的主要方法 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

接口名

+

描述

+

function createTimer(options: TimerOptions, callback: AsyncCallback<number>): void

+

创建定时器,callback方式

+

function createTimer(options: TimerOptions): Promise<number>

+

创建定时器,promise方式

+

function startTimer(timer: number, triggerTime: number, callback: AsyncCallback<boolean>): void

+

开启定时器,callback方式

+

function startTimer(timer: number, triggerTime: number): Promise<boolean>

+

开启定时器,promise方式

+

function stopTimer(timer: number, callback: AsyncCallback<boolean>): void

+

停止定时器,callback方式

+

function stopTimer(timer: number): Promise<boolean>

+

停止定时器,promise方式

+

function destroyTimer(timer: number, callback: AsyncCallback<boolean>): void

+

销毁定时器,callback方式

+

function destroyTimer(timer: number): Promise<boolean>

+

摧毁定时器,promise方式

+
+ +**表 3** systemTimer组件参数TimerOptions说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

说明

+

type

+

number

+

TIMER_TYPE_REALTIME: 设置为系统启动时间定时器,否则为walltime定时器; + TIMER_TYPE_WAKEUP: 设置为唤醒定时器,否则为非唤醒; + const TIMER_TYPE_EXACT: 设置为精准定时器,否则为非精准定时器; + const TIMER_TYPE_IDLE: 设置为IDLE模式定时器,否则为非IDLE模式定时器(暂不支持) +

+

repeat

+

boolean

+

true 为循环定时器,false为单次定时器

+

interval

+

number

+

如果是循环定时器,repeat值应大于5000毫秒,非重复定时器置为0

+

wantAgent

+

wantAgent

+

设置通知的wantagent,定时器到期后通知

+

callback

+

=> void

+

设置回调函数,定时器到期后触发

+
+### js接口使用说明 + +systemTime模块使用示例: + +``` +// 导入模块 +import systemTime from '@ohos.systemTime'; + +// Promise方式的异步方法设置时间 +var time = 1611081385000; +systemTime.setTime(time) + .then((value) => { + console.log(`success to systemTime.setTime: ${value}`); + }).catch((err) => { + console.error(`failed to systemTime.setTime because ${err.message}`) + }); + + +// callback方式的异步方法设置时间 + +var time = 1611081385000; +systemTime.setTime(time, (err, value) => { + if (err) { + console.error(`failed to systemTime.setTime because ${err.message}`); + return; + } + console.log(`success to systemTime.setTime: ${value}`); + }); + +``` + +systemTimer模块使用示例: + +``` +// 导入模块 +import systemTimer from '@ohos.systemTimer'; + +console.log("start") +var options:TimerOptions{ + type:TIMER_TYPE_REALTIME, + repeat:false, + interval:Number.MAX_VALUE/2, + persistent:false +} + +console.log("create timer") +let timerId = systemTimer.Timer(options) +console.log("start timer") +let startTimerRes = systemTimer.startTimer(timerId, 100000) +console.log("stop timer") +let stopTimerRes = systemTimer.stopTimer(timerId) +console.log("destroy timer") +let destroyTimerRes = systemTimer.destroyTimer(timerId) +console.log('end'); + + +``` + +## 相关仓 + +**Misc软件服务子系统** + +miscservices\_time + -- Gitee