From e67771fc596425b02ed8f56999cd0bd9541bceb3 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Wed, 19 Oct 2022 15:47:51 +0800 Subject: [PATCH] update doc Signed-off-by: shawn_he --- .../connectivity/http-request.md | 2 +- .../device/device-location-overview.md | 3 + en/application-dev/device/usb-guidelines.md | 24 +- en/application-dev/faqs/faqs-connectivity.md | 2 +- en/application-dev/napi/Readme-EN.md | 1 + en/application-dev/napi/figures/01.png | Bin 0 -> 41234 bytes .../napi/mindspore-lite-guidelines.md | 216 ++++++++++++++++++ .../reference/apis/js-apis-hisysevent.md | 30 +-- .../reference/apis/js-apis-intl.md | 20 +- .../reference/apis/js-apis-net-connection.md | 19 +- .../reference/apis/js-apis-webSocket.md | 4 +- .../subsystems/subsys-boot-appspawn.md | 4 +- .../subsystems/subsys-boot-init-service.md | 16 ++ .../subsystems/subsys-boot-init-sysparam.md | 65 ++++++ en/readme/figures/multimodal-architecture.png | Bin 36267 -> 35710 bytes 15 files changed, 354 insertions(+), 52 deletions(-) create mode 100644 en/application-dev/napi/figures/01.png create mode 100644 en/application-dev/napi/mindspore-lite-guidelines.md diff --git a/en/application-dev/connectivity/http-request.md b/en/application-dev/connectivity/http-request.md index 6ddf26b870..da1a7e1c51 100644 --- a/en/application-dev/connectivity/http-request.md +++ b/en/application-dev/connectivity/http-request.md @@ -12,7 +12,7 @@ To use related APIs, you must declare the **ohos.permission.INTERNET** permissio For details about how to apply for permissions, see [Access Control Development](../security/accesstoken-guidelines.md). -The following table describes the related APIs. +The following table provides only a simple description of the related APIs. For details, see [API Reference](../reference/apis/js-apis-http.md). | API | Description | | ----------------------------------------- | --------------------------------------------------------- | diff --git a/en/application-dev/device/device-location-overview.md b/en/application-dev/device/device-location-overview.md index aa619c4549..a26f0c5a70 100644 --- a/en/application-dev/device/device-location-overview.md +++ b/en/application-dev/device/device-location-overview.md @@ -15,15 +15,18 @@ Your application can call location-specific APIs to obtain the location informat Location awareness helps determine where a mobile device locates. The system identifies the location of a mobile device with its coordinates, and uses location technologies such as Global Navigation Satellite System (GNSS) and network positioning (for example, base station positioning or WLAN/Bluetooth positioning) to provide diverse location-based services. These advanced location technologies make it possible to obtain the accurate location of the mobile device, regardless of whether it is indoors or outdoors. - **Coordinate** + A coordinate describes a location on the earth using the longitude and latitude in reference to the World Geodetic Coordinate System 1984. - **GNSS positioning** GNSS positioning locates a mobile device by using the location algorithm offered by the device chip to compute the location information provided by the Global Navigation Satellite System, for example, GPS, GLONASS, BeiDou, and Galileo. Whichever positioning system will be used during the location process depends on a hardware capability of the device. - **Base station positioning** + Base station positioning estimates the current location of a mobile device based on the location of the resident base station in reference to the neighboring base stations. This technology provides only a low accuracy and requires access to the cellular network. - **WLAN or Bluetooth positioning** + WLAN or Bluetooth positioning estimates the current location of a mobile device based on the locations of WLANs and Bluetooth devices that can be discovered by the device. The location accuracy of this technology depends on the distribution of fixed WLAN access points (APs) and Bluetooth devices around the device. A high density of WLAN APs and Bluetooth devices can produce a more accurate location result than base station positioning. This technology also requires access to the network. diff --git a/en/application-dev/device/usb-guidelines.md b/en/application-dev/device/usb-guidelines.md index d51625ccb9..eb023f7c78 100644 --- a/en/application-dev/device/usb-guidelines.md +++ b/en/application-dev/device/usb-guidelines.md @@ -38,7 +38,7 @@ You can set a USB device as the USB host to connect to other USB devices for dat // Import the USB API package. import usb from '@ohos.usb'; // Obtain the USB device list. - var deviceList = usb.getDevices(); + let deviceList = usb.getDevices(); /* Example deviceList structure [ @@ -81,21 +81,21 @@ You can set a USB device as the USB host to connect to other USB devices for dat number: 1, type: 3, interfaceId: 0, - }, - ], - }, - ], - }, - ], - }, - ], + } + ] + } + ] + } + ] + } + ] */ ``` 2. Obtain the device operation permissions. ```js - var deviceName = deviceList[0].name; + let deviceName = deviceList[0].name; // Request the permissions to operate a specified device. usb.requestRight(deviceName).then(hasRight => { console.info("usb device request right result: " + hasRight); @@ -108,7 +108,7 @@ You can set a USB device as the USB host to connect to other USB devices for dat ```js // Open the device, and obtain the USB device pipe for data transfer. - var pipe = usb.connectDevice(deviceList[0]); + let pipe = usb.connectDevice(deviceList[0]); /* Claim the corresponding interface from deviceList. interface1 must be one present in the device configuration. @@ -127,7 +127,7 @@ You can set a USB device as the USB host to connect to other USB devices for dat usb.bulkTransfer(pipe, inEndpoint, dataUint8Array, 15000).then(dataLength => { if (dataLength >= 0) { console.info("usb readData result Length : " + dataLength); - var resultStr = this.ab2str(dataUint8Array); // Convert uint8 data into a string. + let resultStr = this.ab2str(dataUint8Array); // Convert uint8 data into a string. console.info("usb readData buffer : " + resultStr); } else { console.info("usb readData failed : " + dataLength); diff --git a/en/application-dev/faqs/faqs-connectivity.md b/en/application-dev/faqs/faqs-connectivity.md index 3b8dea8212..e3b02269e2 100644 --- a/en/application-dev/faqs/faqs-connectivity.md +++ b/en/application-dev/faqs/faqs-connectivity.md @@ -19,7 +19,7 @@ Applicable to: OpenHarmony SDK 3.2.2.5, stage model of API version 9 Applicable to: OpenHarmony SDK 3.2.2.5, stage model of API version 9 -Error code 28 refers to **CURLE_OPERATION_TIMEDOUT**, which means a libcurl library operation timeout. For details, see any HTTP status code description available. +Error code 28 refers to **CURLE_OPERATION_TIMEDOUT**, which means a cURL operation timeout. For details, see any HTTP status code description available. Reference: [Development Guide](https://gitee.com/openharmony/docs/blob/master/en/application-dev/reference/apis/js-apis-http.md#httpresponse) and [Curl Error Codes](https://curl.se/libcurl/c/libcurl-errors.html) diff --git a/en/application-dev/napi/Readme-EN.md b/en/application-dev/napi/Readme-EN.md index 280efd8afa..bf16d91435 100644 --- a/en/application-dev/napi/Readme-EN.md +++ b/en/application-dev/napi/Readme-EN.md @@ -4,5 +4,6 @@ - [Drawing Development](drawing-guidelines.md) - [Raw File Development](rawfile-guidelines.md) - [Native Window Development](native-window-guidelines.md) +- [Using MindSpore Lite for Model Inference](native-window-guidelines.md) diff --git a/en/application-dev/napi/figures/01.png b/en/application-dev/napi/figures/01.png new file mode 100644 index 0000000000000000000000000000000000000000..5293e5afe5a8637dbef3fd0b32c7bd43d60e4368 GIT binary patch literal 41234 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 literal 0 HcmV?d00001 diff --git a/en/application-dev/napi/mindspore-lite-guidelines.md b/en/application-dev/napi/mindspore-lite-guidelines.md new file mode 100644 index 0000000000..6da2fe2cfa --- /dev/null +++ b/en/application-dev/napi/mindspore-lite-guidelines.md @@ -0,0 +1,216 @@ +# Using MindSpore Lite for Model Inference + +## When to Use + +MindSpore Lite is an AI engine that provides AI model inference for different hardware devices. It has been used in a wide range of fields, such as image classification, target recognition, facial recognition, and character recognition. + +This document describes the general development process for MindSpore Lite model inference. + +## Basic Concepts + +Before getting started, you need to understand the following basic concepts: + +**Tensor**: a special data structure that is similar to arrays and matrices. It is basic data structure used in MindSpore Lite network operations. + +**Float16 inference**: a mode in which Float16 is used for inference. Float16, also called half-precision, uses 16 bits to represent a number. + + + +## Available APIs +APIs involved in MindSpore Lite model inference are categorized into context APIs, model APIs, and tensor APIs. +### Context APIs + +| API | Description | +| ------------------ | ----------------- | +|OH_AI_ContextHandle OH_AI_ContextCreate()|Creates a context object.| +|void OH_AI_ContextSetThreadNum(OH_AI_ContextHandle context, int32_t thread_num)|Sets the number of runtime threads.| +| void OH_AI_ContextSetThreadAffinityMode(OH_AI_ContextHandle context, int mode)|Sets the affinity mode for binding runtime threads to CPU cores, which are categorized into little cores and big cores depending on the CPU frequency.| +|OH_AI_DeviceInfoHandle OH_AI_DeviceInfoCreate(OH_AI_DeviceType device_type)|Creates a runtime device information object.| +|void OH_AI_ContextDestroy(OH_AI_ContextHandle *context)|Destroys a context object.| +|void OH_AI_DeviceInfoSetEnableFP16(OH_AI_DeviceInfoHandle device_info, bool is_fp16)|Sets whether to enable float16 inference. This function is available only for CPU and GPU devices.| +|void OH_AI_ContextAddDeviceInfo(OH_AI_ContextHandle context, OH_AI_DeviceInfoHandle device_info)|Adds a runtime device information object.| + +### Model APIs + +| API | Description | +| ------------------ | ----------------- | +|OH_AI_ModelHandle OH_AI_ModelCreate()|Creates a model object.| +|OH_AI_Status OH_AI_ModelBuildFromFile(OH_AI_ModelHandle model, const char *model_path,OH_AI_ModelType odel_type, const OH_AI_ContextHandle model_context)|Loads and builds a MindSpore model from a model file.| +|void OH_AI_ModelDestroy(OH_AI_ModelHandle *model)|Destroys a model object.| + +### Tensor APIs + +| API | Description | +| ------------------ | ----------------- | +|OH_AI_TensorHandleArray OH_AI_ModelGetInputs(const OH_AI_ModelHandle model)|Obtains the input tensor array structure of a model.| +|int64_t OH_AI_TensorGetElementNum(const OH_AI_TensorHandle tensor)|Obtains the number of tensor elements.| +|const char *OH_AI_TensorGetName(const OH_AI_TensorHandle tensor)|Obtains the name of a tensor.| +|OH_AI_DataType OH_AI_TensorGetDataType(const OH_AI_TensorHandle tensor)|Obtains the tensor data type.| +|void *OH_AI_TensorGetMutableData(const OH_AI_TensorHandle tensor)|Obtains the pointer to variable tensor data.| + +## How to Develop +The following figure shows the development process for MindSpore Lite model inference. + +**Figure 1** Development process for MindSpore Lite model inference +![how-to-use-mindspore-lite](figures/01.png) + +The development process consists of the following main steps: + +1. Prepare the required model. + + The required model can be downloaded directly or obtained using the model conversion tool. + + - If the downloaded model is in the `.ms` format, you can use it directly for inference. The following uses the **mobilenetv2.ms** model as an example. + - If the downloaded model uses a third-party framework, such as TensorFlow, TensorFlow Lite, Caffe, or ONNX, you can use the [model conversion tool](https://www.mindspore.cn/lite/docs/en/r1.5/use/benchmark_tool.html) to convert it to the `.ms` format. + +2. Create a context, and set parameters such as the number of runtime threads and device type. + + ```c + // Create a context, and set the number of runtime threads to 2 and the thread affinity mode to 1 (big cores first). + OH_AI_ContextHandle context = OH_AI_ContextCreate(); + if (context == NULL) { + printf("OH_AI_ContextCreate failed.\n"); + return OH_AI_STATUS_LITE_ERROR; + } + const int thread_num = 2; + OH_AI_ContextSetThreadNum(context, thread_num); + OH_AI_ContextSetThreadAffinityMode(context, 1); + // Set the device type to CPU, and disable Float16 inference. + OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU); + if (cpu_device_info == NULL) { + printf("OH_AI_DeviceInfoCreate failed.\n"); + OH_AI_ContextDestroy(&context); + return OH_AI_STATUS_LITE_ERROR; + } + OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, false); + OH_AI_ContextAddDeviceInfo(context, cpu_device_info); + ``` + +3. Create, load, and build the model. + + Call **OH_AI_ModelBuildFromFile** to load and build the model. + + In this example, the **argv[1]** parameter passed to **OH_AI_ModelBuildFromFile** indicates the specified model file path. + + ```c + // Create a model. + OH_AI_ModelHandle model = OH_AI_ModelCreate(); + if (model == NULL) { + printf("OH_AI_ModelCreate failed.\n"); + OH_AI_ContextDestroy(&context); + return OH_AI_STATUS_LITE_ERROR; + } + + // Load and build the model. The model type is OH_AI_ModelTypeMindIR. + int ret = OH_AI_ModelBuildFromFile(model, argv[1], OH_AI_ModelTypeMindIR, context); + if (ret != OH_AI_STATUS_SUCCESS) { + printf("OH_AI_ModelBuildFromFile failed, ret: %d.\n", ret); + OH_AI_ModelDestroy(&model); + return ret; + } + ``` + +4. Input data. + + Before executing model inference, you need to populate data to the input tensor. In this example, random data is used to populate the model. + + ```c + // Obtain the input tensor. + OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model); + if (inputs.handle_list == NULL) { + printf("OH_AI_ModelGetInputs failed, ret: %d.\n", ret); + OH_AI_ModelDestroy(&model); + return ret; + } + // Use random data to populate the tensor. + ret = GenerateInputDataWithRandom(inputs); + if (ret != OH_AI_STATUS_SUCCESS) { + printf("GenerateInputDataWithRandom failed, ret: %d.\n", ret); + OH_AI_ModelDestroy(&model); + return ret; + } + ``` + +5. Execute model inference. + + Call **OH_AI_ModelPredict** to perform model inference. + + ```c + // Execute model inference. + OH_AI_TensorHandleArray outputs; + ret = OH_AI_ModelPredict(model, inputs, &outputs, NULL, NULL); + if (ret != OH_AI_STATUS_SUCCESS) { + printf("OH_AI_ModelPredict failed, ret: %d.\n", ret); + OH_AI_ModelDestroy(&model); + return ret; + } + ``` + +6. Obtain the output. + + After model inference is complete, you can obtain the inference result through the output tensor. + + ```c + // Obtain the output tensor and print the information. + for (size_t i = 0; i < outputs.handle_num; ++i) { + OH_AI_TensorHandle tensor = outputs.handle_list[i]; + int64_t element_num = OH_AI_TensorGetElementNum(tensor); + printf("Tensor name: %s, tensor size is %zu ,elements num: %lld.\n", OH_AI_TensorGetName(tensor), + OH_AI_TensorGetDataSize(tensor), element_num); + const float *data = (const float *)OH_AI_TensorGetData(tensor); + printf("output data is:\n"); + const int max_print_num = 50; + for (int j = 0; j < element_num && j <= max_print_num; ++j) { + printf("%f ", data[j]); + } + printf("\n"); + } + ``` + +7. Destroy the model. + + If the MindSpore Lite inference framework is no longer needed, you need to destroy the created model. + + ```c + // Destroy the model. + OH_AI_ModelDestroy(&model); + ``` + +## Verification + +1. Compile **CMakeLists.txt**. + + ```cmake + cmake_minimum_required(VERSION 3.14) + project(Demo) + + add_executable(demo main.c) + + target_link_libraries( + demo + mindspore-lite.huawei + pthread + dl + ) + ``` + - To use ohos-sdk for cross compilation, you need to set the native toolchain path for the CMake tool as follows: `-DCMAKE_TOOLCHAIN_FILE="/xxx/ohos-sdk/linux/native/build/cmake/ohos.toolchain.cmake"`. + + - The toolchain builds a 64-bit application by default. To build a 32-bit application, add the following configuration: `-DOHOS_ARCH="armeabi-v7a"`. + +2. Run the CMake tool. + + - Use hdc_std to connect to the RK3568 development board and put **demo** and **mobilenetv2.ms** to the same directory on the board. + - Run the hdc_std shell command to access the development board, go to the directory where **demo** is located, and run the following command: + + ```shell + ./demo mobilenetv2.ms + ``` + + The inference is successful if the output is similar to the following: + + ```shell + # ./QuickStart ./mobilenetv2.ms + Tensor name: Softmax-65, tensor size is 4004 ,elements num: 1001. + output data is: + 0.000018 0.000012 0.000026 0.000194 0.000156 0.001501 0.000240 0.000825 0.000016 0.000006 0.000007 0.000004 0.000004 0.000004 0.000015 0.000099 0.000011 0.000013 0.000005 0.000023 0.000004 0.000008 0.000003 0.000003 0.000008 0.000014 0.000012 0.000006 0.000019 0.000006 0.000018 0.000024 0.000010 0.000002 0.000028 0.000372 0.000010 0.000017 0.000008 0.000004 0.000007 0.000010 0.000007 0.000012 0.000005 0.000015 0.000007 0.000040 0.000004 0.000085 0.000023 + ``` diff --git a/en/application-dev/reference/apis/js-apis-hisysevent.md b/en/application-dev/reference/apis/js-apis-hisysevent.md index 65952c0b23..553ff5a992 100644 --- a/en/application-dev/reference/apis/js-apis-hisysevent.md +++ b/en/application-dev/reference/apis/js-apis-hisysevent.md @@ -2,7 +2,7 @@ Provides system event logging APIs for system HAP applications. -> **NOTE**
+> **NOTE** > - The initial APIs of this module are supported since API version 9. Newly added APIs will be marked with a superscript to indicate their earliest API version. > - The APIs of this module are system APIs. @@ -19,7 +19,7 @@ Enumerates event types. **System capability**: SystemCapability.HiviewDFX.HiSysEvent -| Name| Default Value| Description| +| Name | Default Value | Description | | -------- | -------- | -------- | | FAULT | 1 | Error event.| | STATISTIC | 2 | Statistic event.| @@ -32,7 +32,7 @@ Defines a system event. **System capability**: SystemCapability.HiviewDFX.HiSysEvent -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory | Description | | -------- | -------- | -------- | -------- | | domain | string | Yes| Event domain.| | name | string | Yes| Event name.| @@ -50,7 +50,7 @@ Writes event information to the event file. This API uses an asynchronous callba **Parameters** -| Name | Type | Mandatory| Description | +| Name | Type | Mandatory | Description | | --------- | ------------------------- | ---- | ------------------------------------------------------------ | | info | [SysEventInfo](#syseventinfo) | Yes| System event information.| | callback | AsyncCallback<void> | Yes| Callback used to process the received return value.
- Value **0**: The event verification is successful, and the event will be written to the event file asynchronously.
- A value greater than **0**: Invalid parameters are present in the event, and the event will be written to the event file asynchronously after the invalid parameters are ignored.
- A value smaller than **0**: The event parameter verification fails, and the event will not be written to the event file.| @@ -91,13 +91,13 @@ Writes event information to the event file. This API uses a promise to return th **Parameters** -| Name | Type | Mandatory| Description| +| Name | Type | Mandatory | Description| | --------- | ----------------------- | ---- | --------------- | | info | [SysEventInfo](#syseventinfo) | Yes | System event information.| **Return value** -| Type | Description | +| Type | Description | | ------------------- | ------------------------------------------------------------ | | Promise<void> | Promise used to return the result. Depending on whether event writing is successful, you can use the **then()** or **catch()** method to process the callback.| @@ -138,7 +138,7 @@ Enumerates matching rule types. **System capability**: SystemCapability.HiviewDFX.HiSysEvent -| Name| Default Value| Description| +| Name | Default Value | Description | | -------- | -------- | -------- | | WHOLE_WORD | 1 | Whole word matching.| | PREFIX | 2 | Prefix matching.| @@ -150,7 +150,7 @@ Defines rules for event subscription. **System capability**: SystemCapability.HiviewDFX.HiSysEvent -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory | Description | | -------- | -------- | -------- | -------- | | domain | string | Yes| Event domain.| | name | string | Yes| Event name.| @@ -163,7 +163,7 @@ Defines a watcher for event subscription. **System capability**: SystemCapability.HiviewDFX.HiSysEvent -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory | Description | | -------- | -------- | -------- | -------- | | rules | [WatchRule](#watchrule)[] | Yes| Array of matching rules for event subscription.| | onEvent | function | Yes| Callback for event subscription: (info: [SysEventInfo](#syseventinfo)) => void| @@ -181,7 +181,7 @@ Adds a watcher for event subscription. **Parameters** -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory | Description | | ------ | ----------------------------- | ---- | ------------------------ | | watcher | [Watcher](#watcher) | Yes| Watcher for event subscription.| @@ -223,7 +223,7 @@ Removes a watcher used for event subscription. **Parameters** -| Name| Type | Mandatory| Description | +| Name| Type | Mandatory | Description | | ------ | ------------- | ---- | ------------------------ | | watcher | [Watcher](#watcher) | Yes| Watcher for event subscription.| @@ -260,7 +260,7 @@ Defines arguments for event query. **System capability**: SystemCapability.HiviewDFX.HiSysEvent -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory | Description | | -------- | -------- | -------- | -------- | | beginTime | number | Yes| Start time (13-digit timestamp) for event query.| | endTime | number | Yes| End time (13-digit timestamp) for event query.| @@ -272,7 +272,7 @@ Defines rules for event query. **System capability**: SystemCapability.HiviewDFX.HiSysEvent -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory | Description | | -------- | -------- | -------- | -------- | | domain | string | Yes| Event domain.| | names | string[] | Yes| Array of event names.| @@ -283,7 +283,7 @@ Defines an event query instance. **System capability**: SystemCapability.HiviewDFX.HiSysEvent -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory | Description | | -------- | -------- | -------- | -------- | | onQuery | function | Yes| Callback of queried events: (infos: [SysEventInfo](#syseventinfo)[]) => void| | onComplete | function | Yes| Callback of query result statistics: (reason: number, total: number) => void| @@ -300,7 +300,7 @@ Queries system events. **Parameters** -| Name| Type| Mandatory| Description| +| Name| Type | Mandatory | Description | | ------ | ----------------------------- | ---- | ------------------------ | | queryArg | [QueryArg](#queryarg) | Yes | Arguments for event query.| | rules | [QueryRule](#queryrule)[] | Yes | Array of event query rules.| diff --git a/en/application-dev/reference/apis/js-apis-intl.md b/en/application-dev/reference/apis/js-apis-intl.md index 3c908fabdc..ed66c607bb 100644 --- a/en/application-dev/reference/apis/js-apis-intl.md +++ b/en/application-dev/reference/apis/js-apis-intl.md @@ -64,7 +64,7 @@ Creates a Locale object. | Name | Type | Mandatory | Description | | ------- | ------------- | ---- | ---------------------------- | | locale | string | Yes | A string containing locale information, including the language, optional script, and region.| -| options | LocaleOptions | No | Options for creating the **Locale** object. | +| options9+ | [LocaleOptions](#localeoptions9) | No | Options for creating the **Locale** object. | **Example** ``` @@ -181,7 +181,7 @@ Creates a **DateTimeOptions** object for the specified locale. | Name | Type | Mandatory | Description | | ------- | ----------------------------------- | ---- | ---------------------------- | | locale | string \| Array<string> | Yes | A string containing locale information, including the language, optional script, and region.| -| options | [DateTimeOptions](#datetimeoptions) | No | Options for creating a **DateTimeFormat** object. | +| options9+ | [DateTimeOptions](#datetimeoptions9) | No | Options for creating a **DateTimeFormat** object. | **Example** ``` @@ -265,7 +265,7 @@ Obtains the formatting options for **DateTimeFormat** object. | Type | Description | | ----------------------------------- | ----------------------------- | -| [DateTimeOptions](#datetimeoptions) | Formatting options for **DateTimeFormat** objects.| +| [DateTimeOptions](#datetimeoptions9) | Formatting options for **DateTimeFormat** objects.| **Example** ``` @@ -332,7 +332,7 @@ Parameters | Name | Type | Mandatory | Description | | ------- | ------------------------------- | ---- | ---------------------------- | | locale | string \| Array<string> | Yes | A string containing locale information, including the language, optional script, and region.| -| options | [NumberOptions](#numberoptions) | No | Options for creating a **NumberFormat** object. | +| options9+ | [NumberOptions](#numberoptions9) | No | Options for creating a **NumberFormat** object. | **Example** ``` @@ -380,7 +380,7 @@ Obtains the options of the **NumberFormat** object. | Type | Description | | ------------------------------- | --------------------------- | -| [NumberOptions](#numberoptions) | Formatting options for **NumberFormat** objects.| +| [NumberOptions](#numberoptions9) | Formatting options for **NumberFormat** objects.| **Example** @@ -449,7 +449,7 @@ Creates a Collator object. | Name | Type | Mandatory | Description | | ------- | ----------------------------------- | ---- | ---------------------------- | | locale | string \| Array<string> | Yes | A string containing locale information, including the language, optional script, and region.| -| options | [CollatorOptions](#collatoroptions) | No | Options for creating a **Collator** object. | +| options9+ | [CollatorOptions](#collatoroptions9) | No | Options for creating a **Collator** object. | **Example** ``` @@ -497,7 +497,7 @@ Returns properties reflecting the locale and collation options of a **Collator** | Type | Description | | ----------------------------------- | ----------------- | -| [CollatorOptions](#collatoroptions) | Properties of the **Collator** object.| +| [CollatorOptions](#collatoroptions9) | Properties of the **Collator** object.| **Example** ``` @@ -552,7 +552,7 @@ Parameters | Name | Type | Mandatory | Description | | ------- | ---------------------------------------- | ---- | ---------------------------- | | locale | string \| Array<string> | Yes | A string containing locale information, including the language, optional script, and region.| -| options | [PluralRulesOptions](#pluralrulesoptions) | No | Options for creating a **PluralRules** object. | +| options9+ | [PluralRulesOptions](#pluralrulesoptions9) | No | Options for creating a **PluralRules** object. | **Example** ``` @@ -634,7 +634,7 @@ Creates a **RelativeTimeFormat** object. | Name | Type | Mandatory | Description | | ------- | ---------------------------------------- | ---- | ---------------------------- | | locale | string \| Array<string> | Yes | A string containing locale information, including the language, optional script, and region.| -| options | [RelativeTimeFormatInputOptions](#relativetimeformatinputoptions) | No | Options for creating a **RelativeTimeFormat** object. | +| options9+ | [RelativeTimeFormatInputOptions](#relativetimeformatinputoptions9) | No | Options for creating a **RelativeTimeFormat** object. | **Example** ``` @@ -710,7 +710,7 @@ Obtains the formatting options for **RelativeTimeFormat** objects. | Type | Description | | ---------------------------------------- | --------------------------------- | -| [RelativeTimeFormatResolvedOptions](#relativetimeformatresolvedoptions) | Formatting options for **RelativeTimeFormat** objects.| +| [RelativeTimeFormatResolvedOptions](#relativetimeformatresolvedoptions8) | Formatting options for **RelativeTimeFormat** objects.| **Example** ``` diff --git a/en/application-dev/reference/apis/js-apis-net-connection.md b/en/application-dev/reference/apis/js-apis-net-connection.md index 1d272e9f03..a0d7d5ccf2 100644 --- a/en/application-dev/reference/apis/js-apis-net-connection.md +++ b/en/application-dev/reference/apis/js-apis-net-connection.md @@ -110,7 +110,7 @@ connection.hasDefaultNet().then(function (has) { getAllNets(callback: AsyncCallback<Array<NetHandle>>): void -Obtains the list of all active data networks. This API uses an asynchronous callback to return the result. +Obtains the list of all connected networks. This API uses an asynchronous callback to return the result. **Required permission**: ohos.permission.GET_NETWORK_INFO @@ -136,7 +136,7 @@ connection.getAllNets(function (error, nets) { getAllNets(): Promise<Array<NetHandle>> -Obtains the list of all active data networks. This API uses a promise to return the result. +Obtains the list of all connected networks. This API uses a promise to return the result. **Required permission**: ohos.permission.GET_NETWORK_INFO @@ -280,7 +280,7 @@ connection.getDefaultNet().then(function (netHandle) { reportNetConnected(netHandle: NetHandle, callback: AsyncCallback<void>): void -Reports connection of the data network. This API uses an asynchronous callback to return the result. +Reports connection of the data network to the network management module. This API uses an asynchronous callback to return the result. If this API is called, the application considers that the network connection state (**ohos.net.connection.NetCap.NET_CAPABILITY_VAILDATED**) is inconsistent with that in the network management module. **Permission required**: ohos.permission.GET_NETWORK_INFO and ohos.permission.INTERNET @@ -308,7 +308,7 @@ connection.getDefaultNet().then(function (netHandle) { reportNetConnected(netHandle: NetHandle): Promise<void> -Reports connection of the data network. This API uses a promise to return the result. +Reports connection of the data network to the network management module. This API uses a promise to return the result. If this API is called, the application considers that the network connection state (**ohos.net.connection.NetCap.NET_CAPABILITY_VAILDATED**) is inconsistent with that in the network management module. **Permission required**: ohos.permission.GET_NETWORK_INFO and ohos.permission.INTERNET @@ -341,7 +341,7 @@ connection.getDefaultNet().then(function (netHandle) { reportNetDisconnected(netHandle: NetHandle, callback: AsyncCallback<void>): void -Reports disconnection of the data network. This API uses an asynchronous callback to return the result. +Reports disconnection of the data network to the network management module. This API uses an asynchronous callback to return the result. If this API is called, the application considers that the network connection state (**ohos.net.connection.NetCap.NET_CAPABILITY_VAILDATED**) is inconsistent with that in the network management module. **Permission required**: ohos.permission.GET_NETWORK_INFO and ohos.permission.INTERNET @@ -369,7 +369,8 @@ connection.getDefaultNet().then(function (netHandle) { reportNetDisconnected(netHandle: NetHandle): Promise<void> -Reports disconnection of the data network. This API uses a promise to return the result. +Reports disconnection of the data network to the network management module. This API uses a promise to return the result. If this API is called, the application considers that the network connection state (**ohos.net.connection.NetCap.NET_CAPABILITY_VAILDATED**) is inconsistent with that in the network management module. + **Permission required**: ohos.permission.GET_NETWORK_INFO and ohos.permission.INTERNET @@ -558,7 +559,7 @@ connection.disableAirplaneMode().then(function (error) { createNetConnection(netSpecifier?: NetSpecifier, timeout?: number): NetConnection -Obtains the handle of the network specified by **netSpecifier**. +Creates a **NetConnection** object. **netSpecifier** specifies the network, and **timeout** specifies the timeout interval in ms. **timeout** is configurable only when **netSpecifier** is specified. If neither of them is present, the default network is used. **System capability**: SystemCapability.Communication.NetManager.Core @@ -950,9 +951,9 @@ Defines the network capability. | ------------------------ | ---- | ---------------------- | | NET_CAPABILITY_MMS | 0 | The network can connect to the carrier's Multimedia Messaging Service Center (MMSC) to send and receive multimedia messages.| | NET_CAPABILITY_NOT_METERED | 11 | The network traffic is not metered.| -| NET_CAPABILITY_INTERNET | 12 | The network can connect to the Internet.| +| NET_CAPABILITY_INTERNET | 12 | The network has the Internet access capability, which is set by the network provider.| | NET_CAPABILITY_NOT_VPN | 15 | The network does not use a Virtual Private Network (VPN).| -| NET_CAPABILITY_VALIDATED | 16 | The network is available. | +| NET_CAPABILITY_VALIDATED | 16 | The Internet access capability of the network is successfully verified by the network management module. | ## NetBearType diff --git a/en/application-dev/reference/apis/js-apis-webSocket.md b/en/application-dev/reference/apis/js-apis-webSocket.md index 52f5367110..bda4ad227b 100644 --- a/en/application-dev/reference/apis/js-apis-webSocket.md +++ b/en/application-dev/reference/apis/js-apis-webSocket.md @@ -433,7 +433,7 @@ ws.off('open', callback1); on\(type: 'message', callback: AsyncCallback\): void -Enables listening for the **message** events of a WebSocket connection. This API uses an asynchronous callback to return the result. +Enables listening for the **message** events of a WebSocket connection. This API uses an asynchronous callback to return the result. The maximum length of each message is 4 KB. If the length exceeds 4 KB, the message is automatically fragmented. >![](public_sys-resources/icon-note.gif) **NOTE:** >The data in **AsyncCallback** can be in the format of string\(API 6\) or ArrayBuffer\(API 8\). @@ -462,7 +462,7 @@ ws.on('message', (err, value) => { off\(type: 'message', callback?: AsyncCallback\): void -Disables listening for the **message** events of a WebSocket connection. This API uses an asynchronous callback to return the result. +Disables listening for the **message** events of a WebSocket connection. This API uses an asynchronous callback to return the result. The maximum length of each message is 4 KB. If the length exceeds 4 KB, the message is automatically fragmented. >![](public_sys-resources/icon-note.gif) **NOTE:** >The data in **AsyncCallback** can be in the format of string\(API 6\) or ArrayBuffer\(API 8\). diff --git a/en/device-dev/subsystems/subsys-boot-appspawn.md b/en/device-dev/subsystems/subsys-boot-appspawn.md index 7b9e10bb65..3b713c576e 100644 --- a/en/device-dev/subsystems/subsys-boot-appspawn.md +++ b/en/device-dev/subsystems/subsys-boot-appspawn.md @@ -63,7 +63,7 @@ The appspawn module is used only for the standard system. - Support for cold start of applications by using the aa command ``` - param set appspawn.cold.boot true // Enable cold start. + param set startup.appspawn.cold.boot 1 // Enable cold start. aa start -d 12345 -a $name -b $package -C Reference command: aa start -d 12345 -a ohos.acts.startup.sysparam.function.MainAbility -b ohos.acts.startup.sysparam.function -C @@ -166,5 +166,5 @@ The following is the sample code for adding product-specific configuration for t
Applications fail to be started by running the cold start command. **Solution** -
1. Enable cold start by setting **param set appspawn.cold.boot true**. +
1. Enable cold start by setting **param set startup.appspawn.cold.boot 1**.
2. Make sure that the cold start command is correct. diff --git a/en/device-dev/subsystems/subsys-boot-init-service.md b/en/device-dev/subsystems/subsys-boot-init-service.md index dbbfee6846..5b6954c4d5 100644 --- a/en/device-dev/subsystems/subsys-boot-init-service.md +++ b/en/device-dev/subsystems/subsys-boot-init-service.md @@ -163,6 +163,22 @@ By parsing the *.cfg file, you can obtain **service** fields, a | int StartServiceByTimer(const char *serviceName, uint64_t timeout) | Starts a service by timer.| Return value: Returns **0** if the operation is successful; returns **-1** otherwise.
Arguments:
**serviceName**: service name.
timeout: timeout interval.| | int StopServiceTimer(const char *serviceName) | Stops a service timer.| Return value: Returns **0** if the operation is successful; returns **-1** otherwise.
Arguments:
**serviceName**: service name.| +- DAC configuration for service control APIs + + Go to **/base/startup/init/services/etc/group** and add the correct user ID to **servicectrl**. For example: + + ```java + servicectrl:x:1050:root,shell,system,samgr,hdf_devmgr + ``` + +- SELinux configuration for service control APIs + + Add the required SELinux permissions to the **init.te** file. For example, grant the system parameter write permission for services such as **init**, **samgr**, and **hdf_devmgr**. + + ```java + allow { init samgr hdf_devmgr } servicectrl_param:parameter_service { set }; + ``` + ### How to Develop The following describes how to add a system service named **MySystemApp**: diff --git a/en/device-dev/subsystems/subsys-boot-init-sysparam.md b/en/device-dev/subsystems/subsys-boot-init-sysparam.md index ef97570ec6..6f575f67aa 100644 --- a/en/device-dev/subsystems/subsys-boot-init-sysparam.md +++ b/en/device-dev/subsystems/subsys-boot-init-sysparam.md @@ -98,6 +98,55 @@ Each subsystem defines the system parameters of its own modules, including the s ![UGO rule](figure/dac-definition.png) +- SELinux policy for system parameter configuration + + - Add SELinux tags. + + To add a SELinux tag to system parameters, you first need to define the tag in the **/base/security/selinux/sepolicy/base/public/parameter.te** file. For example: + + ```java + type servicectrl_param, parameter_attr + ``` + + After the tag is defined, add the system parameter prefix associated with the tag to **/base/security/selinux/sepolicy/base/public/parameter_contexts**. The following uses the prefix **ohos.servicectrl** as an example: + + ```java + ohos.servicectrl. u:object_r:servicectrl_param:s0 + ``` + + - Grant operation permissions. For example, to grant operation permissions such as map for the init process, add the following content to the **/base/security/selinux/sepolicy/ohos_policy/startup/init/public/init.te** file: + + ```java + allow servicectrl_param tmpfs:filesystem associate; + allow init servicectrl_param:file { map open read relabelto relabelfrom }; + ``` + + - Set the write permission. For example, grant the system parameter write permission for services such as **init**, **samgr**, and **hdf_devmgr**. + + ```java + allow { init samgr hdf_devmgr } servicectrl_param:parameter_service { set }; + ``` + + - Set the read permission. If you want to grant the permission only for certain services, replace **xxx** with the services in the following code: + + ```java + allow { xxx } servicectrl_param:file { map open read }; + ``` + + - If you want to grant the permission for all services, use the following code: + + ```java + allow { domain -limit_domain } servicectrl_param:file { map open read }; + ``` + +- Suggestions + + Keep only two system parameter tags for each subsystem: + + - A private tag to control system parameter settings. + + - A public tag to grant access from all services. + - Loading sequence The following table provides the sequence of loading system parameters. @@ -111,6 +160,22 @@ Each subsystem defines the system parameters of its own modules, including the s | System parameters| /system/etc/param/*.para | Load the parameters defined by each subsystem. If a system parameter already exists, ignore it.| | Persistent parameters| /data/parameters/ | If persistent parameters exist, load them at last. Persistent parameters will overwrite the default system parameters that have been loaded.| + +#### System Parameter Tag File Size + +If one tag corresponds to more than five system parameters, you need to set the size of the system parameter tag file in **/base/startup/init/services/etc/param/ohos.para.size**. The size value is **512** by default. + +Configuring rule: + +System parameter tag = Size + +Example: + +```java +startup_init_param=40960 +``` + + ### Constraints The service management module is available only for the mini system and standard system. diff --git a/en/readme/figures/multimodal-architecture.png b/en/readme/figures/multimodal-architecture.png index 6c7bfa62475e4e6d5f01ce146fb0a3534caa2385..5962b1e6ff66d845f8ad97d3f1d884e195f0da53 100644 GIT binary patch literal 35710 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 Xz*OnK%m-z$Ky6lBL99%~(C>c%K(2?= literal 36267 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 -- GitLab