diff --git a/website/docs/.vuepress/config/nav.js b/website/docs/.vuepress/config/nav.js index 9a413bbc076670e168166f34e0ba1cd5cb7e6991..ac850fe4b70b613fe22fea2796989639c50f6a16 100644 --- a/website/docs/.vuepress/config/nav.js +++ b/website/docs/.vuepress/config/nav.js @@ -35,7 +35,7 @@ module.exports = [ items: [ { text: '文档', - link: '/documents/', + link: '/pages/000000/', }, { text: '知识图谱', diff --git a/website/docs/.vuepress/public/images/application-dev/media/figures/zh-cn_image_0000001182608857.png b/website/docs/.vuepress/public/images/application-dev/media/figures/zh-cn_image_0000001182608857.png new file mode 100755 index 0000000000000000000000000000000000000000..e0777e28838f6d2455233f2068339f8548f50c67 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/media/figures/zh-cn_image_0000001182608857.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/public_sys-resources/icon-note.gif b/website/docs/.vuepress/public/images/application-dev/public_sys-resources/icon-note.gif new file mode 100755 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/public_sys-resources/icon-note.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001113808114.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001113808114.png new file mode 100644 index 0000000000000000000000000000000000000000..da3c279ef8812b9d028a1993074430b5a06d50c9 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001113808114.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001115066116.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001115066116.png new file mode 100644 index 0000000000000000000000000000000000000000..357798e173fa7e3b419cc5990aa0737925e1f7b9 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001115066116.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001118018088.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001118018088.png new file mode 100644 index 0000000000000000000000000000000000000000..d4e1c7bd6773fc5b3ab5b473e28593110f3c820f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001118018088.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001118018452.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001118018452.png new file mode 100644 index 0000000000000000000000000000000000000000..74b66efabbbbbea4752f0296985486369a0cdc74 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001118018452.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001152459178.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001152459178.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee6a55e53e57843300bd5ec0cce4a175e97a29e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001152459178.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001155643492.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001155643492.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3afd2b96c1a01b3e966c37e60755d1f179363c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001155643492.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001162463400.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001162463400.png new file mode 100644 index 0000000000000000000000000000000000000000..48239f38c31b907155d7b0501401ca9dd8635d73 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001162463400.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163314102.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163314102.png new file mode 100644 index 0000000000000000000000000000000000000000..286a49def18618c79088deeb49203969ac6ce4c0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163314102.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163472654.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163472654.png new file mode 100644 index 0000000000000000000000000000000000000000..5328a3c1b62eb8281e316d5ae4a6ca11694ec4a2 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163472654.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163632602.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163632602.png new file mode 100644 index 0000000000000000000000000000000000000000..10c5cf41ab78ea58c194fe1ed0429352e85a88a8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163632602.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163915523.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163915523.png new file mode 100644 index 0000000000000000000000000000000000000000..352eaed40ac96dc5d3bae82591e5c801daaa8d56 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163915523.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163918627.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163918627.png new file mode 100644 index 0000000000000000000000000000000000000000..6967c6b140c7e07003fc4548989ea78d9e5fc940 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001163918627.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001164417356.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001164417356.png new file mode 100644 index 0000000000000000000000000000000000000000..97795b40abbea9f58aabe62dd7643eca208315e3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001164417356.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001164498191.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001164498191.png new file mode 100644 index 0000000000000000000000000000000000000000..30efd063397893ff925743b681f943696f10512b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001164498191.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001164577336.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001164577336.png new file mode 100644 index 0000000000000000000000000000000000000000..1127bbfabc9ef766284eec12c574096f8bb45ac3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001164577336.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001166582138.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001166582138.png new file mode 100644 index 0000000000000000000000000000000000000000..36dc2d05ca4eb23505a73cb0d1606afd3bf844d8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001166582138.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001166740700.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001166740700.png new file mode 100644 index 0000000000000000000000000000000000000000..9d9dc95f14cdc94007dbf04f217d496d49f9318c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001166740700.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172123966.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172123966.png new file mode 100644 index 0000000000000000000000000000000000000000..b62a4291cbe98e250fd9dcc65e9f91ba67445575 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172123966.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172283938.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172283938.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ddc8ef114b973936dc354fc5ea628b87aae9f3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172283938.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172442490.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172442490.png new file mode 100644 index 0000000000000000000000000000000000000000..85345789b60927729e9243798fe122c64ca92687 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172442490.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172442492.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172442492.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8dd786a91b784794a19f8b2975616912586286 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172442492.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172602436.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172602436.png new file mode 100644 index 0000000000000000000000000000000000000000..b196bc42a1cb0dd57a382dc1f9315c30074f4952 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001172602436.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001202722349.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001202722349.png new file mode 100644 index 0000000000000000000000000000000000000000..99330a4f3ef2978dd6736d96e00c88cea8d25f32 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001202722349.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001207744539.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001207744539.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1269e9e8fb620f8ed6051395c727590e6dc1bc Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001207744539.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208006117.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208006117.png new file mode 100644 index 0000000000000000000000000000000000000000..5c576d84b0ca4b369cdaac5aa7de19718628bc37 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208006117.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208210505.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208210505.png new file mode 100644 index 0000000000000000000000000000000000000000..934b69477b4c10140f0cf8198e4248c53bdb0364 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208210505.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208274069.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208274069.png new file mode 100644 index 0000000000000000000000000000000000000000..74b66efabbbbbea4752f0296985486369a0cdc74 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208274069.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208394019.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208394019.png new file mode 100644 index 0000000000000000000000000000000000000000..aa7f5ffb0d59c7ab7a1784bfde775aeccc16a424 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001208394019.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001209817299.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001209817299.png new file mode 100644 index 0000000000000000000000000000000000000000..aa7f5ffb0d59c7ab7a1784bfde775aeccc16a424 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001209817299.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001210018359.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001210018359.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe695d19f2f15a7ce9c941907f17becf0d9b849 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001210018359.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001212062065.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001212062065.png new file mode 100644 index 0000000000000000000000000000000000000000..708b49814e270289c6d1c96520aa6d90ba0edb9c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001212062065.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001212142015.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001212142015.png new file mode 100644 index 0000000000000000000000000000000000000000..74b66efabbbbbea4752f0296985486369a0cdc74 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001212142015.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217402315.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217402315.png new file mode 100644 index 0000000000000000000000000000000000000000..afdab82267fcd7d5eacae76eba500baa3bbecd40 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217402315.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217523751.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217523751.png new file mode 100644 index 0000000000000000000000000000000000000000..469ca774dde99530329d5e7bd62a5a40fb16237b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217523751.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217602267.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217602267.png new file mode 100644 index 0000000000000000000000000000000000000000..7f99945dc6e30516a6084896b3f146af89dc2f23 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217602267.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217683803.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217683803.png new file mode 100644 index 0000000000000000000000000000000000000000..cb05a7cb0fa33a9d9074f4424a3851478935ff33 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217683803.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217683805.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217683805.png new file mode 100644 index 0000000000000000000000000000000000000000..c44bd561803aa0dc4cafcf0db68bf38f5ba43013 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000001217683805.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121901.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121901.png new file mode 100644 index 0000000000000000000000000000000000000000..9a84c3f66275c8ea2a50b9ba9ab0ead3842274cc Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121901.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121902.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121902.png new file mode 100644 index 0000000000000000000000000000000000000000..6bef885f7c487473ca1b329d41c6414735555b42 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121902.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121903.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121903.png new file mode 100644 index 0000000000000000000000000000000000000000..ba3923fef0ad89fa38fa170d2680931d1eb1ea55 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121903.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121904.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121904.png new file mode 100644 index 0000000000000000000000000000000000000000..9250f90cf1e377c8bb33adf9965436ed7ddbadbf Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121904.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121905.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121905.png new file mode 100644 index 0000000000000000000000000000000000000000..f278f73fb4cd0dba70cae1835dd7a45d2686038b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121905.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121906.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121906.png new file mode 100644 index 0000000000000000000000000000000000000000..61535cb2fe6b4197e95cff8691fe27973c5ecde8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121906.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121907.png b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121907.png new file mode 100644 index 0000000000000000000000000000000000000000..32771bf5f9639aa8ebdd1922f8088965404674ca Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/figures/zh-cn_image_0000002021121907.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/quick-start/public_sys-resources/icon-note.gif b/website/docs/.vuepress/public/images/application-dev/quick-start/public_sys-resources/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/quick-start/public_sys-resources/icon-note.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/apis/figures/zh-cn_image_0000001164217678.png b/website/docs/.vuepress/public/images/application-dev/reference/apis/figures/zh-cn_image_0000001164217678.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2cc34bf20dcd27dc9dff6a3eb6eb56dd4809c4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/apis/figures/zh-cn_image_0000001164217678.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/apis/figures/zh-cn_image_0000001200913929.png b/website/docs/.vuepress/public/images/application-dev/reference/apis/figures/zh-cn_image_0000001200913929.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb89772d315b440636e8ceeda928e5db6b34e40 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/apis/figures/zh-cn_image_0000001200913929.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/apis/public_sys-resources/icon-note.gif b/website/docs/.vuepress/public/images/application-dev/reference/apis/public_sys-resources/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/apis/public_sys-resources/icon-note.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/apis/public_sys-resources/icon-notice.gif b/website/docs/.vuepress/public/images/application-dev/reference/apis/public_sys-resources/icon-notice.gif new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/apis/public_sys-resources/icon-notice.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/0.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/0.png new file mode 100644 index 0000000000000000000000000000000000000000..99b8f25e0fe85fdbde44a4eae2fdb208561259e6 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/0.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/000000.jpg b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/000000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..502180f0903ac8c51440c5bc266b0d60811572c7 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/000000.jpg differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/1-2.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7bc3dec11daa00059d3ec93d77ac15ce357a14 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/1-2.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/1-3.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/1-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..1346a2deeab10fd18c60e7ff184bbff436bc528f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/1-3.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/1.jpg b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e5bd1c300d6de63a6627c1610ec09ddf89aed768 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/1.jpg differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/11-1.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/11-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ca939d4de4d330dea962b991362b41ef0aacba9 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/11-1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/11.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/11.png new file mode 100644 index 0000000000000000000000000000000000000000..cb270578b22922b3eabadd6801c08ccf6db99a00 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/11.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/12.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/12.gif new file mode 100644 index 0000000000000000000000000000000000000000..561e823f7a9eb432e2aedbbf84637f8be40b0337 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/12.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/2-4.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/2-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..82b802bf8c65f080c0d068689dc9e580840c5f55 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/2-4.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/2.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/2.png new file mode 100644 index 0000000000000000000000000000000000000000..e506fd8f37b0e522d5925b509def595e5db653c3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/2.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/22.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/22.png new file mode 100644 index 0000000000000000000000000000000000000000..63e63411d18c5394c103e63d15bb125bc01915d0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/22.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/3.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/3.png new file mode 100644 index 0000000000000000000000000000000000000000..b370937f36a472829e7a08a4439b4025721b0437 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/3.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/33.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/33.png new file mode 100644 index 0000000000000000000000000000000000000000..7886ced8676b7de190671f1d0f08546ee0c6d23b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/33.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/4-0.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/4-0.gif new file mode 100644 index 0000000000000000000000000000000000000000..1589d8650fa225626fb8dadf085732f92170e40f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/4-0.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/4.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/4.gif new file mode 100644 index 0000000000000000000000000000000000000000..1dc0753ba566436d3b8611f5efce0cadce36b7d0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/4.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/44.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/44.gif new file mode 100644 index 0000000000000000000000000000000000000000..483d53003cc3be451c2c2962d60256b293aee428 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/44.gif differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/45\345\272\246\345\244\271\350\247\222\346\270\220\345\217\230.png" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/45\345\272\246\345\244\271\350\247\222\346\270\220\345\217\230.png" new file mode 100644 index 0000000000000000000000000000000000000000..d6ec48b52853bc5eddff3eee7978ef9c313e99aa Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/45\345\272\246\345\244\271\350\247\222\346\270\220\345\217\230.png" differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/5.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/5.gif new file mode 100644 index 0000000000000000000000000000000000000000..83d8a2f9864d59fd0c64a03cafcb0bf50432ac92 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/5.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/6.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/6.gif new file mode 100644 index 0000000000000000000000000000000000000000..aacc036cfc90859465a0b3da908a61533b866806 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/6.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/9.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/9.gif new file mode 100644 index 0000000000000000000000000000000000000000..0654ceaa02e5d502239d152e83382df901d7376f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/9.gif differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/AnimationAPI\350\243\201\345\211\252.gif" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/AnimationAPI\350\243\201\345\211\252.gif" new file mode 100644 index 0000000000000000000000000000000000000000..294687cdfb0cf7f2ea34f91c87d0a6394b32bff0 Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/AnimationAPI\350\243\201\345\211\252.gif" differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/GIF.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/GIF.gif new file mode 100644 index 0000000000000000000000000000000000000000..98bf461673a8f11366755e99b8f59baf7cc282e8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/GIF.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/Video_2021-03-26_154549.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/Video_2021-03-26_154549.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4d097a34aef9e583651d11133dff575345f0272 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/Video_2021-03-26_154549.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-1.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c85de05a6145492a24a9ded5d2b399776489ecc Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-3.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..86f15fb83d5be7e8ed145d69ed8b869be40c4e45 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-3.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-4.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b0d4fd3ea6759b909f1714cdb9b0f6794153d76 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-4.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-transform.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-transform.gif new file mode 100644 index 0000000000000000000000000000000000000000..e83e2ce11234a97242e1f57204b96568ad248d3d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-transform.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-transform2.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-transform2.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c65871bb208133129e46956ecee119276a390a5 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-transform2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-transform3.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-transform3.gif new file mode 100644 index 0000000000000000000000000000000000000000..b29849bb066b5b5cd870c2b0b0dd1e50b9f90494 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/animate-transform3.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/barchart.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/barchart.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4ba3f9fa64250b1b86bd6d39b6a8071d3de1c3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/barchart.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/c3.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/c3.png new file mode 100644 index 0000000000000000000000000000000000000000..dca96aeb057ba12dc63365e613007e54dd268a40 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/c3.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/date33.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/date33.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe406b48fd77d39b575f506fd6fe48c830e43fa Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/date33.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/datetime.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/datetime.png new file mode 100644 index 0000000000000000000000000000000000000000..50c2d2d700960d22c332e33d9fba1b27690e63a4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/datetime.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/ellipse.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/ellipse.png new file mode 100644 index 0000000000000000000000000000000000000000..d0379dfc66b4d2151dae49beeb8af38c774381aa Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/ellipse.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/gauge.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/gauge.png new file mode 100644 index 0000000000000000000000000000000000000000..31c0141d716059519377e1f39b9b8305370f239a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/gauge.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/image-animator.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/image-animator.gif new file mode 100644 index 0000000000000000000000000000000000000000..8321366bdb79b9e6530d53b0f45a6465ae7b967d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/image-animator.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/list6.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/list6.gif new file mode 100644 index 0000000000000000000000000000000000000000..6bc775a4f7b81841450b0650917f76a3cee9945a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/list6.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/menu13.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/menu13.gif new file mode 100644 index 0000000000000000000000000000000000000000..413b6584d5939509e2052d5cf7c35ec307ff759c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/menu13.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/multitext.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/multitext.png new file mode 100644 index 0000000000000000000000000000000000000000..fba75110896e178bbfbd9cc309b260b49c83b06d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/multitext.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/panel6.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/panel6.gif new file mode 100644 index 0000000000000000000000000000000000000000..a61ac61b038539afb5c2e20271a6c9761468c289 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/panel6.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/progress.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..7edb3bedb97ee4b203cd35a6ef6642740f410846 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/progress.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/sample1.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/sample1.gif new file mode 100644 index 0000000000000000000000000000000000000000..6168a14aa67c866abf6185ba3a3c2ae9f595153c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/sample1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/sample_css.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/sample_css.png new file mode 100644 index 0000000000000000000000000000000000000000..43c345e521bd9c87a9fb6da469548716cd20f918 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/sample_css.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/screenshot.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd4ee663382d41cef4f57b30e646ba423fa84bc Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/screenshot.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/slider.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/slider.png new file mode 100644 index 0000000000000000000000000000000000000000..d0167fe6773371fa70d8bf32c3a3953ed1e1455b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/slider.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/smoothOff.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/smoothOff.png new file mode 100644 index 0000000000000000000000000000000000000000..c699e78774fadbd8da8c0cc290e88294d445aa6f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/smoothOff.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/sssssss.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/sssssss.png new file mode 100644 index 0000000000000000000000000000000000000000..e108f5f8f2e096b319ef5097145ab43f2ad97594 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/sssssss.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tab.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tab.gif new file mode 100644 index 0000000000000000000000000000000000000000..fea6fcac566df71d32643b81579a59bbe4e1b580 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tab.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-animate-part1.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-animate-part1.gif new file mode 100644 index 0000000000000000000000000000000000000000..4731d53600aa7dced61e10ce21505a5086280edd Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-animate-part1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-animate-part2.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-animate-part2.gif new file mode 100644 index 0000000000000000000000000000000000000000..6107d0c5a64f409759d4c1ba44682996f181c5f2 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-animate-part2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-animate-part3.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-animate-part3.gif new file mode 100644 index 0000000000000000000000000000000000000000..addf2ea9fc2a9b83b8650382f9b6dc1901f4a229 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-animate-part3.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-part1.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-part1.png new file mode 100644 index 0000000000000000000000000000000000000000..c2ec8cd839cb27361a863f4c770de8053eb32755 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text-part1.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text.png new file mode 100644 index 0000000000000000000000000000000000000000..4a5cbc0c72ee404eb9c8afe605cd862042e98ee3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/text.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part1.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part1.png new file mode 100644 index 0000000000000000000000000000000000000000..79406f279f47e28a360437878959ce07d607b3ff Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part1.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part2.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part2.png new file mode 100644 index 0000000000000000000000000000000000000000..f4823452cce3c085af33ebf1675c8517974709b0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part2.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part3.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part3.png new file mode 100644 index 0000000000000000000000000000000000000000..889ef6e963acef24e01d14d363ac52a444298145 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part3.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part4.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part4.png new file mode 100644 index 0000000000000000000000000000000000000000..2a325881b033c685328eb51e9fedcd7e135cbf77 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textPath-part4.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate1.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate1.gif new file mode 100644 index 0000000000000000000000000000000000000000..64c013cdb72cacb96a429a4a9cf7cdeac38e783e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate2.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate2.gif new file mode 100644 index 0000000000000000000000000000000000000000..640fae7689352208a0680ae4e12635f6e345cbda Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate3.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate3.gif new file mode 100644 index 0000000000000000000000000000000000000000..044f442002cf25b56b89849a4255ec7583cbfc2a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate3.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate4.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate4.gif new file mode 100644 index 0000000000000000000000000000000000000000..4da6410ea036e3f7c4eb725ec9ccd220349799d1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/textpath-animate4.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/time.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/time.png new file mode 100644 index 0000000000000000000000000000000000000000..484a77f31b70679cb01d8678c93439d4b55c4bcd Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/time.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part1.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part1.gif new file mode 100644 index 0000000000000000000000000000000000000000..a5db977af7a1a2ec2096aa76b5f82a245b832429 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part2.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part2.gif new file mode 100644 index 0000000000000000000000000000000000000000..e72fb4ff01bbdf45951799fb20fc7a3ca85dead0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part3.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part3.gif new file mode 100644 index 0000000000000000000000000000000000000000..871a368ff3e43f32bdfec427a35024a84e6cb441 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part3.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part4.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part4.gif new file mode 100644 index 0000000000000000000000000000000000000000..da89f35c1163f16e9eebac8a11c59290d4e2feda Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-animate-part4.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-part1.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-part1.png new file mode 100644 index 0000000000000000000000000000000000000000..245c704bb52935d5683a8d6b2c1e23a5389e4bc5 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/tspan-part1.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/unnaming-(1).png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/unnaming-(1).png new file mode 100644 index 0000000000000000000000000000000000000000..9fa7ed21c03b072e182249f928b9929d0869cd5d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/unnaming-(1).png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125124.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125124.png new file mode 100644 index 0000000000000000000000000000000000000000..0bdeb353cc2ec200b106de975f1478597e863c49 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125124.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125132.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125132.png new file mode 100644 index 0000000000000000000000000000000000000000..994f8510b56d1f66d8a40dbd0349ca61baf242cb Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125132.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125136.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125136.png new file mode 100644 index 0000000000000000000000000000000000000000..280d0df92bf3cfebba6610f6050939ce4d53fb1d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125136.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125162.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125162.png new file mode 100644 index 0000000000000000000000000000000000000000..dfee4f8cddcddd2ada89cb6d7e812fd0739d9cb8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125162.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125202.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125202.png new file mode 100644 index 0000000000000000000000000000000000000000..6fed31434380106e80629feafdb374c7ba68ee51 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125202.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125204.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125204.png new file mode 100644 index 0000000000000000000000000000000000000000..95770e0a80cd7581b8739c852239dff75b60f655 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125204.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125208.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125208.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d5ebbd57bcdd5e5f77001aa6770ff433654be9 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125208.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125212.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125212.png new file mode 100644 index 0000000000000000000000000000000000000000..bc43e2bfefbb6cc9fb09bc92ff0740a514dd2ff5 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125212.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125220.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125220.png new file mode 100644 index 0000000000000000000000000000000000000000..362c486fa6a7545fd3eaca6cf9da6c3ab56b3136 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125220.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125268.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125268.png new file mode 100644 index 0000000000000000000000000000000000000000..13b38a17af260f22ef850403d9351cff1860bb9c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125268.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284954.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284954.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa94a7479a1c1ac1294575a7bd0658e5b21fac9 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284954.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284958.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284958.png new file mode 100644 index 0000000000000000000000000000000000000000..4d0696a9ade017acbbdfb8812dafdec5d715cac5 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284958.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284984.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284984.png new file mode 100644 index 0000000000000000000000000000000000000000..4cef59797fd8b9650c398562ac0b473485a9274b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284984.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285024.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285024.png new file mode 100644 index 0000000000000000000000000000000000000000..fffc6016e519844a25a096547bc7824f7a3450b0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285024.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285034.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285034.gif new file mode 100644 index 0000000000000000000000000000000000000000..17f4ea3f2983fc9a0ad21238b9345e11aa0318c3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285034.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285076.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285076.png new file mode 100644 index 0000000000000000000000000000000000000000..3ecdf0c714fa633f03db339626f51e62318cbf82 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285076.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001147417424.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001147417424.png new file mode 100644 index 0000000000000000000000000000000000000000..66d73108f4d5721cfc46ad9062d4b77387e67796 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001147417424.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001150719520.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001150719520.gif new file mode 100644 index 0000000000000000000000000000000000000000..3658d687cad3bdb3f0b06b5ace29d75948e0a613 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001150719520.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152588538.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152588538.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8f8a0cbb105c4d791bb867771bb9bc1bfbb468 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152588538.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152588626.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152588626.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8094c23fc3f601f4899bac7b148b8309f600d9 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152588626.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152610806.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152610806.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a47a84d8086ca0806bc958f745f29821c47cc2 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152610806.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152833768.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152833768.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c7a300f18ca0f9671cacbc68590834f00ee23a1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152833768.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152834002.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152834002.png new file mode 100644 index 0000000000000000000000000000000000000000..27ee8b6da1ca2a0bd728157bbd750a9cf4b228f7 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152834002.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152862510.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152862510.gif new file mode 100644 index 0000000000000000000000000000000000000000..601f4cc2f4871e29eee74beae214d4b82f4a47df Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152862510.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001153427082.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001153427082.png new file mode 100644 index 0000000000000000000000000000000000000000..1144db651b011598fc9192a4f8b4e67efa63e1a1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001153427082.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001166484430.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001166484430.png new file mode 100644 index 0000000000000000000000000000000000000000..d6bbab16659f4b34b38a714510665ea7fd309055 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001166484430.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001166962736.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001166962736.png new file mode 100644 index 0000000000000000000000000000000000000000..47f90714bcb37e4df1b698503db6893d6c2a98c4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001166962736.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167001464.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167001464.png new file mode 100644 index 0000000000000000000000000000000000000000..5113bc6bad4f88bc2558aae304394e00e107ce88 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167001464.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167046832.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167046832.png new file mode 100644 index 0000000000000000000000000000000000000000..33787429dd3205f9faac254950e95c097bd63b21 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167046832.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167472798.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167472798.png new file mode 100644 index 0000000000000000000000000000000000000000..151ef990edbb33e1f54632609990f6c540149a5e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167472798.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167631876.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167631876.png new file mode 100644 index 0000000000000000000000000000000000000000..44ae627d6e40dd4b297eccdcf1c5dceef5a08d82 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167631876.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167950468.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167950468.png new file mode 100644 index 0000000000000000000000000000000000000000..904fdcf258a2dc8350ace79f0abea18aadc721e0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167950468.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167953648.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167953648.png new file mode 100644 index 0000000000000000000000000000000000000000..e89a1b24da145cf480cceb28ed7249b717e614bf Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167953648.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168111514.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168111514.png new file mode 100644 index 0000000000000000000000000000000000000000..8f6b4abcc27039c624bd21aad775db7c47a22dea Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168111514.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168111610.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168111610.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8300af3bdf43e4d2192699b5ed4065fef451c0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168111610.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168984880.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168984880.png new file mode 100644 index 0000000000000000000000000000000000000000..cc1dc87c79f827c8bb5be3f3771c37f4cb8b214e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168984880.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168984882.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168984882.png new file mode 100644 index 0000000000000000000000000000000000000000..24d65ef9913f6b82a6f70ac2a4e415745112b108 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168984882.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169142476.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169142476.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e18dbe51e815ccdfc6f594e3424850c3b93a12 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169142476.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169143586.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169143586.png new file mode 100644 index 0000000000000000000000000000000000000000..1d5aedb22cb51d00b176f44c5ac5f3ad29d843f2 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169143586.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169144864.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169144864.png new file mode 100644 index 0000000000000000000000000000000000000000..3cc02a6196604a6a3d64b9961c04aaaa51dc829e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169144864.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169151508.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169151508.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac4a39e925322831752617b71a77d040626d251 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169151508.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169301188.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169301188.png new file mode 100644 index 0000000000000000000000000000000000000000..bd4f47314f89fa4bbbd2d14527dd250b5e3e141b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169301188.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169303414.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169303414.png new file mode 100644 index 0000000000000000000000000000000000000000..8192453ec25d486b3923da4a25b0a6fe5034d869 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169303414.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169303416.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169303416.png new file mode 100644 index 0000000000000000000000000000000000000000..68562c1006ec7c61c49c24aec99ecfd173ca055a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169303416.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169309930.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169309930.png new file mode 100644 index 0000000000000000000000000000000000000000..072d846a3cd629316cd0dcf25d5e9e1e1d3e0dc4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169309930.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169309948.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169309948.png new file mode 100644 index 0000000000000000000000000000000000000000..8253c65764c8d74e0a25404aa62fdd69d43f3c26 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169309948.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169315920.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169315920.png new file mode 100644 index 0000000000000000000000000000000000000000..2f786e33181995c2b5bf5f835df4557ff3f7e9b4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169315920.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169461910.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169461910.png new file mode 100644 index 0000000000000000000000000000000000000000..db54e678d8c42daca3e56dd85567c9978a9657c8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169461910.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169463368.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169463368.png new file mode 100644 index 0000000000000000000000000000000000000000..e061801d6eeb27d7fee0b287414e512559a87ea9 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169463368.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169463370.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169463370.png new file mode 100644 index 0000000000000000000000000000000000000000..67959174e9b810b9278a7940bc097ac0c0738c7e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169463370.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169469914.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169469914.png new file mode 100644 index 0000000000000000000000000000000000000000..42efd9018bc05408596a768cbbe309f1e46273d7 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169469914.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169470288.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169470288.png new file mode 100644 index 0000000000000000000000000000000000000000..3404b29dff12b910ae1be71ebf762252895468a8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169470288.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164789.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164789.png new file mode 100644 index 0000000000000000000000000000000000000000..6829d2d87db5a5e28ad1ade1ca45eada97945bec Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164789.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164793.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164793.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4169c4139b0204e7b97dc7b6deeb2389610de2 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164793.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164845.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164845.png new file mode 100644 index 0000000000000000000000000000000000000000..b64c5df26d8c2fb403e08feb72f8979af95ea44f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164845.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164853.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164853.png new file mode 100644 index 0000000000000000000000000000000000000000..8a8562ea95b31781a67259225366d4bf9b86506a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164853.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164867.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164867.png new file mode 100644 index 0000000000000000000000000000000000000000..094d157e55693d0697e407f5f7299c6e2da24f56 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164867.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164869.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164869.png new file mode 100644 index 0000000000000000000000000000000000000000..3866e5677395048de391ed6159a0fe5572f6d91e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164869.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164871.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164871.png new file mode 100644 index 0000000000000000000000000000000000000000..787fe9541b386b83b07e478651637f0f450e99f2 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164871.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164873.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164873.png new file mode 100644 index 0000000000000000000000000000000000000000..d31b9766cc593c0be44ae1abdba2f9f45eaa024e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164873.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164891.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164891.png new file mode 100644 index 0000000000000000000000000000000000000000..38a3de061a3816a2eac62ae3d43284789c0ca31f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164891.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324721.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324721.png new file mode 100644 index 0000000000000000000000000000000000000000..02fe52a90168d22959c9a703951730c9e7813e8a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324721.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324749.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324749.png new file mode 100644 index 0000000000000000000000000000000000000000..3dccd46b21e76a7bbbaabc1ab77a29bd72ae850d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324749.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324751.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324751.png new file mode 100644 index 0000000000000000000000000000000000000000..f9db5c31c8eae66244cd3f6e11336f72284bb2a6 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324751.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324783.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324783.png new file mode 100644 index 0000000000000000000000000000000000000000..e05df70223233ed7162d57f021a167eec9d9686a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324783.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324787.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324787.png new file mode 100644 index 0000000000000000000000000000000000000000..06f1abd77c6c0036539e710f09617c3ef2ce0648 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324787.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324797.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324797.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b1bc728e1dd3c79f4a24bb1516ed752e32c74cd Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324797.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324843.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324843.png new file mode 100644 index 0000000000000000000000000000000000000000..f627659cef03f443e01fb28b44ceb9363369b8d8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324843.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324847.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324847.png new file mode 100644 index 0000000000000000000000000000000000000000..9be62c4f9a5b1ad4b6a1d647c3b0e2d6ac57a33e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324847.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001178875308.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001178875308.png new file mode 100644 index 0000000000000000000000000000000000000000..c085790c6651bf041b772f58f5665d442caf6f4a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001178875308.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001178886129.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001178886129.png new file mode 100644 index 0000000000000000000000000000000000000000..584a2841e6dbd6db9070438c0a56e717a34b133f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001178886129.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001179035242.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001179035242.png new file mode 100644 index 0000000000000000000000000000000000000000..c7311ac9226ca3c0a04cef9a51961424daf8a47a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001179035242.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001198670487.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001198670487.png new file mode 100644 index 0000000000000000000000000000000000000000..5ecd604af13a7917485488f641b525d15e654eee Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001198670487.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001198898293.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001198898293.png new file mode 100644 index 0000000000000000000000000000000000000000..3db4286a873ef0bd14e7adeb085239a9941f918b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001198898293.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001212124299.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001212124299.png new file mode 100644 index 0000000000000000000000000000000000000000..9a73bd33782f06a704ed9b288226dfa381d1d57c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001212124299.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001213192781.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001213192781.png new file mode 100644 index 0000000000000000000000000000000000000000..3108e0436219c1c3a7335679cdfea962c49f454d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001213192781.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001213193285.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001213193285.png new file mode 100644 index 0000000000000000000000000000000000000000..f59a10b44b9e9793bc3a9134f6c4633c8cfb49ce Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001213193285.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214460669.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214460669.png new file mode 100644 index 0000000000000000000000000000000000000000..6e58c669a2976297f71d35c304e988c2884e7dc0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214460669.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214463281.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214463281.png new file mode 100644 index 0000000000000000000000000000000000000000..56c65edbcd66a2ebe9d8ef35c55eba90652bca0f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214463281.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214463283.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214463283.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf23e9e6897ac272a1c486edebd80d12dd44132 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214463283.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214469787.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214469787.png new file mode 100644 index 0000000000000000000000000000000000000000..63b480df9e9700601da85abef015c8326095851f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214469787.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214619417.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214619417.png new file mode 100644 index 0000000000000000000000000000000000000000..5da42e3e14d601745274cb62d914c6600620bb25 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214619417.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214621177.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214621177.png new file mode 100644 index 0000000000000000000000000000000000000000..01f53998ba343eb77fbd7b78414e47e1fb68819e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214621177.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214623227.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214623227.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9a8bacc0f78cb141820e8188d4ae5ef03dc7c1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214623227.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214623229.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214623229.png new file mode 100644 index 0000000000000000000000000000000000000000..625b158772a6198abe3a81719cfc2bd2598bed91 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214623229.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214629745.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214629745.png new file mode 100644 index 0000000000000000000000000000000000000000..fea0122d3ef81899a02199c6cb265a099ad6c44f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214629745.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214630783.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214630783.png new file mode 100644 index 0000000000000000000000000000000000000000..3917378fdcb47448e7daf8ae197e6d033fd345e9 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214630783.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214703717.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214703717.png new file mode 100644 index 0000000000000000000000000000000000000000..1362b8a3d98f4edf36420d3799f01476817e43d4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214703717.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214704759.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214704759.png new file mode 100644 index 0000000000000000000000000000000000000000..6afdd1b39e4bcb3664c7664a55b47b8537f4aeaa Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214704759.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214717247.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214717247.png new file mode 100644 index 0000000000000000000000000000000000000000..4481b08ab897619b408425f9bfe0fd5b1fcb6ef0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214717247.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214811029.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214811029.png new file mode 100644 index 0000000000000000000000000000000000000000..1d71cee4618f1f2822cea1031c9b0e5d602e0a9b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214811029.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214822091.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214822091.png new file mode 100644 index 0000000000000000000000000000000000000000..0c8973bcb7d55910c6702fe6b9b54506ad3b3727 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214822091.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214824709.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214824709.png new file mode 100644 index 0000000000000000000000000000000000000000..d957a62a03d1429504d89d3e7ee649d4b54a24ba Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214824709.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214837127.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214837127.png new file mode 100644 index 0000000000000000000000000000000000000000..658dca4b52032016c15f77a94b3ef76c093b1d2c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214837127.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214837333.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214837333.png new file mode 100644 index 0000000000000000000000000000000000000000..63f343e89f62b15c117e0148c87ac049308c3117 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214837333.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001224354967.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001224354967.png new file mode 100644 index 0000000000000000000000000000000000000000..7469c1e329fc86f0ca7eec9374be7c2c03ae2d6b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001224354967.png differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\344\273\216\345\267\246\345\220\221\345\217\263\346\270\220\345\217\230-\351\207\215\345\244\215\346\270\220\345\217\230.png" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\344\273\216\345\267\246\345\220\221\345\217\263\346\270\220\345\217\230-\351\207\215\345\244\215\346\270\220\345\217\230.png" new file mode 100644 index 0000000000000000000000000000000000000000..da8624b6dbff497762753fe8b5786c3d552c78ed Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\344\273\216\345\267\246\345\220\221\345\217\263\346\270\220\345\217\230-\351\207\215\345\244\215\346\270\220\345\217\230.png" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\345\205\261\344\272\253\345\205\203\347\264\240\350\275\254\345\234\272\351\273\230\350\256\244\346\225\210\346\236\234.png" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\345\205\261\344\272\253\345\205\203\347\264\240\350\275\254\345\234\272\351\273\230\350\256\244\346\225\210\346\236\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..70aa78c1973add7bf07ec822d905c1bc98cb47f9 Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\345\205\261\344\272\253\345\205\203\347\264\240\350\275\254\345\234\272\351\273\230\350\256\244\346\225\210\346\236\234.png" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\345\215\241\347\211\207\350\275\254\345\234\272.gif" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\345\215\241\347\211\207\350\275\254\345\234\272.gif" new file mode 100644 index 0000000000000000000000000000000000000000..62bf33b76b0c0e257efa48131d0acd2249a2bb04 Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\345\215\241\347\211\207\350\275\254\345\234\272.gif" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\345\244\232\345\256\236\344\276\213\350\265\204\346\272\220\345\205\261\344\272\253\347\233\256\345\275\225\347\273\223\346\236\2045+.png" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\345\244\232\345\256\236\344\276\213\350\265\204\346\272\220\345\205\261\344\272\253\347\233\256\345\275\225\347\273\223\346\236\2045+.png" new file mode 100644 index 0000000000000000000000000000000000000000..5e4322d20ad887573ad85958bc181a1be0f85f1c Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\345\244\232\345\256\236\344\276\213\350\265\204\346\272\220\345\205\261\344\272\253\347\233\256\345\275\225\347\273\223\346\236\2045+.png" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\346\215\225\350\216\267.png" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\346\215\225\350\216\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ed837e111c3ac1ba1eafb5b28da581ef4de5d22 Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\346\215\225\350\216\267.png" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\350\256\276\347\275\256\346\226\271\345\220\221\344\270\272to-right\344\270\272\344\273\216\345\267\246\345\220\221\345\217\263\346\270\220\345\217\230.png" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\350\256\276\347\275\256\346\226\271\345\220\221\344\270\272to-right\344\270\272\344\273\216\345\267\246\345\220\221\345\217\263\346\270\220\345\217\230.png" new file mode 100644 index 0000000000000000000000000000000000000000..ed5ee3a87580dd9f485988467163d3a3ea7e95b6 Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\350\256\276\347\275\256\346\226\271\345\220\221\344\270\272to-right\344\270\272\344\273\216\345\267\246\345\220\221\345\217\263\346\270\220\345\217\230.png" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\351\273\230\350\256\244\346\270\220\345\217\230\346\226\271\345\220\221\344\270\272\344\273\216\344\270\212\345\220\221\344\270\213\346\270\220\345\217\230.png" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\351\273\230\350\256\244\346\270\220\345\217\230\346\226\271\345\220\221\344\270\272\344\273\216\344\270\212\345\220\221\344\270\213\346\270\220\345\217\230.png" new file mode 100644 index 0000000000000000000000000000000000000000..e0517663d25f8f857ac08dd4bd1c36ad76190663 Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-js/figures/\351\273\230\350\256\244\346\270\220\345\217\230\346\226\271\345\220\221\344\270\272\344\273\216\344\270\212\345\220\221\344\270\213\346\270\220\345\217\230.png" differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/1-19.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/1-19.png new file mode 100644 index 0000000000000000000000000000000000000000..3c6e9c72046d14a46ed93a1075ee580510e64f92 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/1-19.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/1111.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/1111.png new file mode 100644 index 0000000000000000000000000000000000000000..3fbc152bb27dc98b9db8ace65a5b820c72f77879 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/1111.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/222.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/222.gif new file mode 100644 index 0000000000000000000000000000000000000000..0befd736af77db15c203c4a5578929baf1d83e08 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/222.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/2222.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/2222.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1d0fd10bd28897bf3b1103e5bdba0fdb9d17f1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/2222.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/5-20.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/5-20.gif new file mode 100644 index 0000000000000000000000000000000000000000..587269a1e0647be0acb21deced4722037bb07013 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/5-20.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/AlertDialog.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/AlertDialog.gif new file mode 100644 index 0000000000000000000000000000000000000000..30e89347337d9e358d4b823c7658490e032eb435 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/AlertDialog.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/AnimateTo.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/AnimateTo.gif new file mode 100644 index 0000000000000000000000000000000000000000..864e3a39a57b7a45f63a07fe50545629db3527c4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/AnimateTo.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/AttrAnimation.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/AttrAnimation.gif new file mode 100644 index 0000000000000000000000000000000000000000..69cc497191325216c394de0ce00328a7c5c5fc8c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/AttrAnimation.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Button.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Button.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb1dd72311c866d5bf31a706d75fc1e107a5a946 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Button.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Click.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Click.gif new file mode 100644 index 0000000000000000000000000000000000000000..20a61f7c3daa0e4225a7421803948c073fb9fe31 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Click.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ColumnSplit.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ColumnSplit.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac096bd0f149b02d46013420a9c323fe8aa5805a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ColumnSplit.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/CoreSpec_figures_state-mgmt-overview.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/CoreSpec_figures_state-mgmt-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..37ae5324808a0ab50f210907ca65a09e4456a371 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/CoreSpec_figures_state-mgmt-overview.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Counter.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Counter.gif new file mode 100644 index 0000000000000000000000000000000000000000..a8c10650641ca05ec76b2ff74621506bba7034f4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Counter.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/DisplayPriorityExample.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/DisplayPriorityExample.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bd33e278c8c9edccf66470d2c3585792fceb4ff Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/DisplayPriorityExample.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex01.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex01.gif new file mode 100644 index 0000000000000000000000000000000000000000..8da8a4adcc50c16eafb2378f0bbab0706471ae8b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex01.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex03.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex03.gif new file mode 100644 index 0000000000000000000000000000000000000000..1be92ae9b4a61f304b91c5b03f7b0e799ac679fa Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex03.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex04-16.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex04-16.gif new file mode 100644 index 0000000000000000000000000000000000000000..18e5eef8f04c15625f4e3ae3ab050083b3acc962 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex04-16.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex04.jpg b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex04.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf5c3a49c58818ec9dec43db3c2d4c5e16949a94 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex04.jpg differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex05.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex05.gif new file mode 100644 index 0000000000000000000000000000000000000000..791930fb1f2f681dac85167f646dbcf88d121882 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Flex05.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/GestureGroup.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/GestureGroup.gif new file mode 100644 index 0000000000000000000000000000000000000000..0213b777e0352ac7830bde7d9bff40edf69a1a51 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/GestureGroup.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/GestureSetting.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/GestureSetting.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8e941ae58c68666c04183756b9549cef9d9d3b0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/GestureSetting.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Image1.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Image1.gif new file mode 100644 index 0000000000000000000000000000000000000000..6bc2dfa331eb3b39fc32aa6c1fa131684dff3220 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Image1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Image2.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Image2.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4ac98cf8925e5ae93206fb663bef01e4d929169 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Image2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Image3.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Image3.gif new file mode 100644 index 0000000000000000000000000000000000000000..209112f1e4c14478df3f44390732d4b2c70755f4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Image3.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ImageAnimator.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ImageAnimator.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b877c7bedb4021440eeac2b0a9a9c5d28377da3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ImageAnimator.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/KeyEvent.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/KeyEvent.gif new file mode 100644 index 0000000000000000000000000000000000000000..acbeb39682258aa37a6162230fa5b5bd1ed6a226 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/KeyEvent.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ListItem.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ListItem.gif new file mode 100644 index 0000000000000000000000000000000000000000..557213e5ff5c63c5f3b3db7ffbd56e80eef688f1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ListItem.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/LongPressGesture.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/LongPressGesture.gif new file mode 100644 index 0000000000000000000000000000000000000000..41a08cbcc0e58aadc12328ab72a8ec3f01a375ad Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/LongPressGesture.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/MediaQuery.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/MediaQuery.gif new file mode 100644 index 0000000000000000000000000000000000000000..6150bbeae602c3522416fc9a6ec9fe49f55ebd2c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/MediaQuery.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Navigator.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Navigator.gif new file mode 100644 index 0000000000000000000000000000000000000000..0faae458a1e97e2806130a05d9154af7a2a6d2e3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Navigator.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PageTransition1.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PageTransition1.gif new file mode 100644 index 0000000000000000000000000000000000000000..93c0edf4c20f9d29725065f5bdf7a5208da2e2fd Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PageTransition1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PageTransition2.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PageTransition2.gif new file mode 100644 index 0000000000000000000000000000000000000000..4770183525428b6df03bf1b3eb8cc4160a1568a1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PageTransition2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PanGesture.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PanGesture.gif new file mode 100644 index 0000000000000000000000000000000000000000..d98a4ebc55b1fbc7c598a08095f871f4c3ab8678 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PanGesture.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Panel.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Panel.gif new file mode 100644 index 0000000000000000000000000000000000000000..1cd6ff13714a55e253e9649c007080b47f02f791 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Panel.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PinchGesture.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PinchGesture.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5b827457bbb9fbb12c8d1cbee4886dede46a048 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/PinchGesture.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Rating.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Rating.gif new file mode 100644 index 0000000000000000000000000000000000000000..49922f7f7d934216dcbf8837c697d13063d101a4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Rating.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/RotationGesture.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/RotationGesture.gif new file mode 100644 index 0000000000000000000000000000000000000000..323cd3b5bf1913f6740db4ce2203a07fcb30fb5e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/RotationGesture.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/RowSplit.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/RowSplit.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ea18f82170eb3309aefb8af24ef89f886718bdd Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/RowSplit.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/SharedTransition.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/SharedTransition.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c81f8cfffb0c4d064335c9ebc0e8c918d10035a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/SharedTransition.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Span.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Span.gif new file mode 100644 index 0000000000000000000000000000000000000000..3a2f5de773fed90a3c0c058d0b27bc0edd1f1904 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Span.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Tabs.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Tabs.gif new file mode 100644 index 0000000000000000000000000000000000000000..49a1503a776598da93f4089bb079c61125a71a2e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Tabs.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/TapGesture.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/TapGesture.gif new file mode 100644 index 0000000000000000000000000000000000000000..33a9b7c1a5a408a94cd58261742a29dc7519d880 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/TapGesture.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Text1.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Text1.gif new file mode 100644 index 0000000000000000000000000000000000000000..627fff6c85420f981d9ae844d0e53a77d254ac7c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Text1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Text2.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Text2.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b359a2d036a69fd442145d55e23031755c925c1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Text2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Touch.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Touch.gif new file mode 100644 index 0000000000000000000000000000000000000000..021c8dfc90ce80c3ee16acbcb4e06c0ddec6e21e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Touch.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Transition.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Transition.gif new file mode 100644 index 0000000000000000000000000000000000000000..e7dc2d19afd049c44c75e1288063df96326e524c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/Transition.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/alphabetindexer.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/alphabetindexer.gif new file mode 100644 index 0000000000000000000000000000000000000000..438c67b65f13bfcd1ee3eb19e4f0c1265ae16278 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/alphabetindexer.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/appear.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/appear.gif new file mode 100644 index 0000000000000000000000000000000000000000..c18ae783333765788db1b8bf6107ee0c117ec9e6 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/appear.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/back.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/back.png new file mode 100644 index 0000000000000000000000000000000000000000..4e556034506103bd7e7b491d72ef74b9eccde52c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/back.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/badge.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/badge.gif new file mode 100644 index 0000000000000000000000000000000000000000..016da55bb5d98a3d2787d870bf2575fbaf383990 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/badge.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/blank_h.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/blank_h.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f3a05c4fa0ac29097cc25d6021fa33f069f6175 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/blank_h.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/blank_v.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/blank_v.gif new file mode 100644 index 0000000000000000000000000000000000000000..04e09206185deb61233c3bf51a302cc0ccc9c080 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/blank_v.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/border.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/border.gif new file mode 100644 index 0000000000000000000000000000000000000000..89da584f60db920d0801f9e40138a56fd4242fd3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/border.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/circle.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..d34ba19a667f40c8dc3b4e668095bda1bd4868aa Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/circle.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/clip.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/clip.png new file mode 100644 index 0000000000000000000000000000000000000000..c1bfde1c57599f8cc40d0dc50179c71f4dfc2978 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/clip.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/colorGradient.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/colorGradient.png new file mode 100644 index 0000000000000000000000000000000000000000..2c20e6d28a0636b8122f6377052933c33cfcffaf Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/colorGradient.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/column.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/column.gif new file mode 100644 index 0000000000000000000000000000000000000000..3213fc124d255584be8f21a3074806c304953e7b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/column.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/customdialog.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/customdialog.gif new file mode 100644 index 0000000000000000000000000000000000000000..17ae76b8141d65147f9774d130711f46bf332d02 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/customdialog.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/datapanel.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/datapanel.png new file mode 100644 index 0000000000000000000000000000000000000000..6b8ac87fce6a2b4aebc98304db6ed2fd7d14cb82 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/datapanel.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/datatype.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/datatype.png new file mode 100644 index 0000000000000000000000000000000000000000..fde616c73000d3f58fd98eea59088177221127a5 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/datatype.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/divider.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/divider.png new file mode 100644 index 0000000000000000000000000000000000000000..f2deeb8445fe0f3b66d2b0facbf9e0f0ed9911ca Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/divider.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ellipse-18.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ellipse-18.png new file mode 100644 index 0000000000000000000000000000000000000000..b85ac72fcec0f4b2eb752307d4abe05ef4795ef2 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/ellipse-18.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/enabled.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/enabled.gif new file mode 100644 index 0000000000000000000000000000000000000000..c48a9fa7aca3a160a68868d06d48f6af22ce6d87 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/enabled.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/flex.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/flex.png new file mode 100644 index 0000000000000000000000000000000000000000..884eb29ed12c00641fec55f358a41f15f581c335 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/flex.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/flex02.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/flex02.png new file mode 100644 index 0000000000000000000000000000000000000000..f27757afb281875f5cd4fca0e4b86684cdf0f1a8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/flex02.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/grid-17.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/grid-17.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ead4d671531532629b2fbf2f411ce4008dde3ba Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/grid-17.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/grid.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/grid.gif new file mode 100644 index 0000000000000000000000000000000000000000..1868b355aac470977ff1b36a5c1b3adf007dbfda Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/grid.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/griditem.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/griditem.gif new file mode 100644 index 0000000000000000000000000000000000000000..07a8d81674d244e6ec76c0b43558890caf53062e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/griditem.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/line.jpg b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/line.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3d3e1023746c03c9ad426328de0114321ac3f66 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/line.jpg differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/list.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/list.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc49b51652e53b6caa3888b054dbea94c2f498eb Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/list.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/menu.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/menu.gif new file mode 100644 index 0000000000000000000000000000000000000000..f30a8d85e898213691abd5369c9c1008d399274b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/menu.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/motion.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/motion.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec293bafaf6cd7204ebb231c4eee7daa504b78c3 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/motion.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/opacity.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/opacity.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0e5e55e1af19bb46a74300bf2ae60f95225a874 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/opacity.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/overlay.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/overlay.gif new file mode 100644 index 0000000000000000000000000000000000000000..4cce6cb6a529cffef01d5b7d1f6ce5f02d63210e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/overlay.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/path.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/path.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c6998d7f55a75562fbf709aa84b4bd12922ae6 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/path.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/polygon.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/polygon.gif new file mode 100644 index 0000000000000000000000000000000000000000..78e7436bf654889a3a04e9d2e5dd53f5fb562906 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/polygon.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/polyline.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/polyline.gif new file mode 100644 index 0000000000000000000000000000000000000000..49167ceae5eb50a96334c73496ed534d25bbecf4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/polyline.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/popup.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/popup.gif new file mode 100644 index 0000000000000000000000000000000000000000..3bbb23f623eb1163af382d30bc32c1c4cbe524dd Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/popup.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/position.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/position.gif new file mode 100644 index 0000000000000000000000000000000000000000..3174da059167d3560a99d50cca06ec678cabed96 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/position.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/position2.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/position2.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee69d15a36eda3047be045a3d037fd27a37166fe Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/position2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/progress-15.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/progress-15.png new file mode 100644 index 0000000000000000000000000000000000000000..0ff7595bc619e62c05376cd7b57a473dde3e9386 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/progress-15.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/q1.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/q1.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb53d971cbadb6479cc755ae0a95cd4c0c3bff1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/q1.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/qrcode.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2c6040690cebf054da6dbc70c87d14c82be9d6 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/qrcode.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/rect.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/rect.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2c71e4bcc008c0d286a05b2e969103aa06236d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/rect.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/row.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/row.png new file mode 100644 index 0000000000000000000000000000000000000000..3b44b9a41cb0fa78afcde81f82e0ad63c90de58d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/row.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/s1.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/s1.png new file mode 100644 index 0000000000000000000000000000000000000000..15e3b57fbcadac9e9c6f4c1446bd16c53845f888 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/s1.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/s3.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/s3.png new file mode 100644 index 0000000000000000000000000000000000000000..3b2e35a9a29c6f849cd4e766c8fac0016b95365d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/s3.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/s4-(1).png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/s4-(1).png new file mode 100644 index 0000000000000000000000000000000000000000..4f6f99db3df495c744c612e3a2dff20d2a757a43 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/s4-(1).png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/scroll.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/scroll.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa6a5f8e639b2b8b73bdae505da6b67800c5eb63 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/scroll.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/shape.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/shape.gif new file mode 100644 index 0000000000000000000000000000000000000000..467de1302c615f93709c266f3d5a47ecb941fc53 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/shape.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/sider.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/sider.gif new file mode 100644 index 0000000000000000000000000000000000000000..733585b5ca3cbb4fdf690e596b622f56393700d0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/sider.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/size.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/size.gif new file mode 100644 index 0000000000000000000000000000000000000000..dffa33c4389c4576d2492cd98499b71715b8ead8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/size.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/stack.jpg b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/stack.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b0e1a1070b2bdbb158e1ba66caa2269626acd1ef Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/stack.jpg differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/swiper.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/swiper.gif new file mode 100644 index 0000000000000000000000000000000000000000..bf8d1335752f51258920d0cfc1b65190e2f53011 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/swiper.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/textstyle.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/textstyle.png new file mode 100644 index 0000000000000000000000000000000000000000..5499902761b534f84a0405094afe2fb5d4724322 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/textstyle.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/visibility.gif b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/visibility.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe69ab973cfd17f540dd1da4fd04de890af95c74 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/visibility.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/zIndex.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/zIndex.png new file mode 100644 index 0000000000000000000000000000000000000000..92ddc7d5d9ee2f87128ed8951b2294ea3c07f650 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/zIndex.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/zh-cn_image_0000001182200571.png b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/zh-cn_image_0000001182200571.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d760c6d3f6c1e377ff2e42c0b3fb9e547ac140 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/zh-cn_image_0000001182200571.png differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\345\203\217\347\264\240\345\215\225\344\275\215.gif" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\345\203\217\347\264\240\345\215\225\344\275\215.gif" new file mode 100644 index 0000000000000000000000000000000000000000..391353977d32956cde03890e501d11766dae2648 Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\345\203\217\347\264\240\345\215\225\344\275\215.gif" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\346\250\252\345\261\217\346\230\276\347\244\272.gif" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\346\250\252\345\261\217\346\230\276\347\244\272.gif" new file mode 100644 index 0000000000000000000000000000000000000000..b4c58da1a241d9d4ea1534b67bb7cd5050e90bf6 Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\346\250\252\345\261\217\346\230\276\347\244\272.gif" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\347\253\226\345\261\217\346\230\276\347\244\272.gif" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\347\253\226\345\261\217\346\230\276\347\244\272.gif" new file mode 100644 index 0000000000000000000000000000000000000000..67ccf57fd6c267e8c420b43c309c143a2dd56a45 Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\347\253\226\345\261\217\346\230\276\347\244\272.gif" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\350\256\276\345\244\207\345\256\275\345\272\246\344\270\272LG.png" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\350\256\276\345\244\207\345\256\275\345\272\246\344\270\272LG.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e003ab973198f6d52e559654e0848fa0aacb79e Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\350\256\276\345\244\207\345\256\275\345\272\246\344\270\272LG.png" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\350\256\276\345\244\207\345\256\275\345\272\246\344\270\272MD.png" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\350\256\276\345\244\207\345\256\275\345\272\246\344\270\272MD.png" new file mode 100644 index 0000000000000000000000000000000000000000..e0c21d7388daa4fe32803436b7fb1630f99c2dbc Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\350\256\276\345\244\207\345\256\275\345\272\246\344\270\272MD.png" differ diff --git "a/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\350\256\276\345\244\207\345\256\275\345\272\246\344\270\272SM.png" "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\350\256\276\345\244\207\345\256\275\345\272\246\344\270\272SM.png" new file mode 100644 index 0000000000000000000000000000000000000000..9ef495d81128387b6b41c813bcfda52f6b7dff87 Binary files /dev/null and "b/website/docs/.vuepress/public/images/application-dev/reference/arkui-ts/figures/\350\256\276\345\244\207\345\256\275\345\272\246\344\270\272SM.png" differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/1-0.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/1-0.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7779b378c80842817091bedf62d74378bfff055 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/1-0.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/1-2.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/1-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..27f8177c1c626565ce53f409bbf5a4e2f7cdba01 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/1-2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/1.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/1.gif new file mode 100644 index 0000000000000000000000000000000000000000..5cfb969baf3a36e231a311ca11ca538c248f6da1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/111-1.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/111-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..d669cf40b97891ba3853be28574dceae172fe138 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/111-1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/111.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/111.png new file mode 100644 index 0000000000000000000000000000000000000000..664e50e404e5e7f6e4c4823bf1099391bfa45e33 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/111.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/1111.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/1111.gif new file mode 100644 index 0000000000000000000000000000000000000000..90898288928277467db40c5eb11b4ff7ae082e6e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/1111.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/22.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/22.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1038b5da74612ac1911e1dae9d3a1de24ee46c7 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/22.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/3.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/3.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff991f2899c847c433e41ccafd6798a386540369 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/3.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/3333.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/3333.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1288776a8086fbb9e66691b0e882784db243aba Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/3333.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/4444.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/4444.gif new file mode 100644 index 0000000000000000000000000000000000000000..16a2d3f912b23349a5c416e5c5b74f4fd05a12aa Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/4444.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/d1.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/d1.gif new file mode 100644 index 0000000000000000000000000000000000000000..f470f5261becb6c2d7b30f691a0794db2b1feb93 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/d1.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/d2.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/d2.gif new file mode 100644 index 0000000000000000000000000000000000000000..365dbc42e583335f32de863120fd80ae0e7d59e5 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/d2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/d3.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/d3.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7808565202cf12474f1282e67fde3a9c85d0e9c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/d3.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/d4.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/d4.gif new file mode 100644 index 0000000000000000000000000000000000000000..3fe0cd60d60a0c5d29c2625ebade3d8b0bd0cdf8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/d4.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/q2.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/q2.gif new file mode 100644 index 0000000000000000000000000000000000000000..5eb149620499c0d1d363d274ad88a741095fc922 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/q2.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/q3.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/q3.gif new file mode 100644 index 0000000000000000000000000000000000000000..5a297661641d1714ebc95116592a97a693293e0a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/q3.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/q8.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/q8.gif new file mode 100644 index 0000000000000000000000000000000000000000..5e38a4068976c9b5e298ff33ad4cfc711de4b2a6 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/q8.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001063148757.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001063148757.gif new file mode 100755 index 0000000000000000000000000000000000000000..2283e46371317539004c0007886500c1a81dd83a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001063148757.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001063442797.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001063442797.png new file mode 100755 index 0000000000000000000000000000000000000000..56722216f1433b27da4fc49c649c7e8cf4361a45 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001063442797.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001064068638.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001064068638.gif new file mode 100755 index 0000000000000000000000000000000000000000..a22665c1c2d86025245dbac4b78c5b4bd5c264df Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001064068638.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001070558189.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001070558189.png new file mode 100755 index 0000000000000000000000000000000000000000..3e6c90236fa93360b187945fc9556ae735d4578f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001070558189.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001070693737.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001070693737.png new file mode 100755 index 0000000000000000000000000000000000000000..fc5e2c46f89ed2972750033ff3cad82c35733752 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001070693737.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001070707559.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001070707559.png new file mode 100755 index 0000000000000000000000000000000000000000..3417fe5b0259e024e475c6c1953c23afcc768584 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001070707559.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001071134933.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001071134933.png new file mode 100755 index 0000000000000000000000000000000000000000..5000709da6dfadee24e10fdbd679b3a28e46578b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001071134933.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001117452952.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001117452952.png new file mode 100644 index 0000000000000000000000000000000000000000..128187aacfa540846172eac7d4ff47a3c2a31291 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001117452952.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001148858818.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001148858818.png new file mode 100644 index 0000000000000000000000000000000000000000..345a2be66315d210a86c20d30c56b8b5f487c325 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001148858818.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001158896538.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001158896538.png new file mode 100644 index 0000000000000000000000000000000000000000..89c8accb2a567d32f056cbbb1158c51f3baf013d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001158896538.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001162586456.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001162586456.gif new file mode 100644 index 0000000000000000000000000000000000000000..38b7d7b5233d51d4ff96b8852eb3d29e0d1dfb55 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001162586456.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001162911958.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001162911958.gif new file mode 100644 index 0000000000000000000000000000000000000000..067268949d47e1cbefdc51b0d736200a4eee443f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001162911958.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163212628.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163212628.gif new file mode 100644 index 0000000000000000000000000000000000000000..81c69fd269e744e1247e9db9b034f2d427e5b069 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163212628.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163212630.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163212630.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee77fe426618b91da8203ab9efb4b9c4f0dbc191 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163212630.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163212980.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163212980.gif new file mode 100644 index 0000000000000000000000000000000000000000..f333c9666cf9ba259ff2e5d0d883c4988659e877 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163212980.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163214740.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163214740.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b53dc71f7212ebe031ec5c9d19a41267afc448a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163214740.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163228602.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163228602.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc1eab30eb6a87308eaf399a89f1a755223f3995 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163228602.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163228638.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163228638.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2097084b8dda33575a19b7c97d0555dcd5c04f9 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163228638.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163229150.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163229150.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3453785e39354ba12ba98483ca3d332da070680 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163229150.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163372568.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163372568.png new file mode 100644 index 0000000000000000000000000000000000000000..24908708ecdc45a01ed06334f67171bca9d553ef Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163372568.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163372620.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163372620.gif new file mode 100644 index 0000000000000000000000000000000000000000..ccd5021baf4d3fa2ab124f4033e7d36f78249729 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163372620.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163372646.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163372646.gif new file mode 100644 index 0000000000000000000000000000000000000000..b007605e58eb671665d4441b967f0e61de0e0493 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163372646.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163375178.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163375178.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9cfac61024e39647871b85b72d57bc4dbd1bfa9 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163375178.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163388642.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163388642.gif new file mode 100644 index 0000000000000000000000000000000000000000..d536b946b814de3d5b822611ac5c91c749a9d254 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163388642.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163489068.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163489068.png new file mode 100644 index 0000000000000000000000000000000000000000..ac085642762d13eddbdab4a96ad6f629057d3d8e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163489068.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163515416.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163515416.gif new file mode 100644 index 0000000000000000000000000000000000000000..1167b5ba7a0c503e2e22bc3d643c16c29cd77efe Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163515416.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163531184.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163531184.gif new file mode 100644 index 0000000000000000000000000000000000000000..996c64e58b34c78058c80ee8f54713e78b7fb373 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163531184.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163531210.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163531210.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d5a07d1ff67011de5d0ec6bc0c2e552db9e5cd0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163531210.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163532072.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163532072.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca7c5488fb83a122e7f8ea1fba1e2d59324e513 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163532072.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163547244.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163547244.gif new file mode 100644 index 0000000000000000000000000000000000000000..a670318ef033221cf4df47b2f4740218a1fb8727 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163547244.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163656706.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163656706.png new file mode 100644 index 0000000000000000000000000000000000000000..5877e6f9966eb4eee0b738ee7356985f9a819714 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163656706.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163691126.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163691126.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c5b1398a0b639f19a40fa679fa84d311c42d156 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163691126.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163691154.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163691154.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f0ae015c5957a86d2bf8c583406461a8c4f293 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001163691154.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001165191390.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001165191390.gif new file mode 100644 index 0000000000000000000000000000000000000000..82123adf27f2c782fe882a2c3399646ed3763629 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001165191390.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001165344988.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001165344988.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8b2d36da4a14abee57a064898fce0899743751 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001165344988.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001166432552.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001166432552.png new file mode 100644 index 0000000000000000000000000000000000000000..72c1ad1e7e1c2100b85be89be4f0648c5ab19d57 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001166432552.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001167746622.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001167746622.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b8012da47797dfd3909843cba9af1468fb4e89 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001167746622.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168059158.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168059158.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9259dc9c0a7cb3530e3f7d9b0225e5160b92c8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168059158.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168410342.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168410342.png new file mode 100644 index 0000000000000000000000000000000000000000..3a97ead3b625041b9a3a33c8db8cd7cb79276a2d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168410342.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168570318.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168570318.png new file mode 100644 index 0000000000000000000000000000000000000000..5e855312aef77f5badc0c0b0b4d5cbeac23b802f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168570318.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168728272.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168728272.png new file mode 100644 index 0000000000000000000000000000000000000000..411cc11b2ac16047c5e2c8a24b3d572b9e24f768 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168728272.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168728872.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168728872.png new file mode 100644 index 0000000000000000000000000000000000000000..d1dc59cd8ac1b5dc7da2f57d16d9a080bb449114 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168728872.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168888224.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168888224.png new file mode 100644 index 0000000000000000000000000000000000000000..4487bdcb98a9b1f912be17041859d7a7a246f183 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168888224.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168888822.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168888822.png new file mode 100644 index 0000000000000000000000000000000000000000..f33eb296f27701a00461cd9231f7d9af014a3814 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168888822.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168956332.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168956332.png new file mode 100644 index 0000000000000000000000000000000000000000..15a7e0bdc38655a23f64bfa56c4adad9a6a199a0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001168956332.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169532276.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169532276.png new file mode 100644 index 0000000000000000000000000000000000000000..eca2b53342a2bf63d089c835bfdae16b2608e70f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169532276.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169599582.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169599582.png new file mode 100644 index 0000000000000000000000000000000000000000..a4eb400dcd217074d6e76902723e9fffd34fd4bd Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169599582.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169678922.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169678922.png new file mode 100644 index 0000000000000000000000000000000000000000..fad940f7f4fba442aa1b267c66cdc21c5d3a1d2c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169678922.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169759552.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169759552.png new file mode 100644 index 0000000000000000000000000000000000000000..2a2376e7e953d35b7d0fb1f6d53314bc0d7cb6b5 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169759552.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169852428.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169852428.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd767ccef460fa7ae5f0f65c64ab92c14346042 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169852428.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169918548.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169918548.gif new file mode 100644 index 0000000000000000000000000000000000000000..220d14e0637e2808211cec10173c6c4a7552b64c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001169918548.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001170008198.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001170008198.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4b3de8f257c571e6fec3ff51795936b2d94d2f0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001170008198.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001170167520.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001170167520.gif new file mode 100644 index 0000000000000000000000000000000000000000..d69156cdc0d1f1f33560148c1161618f97acb21d Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001170167520.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001170411978.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001170411978.gif new file mode 100644 index 0000000000000000000000000000000000000000..218be7ed11ffd1f1f199c347f0fa90e6f6b64b53 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001170411978.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001173950938.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001173950938.png new file mode 100644 index 0000000000000000000000000000000000000000..62c786d7dacd69bae17ebe4074a2d429cd7f6851 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001173950938.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001195117633.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001195117633.png new file mode 100644 index 0000000000000000000000000000000000000000..00964c1cfa5f006f2e8ac064133e23a2d8fc92aa Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001195117633.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001195119619.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001195119619.png new file mode 100644 index 0000000000000000000000000000000000000000..d5bed5e4ae3a322db0e4f05482913fdbd828cbed Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001195119619.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001204537865.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001204537865.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb0d2cc3f3dd8e239e9232e655344c864cbf679 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001204537865.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001204538065.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001204538065.png new file mode 100644 index 0000000000000000000000000000000000000000..514bc6e8fcdab7ae01de64d16d92a0541954c458 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001204538065.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001204776353.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001204776353.png new file mode 100644 index 0000000000000000000000000000000000000000..883981a250b68a29db2027dee82a9a19c34c8e1a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001204776353.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208393581.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208393581.gif new file mode 100644 index 0000000000000000000000000000000000000000..a20dc90cfeff09cc98ce1e36e2f032af60f9777e Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208393581.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208636379.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208636379.gif new file mode 100644 index 0000000000000000000000000000000000000000..e0d0662622fa12506072961b407ed888c2478d90 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208636379.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208691071.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208691071.gif new file mode 100644 index 0000000000000000000000000000000000000000..04a29d4fceaccc3123869721338dd9236e9961c0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208691071.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208693047.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208693047.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee4cb1581041fef7c9cd7ecaf8631934004bf682 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208693047.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208703849.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208703849.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee7bb97af0e5f571b684408cf5d6bec4192eefd2 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208703849.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208771093.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208771093.png new file mode 100644 index 0000000000000000000000000000000000000000..c07a237f3bff7acbb5adbe7ca0d142aa204f7f13 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208771093.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208771113.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208771113.gif new file mode 100644 index 0000000000000000000000000000000000000000..bca4a03308a47deb0538aec9b93fe0df9addacb0 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208771113.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208787005.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208787005.gif new file mode 100644 index 0000000000000000000000000000000000000000..80a6d574da0827642f85fd34d1acd11caade21cf Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208787005.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208787965.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208787965.gif new file mode 100644 index 0000000000000000000000000000000000000000..ce6ebb1996cffd5111e0ebc811a4c79c4e9aa35c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208787965.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208892613.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208892613.gif new file mode 100644 index 0000000000000000000000000000000000000000..54f3a3ade4c3d1b35eddc7d92522c7d83ee50e6b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208892613.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208892929.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208892929.gif new file mode 100644 index 0000000000000000000000000000000000000000..4cf6b5a0fbfa3b5b9b9e66944dcc49806d5738c4 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208892929.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208908643.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208908643.gif new file mode 100644 index 0000000000000000000000000000000000000000..40f7c00741880a81530581d5488c2ff96e0e7bf2 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208908643.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208975737.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208975737.png new file mode 100644 index 0000000000000000000000000000000000000000..5be6a14c5f547453bc6a9d3c4f31d2019e9f905a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001208975737.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001209028575.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001209028575.gif new file mode 100644 index 0000000000000000000000000000000000000000..014958726f3f42a6bd92b341695c8ed03b3fd211 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001209028575.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001209033195.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001209033195.png new file mode 100644 index 0000000000000000000000000000000000000000..09f170afc5fac1513c0e453a6562a4670b3750f8 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001209033195.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001210358571.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001210358571.gif new file mode 100644 index 0000000000000000000000000000000000000000..b5a529405d396af8c87d45cdaefc8fe87a6af85b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001210358571.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001210951235.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001210951235.gif new file mode 100644 index 0000000000000000000000000000000000000000..c065efe3b76f9ae8ab48cc394d8d591cd3a00b54 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001210951235.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001210951541.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001210951541.gif new file mode 100644 index 0000000000000000000000000000000000000000..883453582802ecbb94916aaefd120123c9128625 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001210951541.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211069339.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211069339.png new file mode 100644 index 0000000000000000000000000000000000000000..f835c8abc0dfbfb3b52480d31c12bfd6e77c278b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211069339.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211071477.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211071477.png new file mode 100644 index 0000000000000000000000000000000000000000..4f33bfa94e4e8d0a6e70e6f8332126757b320560 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211071477.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211225091.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211225091.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ac33ba8eea89d257a3ff8f5947b007abdf4215 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211225091.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211227617.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211227617.png new file mode 100644 index 0000000000000000000000000000000000000000..4d26b5ba589c8b9126c51b54ff4d67476771cdf2 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211227617.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211246571.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211246571.gif new file mode 100644 index 0000000000000000000000000000000000000000..4232ddc088cfaf7015aa3bca6622c39bbd5624a6 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211246571.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211383427.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211383427.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8e28967b4af0d0a3e10093b0b2dfab043da52c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001211383427.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001213462329.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001213462329.png new file mode 100644 index 0000000000000000000000000000000000000000..99a2f37ce14924c6c2d91f828d7ffaa8c87ec77f Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001213462329.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001213968747.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001213968747.png new file mode 100644 index 0000000000000000000000000000000000000000..f125f44d4a956c717f3bf1481f7161cf41e79a39 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001213968747.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214128687.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214128687.png new file mode 100644 index 0000000000000000000000000000000000000000..e42b6a7b9c128f9de2217c988fa34cd385742044 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214128687.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214210217.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214210217.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6560056b15b9c570758670eb65311168df7e9a Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214210217.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214330169.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214330169.png new file mode 100644 index 0000000000000000000000000000000000000000..19ee7009247945887ceb0f8f6f471e45f3116b70 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214330169.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214595111.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214595111.png new file mode 100644 index 0000000000000000000000000000000000000000..0a44a65c48f7f334e5d77e400495d455dc1283d1 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214595111.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214998349.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214998349.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9be43d1fedfbd8660965190865110f007d8161 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001214998349.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215079443.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215079443.png new file mode 100644 index 0000000000000000000000000000000000000000..032c5bae7d3269bd4a3bb813e9d69c9271ac9843 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215079443.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215113569.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215113569.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b4a7dfc70a6ee3ce7a837d1e8e91acc7d05d22 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215113569.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215199399.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215199399.png new file mode 100644 index 0000000000000000000000000000000000000000..3834601d70a5121e18af408bb6a12bbdbf54a28c Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215199399.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215318403.gif b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215318403.gif new file mode 100644 index 0000000000000000000000000000000000000000..5643eb93241bf15f6cb75ffaf463ada35ba13201 Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215318403.gif differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215433095.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215433095.png new file mode 100644 index 0000000000000000000000000000000000000000..d015869874aecf7235aa892993d3d872a4cfe9df Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001215433095.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001219237131.png b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001219237131.png new file mode 100644 index 0000000000000000000000000000000000000000..cc39aec87bb14a36eb6214a2ef39d45c631d4a2b Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/figures/zh-cn_image_0000001219237131.png differ diff --git a/website/docs/.vuepress/public/images/application-dev/ui/public_sys-resources/icon-note.gif b/website/docs/.vuepress/public/images/application-dev/ui/public_sys-resources/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and b/website/docs/.vuepress/public/images/application-dev/ui/public_sys-resources/icon-note.gif differ diff --git a/website/docs/.vuepress/public/images/contribute/figures/ci-portal.png b/website/docs/.vuepress/public/images/contribute/figures/ci-portal.png new file mode 100644 index 0000000000000000000000000000000000000000..91286f6c80765ff974e4998ced9544c99984c002 Binary files /dev/null and b/website/docs/.vuepress/public/images/contribute/figures/ci-portal.png differ diff --git a/website/docs/.vuepress/public/images/contribute/figures/docs-sig.png b/website/docs/.vuepress/public/images/contribute/figures/docs-sig.png new file mode 100644 index 0000000000000000000000000000000000000000..f71de06acdf9009792ec148adf52f9d071348b2c Binary files /dev/null and b/website/docs/.vuepress/public/images/contribute/figures/docs-sig.png differ diff --git a/website/docs/.vuepress/public/images/contribute/figures/sig-task.png b/website/docs/.vuepress/public/images/contribute/figures/sig-task.png new file mode 100644 index 0000000000000000000000000000000000000000..ed677967d298449ed62d5b66c405c38f86b06b09 Binary files /dev/null and b/website/docs/.vuepress/public/images/contribute/figures/sig-task.png differ diff --git "a/website/docs/.vuepress/public/images/contribute/figures/\345\244\215\345\210\266\350\277\234\347\250\213\344\273\223\345\272\223.png" "b/website/docs/.vuepress/public/images/contribute/figures/\345\244\215\345\210\266\350\277\234\347\250\213\344\273\223\345\272\223.png" new file mode 100755 index 0000000000000000000000000000000000000000..dc499827a432f72adda7c12a70576f5e6e2a212b Binary files /dev/null and "b/website/docs/.vuepress/public/images/contribute/figures/\345\244\215\345\210\266\350\277\234\347\250\213\344\273\223\345\272\223.png" differ diff --git "a/website/docs/.vuepress/public/images/contribute/figures/\346\210\252\345\233\276\347\244\272\344\276\213.png" "b/website/docs/.vuepress/public/images/contribute/figures/\346\210\252\345\233\276\347\244\272\344\276\213.png" new file mode 100755 index 0000000000000000000000000000000000000000..64ab1ca706103d109a124a1500ae3d8be8cc9d76 Binary files /dev/null and "b/website/docs/.vuepress/public/images/contribute/figures/\346\210\252\345\233\276\347\244\272\344\276\213.png" differ diff --git "a/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2301.png" "b/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2301.png" new file mode 100755 index 0000000000000000000000000000000000000000..2cd4167075c9c44c051f74607ebadf91d4b1ad5f Binary files /dev/null and "b/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2301.png" differ diff --git "a/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2302.png" "b/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2302.png" new file mode 100755 index 0000000000000000000000000000000000000000..628f2eb893b83fde34be04b8a3182cce533ea704 Binary files /dev/null and "b/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2302.png" differ diff --git "a/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2303.png" "b/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2303.png" new file mode 100755 index 0000000000000000000000000000000000000000..186247217b85db499d6a7c23d8700c5c2ba6aa2f Binary files /dev/null and "b/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2303.png" differ diff --git "a/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2304.png" "b/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2304.png" new file mode 100755 index 0000000000000000000000000000000000000000..f8603eedddf5862bd9c80bd7f78b2e4163c26b7d Binary files /dev/null and "b/website/docs/.vuepress/public/images/contribute/figures/\346\227\240\346\240\207\351\242\2304.png" differ diff --git "a/website/docs/.vuepress/public/images/contribute/figures/\351\205\215\350\211\262\347\244\272\344\276\213.png" "b/website/docs/.vuepress/public/images/contribute/figures/\351\205\215\350\211\262\347\244\272\344\276\213.png" new file mode 100755 index 0000000000000000000000000000000000000000..7f3a10718561e54c1221fb2c08464f7cf1a144be Binary files /dev/null and "b/website/docs/.vuepress/public/images/contribute/figures/\351\205\215\350\211\262\347\244\272\344\276\213.png" differ diff --git a/website/docs/.vuepress/public/images/contribute/public_sys-resources/icon-caution.gif b/website/docs/.vuepress/public/images/contribute/public_sys-resources/icon-caution.gif new file mode 100755 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and b/website/docs/.vuepress/public/images/contribute/public_sys-resources/icon-caution.gif differ diff --git a/website/docs/.vuepress/public/images/contribute/public_sys-resources/icon-note.gif b/website/docs/.vuepress/public/images/contribute/public_sys-resources/icon-note.gif new file mode 100755 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and b/website/docs/.vuepress/public/images/contribute/public_sys-resources/icon-note.gif differ diff --git a/website/docs/.vuepress/public/images/contribute/public_sys-resources/icon-notice.gif b/website/docs/.vuepress/public/images/contribute/public_sys-resources/icon-notice.gif new file mode 100755 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 Binary files /dev/null and b/website/docs/.vuepress/public/images/contribute/public_sys-resources/icon-notice.gif differ diff --git a/website/docs/.vuepress/public/images/design/figures/API-Lifecycle.png b/website/docs/.vuepress/public/images/design/figures/API-Lifecycle.png new file mode 100755 index 0000000000000000000000000000000000000000..365c6a228bccd70ce912be4958ba3e8c40bfd809 Binary files /dev/null and b/website/docs/.vuepress/public/images/design/figures/API-Lifecycle.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/bundles/figure/3516dv300.png b/website/docs/.vuepress/public/images/device-dev/bundles/figure/3516dv300.png new file mode 100644 index 0000000000000000000000000000000000000000..c4636401a20e37794d8ec28dc173e9308b2b72db Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/bundles/figure/3516dv300.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/bundles/figure/SCons\345\256\211\350\243\205\346\210\220\345\212\237\347\225\214\351\235\242-\347\211\210\346\234\254\350\246\201\346\261\2023-0-4\344\273\245\344\270\212-27.png" "b/website/docs/.vuepress/public/images/device-dev/bundles/figure/SCons\345\256\211\350\243\205\346\210\220\345\212\237\347\225\214\351\235\242-\347\211\210\346\234\254\350\246\201\346\261\2023-0-4\344\273\245\344\270\212-27.png" new file mode 100644 index 0000000000000000000000000000000000000000..e66ca6ffae9aec5f4f5b97ceccf2e37792e95f18 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/bundles/figure/SCons\345\256\211\350\243\205\346\210\220\345\212\237\347\225\214\351\235\242-\347\211\210\346\234\254\350\246\201\346\261\2023-0-4\344\273\245\344\270\212-27.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/bundles/figure/zh-cn_image_0000001141641532.png b/website/docs/.vuepress/public/images/device-dev/bundles/figure/zh-cn_image_0000001141641532.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab29d3ee328f0bf30766b9561db445f35cd4e73 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/bundles/figure/zh-cn_image_0000001141641532.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/bundles/figure/zh-cn_image_0000001188040429.png b/website/docs/.vuepress/public/images/device-dev/bundles/figure/zh-cn_image_0000001188040429.png new file mode 100644 index 0000000000000000000000000000000000000000..bc682a3dbd7e3de6a83a7292d9c6942c43909c98 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/bundles/figure/zh-cn_image_0000001188040429.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/bundles/figure/zh-cn_image_0000001188041297.png b/website/docs/.vuepress/public/images/device-dev/bundles/figure/zh-cn_image_0000001188041297.png new file mode 100644 index 0000000000000000000000000000000000000000..03aced616817cc2a54c7959b4cd3fd61bb720dfe Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/bundles/figure/zh-cn_image_0000001188041297.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/bundles/figure/\347\273\204\344\273\266\345\222\214\345\217\221\350\241\214\347\211\210\347\232\204\346\236\204\346\210\220-\350\213\261\346\226\207.png" "b/website/docs/.vuepress/public/images/device-dev/bundles/figure/\347\273\204\344\273\266\345\222\214\345\217\221\350\241\214\347\211\210\347\232\204\346\236\204\346\210\220-\350\213\261\346\226\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..08d9dccdd2371b02f2732d0e4eb4ad9871dccdbe Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/bundles/figure/\347\273\204\344\273\266\345\222\214\345\217\221\350\241\214\347\211\210\347\232\204\346\236\204\346\210\220-\350\213\261\346\226\207.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/2\347\272\277UART\350\256\276\345\244\207\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/2\347\272\277UART\350\256\276\345\244\207\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..6ac63e41108abd4776621356c3034fc52b6f436f Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/2\347\272\277UART\350\256\276\345\244\207\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/4\347\272\277UART\350\256\276\345\244\207\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/4\347\272\277UART\350\256\276\345\244\207\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..b5e82f09cd764b0cd9dc835e55f8f878b77eb91e Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/4\347\272\277UART\350\256\276\345\244\207\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/ADC\347\273\237\344\270\200\346\234\215\345\212\241.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/ADC\347\273\237\344\270\200\346\234\215\345\212\241.png" new file mode 100755 index 0000000000000000000000000000000000000000..838f9a4416d901eb29b5d203b559b3dcfe29fed9 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/ADC\347\273\237\344\270\200\346\234\215\345\212\241.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/DSI\345\217\221\351\200\201-\346\216\245\346\224\266\346\216\245\345\217\243.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/DSI\345\217\221\351\200\201-\346\216\245\346\224\266\346\216\245\345\217\243.png" new file mode 100755 index 0000000000000000000000000000000000000000..40a2c93c66002b00db0014471b46743a5d4620e8 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/DSI\345\217\221\351\200\201-\346\216\245\346\224\266\346\216\245\345\217\243.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/DSI\346\227\240\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/DSI\346\227\240\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..833ff6cc89e49ed4210dd68a502e4b304ac1c273 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/DSI\346\227\240\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/GPIO\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/GPIO\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..8c246a7f6a67005d30808fac11172b2108bc4e2d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/GPIO\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/GPIO\346\227\240\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/GPIO\346\227\240\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..833ff6cc89e49ed4210dd68a502e4b304ac1c273 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/GPIO\346\227\240\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/HDF\351\251\261\345\212\250\346\250\241\345\236\213.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/HDF\351\251\261\345\212\250\346\250\241\345\236\213.png" new file mode 100755 index 0000000000000000000000000000000000000000..f2a5855dfeea0eaa8e4db38323b25858ef6a1e09 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/HDF\351\251\261\345\212\250\346\250\241\345\236\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/I2C\347\211\251\347\220\206\350\277\236\347\272\277\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/I2C\347\211\251\347\220\206\350\277\236\347\272\277\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..e3ee2f81110f790d38a7dcb32730d6d989384848 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/I2C\347\211\251\347\220\206\350\277\236\347\272\277\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/I2C\347\273\237\344\270\200\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/I2C\347\273\237\344\270\200\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..838f9a4416d901eb29b5d203b559b3dcfe29fed9 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/I2C\347\273\237\344\270\200\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/I2C\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/I2C\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..beda2c0154e82a787616fdfb5643fade470da175 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/I2C\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/MIPI-DSI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/MIPI-DSI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..0d946444c5b2014ca21110e4b73dcb6a6d4b0f18 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/MIPI-DSI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/MIPI-DSI\346\216\245\345\217\243.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/MIPI-DSI\346\216\245\345\217\243.png" new file mode 100755 index 0000000000000000000000000000000000000000..6e39de8017f25a7e4cc6f51fa77ffcc9243ad818 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/MIPI-DSI\346\216\245\345\217\243.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/MMC\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/MMC\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..23324872566e5affac8baa186a30b64b3257f673 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/MMC\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/PWM\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/PWM\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..23324872566e5affac8baa186a30b64b3257f673 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/PWM\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/PWM\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/PWM\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..339d44368a15f4e58d7711c69f136bccdbc9d6db Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/PWM\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/RTC\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/RTC\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..23324872566e5affac8baa186a30b64b3257f673 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/RTC\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/RTC\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/RTC\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..808e3b3197e19ec7b1183fdd974bff7090c0b362 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/RTC\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/SDIO\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SDIO\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..09085c82c461015a312650c0a9aad57116771e0a Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SDIO\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/SDIO\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SDIO\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..23324872566e5affac8baa186a30b64b3257f673 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SDIO\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/SDIO\347\232\204HOST-DEVICE\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SDIO\347\232\204HOST-DEVICE\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..5e94b319b49153385f2cf1372a3c43aef6b834e9 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SDIO\347\232\204HOST-DEVICE\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/SPI\344\270\273\344\273\216\350\256\276\345\244\207\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SPI\344\270\273\344\273\216\350\256\276\345\244\207\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..96f68d24918dacf9244e0ad020f2e99d77f589c4 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SPI\344\270\273\344\273\216\350\256\276\345\244\207\350\277\236\346\216\245\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/SPI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SPI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..b876193bfd1d4dee4fd13d943593fea050cc8e39 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SPI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/SPI\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SPI\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..23324872566e5affac8baa186a30b64b3257f673 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/SPI\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/Sensor\351\251\261\345\212\250\346\250\241\345\236\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/Sensor\351\251\261\345\212\250\346\250\241\345\236\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..c9661fda039f1cdf88b5df2ad9d78d8ad0d08050 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/Sensor\351\251\261\345\212\250\346\250\241\345\236\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/TTL\346\216\245\345\217\243.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/TTL\346\216\245\345\217\243.png" new file mode 100755 index 0000000000000000000000000000000000000000..7209d111f142c3da063e0f761387c69b48725a98 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/TTL\346\216\245\345\217\243.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/Touchscreen\345\231\250\344\273\266\345\270\270\347\224\250\347\256\241\350\204\232.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/Touchscreen\345\231\250\344\273\266\345\270\270\347\224\250\347\256\241\350\204\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..6d33da5cc9efaa7d7d880623735e32a37f171dd8 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/Touchscreen\345\231\250\344\273\266\345\270\270\347\224\250\347\256\241\350\204\232.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/UART\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/UART\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..33ca15524892ebbad53859fab710a5309e326127 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/UART\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/UART\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/UART\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..23324872566e5affac8baa186a30b64b3257f673 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/UART\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/USB-Device\351\251\261\345\212\250\346\250\241\345\236\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/USB-Device\351\251\261\345\212\250\346\250\241\345\236\213\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..3766cf8117505a0d47720dcbccc1030536921bdb Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/USB-Device\351\251\261\345\212\250\346\250\241\345\236\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/USB-Host\351\251\261\345\212\250\346\250\241\345\236\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/USB-Host\351\251\261\345\212\250\346\250\241\345\236\213\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..6bea2992afd00b031176998278c0bcfce0f8e843 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/USB-Host\351\251\261\345\212\250\346\250\241\345\236\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/WLAN\346\241\206\346\236\266.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/WLAN\346\241\206\346\236\266.png" new file mode 100755 index 0000000000000000000000000000000000000000..87b45b288d127e85f836d8673fda820f1069186b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/WLAN\346\241\206\346\236\266.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/WLAN\346\250\241\345\235\227\345\274\200\346\224\276\350\203\275\345\212\233\345\210\206\345\270\203\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/WLAN\346\250\241\345\235\227\345\274\200\346\224\276\350\203\275\345\212\233\345\210\206\345\270\203\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..92b531d067c78063fb785c9ea802f90db1ac2e44 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/WLAN\346\250\241\345\235\227\345\274\200\346\224\276\350\203\275\345\212\233\345\210\206\345\270\203\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/Watchdog\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/Watchdog\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..23324872566e5affac8baa186a30b64b3257f673 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/Watchdog\347\213\254\347\253\213\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/\345\237\272\344\272\216HDF\351\251\261\345\212\250\346\241\206\346\236\266\347\232\204Display\351\251\261\345\212\250\346\250\241\345\236\213.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/\345\237\272\344\272\216HDF\351\251\261\345\212\250\346\241\206\346\236\266\347\232\204Display\351\251\261\345\212\250\346\250\241\345\236\213.png" new file mode 100755 index 0000000000000000000000000000000000000000..1fa1231040f82789982f8a9b930304022bc9b2b5 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/\345\237\272\344\272\216HDF\351\251\261\345\212\250\346\241\206\346\236\266\347\232\204Display\351\251\261\345\212\250\346\250\241\345\236\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/\345\237\272\344\272\216HDF\351\251\261\345\212\250\346\241\206\346\236\266\347\232\204input\351\251\261\345\212\250\346\250\241\345\236\213.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/\345\237\272\344\272\216HDF\351\251\261\345\212\250\346\241\206\346\236\266\347\232\204input\351\251\261\345\212\250\346\250\241\345\236\213.png" new file mode 100755 index 0000000000000000000000000000000000000000..db8069cb7a0bc1dcd7906131ce87ad54cc8ea340 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/\345\237\272\344\272\216HDF\351\251\261\345\212\250\346\241\206\346\236\266\347\232\204input\351\251\261\345\212\250\346\250\241\345\236\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/\347\234\213\351\227\250\347\213\227\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/\347\234\213\351\227\250\347\213\227\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..1b5ffbcd060a3315eb9ac48a5f7b1a95c801c24b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/\347\234\213\351\227\250\347\213\227\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/driver/figures/\351\205\215\347\275\256\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/driver/figures/\351\205\215\347\275\256\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..3803784ebc2200f61b79420e52b010cad1a55eab Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/driver/figures/\351\205\215\347\275\256\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/11.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/11.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9105c313d5755f140920bbfc2399e3ccb5e2f5 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/11.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/Failed-to-open-the-serial-port.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/Failed-to-open-the-serial-port.png new file mode 100644 index 0000000000000000000000000000000000000000..0eee1bbff2e54816d6be05f7f3972a83f615884d Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/Failed-to-open-the-serial-port.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/faqs/figures/U-boot\347\203\247\345\206\231\345\256\214\346\210\220\344\270\262\345\217\243\346\230\276\347\244\272\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/faqs/figures/U-boot\347\203\247\345\206\231\345\256\214\346\210\220\344\270\262\345\217\243\346\230\276\347\244\272\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..ad4fd618860ca9f79e9bdc39436c3b2f9cdb72de Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/faqs/figures/U-boot\347\203\247\345\206\231\345\256\214\346\210\220\344\270\262\345\217\243\346\230\276\347\244\272\345\233\276.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/download-six.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/download-six.png new file mode 100644 index 0000000000000000000000000000000000000000..39ae26ac8f3254d023d6b90a9f9bb8a8ff0c940b Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/download-six.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/download-zlib.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/download-zlib.png new file mode 100755 index 0000000000000000000000000000000000000000..3b7f6f4766c54f6ca1e0057fc8f869785cc63e56 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/download-zlib.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png new file mode 100644 index 0000000000000000000000000000000000000000..afc9028fbb61db82e6f1384032bb32f56ed2ec35 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-firewall-and-network-protection.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-firewall-and-network-protection.png new file mode 100644 index 0000000000000000000000000000000000000000..775ce6fe99d4894b39f2bdd613097dcaf11a37b2 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-firewall-and-network-protection.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-network-and-firewall-setting.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-network-and-firewall-setting.png new file mode 100644 index 0000000000000000000000000000000000000000..88cba0537b5431aa266364abbe19162130f4e3ca Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-network-and-firewall-setting.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-selecting-the-visual-studio-code-application.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-selecting-the-visual-studio-code-application.png new file mode 100644 index 0000000000000000000000000000000000000000..c735ae362e184083329cdf710289a169ad5625d4 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/hi3516-selecting-the-visual-studio-code-application.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/reason-no-python-soft-link.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/reason-no-python-soft-link.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bc36af5339ea5a4f67640e69836965b3776e17 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/reason-no-python-soft-link.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/solution-add-soft-link.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/solution-add-soft-link.png new file mode 100644 index 0000000000000000000000000000000000000000..9284df45bb1415d84f0325df85b4eb5c223281e8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/solution-add-soft-link.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/faqs/figures/terminal-list.png b/website/docs/.vuepress/public/images/device-dev/faqs/figures/terminal-list.png new file mode 100644 index 0000000000000000000000000000000000000000..a680547b305cccb4d8ea6cae3cbf2d046b841ff8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/faqs/figures/terminal-list.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/faqs/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3516\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" "b/website/docs/.vuepress/public/images/device-dev/faqs/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3516\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..548e03da4b76123cb67d41cbd1de4a0f33f5ef4b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/faqs/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3516\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/faqs/figures/\350\277\220\350\241\214\346\212\245\351\224\231\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/faqs/figures/\350\277\220\350\241\214\346\212\245\351\224\231\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..015c38ba5516395527bcf6715535238f02b2bad9 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/faqs/figures/\350\277\220\350\241\214\346\212\245\351\224\231\345\233\276.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/get-code/figure/evolution-roadmap.png b/website/docs/.vuepress/public/images/device-dev/get-code/figure/evolution-roadmap.png new file mode 100644 index 0000000000000000000000000000000000000000..cc507c1d7d05f67d0ea07c5c1e9a76e776f1e1f8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/get-code/figure/evolution-roadmap.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/get-code/figure/\345\214\205\347\256\241\347\220\206.png" "b/website/docs/.vuepress/public/images/device-dev/get-code/figure/\345\214\205\347\256\241\347\220\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..d98c83b3ead8e863b4db1da755b4e743afd62f46 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/get-code/figure/\345\214\205\347\256\241\347\220\206.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/get-code/figure/\345\217\221\350\241\214\347\211\210\347\244\272\344\276\213.png" "b/website/docs/.vuepress/public/images/device-dev/get-code/figure/\345\217\221\350\241\214\347\211\210\347\244\272\344\276\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..a4fa09ee58922bc9b182ac688ed4553b211c452c Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/get-code/figure/\345\217\221\350\241\214\347\211\210\347\244\272\344\276\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/get-code/figure/\347\273\204\344\273\266\345\256\232\345\210\266.png" "b/website/docs/.vuepress/public/images/device-dev/get-code/figure/\347\273\204\344\273\266\345\256\232\345\210\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..889adfe235359b5ab438ff87afb37ef4d1cf2ad9 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/get-code/figure/\347\273\204\344\273\266\345\256\232\345\210\266.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/get-code/figure/\350\256\276\347\275\256\347\274\226\350\257\221\347\225\214\351\235\242.png" "b/website/docs/.vuepress/public/images/device-dev/get-code/figure/\350\256\276\347\275\256\347\274\226\350\257\221\347\225\214\351\235\242.png" new file mode 100644 index 0000000000000000000000000000000000000000..bd2829efdc6d710559efe4650ddcba6b954b525e Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/get-code/figure/\350\256\276\347\275\256\347\274\226\350\257\221\347\225\214\351\235\242.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/guide/figures/6-pin-distribution-and-physical-connection.png b/website/docs/.vuepress/public/images/device-dev/guide/figures/6-pin-distribution-and-physical-connection.png new file mode 100644 index 0000000000000000000000000000000000000000..4b3f60fdd3b8770f9bcd847f58ecf9acf434f4f6 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/guide/figures/6-pin-distribution-and-physical-connection.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/I2C\346\227\266\345\272\217\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/I2C\346\227\266\345\272\217\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..d633538c38e6e0c34ce21f704a023cf1bd7080e2 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/I2C\346\227\266\345\272\217\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/LED\351\227\252\347\203\201\345\233\276.gif" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/LED\351\227\252\347\203\201\345\233\276.gif" new file mode 100755 index 0000000000000000000000000000000000000000..2f88e12dbefb2e2d43114a7c65823f8a7f014e28 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/LED\351\227\252\347\203\201\345\233\276.gif" differ diff --git a/website/docs/.vuepress/public/images/device-dev/guide/figures/device-wlan-sdk-files.png b/website/docs/.vuepress/public/images/device-dev/guide/figures/device-wlan-sdk-files.png new file mode 100755 index 0000000000000000000000000000000000000000..02075cda950596315c8c79ac3ab96587edf29394 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/guide/figures/device-wlan-sdk-files.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/guide/figures/empty-feature-ability.png b/website/docs/.vuepress/public/images/device-dev/guide/figures/empty-feature-ability.png new file mode 100755 index 0000000000000000000000000000000000000000..86ddcfe8b78da2a68e70ac16f12e153a1277bcf3 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/guide/figures/empty-feature-ability.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\345\220\257\345\212\250\347\244\272\344\276\213.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\345\220\257\345\212\250\347\244\272\344\276\213.png" new file mode 100755 index 0000000000000000000000000000000000000000..881c86b3f1862cd09f013a154d3882060ba8bcba Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\345\220\257\345\212\250\347\244\272\344\276\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\345\256\214\346\225\264\345\267\245\347\250\213\347\233\256\345\275\225.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\345\256\214\346\225\264\345\267\245\347\250\213\347\233\256\345\275\225.png" new file mode 100755 index 0000000000000000000000000000000000000000..8e351841abe47da44b1b0b66eccc7e496141a90a Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\345\256\214\346\225\264\345\267\245\347\250\213\347\233\256\345\275\225.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\345\267\245\347\250\213\347\233\256\345\275\225.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\345\267\245\347\250\213\347\233\256\345\275\225.png" new file mode 100755 index 0000000000000000000000000000000000000000..31fc4ae71504eab0a405ac39041db41feabcf95f Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\345\267\245\347\250\213\347\233\256\345\275\225.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\227\266\351\222\237\345\272\224\347\224\250\346\230\276\347\244\272\346\225\210\346\236\234\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\227\266\351\222\237\345\272\224\347\224\250\346\230\276\347\244\272\346\225\210\346\236\234\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..7ea61df009fbe2521c5e50317c34966908fd92fe Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\227\266\351\222\237\345\272\224\347\224\250\346\230\276\347\244\272\346\225\210\346\236\234\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\237\245\347\234\213\346\226\207\344\273\266\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\237\245\347\234\213\346\226\207\344\273\266\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..9d0d42f82c0e2a877c01397f038561bea07430e7 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\237\245\347\234\213\346\226\207\344\273\266\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\240\207\351\242\230\346\240\217\345\222\214\344\277\241\346\201\257\346\240\217\346\225\210\346\236\234.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\240\207\351\242\230\346\240\217\345\222\214\344\277\241\346\201\257\346\240\217\346\225\210\346\236\234.png" new file mode 100755 index 0000000000000000000000000000000000000000..a99a58a61e740148f182fb530c20227410314383 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\240\207\351\242\230\346\240\217\345\222\214\344\277\241\346\201\257\346\240\217\346\225\210\346\236\234.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\240\207\351\242\230\346\240\217\346\225\210\346\236\234.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\240\207\351\242\230\346\240\217\346\225\210\346\236\234.png" new file mode 100755 index 0000000000000000000000000000000000000000..5dc92bd57ba2e04bac5e9e23073e861295a64e89 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\240\207\351\242\230\346\240\217\346\225\210\346\236\234.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\241\214\351\235\242.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\241\214\351\235\242.png" new file mode 100755 index 0000000000000000000000000000000000000000..3bb036b573a5360657a2c5aa1882b497af2d9a39 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\241\214\351\235\242.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\267\273\345\212\240\351\241\265\351\235\242.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\267\273\345\212\240\351\241\265\351\235\242.png" new file mode 100755 index 0000000000000000000000000000000000000000..95c6d05e755bd9b2801b1c50c7582f947ecd2e4d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\346\267\273\345\212\240\351\241\265\351\235\242.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\347\251\272\346\260\224\350\264\250\351\207\217\347\233\221\346\265\213-App\346\230\276\347\244\272\346\225\210\346\236\234\345\233\276.gif" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\347\251\272\346\260\224\350\264\250\351\207\217\347\233\221\346\265\213-App\346\230\276\347\244\272\346\225\210\346\236\234\345\233\276.gif" new file mode 100755 index 0000000000000000000000000000000000000000..8a82c5820ab70ec7b46e79fa4c537c78ca831e81 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\347\251\272\346\260\224\350\264\250\351\207\217\347\233\221\346\265\213-App\346\230\276\347\244\272\346\225\210\346\236\234\345\233\276.gif" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\345\275\225\345\203\217\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\345\275\225\345\203\217\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" new file mode 100755 index 0000000000000000000000000000000000000000..5d9aea614e521f2a2c5e634917f16cebf24ae80d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\345\275\225\345\203\217\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\346\213\215\347\205\247\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\346\213\215\347\205\247\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" new file mode 100755 index 0000000000000000000000000000000000000000..1dd037de6e414565b5c1707fd0aa8bf8ff611f38 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\346\213\215\347\205\247\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\351\241\265\351\235\242\345\220\215\347\247\260.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\351\241\265\351\235\242\345\220\215\347\247\260.png" new file mode 100755 index 0000000000000000000000000000000000000000..026f0c61d55680baf7873b421ef9c76685f2f222 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\351\241\265\351\235\242\345\220\215\347\247\260.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\351\242\204\350\247\210\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\351\242\204\350\247\210\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" new file mode 100755 index 0000000000000000000000000000000000000000..c4ec2b5dfbeb02b3d6c5469dbe848debfe30d188 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\205\245\351\242\204\350\247\210\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\207\272\351\200\200\345\207\272\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\207\272\351\200\200\345\207\272\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" new file mode 100755 index 0000000000000000000000000000000000000000..8a4415351ff8f04e33bcd2d5dbb2b78a213bcbf2 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\350\276\223\345\207\272\351\200\200\345\207\272\346\214\207\344\273\244\345\220\216\344\270\262\345\217\243\346\211\223\345\215\260\346\227\245\345\277\227.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\351\241\265\351\235\242\344\275\215\347\275\256\346\214\207\347\244\272\345\231\250\346\225\210\346\236\234\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\351\241\265\351\235\242\344\275\215\347\275\256\346\214\207\347\244\272\345\231\250\346\225\210\346\236\234\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..e987d37213d56b4badf2cb8043d9ca976044c887 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\351\241\265\351\235\242\344\275\215\347\275\256\346\214\207\347\244\272\345\231\250\346\225\210\346\236\234\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/guide/figures/\351\242\204\350\247\210\346\225\210\346\236\234.jpg" "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\351\242\204\350\247\210\346\225\210\346\236\234.jpg" new file mode 100755 index 0000000000000000000000000000000000000000..cce3217d3793a18521540e1a8e6ba349949ad765 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/guide/figures/\351\242\204\350\247\210\346\225\210\346\236\234.jpg" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\346\210\226\345\244\226\350\256\276\347\232\204\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\346\210\226\345\244\226\350\256\276\347\232\204\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..14764140174d4aed373e155871e4ee5a4c9d869d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\346\210\226\345\244\226\350\256\276\347\232\204\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..0469f0ca66c61ef1423de3b9dfe6bc8210f51c8d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/Futex\350\256\276\350\256\241\345\233\276.jpg" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/Futex\350\256\276\350\256\241\345\233\276.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..b720a53cda289dfea91a4baba36645640bf0aea0 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/Futex\350\256\276\350\256\241\345\233\276.jpg" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/POSIX\346\216\245\345\217\243\346\241\206\346\236\266.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/POSIX\346\216\245\345\217\243\346\241\206\346\236\266.png" new file mode 100755 index 0000000000000000000000000000000000000000..d624728a9d235dfcfc597014012f8e226bfcd4f5 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/POSIX\346\216\245\345\217\243\346\241\206\346\236\266.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/VDSO\347\263\273\347\273\237\350\256\276\350\256\241.jpg" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/VDSO\347\263\273\347\273\237\350\256\276\350\256\241.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..633798d5a587904f92bd28f4fe8a98b08c19162d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/VDSO\347\263\273\347\273\237\350\256\276\350\256\241.jpg" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/Vnode\345\210\233\345\273\272\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/Vnode\345\210\233\345\273\272\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..8d6b584acacbce69f2dab55a49e22598c22fd368 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/Vnode\345\210\233\345\273\272\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/free\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/free\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..a8e6e991fc5a81574ad92c44d45bff71c450bbc3 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/free\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/malloc\351\200\232\350\277\207mmap\346\234\272\345\210\266\347\224\263\350\257\267\345\206\205\345\255\230\347\232\204\345\206\205\345\255\230\345\270\203\345\261\200.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/malloc\351\200\232\350\277\207mmap\346\234\272\345\210\266\347\224\263\350\257\267\345\206\205\345\255\230\347\232\204\345\206\205\345\255\230\345\270\203\345\261\200.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff50b0e8ef50063df83834091a8d0c0992372599 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/malloc\351\200\232\350\277\207mmap\346\234\272\345\210\266\347\224\263\350\257\267\345\206\205\345\255\230\347\232\204\345\206\205\345\255\230\345\270\203\345\261\200.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/node\350\212\202\347\202\271\345\244\264\344\277\241\346\201\257\346\267\273\345\212\240\346\240\241\351\252\214\345\200\274.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/node\350\212\202\347\202\271\345\244\264\344\277\241\346\201\257\346\267\273\345\212\240\346\240\241\351\252\214\345\200\274.png" new file mode 100644 index 0000000000000000000000000000000000000000..9a49391cd3d662305134251f4ee4261c10852106 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/node\350\212\202\347\202\271\345\244\264\344\277\241\346\201\257\346\267\273\345\212\240\346\240\241\351\252\214\345\200\274.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001127390512.png b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001127390512.png new file mode 100644 index 0000000000000000000000000000000000000000..c2d38a9a5f1789f6ce5d2ad32eb19f2b1c847872 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001127390512.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001127519136.png b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001127519136.png new file mode 100644 index 0000000000000000000000000000000000000000..ad13c7729857efdad9d53e20a07a1f28e85c2361 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001127519136.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001127520662.png b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001127520662.png new file mode 100644 index 0000000000000000000000000000000000000000..94ca9a41688c06a31b44edca5d9d3add3bfdba6f Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001127520662.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001132778524.png b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001132778524.png new file mode 100644 index 0000000000000000000000000000000000000000..7836a009e5e3cb6351c807daf9b927c7d3b71a86 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001132778524.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001132935054.png b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001132935054.png new file mode 100644 index 0000000000000000000000000000000000000000..238a15fa82b6095a13ee54bd3014ed3c08c21b4e Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001132935054.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001173429547.png b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001173429547.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8df5ef5d0f321e976008cbf382e228d12677d6 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001173429547.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001173449871.png b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001173449871.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5c5f4193cb03892f45906263f600478b65136c Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001173449871.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001176974089.png b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001176974089.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9a02ed3386934d341befcfbeb1a561a67955ba Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001176974089.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001178856385.png b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001178856385.png new file mode 100644 index 0000000000000000000000000000000000000000..25da22c730220aec03a08ca5ca5cfda5993b4a7e Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001178856385.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001191018697.png b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001191018697.png new file mode 100644 index 0000000000000000000000000000000000000000..d5693bd916ea4f009687af8233054baedf06ddf3 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/kernel/figure/zh-cn_image_0000001191018697.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276-21.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276-21.png" new file mode 100644 index 0000000000000000000000000000000000000000..3da92ebe0448375d76e32950f301f72bc7282547 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276-21.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..3da92ebe0448375d76e32950f301f72bc7282547 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\222\346\226\245\351\224\201\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-23.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\222\346\226\245\351\224\201\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-23.png" new file mode 100644 index 0000000000000000000000000000000000000000..b04bf9db5baa85756ba1a12039a160301a4ec1fd Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\222\346\226\245\351\224\201\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-23.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\222\346\226\245\351\224\201\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\222\346\226\245\351\224\201\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..37559a2a230b4d0a17fa07aaac2ea5ed3923b4df Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\272\222\346\226\245\351\224\201\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\273\273\345\212\241\347\212\266\346\200\201\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\273\273\345\212\241\347\212\266\346\200\201\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..75c79e501c27a2c41ff011133197eb646981b0f3 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\273\273\345\212\241\347\212\266\346\200\201\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\277\241\345\217\267\351\207\217\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-22.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\277\241\345\217\267\351\207\217\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-22.png" new file mode 100644 index 0000000000000000000000000000000000000000..265c77529e451d8d0c75ef5c653f318687c588cb Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\277\241\345\217\267\351\207\217\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-22.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\277\241\345\217\267\351\207\217\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\277\241\345\217\267\351\207\217\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..02437a72c3de38cbddf5233282ef9354220002bf Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\344\277\241\345\217\267\351\207\217\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\345\255\230\346\230\240\345\260\204\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\345\255\230\346\230\240\345\260\204\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..cbd0d5b871519d388a07f2d20b655c2f42e2e384 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\345\255\230\346\230\240\345\260\204\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\345\255\230\347\224\263\350\257\267\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\345\255\230\347\224\263\350\257\267\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..9d502df58aeb0e4f01c83628c82a6a9d974765ab Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\345\255\230\347\224\263\350\257\267\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\345\255\230\351\207\212\346\224\276\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\345\255\230\351\207\212\346\224\276\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..c4f9ba8dba9112333f43dfe8db6d3f046bb29631 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\345\255\230\351\207\212\346\224\276\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\346\240\270\345\220\257\345\212\250\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\346\240\270\345\220\257\345\212\250\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..ab769d0228a005f3332d86e1443712e157c7f32d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\346\240\270\345\220\257\345\212\250\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\346\240\270\346\236\266\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\346\240\270\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..aab178cde608403d259af3cd10c11188e213de08 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\206\205\346\240\270\346\236\266\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225-19.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225-19.png" new file mode 100644 index 0000000000000000000000000000000000000000..8fa49b71f46505f335a5e782cbef362f7336fdaa Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225-19.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\347\256\241\347\220\206\347\273\223\346\236\204\345\233\276-20.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\347\256\241\347\220\206\347\273\223\346\236\204\345\233\276-20.png" new file mode 100644 index 0000000000000000000000000000000000000000..9d98f09b73bd77ef25c732a750611bb3fb3c6b65 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\347\256\241\347\220\206\347\273\223\346\236\204\345\233\276-20.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\347\256\241\347\220\206\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\347\256\241\347\220\206\347\273\223\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..e67cd13c295d19b6ce45c4749644eea42ada7f05 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\347\256\241\347\220\206\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\212\240\350\275\275\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\212\240\350\275\275\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..66f78d73d491b36b8ca9333919adefa4252b4983 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\212\250\346\200\201\345\212\240\350\275\275\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\240\206\345\206\205\345\255\230\350\212\202\347\202\271\344\277\241\346\201\257.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\240\206\345\206\205\345\255\230\350\212\202\347\202\271\344\277\241\346\201\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..131519e92cadb00d4ae33f180fba7e410120f98f Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\240\206\345\206\205\345\255\230\350\212\202\347\202\271\344\277\241\346\201\257.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\240\206\345\206\205\345\255\230\350\212\202\347\202\271\344\277\241\346\201\257\351\223\276\350\241\250.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\240\206\345\206\205\345\255\230\350\212\202\347\202\271\344\277\241\346\201\257\351\223\276\350\241\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..17c3d03c4b35ad7b8d31e9ec091d683d498a0d90 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\240\206\345\206\205\345\255\230\350\212\202\347\202\271\344\277\241\346\201\257\351\223\276\350\241\250.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\240\206\346\240\210\345\210\206\346\236\220\345\216\237\347\220\206\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\240\206\346\240\210\345\210\206\346\236\220\345\216\237\347\220\206\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..6ac9200e867f2c87d14ef89ca8c15102e83d4c10 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\345\240\206\346\240\210\345\210\206\346\236\220\345\216\237\347\220\206\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\346\226\207\344\273\266\346\237\245\346\211\276\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\346\226\207\344\273\266\346\237\245\346\211\276\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..b06ce7a382707361fadf8f6864e02b973e3af39e Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\346\226\207\344\273\266\346\237\245\346\211\276\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\346\263\204\346\274\217\347\202\271\344\273\243\347\240\201\350\241\214\345\256\232\344\275\215\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\346\263\204\346\274\217\347\202\271\344\273\243\347\240\201\350\241\214\345\256\232\344\275\215\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..0b882d1347c0aa55aa855808847bfb2fad8d8693 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\346\263\204\346\274\217\347\202\271\344\273\243\347\240\201\350\241\214\345\256\232\344\275\215\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\347\211\251\347\220\206\345\206\205\345\255\230\344\275\277\347\224\250\345\210\206\345\270\203\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\347\211\251\347\220\206\345\206\205\345\255\230\344\275\277\347\224\250\345\210\206\345\270\203\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..317de70b8fc9a0186e0e1db74baa22b637281e47 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\347\211\251\347\220\206\345\206\205\345\255\230\344\275\277\347\224\250\345\210\206\345\270\203\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\347\250\213\345\272\217\346\211\247\350\241\214\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\347\250\213\345\272\217\346\211\247\350\241\214\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..ef0759cead5eb6fcd30cefcd6a7145d43578eb1a Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\347\250\213\345\272\217\346\211\247\350\241\214\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\347\263\273\347\273\237\350\260\203\347\224\250\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\347\263\273\347\273\237\350\260\203\347\224\250\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..3e992223c5cfac9e45331a898cf2e86b755e5bd6 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\347\263\273\347\273\237\350\260\203\347\224\250\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\350\275\273\351\207\217\347\263\273\347\273\237\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\350\275\273\351\207\217\347\263\273\347\273\237\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225.png" new file mode 100644 index 0000000000000000000000000000000000000000..bd73700c41d62b47005ad0612c74f2823a1921a9 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\350\275\273\351\207\217\347\263\273\347\273\237\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\350\277\233\347\250\213\346\240\221\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\350\277\233\347\250\213\346\240\221\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..6888a98f6d3acb00451b16de55c9ce95170948e6 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\350\277\233\347\250\213\346\240\221\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\350\277\233\347\250\213\347\212\266\346\200\201\350\277\201\347\247\273\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\350\277\233\347\250\213\347\212\266\346\200\201\350\277\201\347\247\273\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..d08425a0267084587dba656c01e9d529be6782b1 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\350\277\233\347\250\213\347\212\266\346\200\201\350\277\201\347\247\273\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\351\230\237\345\210\227\350\257\273\345\206\231\346\225\260\346\215\256\346\223\215\344\275\234\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\351\230\237\345\210\227\350\257\273\345\206\231\346\225\260\346\215\256\346\223\215\344\275\234\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..c1107463e058df1402f1b19d02b58f0ccb0898e2 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\351\230\237\345\210\227\350\257\273\345\206\231\346\225\260\346\215\256\346\223\215\344\275\234\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\351\235\231\346\200\201\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\351\235\231\346\200\201\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..d3bf07dcb1c4e0e9207eb1cf083cb9aeae945394 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\351\235\231\346\200\201\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/kernel/figure/\351\235\236\350\277\236\347\273\255\346\200\247\345\206\205\345\255\230\345\220\210\344\270\200\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\351\235\236\350\277\236\347\273\255\346\200\247\345\206\205\345\255\230\345\220\210\344\270\200\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..43e98c03680a9d9d8c720818b2094905da49ec85 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/kernel/figure/\351\235\236\350\277\236\347\273\255\346\200\247\345\206\205\345\255\230\345\220\210\344\270\200\347\244\272\346\204\217\345\233\276.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/porting/figure/HDF_WIFI.png b/website/docs/.vuepress/public/images/device-dev/porting/figure/HDF_WIFI.png new file mode 100644 index 0000000000000000000000000000000000000000..56e6ab3aee9a539c76afd3edac98f21bff0766d5 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/porting/figure/HDF_WIFI.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/OpenHarmony-\351\251\261\345\212\250\345\210\206\347\261\273.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/OpenHarmony-\351\251\261\345\212\250\345\210\206\347\261\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..7edac54ec2fcd1fc93330d47acb2d44fceef2710 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/OpenHarmony-\351\251\261\345\212\250\345\210\206\347\261\273.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/OpenHarmony\345\220\257\345\212\250\346\210\220\345\212\237\347\225\214\351\235\242.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/OpenHarmony\345\220\257\345\212\250\346\210\220\345\212\237\347\225\214\351\235\242.png" new file mode 100755 index 0000000000000000000000000000000000000000..7d0b723345d413067e0142b2035205133c907ab0 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/OpenHarmony\345\220\257\345\212\250\346\210\220\345\212\237\347\225\214\351\235\242.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/WLAN\350\212\257\347\211\207.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/WLAN\350\212\257\347\211\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..c325922a5ee67edb81aa526de1547716fae1a04b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/WLAN\350\212\257\347\211\207.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/init\345\220\257\345\212\250\346\255\243\345\270\270\346\227\245\345\277\227.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/init\345\220\257\345\212\250\346\255\243\345\270\270\346\227\245\345\277\227.png" new file mode 100644 index 0000000000000000000000000000000000000000..a1e7f8b695bebf395ea6cfa0aed55495c4896118 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/init\345\220\257\345\212\250\346\255\243\345\270\270\346\227\245\345\277\227.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/liteos-m\345\206\205\346\240\270\346\250\241\345\235\227\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/liteos-m\345\206\205\346\240\270\346\250\241\345\235\227\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..2cd5f7a4c095429f8e447b17562b37051343c689 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/liteos-m\345\206\205\346\240\270\346\250\241\345\235\227\345\233\276.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/porting/figure/zh-cn_image_0000001162805936.png b/website/docs/.vuepress/public/images/device-dev/porting/figure/zh-cn_image_0000001162805936.png new file mode 100644 index 0000000000000000000000000000000000000000..0546e82fc91c605ba78f9bb56c4de88066c8c189 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/porting/figure/zh-cn_image_0000001162805936.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/porting/figure/zh-cn_image_0000001208365855.png b/website/docs/.vuepress/public/images/device-dev/porting/figure/zh-cn_image_0000001208365855.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb585b4f3780141a122563f9d05bb47c1e30dd7 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/porting/figure/zh-cn_image_0000001208365855.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/porting/figure/zh-cn_image_0000001208524821.png b/website/docs/.vuepress/public/images/device-dev/porting/figure/zh-cn_image_0000001208524821.png new file mode 100644 index 0000000000000000000000000000000000000000..2668799e706c34df82d75050e701f450e226a536 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/porting/figure/zh-cn_image_0000001208524821.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/\344\270\232\345\212\241\345\220\257\345\212\250\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\344\270\232\345\212\241\345\220\257\345\212\250\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..cbc70a899f77382e9e052c30f2a69b61764d2643 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\344\270\232\345\212\241\345\220\257\345\212\250\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\206\205\346\240\270\345\220\257\345\212\250\346\241\206\346\236\266.jpg" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\206\205\346\240\270\345\220\257\345\212\250\346\241\206\346\236\266.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..dd8e1c235633c3e42fcd1360b66b3ce3452db02d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\206\205\346\240\270\345\220\257\345\212\250\346\241\206\346\236\266.jpg" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\215\225\346\235\277\351\251\261\345\212\250\351\200\202\351\205\215\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\215\225\346\235\277\351\251\261\345\212\250\351\200\202\351\205\215\346\265\201\347\250\213.png" new file mode 100755 index 0000000000000000000000000000000000000000..c886985b8cb0db42b71a693df78a1aac20b88ac2 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\215\225\346\235\277\351\251\261\345\212\250\351\200\202\351\205\215\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\220\257\345\212\250\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\220\257\345\212\250\346\265\201\347\250\213.png" new file mode 100755 index 0000000000000000000000000000000000000000..93f747cae385fb714334d5145103d6f7ddfacd95 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\220\257\345\212\250\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\237\272\344\272\216linux\345\206\205\346\240\270\347\232\204OS\351\225\234\345\203\217\347\273\223\346\236\204\345\222\214\347\224\250\346\210\267\346\200\201\347\250\213\345\272\217\345\220\257\345\212\250\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\237\272\344\272\216linux\345\206\205\346\240\270\347\232\204OS\351\225\234\345\203\217\347\273\223\346\236\204\345\222\214\347\224\250\346\210\267\346\200\201\347\250\213\345\272\217\345\220\257\345\212\250\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..b241920b30fea1b2a432f6ba01045bbfbae7fb58 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\345\237\272\344\272\216linux\345\206\205\346\240\270\347\232\204OS\351\225\234\345\203\217\347\273\223\346\236\204\345\222\214\347\224\250\346\210\267\346\200\201\347\250\213\345\272\217\345\220\257\345\212\250\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/\346\225\264\344\275\223\345\220\257\345\212\250\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\346\225\264\344\275\223\345\220\257\345\212\250\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..39c6cb96611a7ced5e17bbeee96ac77ba5c1bf58 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\346\225\264\344\275\223\345\220\257\345\212\250\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/\346\255\243\345\270\270\350\277\233\345\205\245shell\345\220\216\350\276\223\345\205\245ls\345\221\275\344\273\244\344\270\262\345\217\243\346\211\223\345\215\260.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\346\255\243\345\270\270\350\277\233\345\205\245shell\345\220\216\350\276\223\345\205\245ls\345\221\275\344\273\244\344\270\262\345\217\243\346\211\223\345\215\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..efb1e17b00d37b072a3032678144984e2e13b2d6 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\346\255\243\345\270\270\350\277\233\345\205\245shell\345\220\216\350\276\223\345\205\245ls\345\221\275\344\273\244\344\270\262\345\217\243\346\211\223\345\215\260.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/porting/figure/\350\212\257\347\211\207\347\247\273\346\244\215\345\205\263\351\224\256\346\255\245\351\252\244.png" "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\350\212\257\347\211\207\347\247\273\346\244\215\345\205\263\351\224\256\346\255\245\351\252\244.png" new file mode 100755 index 0000000000000000000000000000000000000000..3cbefc997a46c6175735c6e3b8b6e29ff03b05d4 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/porting/figure/\350\212\257\347\211\207\347\247\273\346\244\215\345\205\263\351\224\256\346\255\245\351\252\244.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/public_sys-resources/icon-caution.gif b/website/docs/.vuepress/public/images/device-dev/public_sys-resources/icon-caution.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/public_sys-resources/icon-caution.gif differ diff --git a/website/docs/.vuepress/public/images/device-dev/public_sys-resources/icon-note.gif b/website/docs/.vuepress/public/images/device-dev/public_sys-resources/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/public_sys-resources/icon-note.gif differ diff --git a/website/docs/.vuepress/public/images/device-dev/public_sys-resources/icon-notice.gif b/website/docs/.vuepress/public/images/device-dev/public_sys-resources/icon-notice.gif new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/public_sys-resources/icon-notice.gif differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/11.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/11.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9105c313d5755f140920bbfc2399e3ccb5e2f5 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/11.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/2021-01-27_170334.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/2021-01-27_170334.png new file mode 100644 index 0000000000000000000000000000000000000000..5b573a4ddfe89fe25cb1b567736823244fdb9e97 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/2021-01-27_170334.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Download-the-source-code.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Download-the-source-code.png new file mode 100644 index 0000000000000000000000000000000000000000..527fe8b9836daf35c8300e0e84bdb2ca390f85a5 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Download-the-source-code.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Failed-to-open-the-serial-port.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Failed-to-open-the-serial-port.png new file mode 100755 index 0000000000000000000000000000000000000000..0eee1bbff2e54816d6be05f7f3972a83f615884d Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Failed-to-open-the-serial-port.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\345\215\225\346\235\277\346\255\243\351\235\242\345\244\226\350\247\202\345\233\276-0.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\345\215\225\346\235\277\346\255\243\351\235\242\345\244\226\350\247\202\345\233\276-0.png" new file mode 100755 index 0000000000000000000000000000000000000000..6975fb5fef92e35dec2de84b7e7035a39794bdf4 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\345\215\225\346\235\277\346\255\243\351\235\242\345\244\226\350\247\202\345\233\276-0.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\345\215\225\346\235\277\346\255\243\351\235\242\345\244\226\350\247\202\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\345\215\225\346\235\277\346\255\243\351\235\242\345\244\226\350\247\202\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..6975fb5fef92e35dec2de84b7e7035a39794bdf4 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\345\215\225\346\235\277\346\255\243\351\235\242\345\244\226\350\247\202\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\345\274\200\345\217\221\347\241\254\344\273\266\350\277\236\347\272\277\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\345\274\200\345\217\221\347\241\254\344\273\266\350\277\236\347\272\277\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..fcc5050822e05cfb73bd887aa61cd7d4a60ac5ad Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\345\274\200\345\217\221\347\241\254\344\273\266\350\277\236\347\272\277\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\347\274\226\350\257\221\350\256\276\347\275\256\345\233\276\344\276\213.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\347\274\226\350\257\221\350\256\276\347\275\256\345\233\276\344\276\213.png" new file mode 100755 index 0000000000000000000000000000000000000000..11b1a4e59f83b7ee80b38bf25b0790a830c4ab92 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3516\347\274\226\350\257\221\350\256\276\347\275\256\345\233\276\344\276\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518EV300\345\215\225\346\235\277\346\255\243\351\235\242\345\244\226\350\247\202\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518EV300\345\215\225\346\235\277\346\255\243\351\235\242\345\244\226\350\247\202\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..93cadcb6edf9d8b4d701faf7e070f74cc09ef553 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518EV300\345\215\225\346\235\277\346\255\243\351\235\242\345\244\226\350\247\202\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518EV300\345\215\225\346\235\277\350\203\214\351\235\242\345\244\226\350\247\202\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518EV300\345\215\225\346\235\277\350\203\214\351\235\242\345\244\226\350\247\202\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..3e0ff2fdbfbaca179f1320b5d53ebf755d1c84a3 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518EV300\345\215\225\346\235\277\350\203\214\351\235\242\345\244\226\350\247\202\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518\345\274\200\345\217\221\347\241\254\344\273\266\350\277\236\347\272\277\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518\345\274\200\345\217\221\347\241\254\344\273\266\350\277\236\347\272\277\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..b5dfc506b818515555959aa29a297185d816ff0b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518\345\274\200\345\217\221\347\241\254\344\273\266\350\277\236\347\272\277\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518\347\274\226\350\257\221\350\256\276\347\275\256\345\233\276\344\276\213.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518\347\274\226\350\257\221\350\256\276\347\275\256\345\233\276\344\276\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..be9e1743f8664bd064e3b0c556f31ca5cc963464 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3518\347\274\226\350\257\221\350\256\276\347\275\256\345\233\276\344\276\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861-WLAN\346\250\241\347\273\204\345\244\226\350\247\202\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861-WLAN\346\250\241\347\273\204\345\244\226\350\247\202\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..d31d10941a55cd6053d0742c39b291d33aa27c70 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861-WLAN\346\250\241\347\273\204\345\244\226\350\247\202\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861\345\212\237\350\203\275\346\241\206\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861\345\212\237\350\203\275\346\241\206\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..7de3c25e7ef2abc8d85d8bc945249f571f6bf0c3 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861\345\212\237\350\203\275\346\241\206\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861\345\272\225\346\235\277\345\244\226\350\247\202\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861\345\272\225\346\235\277\345\244\226\350\247\202\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..c846be0d2767953df4a3ac78408963f252af040d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861\345\272\225\346\235\277\345\244\226\350\247\202\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861\345\274\200\345\217\221\347\241\254\344\273\266\350\277\236\347\272\277\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861\345\274\200\345\217\221\347\241\254\344\273\266\350\277\236\347\272\277\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..22717eff5b2344229a230d2d4fb1aa7f0dd489bb Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Hi3861\345\274\200\345\217\221\347\241\254\344\273\266\350\277\236\347\272\277\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/IDE\347\273\210\347\253\257\345\267\245\345\205\267\346\211\223\345\274\200\346\226\271\346\263\225.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/IDE\347\273\210\347\253\257\345\267\245\345\205\267\346\211\223\345\274\200\346\226\271\346\263\225.png" new file mode 100755 index 0000000000000000000000000000000000000000..791dfeae272070b7e285ea3070ebd3b1e9100eb5 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/IDE\347\273\210\347\253\257\345\267\245\345\205\267\346\211\223\345\274\200\346\226\271\346\263\225.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/SCons\345\256\211\350\243\205\346\210\220\345\212\237\347\225\214\351\235\242-\347\211\210\346\234\254\350\246\201\346\261\2023-0-4\344\273\245\344\270\212.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/SCons\345\256\211\350\243\205\346\210\220\345\212\237\347\225\214\351\235\242-\347\211\210\346\234\254\350\246\201\346\261\2023-0-4\344\273\245\344\270\212.png" new file mode 100755 index 0000000000000000000000000000000000000000..e66ca6ffae9aec5f4f5b97ceccf2e37792e95f18 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/SCons\345\256\211\350\243\205\346\210\220\345\212\237\347\225\214\351\235\242-\347\211\210\346\234\254\350\246\201\346\261\2023-0-4\344\273\245\344\270\212.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Save-the-parameter-settings.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Save-the-parameter-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..47231369bbeb827e70a8720b7a3d03ac58fad0c3 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Save-the-parameter-settings.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap28.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap28.png new file mode 100644 index 0000000000000000000000000000000000000000..2dcc6878e24dc6aa415fcbea24a8c4878aad5242 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap28.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap33.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap33.png new file mode 100644 index 0000000000000000000000000000000000000000..70f46e087ef79162f9cbeeb6d524b3499a744c28 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap33.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap34.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap34.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c66f66fa6e77e545cc6ac3db2d6cf10f646387 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap34.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap8.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap8.png new file mode 100644 index 0000000000000000000000000000000000000000..157f5e2d0f5b33f998560f7e85efb49d6786786c Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/Snap8.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/U-boot\347\203\247\345\206\231\345\256\214\346\210\220\344\270\262\345\217\243\346\230\276\347\244\272\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/U-boot\347\203\247\345\206\231\345\256\214\346\210\220\344\270\262\345\217\243\346\230\276\347\244\272\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..ad4fd618860ca9f79e9bdc39436c3b2f9cdb72de Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/U-boot\347\203\247\345\206\231\345\256\214\346\210\220\344\270\262\345\217\243\346\230\276\347\244\272\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/WLAN\345\244\215\344\275\215\346\210\220\345\212\237\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/WLAN\345\244\215\344\275\215\346\210\220\345\212\237\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..9d3bdbfe1eac9dc532496a7785e8caf99c41780b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/WLAN\345\244\215\344\275\215\346\210\220\345\212\237\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/WLAN\346\250\241\347\273\204\350\201\224\347\275\221\346\210\220\345\212\237\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/WLAN\346\250\241\347\273\204\350\201\224\347\275\221\346\210\220\345\212\237\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..ebf4f8eba03720edddfb9ef8eb38bd5f71126f2a Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/WLAN\346\250\241\347\273\204\350\201\224\347\275\221\346\210\220\345\212\237\347\244\272\346\204\217\345\233\276.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/WadRecvCB-function.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/WadRecvCB-function.png new file mode 100644 index 0000000000000000000000000000000000000000..a8037d1ebc95a3c9383d87678981b3ae5ccc8144 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/WadRecvCB-function.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/bootloader.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/bootloader.png new file mode 100644 index 0000000000000000000000000000000000000000..e674bafb0adaa4c0ff8efaf297ee52bab3165212 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/bootloader.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/button.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/button.png new file mode 100755 index 0000000000000000000000000000000000000000..686385e096a24ec1906169d2b11f75030c386b9f Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/button.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/deveco-device-tool-install-sucessful.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/deveco-device-tool-install-sucessful.png new file mode 100644 index 0000000000000000000000000000000000000000..0a54838f89062fd67328ef76e4a1cf770c6aee13 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/deveco-device-tool-install-sucessful.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/download-ecdsa.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/download-ecdsa.png new file mode 100644 index 0000000000000000000000000000000000000000..24fb00fddc1213037e63e7674b4d2ce1bf6118f6 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/download-ecdsa.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/download-six.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/download-six.png new file mode 100644 index 0000000000000000000000000000000000000000..39ae26ac8f3254d023d6b90a9f9bb8a8ff0c940b Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/download-six.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/download-zlib.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/download-zlib.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7f6f4766c54f6ca1e0057fc8f869785cc63e56 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/download-zlib.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/erase-u-Boot.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/erase-u-Boot.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6dc91c5762822a67a439fe9cf26c8650c4a469 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/erase-u-Boot.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png new file mode 100755 index 0000000000000000000000000000000000000000..afc9028fbb61db82e6f1384032bb32f56ed2ec35 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-burning-succeeded-net.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-burning-succeeded-net.png new file mode 100644 index 0000000000000000000000000000000000000000..67d8044b72056d4ed6230ccc4ad99d5e954596b6 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-burning-succeeded-net.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-deveco-device-tool-logo.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-deveco-device-tool-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5b573a4ddfe89fe25cb1b567736823244fdb9e97 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-deveco-device-tool-logo.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-deveco-device-tool-setting.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-deveco-device-tool-setting.png new file mode 100644 index 0000000000000000000000000000000000000000..937a17d71744d81d509543594b094939e8a89070 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-deveco-device-tool-setting.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-firewall-and-network-protection.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-firewall-and-network-protection.png new file mode 100755 index 0000000000000000000000000000000000000000..775ce6fe99d4894b39f2bdd613097dcaf11a37b2 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-firewall-and-network-protection.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-network-and-firewall-setting.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-network-and-firewall-setting.png new file mode 100755 index 0000000000000000000000000000000000000000..88cba0537b5431aa266364abbe19162130f4e3ca Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-network-and-firewall-setting.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-record-the-serial-port-number.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-record-the-serial-port-number.png new file mode 100644 index 0000000000000000000000000000000000000000..09f33e3992c0c1d78713eea949e4b9a19f5802ec Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-record-the-serial-port-number.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-restart-the-development-board.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-restart-the-development-board.png new file mode 100644 index 0000000000000000000000000000000000000000..281958fe76a787acc5d0b98f5ea248fa5abf2405 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-restart-the-development-board.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-selecting-the-visual-studio-code-application.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-selecting-the-visual-studio-code-application.png new file mode 100755 index 0000000000000000000000000000000000000000..c735ae362e184083329cdf710289a169ad5625d4 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-selecting-the-visual-studio-code-application.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-upload-options.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-upload-options.png new file mode 100644 index 0000000000000000000000000000000000000000..7d9768119778aeee7d0b927879c0da2bcdc4821a Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-upload-options.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-upload-start-burning.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-upload-start-burning.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2db198cc61ed10136f0e3382deed352300a62b Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3516-upload-start-burning.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-allowing-the-visual-studio-code-application-to-access-the-network.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-allowing-the-visual-studio-code-application-to-access-the-network.png new file mode 100644 index 0000000000000000000000000000000000000000..afc9028fbb61db82e6f1384032bb32f56ed2ec35 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-allowing-the-visual-studio-code-application-to-access-the-network.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-bootloader.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-bootloader.png new file mode 100644 index 0000000000000000000000000000000000000000..2d67376af75fa7693ed16299de75255c08178c14 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-bootloader.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-burning-succeeded.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-burning-succeeded.png new file mode 100755 index 0000000000000000000000000000000000000000..42b7ef6678b4415c855cd93ddff6936a807b42b8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-burning-succeeded.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-deveco-device-tool-logo.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-deveco-device-tool-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5b573a4ddfe89fe25cb1b567736823244fdb9e97 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-deveco-device-tool-logo.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-deveco-device-tool-setting.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-deveco-device-tool-setting.png new file mode 100644 index 0000000000000000000000000000000000000000..a7cdfed371fa65d05faec7651d89145ad5a24a96 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-deveco-device-tool-setting.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-error-for-not-finding-python.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-error-for-not-finding-python.png new file mode 100644 index 0000000000000000000000000000000000000000..1b002b247b704150040e90ecb149d782ba8db3a8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-error-for-not-finding-python.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-firewall-and-network-protection.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-firewall-and-network-protection.png new file mode 100644 index 0000000000000000000000000000000000000000..775ce6fe99d4894b39f2bdd613097dcaf11a37b2 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-firewall-and-network-protection.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-monitor.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..d287df0c64ca5e2ffc27aa1acd820cdf0e6b40c6 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-monitor.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-network-and-firewall-setting.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-network-and-firewall-setting.png new file mode 100644 index 0000000000000000000000000000000000000000..88cba0537b5431aa266364abbe19162130f4e3ca Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-network-and-firewall-setting.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-reason-no-python-soft-link.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-reason-no-python-soft-link.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bc36af5339ea5a4f67640e69836965b3776e17 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-reason-no-python-soft-link.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-reboot-success.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-reboot-success.png new file mode 100644 index 0000000000000000000000000000000000000000..7a063003ded7d94e8b2a030a3df855f6915c933c Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-reboot-success.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-record-the-serial-port-number.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-record-the-serial-port-number.png new file mode 100755 index 0000000000000000000000000000000000000000..09f33e3992c0c1d78713eea949e4b9a19f5802ec Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-record-the-serial-port-number.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-reset-success.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-reset-success.png new file mode 100644 index 0000000000000000000000000000000000000000..8e3d4e7d2a36e2b880f592ec88b01b6c4bef07cc Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-reset-success.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-restart-the-development-board.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-restart-the-development-board.png new file mode 100755 index 0000000000000000000000000000000000000000..a277db68618d87bb7f95565eb890760405d654e2 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-restart-the-development-board.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-selecting-the-visual-studio-code-application.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-selecting-the-visual-studio-code-application.png new file mode 100644 index 0000000000000000000000000000000000000000..c735ae362e184083329cdf710289a169ad5625d4 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-selecting-the-visual-studio-code-application.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-solution-set-python-soft-link.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-solution-set-python-soft-link.png new file mode 100644 index 0000000000000000000000000000000000000000..9284df45bb1415d84f0325df85b4eb5c223281e8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-solution-set-python-soft-link.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-upload.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-upload.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd316dfd5a64c873682bf865a79ec1f2354cc40 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3518-upload.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-burning-succeeded.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-burning-succeeded.png new file mode 100755 index 0000000000000000000000000000000000000000..3628f3f4778012a577d4ee28c703669eb5533594 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-burning-succeeded.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-deveco-device-tool-setting.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-deveco-device-tool-setting.png new file mode 100644 index 0000000000000000000000000000000000000000..512ee4ff2e053da12259a2f9d3163df75cb41a52 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-deveco-device-tool-setting.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-record-the-serial-port-number.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-record-the-serial-port-number.png new file mode 100755 index 0000000000000000000000000000000000000000..43496f076a463ec6fbf320b358a32505284ff40f Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-record-the-serial-port-number.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-restart-the-development-board.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-restart-the-development-board.png new file mode 100755 index 0000000000000000000000000000000000000000..e6b632288105421a07bd4f8d542293deb0d35fd2 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-restart-the-development-board.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-upload.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-upload.png new file mode 100644 index 0000000000000000000000000000000000000000..8dde7632636856203030c2abf0867f03abaafcba Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hi3861-upload.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hisilicon-arm-linux.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hisilicon-arm-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..114a8e1c31ab1a58ece6b0d1e00d673256b42b2b Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/hisilicon-arm-linux.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/ip-address-information-2.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/ip-address-information-2.png new file mode 100644 index 0000000000000000000000000000000000000000..72dd05e3ae1eb91156df98cb1915b6264b3bbe5a Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/ip-address-information-2.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/ip-address-information.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/ip-address-information.png new file mode 100644 index 0000000000000000000000000000000000000000..72dd05e3ae1eb91156df98cb1915b6264b3bbe5a Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/ip-address-information.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/login-serial-port.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/login-serial-port.png new file mode 100644 index 0000000000000000000000000000000000000000..ad4fd618860ca9f79e9bdc39436c3b2f9cdb72de Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/login-serial-port.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/monitor.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..bc935a8970e39629d2c93f6b92f96c5fa7d1a49b Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/monitor.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/open-the-serial-port-tool.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/open-the-serial-port-tool.png new file mode 100644 index 0000000000000000000000000000000000000000..6d350e5d4db03fecc5c1b8055b01cdf73667ed36 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/open-the-serial-port-tool.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/options.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/options.png new file mode 100644 index 0000000000000000000000000000000000000000..0bf756d8a9fea4865c8b65b7dadc4463e2346ab7 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/options.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/press-any-key-to-enter-the-system.gif b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/press-any-key-to-enter-the-system.gif new file mode 100644 index 0000000000000000000000000000000000000000..5e0e2bec9e8ce82561047fe7d5f000e0d2c4f962 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/press-any-key-to-enter-the-system.gif differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reason-for-not-finding-python.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reason-for-not-finding-python.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bc36af5339ea5a4f67640e69836965b3776e17 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reason-for-not-finding-python.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reason-no-python-soft-link.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reason-no-python-soft-link.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bc36af5339ea5a4f67640e69836965b3776e17 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reason-no-python-soft-link.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reboot_success.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reboot_success.png new file mode 100644 index 0000000000000000000000000000000000000000..7a063003ded7d94e8b2a030a3df855f6915c933c Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reboot_success.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reset_success.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reset_success.png new file mode 100644 index 0000000000000000000000000000000000000000..67e50038e79cf0f7c2a6bd79b48c63b7557179a4 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/reset_success.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/serial-port-entry.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/serial-port-entry.png new file mode 100755 index 0000000000000000000000000000000000000000..43496f076a463ec6fbf320b358a32505284ff40f Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/serial-port-entry.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/solution-add-soft-link.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/solution-add-soft-link.png new file mode 100644 index 0000000000000000000000000000000000000000..9284df45bb1415d84f0325df85b4eb5c223281e8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/solution-add-soft-link.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/solution.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/solution.png new file mode 100644 index 0000000000000000000000000000000000000000..9284df45bb1415d84f0325df85b4eb5c223281e8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/solution.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/start-the-system.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/start-the-system.png new file mode 100644 index 0000000000000000000000000000000000000000..5006140f00ec1195d04297cdeb26ad935fb9f0e5 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/start-the-system.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/symptom-for-not-finding-python.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/symptom-for-not-finding-python.png new file mode 100644 index 0000000000000000000000000000000000000000..1b002b247b704150040e90ecb149d782ba8db3a8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/symptom-for-not-finding-python.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/terminal-list.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/terminal-list.png new file mode 100644 index 0000000000000000000000000000000000000000..a680547b305cccb4d8ea6cae3cbf2d046b841ff8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/terminal-list.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/u-boot-erased-successfully.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/u-boot-erased-successfully.png new file mode 100755 index 0000000000000000000000000000000000000000..7a35899cc5cebff68372d97bb76906b6e90b3ba7 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/u-boot-erased-successfully.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/upload-options-1.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/upload-options-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb378217e99536cf076deecfb0f0677cb51eef8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/upload-options-1.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/upload-options.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/upload-options.png new file mode 100644 index 0000000000000000000000000000000000000000..0b0d0cf88b9a78e6beea45e74b7633fa8c3ce523 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/upload-options.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/zh-cn_image_0000001172030062.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/zh-cn_image_0000001172030062.png new file mode 100644 index 0000000000000000000000000000000000000000..802cce4e760102043f177cb2fa71e8bd16539ba1 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/zh-cn_image_0000001172030062.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/zh-cn_image_0000001215342695.png b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/zh-cn_image_0000001215342695.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2db198cc61ed10136f0e3382deed352300a62b Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/zh-cn_image_0000001215342695.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\345\220\257\345\212\250\345\271\266\346\210\220\345\212\237\346\211\247\350\241\214\345\272\224\347\224\250\347\250\213\345\272\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\345\220\257\345\212\250\345\271\266\346\210\220\345\212\237\346\211\247\350\241\214\345\272\224\347\224\250\347\250\213\345\272\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..6a85551cd30c8c0576c138d86dc66ddf73dccb44 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\345\220\257\345\212\250\345\271\266\346\210\220\345\212\237\346\211\247\350\241\214\345\272\224\347\224\250\347\250\213\345\272\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\345\234\250\347\273\210\347\253\257\347\225\214\351\235\242\346\211\247\350\241\214\347\274\226\350\257\221\345\221\275\344\273\244\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\345\234\250\347\273\210\347\253\257\347\225\214\351\235\242\346\211\247\350\241\214\347\274\226\350\257\221\345\221\275\344\273\244\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..3f5fa2829949e59d498da9dd5ff1f48fa0647cf1 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\345\234\250\347\273\210\347\253\257\347\225\214\351\235\242\346\211\247\350\241\214\347\274\226\350\257\221\345\221\275\344\273\244\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\345\234\250\347\273\210\347\253\257\347\225\214\351\235\242\351\200\211\346\213\251\347\233\256\346\240\207\346\236\204\345\273\272\347\211\210\346\234\254\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\345\234\250\347\273\210\347\253\257\347\225\214\351\235\242\351\200\211\346\213\251\347\233\256\346\240\207\346\236\204\345\273\272\347\211\210\346\234\254\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..91f3fa22153f501e308fab46f92f2e95995f1917 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\345\234\250\347\273\210\347\253\257\347\225\214\351\235\242\351\200\211\346\213\251\347\233\256\346\240\207\346\236\204\345\273\272\347\211\210\346\234\254\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\346\211\223\345\274\200DevEco\344\270\262\345\217\243\347\273\210\347\253\257\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\346\211\223\345\274\200DevEco\344\270\262\345\217\243\347\273\210\347\253\257\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..8c6ec0adb87f693519f0e3b00b3aa7053f3e23ae Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\346\211\223\345\274\200DevEco\344\270\262\345\217\243\347\273\210\347\253\257\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\346\240\207\345\207\206\347\216\257\345\242\203\345\277\253\351\200\237\345\205\245\351\227\250\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\346\240\207\345\207\206\347\216\257\345\242\203\345\277\253\351\200\237\345\205\245\351\227\250\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..587b414d787f36de3494760e14313e0ff18f896b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\346\240\207\345\207\206\347\216\257\345\242\203\345\277\253\351\200\237\345\205\245\351\227\250\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\273\210\347\253\257\347\225\214\351\235\242\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\273\210\347\253\257\347\225\214\351\235\242\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..360114c797c42340cdeadcb566a7d90651cd12de Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\273\210\347\253\257\347\225\214\351\235\242\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\274\226\350\257\221\346\210\220\345\212\237\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\274\226\350\257\221\346\210\220\345\212\237\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..f3a76a6922315fe595ae4214331ce322766b3b48 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\274\226\350\257\221\346\210\220\345\212\237\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\274\226\350\257\221\346\226\207\344\273\266\345\255\230\346\224\276\347\233\256\345\275\225\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\274\226\350\257\221\346\226\207\344\273\266\345\255\230\346\224\276\347\233\256\345\275\225\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..f354b2d27ce06bd5af6a8702c0894bf5c50a97bb Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\274\226\350\257\221\346\226\207\344\273\266\345\255\230\346\224\276\347\233\256\345\275\225\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3516\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3516\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..548e03da4b76123cb67d41cbd1de4a0f33f5ef4b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3516\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3518\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3518\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..548e03da4b76123cb67d41cbd1de4a0f33f5ef4b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/quick-start/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3518\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/security/figure/1-\346\225\217\346\204\237\346\235\203\351\231\220\345\274\271\347\252\227.png" "b/website/docs/.vuepress/public/images/device-dev/security/figure/1-\346\225\217\346\204\237\346\235\203\351\231\220\345\274\271\347\252\227.png" new file mode 100755 index 0000000000000000000000000000000000000000..fff1da1f834037c30a874b2fd76cad402b9ff9ce Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/security/figure/1-\346\225\217\346\204\237\346\235\203\351\231\220\345\274\271\347\252\227.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/security/figure/3-\345\272\224\347\224\250\351\232\220\347\247\201\345\243\260\346\230\216.png" "b/website/docs/.vuepress/public/images/device-dev/security/figure/3-\345\272\224\347\224\250\351\232\220\347\247\201\345\243\260\346\230\216.png" new file mode 100755 index 0000000000000000000000000000000000000000..2c729ec07bb1b74ef1936767cc3e9d19d4846835 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/security/figure/3-\345\272\224\347\224\250\351\232\220\347\247\201\345\243\260\346\230\216.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/security/figure/4-\351\232\220\347\247\201\345\243\260\346\230\216\345\217\230\346\233\264\351\200\232\347\237\245.png" "b/website/docs/.vuepress/public/images/device-dev/security/figure/4-\351\232\220\347\247\201\345\243\260\346\230\216\345\217\230\346\233\264\351\200\232\347\237\245.png" new file mode 100755 index 0000000000000000000000000000000000000000..90bf11ec3746c9fb00ea43608c5cf7d822f692e4 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/security/figure/4-\351\232\220\347\247\201\345\243\260\346\230\216\345\217\230\346\233\264\351\200\232\347\237\245.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/security/figure/5-\345\272\224\347\224\250\351\232\220\347\247\201\345\243\260\346\230\216\345\205\245\345\217\243.png" "b/website/docs/.vuepress/public/images/device-dev/security/figure/5-\345\272\224\347\224\250\351\232\220\347\247\201\345\243\260\346\230\216\345\205\245\345\217\243.png" new file mode 100755 index 0000000000000000000000000000000000000000..a0821e9436b918bffb1ea3b3756fe6d4cc969f08 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/security/figure/5-\345\272\224\347\224\250\351\232\220\347\247\201\345\243\260\346\230\216\345\205\245\345\217\243.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/security/figure/6-2-\351\232\220\347\247\201\345\243\260\346\230\216\346\222\244\351\224\200.png" "b/website/docs/.vuepress/public/images/device-dev/security/figure/6-2-\351\232\220\347\247\201\345\243\260\346\230\216\346\222\244\351\224\200.png" new file mode 100755 index 0000000000000000000000000000000000000000..c504f5246b2988876649a3f5d0c9059c7a0b2441 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/security/figure/6-2-\351\232\220\347\247\201\345\243\260\346\230\216\346\222\244\351\224\200.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/security/figure/DAC\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/security/figure/DAC\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..42300c9ca287049f03a8f90a8bba9c2cdc73e109 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/security/figure/DAC\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/security/figure/HUKS\345\212\237\350\203\275\347\273\223\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/security/figure/HUKS\345\212\237\350\203\275\347\273\223\346\236\204\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..87def1af5551ba7236979df89eaabadef1d362d8 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/security/figure/HUKS\345\212\237\350\203\275\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/security/figure/\345\256\211\345\205\250\344\277\235\351\232\234\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/security/figure/\345\256\211\345\205\250\344\277\235\351\232\234\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..fcab754c7446d4b886cc1d68d52832b1a006370d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/security/figure/\345\256\211\345\205\250\344\277\235\351\232\234\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/security/figure/\350\256\276\345\244\207\351\227\264\345\273\272\347\253\213\345\217\257\344\277\241\345\205\263\347\263\273\346\265\201\347\250\213\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/security/figure/\350\256\276\345\244\207\351\227\264\345\273\272\347\253\213\345\217\257\344\277\241\345\205\263\347\263\273\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..69ce9db229347ee2de2401fc0caef8f82d6f2035 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/security/figure/\350\256\276\345\244\207\351\227\264\345\273\272\347\253\213\345\217\257\344\277\241\345\205\263\347\263\273\346\265\201\347\250\213\345\233\276.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/20200721-223604(eSpace).gif b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/20200721-223604(eSpace).gif new file mode 100755 index 0000000000000000000000000000000000000000..8a5dcafb1c14c744d60590bc7ad913569a2fa92c Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/20200721-223604(eSpace).gif differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/Ability\344\270\216AbilitySlice\347\232\204\345\205\263\347\263\273\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/Ability\344\270\216AbilitySlice\347\232\204\345\205\263\347\263\273\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..d75201bb385d4a02d05c38174a5be216953da9c6 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/Ability\344\270\216AbilitySlice\347\232\204\345\205\263\347\263\273\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/Ability\345\255\220\347\263\273\347\273\237\346\241\206\346\236\266\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/Ability\345\255\220\347\263\273\347\273\237\346\241\206\346\236\266\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..a7335c79e316dcefaa91de546cf1604644e471df Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/Ability\345\255\220\347\263\273\347\273\237\346\241\206\346\236\266\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/Ability\347\256\241\347\220\206\346\234\215\345\212\241\345\222\214\345\214\205\347\256\241\347\220\206\346\234\215\345\212\241\345\220\257\345\212\250.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/Ability\347\256\241\347\220\206\346\234\215\345\212\241\345\222\214\345\214\205\347\256\241\347\220\206\346\234\215\345\212\241\345\220\257\345\212\250.png" new file mode 100755 index 0000000000000000000000000000000000000000..b84f177a7d26094ea96ad7e28b9872217fe79ab8 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/Ability\347\256\241\347\220\206\346\234\215\345\212\241\345\222\214\345\214\205\347\256\241\347\220\206\346\234\215\345\212\241\345\220\257\345\212\250.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/LiteOS-A\345\271\263\345\217\260dump\347\263\273\347\273\237\345\261\236\346\200\247\350\276\223\345\207\272.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/LiteOS-A\345\271\263\345\217\260dump\347\263\273\347\273\237\345\261\236\346\200\247\350\276\223\345\207\272.png" new file mode 100755 index 0000000000000000000000000000000000000000..c7e8c809207f0dc8965a2f8a41b55f0ae2abe13b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/LiteOS-A\345\271\263\345\217\260dump\347\263\273\347\273\237\345\261\236\346\200\247\350\276\223\345\207\272.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/LiteOS-M\345\271\263\345\217\260dump\347\263\273\347\273\237\345\261\236\346\200\247\350\276\223\345\207\272.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/LiteOS-M\345\271\263\345\217\260dump\347\263\273\347\273\237\345\261\236\346\200\247\350\276\223\345\207\272.png" new file mode 100755 index 0000000000000000000000000000000000000000..883dccf82ef3ec1828893afa314a66ca2f23c421 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/LiteOS-M\345\271\263\345\217\260dump\347\263\273\347\273\237\345\261\236\346\200\247\350\276\223\345\207\272.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/UGO\350\247\204\345\210\231\344\277\241\346\201\257.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/UGO\350\247\204\345\210\231\344\277\241\346\201\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..152ef05469dc22252a9bbcf4107276a1d9f5e8b8 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/UGO\350\247\204\345\210\231\344\277\241\346\201\257.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/UIButton\347\202\271\345\207\273\346\225\210\346\236\234.gif" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/UIButton\347\202\271\345\207\273\346\225\210\346\236\234.gif" new file mode 100755 index 0000000000000000000000000000000000000000..6db4ba71f91520200df7f59973e92ac2ef65f41b Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/UIButton\347\202\271\345\207\273\346\225\210\346\236\234.gif" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/ViewGroup\346\267\273\345\212\240view\345\256\236\344\276\213\346\225\210\346\236\234\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/ViewGroup\346\267\273\345\212\240view\345\256\236\344\276\213\346\225\210\346\236\234\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..c4eee0a41d7cafb81c103c21d586c8bc0ec53e27 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/ViewGroup\346\267\273\345\212\240view\345\256\236\344\276\213\346\225\210\346\236\234\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/ril-adapter\346\250\241\345\235\227\346\236\266\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/ril-adapter\346\250\241\345\235\227\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..98917f4562e2a3beabda31362c4ff36ac8526e26 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/ril-adapter\346\250\241\345\235\227\346\236\266\346\236\204\345\233\276.png" differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/unnaming.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/unnaming.png new file mode 100755 index 0000000000000000000000000000000000000000..6350269abdc028f9b1b31d544b78f380e58d7a57 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/unnaming.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001051782526.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001051782526.png new file mode 100755 index 0000000000000000000000000000000000000000..0fc8c68bcb337ee51204c5b1c2ae9392ff445330 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001051782526.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052582522.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052582522.png new file mode 100755 index 0000000000000000000000000000000000000000..165f22644ae3f7c09b8fa8c382f001348e253a67 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052582522.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052662559.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052662559.png new file mode 100755 index 0000000000000000000000000000000000000000..f84c996217cb2da97b197580d1efd571bbae0f71 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052662559.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052782555.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052782555.png new file mode 100755 index 0000000000000000000000000000000000000000..07840086475ed440a052f79d59f8761a8a1e62f5 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052782555.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052942531.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052942531.png new file mode 100755 index 0000000000000000000000000000000000000000..646a47c2dd0c102749dff11b482493cb323a9e55 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001052942531.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001053207924.gif b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001053207924.gif new file mode 100755 index 0000000000000000000000000000000000000000..6739188f22a6a9b9d76cb7af02f9e9c708735106 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001053207924.gif differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001053247975.gif b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001053247975.gif new file mode 100755 index 0000000000000000000000000000000000000000..cd08beb8d1de75f196c6794a0c741b9998ec80b3 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001053247975.gif differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001054101094.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001054101094.png new file mode 100755 index 0000000000000000000000000000000000000000..57cd59a411623ac25836b4bd49221cc744db8d61 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001054101094.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001054421113.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001054421113.png new file mode 100755 index 0000000000000000000000000000000000000000..1ba0a218017bbe98e2c21c8aa724900f766987ae Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001054421113.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001059334449.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001059334449.png new file mode 100755 index 0000000000000000000000000000000000000000..7835524bcfb112f1f8d46596d5efff05f9689941 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001059334449.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001060200050.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001060200050.png new file mode 100755 index 0000000000000000000000000000000000000000..047b5b30bdb1bc67829c96620603a6a4267a88d7 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001060200050.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001061889268.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001061889268.png new file mode 100755 index 0000000000000000000000000000000000000000..2c9bf38fc2d15b946f579c6a9589562aab0e6519 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001061889268.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001062334618.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001062334618.png new file mode 100755 index 0000000000000000000000000000000000000000..0ac7c0924e931695308a819010668327ed8a8680 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001062334618.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001062476933.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001062476933.png new file mode 100755 index 0000000000000000000000000000000000000000..7e4b608bbffd7ae3becdc918abd6ff2b041888e5 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001062476933.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001062942690.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001062942690.png new file mode 100755 index 0000000000000000000000000000000000000000..c06de34e1a7e72dc162d09b1a4fa5fcd25cefab3 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001062942690.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001077724150.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001077724150.png new file mode 100755 index 0000000000000000000000000000000000000000..2f6a9a6026d86bfcdd6462825334b450e481f563 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001077724150.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001077727032.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001077727032.png new file mode 100755 index 0000000000000000000000000000000000000000..0077b263cf4c1ddfaf162e4ad01d2f8c2d58d13d Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001077727032.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001119924146.gif b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001119924146.gif new file mode 100644 index 0000000000000000000000000000000000000000..9cd37267672d3bea422b98d95c413e26df330de8 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001119924146.gif differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001166643927.jpg b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001166643927.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ace4cefd36637675f235df3cd596eca3ed218e6c Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001166643927.jpg differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001181934155.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001181934155.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3b4daf5fdd4d78948488046bc404bc9ffedbbd Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001181934155.png differ diff --git a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001214727595.png b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001214727595.png new file mode 100644 index 0000000000000000000000000000000000000000..f5648acc87f23979f8078afcb2089ed3f834d3e5 Binary files /dev/null and b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/zh-cn_image_0000001214727595.png differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\212\250\347\224\273\345\256\236\347\216\260\346\225\210\346\236\234\345\233\276.gif" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\212\250\347\224\273\345\256\236\347\216\260\346\225\210\346\236\234\345\233\276.gif" new file mode 100755 index 0000000000000000000000000000000000000000..1eda8dc4c7f8fa35620640b5eee085b510e0f4ea Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\212\250\347\224\273\345\256\236\347\216\260\346\225\210\346\236\234\345\233\276.gif" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\214\205\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237\346\241\206\346\236\266\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\214\205\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237\346\241\206\346\236\266\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..330983e87925e92d7d27cbe7581993e81b812af7 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\214\205\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237\346\241\206\346\236\266\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\216\273\347\224\265\350\260\203\347\224\250\346\227\266\345\272\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\216\273\347\224\265\350\260\203\347\224\250\346\227\266\345\272\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..ca7bf2b79f42c07328a8342fd94b1c67013607c1 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\216\273\347\224\265\350\260\203\347\224\250\346\227\266\345\272\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\220\257\345\212\250\345\255\220\347\263\273\347\273\237\344\270\212\344\270\213\346\226\207.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\220\257\345\212\250\345\255\220\347\263\273\347\273\237\344\270\212\344\270\213\346\226\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..e524495360609969011d8554d197ee04175e6b8f Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\220\257\345\212\250\345\255\220\347\263\273\347\273\237\344\270\212\344\270\213\346\226\207.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\233\276\347\211\2071.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\233\276\347\211\2071.png" new file mode 100755 index 0000000000000000000000000000000000000000..c9e74aefe365e0c103fbb6c128f731850d8258a4 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\233\276\347\211\2071.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\271\263\351\223\272\346\250\241\345\274\217\345\233\276\347\211\207\346\225\210\346\236\234\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\271\263\351\223\272\346\250\241\345\274\217\345\233\276\347\211\207\346\225\210\346\236\234\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..a8ca6625852cfbce3d1cd156a52fd76a299084ad Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\271\263\351\223\272\346\250\241\345\274\217\345\233\276\347\211\207\346\225\210\346\236\234\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\272\224\347\224\250\345\220\257\345\212\250\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\272\224\347\224\250\345\220\257\345\212\250\346\265\201\347\250\213.png" new file mode 100755 index 0000000000000000000000000000000000000000..2111dd19967c6f8d960a4e93891ddde7f8825225 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\345\272\224\347\224\250\345\220\257\345\212\250\346\265\201\347\250\213.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\217\222\344\273\266\344\276\235\350\265\226-(2).jpg" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\217\222\344\273\266\344\276\235\350\265\226-(2).jpg" new file mode 100755 index 0000000000000000000000000000000000000000..e73a82e4a5adc0d41adb548acc662f538afcd21c Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\217\222\344\273\266\344\276\235\350\265\226-(2).jpg" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\231\256\351\200\232\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\347\273\223\346\236\204.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\231\256\351\200\232\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\347\273\223\346\236\204.png" new file mode 100755 index 0000000000000000000000000000000000000000..a8954112f6b94d422bce3c1f445aa0de6c2499cc Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\231\256\351\200\232\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\347\273\223\346\236\204.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\231\256\351\200\232\347\273\204\344\273\266\346\240\221\347\273\223\346\236\204.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\231\256\351\200\232\347\273\204\344\273\266\346\240\221\347\273\223\346\236\204.png" new file mode 100755 index 0000000000000000000000000000000000000000..276dfb6048e96d289c0074bd320ff7bfb4f1ab9d Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\231\256\351\200\232\347\273\204\344\273\266\346\240\221\347\273\223\346\236\204.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\260\264\345\271\263-\345\236\202\347\233\264\346\226\271\345\220\221\345\217\257\346\273\221\345\212\250\346\225\210\346\236\234\345\233\276.gif" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\260\264\345\271\263-\345\236\202\347\233\264\346\226\271\345\220\221\345\217\257\346\273\221\345\212\250\346\225\210\346\236\234\345\233\276.gif" new file mode 100755 index 0000000000000000000000000000000000000000..1bd6879c1955f9131cd12ea17a2d8c0e52be6ab1 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\346\260\264\345\271\263-\345\236\202\347\233\264\346\226\271\345\220\221\345\217\257\346\273\221\345\212\250\346\225\210\346\236\234\345\233\276.gif" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\347\263\273\347\273\237\345\217\202\346\225\260\346\223\215\344\275\234\345\216\237\350\257\255.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\347\263\273\347\273\237\345\217\202\346\225\260\346\223\215\344\275\234\345\216\237\350\257\255.png" new file mode 100644 index 0000000000000000000000000000000000000000..54c15c441dbb8f305ff4d6031b45c2eb8cb28d6c Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\347\263\273\347\273\237\345\217\202\346\225\260\346\223\215\344\275\234\345\216\237\350\257\255.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\347\273\204\344\273\266\346\240\221\347\273\223\346\236\204\347\244\272\346\204\217\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\347\273\204\344\273\266\346\240\221\347\273\223\346\236\204\347\244\272\346\204\217\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..dc3dcd37c644867a2de9ba4209aaeeedcedecbe8 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\347\273\204\344\273\266\346\240\221\347\273\223\346\236\204\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\347\274\226\350\257\221\346\236\204\345\273\272\346\265\201\347\250\213.jpg" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\347\274\226\350\257\221\346\236\204\345\273\272\346\265\201\347\250\213.jpg" new file mode 100755 index 0000000000000000000000000000000000000000..3e296c97b64e317bb92849d80588d5ab5419b31e Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\347\274\226\350\257\221\346\236\204\345\273\272\346\265\201\347\250\213.jpg" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\350\207\252\351\200\202\345\272\224\346\250\241\345\274\217\345\233\276\347\211\207\346\225\210\346\236\234\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\350\207\252\351\200\202\345\272\224\346\250\241\345\274\217\345\233\276\347\211\207\346\225\210\346\236\234\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..2e412ac913dc9b7bd4f1ff1729bfe017b02b4a7a Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\350\207\252\351\200\202\345\272\224\346\250\241\345\274\217\345\233\276\347\211\207\346\225\210\346\236\234\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\350\256\276\347\275\2562-2\347\275\221\346\240\274\345\271\266\346\267\273\345\212\2404\344\270\252button\347\273\204\344\273\266\350\277\233\350\241\214\345\270\203\345\261\200.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\350\256\276\347\275\2562-2\347\275\221\346\240\274\345\271\266\346\267\273\345\212\2404\344\270\252button\347\273\204\344\273\266\350\277\233\350\241\214\345\270\203\345\261\200.png" new file mode 100755 index 0000000000000000000000000000000000000000..9d8039f69db3919dd3ddf716bc58d053948479ee Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\350\256\276\347\275\2562-2\347\275\221\346\240\274\345\271\266\346\267\273\345\212\2404\344\270\252button\347\273\204\344\273\266\350\277\233\350\241\214\345\270\203\345\261\200.png" differ diff --git "a/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\350\277\220\350\241\214\346\212\245\351\224\231\345\233\276.png" "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\350\277\220\350\241\214\346\212\245\351\224\231\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..015c38ba5516395527bcf6715535238f02b2bad9 Binary files /dev/null and "b/website/docs/.vuepress/public/images/device-dev/subsystems/figure/\350\277\220\350\241\214\346\212\245\351\224\231\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/AI\345\274\225\346\223\216\346\241\206\346\236\266.png" "b/website/docs/.vuepress/public/images/readme/figures/AI\345\274\225\346\223\216\346\241\206\346\236\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..40fce96c01fbe619d77851dffcb5c37b1468892f Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/AI\345\274\225\346\223\216\346\241\206\346\236\266.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/JS-FA\345\274\200\345\217\221\347\233\256\345\275\225.png" "b/website/docs/.vuepress/public/images/readme/figures/JS-FA\345\274\200\345\217\221\347\233\256\345\275\225.png" new file mode 100755 index 0000000000000000000000000000000000000000..67e8ab4dfd26f4bbf7206d569831ed1f8351d9ad Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/JS-FA\345\274\200\345\217\221\347\233\256\345\275\225.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/OpenHarmony-LiteOS-A\345\206\205\346\240\270\346\236\266\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/readme/figures/OpenHarmony-LiteOS-A\345\206\205\346\240\270\346\236\266\346\236\204\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..b2ff552d12a62fb207505772fc4c8cad29262022 Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/OpenHarmony-LiteOS-A\345\206\205\346\240\270\346\236\266\346\236\204\345\233\276.png" differ diff --git a/website/docs/.vuepress/public/images/readme/figures/aafwk.png b/website/docs/.vuepress/public/images/readme/figures/aafwk.png new file mode 100755 index 0000000000000000000000000000000000000000..9c984fd666ab4ff18cdfb5e2035f06342249fd4a Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/aafwk.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/appexecfwk.png b/website/docs/.vuepress/public/images/readme/figures/appexecfwk.png new file mode 100755 index 0000000000000000000000000000000000000000..e40a548d48af43430fed8599b30c4efcab60fa1d Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/appexecfwk.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/cesfwk_architecture_diagram.png b/website/docs/.vuepress/public/images/readme/figures/cesfwk_architecture_diagram.png new file mode 100755 index 0000000000000000000000000000000000000000..c43dc2dc5c9fe130d669f0e8a5dfc27ff1faf418 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/cesfwk_architecture_diagram.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/dms-architecture_zh.png b/website/docs/.vuepress/public/images/readme/figures/dms-architecture_zh.png new file mode 100644 index 0000000000000000000000000000000000000000..588c33751dff097e9a8bb9b21d731a1ca1633ffd Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/dms-architecture_zh.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/page-ability-lifecycle-callbacks.png b/website/docs/.vuepress/public/images/readme/figures/page-ability-lifecycle-callbacks.png new file mode 100755 index 0000000000000000000000000000000000000000..4c94556b5c2516ad2978a9a31d833cfb2cf3dd01 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/page-ability-lifecycle-callbacks.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/page-ability-lifecycle.png b/website/docs/.vuepress/public/images/readme/figures/page-ability-lifecycle.png new file mode 100755 index 0000000000000000000000000000000000000000..d4fff2a49bf103cb5d8763f271c847fc1b711723 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/page-ability-lifecycle.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/service-ability-lifecycle-callbacks.jpg b/website/docs/.vuepress/public/images/readme/figures/service-ability-lifecycle-callbacks.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d046627239c89c1ce44450f1db3e8dd623974514 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/service-ability-lifecycle-callbacks.jpg differ diff --git a/website/docs/.vuepress/public/images/readme/figures/service-ability-lifecycle.png b/website/docs/.vuepress/public/images/readme/figures/service-ability-lifecycle.png new file mode 100755 index 0000000000000000000000000000000000000000..66c11ca4db7900696c064461cb7f774bfcd48d49 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/service-ability-lifecycle.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_architecture-of-telephony-subsystem.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_architecture-of-telephony-subsystem.png new file mode 100755 index 0000000000000000000000000000000000000000..a7de4844d182c5214de31a389fb084ea5552a99e Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_architecture-of-telephony-subsystem.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001077953992.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001077953992.png new file mode 100755 index 0000000000000000000000000000000000000000..128187aacfa540846172eac7d4ff47a3c2a31291 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001077953992.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001079026550.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001079026550.png new file mode 100755 index 0000000000000000000000000000000000000000..99f14c85aa9d185ceb02bd2c376462e84629d897 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001079026550.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001079207198.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001079207198.png new file mode 100755 index 0000000000000000000000000000000000000000..c4069d0870d67b6b5eaefa1fdd426975cd5224b2 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001079207198.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001106694563.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001106694563.png new file mode 100755 index 0000000000000000000000000000000000000000..2f6a9a6026d86bfcdd6462825334b450e481f563 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001106694563.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001111659738.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001111659738.png new file mode 100755 index 0000000000000000000000000000000000000000..60179a923ded99ae33c2859f30570a7d5d95a3a8 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001111659738.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001115748088.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001115748088.png new file mode 100644 index 0000000000000000000000000000000000000000..294f37c9dd23790348079f175b54d0fac58b8abf Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001115748088.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001115748590.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001115748590.png new file mode 100644 index 0000000000000000000000000000000000000000..b72003f5221553d66ae4b4183f92bcfcac595bc2 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001115748590.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001115819528.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001115819528.png new file mode 100755 index 0000000000000000000000000000000000000000..ded7f8ca0f8aa1f9bfb51a38ad37a21fed16ced9 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001115819528.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001162062837.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001162062837.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbd2f49d8ed4e7b24e1f8fdc0ba971c1fcb04f5 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001162062837.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001162307895.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001162307895.png new file mode 100755 index 0000000000000000000000000000000000000000..b1d4a9fc4a69c1b4af9fa42ae5b0d4a47f4afb74 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001162307895.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001162757669.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001162757669.png new file mode 100755 index 0000000000000000000000000000000000000000..c39795967bcd7b5ffbf611b16dd9c3c6778ebd9c Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_0000001162757669.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_ark_frontend.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_ark_frontend.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e9951f3f2dc5b566a3d9b36229def46c41aecd Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_ark_frontend.png differ diff --git a/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_ark_runtime.png b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_ark_runtime.png new file mode 100644 index 0000000000000000000000000000000000000000..2f78e5f3e10a2b99c60ca31dc0f23ae5fb89f7a6 Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/figures/zh-cn_image_ark_runtime.png differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/\345\205\250\347\220\203\345\214\226\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/readme/figures/\345\205\250\347\220\203\345\214\226\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..0d8c52645dbee83554bfbf7fb8c5bf46bb7e3269 Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/\345\205\250\347\220\203\345\214\226\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/\345\210\206\345\270\203\345\274\217\346\226\207\344\273\266\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/readme/figures/\345\210\206\345\270\203\345\274\217\346\226\207\344\273\266\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..e3763b766aff5cf1c80c31a0ea17c527a9f70a8f Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/\345\210\206\345\270\203\345\274\217\346\226\207\344\273\266\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/\345\233\276\345\275\242\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/readme/figures/\345\233\276\345\275\242\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..85ea43ab9df6b54d41e6703876c2da05f082f001 Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/\345\233\276\345\275\242\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/\345\252\222\344\275\223\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/readme/figures/\345\252\222\344\275\223\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..6cacc7470fc2c1e82e7d5306f9a5cf0d9fd5e792 Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/\345\252\222\344\275\223\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276-5.png" "b/website/docs/.vuepress/public/images/readme/figures/\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276-5.png" new file mode 100755 index 0000000000000000000000000000000000000000..988f445370dc2b288bbbe5ec3b36f8bbdf411f5c Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276-5.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/readme/figures/\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..f4db33be77173dd074bb6a5ae045a9c9a5a5c82a Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/\347\224\265\346\272\220\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/readme/figures/\347\224\265\346\272\220\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..698bf197806b9e260b6919e4eaeff2a9900b2d50 Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/\347\224\265\346\272\220\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/\351\251\261\345\212\250\345\256\211\350\243\205\351\203\250\347\275\262\345\233\276.png" "b/website/docs/.vuepress/public/images/readme/figures/\351\251\261\345\212\250\345\256\211\350\243\205\351\203\250\347\275\262\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..ee364fd6ea0a34ec5b7b79f96556b59afe012445 Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/\351\251\261\345\212\250\345\256\211\350\243\205\351\203\250\347\275\262\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/\351\251\261\345\212\250\346\236\266\346\236\204\345\233\276.png" "b/website/docs/.vuepress/public/images/readme/figures/\351\251\261\345\212\250\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..4d8f23c4ac0bc523de713c0df43fb6bf0bbd517f Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/\351\251\261\345\212\250\346\236\266\346\236\204\345\233\276.png" differ diff --git "a/website/docs/.vuepress/public/images/readme/figures/\351\251\261\345\212\250\346\241\206\346\236\266\344\272\244\344\272\222\346\265\201\347\250\213.png" "b/website/docs/.vuepress/public/images/readme/figures/\351\251\261\345\212\250\346\241\206\346\236\266\344\272\244\344\272\222\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..0a4e738184f3feeb1ff0f71ec36518470e92032f Binary files /dev/null and "b/website/docs/.vuepress/public/images/readme/figures/\351\251\261\345\212\250\346\241\206\346\236\266\344\272\244\344\272\222\346\265\201\347\250\213.png" differ diff --git a/website/docs/.vuepress/public/images/readme/public_sys-resources/icon-note.gif b/website/docs/.vuepress/public/images/readme/public_sys-resources/icon-note.gif new file mode 100755 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and b/website/docs/.vuepress/public/images/readme/public_sys-resources/icon-note.gif differ diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243-\345\257\274\350\257\273.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/01.\344\272\206\350\247\243OpenHarmony\345\274\200\346\272\220\351\241\271\347\233\256.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243-\345\257\274\350\257\273.md" rename to "website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/01.\344\272\206\350\247\243OpenHarmony\345\274\200\346\272\220\351\241\271\347\233\256.md" index 491ca53f6ab778aa383cfa44c730461ff1e1ec89..ffa7b3ce76e7d346587b71d83cff9918ba83a8a9 100644 --- "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243-\345\257\274\350\257\273.md" +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/01.\344\272\206\350\247\243OpenHarmony\345\274\200\346\272\220\351\241\271\347\233\256.md" @@ -1,6 +1,6 @@ --- -title: 文档-导读 -permalink: /documents/ +title: 了解OpenHarmony开源项目 +permalink: /pages/000000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:40 +date: 2021-12-30 18:31:27 --- # OpenHarmony开源项目 @@ -360,7 +360,7 @@ OpenHarmony支持如下几种系统类型: ## 快速入门 -入口:[https://gitee.com/openharmony/docs/tree/master/zh-cn/device-dev/quick-start/Readme-CN.md](https://gitee.com/openharmony/docs/tree/master/zh-cn/device-dev/quick-start/Readme-CN.md) + ## 代码仓地址 @@ -374,6 +374,8 @@ OpenHarmony归档组织地址:[https://gitee.com/openharmony-retired](https:// ## 开发者文档 +[访问官网](https://www.openharmony.cn/) + 简体中文:[OpenHarmony开发者文档](https://gitee.com/openharmony/docs/tree/master/zh-cn) [English Version](https://gitee.com/openharmony/docs/tree/master/en) diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/01.\345\206\205\346\240\270\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/01.\345\206\205\346\240\270\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..4c1ef389498228a878134f86d3928b0761ef1fcd --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/01.\345\206\205\346\240\270\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,245 @@ +--- +title: 内核子系统 +permalink: /pages/00000100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 内核子系统 + +- [简介](#section11660541593) +- [LiteOS](#section6253122153515) +- [Linux](#section143373618411) +- [目录](#section21571344112) +- [约束](#section19647171710417) +- [使用](#section1393789267) + - [LiteOS使用说明](#section118811457303) + - [linux使用说明](#section1352114469620) + +- [构建说明](#section19369206113115) +- [相关仓](#section27639463106) + +## 简介 + +OpenHarmony针对不同量级的系统,分别使用了不同形态的内核,分别为LiteOS和Linux。在轻量系统、小型系统可以选用LiteOS;在小型系统和标准系统上可以选用Linux。 + + + + + + + + + + + + + + + + + +

系统级别

+

轻量系统

+

小型系统

+

标准系统

+

LiteOS

+

+

+

×

+

Linux

+

×

+

+

+
+ +## LiteOS + +OpenHarmonyLiteOS内核是面向IoT领域的实时操作系统内核,它同时具备RTOS轻快和Linux易用的特点。 + +OpenHarmonyLiteOS内核主要包括进程和线程调度、内存管理、IPC机制、timer管理等内核基本功能。 + +OpenHarmonyLiteOS内核的源代码分为 kernel\_liteos\_a 和 kernel\_liteos\_m 这2个代码仓库,其中kernel\_liteos\_a主要针对小型系统(small system)和标准系统(standard system),而kernel\_liteos\_m则主要针对轻量系统(mini system),下面主要针对kernel\_liteos\_a代码仓库进行介绍。图1为OpenHarmony LiteOS-A内核架构图: + +**图 1** OpenHarmony LiteOS-A内核架构图 +![](/images/readme/figures/OpenHarmony-LiteOS-A内核架构图.png "OpenHarmony-LiteOS-A内核架构图") + +## Linux + +OpenHarmony的Linux内核基于开源Linux内核LTS **4.19.y / 5.10.y** 分支演进,在此基线基础上,回合CVE补丁及OpenHarmony特性,作为OpenHarmony Common Kernel基线。针对不同的芯片,各厂商合入对应的板级驱动补丁,完成对OpenHarmony的基线适配。 + +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社区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 +│ ├── 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等 + │ └── arm # arm架构代码 + ├── bsd # freebsd相关的驱动和适配层模块代码引入,例如USB等 + ├── compat # 内核接口兼容性目录 + │ └── posix # posix相关接口 + ├── drivers # 内核驱动 + │ └── char # 字符设备 + │ ├── mem # 访问物理IO设备驱动 + │ ├── quickstart # 系统快速启动接口目录 + │ ├── random # 随机数设备驱动 + │ └── video # framebuffer驱动框架 + ├── fs # 文件系统模块,主要来源于NuttX开源项目 + │ ├── fat # fat文件系统 + │ ├── jffs2 # jffs2文件系统 + │ ├── include # 对外暴露头文件存放目录 + │ ├── nfs # nfs文件系统 + │ ├── proc # proc文件系统 + │ ├── ramfs # ramfs文件系统 + │ └── vfs # vfs层 + ├── kernel # 进程、内存、IPC等模块 + │ ├── base # 基础内核,包括调度、内存等模块 + │ ├── common # 内核通用组件 + │ ├── extended # 扩展内核,包括动态加载、vdso、liteipc等模块 + │ ├── include # 对外暴露头文件存放目录 + │ └── user # 加载init进程 + ├── lib # 内核的lib库 + ├── net # 网络模块,主要来源于lwip开源项目 + ├── platform # 支持不同的芯片平台代码,如Hi3516DV300等 + │ ├── hw # 时钟与中断相关逻辑代码 + │ ├── include # 对外暴露头文件存放目录 + │ └── uart # 串口相关逻辑代码 + ├── platform # 支持不同的芯片平台代码,如Hi3516DV300等 + ├── security # 安全特性相关的代码,包括进程权限管理和虚拟id映射管理 + ├── syscall # 系统调用 + └── tools # 构建工具及相关配置和代码 +``` + +## 约束 + +LiteOS: + +Hi3518EV300默认使用jffs2文件系统,Hi3516DV300默认使用FAT文件系统。若要使用其他文件系统,需要新增适配。 + +## 使用 + +### LiteOS使用说明 + +参见LiteOS-A内核[README](https://gitee.com/openharmony/kernel_liteos_a/blob/master/README_zh.md)和LiteOS-M内核[README](https://gitee.com/openharmony/kernel_liteos_m/blob/master/README_zh.md)的“使用说明”章节。 + +### linux使用说明 + +1. 合入HDF补丁 + + 在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) + ``` + +2. 合入芯片平台驱动补丁 + + 以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 + ``` + +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 + ``` + + > **须知:** + > + >由于OpenHarmony工程的编译构建流程中会拷贝kernel/linux/linux-\*\.\*的代码环境后进行打补丁动作,在使用OpenHarmony的版本级编译命令前,需要kernel/linux/linux-\*\.\*原代码环境。 + > + >根据不同系统工程,编译完成后会在out目录下的kernel目录中生成对应实际编译的内核,基于此目录的内核,进行对应的config修改,将最后生成的\.config文件cp到config仓对应的路径文件里,即可生效。 + +## 构建说明 + +以hi3516dv300开源开发板+ubuntu x86主机开发环境为例 + +使用工程的全量编译命令,编译生成uImage内核镜像 + +``` +./build.sh --product-name Hi3516DV300 # 编译hi3516dv300镜像 + --build-target build_kernel # 编译hi3516dv300的uImage内核镜像 + --gn-args linux_kernel_version=\"linux-5.10\" # 编译指定内核版本 +``` + +## 相关仓 + +**内核子系统** + +LiteOS: + +[drivers\_liteos](https://gitee.com/openharmony/drivers_liteos/blob/master/README_zh.md) + +[kernel\_liteos\_a](https://gitee.com/openharmony/kernel_liteos_a/blob/master/README_zh.md) + +[kernel\_liteos\_m](https://gitee.com/openharmony/kernel_liteos_m/blob/master/README_zh.md) + +[device\_qemu](https://gitee.com/openharmony/device_qemu/blob/master/README_zh.md) + +[prebuilts\_lite\_sysroot](https://gitee.com/openharmony/prebuilts_lite_sysroot/blob/master/README_zh.md) + +Linux: + +[kernel\_linux\_patches](https://gitee.com/openharmony/kernel_linux_patches/blob/master/README_zh.md) + +[kernel\_linux\_config](https://gitee.com/openharmony/kernel_linux_config/blob/master/README_zh.md) + +[kernel\_linux\_build](https://gitee.com/openharmony/kernel_linux_build/blob/master/README_zh.md) + +[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 diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/02.\351\251\261\345\212\250\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/02.\351\251\261\345\212\250\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..a5cf61daedd770676fa3c00c1cd910d3488f34ba --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/02.\351\251\261\345\212\250\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,169 @@ +--- +title: 驱动子系统 +permalink: /pages/00000101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 驱动子系统 + +- [简介](#section11660541593) +- [架构](#section101721227145613) +- [目录](#section1464106163817) +- [使用](#section8496817141616) +- [安装](#section14778154275818) +- [涉及仓](#section134812226297) + +## 简介 + +OpenHarmony驱动子系统采用C面向对象编程模型构建,通过平台解耦、内核解耦,兼容不同内核,提供了归一化的驱动平台底座,旨在为开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。 + +为了缩减驱动开发者的驱动开发周期,降低三方设备驱动集成难度,OpenHarmony驱动子系统支持以下关键特性和能力。 + +- 弹性化的框架能力: + + 在传统的驱动框架能力的基础上,OpenHarmony驱动子系统通过构建弹性化的框架能力,可支持在百K级别到百兆级容量的终端产品形态部署。 + + +- 规范化的驱动接口: + + 定义了常见驱动接口,为驱动开发者和使用者提供丰富、稳定接口,并和未来开放的面向手机、平板、智慧屏等设备驱动接口保持API兼容性。 + + +- 组件化的驱动模型: + + 支持组件化的驱动模型,为开发者提供更精细化的驱动管理,开发者可以对驱动进行组件化拆分,使得驱动开发者可以更多关注驱动与硬件交互部分。 + + 同时系统也预置了部分模板化的驱动模型组件,如网络设备模型等。 + + +- 归一化的配置界面: + + 提供统一的配置界面,构建跨平台的配置转换和生成工具,实现跨平台的无缝切换 + + +为了方便驱动开发者更易于开发OpenHarmony驱动程序,OpenHarmony驱动子系统在DevEco集成了驱动开发套件工具,支持驱动工程管理,驱动模板生成、配置管理等界面化的操作。 + +## 架构 + +OpenHarmony驱动框架采用主从架构设计模式,围绕着框架、模型、能力库和工具四个维度能力展开构建。 + +**图 1** 驱动架构图 +![](/images/readme/figures/驱动架构图.png "驱动架构图") + +- 驱动框架 -位于framework/core目录 + - 提供驱动框架能力,主要完成驱动加载和启动功能。 + - 通过对象管理器方式可实现驱动框架的弹性化部署和扩展。 + +- 驱动模型 - 位于framework/model目录 + - 提供了模型化驱动能力,如网络设备模型。 + +- 驱动能力库 - 位于framework/ability目录 + - 提供基础驱动能力模型,如IO通信能力模型。 + +- 驱动工具 - 位于framework/tools目录 + - 提供HDI接口转换、驱动配置编译等工具。 + +- 驱动接口 - 位于lite/hdi目录 + - 提供规范化的驱动接口。 + +- Support - 位于framework/support目录 + - 提供规范化的平台驱动接口和系统接口抽象能力。 + + +## 目录 + +``` +drivers +├── adapter #适配平台差异性的代码 +├── framework #驱动框架核心代码 +└── peripheral #外设驱动代码 +``` + +## 使用 + +**图 2** 驱动框架交互流程 +![](/images/readme/figures/驱动框架交互流程.png "驱动框架交互流程") + +驱动框架完成大部分驱动加载的动作,用户只需注册自己所需的接口和配置,然后驱动框架就会解析配置的内容,完成驱动加载和初始化动作。 + +开发者基于HDF驱动框架开发的驱动主要包含三大部分: + +1、驱动程序部分 - 完成驱动的功能逻辑。 + +2、驱动配置信息 - 指示驱动的加载信息内容。 + +3、驱动资源配置 - 配置驱动的硬件配置信息。 + +驱动程序主要是完成驱动功能的开发部分: + +对于开发者首先看到的是驱动入口部分,驱动入口部分通过DriverEntry对其进行描述。 + +其中主要包含bind, init 和release三个接口。 + +``` +struct HdfDriverEntry g_deviceSample = { + .moduleVersion = 1, + .moduleName = "sample_driver", + .Bind = SampleDriverBind, + .Init = SampleDriverInit, + .Release = SampleDriverRelease, +}; +``` + +Bind接口描述:该接口的作用主要是完成驱动设备和设备服务接口的bind动作。 + +``` +int32_t SampleDriverBind(struct HdfDeviceObject *deviceObject) +{ + // TODO: Bind device service to device object. + // And you can also initialize device resources here. + return HDF_SUCCESS; +} +``` + +Init接口描述:当框架完成设备绑定动作后,就开始调用驱动初始化接口,当初始化成功后,驱动框架根据配置文件决定是否对外创建设备服务接口,还是只是对当前服务接口可见。如果Init初始化失败的话,驱动框架就会主动释放创建的设备接口等信息。 + +``` +int32_t SampleDriverInit(struct HdfDeviceObject *deviceObject) +{ + // TODO: Init hardware or other resources here. + return HDF_SUCCESS; +} +``` + +Release接口描述:当用户需要卸载驱动时,驱动框架先通过该接口通知驱动程序释放资源。然后在执行其他内部资源释放。 + +``` +void SampleDriverRelease(struct HdfDeviceObject *deviceObject) +{ + // Release all resources. + return; +} +``` + +## 安装 + +OpenHarmony驱动主要部署在内核态,当前主要采用静态链接方式,随内核子系统编译和系统镜像打包。 + +**图 3** 驱动安装部署图 +![](/images/readme/figures/驱动安装部署图.png "驱动安装部署图") + +## 涉及仓 + +**驱动子系统** + +[drivers\_framework](https://gitee.com/openharmony/drivers_framework/blob/master/README_zh.md) + +[drivers\_adapter](https://gitee.com/openharmony/drivers_adapter/blob/master/README_zh.md) + +[drivers\_adapter\_khdf\_linux](https://gitee.com/openharmony/drivers_adapter_khdf_linux/blob/master/README_zh.md) + +[drivers\_peripheral](https://gitee.com/openharmony/drivers_peripheral/blob/master/README_zh.md) + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/03.\346\226\271\350\210\237\350\277\220\350\241\214\346\227\266\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/03.\346\226\271\350\210\237\350\277\220\350\241\214\346\227\266\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..ad9b5782af67905e40ba1368e50b35ce50051fa7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/03.\346\226\271\350\210\237\350\277\220\350\241\214\346\227\266\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,78 @@ +--- +title: 方舟运行时子系统 +permalink: /pages/00000102 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 方舟运行时子系统 + +- [方舟运行时子系统](#方舟运行时子系统) + - [简介](#简介) + - [目录](#目录) + - [使用指南](#使用指南) + - [相关仓](#相关仓) + +## 简介 + +方舟\(ARK\)是华为自研的统一编程平台,包含编译器、工具链、运行时等关键部件,支持高级语言在多种芯片平台的编译与运行,并支撑OpenHarmony操作系统及其应用和服务运行在手机、个人电脑、平板、电视、汽车和智能穿戴等多种设备上的需求。本次开源的ARK-JS提供的能力是在OpenHarmony标准系统\(standard system\)中编译和运行JavaScript语言\(本文后面简称JS\)。 + +本次开源的ARK-JS分成两个部分,分别是JS编译工具链与JS运行时。JS工具链将JS源码编译成方舟字节码\(ARK Bytecode\),JS运行时负责执行生成的方舟字节码\(后续如无特殊说明,字节码特指方舟字节码\)。 + +JS编译工具链架构: + +![](/images/readme/figures/zh-cn_image_ark_frontend.png) + +JS前端编译器,将JavaScript源码解析为AST\( Abstract Syntax Tree\)后,经过AST变换、字节码生成器、寄存器分配后由native emiter产生方舟字节码文件\(abc文件\) + +JS运行时(Runtime)架构: + +![](/images/readme/figures/zh-cn_image_ark_runtime.png) + +ARK-JS Runtime以方舟字节码文件作为输入并直接运行字节码文件,实现对应的JS语义逻辑。 + +ARK-JS Runtime主要由四个部分组成: + +- Core Runtime + + Core Runtime主要由语言无关的基础运行库组成,包括承载字节码的ARK File组件、支持Debugger的Tooling组件、负责对应系统调用的ARK Base组件等。 + +- Execution Engine + + 执行引擎目前包含执行字节码的解释器、缓存隐藏类和内联缓存、以及剖析记录运行时类型的Profiler。 + +- ECMAScript Runtime + + ECMAScript Runtime则包含了各种JS对象的分配器、垃圾回收器、以及用以支撑ECMAScript规范的内部运行库。 + +- AFFI \(ARK Foreign Function Interface\) + + AFFI是ARK JS运行时的C++语言外部函数接口。 + + +## 目录 + +``` +/ark +├── js_runtime # JS运行时组件 +├── runtime_core # 运行时公共组件 +└── ts2abc # JS语言的前端工具 +``` + +## 使用指南 + +[方舟运行时使用指南](https://gitee.com/openharmony/ark_js_runtime/blob/master/docs/ARK-Runtime-Usage-Guide-zh.md) + +## 相关仓 + +[ark\_runtime\_core](https://gitee.com/openharmony/ark_runtime_core) + +[ark\_js\_runtime](https://gitee.com/openharmony/ark_js_runtime) + +[ark\_ts2abc](https://gitee.com/openharmony/ark_ts2abc) diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/04.DFX\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/04.DFX\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..123410066a72c187eb11cb3b4c81cbbac374729c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/04.DFX\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,74 @@ +--- +title: DFX子系统 +permalink: /pages/00000103 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# DFX子系统 + +- [简介](#section1347419114210) +- [系统架构](#section342962219551) +- [目录](#section62815498425) +- [相关仓](#section767551120815) + +## 简介 + +在OpenHarmony中,DFX\([Design for X](https://en.wikipedia.org/wiki/Design_for_X)\)是为了提升质量属性软件设计,目前包含的内容主要有:DFR(Design for Reliability,可靠性)和DFT(Design for Testability,可测试性)特性。 + +提供以下功能: + +- HiLog流水日志。 + +- HiView插件平台。 +- FaultLoggerd应用故障收集和订阅。 +- HiAppEvent应用事件记录接口及框架。 +- HiSysEvent系统事件记录接口及服务。 + +## 系统架构 + +**图 1** 子系统架构图 + + +![](/images/readme/figures/zh-cn_image_0000001162062837.png) + +## 目录 + +``` +base/hiviewdfx # DFX主仓,用于存放编译相关配置 +├── hiview # hiview部件,包含插件平台和事件分发能力 +├── hiview_lite # hiview_lite部件,包含轻量系统的日志任务能力 +├── hilog # hilog部件,包含标准系统的流水日志能力 +├── hilog_lite # hilog_lite部件,包含轻量和小型系统的流水日志能力 +├── hievent_lite # hievent_lite部件,包含轻量系统的事件日志能力 +├── hiappevent # hiappevent部件,包含应用事件记录接口及框架 +├── hisysevent # hisysevent部件,包含系统事件记录接口及服务 +├── faultloggerd # faultloggerd部件,包含应用故障日志采集服务 +``` + +## 相关仓 + +**DFX子系统** + +[hiviewdfx\_hiview](https://gitee.com/openharmony/hiviewdfx_hiview/blob/master/README_zh.md) + +[hiviewdfx\_hilog](https://gitee.com/openharmony/hiviewdfx_hilog/blob/master/README_zh.md) + +[hiviewdfx\_hiappevent](https://gitee.com/openharmony/hiviewdfx_hiappevent/blob/master/README_zh.md) + +[hiviewdfx\_hisysevent](https://gitee.com/openharmony/hiviewdfx_hisysevent/blob/master/README_zh.md) + +[hiviewdfx\_faultloggerd](https://gitee.com/openharmony/hiviewdfx_faultloggerd/blob/master/README_zh.md) + +[hiviewdfx\_hilog\_lite](https://gitee.com/openharmony/hiviewdfx_hilog_lite/blob/master/README_zh.md) + +[hiviewdfx\_hievent\_lite](https://gitee.com/openharmony/hiviewdfx_hievent_lite/blob/master/README_zh.md) + +[hiviewdfx\_hiview\_lite](https://gitee.com/openharmony/hiviewdfx_hiview_lite/blob/master/README_zh.md) + diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/01.JSUI\346\241\206\346\236\266\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/05.JS-UI\346\241\206\346\236\266\345\255\220\347\263\273\347\273\237.md" similarity index 34% rename from "website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/01.JSUI\346\241\206\346\236\266\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/05.JS-UI\346\241\206\346\236\266\345\255\220\347\263\273\347\273\237.md" index 0c85efa914332e5eaeeb06f9dcfcb5a834f299b7..0d965b0201e00cfbdca20a256f1f381826ba778e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/01.JSUI\346\241\206\346\236\266\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/05.JS-UI\346\241\206\346\236\266\345\255\220\347\263\273\347\273\237.md" @@ -1,6 +1,6 @@ --- -title: JSUI框架概述 -permalink: /pages/000a00 +title: JS-UI框架子系统 +permalink: /pages/00000104 navbar: true sidebar: true prev: true @@ -9,28 +9,30 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:27 --- -# JS UI框架概述 +# JS UI框架子系统 -- [基础能力](#section1393616301083) -- [整体架构](#section105231413161115) +- [简介](#section11660541593) +- [目录](#section179173014915) +- [使用](#section1711605017917) +- [相关仓](#section1599816111011) -JS UI框架是OpenHarmony UI开发框架,提供基础类、容器类、画布类等UI组件和标准CSS动画能力,支持类Web范式编程。 +## 简介 -## 基础能力 +JS UI框架是OpenHarmony UI开发框架,提供基础类、容器类、画布类等UI组件和标准CSS动画能力,支持类Web范式编程。 - **类Web范式编程** JS UI框架采用类HTML和CSS Web编程语言作为页面布局和页面样式的开发语言,页面业务逻辑则支持ECMAScript规范的JavaScript语言。JS UI框架提供的类Web编程范式,可以让开发者避免编写UI状态切换的代码,视图配置信息更加直观。 +**图 1** JS UI框架架构 -## 整体架构 -JS UI框架包括应用层(Application)、前端框架层(Framework)、引擎层(Engine)和平台适配层(Porting Layer)。 +![](/images/readme/figures/zh-cn_image_0000001077953992.png) -![](/images/zh-cn/application-dev/ui/figures/zh-cn_image_0000001077953992.png) +JS UI框架包括应用层(Application)、前端框架层(Framework)、引擎层(Engine)和平台适配层(Porting Layer)。 - **Application** @@ -49,3 +51,83 @@ JS UI框架包括应用层(Application)、前端框架层(Framework)、 适配层主要完成对平台层进行抽象,提供抽象接口,可以对接到系统平台。比如:事件对接、渲染管线对接和系统生命周期对接等。 +## 目录 + +JS UI开发框架源代码在/foundation/ace下,目录结构如下图所示: + +``` +/foundation/ace +├── ace_engine # JS UI框架 +├── ace_engine_lite # 轻量级JS UI框架 +└── napi # JS API扩展Native开发模块 +``` + +## 使用 + +- JS FA开发目录 + +新建工程的JS目录如下图所示。 + +**图 2** JS FA开发目录 +![](/images/readme/figures/JS-FA开发目录.png "JS-FA开发目录") + +在工程目录中:i18n下存放多语言的json文件;pages文件夹下存放多个页面,每个页面由hml、css和js文件组成。 + +- **main \> js \> default \> i18n \> en-US.json:**此文件定义了在英文模式下页面显示的变量内容。同理,zh-CN.json中定义了中文模式下的页面内容。 + + ``` + { + "strings": { + "hello": "Hello", + "world": "World" + } + } + ``` + +- **main \> js \> default \> pages \> index \> index.hml:**此文件定义了index页面的布局、index页面中用到的组件,以及这些组件的层级关系。例如:index.hml文件中包含了一个text组件,内容为“Hello World”文本。 + + ``` +
+ + {{ $t('strings.hello') }} {{title}} + +
+ ``` + +- **main \> js \> default \> pages \> index \> index.css:**此文件定义了index页面的样式。例如:index.css文件定义了“container”和“title”的样式。 + + ``` + .container { + flex-direction: column; + justify-content: center; + align-items: center; + } + .title { + font-size: 100px; + } + ``` + +- **main \> js \> default \> pages \> index \> index.js:**此文件定义了index页面的业务逻辑,比如数据绑定、事件处理等。例如:变量“title”赋值为字符串“World”。 + + ``` + export default { + data: { + title: '', + }, + onInit() { + this.title = this.$t('strings.world'); + }, + } + ``` + + +## 相关仓 + +**JS UI框架子系统** + +ace\_ace\_engine + +ace\_ace\_engine\_lite + +ace\_napi + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/06.Misc\350\275\257\344\273\266\346\234\215\345\212\241\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/06.Misc\350\275\257\344\273\266\346\234\215\345\212\241\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..c3cfefa7962ab051b79aefa75e5429080f491418 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/06.Misc\350\275\257\344\273\266\346\234\215\345\212\241\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,39 @@ +--- +title: Misc软件服务子系统 +permalink: /pages/00000105 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# Misc软件服务子系统 + +- [简介](#section11660541593) +- [目录](#section161941989596) +- [相关仓](#section1371113476307) + +## 简介 + +提供了设置系统时间的接口。 + +**图 1** 子系统架构图 +![](/images/readme/figures/子系统架构图.png "子系统架构图") + +## 目录 + +``` +/base/miscservices +└── time # 时间服务组件 +``` + +## 相关仓 + +**Misc软件服务子系统** + +miscservices\_time + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/07.XTS\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/07.XTS\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..55db176d9fd130912a32cfeea7c2b12374c8dcb6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/07.XTS\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,668 @@ +--- +title: XTS子系统 +permalink: /pages/00000106 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# XTS子系统 + +- [简介](#section465982318513) +- [系统类型](#section125090457443) +- [目录](#section161941989596) +- [约束](#section119744591305) +- [使用说明](#section137768191623) +- [用例开发指导](#section3695134065513) + - [C语言用例开发编译指导(适用于轻量系统产品用例开发)](#section198193336544) + - [C语言用例执行指导(适用于轻量系统产品用例开发)](#section13820233175418) + - [C++语言用例开发编译指导(适用于小型系统、标准系统用例开发)](#section3822123311540) + - [C++语言用例执行指导(适用于小型系统、标准系统用例开发)](#section128222336544) + - [JS语言用例开发指导(适用于标准系统)](#section159801435165220) + - [JS语言用例编译打包指导(适用于标准系统)](#section445519106559) + +- [相关仓](#section1371113476307) + +## 简介 + +XTS子系统是OpenHarmony生态认证测试套件的集合,当前包括acts(application compatibility test suite)应用兼容性测试套件,后续会拓展dcts(device compatibility test suite)设备兼容性测试套件等。 + +XTS子系统当前包括acts与tools软件包: + +- acts,存放acts相关测试用例源码与配置文件,其目的是帮助终端设备厂商尽早发现软件与OpenHarmony的不兼容性,确保软件在整个开发过程中满足OpenHarmony的兼容性要求。 +- tools,存放acts相关测试用例开发框架。 + +## 系统类型 + +OpenHarmony支持如下几种系统类型: + +- 轻量系统(mini system) + + 面向MCU类处理器例如Arm Cortex-M、RISC-V 32位的设备,硬件资源极其有限,支持的设备最小内存为128KiB,可以提供多种轻量级网络协议,轻量级的图形框架,以及丰富的IOT总线读写部件等。可支撑的产品如智能家居领域的连接类模组、传感器设备、穿戴类设备等。 + +- 小型系统(small system) + + 面向应用处理器例如Arm Cortex-A的设备,支持的设备最小内存为1MiB,可以提供更高的安全能力、标准的图形框架、视频编解码的多媒体能力。可支撑的产品如智能家居领域的IP Camera、电子猫眼、路由器以及智慧出行域的行车记录仪等。 + +- 标准系统(standard system) + + 面向应用处理器例如Arm Cortex-A的设备,支持的设备最小内存为128MiB,可以提供增强的交互能力、3D GPU以及硬件合成能力、更多控件以及动效更丰富的图形能力、完整的应用框架。可支撑的产品如高端的冰箱显示屏。 + + +## 目录 + +``` +/test/xts +├── acts # 测试代码存放目录 +│ └── subsystem # 标准系统子系统测试用例源码存放目录 +│ └── subsystem_lite # 轻量系统、小型系统子系统测试用例源码存放目录 +│ └── BUILD.gn # 标准系统测试用例编译配置 +│ └── build_lite # 轻量系统、小型系统测试用例编译配置存放目录 +│ └── BUILD.gn # 轻量系统、小型系统测试用例编译配置 +└── tools # 测试工具代码存放目录 +``` + +## 约束 + +轻量系统用例开发语言是C,小型系统用例开发语言是C++。 + +## 使用说明 + +**表 1** 用例级别说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

级别名称

+

基本定义

+

测试范围

+

Level0

+

冒烟

+

验证关键功能点基本功能/最基本DFX属性在最常见输入下的表现,通过表示功能基本可运行。

+

Level1

+

基本

+

验证各功能点基本功能/基本DFX属性在常见输入下的表现,通过表示功能基本可测试。

+

Level2

+

重要

+

验证各功能点的基本功能/基本DFX属性在常规输入/常见异常情况下的表现,通过表示功能基本正常可用,可开展Beta。

+

Level3

+

一般

+

验证各功能点的全部功能/全部DFX属性在各种常规/非常规输入组合下,或各种正常/异常预置条件组合下的表现。

+

Level4

+

生僻

+

验证关键功能点在极端异常预置条件下、用户难以触及的异常输入组合下的表现。

+
+ +**表 2** 用例粒度说明 + + + + + + + + + + + + + + + + + + + + +

用例规模

+

被测试对象

+

测试环境

+

LargeTest

+

业务功能/全场景特性/整机及场景级DFX

+

尽量使用贴近真实的环境设备

+

MediumTest

+

模块/子系统集成至设备后的功能/DFX

+

使用真实的单设备进行验证,可进行消息模拟,尽量不对函数进行MOCK

+

SmallTest

+

模块/类/函数

+

在开发者个人环境进行测试,尽量不依赖其他模块,存在大量的MOCK

+
+ +**表 3** 测试类型说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

测试类型名称

+

测试类型定义

+

Function

+

验证被测对象提供给用户的业务功能实现正确性的测试项,这里的“用户”可以是终端用户或开发者,功能包括业务功能及平台功能

+

Performance

+

验证被测对象在特定预置条件/负载模型下的处理能力的测试项,“处理能力”一般以单位时间内可处理的业务量来衡量,如呼叫/秒,帧率/秒,事件处理量/秒等

+

Power

+

验证被测对象在特定预置条件/负载模型下在一定时间内能源消耗量的测试项

+

Reliability

+

验证被测对象在正常/异常输入情况下,或业务量压力和长时间连续运行压力情况下业务表现的测试项,含稳定性、压力、故障注入、Monkey测试项

+

Security

+

验证系统对恶意威胁的防护能力,威胁包括但不限于未授权访问、使用、泄露、破坏、修改、毁灭,以保障信息的机密性、完整性和可用性; 验证系统对用户隐私的保护能力,保障用户的隐私数据被收集、使用、保有、披露和处置符合法律规范,保障用户的隐私权; 验证对各类安全规范的遵从情况,如安全设计规范、安全红线、工信部安全认证规范等,保障安全相关法律法规的合规。

+

Global

+

验证被测对象在是否具有国际化数据支持和本地化能力的测试项,包括语言显示、输入/输出习惯、时间显示、区域特性如货币时间禁忌等等

+

Compatibility

+

当被测对象为应用时,包括被测对象对于自身数据的后向兼容性、对于系统的前后向兼容性、对于不同用户数据(如播放器之音频文件格式/智能短信之用户短信内容)的兼容性测试项; 当被测对象为系统时,包括被测系统对于系统自身数据的后向兼容性、以及对于生态中常用应用的兼容性测试项;当被测对象为软件时,包括被测系统对于相关的硬件的兼容性;

+

User

+

验证被测对象在真实用户场景下的用户体验感受的测试项,注意此种情况下没有客观的“正确”与“失败”,所有的结论及评价都应该来自于用户

+

Standard

+

验证被测对象对于行业及公司内标准/协议/规范的遵从情况的测试项,注意此处的“标准”不包含任何安全标准,针对安全标准的测试项划归为“安全测试”类型

+

Safety

+

验证被测对象的Safety属性,避免产品可能对人身安全、健康以及产品本身带来的危害。

+

Resilience

+

验证被测对象的韧性属性,确保系统受攻击时承受并保持在有定义的运行状态(包括降级)、恢复并适应攻击以保障Mission达成。

+
+ +## 用例开发指导 + +根据测试系统选择测试框架和对应测试用例语言。 + +**表 4** 系统和测试框架、开发语言对应关系 + + + + + + + + + + + + + + + + + + + + +

系统

+

测试框架

+

语言

+

轻量系统

+

hctest

+

c

+

小型系统

+

hcpptest

+

c++

+

标准系统

+

HJSUnit、hcpptest

+

js、c++

+
+ +### C语言用例开发编译指导(适用于轻量系统产品用例开发) + +**示例:轻量系统测试用例开发** + +当前使用的测试框架是hctest,hctest测试框架支持使用C语言编写测试用例,是在开源测试框架unity的基础上进行增强和适配。 + +1. 用例目录规范:测试用例存储到test/xts/acts仓中 + + ``` + ├── acts + │ └──subsystem_lite + │ │ └── module_hal + │ │ │ └── BUILD.gn + │ │ │ └── src + │ └──build_lite + │ │ └── BUILD.gn + ``` + +2. src目录下用例编写样例。 + + 1.引用测试框架 + + ``` + #include "hctest.h" + ``` + + 2. 使用宏定义LITE\_TEST\_SUIT定义子系统、模块、测试套件名称 + + ``` + /** + * @brief register a test suit named "IntTestSuite" + * @param test subsystem name + * @param example module name + * @param IntTestSuite test suit name + */ + LITE_TEST_SUIT(test, example, IntTestSuite); + ``` + + 3. 定义Setup与TearDown + + 命名方式:测试套件名称+Setup,测试套件名称+TearDown。 + + Setup与TearDown必须存在,可以为空函数。 + + 4. 使用宏定义LITE\_TEST\_CASE写测试用例 + + 包括三个参数:测试套件名称,测试用例名称,用例属性(测试类型、用例粒度、用例级别)。 + + ``` + LITE_TEST_CASE(IntTestSuite, TestCase001, Function | MediumTest | Level1) + { + //do something + }; + ``` + + 5. 使用宏定义 RUN\_TEST\_SUITE注册测试套件 + + ``` + RUN_TEST_SUITE(IntTestSuite); + ``` + +3. 测试模块的配置文件(BUILD.gn)样例: + + 在每个测试模块目录下新建BUILD.gn编译文件,用于指定编译后静态库的名称、依赖的头文件、依赖的库等;具体写法如下: + + ``` + import("//test/xts/tools/lite/build/suite_lite.gni") + hctest_suite("ActsDemoTest") { + suite_name = "acts" + sources = [ + "src/test_demo.c", + ] + include_dirs = [ ] + cflags = [ "-Wno-error" ] + } + ``` + +4. acts下BUILD.gn增加编译选项。 + + 需要将测试模块加入到acts目录下的编译脚本中,编译脚本路径:test/xts/acts/build\_lite/BUILD.gn。 + + ``` + lite_component("acts") { + ... + if(board_name == "liteos_m") { + features += [ + ... + "//xts/acts/subsystem_lite/module_hal:ActsDemoTest" + ] + } + } + ``` + +5. 测试套件编译命令。 + + 随版本编译,debug版本编译时会同步编译acts测试套件 + + >![](/images/readme/public_sys-resources/icon-note.gif) **说明:** + >acts测试套件编译中间件为静态库,最终链接到版本镜像中 。 + + +### C语言用例执行指导(适用于轻量系统产品用例开发) + +**示例:轻量系统测试用例执行** + +将版本镜像烧录进开发板。 + +**测试步骤** + +1. 使用串口工具登录开发板,并保存串口打印信息。 +2. 重启设备,查看串口日志。 + +**测试结果分析指导** + +基于串口打印日志进行分析; + +每个测试套件执行以Start to run test suite开始,以xx Tests xx Failures xx Ignored结束。 + +### C++语言用例开发编译指导(适用于小型系统、标准系统用例开发) + +**示例:小型系统测试用例开发**(标准系统参考具体样例目录:global/i18n\_standard) + +当前使用的测试框架是hcpptest,hcpptest测试框架是在开源的googletest测试框架的基础上进行的增强和适配。 + +1. 规范用例目录:测试用例存储到test/xts/acts仓中。 + + ``` + ├── acts + │ └──subsystem_lite + │ │ └── module_posix + │ │ │ └── BUILD.gn + │ │ │ └── src + │ └──build_lite + │ │ └── BUILD.gn + ``` + +2. 测试模块src下用例编写样例: + + 1. 引用测试框架: + + 需要引用gtest.h 如:\#include "gtest/gtest.h" + + ``` + #include "gtest/gtest.h" + ``` + + 2. 定义Setup与TearDown + + ``` + using namespace std; + using namespace testing::ext; + class TestSuite: public testing::Test { + protected: + // Preset action of the test suite, which is executed before the first test case + static void SetUpTestCase(void){ + } + // Test suite cleanup action, which is executed after the last test case + static void TearDownTestCase(void){ + } + // Preset action of the test case + virtual void SetUp() + { + } + // Cleanup action of the test case + virtual void TearDown() + { + } + }; + ``` + + 3. 使用宏定义HWTEST或HWTEST\_F写测试用例 + + 普通测试用例的定义:HWTEST(测试套名称, 测试用例名称, 用例标注)。 + + 包含SetUp和TearDown的测试用例的定义 :HWTEST\_F(测试套名称, 测试用例名称,用例标注)。 + + 宏定义包括三个参数:测试套件名称,测试用例名称,用例属性(测试类型、用例粒度、用例级别)。 + + ``` + HWTEST_F(TestSuite, TestCase_0001, Function | MediumTest | Level1) { + // do something + } + ``` + +3. 测试模块下用例配置文件(BUILD.gn)样例: + + 每个测试模块目录下新建BUILD.gn编译文件,用于指定编译后可执行文件的名称、依赖的头文件、依赖的库等;具体写法如下。每个测试模块将独立编译成.bin可执行文件, 该文件可直接push到单板上进行测试。 + + 举例: + + ``` + import("//test/xts/tools/lite/build/suite_lite.gni") + hcpptest_suite("ActsDemoTest") { + suite_name = "acts" + sources = [ + "src/TestDemo.cpp" + ] + + include_dirs = [ + "src", + ... + ] + deps = [ + ... + ] + cflags = [ "-Wno-error" ] + } + + ``` + +4. acts目录下增加编译选项(BUILD.gn)样例: + + 将测试模块加入到acts目录下的编译脚本中,编译脚本为:test/xts/acts/build\_lite/BUILD.gn。 + + ``` + lite_component("acts") { + ... + else if(board_name == "liteos_a") { + features += [ + ... + "//xts/acts/subsystem_lite/module_posix:ActsDemoTest" + ] + } + } + ``` + +5. 测试套件编译命令。 + + 随版本编译,debug版本编译时会同步编译acts测试套件 + + >![](/images/readme/public_sys-resources/icon-note.gif) **说明:** + >小型系统acts独立编译成可执行文件(bin格式), 在编译产物的suites\\acts目录下归档。 + + +### C++语言用例执行指导(适用于小型系统、标准系统用例开发) + +**示例:小型系统测试用例执行** + +目前的用例执行采用nfs共享的方式,mount到单板去执行。 + +**环境搭建** + +1. 使用有限网线或无线将开发板与PC进行连接。 +2. 开发板配置IP、子网掩码、网关,确保开发板与PC处于同一个网段。 +3. PC安装nfs服务器并完成注册,启动nfs服务。 +4. 开发板配置mount命令,确保开发板可以访问PC端的nfs共享文件。 + + 格式:mount \[nfs服务器IP\]:\[/nfs共享目录\] \[/开发板目录\] nfs + + 举例: + + ``` + mount 192.168.1.10:/nfs /nfs nfs + ``` + + +**用例执行** + +测试套件执行 ActsDemoTest.bin 触发用例执行,基于串口打印日志进行分析。 + +### JS语言用例开发指导(适用于标准系统) + +当前使用的测试框架是HJSUnit,用于支撑OpenHarmony application测试(特指基于JS应用框架使用 Javascript 语言开发的 APP)进行自动化测试。 + +**用例编写基础语法** + +测试用例为 js 语言,必须满足 JavaScript 语言编程规范: + +**表 5** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

用例语法

+

描述

+

要求

+

beforeAll

+

测试套级别的预置条件,在所有测试用例开始前执行且仅执行一次,支持一个参数:预置动作函数

+

可选

+

afterAll

+

测试套级别的清理条件,在所有测试用例结束后执行且仅执行一次,支持一个参数:清理动作函数

+

可选

+

beforeEach

+

测试用例级别的预置条件,在每条测试用例开始前执行,执行次数与 it 定义的测试用例数一致,支持一个参数:预置动作函数

+

可选

+

afterEach

+

测试用例级别的清理条件,在每条测试用例结束后执行,执行次数与 it 定义的测试用例数一致,支持一个参数:清理动作函数

+

可选

+

describe

+

定义一个测试套,支持两个参数:测试套名称和测试套函数; describe 支持嵌套,每个 describe 内均可以定义 beforeAll 、beforeEach 、afterEach 和 afterAll

+

必选

+

it

+

定义一条测试用例,支持三个参数:用例名称,过滤参数和用例函数

+

备注:

+

过滤参数:过滤参数为一个 32 位的 Int 类型参数,0 位 置1表示不筛选、默认执行;0-10 位 置1表示测试用例类型;16-18 位 置1表示测试用例规模;24-28 位 置1表示测试层级

+

测试用例类型。置位0-10分别表示:FUNCTION 方法类测试、PERFORMANCE 性能类测试、POWER 功耗类测试、RELIABILITY 可靠性测试、SECURITY 安全合规测试、GLOBAL 整体性测试、COMPATIBILITY 兼容性测试、USER 用户测试、STANDARD 标准测试、SAFETY 安全特性测试,RESILIENCE 压力测试。

+

测试用例规模。置位16-18分别表示:SMALL 小型测试、MEDIUM 中型测试、LARGE 大型测试。

+

测试层级。置位24-28分别表示:LEVEL0-0 级测试、LEVEL1-1 级测试、LEVEL2-2 级测试、LEVEL3-3 级测试、LEVEL4-4 级测试。

+

必选

+
+ +用例编写语法采用 jasmine 的标准语法,格式支持ES6格式。 + +1. 规范用例目录:测试用例存储到entry/src/main/js/test目录。 + + ``` + ├── BUILD.gn + │ └──entry + │ │ └──src + │ │ │ └──main + │ │ │ │ └──js + │ │ │ │ │ └──default + │ │ │ │ │ │ └──pages + │ │ │ │ │ │ │ └──index + │ │ │ │ │ │ │ │ └──index.js # 入口文件 + │ │ │ │ │ └──test # 测试代码存放目录 + │ │ │ └── resources # hap资源存放目录 + │ │ │ └── config.json # hap配置文件 + ``` + +2. index.js示例 + + ``` + // 拉起js测试框架,加载测试用例 + import {Core, ExpectExtend} from 'deccjsunit/index' + + export default { + data: { + title: "" + }, + onInit() { + this.title = this.$t('strings.world'); + }, + onShow() { + console.info('onShow finish') + const core = Core.getInstance() + const expectExtend = new ExpectExtend({ + 'id': 'extend' + }) + core.addService('expect', expectExtend) + core.init() + const configService = core.getDefaultService('config') + configService.setConfig(this) + require('../../../test/List.test') + core.execute() + }, + onReady() { + }, + } + ``` + +3. 单元测试用例示例 + + ``` + // Example1: 使用HJSUnit进行单元测试 + describe('appInfoTest', function () { + it('app_info_test_001', 0, function () { + var info = app.getInfo() + expect(info.versionName).assertEqual('1.0') + expect(info.versionCode).assertEqual('3') + }) + }) + ``` + + +### JS语言用例编译打包指导(适用于标准系统) + +hap包编译请参考[标准系统js应用开发指导](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/build_overview-0000001055075201)。 + +## 相关仓 + +xts\_acts + +xts\_tools + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/08.\344\272\213\344\273\266\351\200\232\347\237\245\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/08.\344\272\213\344\273\266\351\200\232\347\237\245\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..75912e286e78ae22d1d6abdb6fa614e22b8eeb7a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/08.\344\272\213\344\273\266\351\200\232\347\237\245\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,59 @@ +--- +title: 事件通知子系统 +permalink: /pages/00000107 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 事件通知子系统 + +## 简介 + +OpenHarmony通过CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力。 + +公共事件可分为系统公共事件和自定义公共事件。 + +- 系统公共事件:系统将收集到的事件信息,根据系统策略发送给订阅该事件的用户程序。 例如:系统关键服务发布的系统事件(例如:hap安装,更新,卸载等)。 + +- 自定义公共事件:应用自定义一些公共事件用来实现跨应用的事件通信能力。 + +每个应用都可以按需订阅公共事件,订阅成功且公共事件发布,系统会把其发送给应用。这些公共事件可能来自系统、其他应用和应用自身。 + +### 架构图 + +![](/images/readme/figures/cesfwk_architecture_diagram.png "公共事件服务架构图") + +## 目录 + +``` +/base/notification/ces_standard/ +│── frameworks # 组件目录 +│ |── common/log # 日志组件目录 +│ |── core # 组件native接口内部实现 +│ ├── native # 组件native接口实现 +│── interface # 对外接口目录 +| |── innerkits # 组件native接口定义 +| |── kits/napi # 组件napi实现 +├── sa_profile # 组件服务配置 +├── services # 组件服务实现 +├── tools # 组件工具实现 +│── ohos.build # 组件编译脚本 + +``` + +## 使用说明 + +* [详细说明请参考: CommonEvent开发指南](/pages/extra/d0f02a/) + +## 相关仓 + +事件通知子系统 + +**notification_ces_standard** + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/09.\345\205\203\350\203\275\345\212\233\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/09.\345\205\203\350\203\275\345\212\233\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..4e1485f032180dec923e655393304b554f1155d7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/09.\345\205\203\350\203\275\345\212\233\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,147 @@ +--- +title: 元能力子系统 +permalink: /pages/00000108 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 元能力子系统 + +## 简介 + +**元能力子系统**实现对Ability的运行及生命周期进行统一的调度和管理,应用进程能够支撑多个Ability,Ability具有跨应用进程间和同一进程内调用的能力。Ability管理服务统一调度和管理应用中各Ability,并对Ability的生命周期变更进行管理。 + +![](/images/readme/figures/aafwk.png) + +**元能力子系统架构图说明:** + +- **Ability Kit**为Ability的运行提供基础的运行环境支撑。Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件,一个应用可以包含一个或多个Ability。Ability分为FA(Feature Ability)和PA(Particle Ability)两种类,其中FA支持Page Ability,PA支持Service Ability和Data Ability。 + +- **Ability管理服务(AbilityManagerService)**:用于协调各Ability运行关系、及对生命周期进行调度的系统服务。 + - Ability栈管理模块(AbilityStackManager)负责维护各个Ability之间跳转的先后关系。 + - 连接管理模块(AbilityConnectManager)是Ability管理服务对Service类型Ability连接管理的模块。 + - 数据管理模块(DataAbilityManager)是Ability管理服务对Data类型Ability管理的模块。 + - App管理服务调度模块(AppScheduler)提供Ability管理服务对用户程序管理服务进行调度管理的能力。 + - Ability调度模块(AbilityScheduler)提供对Ability进行调度管理的能力。 + - 生命周期调度模块(LifecycleDeal)是Ability管理服务对Ability的生命周期事件进行管理调度的模块。 + +**Ability生命周期介绍**(Ability Life Cycle)是Ability被调度到INACTIVE、ACTIVE、BACKGROUND等各个状态的统称(主要涉及PageAbility类型和ServiceAbility类型的Ability)。 + + - **PageAbility类型的Ability生命周期流转如下图所示** + +![PageAbility-Lifecycle](/images/readme/figures/page-ability-lifecycle.png) + + + + - **ServiceAbility类型的Ability生命周期流转如下图所示** + +![ServiceAbility-Lifecycle](/images/readme/figures/service-ability-lifecycle.png) + +**Ability生命周期状态说明:** + + - **UNINITIALIZED**:未初始状态,为临时状态,Ability被创建后会由UNINITIALIZED状态进入INITIAL状态。 + + - **INITIAL**:初始化状态,也表示停止状态,表示当前Ability未运行,Ability被启动后由INITIAL态进入INACTIVE状态。 + + - **INACTIVE**:未激活状态,表示当前窗口已显示但是无焦点状态,由于Window暂未支持焦点的概念,当前状态与ACTIVE一致。 + + - **ACTIVE**:前台激活状态,表示当前窗口已显示,并获取焦点,Ability在退到后台之前先由ACTIVE状态进入INACTIVE状态。 + + - **BACKGROUND**: 后台状态,表示当前Ability退到后台,Ability在被销毁后由BACKGROUND状态进入INITIAL状态,或者重新被激活后由BACKGROUND状态进入ACTIVE状态。 + +**PageAbility类型Ability生命周期回调如下图所示:** + +![PageAbility-Lifecycel-Callbacks](/images/readme/figures/page-ability-lifecycle-callbacks.png) + + + +**ServiceAbility类型Ability生命周期回调如下图所示:** + +![Service-Ability-Lifecycle-Callbacks](/images/readme/figures/service-ability-lifecycle-callbacks.jpg) + + + +## 目录 + +``` +foundation/ +└──foundation/aafwk/standard +   ├── frameworks +   │   └── kits +   │   └── ability # AbilityKit实现的核心代码 +   ├── interfaces +   │   └── innerkits +   │      └── want # Ability之间交互的信息载体的对外接口 + └── services + ├── abilitymgr # Ability管理服务框架代码 +   ├── common # 日志组件目录 +   ├── test # 测试目录 +   └── tools # aa命令代码目录 +``` + +## 使用说明 + +当前版本用户程序框架不具备权限管理的能力。 + +以下模块的JS接口为非正式API,仅供Launcher、Settings、SystemUI等系统应用使用,不排除对这些接口进行变更的可能性,后续版本将提供正式API。 + +- @ohos.feature_ability.d.ts + +- @ohos.napi_ability_manager.d.ts + +- abilityinfo.d.ts + +- abilitymissioninfo.d.ts + +- applicationinfo.d.ts + +- appprocessstate.ts + +- common.d.ts + +- elementname.d.ts + +- moduleinfo.d.ts + +- processinfo.d.ts + +- want.d.ts + +## **aa命令** + +**aa help** + +| 命令 | 描述 | +| ------- | ------------------ | +| aa help | 显示aa命令帮助信息 | + +**aa start** + +| 命令 | 描述 | +| --------------------------------------------------------- | ------------------------ | +| aa start [-d ] -a -b | 启动ability,设备ID 可空 | + +``` +示例: +aa start -d 12345 -a com.ohos.app.MainAbility -b com.ohos.app +``` + +**aa dump** + +| 命令 | 描述 | +| ---------- | --------------------- | +| aa dump -a | 打印栈中的Ability信息 | + +## 相关仓 +元能力子系统 + +appexecfwk_standard + +**aafwk_standard** + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/10.\345\205\250\347\220\203\345\214\226\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/10.\345\205\250\347\220\203\345\214\226\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..6441b9f7ec5a609772bdbce08bb5db02bdb31e44 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/10.\345\205\250\347\220\203\345\214\226\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,108 @@ +--- +title: 全球化子系统 +permalink: /pages/00000109 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 全球化子系统 + +- [简介](#section11660541593) +- [系统架构](#section1558604311012) +- [目录](#section161941989596) +- [相关仓](#section1371113476307) + +## 简介 + +当OpenHarmony设备或应用在全球不同区域使用时,系统和应用需要满足不同市场用户关于语言、文化习俗的需求。全球化子系统提供支持多语言、多文化的能力,包括: + +- **资源管理能力** + + 根据设备类型、系统配置等信息,对系统资源和应用资源加载、解析和初始化,对外提供获取字符串、媒体等资源的接口。 + +- **国际化能力** + + 提供底层的资源回溯能力,同时对外提供丰富的国际化接口,包括时间日期格式化、数字格式化、电话号码格式化、单复数等。 + + +## 系统架构 + +**图 1** 全球化子系统架构图 + + +![](/images/readme/figures/全球化子系统架构图.png "全球化子系统架构图") + +## 目录 + +全球化子系统源代码在/base/global目录下。 + +轻量系统和小型系统的目录结构如下所示: + +``` +/base/global/ +├── i18n_lite # 国际化框架代码仓 +│ ├── frameworks # 国际化框架核心代码 +│ │ ├── i18n # 国际化模块 +│ │ │ ├── include # 接口文件 +│ │ │ ├── src # 实现代码 +│ │ │ └── test # 测试用例 +│ ├── interfaces # 国际化框架接口 +│ │ ├── kits # 应用接口 +│ │ │ ├── i18n # C/C++国际化能力接口 +│ │ │ └── js # JavaScript接口的C/C++支持 +├── resmgr_lite # 资源管理框架代码仓 +│ ├── frameworks # 资源管理框架核心代码 +│ │ ├── resmgr # 资源解析核心代码 +│ │ │ ├── include # 接口文件 +│ │ │ └── src # 实现代码 +│ ├── interfaces # 资源管理框架接口 +│ │ └── innerkits # 资源管理框架对子系统间接口 +├── cust_lite # 定制框架代码仓 +│ ├── frameworks # 定制框架核心代码 +│ │ ├── cust_lite # 定制框架模块 +│ │ │ ├── src # 实现代码 +│ │ │ └── test # 测试代码 +│ ├── interfaces # 定制框架接口 +│ │ └── innerkits # 定制框架子系统间接口 +``` + +标准系统的目录结构如下所示: + +``` +/base/global +├── i18n_standard # 国际化框架代码仓 +│ ├── frameworks # 国际化框架核心代码 +│ ├── interfaces # 国际化框架接口 +│ │ ├── js # 国际化框架JavaScript接口 +│ │ └── native # 国际化框架native接口 +├── resmgr_standard # 资源管理代码仓 +│ ├── frameworks # 资源管理核心代码 +│ │ ├── resmgr # 资源解析核心代码 +│ │ │ ├── include # 资源管理头文件 +│ │ │ ├── src # 资源管理实现代码 +│ │ │ └── test # 资源管理测试代码 +│ ├── interfaces # 资源管理接口 +│ │ ├── innerkits # 资源管理对子系统间接口 +│ │ └── js # 资源管理JavaScript接口 +``` + +## 相关仓 + +**全球化子系统** + +global\_cust\_lite + +global\_i18n\_lite + +global\_i18n\_standard + +global\_resmgr\_lite + +global\_resmgr\_standard + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/11.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/11.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223.md" new file mode 100644 index 0000000000000000000000000000000000000000..32cc18c93fe0c08bd54cb54ec9a57ae03ec50cc2 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/11.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223.md" @@ -0,0 +1,56 @@ +--- +title: 公共基础库 +permalink: /pages/0000010a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 公共基础库 + +- [简介](#section11660541593) +- [目录](#section17271017133915) +- [相关仓](#section1249817110914) + +## 简介 + +公共基础类库提供了一些常用的C、C++开发增强API。包括如下部分: + +**C++部分:** + +- 文件、路径、字符串相关操作的能力增强接口; +- 读写锁、信号量、定时器、线程增强及线程池等接口; +- 安全数据容器、数据序列化等接口; +- 各子系统的错误码相关定义; +- C语言安全函数接口。 + +**C部分:** + +- 简易的数据存取接口kv\_store; +- 标准文件相关操作HAL接口; +- 其它一些内部功能,如定时器等。 + +## 目录 + +``` +/utils + ├── native # 工具类的native层实现 + ├── ndk_libraries_config # ndk库的配置目录 + └── system # 系统相关的预定义值和安全策略配 +``` + +## 相关仓 + +**公共基础库子系统** + +utils + +utils\_native + +[utils\_native\_lite](https://gitee.com/openharmony/utils_native_lite) + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/12.\345\210\206\345\270\203\345\274\217\344\273\273\345\212\241\350\260\203\345\272\246\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/12.\345\210\206\345\270\203\345\274\217\344\273\273\345\212\241\350\260\203\345\272\246\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..b31924e350e9d207c10d664abcdfb486af5ddbcf --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/12.\345\210\206\345\270\203\345\274\217\344\273\273\345\212\241\350\260\203\345\272\246\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,63 @@ +--- +title: 分布式任务调度子系统 +permalink: /pages/0000010b +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 分布式任务调度子系统 + +- [简介](#section11660541593) +- [系统架构](#section13587185873516) +- [目录](#section161941989596) +- [相关仓](#section1371113476307) + +## 简介 + +分布式任务调度模块负责跨设备组件管理,提供访问和控制远程组件的能力,支持分布式场景下的应用协同。主要功能如下: + +- 远程启动元能力:跨设备拉起远端设备上的指定元能力。 +- 远程迁移元能力:将元能力跨设备迁移到远端设备。 +- 远程绑定元能力:跨设备绑定远端设备上的指定元能力。 +- 系统服务管理:提供系统服务的本地启动、注册、查询等功能;提供系统服务的跨设备查询功能。 + +## 系统架构 + +**图 1** 子系统架构图 + + +![](/images/readme/figures/dms-architecture_zh.png) + +## 目录 + +``` +/foundation/distributedschedule +├── dmsfwk # 分布式任务调度模块 +├── safwk # 系统服务框架模块 +├── samgr # 系统服务管理模块 +├── dms_fwk_lite # 轻量分布式任务调度模块 +├── safwk_lite # 轻量foundation进程 +├── samgr_lite # 轻量系统服务管理模块 +``` + +## 相关仓 + +**分布式任务调度子系统** + +distributedschedule\_dms\_fwk + +distributedschedule\_safwk + +distributedschedule\_samgr + +distributedschedule\_safwk\_lite + +hdistributedschedule\_samgr\_lite + +distributedschedule\_dms\_fwk\_lite \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/13.\345\210\206\345\270\203\345\274\217\346\225\260\346\215\256\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/13.\345\210\206\345\270\203\345\274\217\346\225\260\346\215\256\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..07a53ac1fca86105b33d5481c8aceda3dccf83cd --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/13.\345\210\206\345\270\203\345\274\217\346\225\260\346\215\256\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,122 @@ +--- +title: 分布式数据管理子系统 +permalink: /pages/0000010c +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 分布式数据管理子系统 + +- [简介](#section11660541593) +- [目录](#section161941989596) +- [说明](#section1312121216216) + - [本地数据管理说明](#section129654513264) + - [分布式数据服务说明](#section1961602912224) + +- [相关仓](#section1371113476307) + +## 简介 + +**子系统介绍** + +分布式数据管理子系统支持单设备的各种结构化数据的持久化,以及跨设备之间数据的同步、共享功能。开发者通过分布式数据管理子系统,能够方便地完成应用程序数据在不同终端设备间的无缝衔接,满足用户跨设备使用数据的一致性体验。 + +- 本地数据管理 + + 提供单设备上结构化数据的存储和访问能力。使用SQLite作为持久化存储引擎,提供了多种类型的本地数据库,分别是关系型数据库(Relational Database,RDB)和轻量级偏好数据库(Preferences),用以满足使用不同数据模型对应用数据进行持久化和访问的需求。 + + +- 分布式数据服务 + + 分布式数据服务支持数据跨设备相互同步,为用户提供在多种终端设备上一致的数据访问体验。通过结合帐号、应用和数据库三元组,分布式数据服务对数据进行隔离。在通过可信认证的设备间,分布式数据服务支持数据相互同步,提供跨设备的数据访问。 + + +**子系统架构** + +**图 1** 子系统架构图 + + +![](/images/readme/figures/zh-cn_image_0000001115748088.png) + +## 目录 + +子系统1-2层目录描述 + +``` +distributeddatamgr/ # 子系统目录 +├── appdatamgr # 本地数据管理组件目录 +└── distributeddatamgr # 分布式数据服务组件目录 + +third_party/ # 开源软件目录 +├── flatbuffers # flatbuffers代码目录 +└── sqlite # SQLite代码目录 +``` + +## 说明 + +### 本地数据管理说明 + +- 关系型数据库 + + 以下是几个基本概念: + + - **关系型数据库** + + 创建在关系模型基础上的数据库,以行和列的形式存储数据。 + + - **结果集** + + 指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便的拿到用户想要的数据。 + + - **SQLite数据库** + + 一款轻量级的数据库,是遵守ACID的关系型数据库组件。它是一个开源的项目 + + +- 轻量级偏好数据库 + + 以下是几个基本概念: + + - **Key-Value数据库** + + 一种以键值对存储数据的一种数据库。Key是关键字,Value是值。 + + - **非关系型数据库** + + 区别于关系数据库,不保证遵循ACID(Atomic、Consistency、Isolation及Durability)特性,不采用关系模型来组织数据,数据之间无关系,扩展性好。 + + - **偏好数据** + + 用户经常访问和使用的数据。 + + + +### 分布式数据服务说明 + +分布式数据服务(Distributed Data Service,DDS) 提供不同设备间数据库数据分布式的能力,主要采用KV数据模型: + +- **KV数据模型** + + “KV数据模型”是“Key-Value数据模型”的简称,“Key-Value”即“键-值”。它是一种NoSQL类型数据库,其数据以键值对的形式进行组织、索引和存储。 + + KV数据模型适合不涉及过多数据关系和业务关系的业务数据存储,比SQL数据库存储拥有更好的读写性能,同时在分布式场景中降低了数据库版本兼容和数据同步过程中冲突解决的复杂度而被广泛使用。分布式数据库也是基于KV数据模型,对外提供KV类型的访问接口。 + + +## 相关仓 + +分布式数据管理子系统 + +distributeddatamgr\_appdatamgr + +distributeddatamgr\_distributeddatamgr + +third\_party\_sqlite + +third\_party\_flatbuffers + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/14.\345\210\206\345\270\203\345\274\217\346\226\207\344\273\266\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/14.\345\210\206\345\270\203\345\274\217\346\226\207\344\273\266\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..140407e7fb842a640368b54cf1a57f3b494ad341 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/14.\345\210\206\345\270\203\345\274\217\346\226\207\344\273\266\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,293 @@ +--- +title: 分布式文件子系统 +permalink: /pages/0000010d +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 分布式文件子系统 + +- [简介](#section104mcpsimp) + - [系统架构](#section110mcpsimp) + +- [目录结构](#section113mcpsimp) +- [约束](#section117mcpsimp) +- [说明](#section125mcpsimp) + - [接口说明](#section127mcpsimp) + - [使用说明](#section149mcpsimp) + +- [相关仓](#section178mcpsimp) + +## 简介 + +分布式文件子系统当前向应用程序提供用于的 IO 的 JS 接口。其具体包括用于管理文件的基本文件接口,用于管理目录的基本目录接口,用于获取文件信息的统计接口,用于流式读写文件的流式接口,以及接收 URI 而非绝对路径的沙盒接口。 + +### 系统架构 + +当前分布式文件子系统仅面向应用提供本地 JS 文件接口,这些接口分别通过 FileIO 模块以及 File 模块提供。架构上,分布式文件子系统实现了自研的 LibN,其抽象了 NAPI 层接口,向分布式文件子系统提供包括基本类型系统、内存管理、通用编程模型在内的基本能力。本系统对外依赖 JS 开发框架提供将 JS 接口转换为 C++ 代码的能力,依赖用户程序框架提供应用相关目录,依赖 GLIBC Runtimes 提供 IO 能力。 + +**图 1** 分布式文件子系统架构图 +![](/images/readme/figures/分布式文件子系统架构图.png "分布式文件子系统架构图") + +## 目录结构 + +``` +foundation/distributeddatamgr/distributedfile +├── interfaces # 接口层代码 +│ └── kits # 对外接口 +``` + +## 约束 + +本地 IO 接口 + +- 目前仅支持 UTF-8/16 编码; +- 目前 URI 暂不支持外部存储目录; + +## 说明 + +### 接口说明 + +当前分布式文件子系统开放本地文件目录访问接口,按照功能,其可划分为如下几种类型: + +**表 1** 接口类型表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

接口类型

+

接口用途

+

相关模块

+

接口示例(类名.方法名)

+

基本文件接口

+

需要用户提供绝对路径或文件描述符(fd),提供创建、修改及访问文件,或修改文件权限的能力

+

@OHOS.distributedfile.fileio

+

accessSync

+

chownSync

+

chmodSync

+

基本目录接口

+

需要用户提供绝对路径,提供读取目录及判断文件类型的能力

+

@OHOS.distributedfile.fileio

+

Dir.openDirSync

+

基本Stat接口

+

需要用户提供绝对路径,提供包括文件大小、访问权限、修改时间在内的基本统计信息

+

@OHOS.distributedfile.fileio

+

Stat.statSync

+

流式文件接口

+

需要用户提供绝对路径或文件描述符,提供流式读写文件的能力

+

@OHOS.distributedfile.fileio

+

Stream.createStreamSync

+

Stream.fdopenStreamSync

+

沙盒文件接口

+

需要用户提供 URI,提供基本文件接口、基本目录接口及基本统计接口能力的子集能力,或这些能力的组合能力

+

@system.file

+

move

+

copy

+

list

+
+ +其中,沙盒文件接口所使用的 URI 具体可划分为三种类型: + +**表 2** URI类型表 + + + + + + + + + + + + + + + + + + + + + + + + +

目录类型

+

路径前缀

+

访问可见性

+

说明

+

临时目录

+

internal://cache/

+

仅本应用可见

+

可读写,随时可能清除,不保证持久性。一般用作下载临时目录或缓存目录。

+

应用私有目录

+

internal://app/

+

仅本应用可见

+

随应用卸载删除。

+

外部存储

+

internal://share/

+

所有应用可见

+

随应用卸载删除。其他应用在有相应权限的情况下可读写此目录下的文件。

+
+ +### 使用说明 + +当前分布式文件子系统所提供的 IO 接口,按照编程模型,可划分为如下几种类型: + +- 同步编程模型 + + 名称包含 Sync 的接口实现为同步模型。用户在调用这些接口的时候,将同步等待,直至执行完成,执行结果以函数返回值的形式返回。 + + 下例以只读的方式打开一个文件流,接着试图读取其中前 4096 个字节并将之转换为 UTF-8 编码的字符串,最后关闭该文件流。 + + ``` + import fileio from '@OHOS.distributedfile.fileio'; + + try { + var ss = fileio.Stream.createStreamSync("tmp", "r") + buf = new ArrayBuffer(4096) + ss.readSync(buf) + console.log(String.fromCharCode.apply(null, new Uint8Array(buf))) + ss.closeSync() + } + catch (e) { + console.log(e); + } + ``` + + +- 异步编程模型:Promise + + @OHOS.distributedfile.fileio 模块中,名称不含 Sync 的接口,在不提供最后一个函数型参数 callback 的时候,即实现为 Promsie 异步模型。Promise 异步模型是 OHOS 标准异步模型之一。用户在调用这些接口的时候,接口实现将异步执行任务,同时返回一个 promise 对象,其代表异步操作的结果。在返回的结果的个数超过一个时,其以对象属性的形式返回。 + + 下例通过 Promise 链依次完成:以只读方式打开文件流、尝试读取文件前 4096 个字节、显示读取内容的长度,最后关闭文件。 + + ``` + import fileio from '@OHOS.distributedfile.fileio'; + + try { + let openedStream + fileio.Stream.createStream("test.txt", "r") + .then(function (ss) { + openedStream = ss; + return ss.read(new ArrayBuffer(4096)) + }) + .then(function (res) { + console.log(res.bytesRead); + console.log(String.fromCharCode.apply(null, new Uint8Array(res.buffer))) + return openedStream.close() + }) + .then(function (undefined) { + console.log("Stream is closed") + }) + .catch(function (e) { + console.log(e) + }) + } catch (e) { + console.log(e) + } + ``` + + +- 异步编程模型:Callback + + @OHOS.distributedfile.fileio 模块中,名字不含 Sync 的接口,在提供最后一个函数性参数 callback 的时候,即实现为 Callback 异步模型。Callback 异步模型是 OHOS 标准异步模型之一。用户在调用这些接口的时候,接口实现将异步执行任务。任务执行结果以参数的形式提供给用户注册的回调函数。这些参数的第一个是 Error 或 undefined 类型,分别表示执行出错与正常。 + + 下例异步创建文件流,并在文件流的回调函数中异步读取文件的前 4096 字节,接着在读取文件的回调函数中异步关闭文件。 + + ``` + import fileio from '@OHOS.distributedfile.fileio'; + + try { + fileio.Stream.createStream("./testdir/test_stream.txt", "r", function (err, ss) { + if (!err) { + ss.read(new ArrayBuffer(4096), {}, function (err, buf, readLen) { + if (!err) { + console.log('readLen: ' + readLen) + console.log('data: ' + String.fromCharCode.apply(null, new Uint8Array(buf))) + } else { + console.log('Cannot read from the stream ' + err) + } + ss.close(function (err) { + console.log(`Stream is ${err ? 'not' : ''}closed`) + }); + }) + } else { + console.log('Cannot open the stream ' + err) + } + }) + } catch (e) { + console.log(e) + } + ``` + + +- 异步编程模型:Legacy + + @system.file 模块中的所有接口都实现为 Legacy 异步模型。用户在调用这些接口的时候,需要提供 success、fail 及 complete 三个回调。在正确提供参数的情况下,当异步任务完成后,接口会根据是否成功,分别调用 success 回调或 fail 回调,并最终调用 complete 回调。 + + 下例异步判断 URI 所指向的文件是否存在,并相应提供三个回调用于打印判断结果。 + + ``` + import file from '@system.file' + + file.access({ + uri: 'internal://app/test.txt', + success: function() { + console.log('call access success.'); + }, + fail: function(data, code) { + console.error('call fail callback fail, code: ' + code + ', data: ' + data); + }, + complete: function () { + console.log('call access finally.'); + } + }); + + console.log("file access tested done") + ``` + + +## 相关仓 + +**分布式文件** + +distributeddatamgr\_distributedfile + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/15.\345\210\206\345\270\203\345\274\217\350\275\257\346\200\273\347\272\277\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/15.\345\210\206\345\270\203\345\274\217\350\275\257\346\200\273\347\272\277\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..405a9fab1b4009d177e9ddaa87056e0d2288e46a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/15.\345\210\206\345\270\203\345\274\217\350\275\257\346\200\273\347\272\277\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,101 @@ +--- +title: 分布式软总线子系统 +permalink: /pages/0000010e +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 分布式软总线子系统 + +- [简介](#section11660541593) +- [系统架构](#section342962219551) +- [目录](#section161941989596) +- [约束](#section119744591305) +- [使用说明](#section1312121216216) + - [进程间通信](#section129654513264) + - [软总线](#section36252592710) + +- [相关仓](#section1371113476307) + +## 简介 + +分布式软总线子系统旨在为OpenHarmony系统提供的通信相关的能力,包括:WLAN服务能力、蓝牙服务能力、软总线、进程间通信RPC(Remote Procedure Call)等通信能力。 + +WLAN服务:为用户提供WLAN基础功能、P2P(peer-to-peer)功能和WLAN消息通知的相应服务,让应用可以通过WLAN和其他设备互联互通。 + +蓝牙服务:为应用提供传统蓝牙以及低功耗蓝牙相关功能和服务。 + +软总线:为应用和系统提供近场设备间分布式通信的能力,提供不区分通信方式的设备发现,连接,组网和传输功能。 + +进程间通信:提供不区分设备内或设备间的进程间通信能力。 + +## 系统架构 + +**图 1** 分布式软总线子系统架构图 + + +![](/images/readme/figures/zh-cn_image_0000001162307895.png) + +## 目录 + +分布式软总线子系统主要代码目录结构如下: + +``` +/foundation/communication +├── bluetooth # 蓝牙功能代码 +├── dsoftbus # 软总线功能代码 +├── ipc # 进程间通信代码 +└── wifi # WLAN功能代码 +``` + +## 约束 + +- 组网限制:必须确保设备在同一个局域网中。 + +## 使用说明 + +### 进程间通信 + +在使用RPC时,请求服务的一端进程可获取提供服务一端所在进程的代理 (Proxy),并通过此代理读写数据来实现进程间的数据通信,其详细过程如下: + +1. 实现服务端及其提供的能力。 +2. 请求服务的一端会建立一个服务提供端的代理对象,这个代理对象具备和服务提供端一样的功能,若想访问服务提供端中的某个方法,只需要访问代理对象中对应的方法即可。 +3. 服务提供端处理接收到的请求,处理完之后通过驱动返回处理结果给代理对象。 +4. 代理对象将请求结果进一步返回给请求服务端。 + +### 软总线 + +- 组网 + +1. 服务启动之后,获取已经在线的设备列表。 +2. 注册上下线监听,通过回调通知感知设备列表变化。 +3. 获取设备的Id、设备名称、设备类型。 +4. 获取指定设备的设备类型,组网类型,设备能力等更多信息。 +5. 进程退出时,删除上下线监听。 + +- 传输 + +1. 创建会话服务并注册监听回调函数。 +2. 待组网设备上线后,建立与指定设备的会话。 +3. 若会话获取成功,可发送数据。 +4. 待会话不使用时,关闭已打开的会话通道。 +5. 业务明确不使用分布式传输(如进程退出)时,移除已创建的会话服务。 + +## 相关仓 + +**分布式软总线子系统** + +communication\_bluetooth + +communication\_dsoftbus + +communication\_ipc + +communication\_wifi + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/16.\345\215\207\347\272\247\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/16.\345\215\207\347\272\247\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..6f123bfbf774675934e7d5e826faa229c5c34f38 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/16.\345\215\207\347\272\247\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,94 @@ +--- +title: 升级子系统 +permalink: /pages/0000010f +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 升级子系统 + +- [简介](#section184mcpsimp) +- [目录](#section212mcpsimp) +- [相关仓](#section251mcpsimp) + +## 简介 + +OpenHarmony升级子系统用来支持OpenHarmony设备的OTA\(Over The Air\)升级。整个升级子系统包括如下几块: + +1. 升级包制作工具 + + 升级包制作工具是使用python开发,运行在PC端用来制作升级包的工具。它首先会打包各个升级镜像,然后对升级包进行签名,同时生成升级包执行脚本,最后制作出升级包。工具生成升级脚本,设备侧解析执行脚本。最终完成所有的升级动作。 + + 升级包里面有两个文件,包括build\_tools.zip 和update.bin。 + + - build\_tools.zip:用来辅助升级的工具,包括升级的可执行文件和升级脚本 + - update.bin:TLV编码的文件,所有的升级内容按照TLV格式序列化存储,最终生成update.bin + + 工具对update.bin 和最终生成的升级包\(zip 压缩文件\)分别进行签名。 + +2. 升级服务 + + 升级服务是用来搜索,下载和触发升级。 + +3. 升级包安装 + + 升级包安装是升级子系统的核心功能,主要包括: + + 1. 从misc分区获取升级命令,根据不同的命令执行不同的任务。 + 2. 对升级包进行解压和合法性效验。 + 3. 启动升级进程,并解析出升级脚本。 + 4. 根据升级脚本安装各个组件包。 + 5. 完成升级后,进行后处理。如清理升级包,记录升级状态等。 + +4. 升级客户端 + + 升级客户端是用来触发搜包和下载的app。 + + +在进行应用的开发前,开发者应了解以下基本概念: + +- OTA + + Over The Air 的缩写。 OTA 是无线升级的一种方式。升级包通过网络下载到设备中。由设备通过升级子系统进行升级。 + +- 全量包 + + 全量包是完整的镜像,由升级子系统将全量包写到分区,达到更新分区的目的。 + +- 差分包 + + 根据两个特定版本\(源版本,目标版本\)之间的差异,使用bsdiff生成差分数据,升级子系统根据差分数据制作差分包。 + + +## 目录 + +``` +base/update # 升级子系统仓 +├── app # 升级客户端应用代码 +├── packaging_tools # 升级包制作工具代码 +├── updater # 升级包安装代码 +│ ├── interfaces # 对外模块接口定义 +│ ├── resources # 升级子系统用户界面图片资源,包括动画,进度条图片等 +│ ├── services # 升级包安装组件逻辑代码 +│ └── utils # 升级子系统通用代码,包括字符串处理函数,文件处理函数 +└── updateservice # 升级服务引擎代码 +``` + +## 相关仓 + +**升级子系统** + +update\_app + +update\_updateservice + +update\_updater + +update\_packaging\_tools + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/17.\345\220\257\345\212\250\346\201\242\345\244\215\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/17.\345\220\257\345\212\250\346\201\242\345\244\215\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..40e718209bbe492ef579884814e297f5bd8b2aab --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/17.\345\220\257\345\212\250\346\201\242\345\244\215\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,318 @@ +--- +title: 启动恢复子系统 +permalink: /pages/00000110 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 启动恢复子系统 + +- [简介](#section11660541593) +- [目录](#section161941989596) +- [约束](#section1718733212019) +- [使用说明](#section8533192617117) +- [相关仓](#section1371113476307) + +## 简介 + +启动恢复负责在内核启动之后到应用启动之前的系统关键进程和服务的启动过程以及设备恢复出厂设置的功能。涉及以下组件: + +- init组件 + + 支持使用LiteOS-A内核的平台,当前包括:Hi3516DV300平台和Hi3518EV300平台。 + + 负责处理从内核加载第一个用户态进程开始,到第一个应用程序启动之间的系统服务进程启动过程。启动恢复子系统除负责加载各系统关键进程之外,还需在启动的同时设置其对应权限,并在子进程启动后对指定进程实行保活(若进程意外退出要重新启动),对于特殊进程意外退出时,启动恢复子系统还要执行系统复位操作。 + + +- appspawn应用孵化器组件 + + 支持使用LiteOS-A内核的平台,当前包括:Hi3516DV300平台和Hi3518EV300平台。 + + 负责接受应用程序框架的命令孵化应用进程,设置其对应权限,并调用应用程序框架的入口。 + +- bootstrap启动引导组件 + + 支持使用LiteOS-M内核的平台,当前包括:Hi3861平台。 + + 提供了各服务和功能的启动入口标识。在SAMGR启动时,会调用boostrap标识的入口函数,并启动系统服务。 + +- syspara系统属性组件 + + 负责提供获取与设置操作系统相关的系统属性。 + + LiteOS-M内核和LiteOS-A内核的平台,包括:Hi3861平台,Hi3516DV300平台,Hi3518EV300平台。支持的系统属性包括:默认系统属性、OEM厂商系统属性和自定义系统属性。OEM厂商部分仅提供默认值,具体值需OEM产品方按需进行调整,详见“[使用说明](#section8533192617117)”部分。 + + +## 目录 + +**表 1** 启动恢复源代码目录结构 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

适配平台

+

base/startup/appspawn_lite

+

应用孵化器组件,appspawn进程,负责通过IPC机制接收Ability Manager Service消息,然后根据消息解析结果启动应用进程并赋予其对应权限。

+

Hi3516DV300

+

Hi3518EV300

+

base/startup/bootstrap_lite

+

启动引导组件,启动系统核心服务外的其他服务。

+

Hi3861

+

base/startup/init_lite

+

init组件,init进程,内核完成初始化后加载的第一个用户态进程,启动后解析/etc/init.cfg配置文件,并根据解析结果拉起其他系统关键进程,同时分别赋予其对应权限。

+

Hi3516DV300

+

Hi3518EV300

+

base/startup/syspara_lite

+

系统属性组件。提供获取设备信息接口,如:产品名、品牌名、品类名、厂家名等。

+

Hi3861

+

Hi3516DV300

+

Hi3518EV300

+
+ +``` +base/startup/ +├── appspawn_standard # 标准系统应用孵化器组件 +│ ├── include # 头文件目录 +│ ├── parameter # 系统参数 +│ ├── src # 服务程序源码 +│ └── test # 测试代码 +├── appspawn_lite # 小型系统应用孵化器组件 +│ └── services +│ ├── include # 应用孵化器组件头文件目录 +│ ├── src # 应用孵化器组件源文件目录 +│ └── test # 应用孵化器组件测试用例源文件目录 +├── bootstrap_lite # 启动引导组件 +│ └── services +│ └── source # 启动引导组件源文件目录 +├── init_lite # init组件 +│ ├── initsync # 分阶段启动源文件目录 +│ ├── interfaces # 对外接口目录 +│ └── services +│ ├── include # init组件头文件目录 +│ ├── src # init组件源文件目录 +│ └── test # init组件测试用例源文件目录 +└── syspara_lite # 系统属性组件 + ├── adapter # 系统属性适配层源文件目录 + ├── frameworks # 系统属性组件源文件目录 + ├── hals # 系统属性组件硬件抽象层头文件目录 + ├── interfaces # 系统属性组件对外接口目录 + └── simulator # 模拟器适配 +``` + +## 约束 + +系统属性:OEM厂商相关仅提供默认值,具体值需产品方按需进行调整。 + +## 使用说明 + +- init的配置文件 + + init配置文件包含了所有需要由init进程启动的系统关键服务的服务名、可执行文件路径、权限和其他属性信息,该文件位于代码仓库/vendor/hisilicon/hispark\_aries/init\_configs/目录,部署在/etc/下,文件名称为init.cfg,采用json格式,文件大小目前限制在100KB以内。 + + init进程启动后首先读取/etc/init.cfg,然后解析其json内容,并根据解析结果依次加载系统服务。配置文件格式和内容说明如下所示: + + +``` +{ + "jobs" : [{ + "name" : "pre-init", -------- 在init之前执行的job,可以放置一些启动进程之前的预操作(如新建文件夹等) + "cmds" : [ -------- 当前job支持的命令集合(当前cmd仅支持start/mkdir/chmod/chown/mount) + -------- 命令名称和参数(长度<=128字节)之间有且只能有一个空格 + "mkdir /testdir", -------- 创建文件夹命令,mkdir和目标文件夹之间有且只能有一个空格 + "chmod 0700 /testdir", -------- 修改权限命令,chmod 权限 目标 之间间隔有且仅有一个空格,权限必须为0xxx格式 + "chown 99 99 /testdir",-------- 修改属组命令,chown uid gid 目标 之间间隔有且仅有一个空格 + "mkdir /testdir2", + "mount vfat /dev/mmcblk0p0 /testdir2 noexec nosuid" -------- mount命令,格式为:mount 文件系统类型 source target flags data + -------- flags当前仅支持nodev、noexec、nosuid和rdonly,各项均以一个空格分开 + ] + }, { + "name" : "init", -------- job名称当前仅支持识别“pre-init”、“init”和“post-init” + "cmds" : [ -------- 单个job目前最多支持30条cmd + "start service1", -------- 启动服务命令1 + "start service2" -------- 启动服务命令2(可以根据需要调整命令在数组中的顺序,init进程将根据解析顺序依次执行) + ] + }, { + "name" : "post-init", -------- 在init之后执行的 job,可以放置一些启动进程之后的操作 + "cmds" : [] + } + ], + "services" : [{ -------- service集合(数组形式),包含了init进程需要启动的所有系统服务(当前最多支持100个服务) + "name" : "service1", -------- 当前服务的服务名,须确保非空且长度<=32字节 + "path" : "/bin/process1" -------- 当前服务的可执行文件全路径,须确保非空且长度<=64字节 + "uid" : 1, -------- 当前服务进程的uid值 + "gid" : 1, -------- 当前服务进程的gid值 + "once" : 0, -------- 当前服务进程是否为一次性进程 + 0 --- 当前服务非一次性进程,当进程因任何原因退出时,init收到SIGCHLD信号后将重新启动该服务进程 + 非0 --- 当前服务为一次性进程,当进程因任何原因退出时,init不会重新启动该服务进程 + "importance" : 1, -------- 当前服务是否为关键系统进程 + 0 --- 当前服务非关键系统进程,当进程因任何原因退出时,init不会做系统复位操作 + 非0 --- 当前服务为关键系统进程,当进程因任何原因退出时,init收到SIGCHLD信号后进行系统复位重启 + "caps" : [0, 1, 2, 5] -------- 当前服务所需的capability值,根据安全子系统已支持的capability,评估所需的capability,遵循最小权限原则配置(当前最多可配置100个值) + }, { + "name" : "service2", -------- 下一个需要init启动的服务。此处服务的顺序与启动顺序无关,启动顺序取决于上面job中的cmd顺序。 + "path" : "/bin/process2", + "uid" : 2, + "gid" : 2, + "once" : 1, + "importance" : 0, + "caps" : [ ] + } + ] +} +``` + +**表 2** cmds支持列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

命令名称

+

命令格式

+

命令说明

+

start

+

start ServiceName 间隔有且仅有一个空格

+

启动服务,服务名称与文件中services数组中服务名称相同

+

mkdir

+

mkdir /xxxx/xxx 间隔有且仅有一个空格

+

创建目录

+

chmod

+

chmod 0xxx /xxx/xx 间隔有且仅有一个空格

+

修改权限,权限值必须为0xxx格式,如0755,0600等,需要遵循权限最小原则配置

+

chown

+

chown uid gid /xxx/xx 间隔有且仅有一个空格

+

修改属组

+

mount

+

mount fileSysType source target flags data

+

间隔有且仅有一个空格

+

挂载命令,其中flags目前仅支持nodev、noexec、nosuid和rdonly,其它字串均判定为data项

+
+ +需要注意的是,init.cfg文件的修改需要保持json格式不被破坏,否则init进程解析失败后不会启动任何服务。对于配置的服务权限(uid/gid/capability)需要符合安全子系统要求且遵循权限最小原则。另外,对于once和importance项均为0的服务,若其在4分钟内连续退出次数超过4次,则init将终止重新启动该服务的操作。 + +- 系统参数 + - OEM厂商相关系统属性 + + Hi3516DV300,Hi3518EV300开发板需要修改vendor/hisilicon/hispark\_aries/hals/utils/sys\_param目录下源文件: + + ``` + static const char HOS_PRODUCT_TYPE[] = {"****"}; + static const char HOS_MANUFACTURE[] = {"****"}; + static const char HOS_BRAND[] = {"****"}; + static const char HOS_MARKET_NAME[] = {"****"}; + static const char HOS_PRODUCT_SERIES[] = {"****"}; + static const char HOS_PRODUCT_MODEL[] = {"****"}; + static const char HOS_SOFTWARE_MODEL[] = {"****"}; + static const char HOS_HARDWARE_MODEL[] = {"****"}; + static const char HOS_HARDWARE_PROFILE[] = {"aout:true,display:true"}; + static const char HOS_BOOTLOADER_VERSION[] = {"bootloader"}; + static const char HOS_SECURE_PATCH_LEVEL[] = {"2020-6-5"}; + static const char HOS_ABI_LIST[] = {"****"}; + ``` + + Hi3861开发板需要修改vendor/hisilicon/hispark\_pegasus/hals/utils/sys\_param目录下源文件: + + ``` + static const char HOS_PRODUCT_TYPE[] = {"****"}; + static const char HOS_MANUFACTURE[] = {"****"}; + static const char HOS_BRAND[] = {"****"}; + static const char HOS_MARKET_NAME[] = {"****"}; + static const char HOS_PRODUCT_SERIES[] = {"****"}; + static const char HOS_PRODUCT_MODEL[] = {"****"}; + static const char HOS_SOFTWARE_MODEL[] = {"****"}; + static const char HOS_HARDWARE_MODEL[] = {"****"}; + static const char HOS_HARDWARE_PROFILE[] = {"aout:true,display:true"}; + static const char HOS_BOOTLOADER_VERSION[] = {"bootloader"}; + static const char HOS_SECURE_PATCH_LEVEL[] = {"2020-6-5"}; + static const char HOS_ABI_LIST[] = {"****"}; + ``` + + - 获取默认系统属性 + + ``` + const char* value1 = GetProductType(); + printf("Product type =%s\n", value1); + const char* value2 = GetManufacture(); + printf("Manufacture =%s\n", value2); + const char* value3 = GetBrand(); + printf("GetBrand =%s\n", value3); + ``` + + + - 设置获取自定义系统属性 + + ``` + const char* defSysParam = "data of sys param ***..."; + char key[] = "rw.parameter.key"; + char value[] = "OEM-hisi-10.1.0"; + int ret = SetParameter(key, value); + char valueGet[128] = {0}; + ret = GetParameter(key, defSysParam, valueGet, 128); + printf("value = %s\n", valueGet); + ``` + + + +## 相关仓 + +启动恢复子系统 + +startup\_syspara\_lite + +startup\_appspawn\_lite + +startup\_bootstrap\_lite + +startup\_init\_lite + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/18.\345\233\276\345\275\242\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/18.\345\233\276\345\275\242\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..a41a2a9ec446ebf5cc8c950c06332a9d36fb3138 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/18.\345\233\276\345\275\242\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,179 @@ +--- +title: 图形子系统 +permalink: /pages/00000111 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 图形子系统 + +- [1.1 轻量系统](#section1346303311377) + - [简介](#section1165992615384) + - [目录](#section141331948134020) + - [约束](#section15729113104112) + - [说明](#section812962919413) + - [相关仓](#section12651205434115) + +- [1.2 标准系统](#section1249610812538) + - [简介](#section1374615251510) + - [目录](#section16751364713) + - [约束](#section126494189715) + - [编译构建](#section883114292070) + - [说明](#section1351214227564) + - [相关仓](#section11578621131119) + + +图形子系统主要包括UI组件、布局、动画、字体、输入事件、窗口管理、渲染绘制等模块,构建基于轻量OS应用框架满足硬件资源较小的物联网设备或者构建基于标准OS的应用框架满足富设备(如平板和轻智能机等)的OpenHarmony系统应用开发。 + +## 1.1 轻量系统 + +### 简介 + +图形子系统主要包括UI组件、布局、动画、字体、输入事件、窗口管理、渲染绘制等模块,构建基于轻量OS的应用框架,满足硬件资源较小的物联网设备的OpenHarmony系统应用开发。 + +**图 1** 图形子系统架构图 +![](/images/readme/figures/图形子系统架构图.png "图形子系统架构图") + +各模块介绍: + +- View:应用组件,包括UIView、UIViewGoup、UIButton、UILabel、UILabelButton、UIList、UISlider等。 +- Animator:动画模块,开发者可以自定义动画。 +- Layout:布局控件,包括Flexlayout、GridLayout、ListLayout等。 +- Transform:图形变换模块,包括旋转、平移、缩放等。 +- Event:事件模块,包括click、press、drag、long press等基础事件。 +- Rendering engine:渲染绘制模块。 +- 2D graphics library:2D绘制模块,包括直线、矩形、圆、弧、图片、文字等绘制。包括软件绘制和硬件加速能力对接。 +- Multi-language:多语言模块,用于处理不用不同语言文字的换行、整形等。 +- Image library:图片处理模块,用于解析和操作不同类型和格式的图片,例如png、jpeg、ARGB8888、ARGB565等 +- WindowManager:窗口管理模块,包括窗口创建、显示隐藏、合成等处理。 +- InputManager:输入事件管理模块。 + +### 目录 + +``` +/foundation/graphic +├── surface # 共享内存 +├── ui # UI模块,包括UI控件、动画、字体等功能 +├── utils # 图形基础库和硬件适配层 +└── wms # 窗口管理和输入事件管理 +``` + +### 约束 + +- 图形组件不支持多线程并发操作,建议相关操作都在ui线程中执行; +- utils/interfaces/innerkits/graphic\_config.h文件列举了图形部分可配置功能的宏开关,需要在编译前配置,配置时需要注意部分宏开关是分平台配置的。 + +### 说明 + +参考各仓README以及test目录 + +### 相关仓 + +**图形子系统** + +graphic\_surface + +graphic\_ui + +graphic\_wms + +graphic\_utils + +## 1.2 标准系统 + +### 简介 + +**Graphic子系统** 提供了图形接口能力和窗口管理接口能力, 支持应用程序框架子系统和ACE等子系统使用。支持所有运行标准系统的设备使用。 + +其主要的结构如下图所示: + +![](/images/readme/figures/zh-cn_image_0000001115748590.png) + +- Surface + + 图形缓冲区管理接口,负责管理图形缓冲区和高效便捷的轮转缓冲区。 + +- Vsync + + 垂直同步信号管理接口,负责管理所有垂直同步信号注册和响应。 + +- WindowManager + + 窗口管理器接口,负责创建和管理窗口。 + +- WaylandProtocols + + 窗口管理器和合成器的通信协议。 + +- Compositor + + 合成器,负责合成各个图层。 + +- Renderer + + 合成器的后端渲染模块。 + +- Wayland protocols + + Wayland 进程间通信协议 + +- Shell + + 提供多窗口能力 + +- Input Manager + + 多模输入模块,负责接收事件输 + + +### 目录 + +``` +foundation/graphic/standard/ +├── frameworks # 框架代码目录 +│ ├── bootanimation # 开机动画目录 +│ ├── surface # Surface代码 +│ ├── vsync # Vsync代码 +│ └── wm # WindowManager代码 +├── interfaces # 对外接口存放目录 +│ ├── innerkits # native接口存放目录 +│ └── kits # js/napi接口存放目录 +└── utils # 小部件存放目录 +``` + +### 约束 + +语言版本:C++11及以上 + +### 编译构建 + +可以依赖的接口有: + +- graphic\_standard:libwms\_client +- graphic\_standard:libsurface +- graphic\_standard:libvsync\_client + +### 说明 + +参考各仓README以及test目录 + +### 相关仓 + +**图形子系统** + +graphic\_standard + +ace\_ace\_engine + +aafwk\_standard + +multimedia\_media\_standard + +multimedia\_camera\_standard + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/19.\345\244\232\346\250\241\350\276\223\345\205\245\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/19.\345\244\232\346\250\241\350\276\223\345\205\245\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..040480bd35ee2919541620e6c470f6e68949d7eb --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/19.\345\244\232\346\250\241\350\276\223\345\205\245\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,49 @@ +--- +title: 多模输入子系统 +permalink: /pages/00000112 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 多模输入子系统 + +- [简介](#section11660541593) +- [目录](#section14408467105) +- [使用](#section18111235161011) +- [相关仓](#section135327891219) + +## 简介 + +OpenHarmony旨在为开发者提供NUI(Natural User Interface)的交互方式,有别于传统操作系统的输入,在OpenHarmony上,我们将多种维度的输入整合在一起,开发者可以借助应用程序框架、系统自带的UI组件或API接口轻松地实现具有多维、自然交互特点的应用程序。 + +具体来说,多模输入子系统目前支持传统的输入交互方式,例如按键、触控等。 + +## 目录 + +``` +/foundation/multimodalinput/input +├── common # 公共代码 +├── interfaces # 对外接口存放目录 +│ └── native # 对外native层接口存放目录 +│ └── innerkits # 对系统内部子系统提供native层接口存放目录 +├── service # 服务框架代码 +├── sa_profile # 服务启动配置文件 +├── uinput # 输入事件注入模块 +``` + +## 使用 + +多模输入目前提供的接口为事件注入接口,该接口目前仅对系统应用开放。 + +## 相关仓 + +**多模输入子系统** + +multimodalinput\_input + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/20.\345\252\222\344\275\223\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/20.\345\252\222\344\275\223\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..1163cc8c58a2f7c3ff8e2f2f669f42caa0a252e7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/20.\345\252\222\344\275\223\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,124 @@ +--- +title: 媒体子系统 +permalink: /pages/00000113 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 媒体子系统 + +- [简介](#section11660541593) +- [目录](#section161941989596) +- [约束](#section119744591305) +- [使用说明](#section1312121216216) +- [安装](#section11914418405) +- [相关仓](#section1371113476307) + +## 简介 + +媒体子系统为开发者提供一套简单且易于理解的接口,使得开发者能够方便接入系统并使用系统的媒体资源。 + +媒体子系统包含了音视频、相机相关媒体业务,提供以下常用功能: + +- 音频播放和录制。 +- 视频播放和录制。 + +- 相机拍照和录制。 + +## 系统架构 + +**图 1** OpenHarmony媒体子系统通用架构图 + + +![](/images/readme/figures/zh-cn_image_0000001115819528.png) + +**图 2** OpenHarmony小型媒体子系统架构图 + + +![](/images/readme/figures/媒体子系统架构图.png) + +**图 3** OpenHarmony小型媒体子系统业务流程图 + + +![](/images/readme/figures/zh-cn_image_0000001111659738.png) + +## 目录 + +仓目录结构如下: + +``` +/foundation/multimedia # 媒体子系统业务代码 +├── audio_lite # 小型系统音频模块 +│ ├── figures # 小型系统音频架构和流程图 +│ ├── frameworks # 小型系统音频框架实现 +│ └── interfaces # 小型系统音频模块接口 +├── audio_standard # 标准系统音频模块 +│ ├── figures # 标准系统音频架构和流程图 +│ ├── frameworks # 标准系统音频框架实现 +│ ├── interfaces # 标准系统音频模块接口 +│ ├── sa_profile # 标准系统音频服务配置 +│ └── services # 标准系统音频服务实现 +├── camera_lite # 小型系统相机模块 +│ ├── figures # 小型系统相机架构和流程图 +│ ├── frameworks # 小型系统相机框架实现 +│ └── interfaces # 小型系统相机模块接口 +├── camera_standard # 标准系统相机模块 +│ ├── figures # 标准系统相机架构和流程图 +│ ├── frameworks # 标准系统相机框架实现 +│ └── interfaces # 标准系统相机模块接口 +├── media_lite # 小型系统播放录制模块 +│ ├── figures # 小型系统播放录制架构和流程图 +│ ├── frameworks # 小型系统播放录制框架实现 +│ ├── interfaces # 小型系统播放录制模块接口 +│ └── services # 小型系统播放录制模块服务 +├── media_standard # 标准系统播放录制模块 +│ ├── figures # 标准系统播放录制架构和流程图 +│ ├── frameworks # 标准系统播放录制框架实现 +│ └── interfaces # 标准系统播放录制模块接口 +└── utils # 媒体公共模块 + └── lite # 小型系统媒体公共模块 + ├── figures # 小型系统媒体公共模块架构和流程图 + ├── hals # 小型系统媒体公共硬件抽象接口 + ├── interfaces # 小型系统媒体公共模块接口 + └── src # 小型系统媒体公共模块框架实现 +``` + +## 约束 + +部分音视频格式的硬件编码、解码功能依赖设备的支持。 + +## 使用说明 + +如架构图示意,媒体提供了三大类功能接口,开发者可以根据使用诉求,综合使用一类或多类接口: + +- 应用开发者使用媒体接口实现录像、预览和播放音视频,使用可以参考[多媒体开发指南](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-multimedia.md)。 +- 当使用简单播放录制功能时,可以使用Player和Recorder快速完成播放和录制功能。 +- 提供了一组控制相机的有效接口,可以让用户方便开发使用相机。 +- 开发者先创建camerakit组件对象,注册各种事件回调,这些事件回调是用来响应多媒体模块中事件响应的,之后调用创建camera就可以创建一个操作camera资源的对象,使用这个对象可以启动预览、录像或抓拍取流,及设置取流的相关参数。 + +## 安装 + +请提前加载内核及相关驱动,参考内核及驱动子系统readme。 + +## 相关仓 + +[multimedia\_camera\_lite](https://gitee.com/openharmony/multimedia_camera_lite) + +[multimedia\_audio\_lite](https://gitee.com/openharmony/multimedia_audio_lite) + +[multimedia\_media\_lite](https://gitee.com/openharmony/multimedia_media_lite) + +[multimedia\_utils\_lite](https://gitee.com/openharmony/multimedia_utils_lite) + +[multimedia\_camera\_standard](https://gitee.com/openharmony/multimedia_camera_standard) + +[multimedia\_audio\_standard](https://gitee.com/openharmony/multimedia_audio_standard) + +[multimedia\_media\_standard](https://gitee.com/openharmony/multimedia_media_standard) + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/21.\345\256\211\345\205\250\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/21.\345\256\211\345\205\250\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..c9ab96b8f790bc9d8ecd81aa8d266c772db45248 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/21.\345\256\211\345\205\250\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,110 @@ +--- +title: 安全子系统 +permalink: /pages/00000114 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 安全子系统 + +- [简介](#section11660541593) +- [系统架构](#section342962219551) +- [目录](#section92711824195113) +- [约束](#section7715171045219) +- [使用](#section2057642312536) +- [相关仓](#section155556361910) + +## 简介 + +安全子系统包括系统安全、数据安全、应用安全等功能,为OpenHarmony提供有效保护应用和用户数据的能力。 + +安全子系统当前开源的功能,包括应用完整性保护、应用权限管理、设备认证、密钥管理服务、数据分级保护。 + +## 系统架构 + +**图 1** 子系统架构图 + + +![](/images/readme/figures/zh-cn_image_0000001079207198.png) + +**对外API**:安全子系统的对外API,部分API只针对系统应用开放; + +**应用权限管理**:为程序框架子系统提供权限管理功能,并且为上层应用提供权限申请和授权状态查询接口; + +**应用完整性校验**:提供对应用完整性校验的能力,为应用签名、应用安装校验提供能力支撑; + +**设备认证**:为分布式设备互联提供密钥协商和可信设备管理能力; + +**HUKS密钥管理**:为系统提供密钥管理服务,用于支撑基础的设备认证。 + +**数据分级保护**:提供数据分级相关的接口定义。 + +## 目录 + +``` +/base/security +├── appverify # 应用完整性校验 +├── dataclassification # 数据分级保护 +├── device_auth # 设备认证 +├── huks # HUKS密钥管理 +└── permission # 权限管理 +``` + +## 约束 + +- 应用权限管理的约束说明:本期开源包括应用本地权限管理;分布式应用权限管理在本期不开源(使用打桩实现的方式支持上层分布式业务进行联调)。 +- 设备认证的约束说明:设备认证包括同帐号设备认证与帐号无关点对点设备认证;当前已开源的是帐号无关点对点认证能力,同帐号设备认证在本期不开源(使用打桩实现的方式支持上层分布式业务进行联调)。 +- 应用完整性校验说明:应用完整性校验在OpenHarmony中使用的证书,是专为OpenHarmony生成的,涉及的公钥证书和对应的私钥均预置在OpenHarmony开源代码仓中,为开源社区提供离线签名和校验能力;在商用版本中应替换此公钥证书和对应的私钥。 + +## 使用 + +**应用权限管理** + +OpenHarmony中应用和系统服务均运行在独立的沙箱中,进程空间和程序数据都是相互隔离的,以保护应用数据的安全性;但是运行在独立沙箱中的服务或应用同时需要对外提供一些API以实现所需功能,其他独立沙箱中的应用在跨进程访问这些API时,需要系统提供一种权限管理机制对这些API的访问者进行授权。 + +应用权限管理提供了权限定义机制,允许系统服务和应用为自己的敏感API定义新的权限,其他应用必须申请此权限才能访问此敏感API; + +应用权限管理提供了权限申请机制,允许应用申请权限,这些权限由系统或者其他应用定义,权限申请通过后就能访问这个权限相关的系统或其他应用提供的敏感API; + +应用权限管理也为用户提供了一些必须的功能,方便用户查看和管理权限授予情况。 + +**应用完整性校验** + +OpenHarmony允许应用安装。为了确保应用的完整性和来源可靠,需要对安装的应用进行签名和验签。 + +应用开发阶段:开发者完成开发并生成安装包后,需要开发者对安装包进行签名,以证明安装包发布到设备的过程中没有被篡改。OpenHarmony的应用完整性校验模块提供了签名工具、签名证书生成规范,以及签名所需的公钥证书等完整的机制,支撑开发者对应用安装包签名。为了方便开源社区开发者,版本中预置了公钥证书和对应的私钥,为开源社区提供离线签名和校验能力;在商用版本中应替换此公钥证书和对应的私钥。 + +应用安装阶段:OpenHarmony程序框架子系统负责应用的安装。在接收到应用安装包之后,应用程序框架子系统需要解析安装包的签名数据,然后使用应用完整性校验模块的API对签名进行验证,只有校验成功之后才允许安装此应用. 应用完整性校验模块在校验安装包签名数据时,会使用系统预置的公钥证书进行验签。 + +**设备认证与HUKS** + +设备认证的目标是实现归一化的设备认证方案,实现覆盖1+8+N设备的设备绑定/认证方案。通常来讲,设备认证在认证阶段用于支撑软总线,不直接对上层应用提供服务。设备认证的使用主要包括如下内容: + +1. 统一可信关系建立:支持账号无关设备群组关系的建立并统一维护。业务启动/通过扫码绑定等方式与其他设备建立互信关系后,请求在本地创建帐号无关设备互信群组;业务可以通过API对可信设备群组进行查询 + +2. 统一设备认证:基于已建立的可信设备群组,提供统一的设备群组认证方案,支撑软总线的统一设备发现、连接认证、端到端加密的会话秘钥协商; + +3. 设备认证用到的相关凭证和密钥协商协议所需的算法,依赖HUKS提供支撑; + +**数据分级保护** + +在OpenHarmony中,数据分级保护模块负责提供数据分级的保护策略,并提供数据分级相关的接口定义。(OpenHarmony当前不提供实际的功能实现,依赖设备厂商实现接口对应的功能,对搭载OpenHarmony的设备上的数据提供安全保护)。 + +数据分级保护模块当前提供如下接口定义: + +1.数据分级标签设置和查询接口:对业务生成的文件数据提供设置和查询风险等级标签的接口,业务可使用该接口设定和查询落盘文件数据的风险等级,使该文件在系统中具有对应的数据风险分级标识。 + +2.基于设备安全等级的数据跨设备访问控制接口:提供基于设备安全等级的数据跨设备访问控制的接口,分布式跨设备数据传输业务可使用该接口获得对端设备可支持的数据风险等级。 + +## 相关仓 + +安全子系统 + +base/security + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/22.\345\270\220\345\217\267\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/22.\345\270\220\345\217\267\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..6b28ec022184d633b2c332ee1c7f420c693dc6ab --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/22.\345\270\220\345\217\267\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,58 @@ +--- +title: 帐号子系统 +permalink: /pages/00000115 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 帐号子系统 + +- [简介](#section11660541593) +- [子系统架构图](#section1412183212132) +- [目录](#section161941989596) +- [使用说明](#section1312121216216) +- [相关仓](#section1371113476307) + +## 简介 + +在标准系统上,帐号子系统主要提供分布式帐号登录状态管理能力,支持在端侧对接厂商云帐号应用,提供云帐号登录状态查询和更新的管理能力。 + +## 子系统架构图 + +**图 1** 帐号子系统架构图 + + +![](/images/readme/figures/zh-cn_image_0000001079026550.png) + +## 目录 + +``` +/base/account +└── os_account # 系统帐号组件 + ├── common # 公共基础模块 + ├── interfaces # 对外接口存放目录 + ├── kits # 系统帐号组件开发框架 + ├── sa_profile # 帐号SA配置文件定义目录 + ├── services # 系统帐号组件服务代码 + └── test # 系统帐号组件测试代码 + └── resource # 系统帐号组件测试资源 +``` + +## 使用说明 + +通过提供的分布式帐号管理类,可以查询和更新帐号登录状态,包括登录、登出、注销及Token失效。 + +查询和更新分布式帐号登录状态,需要系统权限,仅支持系统应用。 + +## 相关仓 + +**帐号子系统** + +account\_os\_account + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/23.\346\263\233Sensor\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/23.\346\263\233Sensor\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..7566c76a77d8d1166af0ef2a842e15f13d641903 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/23.\346\263\233Sensor\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,62 @@ +--- +title: 泛Sensor子系统 +permalink: /pages/00000116 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 泛Sensor子系统 + +- [简介](#section11660541593) +- [目录](#section161941989596) +- [说明](#section1312121216216) +- [相关仓](#section1371113476307) + +## 简介 + +泛Sensor服务子系统提供了轻量级sensor服务基础框架,提供了如下功能: + +- Sensor列表查询 +- Sensor启停 +- Sensor订阅/去订阅 +- 设置数据上报模式等 + +泛Sensor服务框架如下图所示: + +**图1** 泛Sensor服务框架图 + +![](/images/readme/figures/zh-cn_image_0000001106694563.png) + +## 目录 + +``` +/base/sensors +├── sensor_lite # Sensor组件目录 +│ ├── frameworks # 框架代码目录 +│ ├── interfaces # Native接口目录 +│ └── services # 服务代码目录 +└── miscdevice_lite # 小器件组件目录 +``` + +## 说明 + +泛Sensor子系统中,主要包含三个模块:Sensor API、Sensor Framework和Sensor Service,详细结构见上述架构图: + +- Sensor API:提供传感器的基础API,主要包含Sensor列表查询、Sensor启停、Sensor订阅/去订阅等。 +- Sensor Framework:主要实现传感器的订阅管理,数据通道的创建、销毁、订阅与取消订阅,实现与SensorService的通信。 +- Sensor Service:主要实现HDF层数据接收、解析、分发,对Sensor服务的管理,数据上报管理以及Sensor权限管控等。 + +## 相关仓 + +**泛Sensor子系统** + +[sensors_sensor_lite](https://gitee.com/openharmony/sensors_sensor_lite/blob/master/README_zh.md) + +[sensors_miscdevice_lite](https://gitee.com/openharmony/sensors_miscdevice_lite/blob/master/README_zh.md) + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/24.\346\265\213\350\257\225\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/24.\346\265\213\350\257\225\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..ac8b12929b9df14a6c8aa052cccd484770bd9b81 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/24.\346\265\213\350\257\225\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,885 @@ +--- +title: 测试子系统 +permalink: /pages/00000117 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 测试子系统 +OpenHarmony为开发者提供了一套全面的自测试框架,开发者可根据测试需求开发相关测试用例,开发阶段提前发现缺陷,大幅提高代码质量。 + +本文从基础环境构建,用例开发,编译以及执行等方面介绍OpenHarmony测试框架如何运行和使用。 +## 基础环境构建 +测试框架依赖于python运行环境,在使用测试框架之前可参阅以下方式进行配置。 + - [环境配置](/pages/extra/bab7f0/) + - [源码获取](/pages/000102) + + +## 测试框架目录简介 +以下是测试框架的目录层级架构,在使用测试框架过程中可在相应目录查找对应组件。 +``` +test # 测试子系统 +├── developertest # 开发者测试组件 +│ ├── aw # 测试框架的静态库 +│ ├── config # 测试框架配置 +│ │ │ ... +│ │ └── user_config.xml # 用户使用配置 +│ ├── examples # 测试用例示例 +│ ├── src # 测试框架源码 +│ ├── third_party # 测试框架依赖第三方组件适配 +│ ├── reports # 测试结果报告 +│ ├── BUILD.gn # 测试框架编译入口 +│ ├── start.bat # 开发者测试入口(Windows) +│ └── start.sh # 开发者测试入口(Linux) +└── xdevice # 测试框架依赖组件 +``` +## 测试用例编写 +### 测试用例目录规划 +使用测试框架过程中,可根据以下层级关系规划测试用例目录。 +``` +subsystem # 子系统 +├── partA # 部件A +│ ├── moduleA # 模块A +│ │ ├── include +│ │ ├── src # 业务代码 +│ │ └── test # 测试目录 +│ │ ├── unittest # 单元测试 +│ │ │ ├── common # 公共用例 +│ │ │ │ ├── BUILD.gn # 测试用例编译配置 +│ │ │ │ └── testA_test.cpp # 单元测试用例源码 +│ │ │ ├── phone # 手机形态用例 +│ │ │ ├── ivi # 车机形态用例 +│ │ │ └── liteos-a # ipcamera使用liteos内核的用例 +│ │ ├── moduletest # 模块测试 +│ │ ... +│ │ +│ ├── moduleB # 模块B +│ ├── test +│ │ └── resource # 依赖资源 +│ │ ├── moduleA # 模块A +│ │ │ ├── ohos_test.xml # 资源配置文件 +│ │ ... └── 1.txt # 资源 +│ │ +│ ├── ohos_build # 编译入口配置 +│ ... +│ +... +``` +> **注意:** 测试用例根据不同设备形态差异分为通用用例和非通用用例,建议将通用用例存放在common目录下,非通用用例存放在相应设备形态目录下。 + +### 测试用例编写 +本测试框架支持多种语言用例编写,针对不同语言提供了不同的模板以供编写参考。 + +#### C++参考示例 + +- 用例源文件命名规范 + + 测试用例源文件名称和测试套内容保持一致,文件命名采用全小写+下划线方式命名,以test结尾,具体格式为:[功能]_[子功能]_test,子功能支持向下细分。 +示例: + ``` + calculator_sub_test.cpp + ``` + +- 用例示例 + ``` + /* + * Copyright (c) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #include "calculator.h" + #include + + using namespace testing::ext; + + class CalculatorSubTest : public testing::Test { + public: + static void SetUpTestCase(void); + static void TearDownTestCase(void); + void SetUp(); + void TearDown(); + }; + + void CalculatorSubTest::SetUpTestCase(void) + { + // input testsuit setup step,setup invoked before all testcases + } + + void CalculatorSubTest::TearDownTestCase(void) + { + // input testsuit teardown step,teardown invoked after all testcases + } + + void CalculatorSubTest::SetUp(void) + { + // input testcase setup step,setup invoked before each testcases + } + + void CalculatorSubTest::TearDown(void) + { + // input testcase teardown step,teardown invoked after each testcases + } + + /** + * @tc.name: integer_sub_001 + * @tc.desc: Verify the sub function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ + HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1) + { + // step 1:调用函数获取结果 + int actual = Sub(4,0); + + // Step 2:使用断言比较预期与实际结果 + EXPECT_EQ(4, actual); + } + ``` + 详细内容介绍: + 1. 添加测试用例文件头注释信息 + ``` + /* + * Copyright (c) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + ``` + 2. 引用测试框架头文件和命名空间 + ``` + #include + + using namespace testing::ext; + ``` + 3. 添加被测试类的头文件 + ``` + #include "calculator.h" + ``` + 4. 定义测试套(测试类) + ``` + class CalculatorSubTest : public testing::Test { + public: + static void SetUpTestCase(void); + static void TearDownTestCase(void); + void SetUp(); + void TearDown(); + }; + + void CalculatorSubTest::SetUpTestCase(void) + { + // input testsuit setup step,setup invoked before all testcases + } + + void CalculatorSubTest::TearDownTestCase(void) + { + // input testsuit teardown step,teardown invoked after all testcases + } + + void CalculatorSubTest::SetUp(void) + { + // input testcase setup step,setup invoked before each testcases + } + + void CalculatorSubTest::TearDown(void) + { + // input testcase teardown step,teardown invoked after each testcases + } + ``` + > **注意:** 在定义测试套时,测试套名称应与编译目标保持一致,采用大驼峰风格。 + + 5. 测试用例实现,包含用例注释和逻辑实现 + ``` + /** + * @tc.name: integer_sub_001 + * @tc.desc: Verify the sub function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ + HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1) + { + //step 1:调用函数获取结果 + int actual = Sub(4,0); + + //Step 2:使用断言比较预期与实际结果 + EXPECT_EQ(4, actual); + } + ``` + 在编写用例时,我们提供了三种用例模板供您选择。 + + | 类型 | 描述 | + | ------------| ------------| + | HWTEST(A,B,C)| 用例执行不依赖Setup&Teardown时,可选取| + | HWTEST_F(A,B,C)| 用例执行(不含参数)依赖于Setup&Teardown时,可选取| + | HWTEST_P(A,B,C)| 用例执行(含参数)依赖于Set&Teardown时,可选取| + + 其中,参数A,B,C的含义如下: + - 参数A为测试套名。 + - 参数B为测试用例名,其命名必须遵循[功能点]_[编号]的格式,编号为3位数字,从001开始。 + - 参数C为测试用例等级,具体分为门禁level0 以及非门禁level1-level4共五个等级,其中非门禁level1-level4等级的具体选取规则为:测试用例功能越重要,level等级越低。 + + **注意:** + - 测试用例的预期结果必须有对应的断言。 + - 测试用例必须填写用例等级。 + - 测试体建议按照模板分步实现。 + - 用例描述信息按照标准格式@tc.xxx value书写,注释信息必须包含用例名称,用例类型,需求编号四项。其中用例测试类型@tc.type参数的选取,可参考下表。 + + | 测试类型名称|类型编码| + | ------------|------------| + |功能测试 |FUNC| + |性能测试 |PERF| + |可靠性测试 |RELI| + |安全测试 |SECU| + |模糊测试 |FUZZ| + + +#### JavaScript参考示例 + +- 用例源文件命名规范 + + 测试用例原文件名称采用大驼峰风格,以TEST结尾,具体格式为:[功能][子功能]TEST,子功能支持向下细分。 +示例: + ``` + AppInfoTest.js + ``` + +- 用例示例 + ``` + /* + * Copyright (C) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import app from '@system.app' + + import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + + describe("AppInfoTest", function () { + beforeAll(function() { + // input testsuit setup step,setup invoked before all testcases + console.info('beforeAll caled') + }) + + afterAll(function() { + // input testsuit teardown step,teardown invoked after all testcases + console.info('afterAll caled') + }) + + beforeEach(function() { + // input testcase setup step,setup invoked before each testcases + console.info('beforeEach caled') + }) + + afterEach(function() { + // input testcase teardown step,teardown invoked after each testcases + console.info('afterEach caled') + }) + + /* + * @tc.name:appInfoTest001 + * @tc.desc:verify app info is not null + * @tc.type: FUNC + * @tc.require: Issue Number + */ + it("appInfoTest001", 0, function () { + //step 1:调用函数获取结果 + var info = app.getInfo() + + //Step 2:使用断言比较预期与实际结果 + expect(info != null).assertEqual(true) + }) + }) + ``` + 详细内容介绍: + 1. 添加测试用例文件头注释信息 + ``` + /* + * Copyright (C) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + ``` + 2. 导入被测api和jsunit测试库 + ``` + import app from '@system.app' + + import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + ``` + 3. 定义测试套(测试类) + ``` + describe("AppInfoTest", function () { + beforeAll(function() { + // input testsuit setup step,setup invoked before all testcases + console.info('beforeAll caled') + }) + + afterAll(function() { + // input testsuit teardown step,teardown invoked after all testcases + console.info('afterAll caled') + }) + + beforeEach(function() { + // input testcase setup step,setup invoked before each testcases + console.info('beforeEach caled') + }) + + afterEach(function() { + // input testcase teardown step,teardown invoked after each testcases + console.info('afterEach caled') + }) + ``` + 4. 测试用例实现 + ``` + /* + * @tc.name:appInfoTest001 + * @tc.desc:verify app info is not null + * @tc.type: FUNC + * @tc.require: Issue Number + */ + it("appInfoTest001", 0, function () { + //step 1:调用函数获取结果 + var info = app.getInfo() + + //Step 2:使用断言比较预期与实际结果 + expect(info != null).assertEqual(true) + }) + ``` + +### 测试用例编译文件编写 +根据测试用例目录规划,当执行某一用例时,测试框架会根据编译文件逐层查找,最终找到所需用例进行编译。下面通过不同示例来讲解gn文件如何编写。 + +#### 测试用例编译配置文件 +针对不同语言,下面提供不同的编译模板以供参考。 + +- **C++用例编译配置示例** + ``` + # Copyright (c) 2021 XXXX Device Co., Ltd. + + import("//build/test.gni") + + module_output_path = "subsystem_examples/calculator" + + config("module_private_config") { + visibility = [ ":*" ] + + include_dirs = [ "../../../include" ] + } + + ohos_unittest("CalculatorSubTest") { + module_out_path = module_output_path + + sources = [ + "../../../include/calculator.h", + "../../../src/calculator.cpp", + ] + + sources += [ "calculator_sub_test.cpp" ] + + configs = [ ":module_private_config" ] + + deps = [ "//third_party/googletest:gtest_main" ] + } + + group("unittest") { + testonly = true + deps = [":CalculatorSubTest"] + } + ``` + 详细内容如下: + + 1. 添加文件头注释信息 + ``` + # Copyright (c) 2021 XXXX Device Co., Ltd. + ``` + 2. 导入编译模板文件 + ``` + import("//build/test.gni") + ``` + 3. 指定文件输出路径 + ``` + module_output_path = "subsystem_examples/calculator" + ``` + > **说明:** 此处输出路径为部件/模块名。 + + 4. 配置依赖包含目录 + + ``` + config("module_private_config") { + visibility = [ ":*" ] + + include_dirs = [ "../../../include" ] + } + ``` + > **说明:** 一般在此处对相关配置进行设置,在测试用例编译脚本中可直接引用。 + + 5. 指定测试用例编译目标输出的文件名称 + + ``` + ohos_unittest("CalculatorSubTest") { + } + ``` + 6. 编写具体的测试用例编译脚本(添加需要参与编译的源文件、配置和依赖) + ``` + ohos_unittest("CalculatorSubTest") { + module_out_path = module_output_path + sources = [ + "../../../include/calculator.h", + "../../../src/calculator.cpp", + "../../../test/calculator_sub_test.cpp" + ] + sources += [ "calculator_sub_test.cpp" ] + configs = [ ":module_private_config" ] + deps = [ "//third_party/googletest:gtest_main" ] + } + ``` + + > **说明:根据测试类型的不同,在具体编写过程中可选择不同的测试类型:** + > - ohos_unittest:单元测试 + > - ohos_moduletest:模块测试 + > - ohos_systemtest:系统测试 + > - ohos_performancetest:性能测试 + > - ohos_securitytest:安全测试 + > - ohos_reliabilitytest:可靠性测试 + > - ohos_distributedtest:分布式测试 + + 7. 对目标测试用例文件进行条件分组 + + ``` + group("unittest") { + testonly = true + deps = [":CalculatorSubTest"] + } + ``` + > **说明:** 进行条件分组的目的在于执行用例时可以选择性的执行某一种特定类型的用例。 + +- **JavaScript用例编译配置示例** + + ``` + # Copyright (C) 2021 XXXX Device Co., Ltd. + + import("//build/test.gni") + + module_output_path = "subsystem_examples/app_info" + + ohos_js_unittest("GetAppInfoJsTest") { + module_out_path = module_output_path + + hap_profile = "./config.json" + certificate_profile = "//test/developertest/signature/openharmony_sx.p7b" + } + + group("unittest") { + testonly = true + deps = [ ":GetAppInfoJsTest" ] + } + ``` + + 详细内容如下: + + 1. 添加文件头注释信息 + + ``` + # Copyright (C) 2021 XXXX Device Co., Ltd. + ``` + 2. 导入编译模板文件 + + ``` + import("//build/test.gni") + ``` + 3. 指定文件输出路径 + + ``` + module_output_path = "subsystem_examples/app_info" + ``` + > **说明:** 此处输出路径为部件/模块名。 + + 4. 指定测试用例编译目标输出的文件名称 + + ``` + ohos_js_unittest("GetAppInfoJsTest") { + } + ``` + > **说明:** + >- 使用模板ohos_js_unittest定义js测试套,注意与C++用例区分。 + >- js测试套编译输出文件为hap类型,hap名为此处定义的测试套名,测试套名称必须以JsTest结尾。 + + 5. 指定hap包配置文件config.json和签名文件,两个配置为必选项 + + ``` + ohos_js_unittest("GetAppInfoJsTest") { + module_out_path = module_output_path + + hap_profile = "./config.json" + certificate_profile = "//test/developertest/signature/openharmony_sx.p7b" + } + ``` + config.json为hap编译所需配置文件,需要开发者根据被测sdk版本配置“target”项,其余项可默认,具体如下所示: + + ``` + { + "app": { + "bundleName": "com.example.myapplication", + "vendor": "example", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 4, + "target": 5 // 根据被测sdk版本进行修改,此例为sdk5 + } + }, + "deviceConfig": {}, + "module": { + "package": "com.example.myapplication", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry" + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "name": "com.example.myapplication.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "MyApplication", + "type": "page", + "launchType": "standard" + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } + } + ``` + 6. 对目标测试用例文件进行条件分组 + ``` + group("unittest") { + testonly = true + deps = [ ":GetAppInfoJsTest" ] + } + ``` + > **说明:** 进行条件分组的目的在于执行用例时可以选择性的执行某一种特定类型的用例。 + +#### 编译入口配置文件ohos.build + +当完成用例编译配置文件编写后,需要进一步编写部件编译配置文件,以关联到具体的测试用例。 +``` +"partA": { + "module_list": [ + + ], + "inner_list": [ + + ], + "system_kits": [ + + ], + "test_list": [ + "//system/subsystem/partA/calculator/test:unittest" //配置模块calculator下的test + ] + } +``` +> **说明:** test_list中配置的是对应模块的测试用例。 + +### 测试用例资源配置 +测试依赖资源主要包括测试用例在执行过程中需要的图片文件,视频文件、第三方库等对外的文件资源。 + +依赖资源文件配置步骤如下: +1. 在部件的test目录下创建resource目录,在resource目录下创建对应的模块,在模块目录中存放该模块所需要的资源文件 + +2. 在resource目录下对应的模块目录中创建一个ohos_test.xml文件,文件内容格式如下: + ``` + + + + + + + + ``` +3. 在测试用例的编译配置文件中定义resource_config_file进行指引,用来指定对应的资源文件ohos_test.xml + ``` + ohos_unittest("CalculatorSubTest") { + resource_config_file = "//system/subsystem/partA/test/resource/calculator/ohos_test.xml" + } + ``` + >**说明:** + >- target_name: 测试套的名称,定义在测试目录的BUILD.gn中。preparer: 表示该测试套执行前执行的动作。 + >- src="res": 表示测试资源位于test目录下的resource目录下,src="out":表示位于out/release/$(部件)目录下。 + +## 测试用例执行 +在执行测试用例之前,针对用例使用设备的不同,需要对相应配置进行修改,修改完成即可执行测试用例。 + +### user_config.xml配置 +``` + + + + false + + false + + true + + + + + + + + + + + + + cmd + 115200 + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + +``` +>**说明:** 在执行测试用例之前,若使用HDC连接设备,用例仅需配置设备IP和端口号即可,其余信息均默认不修改。 + +### Windows环境执行 +#### 测试用例编译 + +由于Windows环境下无法实现用例编译,因此执行用例前需要在Linux环境下进行用例编译,用例编译命令: +``` +./build.sh --product-name Hi3516DV300 --build-target make_test +``` +编译完成后,测试用例将自动保存在out/hi3516dv300/packages/phone/images/tests目录下。 + +>说明: Hi3516DV300为当前版本所支持的平台,make_test表示全部用例。根据不同需求,编译选项可进行不同选择: +> - --product-name # 编译产品名称(必选) +> - --build-target # 指定编译目标(可选) + +#### 搭建执行环境 +1. 在Windows环境创建测试框架目录Test,并在此目录下创建testcase目录 + +2. 从Linux环境拷贝测试框架developertest和xdevice到创建的Test目录下,拷贝编译好的测试用例到testcase目录下 + +>**说明:** 将测试框架及测试用例从Linux环境移植到Windows环境,以便后续执行。 + +3. 修改user_config.xml + ``` + + + false + + + + D:\Test\testcase\tests + + ``` + >**说明:** ``标签表示是否需要编译用例;``标签表示测试用例查找路径。 + +#### 执行用例 +1. 启动测试框架 + ``` + start.bat + ``` +2. 选择产品形态 + + 进入测试框架,系统会自动提示您选择产品形态,请根据实际的开发板进行选择。例如:Hi3516DV300。 + +3. 执行测试用例 + + 当选择完产品形态,可参考如下指令执行测试用例。 + ``` + run -t UT -ts CalculatorSubTest -tc interger_sub_00l + ``` + 执行命令参数说明: + ``` + -t [TESTTYPE]: 指定测试用例类型,有UT,MST,ST,PERF等。(必选参数) + -tp [TESTPART]: 指定部件,可独立使用。 + -tm [TESTMODULE]: 指定模块,不可独立使用,需结合-tp指定上级部件使用。 + -ts [TESTSUITE]: 指定测试套,可独立使用。 + -tc [TESTCASE]: 指定测试用例,不可独立使用,需结合-ts指定上级测试套使用。 + -h : 帮助命令。 + ``` +### Linux环境执行 +#### 远程端口映射 +为了在Linux远程服务器以及Linux虚拟机两种环境下执行测试用例,需要对端口进行远程映射,以实现与设备的数据通路连接。具体操作如下: +1. HDC Server指令: + ``` + hdc_std kill + hdc_std -m -s 0.0.0.0:8710 + ``` + >**说明:** IP和端口号为默认值。 + +2. HDC Client指令: + ``` + hdc_std -s xx.xx.xx.xx:8710 list targets + ``` + >**说明:** 此处IP填写设备侧IP地址。 + +#### 执行用例 +1. 启动测试框架 + ``` + ./start.sh + ``` +2. 选择产品形态 + + 进入测试框架,系统会自动提示您选择产品形态,请根据实际的开发板进行选择。例如:Hi3516DV300。 + +3. 执行测试用例 + + 测试框架在执行用例时会根据指令找到所需用例,自动实现用例编译,执行过程,完成自动化测试。 + ``` + run -t UT -ts CalculatorSubTest -tc interger_sub_00l + ``` + 执行命令参数说明: + ``` + -t [TESTTYPE]: 指定测试用例类型,有UT,MST,ST,PERF等。(必选参数) + -tp [TESTPART]: 指定部件,可独立使用。 + -tm [TESTMODULE]: 指定模块,不可独立使用,需结合-tp指定上级部件使用。 + -ts [TESTSUITE]: 指定测试套,可独立使用。 + -tc [TESTCASE]: 指定测试用例,不可独立使用,需结合-ts指定上级测试套使用。 + -h : 帮助命令。 + ``` + +## 测试报告日志 +当执行完测试指令,控制台会自动生成测试结果,若需要详细测试报告您可在相应的数据文档中进行查找。 + +### 测试结果 +测试结果输出根路径如下: +``` +test/developertest/reports/xxxx_xx_xx_xx_xx_xx +``` +>**说明:** 测试报告文件目录将自动生成。 + +该目录中包含以下几类结果: +| 类型 | 描述| +| ------------ | ------------ | +| result/ |测试用例格式化结果| +| log/plan_log_xxxx_xx_xx_xx_xx_xx.log | 测试用例日志 | +| summary_report.html | 测试报告汇总 | +| details_report.html | 测试报告详情 | + +### 测试框架日志 +``` +reports/platform_log_xxxx_xx_xx_xx_xx_xx.log +``` + +### 最新测试报告 +``` +reports/latest +``` + +## 涉及仓 + +[test\_xdevice](https://gitee.com/openharmony/test_xdevice/blob/master/README_zh.md) + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/25.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/25.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..b4f75bd4701c16c8a7a8f41d3a657d2895f73451 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/25.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,109 @@ +--- +title: 用户程序框架子系统 +permalink: /pages/00000118 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# **用户程序框架子系统** + +## 简介 + +用户程序框架子系统是OpenHarmony为开发者提供的一套开发OpenHarmony应用程序的框架。 + +**包含以下模块**: + +- **AppKit**:是用户程序框架提供给开发者的开发包,开发者基于该开发包可以开发出基于Ability组件的应用。 + +- **AppManagerService**:应用管理服务,用于管理应用运行关系、调度应用进程生命周期及状态的系统服务。 + +- **BundleManagerService**:是负责管理安装包的系统服务,常见的比如包安装、更新,卸载和包信息查询等,运行在Foundation进程。 + +应用程序框架子系统架构如下图所示: + +![](/images/readme/figures/appexecfwk.png) + + + +## 目录 + +``` +foundation/appexecfwk/standard +├── kits +│   └── appkit # Appkit实现的核心代码 +├── common +│   └── log # 日志组件目录 +├── interfaces +│   └── innerkits # 内部接口存放目录 +├── services +│   ├── appmgr # 用户程序管理服务框架代码 +│   └── bundlemgr # 包管理服务框架代码 +├── test # 测试目录 +└── tools # bm命令存放目录 +``` + +### 使用说明 + +当前版本用户程序框架不具备权限管理的能力。 + +以下模块的JS接口为非正式API,仅供Launcher、Settings、SystemUI等系统应用使用,不排除对这些接口进行变更的可能性,后续版本将提供正式API。 + +- @ohos.bundle_mgr.d.ts +- bundleinfo.d.ts +- common.d.ts +- installresult.d.ts +- moduleinfo.d.ts + + +### bm命令如下 + +**bm命令帮助** + +| 命令 | 描述 | +| ------- | ---------- | +| bm help | bm帮助命令 | + +**安装应用** + +| 命令 | 描述 | +| ----------------------------------- | -------------------------- | +| bm install -p | 通过指定路径安装一个应用包 | +| bm install -r -p | 覆盖安装一个应用包 | + +``` +示例如下: +bm install -p /data/app/ohosapp.hap +``` + +**卸载应用** + +| 命令 | 描述 | +| ----------------------------- | ------------------------ | +| bm uninstall -n | 通过指定包名卸载一个应用 | + +``` +示例如下: +bm uninstall -n com.ohos.app +``` + +**查看应用安装信息** + +| 命令 | 描述 | +| ---------- | -------------------------- | +| bm dump -a | 列出系统已经安装的所有应用 | + +## 相关仓 + +用户程序框架子系统 + +**appexecfwk_standard** + +aafwk_standard + +startup_appspawn diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/26.\347\224\265\346\272\220\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/26.\347\224\265\346\272\220\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..54b277d2cbdc9c996a4f09bb88014dde17645f3d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/26.\347\224\265\346\272\220\347\256\241\347\220\206\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,74 @@ +--- +title: 电源管理子系统 +permalink: /pages/00000119 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 电源管理子系统 + +- [简介](#section11660541593) +- [目录](#section19472752217) +- [使用说明](#section19959125052315) +- [相关仓](#section63151229062) + +## 简介 + +电源管理子系统提供如下功能: + +1. 重启系统。 +2. 管理休眠运行锁。 +3. 系统电源状态查询。 +4. 充电和电池状态查询和上报。 +5. 亮灭屏管理和亮度调节。 + +**图 1** 电源管理子系统架构图 + + +![](/images/readme/figures/电源管理子系统架构图.png) + +## 目录 + +``` +/base/powermgr +├── battery_manager # 电池服务组件 +│ ├── hdi # HDI层 +│ ├── interfaces # 接口层 +│ ├── sa_profile # SA配置文件 +│ ├── services # 服务层 +│ └── utils # 工具和通用层 +├── display_manager # 显示控制组件 +│ ├── interfaces # 接口层 +│ └── sa_profile # SA配置文件 +│ └── services # 服务层 +│ └── utils # 工具和通用层 +├── powermgr_lite # 轻量级电源管理组件 +│ ├── interfaces # 接口层 +│ └── services # 服务层 +└── power_manager # 电源管理服务组件 + ├── interfaces # 接口层 + ├── sa_profile # SA配置文件 + └── services # 服务层 + └── utils # 工具和通用层 +``` + +## 使用说明 + +开发者通过电源管理子系统提供的接口可以进行申请和释放休眠运行锁RunningLock、获取电池信息、亮度调节、重启设备、关机等操作。 + +## 相关仓 + +**电源管理子系统** + +powermgr\_battery\_manager + +powermgr\_power\_manager + +powermgr\_display\_manager + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/27.\347\224\265\350\257\235\346\234\215\345\212\241\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/27.\347\224\265\350\257\235\346\234\215\345\212\241\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..edbf0e7f746b07c401b398b8e0ee910550d8ebfb --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/27.\347\224\265\350\257\235\346\234\215\345\212\241\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,158 @@ +--- +title: 电话服务子系统 +permalink: /pages/0000011a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 电话服务子系统 + +- [简介](#section104mcpsimp) +- [目录](#section119mcpsimp) +- [约束](#section123mcpsimp) +- [使用说明](#section128mcpsimp) + - [获取当前蜂窝网络信号信息](#section1458213210369) + - [观察蜂窝网络状态变化](#section750135512369) + +- [相关仓](#section152mcpsimp) + +## 简介 + +电话服务子系统,提供了一系列的API用于获取无线蜂窝网络和SIM卡相关的一些信息。应用可以通过调用API来获取当前注册网络名称、网络服务状态、信号强度以及SIM卡的相关信息。 + +各个模块主要作用如下: + +- 核心服务模块:主要功能是初始化RIL管理、SIM卡和搜网模块。 +- 通话管理模块:主要功能是管理CS(Circuit Switch,电路交换)、IMS(IP Multimedia Subsystem,IP多媒体子系统)和OTT(over the top,OTT解决方案)三种类型的通话,申请通话所需要的音视频资源,处理多路通话时产生的各种冲突。 +- 蜂窝通话模块:主要功能是实现基于运营商网络的基础通话。 +- 短彩信模块:主要功能是短信收发和彩信编解码。 +- 状态注册模块:主要功能是提供电话服务子系统各种消息事件的订阅以及取消订阅的API。 + +**图 1** 子系统架构图 + +![](/images/readme/figures/zh-cn_architecture-of-telephony-subsystem.png) + +## 目录 + +``` +base/telephony/ +├── core_service # 核心服务 +├── call_manager # 通话管理 +├── cellular_call # 蜂窝通话 +├── sms_mms # 短彩信 +└── state_registry # 状态注册 +``` + +## 约束 + +1. 目前开源的范围仅支持蜂窝通话(仅支持CS通话)和短信,不支持蜂窝数据上网,仅支持单SIM卡。 + +## 使用说明 + +### 获取当前蜂窝网络信号信息 + +1. 从@ohos.telephony.radio.d.ts中导入radio命名空间。 +2. 可以通过callback或者Promise的方式调用getSignalInformation\(slotId: number\)方法。 +3. 该接口为异步接口,结果会从callback中返回SignalInformation数组。 +4. 遍历SignalInformation数组,获取不同制式(signalType)的信号强度(signalLevel)。 + + ``` + // 引入包名 + import radio from "@ohos.telephony.radio"; + + // 参数赋值 + let slotId = 1; + + // 调用接口【callback方式】 + radio.getSignalInformation(slotId, (err, value) => { + if (err) { + // 接口调用失败,err非空 + console.error(`failed to getSignalInformation because ${err.message}`); + return; + } + // 接口调用成功,err为空 + for (let i = 0; i < value.length; i++) { + console.log(`success to getSignalInformation: type is ${value[i].signalType}, level is ${value[i].signalLevel}`); + } + }); + + // 调用接口【Promise方式】 + let promise = radio.getSignalInformation(slotId); + promise.then((value) => { + // 接口调用成功,此处可以实现成功场景分支代码。 + for (let i = 0; i < value.length; i++) { + console.log(`success to getSignalInformation: type is ${value[i].signalType}, level is ${value[i].signalLevel}`); + } + }).catch((err) => { + // 接口调用失败,此处可以实现失败场景分支代码。 + console.error(`failed to getSignalInformation because ${err.message}`); + }); + ``` + + +### 观察蜂窝网络状态变化 + +**添加观察事件** + +1. 从@ohos.telephony.observer.d.ts中导入observer命名空间。 +2. 调用on\(type: 'networkStateChange'\)方法,传入卡槽id(slotId)和收到事件的回调处理函数(callback),其中slotId为可选参数。 +3. 当网络状态发生变更时,调用者会收到回调。 + + ``` + // 引入包名 + import observer from '@ohos.telephony.observer'; + + // 开启订阅 + observer.on('networkStateChange', {slotId: 1}, (err, value) => { + if (err) { + // 接口调用失败,err非空 + console.error(`failed, because ${err.message}`); + return; + } + // 接口调用成功,err为空 + console.log(`success on. network state is ` + value); + }); + ``` + + +**停止观察** + +1. 从@ohos.telephony.observer.d.ts中导入observer命名空间。 +2. 调用off\(type: 'networkStateChange'\)方法,传入添加观察事件时的callback对象。 + + ``` + // 引入包名 + import observer from '@ohos.telephony.observer'; + + // 关闭订阅 + observer.off('networkStateChange', (err, value) => { + if (err) { + // 接口调用失败,err非空 + console.error(`failed, because ${err.message}`); + return; + } + // 接口调用成功,err为空 + console.log(`success off`); + }); + ``` + + +## 相关仓 + +**电话服务子系统** + +[telephony_core_service](https://gitee.com/openharmony/telephony_core_service/blob/master/README_zh.md) + +[telephony_call_manager](https://gitee.com/openharmony/telephony_call_manager/blob/master/README_zh.md) + +[telephony_cellular_call](https://gitee.com/openharmony/telephony_cellular_call/blob/master/README_zh.md) + +[telephony\_sms\_mms](https://gitee.com/openharmony/telephony_sms_mms/blob/master/README_zh.md) + +[telephony\_state\_registry](https://gitee.com/openharmony/telephony_state_registry/blob/master/README_zh.md) diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/28.\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/28.\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..aefaee1c4cf5ad2cb33fb9d52377fda3fbaeb694 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/28.\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,352 @@ +--- +title: 研发工具链子系统 +permalink: /pages/0000011b +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 研发工具链子系统 + +- [简介](#section11660541593) +- [系统架构](#section342962219551) +- [目录](#section71879353610) +- [使用说明](#section3199114314427) +- [相关仓](#section1371113476307) + +## 简介 + +在OpenHarmony中,研发工具链子系统主要为开发人员提供了开发时用于调试的命令行以及追踪性能轨迹、查看性能的工具。 + +本子系统主要实现了以下功能: + +- bytrace,开发人员用于追踪进程轨迹、查看性能的一种工具,主要对内核ftrace进行了封装和扩展,来支持用户态的打点。 +- hdc,开发人员用于调试的命令行工具,通过该工具可以在windows/linux/mac等系统上与开发机或者模拟器进行交互。 +- profiler,旨在为开发者提供一套性能调优平台,可以用来分析内存、性能等问题。 + +## 系统架构 + +工具链子系统的架构图如下: + +**图 1** 研发工具链子系统架构图 + + +![](/images/readme/figures/zh-cn_image_0000001162757669.png) + +## 目录 + +``` +/developtools # 研发工具链子系统目录结构 +├── bytrace_standard # bytrace组件代码目录 +│ └── bin # bytrace组件功能实现目录 +│ └── innerkits # 对内部子系统暴露的头文件存放目录 +├── hdc_standard # hdc组件代码目录 +│ └── src # hdc组件功能实现目录 +│ └── prebuilt # 预编译目录 +├── profiler # 性能调优组件代码目录 +│ └── device # 设备侧代码目录 +│ └── host # host端代码目录 +│ └── interfaces # 模块间和对外提供的接口代码目录 +│ └── trace_analyzer # bytrace解析模块的代码目录 +│ └── protos # proto格式文件的代码目录 +``` + +## 使用说明 + +**1. bytrace** + +bytrace当前支持如下命令: + +**表 1** 命令行列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Option

+

Description

+

-h,--help

+

查看帮助信息

+

-b n,--buffer_size n

+

指定n(KB)内存大小用于存取trace日志,默认2MB

+

-t n,--time n

+

用来指定trace运行的时间(单位:s),取决于需要分析过程的时间

+

--trace_clock clock

+

trace输出的时钟类型,一般设备支持boot、global、mono、uptime、perf等,默认为boot

+

--trace_begin

+

启动抓trace

+

--trace_dump

+

将数据输出到指定位置(默认控制台)

+

--trace_finish

+

停止抓trace,并将数据输出到指定位置(默认控制台)

+

-l,--list_categories

+

输出手机能支持的trace模块

+

--overwrite

+

当缓冲区满的时候,将丢弃最新的信息。(默认丢弃最老的日志)

+

-o filename,--output filename

+

指定输出的目标文件名称

+

-z

+

抓取trace后进行压缩

+
+ +以下是常用bytrace命令示例,供开发者参考: + +- 查询支持的label。 + + ``` + bytrace -l + 或者 + bytrace --list_categories + ``` + + +- 设置4M缓存,抓取10秒,抓取label为ability的trace信息。 + + ``` + bytrace -b 4096 -t 10 --overwrite ability > /data/mytrace.ftrace + ``` + + +- 设置trace的输出时钟为mono。 + + ``` + bytrace --trace_clock mono -b 4096 -t 10 --overwrite ability > /data/mytrace.ftrace + ``` + + +- 抓取trace后进行压缩。 + + ``` + bytrace -z -b 4096 -t 10 --overwrite ability > /data/mytrace.ftrace + ``` + + +**2. hdc** + +hdc当前支持如下命令: + +**表 2** hdc命令列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Option

+

Description

+

-t key

+

用于指定连接该指定设备标识key

+

-s socket

+

用于指定服务监听的socket配置

+

-h/help -v/version

+

用于显示hdc相关的帮助、版本信息

+

list targets[-v]

+

显示所有已经连接的目标设备列表

+

target mount

+

以读写模式挂载/system等分区

+

target boot [bootloader|recovery]

+

重启目标设备,默认启动系统,可支持bootloader,recover等引导模式

+

smode [off]

+

授予后台服务进程root权限, 使用off参数取消授权

+

kill

+

终止服务进程

+

tconn host[:port][-remove]

+

通过【ip地址:端口号】来指定连接的设置

+

tmode usb

+

执行后设备端对应daemon进程重启,并首先选用usb连接方式

+

tmode port port-number

+

执行后设备端对应daemon进程重启,并优先使用网络方式连接设备,如果连接设备再选择usb连接

+

fport local remote -b

+

创建端口、文件、设备转发

+

fport list

+

查看所有已建立的映射连接列表,显示的参数包括转发配置字符串,转发类型,转发参数

+

fport rm local

+

删除已映射的给定配置字符串连接(配置字符串值可以通过list获取),没有指定则删除所有

+

file send local remote

+

发送文件至远端设备

+

file recv [-a] remote local

+

从远端设备接收文件至本地

+

app install [-r/-d/-g] package

+

安装OpenHarmony package

+

app install-multiple [-rdg] --hap path

+

安装指定路径下的所有OpenHarmony package

+

app uninstall [-k] package

+

卸载OpenHarmony应用

+

hilog

+

支持查看抓取log调试信息

+

bugreport [PATH]

+

支持抓取bugreport调试信息

+

shell [command]

+

远程执行命令或进入交互命令环境

+
+ +以下是常用hdc命令示例,供开发者参考: + +- 往设备中推送文件 + + ``` + hdc file send E:\c.txt /sdcard + ``` + +- 重启设备 + + ``` + hdc target boot + ``` + + +- 查看日志 + + ``` + hdc hilog + ``` + +- 进入命令行交互模式 + + ``` + hdc shell + ``` + +- 配置服务监听的socket。 + + ``` + hdc -s 192.168.1.100:1234 + ``` + + +- 重启至bootloader模式。 + + ``` + hdc target boot bootloader + ``` + +- 网络连接。 + + ``` + hdc tconn 192.168.0.100:8710 + ``` + + +**3. profiler** + +性能调优组件包含系统和应用调优框架,旨在为开发者提供一套性能调优平台,可以用来分析内存、性能等问题。 + +该组件整体分为PC端和设备端两部分,PC端最终作为deveco studio的插件进行发布,内部主要包括分为UI绘制、设备管理、进程管理、插件管理、数据导入、数据存储、 数据分析、Session管理、配置管理等模块;设备端主要包括命令行工具、服务进程、插件集合、应用程序组件等模块。设备端提供了插件扩展能力,对外提供了插件接口,基于该扩展能力可以按需定义自己的能力,并集成到框架中来,目前基于插件能力已经完成了实时内存插件和trace插件。详细内容见性能调优组件。 + +## 相关仓 + +**研发工具链子系统** + +developtools\_hdc\_standard + +developtools\_bytrace\_standard + +developtools\_profiler + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/29.\347\263\273\347\273\237\345\272\224\347\224\250.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/29.\347\263\273\347\273\237\345\272\224\347\224\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..4d143419acfedf12ffcd810c5054f6fe4fe8be96 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/29.\347\263\273\347\273\237\345\272\224\347\224\250.md" @@ -0,0 +1,51 @@ +--- +title: 系统应用 +permalink: /pages/0000011c +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 系统应用 + +- [简介](#section663544819225) +- [目录](#section161941989596) +- [相关仓](#section1371113476307) + +## 简介 + +系统应用提供了OpenHarmony标准系统上的部分应用,如桌面、SystemUI、设置等,为开发者提供了构建标准系统应用的具体实例,这些应用支持在所有标准系统设备上使用。 + +系统应用目前包含如下几个应用: + +1. 桌面:提供了基本的已安装应用的展示功能和人机交互界面,是所有应用的入口。 +2. SystemUI:包含导航栏和系统状态栏两部分,导航栏提供基本页面导航功能、状态栏提供系统状态显示,如时间、充电状态等。 +3. 设置:提供了关于设备,应用管理,亮度设置等功能。 + +## 目录 + +``` +/applications/standard/ +├── launcher # 桌面应用代码仓。 +├── systemui # SystemUI应用代码。 +├── settings # 设置应用代码仓。 +├── hap # 系统应用二进制仓。 +``` + +## 相关仓 + +**系统应用** + +applications\_standard\_settings + +applications\_standard\_launcher + +applications\_standard\_systemui + +applications\_standard\_hap + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/30.\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/30.\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..c4c3e5f385dc5fc937ce5e3a453a4f666f6159de --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/30.\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,76 @@ +--- +title: 编译构建子系统 +permalink: /pages/0000011d +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 编译构建子系统 + +- [基本概念](#section175012297491) +- [运作机制](#section193961322175011) +- [轻量和小型系统](#section119041639115811) +- [标准系统](#section8750514195912) +- [相关仓](#section44651652878) + +编译构建子系统提供了一个基于gn和ninja的编译构建框架。主要提供以下功能: + +- 构建不同芯片平台的产品。如:Hi3516DV300平台。 + +- 根据产品配置可以按照组件组装打包产品需要的能力。 + +## 基本概念 + +在了解编译构建子系统的能力前,应了解如下基本概念: + +- 平台 + + 开发板和内核的组合,不同平台支持的子系统和组件不同。 + +- 子系统 + + OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 \> 子系统 \> 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或组件。子系统是一个逻辑概念,它具体由对应的组件构成。 + +- 组件 + + 对子系统的进一步拆分,可复用的软件单元,它包含源码、配置文件、资源文件和编译脚本;能独立构建,以二进制方式集成,具备独立验证能力的二进制单元。 + +- gn + + Generate ninja的缩写,用于产生ninja文件。 + +- ninja + + ninja是一个专注于速度的小型构建系统。 + + +## 运作机制 + +OpenHarmony侧的编译构建流程主要包括编译命令行解析,调用gn,执行ninja: + +- 命令行解析:解析待编译的产品名称,加载相关配置。 +- 调用gn: 根据命令行解析的产品名称和编译类型,配置编译工具链和全局的编译选项。 +- 执行ninja:启动编译并生成对应的产品版本。 + +## 轻量和小型系统 + +轻量和小型系统的编译构建介绍请见[build\_lite](https://gitee.com/openharmony/build_lite)的Readme文档。 + +## 标准系统 + +标准系统的编译构建相关介绍请见build仓的Readme文档。 + +## 相关仓 + +**编译构建子系统** + +[build\_lite](https://gitee.com/openharmony/build_lite) + +build + diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/31.\350\257\255\350\250\200\350\277\220\350\241\214\346\227\266\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/31.\350\257\255\350\250\200\350\277\220\350\241\214\346\227\266\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..3e10c028ed91669dbdd70a607a508a74fd276d86 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/31.\350\257\255\350\250\200\350\277\220\350\241\214\346\227\266\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,67 @@ +--- +title: 语言运行时子系统 +permalink: /pages/0000011e +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# 语言运行时子系统 + +- [简介](#section15963162310012) +- [目录](#section971210485617) +- [约束](#section119744591305) +- [说明](#section1312121216216) +- [相关仓](#section1371113476307) + +## 简介 + +语言运行时子系统提供了JS、C/C++语言程序的编译、执行环境,提供支撑运行时的基础库,以及关联的API接口、编译器和配套工具。当前支持的编程语言包括JS、C/C++。子系统中的组件划分也是基于编程语言维度,每个组件支持单独编译,可以基于场景进行组合和分离。 + +**图 1** 子系统架构图 + + +![](/images/readme/figures/子系统架构图-5.png) + +如上图所示,子系统提供编译器及相关工具链支撑JS、C/C++语言的运行,并提供了语言相关基础库、API 接口、JS engine能力。 + +## 目录 + +``` +/prebuilts/mingw-w64/ohos/linux-x86_64 # 提供Linux平台交叉编译工具链 + └── clang-mingw + ├── bin + ├── lib + ├── libexec + ├── NOTICE + ├── share + └── x86_64-w64-mingw32 +``` + +## 约束 + +1. 相关API接口不能擅自新增、修改和调整 +2. JS engine的实现由子系统内部约束,不对外提供配置项。 + +## 说明 + +语言基础能力支持通过库文件方式支持,部分能力会整合到Native、JS的SDK中,集成到DevEco Studio中发布使用。 + +涉及引用的三方软件及预编译工具链仓如下: + +/third\_party/boost + +/third\_party/quickjs + +/third\_party/jerryscript + +/third\_party/mingw-w64 + +## 相关仓 + +**语言运行时子系统** diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/32.AI\344\270\232\345\212\241\345\255\220\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/32.AI\344\270\232\345\212\241\345\255\220\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..9479cca7ca90ec5521e306e1030e2303c1c4b227 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/02.\344\272\206\350\247\243OpenHarmony\347\263\273\347\273\237/32.AI\344\270\232\345\212\241\345\255\220\347\263\273\347\273\237.md" @@ -0,0 +1,445 @@ +--- +title: AI业务子系统 +permalink: /pages/0000011f +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:27 +--- +# AI业务子系统 + +- [简介](#section187321516154516) +- [目录](#section571610913453) +- [约束](#section5748426453) +- [使用](#section7981135212144) +- [涉及仓](#section10492183517430) +- [AI引擎开发导航](#section6808423133718) + +## 简介 + +AI业务子系统是OpenHarmony提供原生的分布式AI能力的子系统。本次开源范围是提供了统一的AI引擎框架,实现算法能力快速插件化集成。框架中主要包含插件管理、模块管理和通信管理等模块,对AI算法能力进行生命周期管理和按需部署。后续,会逐步定义统一的AI能力接口,便于AI能力的分布式调用。同时,提供适配不同推理框架层级的统一推理接口。 + +**图 1** AI引擎框架 +![](/images/readme/figures/AI引擎框架.png "AI引擎框架") + +## 目录 + +``` +/foundation/ai/engine # AI子系统主目录 +├── interfaces +│ └── kits # AI子系统对外接口 +└── services +│ ├── client # AI子系统Client模块 +│ │ ├── client_executor # Client模块执行主体 +│ │ └── communication_adapter # Client模块通信适配层,支持拓展 +│ ├── common # AI子系统公共工具、协议模块 +│ │ ├── platform +│ │ ├── protocol +│ │ └── utils +│ └── server # AI子系统服务端模块 +│ │ ├── communication_adapter # Server模块通信适配层,支持拓展 +│ │ ├── plugin +│ │ ├── asr +│ │ └── keyword_spotting # ASR算法插件参考:唤醒词识别 +│ │ └── cv +│ │ └── image_classification # CV算法插件参考:图片分类 +│ │ ├── plugin_manager +│ │ └── server_executor # Server模块执行主体 +``` + +## 约束 + +* **语言限制**:C/C++语言 + +* **操作系统限制**:OpenHarmony操作系统 + +* **AI服务启动的约束与限制**:SAMGR(System Ability Manager)启动且运行正常 + +## 使用 + +1. **AI业务子系统编译** + + 轻量级AI引擎框架模块,代码所在路径://foundation/ai/engine/services + + 编译指令如下: + + 1. **设置编译路径** + + ``` + hb set -root dir(项目代码根目录) + ``` + + 2. **设置编译产品**(执行后用方向键和回车进行选择): + + ``` + hb set -p + ``` + + 3. **执行编译**: + + ``` + hb build -f(编译全仓) + 或者 hb build ai_engine(只编译ai_engine组件) + ``` + + >**注意**:hb相关配置请参考编译构建子系统**build\_lite** + +2. **插件开发**(以唤醒词识别为例) + + 位置://foundation/ai/engine/services/server/plugin/asr/keyword\_spotting + + >**注意**:插件需要实现server提供的IPlugin接口和IPluginCallback接口 + + ``` + #include "plugin/i_plugin.h + class KWSPlugin : public IPlugin { # Keywords Spotting Plugin(KWSPlugin)继承IPlugin算法插件基类public: + KWSPlugin(); + ~KWSPlugin(); + + const long long GetVersion() const override; + const char* GetName() const override; + const char* GetInferMode() const override; + + int32_t Prepare(long long transactionId, const DataInfo &amp;inputInfo, DataInfo &amp;outputInfo) override; + int32_t SetOption(int optionType, const DataInfo &amp;inputInfo) override; + int32_t GetOption(int optionType, const DataInfo &amp;inputInfo, DataInfo &amp;outputInfo) override; + int32_t SyncProcess(IRequest *request, IResponse *&amp;response) override; + int32_t AsyncProcess(IRequest *request, IPluginCallback*callback) override; + int32_t Release(bool isFullUnload, long long transactionId, const DataInfo &amp;inputInfo) override; + . + . + . + }; + ``` + + >**注意**:SyncProcess和AsyncProcess接口只需要根据算法实际情况实现一个接口即可,另一个用空方法占位(这里KWS插件为同步算法,故异步接口为空实现)。 + + ``` + #include "aie_log.h" + #include "aie_retcode_inner.h" + . + . + . + + const long long KWSPlugin::GetVersion() const + { + return ALGOTYPE_VERSION_KWS; + } + + const char *KWSPlugin::GetName() const + { + return ALGORITHM_NAME_KWS.c_str(); + } + + const char *KWSPlugin::GetInferMode() const + { + return DEFAULT_INFER_MODE.c_str(); + } + . + . + . + int32_t KWSPlugin::AsyncProcess(IRequest *request, IPluginCallback *callback) + { + return RETCODE_SUCCESS; + } + ``` + +3. **插件SDK开发**(以唤醒词识别kws\_sdk为例) + + 位置://foundation/ai/engine/services/client/algorithm\_sdk/asr/keyword\_spotting + + 唤醒词识别SDK: + + ``` + class KWSSdk { + public: + KWSSdk(); + virtual ~KWSSdk(); + + /** + * @brief Create a new session with KWS Plugin + * + * @return Returns KWS_RETCODE_SUCCESS(0) if the operation is successful, + * returns a non-zero value otherwise. + */ + int32_t Create(); + + /** + * @brief Synchronously execute keyword spotting once + * + * @param audioInput pcm data. + * @return Returns KWS_RETCODE_SUCCESS(0) if the operation is successful, + * returns a non-zero value otherwise. + */ + int32_t SyncExecute(const Array &audioInput); + + /** + * @brief Asynchronously execute keyword spotting once + * + * @param audioInput pcm data. + * @return Returns KWS_RETCODE_SUCCESS(0) if the operation is successful, + * returns a non-zero value otherwise. + */ + int32_t AsyncExecute(const Array &audioInput); + + /** + * @brief Set callback + * + * @param callback Callback function that will be called during the process. + * @return Returns KWS_RETCODE_SUCCESS(0) if the operation is successful, + * returns a non-zero value otherwise. + */ + int32_t SetCallback(const std::shared_ptr &callback); + + /** + * @brief Destroy the created session with KWS Plugin + * + * @return Returns KWS_RETCODE_SUCCESS(0) if the operation is successful, + * returns a non-zero value otherwise. + */ + int32_t Destroy(); + ``` + + >**注意**:SDK调用AI引擎客户端接口顺序应遵循AieClientInit-\>AieClientPrepare-\>AieClientSyncProcess/AieClientAsyncProcess-\>AieClientRelease-\>AieClientDestroy,否则调用接口会返回错误码;同时应保证各个接口都有调用到,要不然会引起内存泄漏。 + + ``` + int32_t KWSSdk::KWSSdkImpl::Create() + { + if (kwsHandle_ != INVALID_KWS_HANDLE) { + HILOGE("[KWSSdkImpl]The SDK has been created"); + return KWS_RETCODE_FAILURE; + } + if (InitComponents() != RETCODE_SUCCESS) { + HILOGE("[KWSSdkImpl]Fail to init sdk components"); + return KWS_RETCODE_FAILURE; + } + int32_t retCode = AieClientInit(configInfo_, clientInfo_, algorithmInfo_, nullptr); + if (retCode != RETCODE_SUCCESS) { + HILOGE("[KWSSdkImpl]AieClientInit failed. Error code[%d]", retCode); + return KWS_RETCODE_FAILURE; + } + if (clientInfo_.clientId == INVALID_CLIENT_ID) { + HILOGE("[KWSSdkImpl]Fail to allocate client id"); + return KWS_RETCODE_FAILURE; + } + DataInfo inputInfo = { + .data = nullptr, + .length = 0, + }; + DataInfo outputInfo = { + .data = nullptr, + .length = 0, + }; + retCode = AieClientPrepare(clientInfo_, algorithmInfo_, inputInfo, outputInfo, nullptr); + if (retCode != RETCODE_SUCCESS) { + HILOGE("[KWSSdkImpl]AieclientPrepare failed. Error code[%d]", retCode); + return KWS_RETCODE_FAILURE; + } + if (outputInfo.data == nullptr || outputInfo.length <= 0) { + HILOGE("[KWSSdkImpl]The data or length of output info is invalid"); + return KWS_RETCODE_FAILURE; + } + MallocPointerGuard pointerGuard(outputInfo.data); + retCode = PluginHelper::UnSerializeHandle(outputInfo, kwsHandle_); + if (retCode != RETCODE_SUCCESS) { + HILOGE("[KWSSdkImpl]Get handle from inputInfo failed"); + return KWS_RETCODE_FAILURE; + } + return KWS_RETCODE_SUCCESS; + } + + int32_t KWSSdk::KWSSdkImpl::SyncExecute(const Array &audioInput) + { + intptr_t newHandle = 0; + Array kwsResult = { + .data = nullptr, + .size = 0 + }; + DataInfo inputInfo = { + .data = nullptr, + .length = 0 + }; + DataInfo outputInfo = { + .data = nullptr, + .length = 0 + }; + int32_t retCode = PluginHelper::SerializeInputData(kwsHandle_, audioInput, inputInfo); + if (retCode != RETCODE_SUCCESS) { + HILOGE("[KWSSdkImpl]Fail to serialize input data"); + callback_->OnError(KWS_RETCODE_SERIALIZATION_ERROR); + return RETCODE_FAILURE; + } + retCode = AieClientSyncProcess(clientInfo_, algorithmInfo_, inputInfo, outputInfo); + if (retCode != RETCODE_SUCCESS) { + HILOGE("[KWSSdkImpl]AieClientSyncProcess failed. Error code[%d]", retCode); + callback_->OnError(KWS_RETCODE_PLUGIN_EXECUTION_ERROR); + return RETCODE_FAILURE; + } + if (outputInfo.data == nullptr || outputInfo.length <= 0) { + HILOGE("[KWSSdkImpl] The data or length of outputInfo is invalid. Error code[%d]", retCode); + callback_->OnError(KWS_RETCODE_NULL_PARAM); + return RETCODE_FAILURE; + } + MallocPointerGuard pointerGuard(outputInfo.data); + retCode = PluginHelper::UnSerializeOutputData(outputInfo, newHandle, kwsResult); + if (retCode != RETCODE_SUCCESS) { + HILOGE("[KWSSdkImpl]UnSerializeOutputData failed. Error code[%d]", retCode); + callback_->OnError(KWS_RETCODE_UNSERIALIZATION_ERROR); + return retCode; + } + if (kwsHandle_ != newHandle) { + HILOGE("[KWSSdkImpl]The handle[%lld] of output data is not equal to the current handle[%lld]", + (long long)newHandle, (long long)kwsHandle_); + callback_->OnError(KWS_RETCODE_PLUGIN_SESSION_ERROR); + return RETCODE_FAILURE; + } + callback_->OnResult(kwsResult); + return RETCODE_SUCCESS; + } + + int32_t KWSSdk::KWSSdkImpl::Destroy() + { + if (kwsHandle_ == INVALID_KWS_HANDLE) { + return KWS_RETCODE_SUCCESS; + } + DataInfo inputInfo = { + .data = nullptr, + .length = 0 + }; + int32_t retCode = PluginHelper::SerializeHandle(kwsHandle_, inputInfo); + if (retCode != RETCODE_SUCCESS) { + HILOGE("[KWSSdkImpl]SerializeHandle failed. Error code[%d]", retCode); + return KWS_RETCODE_FAILURE; + } + retCode = AieClientRelease(clientInfo_, algorithmInfo_, inputInfo); + if (retCode != RETCODE_SUCCESS) { + HILOGE("[KWSSdkImpl]AieClientRelease failed. Error code[%d]", retCode); + return KWS_RETCODE_FAILURE; + } + retCode = AieClientDestroy(clientInfo_); + if (retCode != RETCODE_SUCCESS) { + HILOGE("[KWSSdkImpl]AieClientDestroy failed. Error code[%d]", retCode); + return KWS_RETCODE_FAILURE; + } + mfccProcessor_ = nullptr; + pcmIterator_ = nullptr; + callback_ = nullptr; + kwsHandle_ = INVALID_KWS_HANDLE; + return KWS_RETCODE_SUCCESS; + } + ``` + +4. **sample开发** [(参考唤醒词识别demo)](https://gitee.com/openharmony/applications_sample_camera/tree/master/ai) + + 位置://applications/sample/camera/ai/asr/keyword\_spotting + + **调用Create** + + ``` + bool KwsManager::PreparedInference() + { + if (capturer_ == nullptr) { + printf("[KwsManager] only load plugin after AudioCapturer ready\n"); + return false; + } + if (plugin_ != nullptr) { + printf("[KwsManager] stop created InferencePlugin at first\n"); + StopInference(); + } + plugin_ = std::make_shared(); + if (plugin_ == nullptr) { + printf("[KwsManager] fail to create inferencePlugin\n"); + return false; + } + if (plugin_->Create() != SUCCESS) { + printf("[KwsManager] KWSSdk fail to create.\n"); + return false; + } + std::shared_ptr callback = std::make_shared(); + if (callback == nullptr) { + printf("[KwsManager] new Callback failed.\n"); + return false; + } + plugin_->SetCallback(callback); + return true; + } + ``` + + **调用SyncExecute** + + ``` + void KwsManager::ConsumeSamples() + { + uintptr_t sampleAddr = 0; + size_t sampleSize = 0; + int32_t retCode = SUCCESS; + while (status_ == RUNNING) { + { + std::lock_guard lock(mutex_); + if (cache_ == nullptr) { + printf("[KwsManager] cache_ is nullptr.\n"); + break; + } + sampleSize = cache_->GetCapturedBuffer(sampleAddr); + } + if (sampleSize == 0 || sampleAddr == 0) { + continue; + } + Array input = { + .data = (int16_t *)(sampleAddr), + .size = sampleSize >> 1 + }; + { + std::lock_guard lock(mutex_); + if (plugin_ == nullptr) { + printf("[KwsManager] cache_ is nullptr.\n"); + break; + } + if ((retCode = plugin_->SyncExecute(input)) != SUCCESS) { + printf("[KwsManager] SyncExecute KWS failed with retCode = [%d]\n", retCode); + continue; + } + } + } + } + ``` + + **调用Destroy** + + ``` + void KwsManager::StopInference() + { + printf("[KwsManager] StopInference\n"); + if (plugin_ != nullptr) { + int ret = plugin_->Destroy(); + if (ret != SUCCESS) { + printf("[KwsManager] plugin_ destroy failed.\n"); + } + plugin_ = nullptr; + } + } + ``` + + +## 涉及仓 + +AI子系统 + +ai_engine + +依赖仓: + +build\_lite + +distributedschedule\_services\_samgr\_lite + +startup\_init\_lite + +## AI引擎开发导航 + +[《AI插件开发指南》](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-aiframework-guide.md) \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/16.\346\234\257\350\257\255\350\241\250.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/03.\346\234\257\350\257\255.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/16.\346\234\257\350\257\255\350\241\250.md" rename to "website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/03.\346\234\257\350\257\255.md" index 03ef8e6ef47457d24f9f6bf32221a15a6b5b20b5..b4d8ad9acaaedbd4deff6d886cf8b2cae73628ba 100644 --- "a/website/docs/01.\346\226\207\346\241\243/16.\346\234\257\350\257\255\350\241\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/03.\346\234\257\350\257\255.md" @@ -1,6 +1,6 @@ --- -title: 术语表 -permalink: /pages/000f +title: 术语 +permalink: /pages/000002 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:31:27 --- # 术语 diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/01.OpenHarmonyv3.0LTS.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/01.OpenHarmonyv3.0LTS.md" new file mode 100644 index 0000000000000000000000000000000000000000..06daee71e6b0c712bd294876468b818bb1fbcc71 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/01.OpenHarmonyv3.0LTS.md" @@ -0,0 +1,206 @@ +--- +title: OpenHarmonyv3.0LTS +permalink: /pages/00000300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +--- +# OpenHarmony 3.0 LTS + +- [版本概述](#版本概述) +- [配套关系](#配套关系) +- [源码获取](#源码获取) +- [更新说明](#更新说明) + - [特性变更](#特性变更) + - [API变更](#api变更) + - [芯片及开发板适配](#芯片及开发板适配) +- [修复缺陷列表](#修复缺陷列表) +- [遗留缺陷列表](#遗留缺陷列表) + +## 版本概述 + +当前版本在OpenHarmony 2.2 Beta2的基础上,针对标准系统、轻量系统和小型系统更新内容: + +标准系统新增特性功能: + +- 用户程序框架支持服务能力(ServiceAbility,DataAbility)和线程模型。 + +- 支持文件安全访问,即文件转成URI和解析URI打开文件的能力。 + +- 支持设备管理PIN码认证的基本能力。 + +- 支持关系型数据库、分布式数据管理基础能力。 + +- 支持方舟JS编译工具链和运行时,支持OpenHarmony JS UI框架应用开发和运行。 + +- 支持远程绑定ServiceAbility、FA跨设备迁移能力。 + +- 支持应用通知订阅与应用通知消息跳转能力。 + +- 支持输入法框架及支持输入基础英文字母、符号和数字。 + +- 相机应用支持预览、拍照和录像基础能力。 + +- 支持CS基础通话、GSM短信能力。 + +- 支持定时器能力,提供定时时区管理能力。 + +- 在标准设备间的分布式组网下,提供应用跨设备访问对端资源或能力时的权限校验功能。 + +轻量和小型系统新增特性功能: + +- 新增轻量级分布式能力增强,支持从轻量级系统启动标准系统上的Ability。 + +- 软总线能力增强支持,提供认证通道传输能力,用于设备绑定。 + +- 轻量级全球化能力增强支持,新增31种语言支持。 + +- 轻量系统上新增权限属性字段及其写入接口,上层应用可通过该字段实现相关业务。 + + +## 配套关系 + +**表1** 版本软件和工具配套关系 + +| 软件 | 版本 | 备注 | +| -------- | -------- | -------- | +| OpenHarmony | 3.0 LTS | NA | +| HUAWEI DevEco Studio(可选) | 3.0 Beta1 | OpenHarmony应用开发推荐使用。 | +| HUAWEI DevEco Device Tool(可选) | 2.2 Beta2 | OpenHarmony智能设备集成开发环境推荐使用。 | + + +## 源码获取 + + +### 通过repo获取 + +**方式** **一(推荐)** + +通过repo + ssh 下载(需注册公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191))。 + +``` +repo init -u git@gitee.com:openharmony/manifest.git -b refs/tags/OpenHarmony-v3.0-LTS --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +**方式二** + +通过repo + https 下载。 + +``` +repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v3.0-LTS --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +### 从镜像站点获取 + +**表2** 获取源码路径 + +| **LTS版本源码** | **版本信息** | **下载站点** | **SHA256校验码** | +| -------- | -------- | -------- | -------- | +| 全量代码(标准、轻量和小型系统) | 3.0 | [站点](https://repo.huaweicloud.com/harmonyos/os/3.0/code-v3.0-LTS.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.0/code-v3.0-LTS.tar.gz.sha256) | +| 标准系统解决方案(二进制) | 3.0 | [站点](https://repo.huaweicloud.com/harmonyos/os/3.0/standard.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.0/standard.tar.gz.sha256) | +| Hi3861解决方案(二进制) | 3.0 | [站点](https://repo.huaweicloud.com/harmonyos/os/3.0/hispark_pegasus.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.0/hispark_pegasus.tar.gz.sha256) | +| Hi3518解决方案(二进制) | 3.0 | [站点](https://repo.huaweicloud.com/harmonyos/os/3.0/hispark_aries.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.0/hispark_aries.tar.gz.sha256) | +| Hi3516解决方案-LiteOS(二进制) | 3.0 | [站点](https://repo.huaweicloud.com/harmonyos/os/3.0/hispark_taurus.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.0/hispark_taurus.tar.gz.sha256) | +| Hi3516解决方案-Linux(二进制) | 3.0 | [站点](https://repo.huaweicloud.com/harmonyos/os/3.0/hispark_taurus_linux.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/3.0/hispark_taurus_linux.tar.gz.sha256) | +| Release Notes | 3.0 | [站点](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.0-LTS/zh-cn/release-notes/OpenHarmony-v3.0-LTS.md) | - | + + +## 更新说明 + +本版本在OpenHarmony 2.2 Beta2的基础上有如下变更。 + + +### 特性变更 + +**表3** 版本新增特性表 + +| 子系统名称 | 标准系统 | 轻量、小型系统 | +| -------- | -------- | -------- | +| 分布式任务调度 | - 新增远程绑定ServiceAbility基本功能
- 新增FA跨设备迁移功能
- 新增组件visible属性权限校验功能 | 新增小型系统启动HarmonyOS Ability的功能 | +| 图形 | 对于带有GPU模块的芯片平台,支持使用GPU进行渲染合成,以提升图形性能,降低CPU负载 | NA | +| 分布式硬件 | - 支持基于分布式软总线认证通道的PIN码认证方案
- 支持PIN码认证授权提示弹窗
- 支持PIN码显示弹窗
- 支持PIN码输入弹窗 | NA | +| 事件通知 | - 支持应用通知订阅 & 取消订阅
- 支持应用侧发布&取消本地文本、图片通知
- 支持应用通知消息跳转能力
- 支持应用侧增加&删除slot
- 支持通知流控处理、死亡监听能力 | NA | +| 分布式软总线 | 软总线:
- 支持基于CoAP的主动发现和被动发现,支持通过BLE主动发现连接
- 支持基于WLAN网络的手动入网和自组网
- 支持基于WLAN网络,直通模式下的消息、字节、文件传输
IPC:
- 支持设备内基于linux内核binder协议的进程间通信能力
- 支持对象和序列化数据通信
RPC:
- 支持设备间基于分布式软总线的进程间通信能力
- 支持对象和序列化数据通信
- 接口与IPC保持一致 | 软总线:
- 支持基于CoAP的主动发现和被动发现
- 支持基于WLAN网络的手动入网和自组网
- 支持基于WLAN网络,直通模式下的消息、字节、文件传输
IPC:
- 支持设备内基于Linux/LiteOS内核binder协议的进程间通信
- 支持char/int/long基础数据接口的序列化通信 | +| 全球化 | 提供获取系统设置的语言、地区、区域信息,以及获取语言和地区的本地化名称的能力 | 轻量级全球化能力增强支持,新增31种语言支持 | +| 系统应用 | - 桌面:全新架构优化
- SystemUI:
  - 通知中心以及普通文本通知功能
  - 控制中心:WLAN、飞行模式开关、亮度调节、声音调节
  - 全新架构优化
- 设置:全新架构优化
- 相机:
  - 支持基础拍照、录像功能
  - 分布式协同:拉起对端相机并拍照 | NA | +| 语言编译运行时 | 新增方舟JS编译工具链和运行时,支持OpenHarmony JS UI框架应用开发和运行 | NA | +| 媒体 | - 相机组件中新增录像功能
- 新增音频录制功能接口 | 新增支持播放mp3格式文件 | +| JS UI框架 | - 支持迁移相关生命周期
- 支持系统服务弹窗
- 支持使用JS开发service类型和data类型的Ability | NA | +| 内核 | 新增支持OpenHarmony Common Linux Kernel 5.10 | 小型系统新增支持OpenHarmony Common Linux Kernel 5.10 | +| DFX | - 提供HiAppEvent应用事件打点的JS API
- 提供HiCollie卡死检测框架
- 提供HiTrace分布式调用链基础库 | NA | +| 驱动 | 新增I2S、陀螺仪、压力、霍尔驱动模型 | NA | +| 安全 | 在标准设备间的分布式组网下,提供应用跨设备访问对端资源或能力时的权限校验功能 | 轻量系统上新增权限属性字段及其写入接口,上层应用可通过该字段实现相关业务(如弹框授权场景下,用户拒绝授权后不再弹框) | +| 电话服务 | - 搜网功能模块:支持飞行模式设置、搜网模式设置(包括手动搜网和自动搜网)、LTE制式信号强度获取
- SIM功能模块:支持PIN/PUK解锁、卡文件信息获取、卡账户信息的存取、卡状态获取
- 蜂窝通话功能模块:支持通话前后台切换、来电静音、呼叫保持与恢复、三方通话、DTMF
- 短彩信功能模块:支持SIM卡短信的增删改查 | NA | +| 分布式文件 | - 支持f2fs、ext4文件系统不同参数设置的分区挂载能力
- 支持文件安全访问,即文件转成URI和解析URI打开文件的能力
- 支持系统应用访问公共目录的能力 | NA | +| 分布式数据管理 | - 支持关系型数据库JS基础能力(增删改查等)
- 支持分布式数据管理JS基础能力(增删改查等) | NA | +| 编译构建 | - 支持编译arm64形态产品
- 支持编译ohos-sdk | NA | +| 用户程序框架 | - 支持ServiceAbility JS开发能力
- 支持DataAbility JS开发能力
- HAP支持多Ability声明
- 本地Ability迁移到远程设备
- 应用任务栈保存与恢复
- JS 利用Zip库实现文件压缩和解压缩 | NA | +| 杂散软件服务 | 支持定时器能力,提供定时时区管理能力 | NA | + + +### API变更 + +API变更请参考:[JS API 差异报告](/pages/extra/d7f128/) + + +### 芯片及开发板适配 + +芯片及开发板适配状态请参考[SIG-Devboard](https://gitee.com/openharmony/community/blob/master/sig/sig-devboard/sig_devboard_cn.md)信息。 + + +## 修复缺陷列表 + +**表4** 轻量和小型系统解决的缺陷ISSUE列表 + +| ISSUE单号 | 问题描述 | +| -------- | -------- | +| [I45AVP](https://gitee.com/openharmony/hiviewdfx_hilog/issues/I45AVP) | 执行hilog落盘之后hilog命令执行失败 | +| [I47EPA](https://gitee.com/openharmony/appexecfwk_appexecfwk_lite/issues/I47EPA?from=project-issue) | 入参为空或无效时,GetBundleSize接口返回错误 | +| [I434AD](https://gitee.com/openharmony/multimedia_camera_lite/issues/I434AD) | Hi3516DV300轻量级系统常驻内存超基线 | +| [I434P1](https://gitee.com/openharmony/multimedia_camera_lite/issues/I434P1) | Hi3518EV300轻量级系统常驻内存超基线 | +| [I46I6K](https://gitee.com/openharmony/multimedia_media_lite/issues/I46I6K?from=project-issue) | 多媒体子系统相关代码存在安全编码问题 | +| [I46E6S](https://gitee.com/openharmony/kernel_liteos_m/issues/I46E6S?from=project-issue) | 轻量级内核模块编译添加-Werror编译选项 | +| [I47ETO](https://gitee.com/openharmony/appexecfwk_appexecfwk_lite/issues/I47ETO?from=project-issue -) | 权限校验没有生效,使用测试 bin 直接调用无权限 hap,期望查询失败返回 0,结果查询成功 | +| [I48A2I](https://gitee.com/openharmony/drivers_peripheral/issues/I48A2I) | Hi3516DV300轻量级版本调用AllocMem接口测试,单板挂死 | +| [I42LCU](https://gitee.com/openharmony/kernel_liteos_m/issues/I42LCU) | 集成测试开发板移植指导中需增加线程不足的确认方法和配置线程个数的方法 | +| [I3IPD7](https://gitee.com/openharmony/kernel_liteos_m/issues/I3IPD7) | 不支持osThreadExit/join函数需要在头文件中说明 | +| [I3M12H](https://gitee.com/openharmony/kernel_liteos_a/issues/I3M12H) | 集成测试发送两个不同的信号,sigwait第二次等到的仍是第一个信号 | +| [I47X2Z](https://gitee.com/openharmony/kernel_liteos_a/issues/I47X2Z?from=project-issue) | 集成测试 在执行ActsIpcShmTest.bin脚本,出现大量未释放的共享内存 | +| [I4BL3S](https://gitee.com/openharmony/kernel_liteos_a/issues/I4BL3S) | 集成测试fs_posix模块nfs用例跑多次会出现不停打印申请内存失败问题 | +| [I490KZ](https://gitee.com/openharmony/kernel_liteos_a/issues/I490KZ) | FutexTest.testPthreadTimdOutRWlockWR用例执行失败 | +| [I44SFO](https://gitee.com/openharmony/third_party_toybox/issues/I44SFO) | 集成测试在某个目录下mv一个文件后,再在此目录下创建同名文件并二次mv该文件失败,提示此文件不存在 | + +**表5** 标准系统解决的缺陷ISSUE列表 + +| ISSUE单号 | 问题描述 | +| -------- | -------- | +| [I46A6H](https://gitee.com/openharmony/ace_ace_engine/issues/I46A6H) | XTS子系统压力测试过程中libace.z.so异常导致ohos.samples.flashlight出现cppcrash异常 | +| [I48HLN](https://gitee.com/openharmony/app_samples/issues/I48HLN) | Demo&应用子系统- [ JsCanvas] 清除的button功能未生效 | +| [I46HH7](https://gitee.com/openharmony/drivers_peripheral/issues/I46HH7) | 驱动子系统-标准系统单板WLAN测试用例失败 | +| [I4312A](https://gitee.com/openharmony/communication_dsoftbus/issues/I4312A) | 【2.2 Beta2】【软总线】已组网,断1端网络后,自组网失败(GetAllNodeDeviceInfo返回null) | +| [I43WIJ](https://gitee.com/openharmony/communication_dsoftbus/issues/I43WIJ) | 【2.2 Beta2】【软总线】已组网,一端切换网络再切回,过程中组网未下线(无上下线回调) | +| [I43KLC](https://gitee.com/openharmony/communication_dsoftbus/issues/I43KLC) | 【2.2 Beta2】【软总线】注册节点状态监听,设备上线,设备再离线,offline回调调用了2次 | +| [I47WTY](https://gitee.com/openharmony/communication_dsoftbus/issues/I47WTY) | 【3.0 beta1】【软总线-传输】session id范围校验不严谨(有效范围1-16,校验时判断的是>17) | + + +## 遗留缺陷列表 + +**表6** 遗留缺陷列表 + +| ISSUE | 问题描述 | 影响 | 计划解决日期 | +| -------- | -------- | -------- | -------- | +| [I48IM7](https://gitee.com/openharmony/hiviewdfx_hilog/issues/I48IM7) | 运行hilog压力测试,hilogd异常重启,且hilog命令一直无法使用 | 压力测试下,低概率出现日志输出异常,调测场景可正常使用。 | 10月30日 | +| [I48YPH](https://gitee.com/openharmony/security_deviceauth/issues/I48YPH) | 【软总线-组网】测试发现和组网性能(循环离网-发现-组网)110次组网失败3次 | 低概率3/110,失败后重新发起组网即可。 | 10月30日 | +| [I4BVVW](https://gitee.com/openharmony/communication_dsoftbus/issues/I4BVVW) | 【软总线-组网】标准系统与手机开关网络自组网成功率97%失败3次需分析失败原因 | 低概率出现组网失败。 | 10月30日 | +| [I4BXWY](https://gitee.com/openharmony/multimedia_media_standard/issues/I4BXWY) | Hi3516音频录制后播放有杂音 | 仅在使用此开发板时,影响录制音频的播放体验效果。 | 10月30日 | +| [I4BXY1](https://gitee.com/openharmony/multimedia_camera_standard/issues/I4BXY1) | 视频录制后前几秒没声音,播放声画不同步,在板子播放会卡顿,音源较远时,有杂音 | 仅在使用此开发板时,影响录制视频的播放体验效果。 | 10月30日 | +| [3ZJ1D](https://gitee.com/openharmony/kernel_liteos_a/issues/I3ZJ1D) | XTS权限用例压测用户态概率失败 | 仅在重复创建子进程的XTS压力测试场景,设置子进程uid失败,低概率问题。 | 10月30日 | diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/02.OpenHarmonyv2.2beta2.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/02.OpenHarmonyv2.2beta2.md" new file mode 100644 index 0000000000000000000000000000000000000000..5829c5d219c2c2000136f48dee061b91f306deee --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/02.OpenHarmonyv2.2beta2.md" @@ -0,0 +1,399 @@ +--- +title: OpenHarmonyv2.2beta2 +permalink: /pages/00000301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +--- +# OpenHarmony v2.2 Beta2 + +- [版本概述](#section1677664815431) +- [配套关系](#section13201781528) +- [源码获取](#section1350215462116) +- [更新说明](#section11256141314463) +- [修复缺陷列表](#section3442123281619) + +## 版本概述 + +当前版本在OpenHarmony 2.0 Canary的基础上,针对轻量系统、小型系统和标准系统都有增加新的特性: + +标准系统新增特性功能如下: + +- 新增分布式远程拉起能力端到端的构建。 +- 新增系统基础应用的拖拽能力和新增若干Sample应用。 +- 新增媒体三大服务能力,提供更好的媒体系统功能。 + +轻量和小型系统新增特性功能如下: + +- 新增小型系统linux版本构建能力。 +- 新增轻量级内核能力增强,包括文件系统增强、内核调试工具增强支持、内核模块支持可配置、三方芯片适配支持、支持ARM9架构等。 +- 轻量级图形能力增强支持,包括支持多语言字体对齐、支持显示控件轮廓、支持点阵字体、供统一多后端框架支持多芯片平台等。 +- DFX能力增强支持,包括HiLog功能增强、HiEvent功能增强,提供轻量级系统信息dump工具、提供重启维侧框架等。 +- AI能力增强支持,包括新增linux内核适配支持、AI引擎支持基于共享内存的数据传输。 + +## 配套关系 + +**表 1** 版本软件和工具配套关系 + + + + + + + + + + + + + + + + + + + + +

软件

+

版本

+

备注

+

OpenHarmony

+

2.2 Beta2

+

NA

+

HUAWEI DevEco Studio(可选)

+

DevEco Studio 2.2 Beta1

+

OpenHarmony应用开发推荐使用。

+

HUAWEI DevEco Device Tool(可选)

+

Deveco DeviceTool 2.2 Beta1

+

OpenHarmony智能设备集成开发环境推荐使用。

+
+ +## 源码获取 + +### 通过repo下载 + +**方式一(推荐)** + +通过repo + ssh 下载(需注册公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191))。 + +``` +repo init -u git@gitee.com:openharmony/manifest.git -b refs/tags/OpenHarmony-v2.2-Beta2 --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +**方式二** + +通过repo + https 下载。 + +``` +repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v2.2-Beta2 --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +### 通过镜像站点下载 + +**表2** 源码获取路径 + +| 版本源码 | 版本信息 | 下载站点 | SHA256校验码 | +| -------- | -------- | -------- | -------- | +| 全量代码(标准、轻量和小型系统) | 2.2 | [站点](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/code-v2.2-beta2_20210730.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/code-v2.2-beta2_20210730.tar.gz.sha256) | +| 标准系统解决方案(二进制) | 2.2 | [站点](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/standard-2.2-Beta2.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/standard-2.2-Beta2.tar.gz.sha256) | +| Hi3861解决方案(二进制) | 2.2 | [站点](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/hispark_pegasus-2.2-Beta2.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/hispark_pegasus-2.2-Beta2.tar.gz.sha256) | +| Hi3518解决方案(二进制) | 2.2 | [站点](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/hispark_aries-2.2-Beta2.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/hispark_aries-2.2-Beta2.tar.gz.sha256) | +| Hi3516解决方案-LiteOS(二进制) | 2.2 | [站点](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/hispark_taurus-2.2-Beta2.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/hispark_taurus-2.2-Beta2.tar.gz.sha256) | +| Hi3516解决方案-Linux(二进制) | 2.2 | [站点](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/hispark_taurus_linux-2.2-Beta2.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/2.2-Beta2/hispark_taurus_linux-2.2-Beta2.tar.gz.sha256) | +| Release Notes | 2.2 | [站点](https://gitee.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-v2.2-beta2.md) | - | + + +## 更新说明 + +本版本在继承了OpenHarmony 2.0 Canary的基础上有如下变更。 + +### 特性变更 + +**表 3** 版本新增特性表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

子系统名称

+

标准系统

+

轻量、小型系统

+

分布式文件

+

提供本地system.file异步文件操作JS API,包括文件读写、目录访问、增删等接口。

+

NA

+

驱动

+

3QE85:新增Audio、Camera、USB、马达、ADC驱动模型。

+

LiteOS-M支持HDF框架。

+

电源管理服务

+

新增系统电源状态机、休眠运行锁、休眠唤醒功能。

+
  • 新增充放电状态查询接口、电量查询接口。
  • 提供低功耗模式支持,并提供低功耗模式统一API支持。
+

升级服务

+

新增恢复出厂功能。

+

NA

+

媒体

+
  • 新增音频服务,提供音频基础控制能力。
  • 新增相机服务,提供预览、拍照等基础功能力。
  • 新增媒体服务,提供音频、视频播放能力。
+

NA

+

JS UI框架

+

支持使用JS与C/C++混合开发JS API。

+

NA

+

事件通知

+

支持应用本地发送、取消多行文本通知能力。

+

NA

+

分布式软总线

+

新增软总线自组网功能,可信设备接入到局域网中(ETH\WiFi)后可自发现、无感知的接入到软总线。

+

NA

+

分布式数据管理

+
  • 新增分布式数据管理能力,支持分布式数据库在本地加密存储
  • 支持轻量级偏好数据库
+
  • 提供数据库内容的删除能力。
  • 提供统一的HAL文件系统操作函数实现。
  • 提供相关数据存储的原子操作能力。
  • 提供二进制Value的写入读取能力。
+

系统应用

+

桌面:

+
  • 桌面设置界面UX优化。
  • 新增桌面图标拖拽特性。
+

设置:

+
  • 新增Wlan设置功能。
+

SystemUI:

+
  • 新增卡信号图标显示功能。
+

图库:

+
  • 新增图片、视频资源的查看、移动、复制、删除、重命名等功能。
+

NA

+

全球化子系统

+
  • 完善时间日期格式化能力。
  • 支持时间段的格式化。
  • 新增数字格式化能力。
+
  • 新增构建自定义数据编译能力。
  • 新增构建星期、单复数、数字开关国际化能力。
  • 新增构建应用资源解析和加载机制。
  • 新增构建资源回溯机制。
+

Sample应用

+
  • 计算器中新增分布式功能,组网后支持拉起另一台组网设备上的计算器,两台设备可协同计算,计算数据实时同步。
  • 新增音频播放器应用,支持本地音频播放,组网后可将音乐播放接续至其他组网设备上。
+

NA

+

分布式设备管理

+

新增设备管理系统服务,提供分布式设备账号无关的认证组网能力。

+

NA

+

DFX

+

NA

+
  • 提供LiteOS内核系统信息dump工具。
  • 提供LiteOS内核死机重启维测框架。
  • 新增数字格式化能力。
  • HiLog功能增强。
  • HiEvent功能增强。
+

内核

+

NA

+
  • 支持轻量级Linux版本。
  • proc文件系统增强。
  • 新增mksh命令解析器。
  • 文件系统维测增强。
  • LiteOS-A內核模块支持可配置。
  • 支持LiteOS-A小系统三方芯片适配。
  • LiteOS-M支持三方组件Mbedtls编译。
  • LiteOS-M支持三方组件curl编译。
  • 支持轻量级shell框架和常用调测命令。
  • LiteOS-M支持ARM9架构。
  • 支持基于NOR Flash的littlefs文件系统。
  • LiteOS-M对外提供统一的文件系统操作接口。
  • 新增Namecache模块、Vnode管理、Lookup模块。
+

图形图像

+

NA

+
  • 支持A4\A8、LUT8、TSC图片格式作为输入。
  • 支持多语言字体对齐。
  • UIKit支持显示控件轮廓。
  • ScrollView/List支持通过弧形进度条展示滑动进度。
  • 支持开关按钮/复选框/单选按钮动效。
  • UIKit支持点阵字体产品化解耦。
  • UI框架提供统一多后端框架支持多芯片平台。
  • UIKit组件支持margin/padding。
  • 圆形/胶囊按钮支持缩放和白色蒙层动效。
+

编译构建

+

NA

+

支持开源软件的通用patch框架。

+

启动恢复

+

NA

+

支持恢复出厂设置支持多语言字体对齐。

+

分布式调度

+

NA

+

支持轻量设备启动富设备上的Ability。

+

AI

+

NA

+
  • AI子系统添加Linux内核适配,编译选项支持。
  • AI引擎支持基于共享内存的数据传输。
+
+ +### API变更 + +API变更请参考: + +[JS API 差异报告](/pages/extra/0612c5/) + +[Native API 差异报告](/pages/extra/878ece/) + +## 修复缺陷列表 + +**表 4** **解决的缺陷ISSUE列表** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ISSUE单号

+

问题描述

+

I3I31W

+

ActsNFSTest.bin会引起内核crash

+

I3D49E

+

uboot的路径不对

+

I3D71U

+

【驱动子系统】反复reset,启动到hmac_main_init SUCCESSULLY后,高概率出现系统挂死

+

I3DGZW

+

【应用程序框架子系统】HI3516开源板进入屏保后 ,点击触摸屏,出现蓝屏问题

+

I3DHIL

+

【系统问题】HI3518开源板剩余空间不足,导致ACTS用例大量失败

+

I3DU36

+

【应用程序框架子系统】ipcamera bm 查询命令失效

+

I3EALU

+

【媒体子系统】cameraActs 用例执行时,找不到相机配置文件,初始失败

+

I3EGUX

+

【可靠性问题】反复reset,出现一次KIdle进程crash,系统挂死无法启动

+

I3EH4E

+

【流水线问题】高概率出现:uname无响应,然后执行reset也无响应

+

I3EQJA

+

【文件系统】cat /proc/mounts功能不可用

+

I3EQRC

+

磁盘文件映射延迟测试:并发3个测试进程,系统crash

+

I3HVL0

+

3861编译失败,报错[OHOS ERROR] Fatal error: invalid -march= option:rv32imac

+

I3TS1Y

+

压力场景下文件相关Vnode资源耗尽

+

I3TXT8

+

孤儿进程无法回收,压力场景下TCB资源耗尽

+

I3UWXI

+

libwap.so 存在已知一般漏洞: CVE-2021-30004,CVSS:5.3;漏洞发布日期:2021-04-02,不符合产品发布要求,需要解决。

+

I3SWY2

+

高概率出现KProcess进程挂死,质量不达标

+

I3YJRO

+

liteos-a內核模块可配置编译失败

+

I3YNWM

+

文件系统维测增强功能在该版本有问题

+

I3VEOG

+

bin目录下没有mksh和toybox,导致已转测的toybox命令集无法测试

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/03.OpenHarmonyv2.0Canary.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/03.OpenHarmonyv2.0Canary.md" new file mode 100644 index 0000000000000000000000000000000000000000..efa239361a22a616d578f80783818b87763846cc --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/03.OpenHarmonyv2.0Canary.md" @@ -0,0 +1,262 @@ +--- +title: OpenHarmonyv2.0Canary +permalink: /pages/00000302 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +--- +# OpenHarmony 2.0 Canary(2021-06-01) + +- [版本概述](#section1677664815431) +- [配套关系](#section13201781528) +- [源码获取](#源码获取) +- [更新说明](#section11256141314463) + +## 版本概述 + +当前版本在OpenHarmony 1.1.0的基础上,增加标准系统版本,具备的主要功能如下: + +- 新增22个子系统,支持全面的OS能力,支持内存大于128M的带屏设备开发等。 +- 提供系统三大应用:桌面、设置和SystemUI。 +- 提供全新的OpenHarmony应用框架能力、Ability Cross-platform Engine能力。 +- 提供JS应用开发能力。 +- 提供媒体框架,支持音视频功能开发。 +- 提供图形框架能力,支持窗口管理和合成,支持GPU能力。 + +## 配套关系 + +**表 1** 版本软件和工具配套关系 + + + + + + + + + + + + + + + + + + + + +

软件

+

版本

+

备注

+

OpenHarmony

+

2.0 Canary

+

NA

+

HUAWEI DevEco Studio(可选)

+

DevEco Studio 2.1 Release

+

OpenHarmony应用开发推荐使用。

+

HUAWEI DevEco Device Tool(可选)

+

Deveco DeviceTool 2.2 Beta1

+

OpenHarmony智能设备集成开发环境推荐使用。

+
+ +## 源码获取 + + +### 通过repo下载 + + **方式一(推荐)** + +通过repo + ssh 下载(需注册公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191))。 + + ``` +repo init -u git@gitee.com:openharmony/manifest.git -b refs/tags/OpenHarmony-2.0-Canary --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' + ``` + + **方式二** + +通过repo + https 下载。 + +``` +repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-2.0-Canary --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +### 通过镜像站点获取 + +**表2** 源码获取路径 + +| 版本源码 | 版本信息 | 下载站点 | SHA256校验码 | +| -------- | -------- | -------- | -------- | +| 全量代码 | 2.0 | [站点](https://repo.huaweicloud.com/harmonyos/os/2.0/code-2.0-canary_20210601.tar.gz) | [SHA256校验码](https://repo.huaweicloud.com/harmonyos/os/2.0/code-2.0-canary_20210601.tar.gz.sha256) | +| Release Notes | 2.0 | [站点](https://gitee.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-2-0-Canary.md) | - | + +## 更新说明 + +本版本完全继承了OpenHarmony 1.1.0的所有特性,并在OpenHarmony 1.1.0版本的基础上,新增标准系统版本形态,详情请参考下表 。 + +**表 3** 版本新增特性表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

子系统名称

+

新增特性

+

内核

+

基于Linux Kernel LTS社区开源基线,回合CVE补丁,包含了OpenHarmony上层特性适配。

+

分布式文件

+

提供本地同步文件 JS 接口,包括文件读写、目录访问以及文件Stat。

+

图形图像

+
  • 新增窗口管理功能,包括创建、销毁和窗口栈管理等。
  • 新增合成器功能,包括CPU、GPU和TDE合成。
  • 新增bufferqueue功能,支持进程间传递。
  • 新增vsync管理功能。
+

驱动

+

新增用户态驱动框架。

+

电源管理服务

+

新增电源管理能力,包括关机服务、亮灭屏管理、亮度调节、电池状态查询、系统电源管理、休眠锁管理等功能。

+

多模输入子系统

+

新增支持单指触屏输入能力。

+

启动恢复子系统

+

系统属性管理新增JS API。

+

升级服务

+
  • 新增recovery系统升级服务能力。
  • 新增差分包升级能力。
  • 新增系统属性管理JS API。
+

帐号

+

提供分布式云帐号登录状态管理功能。

+

编译构建

+
  • 支持按照部件名或模块名编译指定目标。
  • 支持不同芯片平台接入,配置产品部件列表。
+

测试

+

新增开发者自测试能力,支持C++ API单元测试,API性能测试等。

+

数据管理

+

提供轻量级Key-Value操作,支持本地应用存储少量数据,数据存储在本地文件中,同时也加载在内存中的,所以访问速度更快,效率更高。

+

语言编译运行时

+

提供了JS、C/C++语言程序的编译、执行环境,提供支撑运行时的基础库,以及关联的API接口、编译器和配套工具。

+

分布式任务调度

+

提供系统服务的启动、注册、查询及管理能力。

+

JS UI框架

+
  • 提供40+UI基础组件和容器组件。
  • 提供标准CSS动画。
  • 支持原子化布局、栅格布局。
  • 提供类Web开发范式的UI编程框架。
  • JS API扩展机制。
+

媒体

+
  • 新增媒体播放和录制基本功能。
  • 新增相机管理和相机采集基本功能。
  • 新增音频音量和设备管理基本功能。
+

事件通知

+

新增发布、订阅、接收公共事件的基本功能。

+

杂散软件服务

+

新增设置时间的能力。

+

用户程序框架

+

新增包安装、卸载、运行及管理能力。

+

电话服务

+
  • 新增获得信号强度、获得驻网状态能力。
  • 新增获得SIM卡状态能力。
  • 新增拨打电话、拒接电话、挂断电话能力。
  • 新增发送短信、接收短信能力。
+

公共基础类库

+

提供了一些常用的C、C++开发增强API。

+

研发工具链

+
  • 新增设备连接调试器。
  • 新增性能跟踪能力。
  • 新增实时内存和trace调优工具,和端侧插件能力。
+

分布式软总线

+
  • 新增跨进程通信(IPC)和跨设备的远程过程调用(RPC)能力。
  • 新增支持设备发现、组网、传输能力的软总线服务。
  • 新增WiFi服务,可提供STA开关、扫描、连接等基本能力。
+

XTS

+

新增各业务特性公共API兼容性看护用例套件。

+

系统应用

+

桌面:

+
  • 新增全量应用图标展示、启动和卸载应用能力。
  • 新增桌面管理界面,可切换网格布局与列表布局。
  • 新增最近任务管理能力,可热启动和清理任务。
+

设置:

+
  • 新增设置应用,包括亮度设置,应用信息,时间设置和关于设备。
+

SystemUI:

+
  • 新增系统栏展示,包括时间、电量信息。
  • 新增系统导航展示。
+

DFX

+
  • 新增流水日志。
  • 新增应用故障收集和订阅。
  • 新增系统事件记录接口。
  • 新增应用事件记录接口及框架。
+

全球化子系统

+
  • 新增支持资源解析读取能力。
  • 新增支持时间日期格式化能力。
+

安全

+
  • 新增系统权限管理,包括系统权限声明,应用安装时申请或申明的权限解析,权限查询,权限授予。
  • 新增应用签名和验签能力。
  • 新增点对点设备连接时的互信认证能力和设备群组管理能力。
+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/04.OpenHarmonyv1.1.3LTS.md" "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/04.OpenHarmonyv1.1.3LTS.md" new file mode 100644 index 0000000000000000000000000000000000000000..fc548e491f1c846fa67b77b45e7b6e1175e3b1fa --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/01.\346\226\207\346\241\243\345\257\274\350\257\273-\344\272\206\350\247\243OpenHarmony/04.\347\211\210\346\234\254\350\257\264\346\230\216/04.OpenHarmonyv1.1.3LTS.md" @@ -0,0 +1,238 @@ +--- +title: OpenHarmonyv1.1.3LTS +permalink: /pages/00000303 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +--- +# OpenHarmony v1.1.3 LTS + +- [版本概述](#section1846294912228) +- [配套关系](#section395983762117) +- [源码获取](#section84808293211) + - [通过镜像站点获取](#section8394142222113) + +- [更新说明](#section175225345334) +- [已修复缺陷列表](#section11935243172612) + +## 版本概述 + +更新发布LTS(long-term support)长期支持版本OpenHarmony v1.1.3 LTS,本版本在OpenHarmony v1.1.2 LTS版本的基础上新增了一些特性和修复了部分缺陷。 + +## 配套关系 + +**表 1** 版本软件和工具配套关系 + + + + + + + + + + + + + + + + +

软件

+

版本

+

备注

+

OpenHarmony

+

1.1.3 LTS

+

NA

+

HUAWEI DevEco Device Tool(可选)

+

HUAWEI DevEco Device Tool 2.1 Release

+

OpenHarmony智能设备集成开发环境推荐使用。

+
+ +## 源码获取 + +通过repo下载 + +方式一(推荐):通过repo + ssh 下载(需注册公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191))。 + +``` +repo init -u git@gitee.com:openharmony/manifest.git -b refs/tags/OpenHarmony-v1.1.3-LTS --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +方式二:通过repo + https 下载。 + +``` +repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v1.1.3-LTS --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +### 通过镜像站点获取 + +**表 2** 源码获取路径 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

版本源码

+

版本信息

+

下载站点

+

SHA256校验码

+

全量代码

+

1.1.3

+

站点

+

SHA256校验码

+

Hi3861解决方案(二进制)

+

1.1.3

+

站点

+

SHA256校验码

+

Hi3518解决方案(二进制)

+

1.1.3

+

站点

+

SHA256校验码

+

Hi3516解决方案(二进制)

+

1.1.3

+

站点

+

SHA256校验码

+

Release Notes

+

1.1.3

+

站点

+

-

+
+ +## 更新说明 + +本版本完全继承了OpenHarmony v1.1.2 LTS的所有特性,并在OpenHarmony v1.1.2 LTS版本的基础上,新增了轻量设备可以在windows环境下的编译版本的特性(请参考[windows开发环境准备](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-windows.md))。 + +**表 3** 特性更新说明 + + + + + + + + + + + + + + +

子系统

+

新增特性

+

修改特性

+

删除特性

+

芯片平台

+

支持了轻量设备在windows环境下编译版本(pulls/60

+

N/A

+

N/A

+
+ +## 已修复缺陷列表 + +在OpenHarmony v1.1.2 LTS版本的基础上,解决并修复的问题见下表。 + +**表 4** 已修复问题列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ISSUE

+

问题描述

+

I43MZK

+

release1.0.1分支命名中出现空格字符,与外部接口标准不符

+

I44ZGK

+

组件ffmpeg 4.2.2存在未修复的漏洞

+

I41ZMV

+

HI3516刷机之后,在系统bin目录下存在module_ActsUiInterfaceTest1.bin测试文件

+

I3ZOIO

+

los_disk_deinit 资源释放失败

+

I43WLG

+

OsMountRootfs启动失败

+

I44ZXW

+

openharmony_1.0.1_release分支上的curl组件从7.69.1版本更新到7.78.0版本

+

I48FKQ

+

osEventFlagsGet传NULL时应该返回0

+

I48FL1

+

osThreadNew函数attr为NULL时,创建线程失败

+

I48FLX

+

shell命令中使用rm -r指令尝试删除dev下节点时会导致系统出错

+

I48FMK

+

小型系统的ActsProcessApiTest/UidGidTest/testGetgroup测试用例失败

+

I48FMT

+

nanosleep函数实现存在缺陷

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/01.\346\246\202\350\277\260.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/01.\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/01.\346\246\202\350\277\260.md" index 2788b28c28e07771f8abe911c877e07dca9a0742..4153feb7687b544a0167265d0b57343ea790c293 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/01.\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/01.\346\246\202\350\277\260.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:40 +date: 2021-12-30 18:31:27 --- # 概述 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/01.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203\346\246\202\350\277\260.md" similarity index 89% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/01.\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/01.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203\346\246\202\350\277\260.md" index 8dca2d3006ec9a489a8ed775797351f87ca24a74..42559082f5c749d228e7c9b4e0421338b45994d3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/01.\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/01.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- -title: 概述 -permalink: /pages/0001000200 +title: 搭建系统环境概述 +permalink: /pages/0001000100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:40 +date: 2021-12-30 18:31:27 --- # 概述 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/02.Windows\345\274\200\345\217\221\347\216\257\345\242\203\345\207\206\345\244\207.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/02.Windows\345\274\200\345\217\221\347\216\257\345\242\203\345\207\206\345\244\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..795b9f92bdfe52ffe51cc906485ae29a6882c76c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/02.Windows\345\274\200\345\217\221\347\216\257\345\242\203\345\207\206\345\244\207.md" @@ -0,0 +1,77 @@ +--- +title: Windows开发环境准备 +permalink: /pages/0001000101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:28 +--- +# Windows开发环境准备 + +- [安装DevEco Device Tool](#zh-cn_topic_0000001058091994_section10761564496) + +系统要求: + +- Windows 10 64位系统。 +- 系统的用户名不能含有中文字符。 + +## 安装DevEco Device Tool + +DevEco Device Tool以插件方式运行,基于Visual Studio Code进行扩展,同时DevEco Device Tool运行依赖Python,Node.js和hpm工具。 + +DevEco Device Tool支持一体化安装,即DevEco Device Tool安装向导会检测系统是否安装Visual Studio Code、Python、Node.js、hpm的适配版本,当安装向导未检测到这些软件时,会给出相应的提示,根据提示勾选要自动安装的软件,安装向导会自动下载相应的软件进行安装。 + +安装DevEco Device Tool,**主机的用户名不能包含中文字符**,否则在运行DevEco Device Tool时,DevEco Home界面会一直处于Loading状态,导致不能正常使用 + +1. 获取软件,请使用华为开发者帐号登录[https://device.harmonyos.com/cn/ide\#download\_beta](https://device.harmonyos.com/cn/ide#download_beta),下载DevEco Device Tool V3.0 Beta1及以上版本。如未注册华为开发者账号,请先[注册](https://developer.huawei.com/consumer/cn/doc/start/registration-and-verification-0000001053628148)。 +2. 解压DevEco Device Tool压缩包,双击安装包程序,点击Next进行安装。 +3. 设置DevEco Device Tool的安装路径,点击Next。 +4. 根据安装向导提示,勾选要自动安装的软件,点击Next。 + + ![](/images/device-dev/quick-start/figures/Snap28.png) + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >当安装向导检测到系统中已安装可兼容的Python版本,会提示用户可选择已安装的可兼容的Python版本,也可选择下载推荐的Python版本。 + +5. 在以下界面点击Next,进行软件下载和安装。 + + ![](/images/device-dev/quick-start/figures/Snap8.png) + +6. 在弹出的Python安装向导中,勾选“**Add Python 3.8 to PATH**”,然后点击**Install Now**开始安装,等待安装完成后,点击**Close**。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >当DevEco Device Tool安装向导检测系统已安装可兼容的Python版本,且用户选择了已安装的可兼容的Python版本,则Python安装向导不会弹出,用户不需要执行此步骤。 + >如果安装DevEco Device Tool 2.1 Release版本,Python版本只能为3.8.x版本,不能安装最新的Python3.9.x版本。如果安装DevEco Device Tool V3.0 Beta1及以上版本,Python版本只能为3.8.x或3.9.x版本。 + + ![](/images/device-dev/quick-start/figures/Snap34.png) + +7. 在弹出的Visual Studio Code安装向导中,根据向导提示安装Visual Studio Code,安装过程中,请勾选“添加到PATH(重启后生效)”。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >当DevEco Device Tool安装向导检测系统已安装正确的Visual Studio Code版本,则Visual Studio Code安装向导不会弹出,用户不需要执行此步骤。 + + ![](/images/device-dev/quick-start/figures/Snap33.png) + +8. 在弹出的Node.js安装向导中,全部按照默认设置点击**Next**,直至**Finish**。安装过程中,Node.js会自动在系统的path环境变量中配置node.exe的目录路径。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >当DevEco Device Tool安装向导检测系统已安装正确的Node.js版本,则Node.js安装向导不会弹出,用户不需要执行此步骤。 + +9. 等待DevEco Device Tool安装向导自动安装hpm和DevEco Device Tool插件,直至安装完成,点击**Finish**,关闭DevEco Device Tool安装向导。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >当DevEco Device Tool安装向导检测系统已安装正确的hpm版本,则不会进行hpm软件的下载和安装。 + +10. 启动Visual Studio Code,会自动安装DevEco Device Tool依赖的C/C++、CodeLLDB插件。等待安装完成后,点击Visual Studio Code左侧的![](/images/device-dev/quick-start/figures/button.png)按钮,检查INSTALLED中,是否已成功安装C/C++、CodeLLDB和DevEco Device Tool。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >如果C/C++和CodeLLDB插件安装不成功,则DevEco Device Tool不能正常运行,解决方法,详细请参考:[离线安装C/C++和CodeLLDB插件](https://device.harmonyos.com/cn/docs/ide/user-guides/offline_plugin_install-0000001074376846)。 + + ![](/images/device-dev/quick-start/figures/deveco-device-tool-install-sucessful.png) + + diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/03.\350\216\267\345\217\226\346\272\220\347\240\201\345\217\212Ubuntu\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/03.\350\216\267\345\217\226\346\272\220\347\240\201\345\217\212Ubuntu\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" similarity index 37% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/03.\350\216\267\345\217\226\346\272\220\347\240\201\345\217\212Ubuntu\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/03.\350\216\267\345\217\226\346\272\220\347\240\201\345\217\212Ubuntu\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" index 61253e68f856c74c273cf6d5d4951097ab5a00c7..f26a34e2ae7c090effd8af5efecee35cfdcf1cbc 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/03.\350\216\267\345\217\226\346\272\220\347\240\201\345\217\212Ubuntu\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/03.\350\216\267\345\217\226\346\272\220\347\240\201\345\217\212Ubuntu\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" @@ -1,6 +1,6 @@ --- title: 获取源码及Ubuntu编译环境准备 -permalink: /pages/0001000202 +permalink: /pages/0001000102 navbar: true sidebar: true prev: true @@ -9,40 +9,35 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:40 +date: 2021-12-30 18:31:28 --- # 获取源码及Ubuntu编译环境准备 - [获取软件](#section1897711811517) - [获取源码](#section1545225464016) -- [安装和配置Python](#section1238412211211) -- [安装gn](#section29216201423) -- [安装ninja](#section8762358731) -- [安装LLVM](#section12202192215415) +- [安装必要的库和工具](#section108201740181219) +- [安装Python3](#section1238412211211) +- [安装LLVM\(仅OpenHarmony\_v1.x分支/标签需要\)](#section12202192215415) - [安装hb](#section15794154618411) - [前提条件](#section1083283711515) - [安装方法](#section11518484814) - [卸载方法](#section3512551574) -- [安装其他工具](#section830511218494) - - [安装方法](#section54409586499) - 系统要求:Ubuntu16.04及以上64位系统版本。 -编译环境搭建分为如下几步: +编译环境搭建包含如下几步: 1. 获取源码 -2. 安装和配置python -3. 安装gn -4. 安装ninja -5. 安装LLVM -6. 安装hb - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** ->- 针对Ubuntu编译环境我们提供了对应的Docker,该Docker封装了相关编译工具,选择使用Docker的开发者可跳过此章节。Docker使用可参考[Docker方式获取编译环境](/pages/extra/70d134/#section107932281315)。 +2. 安装必要的库和工具 +3. 安装python3 +4. 安装LLVM\(仅OpenHarmony\_v1.x分支/标签需要\) +5. 安装hb + +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>- 针对Ubuntu编译环境我们提供了对应的Docker,该Docker封装了相关编译工具,选择使用Docker的开发者可跳过此章节。Docker使用可参考[Docker方式获取编译环境](/pages/000a00#section107932281315)。 >- 通常系统默认安装samba、vim等常用软件,需要做适当适配以支持Linux服务器与Windows工作台之间的文件共享。 ->- 想要详细了解OpenHarmony编译构建模块功能的开发者可参考[编译构建使用指南](/pages/00040000)。 +>- 想要详细了解OpenHarmony编译构建模块功能的开发者可参考[编译构建使用指南](/pages/00040200)。 ## 获取软件 @@ -51,87 +46,72 @@ Linux服务器通用环境配置需要的工具及其获取途径如下表所示 **表 1** Linux服务器开发工具及获取途径 - - diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/02.\347\203\247\345\275\225.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/02.\347\203\247\345\275\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..5f7dd3b145ed75950cfbdf3a626d651a3cc0f883 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/02.\347\203\247\345\275\225.md" @@ -0,0 +1,85 @@ +--- +title: 烧录 +permalink: /pages/00010101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:29 +--- +# 镜像烧录 + +- [前提条件](#section18547185418328) +- [使用网口烧录](#section1965361953312) + +标准系统烧录,在V2.2 Beta1及以上版本支持。 + +Hi3516DV300支持烧录标准系统,其烧录方式包括USB烧录、网口烧录和串口烧录三种方式,其中: + +- **Windows系统:支持USB烧录、网口烧录和串口烧录**。 +- **Linux系统:支持串口烧录和网口烧录。** + +同一种烧录方式(如网口烧录),在Windows和Linux环境下的烧录操作完全一致,区别仅在于DevEco Device Tool环境搭建不同。 + +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>当前Hi3516DV300开发板支持通过网口、USB、串口三种方式烧录OpenHarmony标准系统。本文以网口方式为例讲解烧录操作,其他两种烧录方式请参照[Hi3516DV300烧录指导](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3516_upload-0000001052148681)。 + +## 前提条件 + +在DevEco Device Tool中,选择**Import Project**打开待烧录文件所在文件夹,其中MCU选择**HiSilicon\_Arm\_Linux**下的Hi3516DV300,Framework选择“Ohos-sources”或“Hpm”。 + +![](/images/device-dev/quick-start/figures/hisilicon-arm-linux.png) + +## 使用网口烧录 + +Hi3516DV300开发板使用网口烧录方式,支持Windows和Linux系统。 + +1. 请连接好电脑和待烧录开发板,需要同时连接串口、网口和电源,具体可参考[Hi3516DV300开发板介绍](https://device.harmonyos.com/cn/docs/start/introduce/oem_minitinier_des_3516-0000001152041033)。 +2. 打开电脑的设备管理器,查看并记录对应的串口号。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >如果对应的串口异常,请根据[Hi3516DV300/Hi3518EV300开发板串口驱动安装指导](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3516_hi3518-drivers-0000001050743695)安装USB转串口的驱动程序。 + + ![](/images/device-dev/quick-start/figures/hi3516-record-the-serial-port-number.png) + +3. 打开DevEco Device Tool,在QUICK ACCESS \> DevEco Home \> Projects中,点击**Settings**打开工程配置界面。 + + ![](/images/device-dev/quick-start/figures/hi3516-deveco-device-tool-setting.png) + +4. 在“hi3516dv300”页签,设置烧录选项,包括upload\_port、upload\_partitions和upload\_protocol。 + + - upload\_port:选择步骤[2](#zh-cn_topic_0000001056443961_li1050616379507)中查询的串口号。 + - upload\_protocol:选择烧录协议,固定选择“hiburn-net”。 + - upload\_partitions:选择待烧录的文件,默认情况下会同时烧录fastboot、boot、updater、misc、system、vendor和userdata。 + + ![](/images/device-dev/quick-start/figures/upload-options-1.png) + +5. 检查和设置连接开发板后的网络适配器的IP地址信息,设置方法请参考[设置Hi3516DV300网口烧录的IP地址信息](https://device.harmonyos.com/cn/docs/ide/user-guides/set_ipaddress-0000001141825075)。 +6. 设置网口烧录的IP地址信息,设置如下选项: + + - upload\_net\_server\_ip:选择步骤5中设置的IP地址信息。例如192.168.1.2 + - upload\_net\_client\_mask:设置开发板的子网掩码,工具会自动根据选择的upload\_net\_server\_ip进行设置。例如255.255.255.0 + - upload\_net\_client\_gw:设置开发板的网关,工具会自动根据选择的upload\_net\_server\_ip进行设置。例如192.168.1.1 + - upload\_net\_client\_ip:设置开发板的IP地址,工具会自动根据选择的upload\_net\_server\_ip进行设置。例如192.168.1.3 + + ![](/images/device-dev/quick-start/figures/ip-address-information-2.png) + +7. 所有的配置都修改完成后,在工程配置页签的顶部,点击**Save**进行保存。 +8. 打开工程文件,点击![](/images/device-dev/quick-start/figures/2021-01-27_170334.png)图标,打开DevEco Device Tool界面,在“PROJECT TASKS”中,点击hi3516dv300下的**Upload**按钮,启动烧录。 + + ![](/images/device-dev/quick-start/figures/zh-cn_image_0000001215342695.png) + +9. 启动烧录后,显示如下提示信息时,请重启开发板(下电再上电)。 + + ![](/images/device-dev/quick-start/figures/hi3516-restart-the-development-board.png) + +10. 重新上电后,界面提示如下信息时,表示烧录成功。 + + ![](/images/device-dev/quick-start/figures/hi3516-burning-succeeded-net.png) + +11. 烧录完成后,请根据[标准系统镜像运行](https://device.harmonyos.com/cn/docs/start/introduce/quickstart-standard-running-0000001142160948)进行下一步操作,完成系统启动。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/06.\351\225\234\345\203\217\350\277\220\350\241\214.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214.md" similarity index 57% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/06.\351\225\234\345\203\217\350\277\220\350\241\214.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214.md" index e1bb30b07ba26233428ce7714a9208038530826f..5d85c7089a18ac9bd2b3ac15db806e70aa474f12 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/06.\351\225\234\345\203\217\350\277\220\350\241\214.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214.md" @@ -1,6 +1,6 @@ --- -title: 镜像运行 -permalink: /pages/00010105 +title: 运行 +permalink: /pages/00010102 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:29 --- # 镜像运行 @@ -20,28 +20,28 @@ date: 2021-12-30 12:57:41 烧录完成后通过以下步骤运行系统: ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >初次烧写标准系统,需要完成以下配置,后续烧写或者启动,可以跳过以下操作。 1. 在DevEco Device Tool中,点击Monitor,打开串口工具。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001142616226.png) + ![](/images/device-dev/quick-start/figures/open-the-serial-port-tool.png) 2. 重启开发板,在倒计时结束前,按任意键进入系统。 - ![](/images/zh-cn/device-dev/quick-start/figure/1-18.gif) + ![](/images/device-dev/quick-start/figures/press-any-key-to-enter-the-system.gif) 3. 通过以下两条命令设置启动参数。 ``` - setenv bootargs 'mem=640M console=ttyAMA0,115200 mmz=anonymous,0,0xA8000000,384M clk_ignore_unused androidboot.selinux=permissive skip_initramfs rootdelay=5 init=/init root=/dev/mmcblk0p5 rootfstype=ext4 rw blkdevparts=mmcblk0:1M(boot),15M(kernel),20M(updater),1M(misc),3307M(system),256M(vendor),-(userdata)' + setenv bootargs 'mem=640M console=ttyAMA0,115200 mmz=anonymous,0,0xA8000000,384M clk_ignore_unused rootdelay=10 hardware=Hi3516DV300 init=/init root=/dev/ram0 rw blkdevparts=mmcblk0:1M(boot),15M(kernel),20M(updater),2M(misc),3307M(system),256M(vendor),-(userdata)'; ``` ``` - setenv bootcmd "mmc read 0x0 0x80000000 0x800 0x4800; bootm 0x80000000"; + setenv bootcmd 'mmc read 0x0 0x82000000 0x800 0x4800; bootm 0x82000000' ``` - ![](/images/zh-cn/device-dev/quick-start/figure/启动.png) + ![](/images/device-dev/quick-start/figures/zh-cn_image_0000001172030062.png) 4. 保存参数设置。 @@ -49,7 +49,7 @@ date: 2021-12-30 12:57:41 save ``` - ![](/images/zh-cn/device-dev/quick-start/figure/启动1.png) + ![](/images/device-dev/quick-start/figures/Save-the-parameter-settings.png) 5. 重启开发板,完成系统启动。 @@ -57,7 +57,7 @@ date: 2021-12-30 12:57:41 reset ``` - ![](/images/zh-cn/device-dev/quick-start/figure/启动2.png) + ![](/images/device-dev/quick-start/figures/start-the-system.png) ## 下一步 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/07.\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/07.\345\270\270\350\247\201\351\227\256\351\242\230.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" index 93907cdba5ca5219b1cf43a331e09e7f5820b87a..10b9599db6e3e08fde281ad68c572b04245d5e9c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/07.\345\270\270\350\247\201\351\227\256\351\242\230.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -1,6 +1,6 @@ --- title: 常见问题 -permalink: /pages/00010106 +permalink: /pages/00010103 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:29 --- # 常见问题 @@ -17,7 +17,6 @@ date: 2021-12-30 12:57:41 Linux编译服务器终端输入不识别的命令时,提示"ImportError: No module named apt\_pkg" - - **可能原因** python3 apt安装兼容性问题。 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/03.\350\216\267\345\217\226\346\272\220\347\240\201.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/03.\350\216\267\345\217\226\346\272\220\347\240\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..8bb787c77e462d1ae770df8294c56b2c060e0cc2 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/03.\350\216\267\345\217\226\346\272\220\347\240\201.md" @@ -0,0 +1,419 @@ +--- +title: 获取源码 +permalink: /pages/000102 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:29 +--- +# 获取源码 + +- [OpenHarmony介绍](#section6370143622110) +- [获取源码概述](#section12763342204) +- [获取方式1:从码云仓库获取](#section537312010229) + - [适用场景](#section10881513459) + - [前提条件](#section102871547153314) + - [操作步骤](#section429012478331) + +- [获取方式2:从DevEco Marketplace获取](#section463013147412) + - [适用场景](#section26661067443) + - [前提条件](#section17544943123315) + - [操作步骤](#section954619433333) + +- [获取方式3:从镜像站点获取](#section1186691118430) +- [获取方式4:从github镜像仓库获取\(每天UTC时间23点同步\)](#section23448418360) +- [源码目录](#section1072115612811) + + +## OpenHarmony介绍 + +OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。 + +开源代码仓库地址:[https://openharmony.gitee.com](https://openharmony.gitee.com)。 + +## 获取源码概述 + +本文档将介绍如何获取OpenHarmony源码并说明OpenHarmony的源码目录结构。OpenHarmony的代码以[组件](/pages/00050000)的形式开放,开发者可以通过如下其中一种方式获取: + +- **获取方式1**:从码云代码仓库获取。通过repo或git工具从代码仓库中下载,此方式可获取最新代码。 +- **获取方式2**:通过[DevEco Marketplace](https://repo.harmonyos.com/#/cn/home)网站获取。访问[DevEco Marketplace](https://repo.harmonyos.com/#/cn/home)网站,查找满足需求的开源发行版,直接下载(或者定制后下载),再通过hpm-cli命令工具将所需的组件及工具链下载、安装到本地。 +- **获取方式3**:从镜像站点下载归档后的发行版压缩文件。如果要获取旧版本的源码,也可通过此方式获取,此方式下载速度较快。 +- **获取方式4**:从github代码仓库获取。通过repo或git工具从代码仓库中下载,此方式可获取最新代码。 + +## 获取方式1:从码云仓库获取 + +### 适用场景 + +- 基于OpenHarmony的稳定分支建立自己的基线,分发下游客户。 + +- 已经完成自身软件与OpenHarmony的对接,需要进行OpenHarmony官方认证。 + +- 芯片/模组/app通过OpenHarmony官方认证后,贡献代码到OpenHarmony社区。 + +- 修复OpenHarmony的问题。 + +- 学习OpenHarmony的源码。 + + +### 前提条件 + +1. 注册码云gitee账号。 +2. 注册码云SSH公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191)。 +3. 安装[git客户端](https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git)和[git-lfs](https://gitee.com/vcs-all-in-one/git-lfs?_from=gitee_search#downloading)并配置用户信息。 + + ``` + git config --global user.name "yourname" + git config --global user.email "your-email-address" + git config --global credential.helper store + ``` + +4. 安装码云repo工具,可以执行如下命令。 + + ``` + curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo #如果没有权限,可下载至其他目录,并将其配置到环境变量中 + chmod a+x /usr/local/bin/repo + pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests + ``` + + +### 操作步骤 + +**获取轻量/小型/标准系统源码** + +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>Master主干为开发分支,开发者可通过Master主干获取最新特性。发布版本代码相对比较稳定,开发者可基于发布版本代码进行商用功能开发。 + +- **OpenHarmony主干代码获取** + + 方式一(推荐):通过repo + ssh 下载(需注册公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191))。 + + ``` + repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify + repo sync -c + repo forall -c 'git lfs pull' + ``` + + 方式二:通过repo + https 下载。 + + ``` + repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify + repo sync -c + repo forall -c 'git lfs pull' + ``` + + +- **OpenHarmony 发布版本代码获取** + + OpenHarmony发布版本源码获取方式请参考[Release-Notes](/pages/extra/24f459/)。 + + +## 获取方式2:从DevEco Marketplace获取 + +### 适用场景 + +对于刚接触OpenHarmony的新用户,希望能够参考一些示例解决方案从而进行快速开发。可以在[DevEco Marketplace](https://repo.harmonyos.com/#/cn/home)网站获取下载开源发行版,也可以在开源发行版的基础上定制(添加或删除组件)。然后通过包管理器命令行工具(hpm-cli)将需要的组件及相关的编译工具链全部下载、安装到本地。 + +### 前提条件 + +先要在本地安装Node.js和hpm命令行工具,安装步骤如下: + +1. 安装Node.js。 + + 官网下载并在本地安装Node.js. + + [Node.js](https://nodejs.org/) 版本需不低于12.x \(包含 npm 6.14.4\),推荐安装 LTS版本。 + +2. 通过Node.js自带的npm安装hpm命令行工具。 + + 打开CMD,执行以下命令: + + ``` + npm install -g @ohos/hpm-cli + ``` + +3. 安装完成后执行如下命令,显示hpm版本,即安装成功。 + + ``` + hpm -V 或 hpm --version + ``` + +4. 如果升级hpm的版本,请执行如下命令: + + ``` + npm update -g @ohos/hpm-cli + ``` + + +### 操作步骤 + +1. 查找发行版。 + 1. 访问[DevEco Marketplace](https://repo.harmonyos.com/#/cn/home),设定搜索的对象为“设备组件“,并在左侧边栏选择“开源发行版“,如下图所示。 + 2. 在搜索框输入关键字搜索,如“摄像头”。 + 3. 结果中显示与关键字匹配的发行版,可以进一步根据组件类别等过滤条件(如:适配的开发板,内核)精确筛选。 + 4. 查找合适的发行版,点击查看发行版的详情介绍。 + + **图 1** 包管理 + ![](/images/device-dev/get-code/figure/包管理.png "包管理") + +2. 了解发行版详情。 + + 1. 仔细阅读发行版的说明信息,以了解使用场景、特性、组件构成、使用方法以及如何进行定制化,如下图所示。 + 2. 点击「直接下载」,将发行版下载到本地。 + 3. 点击「定制组件」,将对发行版包含的组件进行定制(添加/删除)。 + + **图 2** 发行版示例 + ![](/images/device-dev/get-code/figure/发行版示例.png "发行版示例") + +3. 定制组件。 + 1. 进入发行版的定制页面,如下图所示。 + 2. 通过关闭开关移除可选组件,或者通过“添加组件”增加新的组件。 + 3. 在右边填写您的项目基本信息,包括名称、版本、描述等信息。 + 4. 点击“下载“,系统会根据您的选择,生成相应的OpenHarmony代码结构文件\(如my\_cust\_dist.zip\),保存至本地文件。 + + **图 3** 组件定制 + ![](/images/device-dev/get-code/figure/组件定制.png "组件定制") + +4. 安装组件。 + 1. 解压下载的压缩文件,用命令行工具CMD(Linux下的Shell终端)。 + 2. 在解压后的文件目录下执行hpm install指令,系统会自动下载并安装组件。安装窗口显示“Install sucessful”表示组件下载及安装成功。 + 3. 下载的组件将保存在工程目录下的ohos\_bundles文件夹中(部分组件安装后会将源码复制到指定目录下)。 + + +## 获取方式3:从镜像站点获取 + +为了获得更好的下载性能,您可以选择从以下站点的镜像库获取源码或者对应的解决方案。 + +本部分只提供OpenHarmony Master最新版本和LTS最新版本的源码获取方式, 其他版本源码获取方式以及具体版本信息请参考[Release-Notes](/pages/extra/24f459/)。 + +**表 1** 源码获取路径 + + +

开发工具

+ - - - - - - - - - - - - - - - - - - - - - - - - - - -

开发工具

用途

+

用途

获取途径

+

获取途径

源码

-

功能开发

-

参考源码获取

-

Python3.7+

-

编译构建工具

-

通过互联网获取

-

gn

+

源码

产生ninja编译脚本

+

功能开发

https://repo.huaweicloud.com/harmonyos/compiler/gn/1717/linux/gn-linux-x86-1717.tar.gz

+

参考源码获取

ninja

+

必要的库和工具

执行ninja编译脚本

+

编译所需的必要工具和库(如打包、镜像制作等)

https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.9.0/linux/ninja.1.9.0.tar

+

通过互联网获取

-

LLVM

-

+

Python3.7+

-

编译工具链

-

+

编译构建工具

Master及OpenHarmony_v2.x分支/标签,请使用以下10.0.1版本:

-

https://repo.huaweicloud.com/harmonyos/compiler/clang/10.0.1-62608/linux/llvm.tar.gz

+

通过互联网获取

OpenHarmony_v1.x分支/标签,请使用以下9.0.0版本:

-

https://repo.huaweicloud.com/harmonyos/compiler/clang/9.0.0-36191/linux/llvm-linux-9.0.0-36191.tar

+

LLVM(仅OpenHarmony_v1.x分支/标签需要)

hb

-

OpenHarmony编译构建命令行工具

+

编译工具链

通过互联网获取

+

通过互联网获取

其他工具

+

hb

编译构建中依赖的其他工具(如打包、镜像制作等)

+

OpenHarmony编译构建命令行工具

通过互联网获取

+

通过互联网获取

->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >- 如果后续通过“HPM组件方式”或“HPM包管理器命令行工具方式”获取源码,不需要安装gn、ninja编译工具。 >- (推荐)如果后续通过“镜像站点方式”或“代码仓库方式”获取源码,需要安装gn、ninja、LLVM编译工具。安装gn、ninja、LLVM编译工具时,请确保编译工具的环境变量路径唯一。 ## 获取源码 -开发者需要在Linux服务器上下载并解压一套源代码,请参见[源码获取](/pages/extra/dade07/)。 +开发者需要在Linux服务器上下载并解压一套源代码,请参见[源码获取](/pages/000102)。 + +## 安装必要的库和工具 + +使用如下apt-get命令安装编译所需的必要的库和工具: + +``` +sudo apt-get install build-essential gcc g++ make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-boot-tools mtd-utils gcc-arm-linux-gnueabi cpio device-tree-compiler +``` -## 安装和配置Python +## 安装Python3 1. 打开Linux编译服务器终端。 -2. 输入如下命令,查看python版本号,需使用python3.7以上版本。 +2. 输入如下命令,查看python版本号: ``` python3 --version @@ -141,11 +121,11 @@ Linux服务器通用环境配置需要的工具及其获取途径如下表所示 1. 运行如下命令,查看Ubuntu版本: - ``` - cat /etc/issue - ``` + ``` + cat /etc/issue + ``` - 1. 根据Ubuntu不同版本,安装python。 + 2. 根据Ubuntu不同版本,安装python。 - 如果Ubuntu 版本为18+,运行如下命令。 ``` @@ -197,90 +177,20 @@ Linux服务器通用环境配置需要的工具及其获取途径如下表所示 -## 安装gn - -1. 打开Linux编译服务器终端。 -2. [下载gn工具](https://repo.huaweicloud.com/harmonyos/compiler/gn/1717/linux/gn-linux-x86-1717.tar.gz)。 -3. 在根目录下创建gn文件夹。 - - ``` - mkdir ~/gn - ``` - -4. 解压gn安装包至\~/gn路径下。 - - ``` - tar -xvf gn-linux-x86-1717.tar.gz -C ~/gn - ``` - -5. 设置环境变量。 - - ``` - vim ~/.bashrc - ``` - - 将以下命令拷贝到.bashrc文件的最后一行,保存并退出。 - - ``` - export PATH=~/gn:$PATH - ``` - -6. 生效环境变量。 - - ``` - source ~/.bashrc - ``` - - -## 安装ninja - -1. 打开Linux编译服务器终端。 -2. [下载ninja工具](https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.9.0/linux/ninja.1.9.0.tar)。 -3. 解压ninja安装包至\~/ninja路径下。 - - ``` - tar -xvf ninja.1.9.0.tar -C ~/ - ``` - -4. 设置环境变量。 - - ``` - vim ~/.bashrc - ``` - - 将以下命令拷贝到.bashrc文件的最后一行,保存并退出。 - - ``` - export PATH=~/ninja:$PATH - ``` - -5. 生效环境变量。 - - ``` - source ~/.bashrc - ``` - +## 安装LLVM\(仅OpenHarmony\_v1.x分支/标签需要\) -## 安装LLVM +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>如果下载的源码为OpenHarmony\_v1.x分支/标签, 请按下面的步骤安装9.0.0版本的llvm。 +>如果下载的源码为Master及OpenHarmony\_v2.x分支/标签,可直接跳过本小节,hb会自动下载最新的llvm。 1. 打开Linux编译服务器终端。 -2. [下载LLVM工具](https://repo.huaweicloud.com/harmonyos/compiler/clang/10.0.1-62608/linux/llvm.tar.gz)。 - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >针对OpenHarmony\_v1.x分支/标签,使用此链接[下载LLVM工具](https://repo.huaweicloud.com/harmonyos/compiler/clang/9.0.0-36191/linux/llvm-linux-9.0.0-36191.tar)。 - +2. [下载LLVM工具](https://repo.huaweicloud.com/harmonyos/compiler/clang/9.0.0-36191/linux/llvm-linux-9.0.0-36191.tar)。 3. 解压LLVM安装包至\~/llvm路径下。 ``` - tar -zxvf llvm.tar.gz -C ~/ + tar -zxvf llvm.tar -C ~/ ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >针对OpenHarmony\_v1.x分支/标签,使用如下命令解压: - >``` - >tar -xvf llvm-linux-9.0.0-36191.tar -C ~/ - >``` - 4. 设置环境变量。 ``` @@ -304,7 +214,7 @@ Linux服务器通用环境配置需要的工具及其获取途径如下表所示 ### 前提条件 -请先安装Python 3.7.4及以上版本,请见[安装和配置Python](#section1238412211211)。 +请先安装Python 3.7.4及以上版本,请见[安装Python3](#section1238412211211)。 ### 安装方法 @@ -357,17 +267,6 @@ Linux服务器通用环境配置需要的工具及其获取途径如下表所示 python3 -m pip uninstall ohos-build ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** ->如果安装hb的过程中遇到问题,请参见下文[常见问题](/pages/0001000203)进行解决。 - -## 安装其他工具 - -### 安装方法 - -1. apt安装全部依赖的工具 - - ``` - sudo apt-get install build-essential gcc g++ make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-boot-tools mtd-utils gcc-arm-linux-gnueabi - ``` - +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>如果安装hb的过程中遇到问题,请参见下文[常见问题](/pages/0001000103)进行解决。 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" similarity index 69% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" index cabfdf07b551ce91d43d9865178e12a03362db09..475a49434585943acb027a3cce7d0534a8cdd5d1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -1,6 +1,6 @@ --- title: 常见问题 -permalink: /pages/0001000203 +permalink: /pages/0001000103 navbar: true sidebar: true prev: true @@ -9,17 +9,17 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:40 +date: 2021-12-30 18:31:28 --- # 常见问题 -- [hb 安装过程中出现乱码、段错误](#section411894616119) -- [hb 安装过程中提示"cannot import 'sysconfig' from 'distutils'"](#section629417571626) -- [hb 安装过程中提示"module 'platform' has no attribute 'linux\_distribution'"](#section10871523332) -- [hb 安装过程中提示"Could not find a version that satisfies the requirement ohos-build"](#section47351657163213) +- [安装hb过程中,出现乱码、段错误](#section411894616119) +- [安装hb过程中,提示"cannot import 'sysconfig' from 'distutils'"](#section629417571626) +- [安装hb过程中,提示"module 'platform' has no attribute 'linux\_distribution'"](#section10871523332) +- [安装hb过程中,提示"Could not find a version that satisfies the requirement ohos-build"](#section47351657163213) - [Linux编译服务器终端输入不识别的命令时提示“ImportError: No module named apt\_pkg”](#section159891252236) -## hb 安装过程中出现乱码、段错误 +## 安装hb过程中,出现乱码、段错误 - **现象描述** @@ -39,11 +39,11 @@ date: 2021-12-30 12:57:40 ``` -## hb 安装过程中提示"cannot import 'sysconfig' from 'distutils'" +## 安装hb过程中,提示"cannot import 'sysconfig' from 'distutils'" - **现象描述** - 执行“python3 -m pip install --user ohos-build”提示"cannot import 'sysconfig' from 'distutils'" + 执行“python3 -m pip install --user ohos-build”提示"cannot import 'sysconfig' from 'distutils'"。 - **可能原因** @@ -59,11 +59,11 @@ date: 2021-12-30 12:57:40 ``` -## hb 安装过程中提示"module 'platform' has no attribute 'linux\_distribution'" +## 安装hb过程中,提示"module 'platform' has no attribute 'linux\_distribution'" - **现象描述** - 执行“python3 -m pip install --user ohos-build”提示"module 'platform' has no attribute 'linux\_distribution'" + 执行“python3 -m pip install --user ohos-build”提示"module 'platform' has no attribute 'linux\_distribution'"。 - **可能原因** @@ -81,7 +81,7 @@ date: 2021-12-30 12:57:40 ``` -## hb 安装过程中提示"Could not find a version that satisfies the requirement ohos-build" +## 安装hb过程中,提示"Could not find a version that satisfies the requirement ohos-build" - **现象描述** diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/01.Hi3861\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" similarity index 89% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/01.Hi3861\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" index 87c9d22dbd8bca99207f7845981d58714c5809eb..ba0c14f7cd2f29804549a9e9df7008fbc24d05aa 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/01.Hi3861\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" @@ -1,6 +1,6 @@ --- title: 安装开发板环境 -permalink: /pages/0001000300 +permalink: /pages/000100020000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:28 --- # 安装开发板环境 @@ -36,12 +36,12 @@ date: 2021-12-30 12:57:41 各硬件连接关系如下图所示。 -**图 1** 硬件连线图 -![](/images/zh-cn/device-dev/quick-start/figure/硬件连线图.png "硬件连线图") +**图 1** Hi3861开发硬件连线图 +![](/images/device-dev/quick-start/figures/Hi3861开发硬件连线图.png "Hi3861开发硬件连线图") ### 软件要求 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >本节描述采用安装包方式安装相关工具的操作步骤。如果是Docker方式安装,无需安装[表1](#table6299192712513)中的Linux服务器相关工具,只需安装Windows工作台工具即可。 Hi3861开发板需要的工具如下表所示。 @@ -51,9 +51,9 @@ Hi3861开发板需要的工具如下表所示。 - - @@ -61,45 +61,45 @@ Hi3861开发板需要的工具如下表所示。 - - - - - - - - - - @@ -109,7 +109,7 @@ Hi3861开发板需要的工具如下表所示。 ## 安装Linux编译工具 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >- 如果通过“HPM组件方式”或“HPM包管理器命令行工具方式”获取源码,不需要安装gcc\_riscv32编译工具。 >- (推荐)如果通过“镜像站点方式”或“代码仓库方式”获取源码,需要安装gcc\_riscv32编译工具。安装gcc\_riscv32编译工具时,请确保编译工具的环境变量路径唯一。 @@ -136,8 +136,8 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev scons -v ``` - **图 2** SCons安装成功界面,版本要求3.0.4以上 - ![](/images/zh-cn/device-dev/quick-start/figure/SCons安装成功界面-版本要求3-0-4以上.png "SCons安装成功界面-版本要求3-0-4以上") + **图 2** SCons安装成功界面,版本要求3.0.4以上 + ![](/images/device-dev/quick-start/figures/SCons安装成功界面-版本要求3-0-4以上.png "SCons安装成功界面-版本要求3-0-4以上") ### 安装python模块 @@ -231,15 +231,15 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev ### 安装gcc\_riscv32(WLAN模组类编译工具链) ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** ->- Hi3861平台仅支持使用libgcc运行时库的静态链接,不建议开发者使用libgcc运行时库的动态链接,会导致商业分发时被GPL V3污染。 ->- 通过下述步骤2-15,我们编译好了gcc\_riscv32 镜像,提供给开发者[直接下载](https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz)使用。直接下载 gcc\_riscv32 镜像的开发者可省略下述2-15步。 +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>- Hi3861平台仅支持使用libgcc运行时库的静态链接,不建议开发者使用libgcc运行时库的动态链接,以免产品需遵从GPLV3许可证。 +>- 通过下述步骤2-15,我们编译好了gcc\_riscv32镜像,提供给开发者[直接下载](https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz)使用。直接下载gcc\_riscv32镜像的开发者可省略下述2-15步。 1. 打开Linux编译服务器终端。 2. 环境准备,请安装"gcc, g++, bison, flex, makeinfo"软件,确保工具链能正确编译。 ``` - sudo apt-get install gcc && sudo apt-get install g++ && sudo apt-get install flex bison && sudo apt-get install texinfo + sudo apt-get install gcc g++ flex bison texinfo ``` 3. 下载riscv-gnu-toolchain交叉编译工具链。 @@ -320,7 +320,7 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev 16. 设置环境变量。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >如果直接采用编译好的riscv32 gcc包,请参照如下步骤设置环境变量: >1. 将压缩包解压到根目录 > ``` @@ -366,6 +366,6 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev 2. 点击安装包,安装驱动程序。 3. 驱动安装完成后,重新插拔USB接口,串口信息显示如下图所示。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350633.png) + ![](/images/device-dev/quick-start/figures/serial-port-entry.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/03.\350\277\220\350\241\214HelloWorld.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/01.Hi3861\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/03.\350\277\220\350\241\214HelloWorld.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/01.Hi3861\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214.md" index d8abd5d26cb5875bc37475974da1753e6f33567d..091a3d3cafdeef87a374dbf69428773df7bcaf50 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/03.\350\277\220\350\241\214HelloWorld.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/01.Hi3861\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214.md" @@ -1,6 +1,6 @@ --- -title: 运行HelloWorld -permalink: /pages/0001000302 +title: 运行 +permalink: /pages/000100020001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:28 --- # 运行Hello World @@ -21,7 +21,7 @@ date: 2021-12-30 12:57:41 - [运行结果](#section18115713118) - [下一步学习](#section9712145420182) -本示例将演示如何编写简单业务,输出“Hello World”,初步了解OpenHarmony 如何运行在开发板上。 +本示例将演示如何编写简单业务,输出“Hello World”,初步了解OpenHarmony如何运行在开发板上。 ## 修改源码 @@ -151,7 +151,7 @@ Call Stack 6 -- 3f5e24 addr:f78fc 3. 根据以上调用栈信息,可以定位WadRecvCB函数中出现了异常。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001134641222.png) + ![](/images/device-dev/quick-start/figures/WadRecvCB-function.png) 4. 完成代码排查及修改。 @@ -168,5 +168,5 @@ wifi init success! ## 下一步学习 -恭喜,您已完成Hi3861 WLAN模组快速上手!建议您下一步进入[WLAN产品开发](/pages/extra/d57142/)的学习 。 +恭喜,您已完成Hi3861 WLAN模组快速上手!建议您下一步进入[WLAN产品开发](/pages/extra/da3986/)的学习 。 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/01.Hi3861\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" similarity index 88% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/01.Hi3861\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" index d3cf8b74c766e84c8fb0f014e2da79a0b0e0839b..72ee2d8b1239485a3bafc9cd675ccf65780315e3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/01.Hi3861\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -1,6 +1,6 @@ --- title: 常见问题 -permalink: /pages/0001000303 +permalink: /pages/000100020002 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:28 --- # 常见问题 @@ -22,6 +22,7 @@ date: 2021-12-30 12:57:41 - [编译构建过程中,提示“Could not find a version that satisfies the requirement six\>=1.9.0”](#section4498158162320) - [编译构建过程中,提示找不到“-lgcc”](#section11181036112615) - [编译构建过程中,提示找不到“python”](#section1571810194619) +- [编译构建过程中,提示找不到“python3”](#section108385316482) - [安装 kconfiglib时,遇到lsb\_release错误](#section691681635814) ## 安装python3过程中,提示“configure: error: no acceptable C compiler found in $PATH” @@ -73,7 +74,7 @@ date: 2021-12-30 12:57:41 安装python3过程中出现以下错误: ``` - zipimport.ZipImportError: can't decompress data; zlib not avaliable + zipimport.ZipImportError: can't decompress data; zlib not available ``` - **可能原因** @@ -86,7 +87,7 @@ date: 2021-12-30 12:57:41 方法2:如果软件源中没有该软件,请从“www.zlib.net”下载版本代码,并离线安装。 - ![](/images/zh-cn/device-dev/quick-start/figure/10.png) + ![](/images/device-dev/quick-start/figures/download-zlib.png) 完成下载后,通过以下命令安装: @@ -147,7 +148,7 @@ date: 2021-12-30 12:57:41 通过网页[https://pypi.org/project/pycrypto/\#files](https://pypi.org/project/pycrypto/#files),下载源码。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128470864.png) + ![](/images/device-dev/quick-start/figures/Download-the-source-code.png) 将源码放置在Linux服务器中,解压,并安装“python3 setup.py install”。 @@ -178,7 +179,7 @@ date: 2021-12-30 12:57:41 通过网页[https://pypi.org/project/ecdsa/\#files](https://pypi.org/project/ecdsa/#files),下载安装包。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311072.png) + ![](/images/device-dev/quick-start/figures/download-ecdsa.png) 将安装包放置Linux服务器中,并安装“pip3 install ecdsa-0.15-py2.py3-none-any.whl”。 @@ -209,7 +210,7 @@ date: 2021-12-30 12:57:41 通过网页[https://pypi.org/project/six/\#files](https://pypi.org/project/six/#files),下载安装包。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270699.png) + ![](/images/device-dev/quick-start/figures/download-six.png) 将源码放置在Linux服务器中,并安装“pip3 install six-1.14.0-py2.py3-none-any.whl”。 @@ -262,11 +263,11 @@ date: 2021-12-30 12:57:41 - **解决办法** - 请按照[安装Python环境](/pages/0001000202#section1238412211211) + 请按照[安装Python环境](/pages/0001000102) - **可能原因2** - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311070.png) + ![](/images/device-dev/quick-start/figures/reason-no-python-soft-link.png) - **解决办法** @@ -281,7 +282,23 @@ date: 2021-12-30 12:57:41 例: - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350623.png) + ![](/images/device-dev/quick-start/figures/solution-add-soft-link.png) + + +## 编译构建过程中,提示找不到“python3” + +- **现象描述** + + ![](/images/device-dev/quick-start/figures/11.png) + + +- **可能原因** + + 没有装python3。 + +- **解决办法** + + 请按照[安装python](/pages/0001000102)。 ## 安装 kconfiglib时,遇到lsb\_release错误 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/02.Hi3516\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" similarity index 89% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/02.Hi3516\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" index c5df9901d2a4c36b3a652eb04fa06b828bbb3a90..22a255e68bb0e344b0708e1fd9f5322f99e5e86b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/02.Hi3516\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" @@ -1,6 +1,6 @@ --- title: 安装开发板环境 -permalink: /pages/0001000400 +permalink: /pages/000100020100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:28 --- # 安装开发板环境 @@ -32,14 +32,12 @@ date: 2021-12-30 12:57:41 各硬件连接关系如下图所示。 -**图 1** 硬件连线图 - - -![](/images/zh-cn/device-dev/quick-start/figure/矩形备份-292.png) +**图 1** Hi3516开发硬件连线图 +![](/images/device-dev/quick-start/figures/Hi3516开发硬件连线图.png "Hi3516开发硬件连线图") ### 软件要求 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >本节描述安装包方式搭建编译环境的操作步骤。如果是Docker方式安装编译环境,请跳过此章节以及下述[安装Linux服务器工具](#section182916865219)章节。 Hi3516开发板对Linux服务器通用环境配置需要的工具及其获取途径如下表所示。 @@ -76,7 +74,7 @@ Hi3516开发板对Linux服务器通用环境配置需要的工具及其获取途 - @@ -88,8 +86,8 @@ Hi3516开发板对Linux服务器通用环境配置需要的工具及其获取途 ## 安装Linux服务器工具 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** ->- 如果通过“HPM组件方式”或“HPM包管理器命令行工具方式”获取源码,不需要安装LLVM、hc-gen编译工具。 +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>- 如果通过“HPM组件方式”或“HPM包管理器命令行工具方式”获取源码,不需要安装hc-gen编译工具。 >- (推荐)如果通过“镜像站点方式”或“代码仓库方式”获取源码,需要安装hc-gen编译工具。安装hc-gen编译工具时,请确保编译工具的环境变量路径唯一。 ### 将Linux shell改为bash @@ -102,7 +100,7 @@ ls -l /bin/sh 如果显示为“/bin/sh -\> bash”则为正常,否则请按以下方式修改: -**方法一**:在终端运行如下命令,然后选择 no。 +**方法一**:在终端运行如下命令,然后选择no。 ``` sudo dpkg-reconfigure dash @@ -126,7 +124,7 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev ### 安装文件打包工具及Java虚拟机环境 1. 打开Linux编译服务器终端 -2. 运行如下命令,安装dosfstools,mtools,mtd-utils,Java运行时环境(JRE)和Java sdk 开发工具包。 +2. 运行如下命令,安装dosfstools、mtools、mtd-utils、Java运行时环境(JRE)和Java sdk 开发工具包。 ``` sudo apt-get install dosfstools mtools mtd-utils default-jre default-jdk diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214HelloOHOS\357\274\210\347\274\226\350\257\221\343\200\201\347\203\247\345\275\225\357\274\211.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/02.Hi3516\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214.md" similarity index 46% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214HelloOHOS\357\274\210\347\274\226\350\257\221\343\200\201\347\203\247\345\275\225\357\274\211.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/02.Hi3516\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214.md" index b07bceef545bcda10b1cf49adc1c620f30734249..100cde6dbe46d3f2bafa31a0666bd12ea45ca9e2 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214HelloOHOS\357\274\210\347\274\226\350\257\221\343\200\201\347\203\247\345\275\225\357\274\211.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/02.Hi3516\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214.md" @@ -1,6 +1,6 @@ --- -title: 运行HelloOHOS(编译、烧录) -permalink: /pages/0001000401 +title: 运行 +permalink: /pages/000100020101 navbar: true sidebar: true prev: true @@ -9,14 +9,16 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:28 --- # 运行Hello OHOS(编译、烧录) - [新建应用程序](#section204672145202) - [编译](#section1077671315253) - [烧录](#section1347011412201) -- [镜像运行](#section24721014162010) + - [使用网口烧录](#section1935410617363) + - [镜像运行](#section24721014162010) + - [执行应用程序](#section5276734182615) 本节指导开发者在单板上运行第一个应用程序,其中包括新建应用程序、编译、烧写、运行等步骤,最终输出“Hello OHOS!”。 @@ -142,7 +144,7 @@ date: 2021-12-30 12:57:41 ## 编译 -如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](/pages/extra/70d134/#section107932281315)的编译操作。如果Linux编译环境通过软件包方式安装,请进入源码根目录,执行如下命令进行编译: +如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](/pages/000a00#section107932281315)的编译操作。如果Linux编译环境通过软件包方式安装,请进入源码根目录,执行如下命令进行编译: ``` hb set(设置编译路径) @@ -151,132 +153,96 @@ hb set(设置编译路径) hb build -f(执行编译) ``` -**图 1** 设置图例 -![](/images/zh-cn/device-dev/quick-start/figure/设置图例.png "设置图例") +**图 1** Hi3516编译设置图例 +![](/images/device-dev/quick-start/figures/Hi3516编译设置图例.png "Hi3516编译设置图例") 结果文件生成在out/hispark\_taurus/ipcamera\_hispark\_taurus目录下。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >Hi3516DV300单板的U-boot文件获取路径:device/hisilicon/hispark\_taurus/sdk\_liteos/uboot/out/boot/u-boot-hi3516dv300.bin ## 烧录 Hi3516开发板的代码烧录支持USB烧录、网口烧录和串口烧录三种方式。此处仅以网口烧录为例进行说明。 -1. 请连接好电脑和待烧录开发板,以Hi3516DV300为例,需要同时连接串口、网口和电源,具体可参考[Hi3516开发板介绍](/pages/0001000101)。 +### 使用网口烧录 + +Hi3516DV300开发板使用网口烧录方式,支持Windows和Linux系统。 + +1. 请连接好电脑和待烧录开发板,需要同时连接串口、网口和电源,具体可参考[Hi3516DV300开发板介绍](https://device.harmonyos.com/cn/docs/start/introduce/oem_minitinier_des_3516-0000001152041033)。 2. 打开电脑的设备管理器,查看并记录对应的串口号。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >如果对应的串口异常,请根据[Hi3516/Hi3518系列开发板串口驱动安装指导](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3516_hi3518-drivers-0000001050743695)安装USB转串口的驱动程序。 + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >如果对应的串口异常,请根据[Hi3516DV300/Hi3518EV300开发板串口驱动安装指导](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3516_hi3518-drivers-0000001050743695)安装USB转串口的驱动程序。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350647.png) + ![](/images/device-dev/quick-start/figures/hi3516-record-the-serial-port-number.png) -3. 打开DevEco Device Tool,在Projects中,点击**Settings**打开工程配置界面。 +3. 打开DevEco Device Tool,在QUICK ACCESS \> DevEco Home \> Projects中,点击**Settings**打开工程配置界面。 - ![](/images/zh-cn/device-dev/quick-start/figure/2021-01-27_170334.png) + ![](/images/device-dev/quick-start/figures/hi3516-deveco-device-tool-setting.png) -4. 在“Partition Configuration”页签,设置待烧录文件信息,默认情况下,DevEco Device Tool已针对Hi3516系列开发板进行适配,无需单独修改。 +4. 在“Partition Configuration”页签,设置待烧录文件信息,默认情况下,DevEco Device Tool已针对Hi3516DV300开发板进行适配,无需单独修改。 5. 在“hi3516dv300”页签,设置烧录选项,包括upload\_port、upload\_partitions和upload\_protocol。 - upload\_port:选择步骤[2](#zh-cn_topic_0000001056443961_li142386399535)中查询的串口号。 - upload\_protocol:选择烧录协议,固定选择“hiburn-net”。 - upload\_partitions:选择待烧录的文件,默认情况下会同时烧录fastboot、kernel、rootfs和userfs。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128470904.png) + ![](/images/device-dev/quick-start/figures/hi3516-upload-options.png) -6. 检查和设置连接开发板后的网络适配器的IP地址信息,设置方法请参考[设置Hi3516网口烧录的IP地址信息](https://device.harmonyos.com/cn/docs/ide/user-guides/set_ipaddress-0000001141825075)。 +6. 检查和设置连接开发板后的网络适配器的IP地址信息,设置方法请参考[设置Hi3516DV300网口烧录的IP地址信息](https://device.harmonyos.com/cn/docs/ide/user-guides/set_ipaddress-0000001141825075)。 7. 设置网口烧录的IP地址信息,设置如下选项: - - upload\_net\_server\_ip:选择[6](#zh-cn_topic_0000001056443961_li1558813168234)中设置的IP地址信息。例如192.168.1.2 + - upload\_net\_server\_ip:选择步骤6中设置的IP地址信息。例如192.168.1.2 - upload\_net\_client\_mask:设置开发板的子网掩码,工具会自动根据选择的upload\_net\_server\_ip进行设置。例如255.255.255.0 - upload\_net\_client\_gw:设置开发板的网关,工具会自动根据选择的upload\_net\_server\_ip进行设置。例如192.168.1.1 - upload\_net\_client\_ip:设置开发板的IP地址,工具会自动根据选择的upload\_net\_server\_ip进行设置。例如192.168.1.3 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270733.png) + ![](/images/device-dev/quick-start/figures/ip-address-information.png) 8. 所有的配置都修改完成后,在工程配置页签的顶部,点击**Save**进行保存。 -9. 打开工程文件,点击![](/images/zh-cn/device-dev/quick-start/figure/2021-01-27_170334-2.png)图标,打开DevEco Device Tool界面,在“PROJECT TASKS”中,点击hi3516dv300下的**Upload**按钮,启动烧录。 +9. 打开工程文件,点击![](/images/device-dev/quick-start/figures/hi3516-deveco-device-tool-logo.png)图标,打开DevEco Device Tool界面,在“PROJECT TASKS”中,点击hi3516dv300下的**Upload**按钮,启动烧录。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270729.png) + ![](/images/device-dev/quick-start/figures/hi3516-upload-start-burning.png) 10. 启动烧录后,显示如下提示信息时,请重启开发板(下电再上电)。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128470906.png) + ![](/images/device-dev/quick-start/figures/hi3516-restart-the-development-board.png) -11. 重新上电后,启动烧录,界面提示如下信息时,表示烧录成功。 +11. 重新上电后,界面提示如下信息时,表示烧录成功。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311098.png) + ![](/images/device-dev/quick-start/figures/hi3516-burning-succeeded-net.png) +12. 烧录成功后,请根据镜像运行章节进行操作,启动系统。 -## 镜像运行 +### 镜像运行 -1. 连接串口。 +在完成Hi3516DV300的烧录后,还需要设置BootLoader引导程序,才能运行OpenHarmony系统。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** - >若无法连接串口,请参考[常见问题](/pages/0001000403)进行排查。 +1. 在Hi3516DV300任务中,点击**Configure bootloader(Boot OS)**进行配置即可。 - **图 2** 连接串口图 - + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >DevEco Device Tool针对Hi3516DV300开发板的BootLoader设置进行了适配,无需开发者手动修改。 - ![](/images/zh-cn/device-dev/quick-start/figure/chuankou1.png) - - 1. 单击**Monitor**打开串口。 - 2. 连续输入回车直到串口显示"hisilicon"。 - 3. 单板初次启动或修改启动参数,请进入[步骤2](#l5b42e79a33ea4d35982b78a22913b0b1),否则进入[步骤3](#ld26f18828aa44c36bfa36be150e60e49)。 - -2. (单板初次启动必选)修改U-boot的bootcmd及bootargs内容:该步骤为固化操作,若不修改参数只需执行一次。每次复位单板均会自动进入系统。 - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** - >U-boot引导程序默认会有2秒的等待时间,用户可使用回车打断等待并显示"hisilicon",通过**reset**命令可再次启动系统。 - - **表 1** U-boot修改命令 - - -

平台类型

开发工具

+

开发工具

用途

+

用途

获取途径

Linux服务器

编译基础软件包(仅ubuntu 20+需要)

+

编译基础软件包(仅ubuntu 20+需要)

编译依赖的基础软件包

+

编译依赖的基础软件包

通过互联网获取

Linux服务器

SCons3.0.4+

+

SCons3.0.4+

编译构建工具

+

编译构建工具

通过互联网获取

Linux服务器

python模块:setuptools、kconfiglib、pycryptodome、six、ecdsa

+

python模块:setuptools、kconfiglib、pycryptodome、six、ecdsa

编译构建工具

+

编译构建工具

通过互联网获取

Linux服务器

gcc riscv32

+

gcc riscv32

编译构建工具

+

编译构建工具

通过互联网获取

Windows工作台

CH341SER.EXE

+

CH341SER.EXE

USB转串口驱动

+

USB转串口驱动

http://www.wch.cn/search?q=ch340g&t=downloads

通过apt-get install安装

Java 虚拟机环境

+

Java虚拟机环境

编译、调试和运行Java程序

- - - - - - - - - - - - - - - - -

执行命令

-

命令解释

-

setenv bootcmd "mmc read 0x0 0x80000000 0x800 0x4800; go 0x80000000";

-

读取FLASH起始地址为0x800(单位为512B,即1MB),大小为0x4800(单位为512B,即9MB)的内容到0x80000000的内存地址,该大小(9MB)与IDE中所填写OHOS_Image.bin文件大小必须相同

-

setenv bootargs "console=ttyAMA0,115200n8 root=emmc fstype=vfat rootaddr=10M rootsize=20M rw";

-

表示设置启动参数,输出模式为串口输出,波特率为115200,数据位8,rootfs挂载于emmc器件,文件系统类型为vfat,

-

“rootaddr=10M rootsize=20M rw”处对应填入rootfs.img的烧写起始位置与长度,此处与IDE中新增rootfs.img文件时所填大小必须相同

-

saveenv

-

表示保存当前配置。

-

reset

-

表示复位单板。

-
- - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** - >**“go 0x80000000”**为可选指令,默认配置已将该指令固化在启动参数中,单板复位后可自动启动。若想切换为手动启动,可在U-boot启动倒数阶段使用"回车"打断自动启动。 - -3. 输入**“reset”**指令并回车,重启单板,启动成功如下图,输入回车串口显示OHOS字样。 - - **图 3** 系统启动图 - + ![](/images/device-dev/quick-start/figures/bootloader.png) + +2. 提示如下图中的重启开发板的提示信息时,重启开发板,然后在控制台输出“SUCCESS”表示设置成功。 + + ![](/images/device-dev/quick-start/figures/reset_success.png) + +3. 在任务栏点击**Monitor**按钮,启动串口工具。 + + ![](/images/device-dev/quick-start/figures/monitor.png) + +4. 然后根据界面提示进行操作,直到在界面打印**OHOS \#**信息,表示系统启动成功。 - ![](/images/zh-cn/device-dev/quick-start/figure/qi1.png) + ![](/images/device-dev/quick-start/figures/reboot_success.png) ## 执行应用程序 根目录下,在命令行输入指令“**./bin/helloworld**”执行写入的demo程序,显示成功结果如下图所示。 -**图 4** 启动并成功执行应用程序图 -![](/images/zh-cn/device-dev/quick-start/figure/启动并成功执行应用程序图.png "启动并成功执行应用程序图") +**图 2** 启动并成功执行应用程序图 +![](/images/device-dev/quick-start/figures/启动并成功执行应用程序图.png "启动并成功执行应用程序图") diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/02.Hi3516\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" similarity index 50% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/02.Hi3516\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" index da8cc7a702b018cb5ce6488bf266e516bba4f5a9..f4eee21a3c496043f245f8d337837a5b68683a12 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/02.Hi3516\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -1,6 +1,6 @@ --- title: 常见问题 -permalink: /pages/0001000403 +permalink: /pages/000100020102 navbar: true sidebar: true prev: true @@ -9,47 +9,37 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:28 --- # 常见问题 -- [烧写选择串口后提示失败](#section627268185113) +- [烧写选择串口后,提示“Error: Opening COMxx: Access denied”](#section627268185113) - [Windows电脑与单板网络连接失败](#section195391036568) - [烧写失败](#section571164016565) - [编译构建过程中,提示找不到“python”](#section1039835245619) - [串口无回显](#section14871149155911) -## 烧写选择串口后提示失败 +## 烧写选择串口后,提示“Error: Opening COMxx: Access denied” - **现象描述** - 点击烧写并选择串口后,出现Error: Opening COMxx: Access denied。 + 点击烧写并选择串口后,出现“Error: Opening COMxx: Access denied”。 - **图 1** 打开串口失败图 - ![](/images/zh-cn/device-dev/quick-start/figure/打开串口失败图.png "打开串口失败图") + ![](/images/device-dev/quick-start/figures/Failed-to-open-the-serial-port.png) - **可能原因** 串口已经被占用。 -- **解决办法** - -1. 按图依次选择下拉框,查找带有serial-xx的终端 - - **图 2** 查找是否存在占用串口的终端 - ![](/images/zh-cn/device-dev/quick-start/figure/查找是否存在占用串口的终端.png "查找是否存在占用串口的终端") - -2. 点击标号中的垃圾桶图标,关闭串口。 +- 解决方法 - **图 3** 关闭串口终端 - ![](/images/zh-cn/device-dev/quick-start/figure/关闭串口终端.png "关闭串口终端") + 检查主机中可能占用该端口的工具,关闭即可。若是当前工具占用,可按以下步骤排查并关闭: -3. 重新点击烧写,选择串口并开始烧写程序 + 1. 排查终端窗口列表,检查是否被monitor或其他终端占用。 - **图 4** 重新启动烧写任务 - + ![](/images/device-dev/quick-start/figures/terminal-list.png) - ![](/images/zh-cn/device-dev/quick-start/figure/changjian1.png) + 2. 找到占用,点击垃圾桶图标,关闭占用。 ## Windows电脑与单板网络连接失败 @@ -58,8 +48,8 @@ date: 2021-12-30 12:57:41 点击烧写并选择串口后,无法获取文件。 - **图 5** 网络不通,单板无法获取文件图 - ![](/images/zh-cn/device-dev/quick-start/figure/网络不通-单板无法获取文件图.png "网络不通-单板无法获取文件图") + **图 1** 网络不通,Hi3516单板无法获取文件 + ![](/images/device-dev/quick-start/figures/网络不通-Hi3516单板无法获取文件.png "网络不通-Hi3516单板无法获取文件") - **可能原因** @@ -72,23 +62,19 @@ date: 2021-12-30 12:57:41 1. 检查网线是否连接。 2. 点击Windows防火墙。 - **图 6** 网络防火墙设置图 - ![](/images/zh-cn/device-dev/quick-start/figure/网络防火墙设置图.png "网络防火墙设置图") + ![](/images/device-dev/quick-start/figures/hi3516-network-and-firewall-setting.png) 3. 点击“允许应用通过防火墙”。 - **图 7** 防火墙和网络保护界面图 - ![](/images/zh-cn/device-dev/quick-start/figure/防火墙和网络保护界面图.png "防火墙和网络保护界面图") + ![](/images/device-dev/quick-start/figures/hi3516-firewall-and-network-protection.png) 4. 查找Visual Studio Code应用。 - **图 8** 查找Visual Studio Code应用图 - ![](/images/zh-cn/device-dev/quick-start/figure/查找Visual-Studio-Code应用图.png "查找Visual-Studio-Code应用图") + ![](/images/device-dev/quick-start/figures/hi3516-selecting-the-visual-studio-code-application.png) 5. 勾选Visual Studio Code的专用和公用网络的访问权限。 - **图 9** 允许Visual Studio Code应用访问网络 - ![](/images/zh-cn/device-dev/quick-start/figure/允许Visual-Studio-Code应用访问网络.png "允许Visual-Studio-Code应用访问网络") + ![](/images/device-dev/quick-start/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png) ## 烧写失败 @@ -110,7 +96,7 @@ date: 2021-12-30 12:57:41 - **现象描述** - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270715.png) + ![](/images/device-dev/quick-start/figures/symptom-for-not-finding-python.png) - **可能原因1** @@ -119,11 +105,11 @@ date: 2021-12-30 12:57:41 - **解决办法** - 请按照[安装Python环境](/pages/0001000202#section1238412211211)。 + 请按照[安装Python环境](/pages/0001000102)。 - **可能原因2** - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128470880.png) + ![](/images/device-dev/quick-start/figures/reason-for-not-finding-python.png) - **解决办法** @@ -138,7 +124,7 @@ date: 2021-12-30 12:57:41 例: - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270713.png) + ![](/images/device-dev/quick-start/figures/solution.png) ## 串口无回显 @@ -155,7 +141,7 @@ date: 2021-12-30 12:57:41 修改串口号。 - 请查看设备管理器,确认连接单板的串口与终端中连接串口是否一致,若不一致,请按镜像运行内[步骤1](#section627268185113)修改串口号。 + 请查看设备管理器,确认连接单板的串口与终端中连接串口是否一致,若不一致,请按镜像运行修改串口号。 - **可能原因2** @@ -171,7 +157,7 @@ date: 2021-12-30 12:57:41 1. 获取引导文件U-boot。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** + >![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >单板的U-boot文件请在开源包中获取: >Hi3516DV300:device\\hisilicon\\hispark\_taurus\\sdk\_liteos\\uboot\\out\\boot\\u-boot-hi3516dv300.bin >Hi3518EV300:device\\hisilicon\\hispark\_aries\\sdk\_liteos\\uboot\\out\\boot\\u-boot-hi3518ev300.bin @@ -182,7 +168,7 @@ date: 2021-12-30 12:57:41 3. 烧写完成后,登录串口如下图所示。 - **图 10** U-boot烧写完成串口显示图 - ![](/images/zh-cn/device-dev/quick-start/figure/U-boot烧写完成串口显示图.png "U-boot烧写完成串口显示图") + **图 2** U-boot烧写完成串口显示图 + ![](/images/device-dev/quick-start/figures/U-boot烧写完成串口显示图.png "U-boot烧写完成串口显示图") diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/06.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3518\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/03.Hi3518\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" similarity index 92% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/06.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3518\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/03.Hi3518\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" index 12d5f10d896bdf4eaad5fb632c69b3c9ceb44e78..256d944d4e8e47d3a6eb5648f32fd378ce8e2607 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/06.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3518\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/03.Hi3518\345\274\200\345\217\221\346\235\277/01.\345\256\211\350\243\205\345\274\200\345\217\221\346\235\277\347\216\257\345\242\203.md" @@ -1,6 +1,6 @@ --- title: 安装开发板环境 -permalink: /pages/0001000500 +permalink: /pages/000100020200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:28 --- # 安装开发板环境 @@ -32,13 +32,13 @@ date: 2021-12-30 12:57:41 各硬件连接关系如下图所示。 + **图 1** Hi3518开发硬件连线图 + ![](/images/device-dev/quick-start/figures/Hi3518开发硬件连线图.png "Hi3518开发硬件连线图") -**图 1** 硬件连线图 -![](/images/zh-cn/device-dev/quick-start/figure/硬件连线图-3.png "硬件连线图-3") ### 软件要求 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >本节描述安装包方式搭建编译环境的操作步骤。如果是Docker方式安装编译环境,请跳过此章节以及下述[安装Linux服务器工具](#section8831868501)章节。 Hi3518开发板对Linux服务器通用环境配置需要的工具及其获取途径如下表所示。 @@ -80,7 +80,7 @@ Hi3518开发板对Linux服务器通用环境配置需要的工具及其获取途 ## 安装Linux服务器工具 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >- 如果通过“HPM组件方式”或“HPM包管理器命令行工具方式”获取源码,不需要安装hc-gen编译工具。 >- (推荐)如果通过“镜像站点方式”或“代码仓库方式”获取源码,需要安装hc-gen编译工具。安装hc-gen编译工具时,请确保编译工具的环境变量路径唯一。 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/06.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3518\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214HelloOHOS\357\274\210\347\274\226\350\257\221\343\200\201\347\203\247\345\275\225\357\274\211.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/03.Hi3518\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214.md" similarity index 44% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/06.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3518\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214HelloOHOS\357\274\210\347\274\226\350\257\221\343\200\201\347\203\247\345\275\225\357\274\211.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/03.Hi3518\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214.md" index 00657dac20d0cb372b955fdb8db56e5a84f4d19d..b01e2f98558483f212957cfdd2677e52143a16da 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/06.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3518\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214HelloOHOS\357\274\210\347\274\226\350\257\221\343\200\201\347\203\247\345\275\225\357\274\211.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/03.Hi3518\345\274\200\345\217\221\346\235\277/02.\350\277\220\350\241\214.md" @@ -1,6 +1,6 @@ --- -title: 运行HelloOHOS(编译、烧录) -permalink: /pages/0001000501 +title: 运行 +permalink: /pages/000100020201 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:28 --- # 运行Hello OHOS(编译、烧录) @@ -141,7 +141,7 @@ date: 2021-12-30 12:57:41 ## 编译 -如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](/pages/extra/70d134/#section107932281315)的编译操作。如果Linux编译环境通过软件包方式安装,进入源码根目录,执行如下命令进行编译: +如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](/pages/000a00#section107932281315)的编译操作。如果Linux编译环境通过软件包方式安装,进入源码根目录,执行如下命令进行编译: ``` hb set(设置编译路径) @@ -152,124 +152,98 @@ hb build -f(执行编译) 结果文件生成在out/hispark\_aries/ipcamera\_hispark\_aries目录下。 -**图 1** 设置图例 -![](/images/zh-cn/device-dev/quick-start/figure/设置图例-4.png "设置图例-4") +**图 1** Hi3518编译设置图例 +![](/images/device-dev/quick-start/figures/Hi3518编译设置图例.png "Hi3518编译设置图例") ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >Hi3518EV300单板的U-boot文件获取路径:device/hisilicon/hispark\_aries/sdk\_liteos/uboot/out/boot/u-boot-hi3518ev300.bin ## 烧录 -Hi3518开发板的代码烧录仅支持USB烧录方式。 +烧录是指将编译后的程序文件下载到芯片开发板上的动作,为后续的程序调试提供基础。DevEco Device Tool提供一键烧录功能,操作简单,能快捷、高效的完成程序烧录,提升烧录的效率。 -1. 请连接好电脑和待烧录开发板,以Hi3518EV300为例,需要同时连接串口和USB口,具体可参考[Hi3518开发板介绍](/pages/0001000102)。 +Hi3518EV300开发板的代码烧录支持USB烧录和串口烧录两种方式,其中: + +- **Windows系统:支持USB烧录和串口烧录。** +- **Linux系统:支持串口烧录,如果采用的是Linux+Windows双系统,也支持USB烧录。** + +同一种烧录方式(如串口烧录),在Windows和Linux环境下的烧录操作完全一致,区别仅在于DevEco Device Tool环境搭建不同。 + +此处仅以USB烧录为例进行说明。 + +1. 请连接好电脑和待烧录开发板,需要同时连接串口和USB口,具体可参考[Hi3518EV300开发板介绍](https://device.harmonyos.com/cn/docs/start/introduce/oem_minitinier_des_3518-0000001105201138)。 2. 打开电脑的设备管理器,查看并记录对应的串口号。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >如果对应的串口异常,请根据[Hi3516/Hi3518系列开发板串口驱动安装指导](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3516_hi3518-drivers-0000001050743695)安装USB转串口的驱动程序。 + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >如果对应的串口异常,请根据[Hi3516DV300/Hi3518EV300开发板串口驱动安装指导](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3516_hi3518-drivers-0000001050743695)安装USB转串口的驱动程序。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128470900.png) + ![](/images/device-dev/quick-start/figures/hi3518-record-the-serial-port-number.png) -3. 打开DevEco Device Tool,在Projects中,点击**Settings**打开工程配置界面。 +3. 打开DevEco Device Tool,在QUICK ACCESS \> DevEco Home \> Projects中,点击**Settings**打开工程配置界面。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350649.png) + ![](/images/device-dev/quick-start/figures/hi3518-deveco-device-tool-setting.png) + +4. 在“Partition Configuration”页签,设置待烧录文件信息,默认情况下,DevEco Device Tool已针对Hi3518EV300开发板进行适配,无需单独修改。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >如果待烧录文件是直接通过拷贝的方式获取,需要手动修改待烧录文件的路径。打开待烧录文件的页签,在Partition Settings的New Opiton的下拉列表中,选择Partition\_bin,然后在Partition Opiton的Partition\_bin设置待烧录文件的路径。 -4. 在“Partition Configuration”页签,设置待烧录文件信息,默认情况下,DevEco Device Tool已针对Hi3518系列开发板进行适配,无需单独修改。 5. 在“hi3518ev300”页签,设置烧录选项,包括upload\_port、upload\_partitions和upload\_protocol。 - upload\_port:选择步骤[2](#zh-cn_topic_0000001057313128_li46411811196)中查询的串口号。 - upload\_protocol:选择烧录协议,固定选择“hiburn-usb”。 - upload\_partitions:选择待烧录的文件,默认情况下会同时烧录fastboot、kernel、rootfs和userfs。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311090.png) + ![](/images/device-dev/quick-start/figures/upload-options.png) 6. 所有的配置都修改完成后,在工程配置页签的顶部,点击**Save**进行保存。 -7. 打开工程文件,点击![](/images/zh-cn/device-dev/quick-start/figure/2021-01-27_170334-5.png)图标,打开DevEco Device Tool界面,在“PROJECT TASKS”中,点击hi3518ev300\_fastboot下的**Erase**按钮,擦除U-Boot。 +7. 打开工程文件,点击![](/images/device-dev/quick-start/figures/hi3518-deveco-device-tool-logo.png)图标,打开DevEco Device Tool界面,在“PROJECT TASKS”中,点击hi3518ev300\_fastboot下的**Erase**按钮,擦除U-Boot。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270731.png) + ![](/images/device-dev/quick-start/figures/erase-u-Boot.png) 8. 执行**Erase**擦除操作后,显示如下提示信息时,请重启开发板(下电再上电)。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311092.png) + ![](/images/device-dev/quick-start/figures/hi3518-restart-the-development-board.png) 9. 重新上电后,显示如下信息时,表示擦除U-Boot成功。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311094.png) + ![](/images/device-dev/quick-start/figures/u-boot-erased-successfully.png) 10. 擦除完成后,点击hi3518ev300下的**Upload**按钮,启动烧录。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350641.png) + ![](/images/device-dev/quick-start/figures/hi3518-upload.png) 11. 启动烧录后,界面提示如下信息时,表示烧录成功。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350643.png) + ![](/images/device-dev/quick-start/figures/hi3518-burning-succeeded.png) +12. 烧录成功后,请根据镜像运行章节进行操作,启动系统。 ## 镜像运行 -1. 连接串口。 +在完成Hi3518EV300的烧录后,还需要设置BootLoader引导程序,才能运行OpenHarmony系统。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** - >若无法连接串口,请参考[常见问题](/pages/0001000502#zh-cn_topic_0000001053466255_section14871149155911)进行排查。 +1. 在Hi3518EV300任务中,点击**Configure bootloader(Boot OS)**进行配置即可。 - **图 2** 连接串口图 - + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >DevEco Device Tool针对Hi3518EV300开发板的BootLoader设置进行了适配,无需开发者手动修改。 + + ![](/images/device-dev/quick-start/figures/hi3518-bootloader.png) + +2. 提示如下图中的重启开发板的提示信息时,重启开发板,然后在控制台输出“SUCCESS”表示设置成功。 + + ![](/images/device-dev/quick-start/figures/hi3518-reset-success.png) + +3. 在任务栏点击**Monitor**按钮,启动串口工具。 + + ![](/images/device-dev/quick-start/figures/hi3518-monitor.png) + +4. 然后根据界面提示进行操作,直到在界面打印OHOS \#信息,表示系统启动成功。 - ![](/images/zh-cn/device-dev/quick-start/figure/chuankou1-6.png) - - 1. 单击**Monitor**打开串口。 - 2. 连续输入回车直到串口显示"hisilicon"。 - 3. 单板初次启动或修改启动参数,请进入[步骤2](#li9441185382314),否则进入[步骤3](#li6442853122312)。 - -2. (初次烧写必选)修改U-boot的bootcmd及bootargs内容:该步骤为固化操作,可保存执行结果,但U-boot重新烧入,则需要再次执行下述步骤。 - - **表 1** U-boot修改命令 - - - - - - - - - - - - - - - - - - - - - - -

执行命令

-

命令解释

-

setenv bootcmd "sf probe 0;sf read 0x40000000 0x100000 0x600000;go 0x40000000";

-

设置bootcmd内容,选择FLASH器件0,读取FLASH起始地址为0x100000,大小为0x600000字节的内容到0x40000000的内存地址,此处0x600000为6MB,与IDE中填写OHOS_Image.bin的文件大小必须相同

-

setenv bootargs "console=ttyAMA0,115200n8 root=flash fstype=jffs2 rw rootaddr=7M rootsize=8M";

-

表示设置bootargs参数为串口输出,波特率为115200,数据位8,rootfs挂载于FLASH上,文件系统类型为jffs2 rw,以支持可读写JFFS2文件系统。“rootaddr=7M rootsize=8M”处对应填入实际rootfs.img的烧写起始位置与长度,与IDE内所填大小必须相同

-

saveenv

-

表示保存当前配置。

-

reset

-

表示复位单板。

-

pri

-

表示查看显示参数。

-
- - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** - >**“go 0x40000000”**为可选指令,默认配置已将该指令固化在启动参数中,单板复位后可自动启动。若想切换为手动启动,可在U-boot启动倒数阶段使用"回车"打断自动启动。 - -3. 若启动时显示**"hisilicon \#**字样,请输入**“reset”**指令,等待系统自启动进入系统,系统启动后,显示**“OHOS”**字样,输入**”./bin/helloworld”**并回车,显示成功结果如下图所示。 - - **图 3** 启动成功并执行应用程序图 - ![](/images/zh-cn/device-dev/quick-start/figure/启动成功并执行应用程序图.png "启动成功并执行应用程序图") + ![](/images/device-dev/quick-start/figures/hi3518-reboot-success.png) ## 下一步学习 -恭喜您,已完成Hi3518的快速上手!建议您下一步进入[无屏摄像头产品开发](/pages/extra/d4b6cb/)的学习 。 +恭喜您,已完成Hi3518的快速上手!建议您下一步进入[无屏摄像头产品开发](/pages/extra/466519/)的学习 。 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/06.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3518\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/03.Hi3518\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" similarity index 51% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/06.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3518\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/03.Hi3518\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" index 9c9572b8554ee97fdb37fd22a7bb839a6de10a90..74d45523abf6b3569627e47b4190c8d9ed164296 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/06.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3518\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\350\277\220\350\241\214\342\200\234HelloWorld\342\200\235/03.Hi3518\345\274\200\345\217\221\346\235\277/03.\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -1,6 +1,6 @@ --- title: 常见问题 -permalink: /pages/0001000502 +permalink: /pages/000100020202 navbar: true sidebar: true prev: true @@ -9,47 +9,37 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:28 --- # 常见问题 -- [烧写选择串口后提示失败](#section1498892119619) +- [烧写选择串口后,提示“Error: Opening COMxx: Access denied”](#section1498892119619) - [Windows电脑与单板网络连接失败](#section8512971816) - [烧写失败](#section1767804111198) - [编译构建过程中,提示找不到“python”](#zh-cn_topic_0000001053466255_section1039835245619) - [串口无回显](#zh-cn_topic_0000001053466255_section14871149155911) -## 烧写选择串口后提示失败 +## 烧写选择串口后,提示“Error: Opening COMxx: Access denied” - **现象描述** - 点击烧写并选择串口后,出现Error: Opening COMxx: Access denied。 + 点击烧写并选择串口后,出现“Error: Opening COMxx: Access denied”。 - **图 1** 打开串口失败图 - ![](/images/zh-cn/device-dev/quick-start/figure/打开串口失败图-7.png "打开串口失败图-7") + ![](/images/device-dev/quick-start/figures/Failed-to-open-the-serial-port.png) - **可能原因** 串口已经被占用。 -- **解决办法** - -1. 按图依次选择下拉框,查找带有serial-xx的终端 - - **图 2** 查找是否存在占用串口的终端 - ![](/images/zh-cn/device-dev/quick-start/figure/查找是否存在占用串口的终端-8.png "查找是否存在占用串口的终端-8") - -2. 点击标号中的垃圾桶图标,关闭串口。 +- 解决方法 - **图 3** 关闭串口终端 - ![](/images/zh-cn/device-dev/quick-start/figure/关闭串口终端-9.png "关闭串口终端-9") + 检查主机中可能占用该端口的工具,关闭即可。若是当前工具占用,可按以下步骤排查并关闭: -3. 重新点击烧写,选择串口并开始烧写程序 + 1. 排查终端窗口列表,检查是否被monitor或其他终端占用。 - **图 4** 重新启动烧写任务 - + ![](/images/device-dev/quick-start/figures/terminal-list.png) - ![](/images/zh-cn/device-dev/quick-start/figure/changjian1-10.png) + 2. 找到占用,点击垃圾桶图标,关闭占用。 ## Windows电脑与单板网络连接失败 @@ -58,8 +48,8 @@ date: 2021-12-30 12:57:41 点击烧写并选择串口后,无法获取文件。 - **图 5** 网络不通,单板无法获取文件图 - ![](/images/zh-cn/device-dev/quick-start/figure/网络不通-单板无法获取文件图-11.png "网络不通-单板无法获取文件图-11") + **图 1** 网络不通,Hi3518单板无法获取文件 + ![](/images/device-dev/quick-start/figures/网络不通-Hi3518单板无法获取文件.png "网络不通-Hi3518单板无法获取文件") - **可能原因** @@ -72,23 +62,19 @@ date: 2021-12-30 12:57:41 1. 检查网线是否连接。 2. 点击Windows防火墙。 - **图 6** 网络防火墙设置图 - ![](/images/zh-cn/device-dev/quick-start/figure/网络防火墙设置图-12.png "网络防火墙设置图-12") + ![](/images/device-dev/quick-start/figures/hi3518-network-and-firewall-setting.png) 3. 点击“允许应用通过防火墙”。 - **图 7** 防火墙和网络保护界面图 - ![](/images/zh-cn/device-dev/quick-start/figure/防火墙和网络保护界面图-13.png "防火墙和网络保护界面图-13") + ![](/images/device-dev/quick-start/figures/hi3518-firewall-and-network-protection.png) 4. 查找Visual Studio Code应用。 - **图 8** 查找Visual Studio Code应用图 - ![](/images/zh-cn/device-dev/quick-start/figure/查找Visual-Studio-Code应用图-14.png "查找Visual-Studio-Code应用图-14") + ![](/images/device-dev/quick-start/figures/hi3518-selecting-the-visual-studio-code-application.png) 5. 勾选Visual Studio Code的专用和公用网络的访问权限。 - **图 9** 允许Visual Studio Code应用访问网络 - ![](/images/zh-cn/device-dev/quick-start/figure/允许Visual-Studio-Code应用访问网络-15.png "允许Visual-Studio-Code应用访问网络-15") + ![](/images/device-dev/quick-start/figures/hi3518-allowing-the-visual-studio-code-application-to-access-the-network.png) ## 烧写失败 @@ -110,7 +96,7 @@ date: 2021-12-30 12:57:41 - **现象描述** - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270743.png) + ![](/images/device-dev/quick-start/figures/hi3518-error-for-not-finding-python.png) - **可能原因1** @@ -119,11 +105,11 @@ date: 2021-12-30 12:57:41 - **解决办法** - 请按照[安装Python环境](/pages/0001000202#section1238412211211)。 + 请按照[安装Python环境](/pages/0001000102)。 - **可能原因2** - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270739.png) + ![](/images/device-dev/quick-start/figures/hi3518-reason-no-python-soft-link.png) - **解决办法** @@ -138,7 +124,7 @@ date: 2021-12-30 12:57:41 例: - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350661.png) + ![](/images/device-dev/quick-start/figures/hi3518-solution-set-python-soft-link.png) ## 串口无回显 @@ -171,7 +157,7 @@ date: 2021-12-30 12:57:41 1. 获取引导文件U-boot。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** + >![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >单板的U-boot文件请在开源包中获取: >Hi3516DV300:device\\hisilicon\\hispark\_taurus\\sdk\_liteos\\uboot\\out\\boot\\u-boot-hi3516dv300.bin >Hi3518EV300:device\\hisilicon\\hispark\_aries\\sdk\_liteos\\uboot\\out\\boot\\u-boot-hi3518ev300.bin @@ -182,6 +168,6 @@ date: 2021-12-30 12:57:41 3. 烧写完成后,登录串口如下图所示。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350659.png) + ![](/images/device-dev/quick-start/figures/login-serial-port.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\345\205\245\351\227\250\344\273\213\347\273\215/01.Hi3861\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\351\231\204\345\275\225/01.Hi3861\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\345\205\245\351\227\250\344\273\213\347\273\215/01.Hi3861\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\351\231\204\345\275\225/01.Hi3861\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" index ddf5a4f687be723e0ef277c98033c701e8a98b4a..f4d412e8668d253e11039843d8c9c2920ffe36c4 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\345\205\245\351\227\250\344\273\213\347\273\215/01.Hi3861\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\351\231\204\345\275\225/01.Hi3861\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" @@ -1,6 +1,6 @@ --- title: Hi3861开发板介绍 -permalink: /pages/0001000100 +permalink: /pages/0001000300 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:40 +date: 2021-12-30 18:31:28 --- # Hi3861开发板介绍 @@ -22,27 +22,21 @@ date: 2021-12-30 12:57:40 Hi3861 WLAN模组是一片大约2cm\*5cm大小的开发板,是一款高度集成的2.4GHz WLAN SoC芯片,集成IEEE 802.11b/g/n基带和RF(Radio Frequency)电路。支持OpenHarmony,并配套提供开放、易用的开发和调试运行环境。 -**图 1** Hi3861 WLAN模组外观图 - - -![](/images/zh-cn/device-dev/quick-start/figure/3861正面.png) +**图 1** Hi3861 WLAN模组外观图 +![](/images/device-dev/quick-start/figures/Hi3861-WLAN模组外观图.png "Hi3861-WLAN模组外观图") 另外,Hi3861 WLAN模组还可以通过与Hi3861底板连接,扩充自身的外设能力,底板如下图所示。 -**图 2** Hi3861底板外观图 - - -![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350615.png) +**图 2** Hi3861底板外观图 +![](/images/device-dev/quick-start/figures/Hi3861底板外观图.png "Hi3861底板外观图") - RF电路包括功率放大器PA(Power Amplifier)、低噪声放大器LNA(Low Noise Amplifier)、RF Balun、天线开关以及电源管理等模块;支持20MHz标准带宽和5MHz/10MHz窄带宽,提供最大72.2Mbit/s物理层速率。 - Hi3861 WLAN基带支持正交频分复用(OFDM)技术,并向下兼容直接序列扩频(DSSS)和补码键控(CCK)技术,支持IEEE 802.11 b/g/n协议的各种数据速率。 - Hi3861芯片集成高性能32bit微处理器、硬件安全引擎以及丰富的外设接口,外设接口包括SPI(Synchronous Peripheral Interface)、UART(Universal Asynchronous Receiver & Transmitter)、I2C(The Inter Integrated Circuit)、PWM(Pulse Width Modulation)、GPIO(General Purpose Input/Output)和多路ADC(Analog to Digital Converter),同时支持高速SDIO2.0(Secure Digital Input/Output)接口,最高时钟可达50MHz;芯片内置SRAM(Static Random Access Memory)和Flash,可独立运行,并支持在Flash上运行程序。 - Hi3861芯片适用于智能家电等物联网智能终端领域。 - **图 3** Hi3861功能框图 - - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311066.png) + **图 3** Hi3861功能框图 + ![](/images/device-dev/quick-start/figures/Hi3861功能框图.png "Hi3861功能框图") ## 资源和约束 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\345\205\245\351\227\250\344\273\213\347\273\215/02.Hi3516\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\351\231\204\345\275\225/02.Hi3516\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" similarity index 93% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\345\205\245\351\227\250\344\273\213\347\273\215/02.Hi3516\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\351\231\204\345\275\225/02.Hi3516\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" index 6da6e0c73ec4e769aa50991bdc08d1f65e777eab..b2fb86d26cc5f5c8c1dac6397d23e89ffba2c020 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\345\205\245\351\227\250\344\273\213\347\273\215/02.Hi3516\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\351\231\204\345\275\225/02.Hi3516\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" @@ -1,6 +1,6 @@ --- title: Hi3516开发板介绍 -permalink: /pages/0001000101 +permalink: /pages/0001000301 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:40 +date: 2021-12-30 18:31:28 --- # Hi3516开发板介绍 @@ -20,10 +20,8 @@ date: 2021-12-30 12:57:40 Hi3516DV300作为新一代行业专用Smart HD IP摄像机SOC,集成新一代ISP\(Image Signal Processor\)、H.265视频压缩编码器,同时集成高性能NNIE引擎,使得Hi3516DV300在低码率、高画质、智能处理和分析、低功耗等方面引领行业水平。 -**图 1** Hi3516单板正面外观图 - - -![](/images/zh-cn/device-dev/quick-start/figure/3516正面.png) +**图 1** Hi3516单板正面外观图 +![](/images/device-dev/quick-start/figures/Hi3516单板正面外观图.png "Hi3516单板正面外观图") ## 开发板规格 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\345\205\245\351\227\250\344\273\213\347\273\215/03.Hi3518\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\351\231\204\345\275\225/03.Hi3518\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\345\205\245\351\227\250\344\273\213\347\273\215/03.Hi3518\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\351\231\204\345\275\225/03.Hi3518\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" index ed0a751e3c3b26c143bcb6bd8453b50c5119f4de..105f9d0e5d792ed32d42cf7dc6858a3690a8ba1d 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/02.\345\205\245\351\227\250\344\273\213\347\273\215/03.Hi3518\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\351\231\204\345\275\225/03.Hi3518\345\274\200\345\217\221\346\235\277\344\273\213\347\273\215.md" @@ -1,6 +1,6 @@ --- title: Hi3518开发板介绍 -permalink: /pages/0001000102 +permalink: /pages/0001000302 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:40 +date: 2021-12-30 18:31:28 --- # Hi3518开发板介绍 @@ -20,13 +20,11 @@ date: 2021-12-30 12:57:40 Hi3518EV300作为新一代智慧视觉处理SOC,集成新一代ISP\(Image Signal Processor\)以及H.265视频压缩编码器,同时采用先进低功耗工艺和低功耗架构设计,使其在低码率、高画质、低功耗等方面引领行业水平。 -**图 1** Hi3518EV300单板正面外观图 -![](/images/zh-cn/device-dev/quick-start/figure/Hi3518EV300单板正面外观图.png "Hi3518EV300单板正面外观图") +**图 1** Hi3518EV300单板正面外观图 +![](/images/device-dev/quick-start/figures/Hi3518EV300单板正面外观图.png "Hi3518EV300单板正面外观图") -**图 2** Hi3518EV300单板背面外观图 - - -![](/images/zh-cn/device-dev/quick-start/figure/Hi3518正背面.png) +**图 2** Hi3518EV300单板背面外观图 +![](/images/device-dev/quick-start/figures/Hi3518EV300单板背面外观图.png "Hi3518EV300单板背面外观图") ## 开发板规格 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/01.\345\205\245\351\227\250\344\273\213\347\273\215.md" "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/01.\345\205\245\351\227\250\344\273\213\347\273\215.md" similarity index 86% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/01.\345\205\245\351\227\250\344\273\213\347\273\215.md" rename to "website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/01.\345\205\245\351\227\250\344\273\213\347\273\215.md" index 65245517705575be99ffe8a28b4a276f961b6bab..7209cf5cd8b57cb459bcdcb74980d0dfa0089ac4 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/01.\345\205\245\351\227\250\344\273\213\347\273\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/02.\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/01.\345\205\245\351\227\250\344\273\213\347\273\215.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:31:28 --- # 入门介绍 @@ -25,17 +25,15 @@ date: 2021-12-30 12:57:41 标准系统快速入门流程如下图所示,其中“搭建Ubuntu环境及编译”环节可根据实际情况选择docker方式或工具包方式其中一种即可。 -**图 1** 标准环境快速入门流程 -![](/images/zh-cn/device-dev/quick-start/figure/标准环境快速入门流程.png "标准环境快速入门流程") +**图 1** 标准环境快速入门流程 +![](/images/device-dev/quick-start/figures/标准环境快速入门流程.png "标准环境快速入门流程") ## 开发板简介 Hi3516DV300作为新一代行业专用Smart HD IP摄像机SOC,集成新一代ISP\(Image Signal Processor\)、H.265视频压缩编码器,同时集成高性能NNIE引擎,使得Hi3516DV300在低码率、高画质、智能处理和分析、低功耗等方面引领行业水平。 -**图 2** Hi3516单板正面外观图 - - -![](/images/zh-cn/device-dev/quick-start/figure/3516正面-16.png) +**图 2** Hi3516单板正面外观图 +![](/images/device-dev/quick-start/figures/Hi3516单板正面外观图-0.png "Hi3516单板正面外观图-0") ## 开发板规格 @@ -55,10 +53,10 @@ Hi3516DV300作为新一代行业专用Smart HD IP摄像机SOC,集成新一代I

外部器件

  • 以太网口
  • 音频视频
    • 1路语音输入
    • 1路单声道(AC_L)输出,接3W功放(LM4871)
    • MicroHDMI(1路HDMI 1.4)
    +
  • 以太网口
  • 音频视频
    • 1路语音输入
    • 1路单声道(AC_L)输出,接3W功率放大器(LM4871)
    • MicroHDMI(1路HDMI 1.4)
  • 摄像头
    • 传感器IMX335
    • 镜头M12,焦距4mm,光圈1.8
  • 显示屏
    • LCD连接器(2.35寸)
    • LCD连接器(5.5寸)
    -
  • 外部器件及接口
    • SD卡接口
    • JTAG/I2S 接口
    • ADC接口
    • 舵机接口
    • Grove连接器
    • USB2.0(Type C)
    • 功能按键3个,2个用户自定义按键,1个升级按键
    • LED指示灯,绿灯,红灯
    +
  • 外部器件及接口
    • SD卡接口
    • JTAG/I2S接口
    • ADC接口
    • 舵机接口
    • Grove连接器
    • USB2.0(Type C)
    • 功能按键3个,2个用户自定义按键,1个升级按键
    • LED指示灯,绿灯,红灯
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LTS版本源码

+

版本信息

+

下载站点

+

SHA256校验码

+

全量代码(标准、轻量和小型系统)

+

3.0

+

站点

+

SHA256校验码

+

标准系统解决方案(二进制)

+

3.0

+

站点

+

SHA256校验码

+

Hi3861解决方案(二进制)

+

3.0

+

站点

+

SHA256校验码

+

Hi3518解决方案(二进制)

+

3.0

+

站点

+

SHA256校验码

+

Hi3516解决方案-LiteOS(二进制)

+

3.0

+

站点

+

SHA256校验码

+

Hi3516解决方案-Linux(二进制)

+

3.0

+

站点

+

SHA256校验码

+

RELEASE-NOTES

+

3.0

+

站点

+

-

+

Master版本源码

+

版本信息

+

下载站点

+

SHA256校验码

+

Beta版本(标准系统)

+

2.2 Beta2

+

站点

+

SHA256校验码

+

RELEASE-NOTES

+

2.2 Beta2

+

站点

+

-

+

编译工具链

+

版本信息

+

下载站点

+

SHA256校验码

+

编译工具链获取清单

+

-

+

站点

+

-

+
+ +## 获取方式4:从github镜像仓库获取\(每天UTC时间23点同步\) + +方式一(推荐):通过repo + ssh 下载(需注册公钥,请参考[GitHub帮助中心](https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account))。 + +``` +repo init -u git@github.com:openharmony/manifest.git -b master --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +方式二:通过repo + https 下载。 + +``` +repo init -u https://github.com/openharmony/manifest.git -b master --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +## 源码目录 + +下表是OpenHarmony源码的目录及简单说明: + +**表 2** 源码目录 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

目录名

+

描述

+

applications

+

应用程序样例,包括camera等

+

base

+

基础软件服务子系统集&硬件服务子系统集

+

build

+

组件化编译、构建和配置脚本

+

docs

+

说明文档

+

domains

+

增强软件服务子系统集

+

drivers

+

驱动子系统

+

foundation

+

系统基础能力子系统集

+

kernel

+

内核子系统

+

prebuilts

+

编译器及工具链子系统

+

test

+

测试子系统

+

third_party

+

开源第三方组件

+

utils

+

常用的工具集

+

vendor

+

厂商提供的软件

+

build.py

+

编译脚本文件

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/02.Windows\345\274\200\345\217\221\347\216\257\345\242\203\345\207\206\345\244\207.md" "b/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/02.Windows\345\274\200\345\217\221\347\216\257\345\242\203\345\207\206\345\244\207.md" deleted file mode 100644 index 05498d4c5278c4a0b0b25e34aaf4b7227d8bcc66..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272\347\263\273\347\273\237\347\216\257\345\242\203/02.Windows\345\274\200\345\217\221\347\216\257\345\242\203\345\207\206\345\244\207.md" +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: Windows开发环境准备 -permalink: /pages/0001000201 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:40 ---- -# Windows开发环境准备 - -- [获取软件](#zh-cn_topic_0000001058091994_section1483143015558) -- [安装Visual Studio Code](#zh-cn_topic_0000001058091994_section71401018163318) -- [安装Python](#zh-cn_topic_0000001058091994_section16266553175320) -- [安装Node.js](#zh-cn_topic_0000001058091994_section5353233124511) -- [安装hpm](#zh-cn_topic_0000001058091994_section173054793610) -- [安装DevEco Device Tool插件](#zh-cn_topic_0000001058091994_section4336315185716) - -系统要求:Windows 10 64位系统。 - -DevEco Device Tool以插件方式提供,基于Visual Studio Code进行扩展,安装分为如下几步: - -1. 安装Visual Studio Code -2. 安装Python -3. 安装Node.js -4. 安装hpm -5. 安装DevEco Device Tool插件 - -## 获取软件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

工具名称

-

用途说明

-

版本要求

-

获取渠道

-

Visual Studio Code

-

代码编辑工具

-

V1.53及以上 64位版本。

-

https://code.visualstudio.com/Download

-

Python

-

编译构建工具

-

V3.7.4~V3.8.x 64位版本

-

推荐下载:https://www.python.org/downloads/release/python-388/

-

Node.js

-

提供npm环境

-

v12.0.0及以上 64位版本

-

https://nodejs.org/zh-cn/download/

-

hpm

-

包管理工具

-

最新版

-

请参考安装hpm

-

DevEco Device Tool

-

OpenHarmony源码的编译、烧录、调试插件工具

-

v2.2 Beta1

-

https://device.harmonyos.com/cn/ide#download

-

下载前,请使用华为开发者帐号登录,如未注册,请先注册华为开发者帐号

-
- -## 安装Visual Studio Code - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->如果已安装Visual Studio Code,打开命令行工具,输入**code --version**命令,检查版本号是否为1.53及以上版本;可以正常返回版本号,说明环境变量设置也正确。 - -1. 双击Visual Studio Code软件包进行安装。安装过程中,请勾选“添加到PATH(重启后生效)”。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350653.png) - -2. 安装完成后,重启计算机,使Visual Studio Code的环境变量生效。 -3. 打开命令行工具,输入**code --version**命令,可以正常显示版本号说明安装成功。 - -## 安装Python - -1. 双击Python安装包进行安装,勾选“**Add Python 3.8 to PATH**”,然后点击**Install Now**开始安装。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128470908.png) - -2. 等待安装完成后,点击**Close**。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311104.png) - -3. 打开命令行工具,输入python --version,检查安装结果。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350655.png) - -4. 在命令行工具中,分别执行如下命令设置pip源,用于后续安装DevEco Device Tool过程中下载依赖的组件包。 - - ``` - pip config set global.trusted-host repo.huaweicloud.com - pip config set global.index-url https://repo.huaweicloud.com/repository/pypi/simple - pip config set global.timeout 120 - ``` - - -## 安装Node.js - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->如果已安装Node.js,打开命令行工具,输入**node -v**命令,检查版本号是否为12.0.0及以上版本。 - -1. 点击下载后的软件包进行安装,全部按照默认设置点击**Next**,直至**Finish**。安装过程中,Node.js会自动在系统的path环境变量中配置node.exe的目录路径。 -2. 重新打开命令行工具,输入“node -v“命令,能正常查询Node.js的版本号,说明Node.js安装成功。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311096.png) - - -## 安装hpm - -该方式需先确保**Node.js**安装成功。 - -在安装hpm前,请检查网络连接状态,如果网络不能直接访问Internet,则需要通过代理服务器才可以访问。这种情况下,需要先[设置npm代理](https://device.harmonyos.com/cn/docs/ide/user-guides/npm_proxy-0000001054491032),才能安装hpm。 - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->如果已安装hpm,可以执行**npm update -g @ohos/hpm-cli**命令升级hpm至最新版本。 - -1. 建议将npm源配置为国内镜像,例如设置为华为云镜像源。 - - ``` - npm config set registry https://repo.huaweicloud.com/repository/npm/ - ``` - -2. 打开命令行工具,执行如下命令安装最新版本hpm。 - - ``` - npm install -g @ohos/hpm-cli - ``` - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311100.png) - -3. 安装完成后,执行如下命令(V为大写字母)检查hpm安装结果。 - - ``` - hpm -V - ``` - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270735.png) - - -## 安装DevEco Device Tool插件 - -安装DevEco Device Tool插件,**主机的用户名不能包含中文字符**,否则可能导致运行出现错误。 - -DevEco Device Tool正常运行需要依赖于C/C++和CodeLLDB插件,在安装完DevEco Device Tool后,会自动从Visual Studio Code的插件市场安装C/C++和CodeLLDB插件。因此,在安装DevEco Device Tool前,请检查Visual Studio Code的网络连接状态,如果网络不能直接访问Internet,则需要通过代理服务器才可以访问,请先[Visual Studio Code代理设置](https://device.harmonyos.com/cn/docs/ide/user-guides/vscode_proxy-0000001074231144)。 - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->安装DevEco Device Tool时,请先关闭Visual Studio Code。 - -1. 解压DevEco Device Tool插件压缩包,双击安装包程序进行安装。 -2. 安装过程中,会自动安装DevEco Device Tool所需的依赖文件(如C/C++和CodeLLDB插件)和执行程序。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128470902.png) - -3. 安装完成后,会自动关闭命令行工具窗口。 -4. 启动Visual Studio Code,点击左侧的![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350651.png)按钮,检查INSTALLED中,是否已成功安装C/C++、CodeLLDB和DevEco Device Tool。 - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >如果C/C++和CodeLLDB插件安装不成功,则DevEco Device Tool不能正常运行,解决方法,详细请参考:[离线安装C/C++和CodeLLDB插件](https://device.harmonyos.com/cn/docs/ide/user-guides/offline_plugin_install-0000001074376846)。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270727.png) - - diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/03.\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/03.\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" deleted file mode 100644 index 771786fb142f849c61223ffc77c648541fbc95d4..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/05.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3516\345\274\200\345\217\221\346\235\277/03.\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" +++ /dev/null @@ -1,516 +0,0 @@ ---- -title: 驱动开发示例 -permalink: /pages/0001000402 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:41 ---- -# 驱动开发示例 - -- [驱动程序介绍](#s8efc1952ebfe4d1ea717182e108c29bb) -- [编译和烧录](#section660016185110) -- [镜像运行](#section333215226219) -- [下一步学习](#section9712145420182) - -本节指导开发者在单板上运行第一个驱动程序,其中包括驱动程序介绍、编译、烧写、运行等步骤。 - -## 驱动程序介绍 - -下面基于HDF框架,提供一个简单的UART(Universal Asynchronous Receiver/Transmitter)平台驱动开发样例,包含配置文件的添加,驱动代码的实现以及用户态程序和驱动交互的流程。驱动程序源码位于vendor/huawei/hdf/sample目录 - -1. 添加配置。 - - 在HDF框架的驱动配置文件(例如device/hisilicon/hi3516dv300/sdk\_liteos/config/uart/uart\_config.hcs)中添加该驱动的配置信息,如下所示: - - ``` - root { - platform { - uart_sample { - num = 5; // UART设备编号 - base = 0x120a0000; // UART 寄存器基地址 - irqNum = 38; - baudrate = 115200; - uartClk = 24000000; - wlen = 0x60; - parity = 0; - stopBit = 0; - match_attr = "sample_uart_5"; - } - } - } - ``` - - 在HDF框架的设备配置文件(例如vendor/hisilicon/ipcamera\_hi3516dv300\_liteos/config/device\_info/device\_info.hcs)中添加该驱动的设备节点信息,如下所示: - - ``` - root { - device_info { - platform :: host { - hostName = "platform_host"; - priority = 50; - device_uart :: device { - device5 :: deviceNode { - policy = 2; - priority = 10; - permission = 0660; - moduleName = "UART_SAMPLE"; - serviceName = "HDF_PLATFORM_UART_5"; - deviceMatchAttr = "sample_uart_5"; - } - } - } - } - } - ``` - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >配置文件与UART驱动示例的源码在同一个路径,需要手动添加到Hi3516DV300单板路径下。 - -2. 注册UART驱动入口。 - - 基于HDF框架注册UART驱动的入口HdfDriverEntry,代码如下: - - ``` - // 绑定UART驱动接口到HDF框架 - static int32_t SampleUartDriverBind(struct HdfDeviceObject *device) - { - struct UartHost *uartHost = NULL; - - if (device == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - HDF_LOGI("Enter %s:", __func__); - - uartHost = UartHostCreate(device); - if (uartHost == NULL) { - HDF_LOGE("%s: UartHostCreate failed", __func__); - return HDF_FAILURE; - } - uartHost->service.Dispatch = SampleDispatch; - return HDF_SUCCESS; - } - - // 从UART驱动的HCS中获取配置信息 - static uint32_t GetUartDeviceResource( - struct UartDevice *device, const struct DeviceResourceNode *resourceNode) - { - struct UartResource *resource = &device->resource; - struct DeviceResourceIface *dri = NULL; - dri = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - if (dri == NULL || dri->GetUint32 == NULL) { - HDF_LOGE("DeviceResourceIface is invalid"); - return HDF_FAILURE; - } - - if (dri->GetUint32(resourceNode, "num", &resource->num, 0) != HDF_SUCCESS) { - HDF_LOGE("uart config read num fail"); - return HDF_FAILURE; - } - if (dri->GetUint32(resourceNode, "base", &resource->base, 0) != HDF_SUCCESS) { - HDF_LOGE("uart config read base fail"); - return HDF_FAILURE; - } - resource->physBase = (unsigned long)OsalIoRemap(resource->base, 0x48); - if (resource->physBase == 0) { - HDF_LOGE("uart config fail to remap physBase"); - return HDF_FAILURE; - } - if (dri->GetUint32(resourceNode, "irqNum", &resource->irqNum, 0) != HDF_SUCCESS) { - HDF_LOGE("uart config read irqNum fail"); - return HDF_FAILURE; - } - if (dri->GetUint32(resourceNode, "baudrate", &resource->baudrate, 0) != HDF_SUCCESS) { - HDF_LOGE("uart config read baudrate fail"); - return HDF_FAILURE; - } - if (dri->GetUint32(resourceNode, "wlen", &resource->wlen, 0) != HDF_SUCCESS) { - HDF_LOGE("uart config read wlen fail"); - return HDF_FAILURE; - } - if (dri->GetUint32(resourceNode, "parity", &resource->parity, 0) != HDF_SUCCESS) { - HDF_LOGE("uart config read parity fail"); - return HDF_FAILURE; - } - if (dri->GetUint32(resourceNode, "stopBit", &resource->stopBit, 0) != HDF_SUCCESS) { - HDF_LOGE("uart config read stopBit fail"); - return HDF_FAILURE; - } - if (dri->GetUint32(resourceNode, "uartClk", &resource->uartClk, 0) != HDF_SUCCESS) { - HDF_LOGE("uart config read uartClk fail"); - return HDF_FAILURE; - } - return HDF_SUCCESS; - } - - // 将UART驱动的配置和接口附加到HDF驱动框架 - static int32_t AttachUartDevice(struct UartHost *host, struct HdfDeviceObject *device) - { - int32_t ret; - struct UartDevice *uartDevice = NULL; - if (device->property == NULL) { - HDF_LOGE("%s: property is NULL", __func__); - return HDF_FAILURE; - } - uartDevice = (struct UartDevice *)OsalMemCalloc(sizeof(struct UartDevice)); - if (uartDevice == NULL) { - HDF_LOGE("%s: OsalMemCalloc uartDevice error", __func__); - return HDF_ERR_MALLOC_FAIL; - } - ret = GetUartDeviceResource(uartDevice, device->property); - if (ret != HDF_SUCCESS) { - (void)OsalMemFree(uartDevice); - return HDF_FAILURE; - } - host->num = uartDevice->resource.num; - host->priv = uartDevice; - AddUartDevice(host); - return InitUartDevice(uartDevice); - } - - // 初始化UART驱动 - static int32_t SampleUartDriverInit(struct HdfDeviceObject *device) - { - int32_t ret; - struct UartHost *host = NULL; - - if (device == NULL) { - HDF_LOGE("%s: device is NULL", __func__); - return HDF_ERR_INVALID_OBJECT; - } - HDF_LOGI("Enter %s:", __func__); - host = UartHostFromDevice(device); - if (host == NULL) { - HDF_LOGE("%s: host is NULL", __func__); - return HDF_FAILURE; - } - ret = AttachUartDevice(host, device); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: attach error", __func__); - return HDF_FAILURE; - } - host->method = &g_sampleUartHostMethod; - return ret; - } - - static void DeinitUartDevice(struct UartDevice *device) - { - struct UartRegisterMap *regMap = (struct UartRegisterMap *)device->resource.physBase; - /* wait for uart enter idle. */ - while (UartPl011IsBusy(regMap)); - UartPl011ResetRegisters(regMap); - uart_clk_cfg(0, false); - OsalIoUnmap((void *)device->resource.physBase); - device->state = UART_DEVICE_UNINITIALIZED; - } - - // 解绑并释放UART驱动 - static void DetachUartDevice(struct UartHost *host) - { - struct UartDevice *uartDevice = NULL; - - if (host->priv == NULL) { - HDF_LOGE("%s: invalid parameter", __func__); - return; - } - uartDevice = host->priv; - DeinitUartDevice(uartDevice); - (void)OsalMemFree(uartDevice); - host->priv = NULL; - } - - // 释放UART驱动 - static void SampleUartDriverRelease(struct HdfDeviceObject *device) - { - struct UartHost *host = NULL; - HDF_LOGI("Enter %s:", __func__); - - if (device == NULL) { - HDF_LOGE("%s: device is NULL", __func__); - return; - } - host = UartHostFromDevice(device); - if (host == NULL) { - HDF_LOGE("%s: host is NULL", __func__); - return; - } - if (host->priv != NULL) { - DetachUartDevice(host); - } - UartHostDestroy(host); - } - - struct HdfDriverEntry g_sampleUartDriverEntry = { - .moduleVersion = 1, - .moduleName = "UART_SAMPLE", - .Bind = SampleUartDriverBind, - .Init = SampleUartDriverInit, - .Release = SampleUartDriverRelease, - }; - - HDF_INIT(g_sampleUartDriverEntry); - ``` - -3. 注册UART驱动接口。 - - HDF框架提供了UART驱动接口的模板方法UartHostMethod,实现UART驱动接口的代码如下: - - ``` - static int32_t SampleUartHostInit(struct UartHost *host) - { - HDF_LOGI("%s: Enter", __func__); - if (host == NULL) { - HDF_LOGE("%s: invalid parameter", __func__); - return HDF_ERR_INVALID_PARAM; - } - return HDF_SUCCESS; - } - - static int32_t SampleUartHostDeinit(struct UartHost *host) - { - HDF_LOGI("%s: Enter", __func__); - if (host == NULL) { - HDF_LOGE("%s: invalid parameter", __func__); - return HDF_ERR_INVALID_PARAM; - } - return HDF_SUCCESS; - } - - // 向UART中写入数据 - static int32_t SampleUartHostWrite(struct UartHost *host, uint8_t *data, uint32_t size) - { - HDF_LOGI("%s: Enter", __func__); - uint32_t idx; - struct UartRegisterMap *regMap = NULL; - struct UartDevice *device = NULL; - - if (host == NULL || data == NULL || size == 0) { - HDF_LOGE("%s: invalid parameter", __func__); - return HDF_ERR_INVALID_PARAM; - } - device = (struct UartDevice *)host->priv; - if (device == NULL) { - HDF_LOGE("%s: device is NULL", __func__); - return HDF_ERR_INVALID_PARAM; - } - regMap = (struct UartRegisterMap *)device->resource.physBase; - for (idx = 0; idx < size; idx++) { - UartPl011Write(regMap, data[idx]); - } - return HDF_SUCCESS; - } - - // 设置UART的波特率 - static int32_t SampleUartHostSetBaud(struct UartHost *host, uint32_t baudRate) - { - HDF_LOGI("%s: Enter", __func__); - struct UartDevice *device = NULL; - struct UartRegisterMap *regMap = NULL; - UartPl011Error err; - - if (host == NULL) { - HDF_LOGE("%s: invalid parameter", __func__); - return HDF_ERR_INVALID_PARAM; - } - device = (struct UartDevice *)host->priv; - if (device == NULL) { - HDF_LOGE("%s: device is NULL", __func__); - return HDF_ERR_INVALID_PARAM; - } - regMap = (struct UartRegisterMap *)device->resource.physBase; - if (device->state != UART_DEVICE_INITIALIZED) { - return UART_PL011_ERR_NOT_INIT; - } - if (baudRate == 0) { - return UART_PL011_ERR_INVALID_BAUD; - } - err = UartPl011SetBaudrate(regMap, device->uartClk, baudRate); - if (err == UART_PL011_ERR_NONE) { - device->baudrate = baudRate; - } - return err; - } - - // 获取UART的波特率 - static int32_t SampleUartHostGetBaud(struct UartHost *host, uint32_t *baudRate) - { - HDF_LOGI("%s: Enter", __func__); - struct UartDevice *device = NULL; - - if (host == NULL) { - HDF_LOGE("%s: invalid parameter", __func__); - return HDF_ERR_INVALID_PARAM; - } - device = (struct UartDevice *)host->priv; - if (device == NULL) { - HDF_LOGE("%s: device is NULL", __func__); - return HDF_ERR_INVALID_PARAM; - } - *baudRate = device->baudrate; - return HDF_SUCCESS; - } - - // 在HdfUartSampleInit方法中绑定 - struct UartHostMethod g_sampleUartHostMethod = { - .Init = SampleUartHostInit, - .Deinit = SampleUartHostDeinit, - .Read = NULL, - .Write = SampleUartHostWrite, - .SetBaud = SampleUartHostSetBaud, - .GetBaud = SampleUartHostGetBaud, - .SetAttribute = NULL, - .GetAttribute = NULL, - .SetTransMode = NULL, - }; - ``` - - 在device/hisilicon/drivers/lite.mk编译脚本中增加示例UART驱动模块,代码如下: - - ``` - LITEOS_BASELIB += -lhdf_uart_sample - LIB_SUBDIRS += $(LITEOS_SOURCE_ROOT)/vendor/huawei/hdf/sample/platform/uart - ``` - -4. 用户程序和驱动交互代码。 - - UART驱动成功初始化后,会创建/dev/uartdev-5设备节点,通过设备节点与UART驱动交互的代码如下: - - ``` - #include - #include - #include - #include "hdf_log.h" - - #define HDF_LOG_TAG "hello_uart" - #define INFO_SIZE 16 - - int main(void) - { - int ret; - int fd; - const char info[INFO_SIZE] = {" HELLO UART! "}; - - fd = open("/dev/uartdev-5", O_RDWR); - if (fd < 0) { - HDF_LOGE("hello_uart uartdev-5 open failed %d", fd); - return -1; - } - ret = write(fd, info, INFO_SIZE); - if (ret != 0) { - HDF_LOGE("hello_uart write uartdev-5 ret is %d", ret); - } - ret = close(fd); - if (ret != 0) { - HDF_LOGE("hello_uart uartdev-5 close failed %d", fd); - return -1; - } - return ret; - } - ``` - - 在build/lite/components/drivers.json驱动配置中hdf\_hi3516dv300\_liteos\_a组件下的targets中增加hello\_uart\_sample组件,代码如下: - - ``` - { - "components": [ - { - "component": "hdf_hi3516dv300_liteos_a", - ... - "targets": [ - "//vendor/huawei/hdf/sample/platform/uart:hello_uart_sample" - ] - } - ] - } - ``` - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >如上代码均为示例代码,完整代码可以在vendor/huawei/hdf/sample查看。 - >示例代码默认不参与编译,需要手动添加到编译脚本中。 - - -## 编译和烧录 - -参考《运行Hello OHOS》进行编译和烧录:[编译](/pages/0001000401#section1077671315253)、[烧录](/pages/0001000401#section1347011412201) - -## 镜像运行 - -1. 连接串口。 - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** - >若无法连接串口,请参考[常见问题](/pages/0001000403#section14871149155911)进行排查。 - - **图 1** 连接串口图 - - - ![](/images/zh-cn/device-dev/quick-start/figure/chuankou1.png) - - 1. 单击**Monitor**打开串口。 - 2. 连续输入回车直到串口显示"hisilicon"。 - 3. 单板初次启动或修改启动参数,请进入[步骤2](/pages/0001000401#l5b42e79a33ea4d35982b78a22913b0b1),否则进入[步骤3](/pages/0001000401#ld26f18828aa44c36bfa36be150e60e49)。 - -2. (单板初次启动必选)修改U-boot的bootcmd及bootargs内容:该步骤为固化操作,若不修改参数只需执行一次。每次复位单板均会自动进入系统。 - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** - >U-boot引导程序默认会有2秒的等待时间,用户可使用回车打断等待并显示"hisilicon",通过**reset**命令可再次启动系统。 - - **表 1** U-boot修改命令 - - - - - - - - - - - - - - - - - - - -

执行命令

-

命令解释

-

setenv bootcmd "mmc read 0x0 0x80000000 0x800 0x4800; go 0x80000000";

-

读取FLASH起始地址为0x800(单位为512B,即1MB),大小为0x4800(单位为512B,即9MB)的内容到0x80000000的内存地址,该大小(9MB)与IDE中所填写OHOS_Image.bin文件大小必须相同

-

setenv bootargs "console=ttyAMA0,115200n8 root=emmc fstype=vfat rootaddr=10M rootsize=20M rw";

-

表示设置启动参数,输出模式为串口输出,波特率为115200,数据位8,rootfs挂载于emmc器件,文件系统类型为vfat,

-

“rootaddr=10M rootsize=20M rw”处对应填入rootfs.img的烧写起始位置与长度,此处与IDE中新增rootfs.img文件时所填大小必须相同

-

saveenv

-

表示保存当前配置。

-

reset

-

表示复位单板。

-
- - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** - >**“go 0x80000000”**为可选指令,默认配置已将该指令固化在启动参数中,单板复位后可自动启动。若想切换为手动启动,可在U-boot启动倒数阶段使用"回车"打断自动启动。 - -3. 输入**“reset”**指令并回车,重启单板,启动成功如下图,输入回车串口显示OHOS字样。 - - **图 2** 系统启动图 - - - ![](/images/zh-cn/device-dev/quick-start/figure/qi1.png) - -4. 根目录下,在命令行输入指令“**./bin/hello\_uart**”执行写入的demo程序,显示成功结果如下所示。 - - ``` - OHOS # ./bin/hello_uart - OHOS # HELLO UART! - ``` - - -## 下一步学习 - -恭喜,您已完成Hi3516 快速上手!建议您下一步进入[带屏摄像头产品开发](/pages/extra/b9f1a5/)的学习 。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272Windows\345\274\200\345\217\221\347\216\257\345\242\203.md" "b/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272Windows\345\274\200\345\217\221\347\216\257\345\242\203.md" deleted file mode 100644 index 77f1565b3232500c50812c2c2da45e55b8421ef7..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/02.\346\220\255\345\273\272Windows\345\274\200\345\217\221\347\216\257\345\242\203.md" +++ /dev/null @@ -1,199 +0,0 @@ ---- -title: 搭建Windows开发环境 -permalink: /pages/00010101 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:41 ---- -# 搭建Windows开发环境 - -- [获取软件](#zh-cn_topic_0000001058091994_section1483143015558) -- [安装Visual Studio Code](#zh-cn_topic_0000001058091994_section71401018163318) -- [安装Python](#zh-cn_topic_0000001058091994_section16266553175320) -- [安装Node.js](#zh-cn_topic_0000001058091994_section5353233124511) -- [安装hpm](#zh-cn_topic_0000001058091994_section173054793610) -- [安装DevEco Device Tool插件](#zh-cn_topic_0000001058091994_section4336315185716) - -系统要求:Windows 10 64位系统。 - -DevEco Device Tool以插件方式提供,基于Visual Studio Code进行扩展,安装分为如下几步: - -1. 安装Visual Studio Code -2. 安装Python -3. 安装Node.js -4. 安装hpm -5. 安装DevEco Device Tool插件 - -## 获取软件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

工具名称

-

用途说明

-

版本要求

-

获取渠道

-

Visual Studio Code

-

代码编辑工具

-

V1.53及以上64位版本。

-

https://code.visualstudio.com/Download

-

Python

-

编译构建工具

-

V3.8及以上64位版本

-

https://www.python.org/downloads/

-

Node.js

-

提供npm环境

-

v12.0.0及以上64位版本

-

https://nodejs.org/zh-cn/download/

-

hpm

-

包管理工具

-

最新版

-

请参考安装hpm

-

DevEco Device Tool

-

OpenHarmony源码的编译、烧录、调试插件工具

-

v2.2 Beta2

-

https://device.harmonyos.com/cn/ide#download

-

下载前,请使用华为开发者帐号登录,如未注册,请先注册华为开发者帐号

-
- -## 安装Visual Studio Code - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->如果已安装Visual Studio Code,打开命令行工具,输入**code --version**命令,检查版本号是否为1.53及以上版本;可以正常返回版本号,说明环境变量设置也正确。 - -1. 双击Visual Studio Code软件包进行安装。安装过程中,请勾选“添加到PATH(重启后生效)”。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001057335403.png) - -2. 安装完成后,打开命令行工具,输入**code --version**命令,可以正常显示版本号说明安装成功。 - -## 安装Python - -1. 双击Python安装包进行安装,勾选“**Add Python 3.8 to PATH**”,然后点击**Install Now**开始安装。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001138841358.png) - -2. 等待安装完成后,点击**Close**。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001142794291.png) - -3. 打开命令行工具,输入python --version,检查安装结果。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001130278040.png) - -4. 在命令行工具中,分别执行如下命令设置pip源,用于后续安装DevEco Device Tool过程中下载依赖的组件包。 - - ``` - pip config set global.trusted-host repo.huaweicloud.com - pip config set global.index-url https://repo.huaweicloud.com/repository/pypi/simple - pip config set global.timeout 120 - ``` - - -## 安装Node.js - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->如果已安装Node.js,打开命令行工具,输入**node -v**命令,检查版本号是否为12.0.0及以上版本。 - -1. 点击下载后的软件包进行安装,全部按照默认设置点击**Next**,直至**Finish**。安装过程中,Node.js会自动在系统的path环境变量中配置node.exe的目录路径。 -2. 重新打开命令行工具,输入“node -v“命令,能正常查询Node.js的版本号,说明Node.js安装成功。 - -## 安装hpm - -该方式需先确保**Node.js**安装成功。 - -在安装hpm前,请检查网络连接状态,如果网络不能直接访问Internet,则需要通过代理服务器才可以访问。这种情况下,需要先[设置npm代理](https://device.harmonyos.com/cn/docs/ide/user-guides/npm_proxy-0000001054491032),才能安装hpm。 - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->如果已安装hpm,可以执行**npm update -g @ohos/hpm-cli**命令升级hpm至最新版本。 - -1. 建议将npm源配置为国内镜像,例如设置为华为云镜像源。 - - ``` - npm config set registry https://repo.huaweicloud.com/repository/npm/ - ``` - -2. 打开命令行工具,执行如下命令安装最新版本hpm。 - - ``` - npm install -g @ohos/hpm-cli - ``` - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001073840162.png) - -3. 安装完成后,执行如下命令(V为大写字母)检查hpm安装结果。 - - ``` - hpm -V - ``` - - -## 安装DevEco Device Tool插件 - -安装DevEco Device Tool插件,**主机的用户名不能包含中文字符**,否则可能导致运行出现错误。 - -DevEco Device Tool正常运行需要依赖于C/C++和CodeLLDB插件,在安装完DevEco Device Tool后,会自动从Visual Studio Code的插件市场安装C/C++和CodeLLDB插件。因此,在安装DevEco Device Tool前,请检查Visual Studio Code的网络连接状态,如果网络不能直接访问Internet,则需要通过代理服务器才可以访问,请先[Visual Studio Code代理设置](https://device.harmonyos.com/cn/docs/ide/user-guides/vscode_proxy-0000001074231144)。 - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->安装DevEco Device Tool时,请先关闭Visual Studio Code。 - -1. 解压DevEco Device Tool插件压缩包,双击安装包程序进行安装。 -2. DevEco Device Tool会检测安装依赖的工具包是否符合要求。如果不符合要求,请按照本章节前面的内容进行安装。 - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >如果已经安装Visual Studio Code,但依然检测不到,可重启电脑解决。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001184531449.png) - -3. 点击**Install**进行安装。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001137332702.png) - -4. 等待安装完成后,点击Close关闭安装界面。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001138853234.png) - -5. 启动Visual Studio Code,会自动安装DevEco Device Tool依赖的C/C++、CodeLLDB插件。等待安装完成后,点击Visual Studio Code左侧的![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001072757874.png)按钮,检查INSTALLED中,是否已成功安装C/C++、CodeLLDB和DevEco Device Tool。 - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >如果C/C++和CodeLLDB插件安装不成功,则DevEco Device Tool不能正常运行,解决方法,详细请参考:[离线安装C/C++和CodeLLDB插件](https://device.harmonyos.com/cn/docs/ide/user-guides/offline_plugin_install-0000001074376846)。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001142802505.png) - - diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/05.\351\225\234\345\203\217\347\203\247\345\275\225.md" "b/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/05.\351\225\234\345\203\217\347\203\247\345\275\225.md" deleted file mode 100644 index 78b5051d824b4949927510d1d3d2395191c99d4f..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/05.\351\225\234\345\203\217\347\203\247\345\275\225.md" +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: 镜像烧录 -permalink: /pages/00010104 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:41 ---- -# 镜像烧录 - -- [前提条件](#section63941724112115) -- [使用网口烧录](#section112807166589) - -标准系统烧录,在V2.2 Beta1及以上版本支持。 - -Hi3516DV300支持烧录标准系统,其烧录方式包括USB烧录、网口烧录和串口烧录三种方式,其中: - -- **Windows系统:支持USB烧录、网口烧录和串口烧录** -- **Linux系统:支持串口烧录和网口烧录。** - -同一种烧录方式(如网口烧录),在Windows和Linux环境下的烧录操作完全一致,区别仅在于DevEco Device Tool环境搭建不同。 - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->当前Hi3516DV300开发板支持通过网口、USB、串口三种方式烧录OpenHarmony标准系统。本文以网口方式为例讲解烧录操作,其他两种烧录方式请参照[Hi3516DV300烧录指导](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3516_upload-0000001052148681)。 - -## 前提条件 - -在DevEco Device Tool中[打开一个工程](https://device.harmonyos.com/cn/docs/ide/user-guides/open_project-0000001071680043),该工程文件夹选择待烧录文件所在文件夹即可。其中开发板类型固定选择Hi3516DV300,Framework选择“Hb”。 - -## 使用网口烧录 - -Hi3516DV300开发板使用网口录方式,支持Windows和Linux系统。 - -1. 请连接好电脑和待烧录开发板,需要同时连接串口、网口和电源,具体可参考[Hi3516DV300开发板介绍](https://device.harmonyos.com/cn/docs/start/introduce/oem_minitinier_des_3516-0000001152041033)。 -2. 打开电脑的设备管理器,查看并记录对应的串口号。 - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >如果对应的串口异常,请根据[Hi3516DV300/Hi3518EV300开发板串口驱动安装指导](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3516_hi3518-drivers-0000001050743695)安装USB转串口的驱动程序。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001180513891.png) - -3. 打开DevEco Device Tool,在Projects中,点击**Settings**打开工程配置界面。 - - ![](/images/zh-cn/device-dev/quick-start/figure/2021-01-27_170334-17.png) - -4. 在**Partition Configuration**页签中,按照下表内容填写烧录文件信息,包括: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Binary

-

Memory

-

System

-

Address

-

Length

-

Board

-

Type

-

fastboot

-

选择“u-boot-hi3516dv300_emmc.bin”

-

emmc

-

none

-

0x000000

-

0x100000

-

固定选择“hi3516dv300”

-

NA

-

boot

-

选择“uImage”

-

emmc

-

none

-

0x100000

-

0xf00000

-

NA

-

updater

-

选择“updater.img”

-

emmc

-

ext3/4

-

0x1000000

-

0x1400000

-

NA

-

misc

-

空白,不用选择

-

emmc

-

none

-

0x2400000

-

0x100000

-

NA

-

system

-

选择“system.img”

-

emmc

-

ext3/4

-

0x2500000

-

0xceb00000

-

NA

-

vendor

-

选择“vendor.img”

-

emmc

-

ext3/4

-

0xd1000000

-

0x10000000

-

NA

-

userdata

-

选择“userdata.img”

-

emmc

-

ext3/4

-

0xe1000000

-

0x5b800000

-

NA

-
- - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001180633813.png) - -5. 在“hi3516dv300”页签,设置烧录选项,包括upload\_port、upload\_partitions和upload\_protocol。 - - - upload\_port:选择步骤[2](#zh-cn_topic_0000001180633781_li1050616379507)中查询的串口号。 - - upload\_protocol:选择烧录协议,固定选择“hiburn-net”。 - - upload\_partitions:选择待烧录的文件,包括fastboot、boot、updater、misc、system、vendor和userdata。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001134474510.png) - -6. 检查和设置连接开发板后的网络适配器的IP地址信息,设置方法请参考[设置Hi3516DV300网口烧录的IP地址信息](https://device.harmonyos.com/cn/docs/ide/user-guides/set_ipaddress-0000001141825075)。 -7. 设置网口烧录的IP地址信息,设置如下选项: - - - upload\_net\_server\_ip:选择步骤6中设置的IP地址信息。例如192.168.1.2 - - upload\_net\_client\_mask:设置开发板的子网掩码,工具会自动根据选择的upload\_net\_server\_ip进行设置。例如255.255.255.0 - - upload\_net\_client\_gw:设置开发板的网关,工具会自动根据选择的upload\_net\_server\_ip进行设置。例如192.168.1.1 - - upload\_net\_client\_ip:设置开发板的IP地址,工具会自动根据选择的upload\_net\_server\_ip进行设置。例如192.168.1.3 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001180633847.png) - -8. 所有的配置都修改完成后,在工程配置页签的顶部,点击**Save**进行保存。 -9. 启动烧录后,显示如下提示信息时,请重启开发板(下电再上电)。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001134634288.png) - -10. 重新上电后,启动烧录,界面提示如下信息时,表示烧录成功。 - - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001180513893.png) - - diff --git "a/website/docs/01.\346\226\207\346\241\243/06.\350\256\276\345\244\207\345\274\200\345\217\221-\351\232\220\347\247\201\345\222\214\345\256\211\345\205\250/01.\351\232\220\347\247\201\344\277\235\346\212\244.md" "b/website/docs/01.\346\226\207\346\241\243/03.\345\205\274\345\256\271\346\200\247\344\270\216\345\256\211\345\205\250/01.\351\232\220\347\247\201\344\270\216\345\256\211\345\205\250\350\247\204\350\214\203/01.\351\232\220\347\247\201\344\277\235\346\212\244.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/06.\350\256\276\345\244\207\345\274\200\345\217\221-\351\232\220\347\247\201\345\222\214\345\256\211\345\205\250/01.\351\232\220\347\247\201\344\277\235\346\212\244.md" rename to "website/docs/01.\346\226\207\346\241\243/03.\345\205\274\345\256\271\346\200\247\344\270\216\345\256\211\345\205\250/01.\351\232\220\347\247\201\344\270\216\345\256\211\345\205\250\350\247\204\350\214\203/01.\351\232\220\347\247\201\344\277\235\346\212\244.md" index 45b3c4e8f577ef965deb9f32a40d1cf364b9e3fc..5de6ba1194c9deee3854f2e868f42cc85d8d1362 100644 --- "a/website/docs/01.\346\226\207\346\241\243/06.\350\256\276\345\244\207\345\274\200\345\217\221-\351\232\220\347\247\201\345\222\214\345\256\211\345\205\250/01.\351\232\220\347\247\201\344\277\235\346\212\244.md" +++ "b/website/docs/01.\346\226\207\346\241\243/03.\345\205\274\345\256\271\346\200\247\344\270\216\345\256\211\345\205\250/01.\351\232\220\347\247\201\344\270\216\345\256\211\345\205\250\350\247\204\350\214\203/01.\351\232\220\347\247\201\344\277\235\346\212\244.md" @@ -1,6 +1,6 @@ --- title: 隐私保护 -permalink: /pages/000500 +permalink: /pages/00020000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:29 --- # 隐私保护 @@ -154,26 +154,26 @@ date: 2021-12-30 12:57:44 **图 1** 隐私通知/声明示例图 - ![](/images/zh-cn/device-dev/security/figure/2-应用启动预授权.png) ![](/images/zh-cn/device-dev/security/figure/3-应用隐私声明.png) + ![](/images/device-dev/security/figure/2-应用启动预授权.png) ![](/images/device-dev/security/figure/3-应用隐私声明.png) - 个人数据应当基于具体、明确、合法的目的收集,不应与此目的不相符的方式作进一步处理。对于收集目的变更和用户撤销同意后再次重新使用的场景都需要用户重新同意。隐私声明变更和撤销的示例如下图: **图 2** 隐私通知/声明变更示例图 - ![](/images/zh-cn/device-dev/security/figure/4-隐私声明变更通知.png) + ![](/images/device-dev/security/figure/4-隐私声明变更通知.png) **图 3** 撤销同意示例图 - ![](/images/zh-cn/device-dev/security/figure/6-1-隐私声明撤销.png) ![](/images/zh-cn/device-dev/security/figure/6-2-隐私声明撤销.png) + ![](/images/device-dev/security/figure/6-1-隐私声明撤销.png) ![](/images/device-dev/security/figure/6-2-隐私声明撤销.png) - 需要提供用户查看隐私声明的入口。例如,可以在应用的“关于”界面提供查看隐私声明的入口,如示例图所示: **图 4** 隐私声明查看界面示例图 - ![](/images/zh-cn/device-dev/security/figure/5-应用隐私声明入口.png) + ![](/images/device-dev/security/figure/5-应用隐私声明入口.png) **数据收集及使用最小化** @@ -197,7 +197,7 @@ date: 2021-12-30 12:57:44 **图 5** 敏感权限提示框示例图 - ![](/images/zh-cn/device-dev/security/figure/1-敏感权限弹窗.png) + ![](/images/device-dev/security/figure/1-敏感权限弹窗.png) - 用户可以修改、取消授予的权限:当用户不同意某一权限或者数据收集时,应当允许用户使用与这部分权限和数据收集不相关的功能。如智慧屏产品上通信社交应用,用户可以拒绝授予相机权限,不应该影响与相机无关的功能操作,如语音通话。 - 用户在产品使用过程中,针对录入个人数据的场景,需要给用户提供对个人数据的增加、删除、修改、查看的操作。 @@ -208,9 +208,9 @@ date: 2021-12-30 12:57:44 从技术上保证数据处理活动的安全性,包括个人数据的加密存储、安全传输等安全机制,系统应默认开启或采取安全保护措施。 -- 对于个人数据的访问需要有保护机制,主要包括身份认证和访问控制。身份认证(如用户名、密码)限定只有经过认证的用户才能访问数据,可应用于多用户场景;访问控制(如[权限控制](/pages/000501#li201725506375))可应用于对应用程序的限制。 +- 对于个人数据的访问需要有保护机制,主要包括身份认证和访问控制。身份认证(如用户名、密码)限定只有经过认证的用户才能访问数据,可应用于多用户场景;访问控制(如[权限控制](/pages/00020001#li201725506375))可应用于对应用程序的限制。 - 分布式设备个人数据安全存储要满足密钥管理和存储服务(HUKS:Huawei Universal Keystore)的要求,包括:密钥安全存储、数据安全存储。 -- 个人数据在分布式设备间传输要满足设备间的信任绑定关系和数据传输通道的安全性要求。详细信息可以参考[设备互联安全](/pages/000501#section26153183616)。 +- 个人数据在分布式设备间传输要满足设备间的信任绑定关系和数据传输通道的安全性要求。详细信息可以参考[设备互联安全](/pages/00020001#section26153183616)。 - 认证凭证数据(密码、口令、指纹等)须加密存储。 **本地化处理** diff --git "a/website/docs/01.\346\226\207\346\241\243/06.\350\256\276\345\244\207\345\274\200\345\217\221-\351\232\220\347\247\201\345\222\214\345\256\211\345\205\250/02.\345\256\211\345\205\250\346\214\207\345\215\227.md" "b/website/docs/01.\346\226\207\346\241\243/03.\345\205\274\345\256\271\346\200\247\344\270\216\345\256\211\345\205\250/01.\351\232\220\347\247\201\344\270\216\345\256\211\345\205\250\350\247\204\350\214\203/02.\345\256\211\345\205\250\346\214\207\345\215\227.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/06.\350\256\276\345\244\207\345\274\200\345\217\221-\351\232\220\347\247\201\345\222\214\345\256\211\345\205\250/02.\345\256\211\345\205\250\346\214\207\345\215\227.md" rename to "website/docs/01.\346\226\207\346\241\243/03.\345\205\274\345\256\271\346\200\247\344\270\216\345\256\211\345\205\250/01.\351\232\220\347\247\201\344\270\216\345\256\211\345\205\250\350\247\204\350\214\203/02.\345\256\211\345\205\250\346\214\207\345\215\227.md" index 21fa928a75cf05afa450c9f8874c4f750fa2469c..4b0a82e7f4e7830c47a1415aef4fdd797e88d4a3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/06.\350\256\276\345\244\207\345\274\200\345\217\221-\351\232\220\347\247\201\345\222\214\345\256\211\345\205\250/02.\345\256\211\345\205\250\346\214\207\345\215\227.md" +++ "b/website/docs/01.\346\226\207\346\241\243/03.\345\205\274\345\256\271\346\200\247\344\270\216\345\256\211\345\205\250/01.\351\232\220\347\247\201\344\270\216\345\256\211\345\205\250\350\247\204\350\214\203/02.\345\256\211\345\205\250\346\214\207\345\215\227.md" @@ -1,6 +1,6 @@ --- title: 安全指南 -permalink: /pages/000501 +permalink: /pages/00020001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:29 --- # 安全指南 @@ -39,7 +39,7 @@ OpenHarmony操作系统是一个开放的系统,开发者可以通过OpenHarmo 在这个执行环境中,芯片的安全能力、系统的安全能力、以及上层的安全服务一起协作,从硬件安全、系统安全、数据安全、设备互联安全、应用安全、安全更新多个维度提供安全保障。 **图 1** 安全保障示意图 -![](/images/zh-cn/device-dev/security/figure/安全保障示意图.png "安全保障示意图") +![](/images/device-dev/security/figure/安全保障示意图.png "安全保障示意图") ## 硬件安全 @@ -102,7 +102,7 @@ OpenHarmony操作系统是一个开放的系统,开发者可以通过OpenHarmo 下图描述了DAC在文件访问时的鉴权过程,首先匹配进程uid和文件uid属性,其次匹配进程gid和文件gid属性,最后都匹配失败的情况,判断文件other属性是否支持进程的读、写、执行操作。同时支持忽略DAC检测机制(读、写、执行)作为一组系统特权(Capability),支持高权限(如系统服务)对低权限(三方APP)的文件管理。 **图 2** DAC流程图 - ![](/images/zh-cn/device-dev/security/figure/DAC流程图.png "DAC流程图") + ![](/images/device-dev/security/figure/DAC流程图.png "DAC流程图") - Capability机制 @@ -127,7 +127,7 @@ OpenHarmony操作系统是一个开放的系统,开发者可以通过OpenHarmo HUKS(Huawei Universal Keystore Service),提供了密钥管理、证书管理服务,当前在OpenHarmony上主要提供密钥管理服务,用于支撑HiChain\(设备身份认证平台\)的基础设备认证。如下是HUKS的功能结构图: **图 3** HUKS功能结构图 -![](/images/zh-cn/device-dev/security/figure/HUKS功能结构图.png "HUKS功能结构图") +![](/images/device-dev/security/figure/HUKS功能结构图.png "HUKS功能结构图") 支持算法包括: @@ -152,7 +152,7 @@ HUKS在使用中有如下约束: 为了实现用户数据在设备互联场景下在各个设备之间的安全流转,需要保证设备之间相互正确可信,即设备和设备之间建立信任关系,并能够在验证信任关系后,搭建安全的连接通道,实现用户数据的安全传输。设备之间的信任关系在本文档中涉及IoT主控设备和IoT设备之间建立的可信关系。设备间可信关系建立的流程如下图所示: **图 4** 设备间建立可信关系流程图 -![](/images/zh-cn/device-dev/security/figure/设备间建立可信关系流程图.png "设备间建立可信关系流程图") +![](/images/device-dev/security/figure/设备间建立可信关系流程图.png "设备间建立可信关系流程图") - **IoT设备互联安全** diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\345\237\272\346\234\254\346\246\202\345\277\265.md" deleted file mode 100644 index ee9f324787a26d5fa063b6e9e028774a7e3831db..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: 基本概念 -permalink: /pages/0002000202 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:42 ---- -# 基本概念 - -- [运行机制](#section139861939219) - - [符号表导出](#section15414650102716) - - [ELF文件加载](#section5221181562810) - - [ELF文件链接](#section68441639182817) - -- [ELF支持规格](#section187315541916) - - [ELF支持类型](#section1701552268) - - [ELF共享库编译链接选项](#section17292133274) - - -在硬件资源有限的小设备中,需要通过算法的动态部署能力来解决无法同时部署多种算法的问题。以开发者易用为主要考虑因素,同时考虑到多平台的通用性,LiteOS-M选择业界标准的ELF方案,方便拓展算法生态。LiteOS-M提供类似于dlopen、dlsym等接口,APP通过动态加载模块提供的接口可以加载、卸载相应算法库。如图1所示,APP需要通过三方算法库所需接口获取对应信息输出,三方算法库又依赖内核提供的基本接口,如malloc等。APP加载所需接口,并对相关的未定义符号完成重定位后,APP即可调用该接口完成功能调用。目前动态加载组件只支持arm架构。 - -**图 1** LiteOS-M内核动态加载架构图 -![](/images/zh-cn/device-dev/kernel/figure/LiteOS-M内核动态加载架构图.png "LiteOS-M内核动态加载架构图") - -## 运行机制 - -### 符号表导出 - -共享库调用内核接口需要内核主动暴露动态库所需的接口,如图2所示,该机制将符号信息编译到指定段中,调用SYM\_EXPORT宏即可完成对指定符号的信息导出。符号信息通过结构体SymInfo描述,成员包括符号名和符号地址信息,宏SYM\_EXPORT通过\_\_attribute\_\_编译属性将符号信息导入.sym.\*段中。 - -``` -typedef struct { - CHAR *name; - UINTPTR addr; -} SymInfo; - -#define SYM_EXPORT(func) \ -const SymInfo sym_##func __attribute__((section(".sym."#func))) = { \ - .name = #func, \ - .addr = (UINTPTR)func \ -}; -``` - -**图 2** 导出的符号表信息 -![](/images/zh-cn/device-dev/kernel/figure/导出的符号表信息.png "导出的符号表信息") - -### ELF文件加载 - -加载过程中,根据ELF文件的句柄以及程序头表的段偏移可以得到需要加载到内存的LOAD段,一般有两个段,只读段及读写段,如下所示,可以用readelf -l查看ELF文件的LOAD段信息。如图3所示,根据相应的对齐属性申请物理内存,通过每个段的加载基址及偏移将代码段或数据段写入内存中。 - -``` -$ readelf -l lib.so - -Elf file type is DYN (Shared object file) -Entry point 0x5b4 -There are 4 program headers, starting at offset 52 - -Program Headers: - Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align - EXIDX 0x000760 0x00000760 0x00000760 0x00008 0x00008 R 0x4 - LOAD 0x000000 0x00000000 0x00000000 0x0076c 0x0076c R E 0x10000 - LOAD 0x00076c 0x0001076c 0x0001076c 0x0010c 0x00128 RW 0x10000 - DYNAMIC 0x000774 0x00010774 0x00010774 0x000c8 0x000c8 RW 0x4 - - Section to Segment mapping: - Segment Sections... - 00 .ARM.exidx - 01 .hash .dynsym .dynstr .rel.dyn .rel.plt .init .plt .text .fini .ARM.exidx .eh_frame - 02 .init_array .fini_array .dynamic .got .data .bss - 03 .dynamic -``` - -**图 3** ELF文件的加载过程 -![](/images/zh-cn/device-dev/kernel/figure/ELF文件的加载过程.png "ELF文件的加载过程") - -### ELF文件链接 - -如图4所示,通过ELF文件的.dynamic段获取重定位表,遍历表中每一个需要重定位的条目,再根据需要重定位的符号名在共享库和内核提供的导出符号表中查找相应符号并更新相应的重定位信息。 - -**图 4** ELF文件的链接过程 -![](/images/zh-cn/device-dev/kernel/figure/ELF文件的链接过程.png "ELF文件的链接过程") - -## ELF支持规格 - -### ELF支持类型 - -编译共享库时,添加-fPIC可以编译出位置无关代码(-fPIC为编译选项),此时共享库文件类型为ET\_DYN,其可以加载至任意有效的地址区间。 - -例:arm-none-eabi-gcc -fPIC –shared –o lib.so lib.c - -### ELF共享库编译链接选项 - -1. “-nostdlib”编译链接选项:不依赖编译器中lib库。 -2. “-nostartfiles”编译链接选项:不依赖编译器中启动相关的文件。 -3. “-fPIC”编译选项:可编译位置无关的共享库。 -4. “-z max-page-size=4”链接选项:二进制文件中可加载段的对齐字节数为4,可节约内存,可用于动态库。 -5. “-mcpu=”需要指定对应的cpu架构。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/04.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/04.\345\274\200\345\217\221\346\214\207\345\257\274.md" deleted file mode 100644 index ed08639d8f680139b97d75e3835a4bef20846efd..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/04.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ /dev/null @@ -1,200 +0,0 @@ ---- -title: 开发指导 -permalink: /pages/0002000203 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:42 ---- -# 开发指导 - -- [接口说明](#section158501652121514) -- [开发流程](#section5241132917523) -- [编程实例](#section8708112313531) - -## 接口说明 - -**表 1** 功能列表 - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

动态加载功能接口

-

LOS_DynlinkInit

-

初始化动态链接器链表以及互斥锁

-

LOS_SoLoad

-

加载指定路径的共享库

-

LOS_FindSym

-

根据共享库句柄查找指定符号

-

LOS_SoUnload

-

卸载共享库句柄

-
- -## 开发流程 - -1. 利用arm-none-eabi-gcc交叉编译器编译共享库并制作FAT或LittleFS文件系统格式镜像烧写至flash中; -2. 在target\_config.h文件中定义宏LOSCFG\_DYNLINK为1使能动态加载模块; -3. 调用LOS\_SoLoad接口加载指定路径下的共享库; -4. 调用LOS\_FindSym接口查找指定符号,获取符号地址; -5. 调用LOS\_SoUnload卸载指定共享库句柄。 - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->1. 利用交叉编译器编译共享库所需要的编译选项参考ELF支持规格一节。 ->2. 制作文件系统镜像之前需要对特定单板适配FAT或LittleFS文件系统。 ->3. 共享库不依赖编译器中的libc库,不支持c++。 ->4. 共享库只能依赖内核提供的接口,不能依赖其他共享库。 - -## 编程实例 - -实例以cortex-m4单板为例。 - -1. 共享库示例代码及编译 - - 示例代码主要测试全局符号间的调用功能以及对内核接口maloc、free、memset接口的调用功能。 - - ``` - #include - #include - - int g_param = 10; - - int callee(int a, int b) - { - char *addr = malloc(g_param); - if (addr == NULL) { - return 0; - } - - memset(addr, '1', g_param); - - free(addr); - return a + b + g_param; - } - - int caller(int a, int b) - { - return callee(a, b); - } - ``` - - ``` - $ arm-none-eabi-gcc -fPIC -shared -mcpu=cortex-m4 -nostdlib -nostartfiles -z max-page-size=4 -o test.so test.c - ``` - -2. 导出共享库中使用到的malloc、free、memset符号,下述代码单独编写成一个.c文件,参与OS编译即可。 - - ``` - #include "stdlib.h" - #include "string.h" - - SYM_EXPORT(malloc); - SYM_EXPORT(free); - SYM_EXPORT(memset); - ``` - -3. 确定内核的编译环境,在对应编译器的编译链接脚本中添加如下语句,保证符号表信息在编译链接的时候输出到指定的段。 - - 在IAR编译器.icf链接脚本中添加如下语句: - - ``` - keep {section .TABLE.START}; - keep {section .sym.*}; - keep {section .table.end}; - define block SYMBOL_TABLE with fixed order - { - section .TABLE.START, - section .sym.*, - section .table.end - }; - place in ROM_region {readonly, block SYMBOL_TABLE}; - ``` - - 在gcc编译器的.ld链接脚本中添加如下语句: - - ``` - __sym_table_start = .; - KEEP(*( SORT (.sym.*))); - __sym_table_end = .; - ``` - -4. 共享库加载链接、执行与卸载 - - 示例代码主要测试LOS\_SoLoad、LOS\_FindSym、LOS\_SoUnload接口的功能是否正常以及通过LOS\_FindSym查找到的符号的调用是否正常。 - - ``` - #include "los_dynlink.h" - - VOID DynlinkTest(VOID) - { - VOID *handle = NULL; - INT32 (*func)(INT32, INT32) = NULL; - CHAR *symbolName = "caller"; - CHAR *dsoName = "/lib/test.so"; - INT32 ret; - - handle = (VOID *)LOS_SoLoad(dsoName, NULL); - if (handle == NULL) { - printf("Failed to load so\n"); - return; - } - - func = (INT32 (*)(INT32, INT32))LOS_FindSym(handle, symbolName); - if (func == NULL) { - printf("Failed to find symbol\n"); - LOS_SoUnload(handle); - return; - } - - ret = func(1, 1); - if (ret != 12) { - printf("Failed to execute function\n"); - LOS_SoUnload(handle); - return; - } - - ret = LOS_SoUnload(handle); - if (ret != 0) { - printf("Failed to unload so\n"); - } - - - printf("Success!\n"); - } - ``` - -5. 结果验证 - - ``` - Success! - ``` - - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->用例中文件系统路径为/lib/test.so; ->可以创建一个任务,在任务中调用DynlinkTest接口进行测试; - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/05.Trace\350\260\203\346\265\213.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/05.Trace\350\260\203\346\265\213.md" deleted file mode 100644 index 736ef655a14f4250dfad8460c2c61d460718d67a..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/05.Trace\350\260\203\346\265\213.md" +++ /dev/null @@ -1,209 +0,0 @@ ---- -title: Trace调测 -permalink: /pages/0002000304 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:42 ---- -# Trace调测 - -- [基本概念](#section44851752123712) -- [运行机制](#section5282148123813) -- [接口说明](#section16304193215387) -- [开发指导](#section498695853819) - - [开发流程](#section1875652316393) - - [编程实例](#section0403134913395) - - [示例代码](#section1492711418400) - - [结果验证](#section869613984012) - - -## 基本概念 - -Trace调测旨在帮助开发者获取内核的运行流程,各个模块、任务的执行顺序,从而可以辅助开发者定位一些时序问题或者了解内核的代码运行过程。 - -## 运行机制 - -内核提供一套Hook框架,将Hook点预埋在各个模块的主要流程中,开发者通过注册的形式在自己所需的Hook点上注册回调函数,当内核运行至对应流程中会由内核主动调用Hook函数,将当前流程的关键数据传递给开发者。 - -## 接口说明 - -OpenHarmony LiteOS-M内核的Trace模块提供下面几种功能,接口详细信息可以查看API参考。 - -**表 1** Trace模块接口说明 - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

Hook注册接口

-

LOS_HookReg

-

向指定Hook点注册回调函数

-

Hook解注册接口

-

LOS_HookUnReg

-

解注册当前Hook点的回调函数

-
- -## 开发指导 - -### 开发流程 - -开启Trace调测的典型流程如下: - -1. 配置Trace模块相关宏。 - - 需要在target\_config.h头文件中修改配置: - - - - - - - - - - - - -

配置项

-

含义

-

设置值

-

LOSCFG_DEBUG_HOOK

-

Trace功能的开关

-

0:关闭;1:打开

-
- -2. 选择想要注册的Hook点,实现对应的回调函数,Hook类型清单见liteos\_m/utils/internal/los\_hook\_types.h。 -3. 调用LOS\_HookReg进行函数注册。 - -### 编程实例 - -本实例实现功能:模拟运行时malloc、free不同大小的内存,记录每次malloc,free的行为及时序。 - -### 示例代码 - -示例代码如下: - -``` -#include "stdio.h" -#include "stdlib.h" -#include "string.h" -#include "los_hook.h" - -#define SIZE_512 512 -#define SIZE_1K 1024 -#define SIZE_2K 2048 - -/* 回调时打印malloc出来的大小 */ -void MallocRecord(void *pool, unsigned int size) -{ - printf("malloc size = %u\n", size); - return; -} - -/* 回调时打印free的指针地址 */ -void FreeRecord(void *pool, void *ptr) -{ - printf("free pool = 0x%x ptr = 0x%x\n", pool, ptr); - return; -} - -void TestTrace(void) -{ - char *pool1 = NULL; - char *pool2 = NULL; - char *pool3 = NULL; - char *retptr = NULL; - /* 分别为pool1,pool2,pool3分配不同大小的内存,用于区分验证 */ - pool1 = (char *)malloc(SIZE_512); - if (pool1 == NULL) { - printf("pool1 malloc failed!\n"); - return; - } - retptr = memset(pool1, 'a', SIZE_512); - if (retptr == NULL) { - printf("pool1 memset failed!\n"); - return; - } - printf("pool1 addr = 0x%x *pool1[0] = %c\n", pool1, *pool1); - - pool2 = (char *)malloc(SIZE_1K); - if (pool2 == NULL) { - printf("pool2 malloc failed!\n"); - return; - } - retptr = memset(pool2, 'b', SIZE_1K); - if (retptr == NULL) { - printf("pool2 memset failed!\n"); - return; - } - printf("pool2 addr = 0x%x *pool2[0] = %c\n", pool2, *pool2); - - pool3 = (char *)malloc(SIZE_2K); - if (pool3 == NULL) { - printf("pool3 malloc failed!\n"); - return; - } - retptr = memset(pool3, 'c', SIZE_2K); - if (retptr == NULL) { - printf("pool3 memset failed!\n"); - return; - } - printf("pool3 addr = 0x%x *pool3[0] = %c\n", pool3, *pool3); - - /* 按pool3, pool1, pool2的顺序释放,来检验回调函数的时序 */ - free(pool3); - free(pool1); - free(pool2); - - return; -} -/* 在使用Trace模块功能之前,首先进行回调函数的注册,注意回调函数的返回值都为void */ -void InitTest(void) -{ - printf("init hook\n"); - /* 根据想要获取的Trace信息选择对应的Hook类型进行注册,具体可选Hook类型清单见liteos_m/utils/internal/los_hook_types.h */ - LOS_HookReg(LOS_HOOK_TYPE_MEM_ALLOC, MallocRecord); - LOS_HookReg(LOS_HOOK_TYPE_MEM_FREE, FreeRecord); - return; -} -``` - -### 结果验证 - -输出结果如下: - -``` -init hook -malloc size = 512 -pool1 addr = 0x20002f44 *pool1[0] = a -malloc size = 1024 -pool2 addr = 0x2000314c *pool2[0] = b -malloc size = 2048 -pool3 addr = 0x20003554 *pool3[0] = c -free pool = 0x200002a4 ptr = 0x20003554 -free pool = 0x200002a4 ptr = 0x20002f44 -free pool = 0x200002a4 ptr = 0x2000314c -``` - -根据地址信息,可以看到free的顺序为pool3,pool1,pool2。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/02.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204-\345\217\214\345\220\221\351\223\276\350\241\250.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/02.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204-\345\217\214\345\220\221\351\223\276\350\241\250.md" deleted file mode 100644 index 32e77c7c5d71d245fc0153306e0494f4dbf08592..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/02.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204-\345\217\214\345\220\221\351\223\276\350\241\250.md" +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: 基本数据结构-双向链表 -permalink: /pages/0002000401 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:42 ---- -# 基本数据结构 - -- **[双向链表](/pages/extra/37d8dd/)** - - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/06.help.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/06.help.md" deleted file mode 100644 index 44da0b9222cfe0ebb076f4da62b51d9a49dbad56..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/06.help.md" +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: help -permalink: /pages/0002010400030005 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:42 ---- -# help - -- [命令功能](#section991211345413) -- [命令格式](#section19103204016410) -- [参数说明](#section1533416233432) -- [使用指南](#section4156445417) -- [使用实例](#section12776124712417) -- [输出说明](#section092662412544) - -## 命令功能 - -help命令用于显示当前操作系统内所有操作指令。 - -## 命令格式 - -help - -## 参数说明 - -无。 - -## 使用指南 - -help用于显示当前操作系统内所有操作指令。 - -## 使用实例 - -举例:输入help - -## 输出说明 - -查看系统内所有操作指令。 - -``` -OHOS # help -*******************shell commands:************************* - -arp cat cd chgrp chmod chown cp cpup -date dhclient dmesg dns format free help hwi -ifconfig ipdebug kill log ls lsfd memcheck mkdir -mount netstat oom partinfo partition ping ping6 pwd -reset rm rmdir sem statfs su swtmr sync -systeminfo task telnet tftp touch umount uname watch -writeproc -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/07.hwi.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/07.hwi.md" deleted file mode 100644 index 9f0833835a5786ad61dcef01385601d00cf0604a..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/07.hwi.md" +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: hwi -permalink: /pages/0002010400030006 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:42 ---- -# hwi - -- [命令功能](#section445335110416) -- [命令格式](#section1795712553416) -- [参数说明](#section92544592410) -- [使用指南](#section104151141252) -- [使用实例](#section11545171957) -- [输出说明](#section075617368542) - -## 命令功能 - -hwi命令查询当前中断信息 - -## 命令格式 - -hwi - -## 参数说明 - -无。 - -## 使用指南 - -- 输入hwi即显示当前中断号、中断次数及注册中断名称。 -- 若开关LOSCFG\_CPUP\_INCLUDE\_IRQ打开,则还会显示各个中断的处理时间(cycles)、CPU占用率以及中断类型。 - -## 使用实例 - -举例:输入hwi - -## 输出说明 - -1. 显示中断信息(LOSCFG\_CPUP\_INCLUDE\_IRQ关闭) - - ![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179967527.png) - -2. 显示中断信息(LOSCFG\_CPUP\_INCLUDE\_IRQ打开) - - ![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001133848164.png) - - **表 1** 输出说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

输出

-

说明

-

InterruptNo

-

中断号。

-

Count

-

中断次数。

-

Name

-

注册中断名称。

-

CYCLECOST

-

中断的处理时间(cycles)。

-

CPUUSE

-

CPU占用率。

-

CPUUSE10s

-

最近10s CPU占用率。

-

CPUUSE1s

-

最近1s CPU占用率。

-

mode

-

中断类型:

-
  • normal: 非共享中断。
  • shared: 共享中断。
-
- - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/08.kill.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/08.kill.md" deleted file mode 100644 index fbf111f87077c6b4b2a35130a106ce28231b663c..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/08.kill.md" +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: kill -permalink: /pages/0002010400030007 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:42 ---- -# kill - -- [命令功能](#section366714216619) -- [命令格式](#section8833164614615) -- [参数说明](#section12809111019453) -- [使用指南](#section15935131220717) -- [使用实例](#section79281818476) -- [输出说明](#section12742311179) - -## 命令功能 - -命令用于发送特定信号给指定进程。 - -## 命令格式 - -kill \[_signo_ | _-signo_\] \[_pid_\] - -## 参数说明 - -**表 1** 参数说明 - - - - - - - - - - - - - - - - -

参数

-

参数说明

-

取值范围

-

signo

-

信号ID。

-

[1,30]

-

pid

-

进程ID。

-

[1,MAX_INT]

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** ->signo有效范围为\[0,64\],建议取值范围为\[1,30\],其余为保留内容。 - -## 使用指南 - -必须指定发送的信号编号及进程号。 - -进程编号取值范围根据系统配置变化,例如系统最大支持pid为256,则取值范围缩小为\[1-256\]。 - -## 使用实例 - -1. 查看当前进程列表,查看需要杀死的进程PID(7)。 - -**图 1** 查看进程PID -![](/images/zh-cn/device-dev/kernel/figure/查看进程PID.png "查看进程PID") - -2. 发送信号14(SIGALRM默认行为为进程终止)给7号进程**helloworld\_d**(用户态进程):**kill 14 7**(kill -14 7效果相同),并查看当前进程列表,7号进程已终止。 - -**图 2** 信号发送结果图 -![](/images/zh-cn/device-dev/kernel/figure/信号发送结果图.png "信号发送结果图") - -## 输出说明 - -发送成功或失败输出结果如下。 - -**图 3** 发送信号给指定进程 -![](/images/zh-cn/device-dev/kernel/figure/发送信号给指定进程.png "发送信号给指定进程") - -信号发送会显示发送记录,未报错表示信号发送成功。 - -**图 4** 信号发送失败 -![](/images/zh-cn/device-dev/kernel/figure/信号发送失败.png "信号发送失败") - -信号发送失败,上图所示原因为信号发送命令参数无效,请排查信号编号及进程编号是否无效。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/20.uname.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/20.uname.md" deleted file mode 100644 index ae33c3561885f553faac98bacefc8d31d6d26bad..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/20.uname.md" +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: uname -permalink: /pages/0002010400030013 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# uname - -- [命令功能](#section107697383115) -- [命令格式](#section162824341116) -- [使用指南](#section2652124861114) -- [使用实例](#section0107995132) -- [输出说明](#section1215113245511) - -## 命令功能 - -uname命令用于显示当前操作系统的名称,版本创建时间,系统名称,版本信息等。 - -## 命令格式 - -uname \[_-a | -s | -t | -v | --help_\] - -**表 1** 参数说明 - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数说明

-

无参数

-

默认显示操作系统名称。

-

-a

-

显示全部信息。

-

-t

-

显示版本创建的时间。

-

-s

-

显示操作系统名称。

-

-v

-

显示版本信息。

-

--help

-

显示uname指令格式提示。

-
- -## 使用指南 - -uname用于显示当前操作系统名称。语法uname -a | -t| -s| -v 描述uname 命令将正在使用的操作系统名写到标准输出中,这几个参数不能混合使用。 - -## 使用实例 - -举例:输入uname -a - -## 输出说明 - -查看系统信息 - -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179967909.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/08.ls.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/08.ls.md" deleted file mode 100644 index c8a0a255e7d9f8294f0d18a1553fc690571f582a..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/08.ls.md" +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: ls -permalink: /pages/0002010400030107 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# ls - -- [命令功能](#section6538163771614) -- [命令格式](#section45881743111616) -- [参数说明](#section17528148171617) -- [使用指南](#section041212533166) -- [使用实例](#section986105716167) -- [输出说明](#section2036124918592) - -## 命令功能 - -ls命令用来显示当前目录的内容。 - -## 命令格式 - -ls \[_path_\] - -## 参数说明 - -**表 1** 参数说明 - - - - - - - - - - - - -

参数

-

参数说明

-

取值范围

-

path

-

path为空时,显示当前目录的内容。

-

path为无效文件名时,显示失败,提示:

-

ls error: No such directory。

-

path为有效目录路径时,会显示对应目录下的内容。

-

1.为空。

-

2.有效的目录路径。

-
- -## 使用指南 - -- ls命令显示当前目录的内容。 -- ls可以显示文件的大小。 -- proc下ls无法统计文件大小,显示为0。 - -## 使用实例 - -举例:输入ls - -## 输出说明 - -**图 1** 查看当前系统路径下的目录,显示的内容如下 -![](/images/zh-cn/device-dev/kernel/figure/查看当前系统路径下的目录-显示的内容如下.png "查看当前系统路径下的目录-显示的内容如下") - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/10.mkdir.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/10.mkdir.md" deleted file mode 100644 index 99e8b1d9d1216e2164b1781cc2aae501ab18ee94..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/10.mkdir.md" +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: mkdir -permalink: /pages/0002010400030109 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# mkdir - -- [命令功能](#section1083613274175) -- [命令格式](#section820913118178) -- [参数说明](#section1256834121718) -- [使用指南](#section1294234115172) -- [使用实例](#section1113345211713) -- [输出说明](#section10142201012) - -## 命令功能 - -mkdir命令用来创建一个目录。 - -## 命令格式 - -mkdir \[_directory_\] - -## 参数说明 - -**表 1** 参数说明 - - - - - - - - - - - - -

参数

-

参数说明

-

取值范围

-

directory

-

需要创建的目录。

-

N/A

-
- -## 使用指南 - -- mkdir后加所需要创建的目录名会在当前目录下创建目录。 -- mkdir后加路径,再加上需要创建的目录名,即在指定目录下创建目录。 - -## 使用实例 - -举例:mkdir share - -## 输出说明 - -**图 1** 创建 share 目录 -![](/images/zh-cn/device-dev/kernel/figure/创建-share-目录.png "创建-share-目录") - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/02.dhclient.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/02.dhclient.md" deleted file mode 100644 index 650e39da05086e23d6bdb9f900763d6ae6770c13..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/02.dhclient.md" +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: dhclient -permalink: /pages/0002010400030201 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# dhclient - -- [命令功能](#section366714216619) -- [命令格式](#section8833164614615) -- [参数说明](#section12809111019453) -- [使用指南](#section15935131220717) -- [使用实例](#section79281818476) -- [输出说明](#section12742311179) - -## 命令功能 - -设置和查看dhclient的参数。 - -## 命令格式 - -dhclient <_netif name_\> - -dhclient -x <_netif name_\> - -dhclient -gb <_netif name_\> - -dhclient -sv <_vendor_\> - -dhclient -gv - -dhclient -gd <_index_\> - -dhclient -sd <_dns\_ip_\> - -## 参数说明 - -**表 1** 参数说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数说明

-

取值范围

-

<netif name>

-

启动对应网卡的dhcp请求。

-

网卡名字,eth0。

-

-x <netif name>

-

关闭对应网卡的dhcp功能。

-

网卡名字,eth0。

-

-gb <netif name>

-

查看对应网卡的dhcp请求是否完成。

-

网卡名字,eth0。

-

-sv <vendor>

-

设置dhcp请求的厂商信息。

-

厂商信息,长度是32个字符。

-

-gv

-

查看dhcp请求的厂商信息。

-

N/A

-

-gd <index>

-

获取第index个dns server的信息。

-

index,0或者1。

-

-sd <dns_ip>

-

设置主dns server的ip。

-

dns的ip地址。

-
- -## 使用指南 - -dhclient eth0 - -dhclient -x eth0 - -dhclient -gb eth0 - -dhclient -sv MFSI - -dhclient -gv - -dhclient -gd 0 - -dhclient -sd 8.8.8.8 - -## 使用实例 - -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179848731.png) - -## 输出说明 - -**表 2** 输出说明 - - - - - - - - - - - - - -

输出

-

说明

-

dhclient: set vendor info [MFSI] success

-

设置厂商信息MFSI信息成功。

-

dns[0]: 192.168.1.100

-

dns server ip地址为192.168.1.100。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/03.dns.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/03.dns.md" deleted file mode 100644 index a111257881ccc8104ecb5b1608292e303ab40bbb..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/03.dns.md" +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: dns -permalink: /pages/0002010400030202 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# dns - -- [命令功能](#section997513673713) -- [命令格式](#section146015943711) -- [参数说明](#section5732111163716) -- [使用指南](#section15642141417371) -- [使用实例](#section1995841617370) -- [输出说明](#section1114210258917) - -## 命令功能 - -命令用于查看和设置单板dns服务器地址。 - -## 命令格式 - -dns <_1-2_\> <_IP_\> - -dns _-a_ - -## 参数说明 - -**表 1** 参数说明 - - - - - - - - - - - - - - - - - - - - -

参数

-

参数说明

-

取值范围

-

<1-2>

-

选择设置第一个还是第二个DNS服务器。

-

1~2

-

<IP>

-

服务器IP地址。

-

N/A

-

-a

-

显示当前设置情况。

-

N/A

-
- -## 使用指南 - -无。 - -## 使用实例 - -举例: - -1. 检查当前DNS设置。 -2. 设置第二个DNS服务器IP。 -3. 检查DNS设置是否成功。 - -## 输出说明 - -1. 检查当前DNS设置: - - ``` - OHOS # dns -a - dns1: 192.168.1.10 - dns2: 0.0.0.0 - ``` - -2. 设置第二个DNS服务器IP: - - ``` - OHOS # dns 2 192.168.1.2 - ``` - -3. 检查DNS设置是否成功: - - ``` - OHOS # dns -a - dns1: 192.168.1.10 - dns2: 192.168.1.2 - ``` - - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/02.Trace.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/02.Trace.md" deleted file mode 100644 index c22187a23782c0dea6a0a68d8d413b5d6d5c5e26..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/02.Trace.md" +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Trace -permalink: /pages/0002010401 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# Trace - -- [基本概念](#section531482192018) -- [运行机制](#section5125124532010) -- [使用指导](#section1381714413216) - -## 基本概念 - -Trace是内核提供的一个跟踪模块关键流程的功能框架,各个模块根据机制需要,可以在关键位置通过Trace进行相关信息记录,再通过文件或者其他方式导出,对数据进行分析。 - -Trace的记录要求: - -1. 需要尽快的完成信息记录,对系统时序的影响降低到最小; -2. 需要尽可能的用小的空间存储大的数据量,减少内存消耗。 - -## 运行机制 - -在内核启动初期完成Trace功能的初始化,并且在支持Trace功能的模块进行初始化时,完成模块相应的Trace类型及回调函数的注册,触发Trace记录的trace point的具体位置可由各模块自行决定。 - -当系统触发到一个trace point时,Trace模块会对输入信息进行封装,添加Trace帧头信息,包含Trace类型、运行的cpuid、运行的任务id、运行的相对时间戳以及运行的进程id;再将trace frame记录到预先申请好的循环buffer中。 - -如果循环buffer记录的frame过多则可能出现翻转,会覆盖之前的记录,故保持记录的信息始终是最新的信息。Trace循环buffer的数据可以通过文件dump等形式导出进行详细分析,导出信息已按照时间戳信息完成排序。 - -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127390512.png) - -## 使用指导 - -1. 配置Trace控制宏LOSCFG\_KERNEL\_TRACE,默认关,通过在menuconfig内核配置"Kernel-\>Enable Trace Feature"中打开。 -2. 内核启动完成Trace初始化,对应接口OsTraceInit。 -3. 统一在los\_trace\_frame.h定义模块内traceframe结构体,并在los\_trace\_frame.c中实现模块Trace回调函数的实现。 -4. 需要跟踪的模块在初始化或者更早阶段完成Trace注册,对应接口LOS\_TraceReg。 -5. 在需要开始跟踪的位置打开Trace开关进行记录,结束的位置关闭Trace开关停止记录。 -6. 通过LOS\_Trace2File接口导出到文件。 -7. 根据帧头及帧体数据结构,对数据进行二次分析。 - -**接口说明** - -OpenHarmony LiteOS-A内核的Trace框架提供下面几种功能,接口详细信息可以查看API参考。 - -**表 1** Trace接口说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名称

-

描述

-

打桩记录

-

LOS_Trace

-

Trace信息记录打桩

-

注册解注册

-

LOS_TraceReg

-

Trace类型注册

-

LOS_TraceUnreg

-

Trace类型解注册

-

开关

-

LOS_TraceTypeSwitch

-

Trace分类开关

-

LOS_TraceSwitch

-

Trace总开关

-

数据导出

-

LOS_TraceBufDataGet

-

Trace数据获取到堆缓存(缓存空间内部申请,使用完需显式释放)

-

LOS_Trace2File

-

Trace数据存储到文件系统(依赖文件系统)

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->- frame buffer是个循环buffer,如果记录过长时间会覆盖旧的信息,该buffer的大小可以在los\_config.h中LOS\_TRACE\_BUFFER\_SIZE宏配置,默认配置512KiB。 ->- 尽管Trace已经尽快的完成了组装及记录,但是仍旧会对系统整体性能产生不可避免的影响。 ->- Trace支持多个模块的Trace同时记录,根据需要开关各个模块的Trace,有助于降低数据分析量。 ->- 当前内核的task、memory、liteipc模块支持Trace记录功能。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/02.OpenHarmony\345\274\200\345\217\221\346\235\277Patch\344\275\277\347\224\250\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/02.OpenHarmony\345\274\200\345\217\221\346\235\277Patch\344\275\277\347\224\250\346\214\207\345\257\274.md" deleted file mode 100644 index 1a6eb156b09d0c02daa1b762480a30dc3a575e78..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/02.OpenHarmony\345\274\200\345\217\221\346\235\277Patch\344\275\277\347\224\250\346\214\207\345\257\274.md" +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: OpenHarmony开发板Patch使用指导 -permalink: /pages/00020201 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# OpenHarmony开发板Patch使用指导 - -Patch文件位于工程项目源码路径:kernel/linux/patches/linux-4.19,存放特定芯片架构驱动补丁。 - -如需使用特定芯片平台驱动的Patch,需要在内核仓代码完成对芯片平台驱动补丁合入。 - -合入芯片平台驱动补丁,针对不同芯片平台合入对应的patch: - -以Hi3516dv300为例: - -``` -patch -p1 < device/hisilicon/hi3516dv300/sdk_linux/open_source/linux/hisi_linux-4.19_hos_l2.patch -``` - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** ->由于OpenHarmony的编译构建流程中会拷贝kernel/linux-4.19的代码环境后进行打补丁动作,在使用OpenHarmony的版本级编译命令前,需要kernel/linux-4.19保持原代码环境。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/03.Linux\345\206\205\346\240\270\347\274\226\350\257\221\344\270\216\346\236\204\345\273\272\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/03.Linux\345\206\205\346\240\270\347\274\226\350\257\221\344\270\216\346\236\204\345\273\272\346\214\207\345\257\274.md" deleted file mode 100644 index 148f7ea0cc764e1c6de23f0857189ba55bd786ed..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/03.Linux\345\206\205\346\240\270\347\274\226\350\257\221\344\270\216\346\236\204\345\273\272\346\214\207\345\257\274.md" +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Linux内核编译与构建指导 -permalink: /pages/00020202 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# Linux内核编译与构建指导 - -- [开发示例1](#section19369206113115) - - [场景1:版本级编译原生方式](#section1025111193220) - - [场景2:单独编译修改后的内核](#section17446652173211) - - -## 开发示例1 - -以hi3516dv300开源开发板+ubuntu x86主机开发环境为例。 - -### 场景1:版本级编译原生方式 - -使用工程的全量编译命令,编译生成uImage内核镜像 - -``` -./build.sh --product-name Hi3516DV300 # 编译hi3516dv300的uImage内核镜像 -``` - -### 场景2:单独编译修改后的内核 - -1. 准备工作 - - 1. 按[开发板Patch使用指导](/pages/00020201)打入所需补丁。 - 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/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/04.\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215\346\214\207\345\257\274/01.\346\246\202\350\277\260.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/04.\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215/01.\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215\346\214\207\345\257\274/01.\346\246\202\350\277\260.md" index 399399568d254a199a8f7466c79ccea924795f3e..88b5b9d5b649a2412ffe7254064518be83f2a8c1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/04.\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215/01.\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215\346\214\207\345\257\274/01.\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 概述 -permalink: /pages/00070300 +permalink: /pages/00030000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 概述 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/04.\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215/02.CMake\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215\346\214\207\345\257\274/02.CMake\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/04.\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215/02.CMake\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215\346\214\207\345\257\274/02.CMake\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" index 2a8290bf388c080846b2ff9ad714a28ba9ec590a..48936486adfa1fff58ab3a70eca41756f6eaf698 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/04.\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215/02.CMake\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215\346\214\207\345\257\274/02.CMake\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" @@ -1,6 +1,6 @@ --- title: CMake方式组织编译的库移植 -permalink: /pages/00070301 +permalink: /pages/00030001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # CMake方式组织编译的库移植 @@ -240,12 +240,12 @@ CMake方式可通过指定工具链进行交叉编译,修改并编译该库, 1. 搭建OpenHarmony环境 - 以hi3518ev300为例,编译出OpenHarmony镜像,烧写到开发板,参考[开发Hi3518第一个示例程序](/pages/0001000501)。 + 以hi3518ev300为例,编译出OpenHarmony镜像,烧写到开发板,参考[开发Hi3518第一个示例程序](/pages/000100020201)。 进入系统如下所示: **图 1** OpenHarmony启动成功界面 - ![](/images/zh-cn/device-dev/porting/figure/OpenHarmony启动成功界面.png "OpenHarmony启动成功界面") + ![](/images/device-dev/porting/figure/OpenHarmony启动成功界面.png "OpenHarmony启动成功界面") 2. 挂载nfs目录,将[表2](#table1452412391911)中test目录下cctest可执行文件放入nfs目录 3. 执行用例 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/04.\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215/03.Makefile\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215\346\214\207\345\257\274/03.Makefile\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/04.\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215/03.Makefile\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215\346\214\207\345\257\274/03.Makefile\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" index 6f145a901f61711473f55530509246621fee32e9..0a3164e391c06adb2f0a4aac19404621c477c286 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/04.\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215/03.Makefile\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\344\270\211\346\226\271\345\272\223\347\247\273\346\244\215\346\214\207\345\257\274/03.Makefile\346\226\271\345\274\217\347\273\204\347\273\207\347\274\226\350\257\221\347\232\204\345\272\223\347\247\273\346\244\215.md" @@ -1,6 +1,6 @@ --- title: Makefile方式组织编译的库移植 -permalink: /pages/00070302 +permalink: /pages/00030002 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # Makefile方式组织编译的库移植 @@ -161,7 +161,7 @@ date: 2021-12-30 12:57:45 ## 测试 -yxml库测试步骤与double-conversion库基本一致,可参考[CMake方式组织编译的库移植](/pages/00070301#section6686144293611)的测试过程,以下内容介绍yxml库测试用例的使用方法: +yxml库测试步骤与double-conversion库基本一致,可参考[CMake方式组织编译的库移植](/pages/00030001#section6686144293611)的测试过程,以下内容介绍yxml库测试用例的使用方法: **表 3** 生成的test目录结构示意 @@ -249,7 +249,7 @@ echo "All tests completed successfully." ## 将该库编译添加到OpenHarmony工程中 -yxml库添加的过程除了适配文件build.gn和config.gni有些许变化外,其他和double-conversion库完全一致,参考[CMake方式组织编译的库移植](/pages/00070301#section1651053153715)的配置过程。要修改的适配文件及添加后的目录结构如下: +yxml库添加的过程除了适配文件build.gn和config.gni有些许变化外,其他和double-conversion库完全一致,参考[CMake方式组织编译的库移植](/pages/00030001#section1651053153715)的配置过程。要修改的适配文件及添加后的目录结构如下: - yxml库新增的BUILD.gn实现如下: diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" similarity index 91% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" index d839af2a930c4ddddcd803a31a9d82a7e4cbc1ed..ccc650740c94274cdf9af9222c6dceed0ee3f082 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" @@ -1,6 +1,6 @@ --- title: 移植须知 -permalink: /pages/0007000000 +permalink: /pages/0003010000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 移植须知 @@ -46,7 +46,7 @@ OpenHarmony整体工程较为复杂,目录及实现为系统本身功能,如

/device

-

板级相关实现,各个三方厂商按照OpenHarmony规范适配实现,device下具体目录结构及移植过程参见板级系统移植

+

板级相关实现,各个三方厂商按照OpenHarmony规范适配实现,device下具体目录结构及移植过程参见板级系统移植

/vendor

@@ -69,7 +69,7 @@ device ├── linux # linux版本 │ └── config.gni # linux版本编译工具链和编译选项配置 └── liteos_a # liteos-a版本 - └── config.gni # liteos_a版本编译工具链和编译选项配置 + └── config.gni # liteos-a版本编译工具链和编译选项配置 ``` vendor目录规则:vendor/\{产品解决方案厂商\}/\{产品名称\}。以华为的wifiiot产品为例: @@ -88,10 +88,10 @@ vendor # 产品解决方案厂商 OpenHarmony的device目录是基础芯片的适配目录,如果在三方芯片应用过程中发现此目录下已经有完整的芯片适配,则不需要再额外移植,直接跳过移植过程进行系统应用开发即可,如果该目录下无对应的芯片移植实现,则根据本文完成移植过程。OpenHarmony三方芯片移植主要过程如下: **图 1** 芯片移植关键步骤 -![](/images/zh-cn/device-dev/porting/figure/芯片移植关键步骤.png "芯片移植关键步骤") +![](/images/device-dev/porting/figure/芯片移植关键步骤.png "芯片移植关键步骤") ## 移植规范 -- 满足OpenHarmony[开源贡献基本规范和准则](https://gitee.com/openharmony/docs/blob/master/zh-cn/contribute/%E5%8F%82%E4%B8%8E%E8%B4%A1%E7%8C%AE.md)。 -- 三方芯片适配所需要贡献的代码主要在device、vendor和arch三个目录,参照[内核目录规范](/pages/0007000100)和[板级目录规范](/pages/0007000200#section6204129143013)满足基本目录命名和使用规范。 +- 满足OpenHarmony[开源贡献基本规范和准则](/pages/000c00)。 +- 三方芯片适配所需要贡献的代码主要在device、vendor和arch三个目录,参照[内核目录规范](/pages/0003010100)和[板级目录规范](/pages/0003010200#section6204129143013)满足基本目录命名和使用规范。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/02.\347\274\226\350\257\221\346\236\204\345\273\272\351\200\202\351\205\215\346\265\201\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/02.\347\274\226\350\257\221\346\236\204\345\273\272\351\200\202\351\205\215\346\265\201\347\250\213.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/02.\347\274\226\350\257\221\346\236\204\345\273\272\351\200\202\351\205\215\346\265\201\347\250\213.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/02.\347\274\226\350\257\221\346\236\204\345\273\272\351\200\202\351\205\215\346\265\201\347\250\213.md" index c8d11ec2006c6c28ac6c5b4e7b02ec80926b45f9..eede1bf3dae0aab30755491a589591affe916d1e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/02.\347\274\226\350\257\221\346\236\204\345\273\272\351\200\202\351\205\215\346\265\201\347\250\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/02.\347\274\226\350\257\221\346\236\204\345\273\272\351\200\202\351\205\215\346\265\201\347\250\213.md" @@ -1,6 +1,6 @@ --- title: 编译构建适配流程 -permalink: /pages/0007000001 +permalink: /pages/0003010001 navbar: true sidebar: true prev: true @@ -9,13 +9,13 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 编译构建适配流程 - [编译构建适配流程](#section2159183845319) -编译构建的详细介绍请见[编译构建子系统介绍](/pages/00040000)。新增三方芯片时,编译相关的适配流程如下: +编译构建的详细介绍请见[编译构建子系统介绍](/pages/00040200)。新增三方芯片时,编译相关的适配流程如下: ## 编译构建适配流程 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" similarity index 66% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" index 1e97e0f05db54a02990d7a977dc3a0a594b44cad..72fa30876847a7cc7f6b8023d67165246e8c32f1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 移植概述 -permalink: /pages/0007000100 +permalink: /pages/0003010100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 移植概述 @@ -19,7 +19,7 @@ date: 2021-12-30 12:57:45 ## 移植场景 -芯片架构适配是可选过程,如果在liteos\_m/kernel/arch目录下已经支持对应芯片架构,则可以跳过芯片架构适配,进行单板适配过程,否则需要进行芯片架构移植工作。 +芯片架构适配是可选过程,如果在liteos\_m/arch目录下已经支持对应芯片架构,则可以跳过芯片架构适配,进行单板适配过程,否则需要进行芯片架构移植工作。 ## 目录规范 @@ -31,31 +31,29 @@ date: 2021-12-30 12:57:45 - 在Kernel模块中,其中硬件相关的代码放在kernel的arch目录中,其余为硬件无关的代码。内核功能集(task、sem等)的实现依赖硬件相关的arch代码,例如任务上下文切换、原子操作等。 - Utils模块作为基础代码块,被其他模块依赖。 -**图 1** liteos-m内核模块图 - - -![](/images/zh-cn/device-dev/porting/figure/zh-cn_image_0000001072304191.png) +**图 1** liteos-m内核模块图 +![](/images/device-dev/porting/figure/liteos-m内核模块图.png "liteos-m内核模块图") 内核的目录结构和说明如下: ``` . +├── arch --- 内核指令架构层代码 +│ ├── arm --- arm32架构的代码 +│ │ ├── cortex-m3 --- cortex-m3架构的代码 +│ │ │ ├── iar --- iar编译工具链实现 +│ │ │ ├── keil --- keil编译工具链实现 +│ │ │ └── xxx --- xxx编译工具链实现 +│ │ └── cortex-m4 --- cortex-m4架构的代码 +│ │ ├── iar --- iar编译工具链实现 +│ │ ├── keil --- keil编译工具链实现 +│ │ └── xxx --- xxx编译工具链实现 +│ ├── include --- 所有的arch需要实现的函数定义,内核依赖 +│ └── risc-v --- risk-v架构 +│ └── gcc --- gcc编译工具链实现 ├── components --- 移植可选组件,依赖内核,单独对外提供头文件 ├── kal --- 内核抽象层,提供内核对外接口,当前支持cmsis接口和部分posix接口 ├── kernel --- 内核最小功能集代码 -│ ├── arch --- 内核指令架构层代码 -│ │ ├── arm --- arm32架构的代码 -│ │ │ ├── cortex-m3 --- cortex-m3架构的代码 -│ │ │ │ ├── iar --- iar编译工具链实现 -│ │ │ │ ├── keil --- keil编译工具链实现 -│ │ │ │ └── xxx --- xxx编译工具链实现 -│ │ │ └── cortex-m4 --- cortex-m4架构的代码 -│ │ │ ├── iar --- iar编译工具链实现 -│ │ │ ├── keil --- keil编译工具链实现 -│ │ │ └── xxx --- xxx编译工具链实现 -│ │ ├── include --- 所有的arch需要实现的函数定义,内核依赖 -│ │ └── risc-v --- risk-v架构 -│ │ └── gcc --- iar编译工具链实现 │ ├── include --- 内核最小功能集代码 │ └── src --- 内核最小功能集代码 └──utils --- 基础代码,作为依赖的最底层,被系统依赖 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/02.\345\206\205\346\240\270\345\237\272\347\241\200\351\200\202\351\205\215.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/02.\345\206\205\346\240\270\345\237\272\347\241\200\351\200\202\351\205\215.md" similarity index 88% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/02.\345\206\205\346\240\270\345\237\272\347\241\200\351\200\202\351\205\215.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/02.\345\206\205\346\240\270\345\237\272\347\241\200\351\200\202\351\205\215.md" index d91ecb083a55fb28b34dc712438e09eeaaf19890..b4d9566eb43c9df6ab4be941395d6ee036348f0f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/02.\345\206\205\346\240\270\345\237\272\347\241\200\351\200\202\351\205\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/02.\345\206\205\346\240\270\345\237\272\347\241\200\351\200\202\351\205\215.md" @@ -1,6 +1,6 @@ --- title: 内核基础适配 -permalink: /pages/0007000101 +permalink: /pages/0003010101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 内核基础适配 @@ -25,10 +25,8 @@ date: 2021-12-30 12:57:45 1. 启动文件startup.S和相应链接配置文件。 2. main. c中的串口初始化和tick中断注册。 -**图 1** 启动流程 - - -![](/images/zh-cn/device-dev/porting/figure/zh-cn_image_0000001073943511.png) +**图 1** 启动流程 +![](/images/device-dev/porting/figure/启动流程.png "启动流程") 启动文件startup.S需要确保中断向量表的入口函数(例如reset\_vector)放在RAM的首地址,它由链接配置文件来指定。其中iar、keil和gcc工程的链接配置文件分别为xxx.icf、xxx.sct和xxx.ld,如果startup.S已经完成系统时钟初始化,并且能够引导到main函数,则启动文件不需要进行修改,采用厂商自带的startup.S即可,否则需要实现以上功能。 @@ -76,6 +74,11 @@ liteos\_m的完整配置能力及默认配置在los\_config.h定义,该头文

队列功能开关,1表示打开,0表示关闭

+

LOSCFG_BASE_CORE_TSK_LIMIT

+ +

除idle task之外,总的可用task个数限制,可以根据业务使用的task个数来配置,也可以设置一个较大的值,待业务稳定了,查看运行task的个数来进行配置

+ +

LOSCFG_BASE_IPC_SEM

信号量功能开关,1表示打开,0表示关闭

diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/03.\345\206\205\346\240\270\347\247\273\346\244\215\351\252\214\350\257\201.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/03.\345\206\205\346\240\270\347\247\273\346\244\215\351\252\214\350\257\201.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/03.\345\206\205\346\240\270\347\247\273\346\244\215\351\252\214\350\257\201.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/03.\345\206\205\346\240\270\347\247\273\346\244\215\351\252\214\350\257\201.md" index 5254063a705e4a9140bd8cd08d08976f7c52a754..9f2422c9bdc023a5a96df57e21e72b5c39b5392b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/03.\345\206\205\346\240\270\347\247\273\346\244\215\351\252\214\350\257\201.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\345\206\205\346\240\270\347\247\273\346\244\215/03.\345\206\205\346\240\270\347\247\273\346\244\215\351\252\214\350\257\201.md" @@ -1,6 +1,6 @@ --- title: 内核移植验证 -permalink: /pages/0007000102 +permalink: /pages/0003010102 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 内核移植验证 @@ -68,5 +68,5 @@ LITE_OS_SEC_TEXT_INIT int main(void) } ``` -第一个任务运行正常后,说明最小系统的核心流程基本OK;由于xts用例框架对外依赖较多,主要是utils、bootstrap的链接脚本和编译框架,暂时无法支撑内核单独跑xts;此处略过内核测试套的测试,可以通过[XTS测试套](/pages/0007000205)来覆盖最小系统是否完整移植成功。 +第一个任务运行正常后,说明最小系统的核心流程基本OK;由于xts用例框架对外依赖较多,主要是utils、bootstrap的链接脚本和编译框架,暂时无法支撑内核单独跑xts;此处略过内核测试套的测试,可以通过[XTS测试套](/pages/0003010206)来覆盖最小系统是否完整移植成功。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" index 5f813152ad18c4ce917dd8a87273509f76345d59..65373b215e7b336469b595c0493d23e19b7e657b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 移植概述 -permalink: /pages/0007000200 +permalink: /pages/0003010200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 移植概述 @@ -26,11 +26,11 @@ date: 2021-12-30 12:57:45 4. 业务功能验证。 **图 1** 单板驱动适配流程 -![](/images/zh-cn/device-dev/porting/figure/单板驱动适配流程.png "单板驱动适配流程") +![](/images/device-dev/porting/figure/单板驱动适配流程.png "单板驱动适配流程") ## 板级目录规范 -板级系统编译适配参考[编译系统介绍](/pages/0007000001),板级相关的驱动、SDK、目录、HAL实现存放在device目录,目录结构和具体描述如下: +板级系统编译适配参考[编译系统介绍](/pages/0003010001),板级相关的驱动、SDK、目录、HAL实现存放在device目录,目录结构和具体描述如下: ``` . diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/02.\346\235\277\347\272\247\351\251\261\345\212\250\351\200\202\351\205\215.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/02.\346\235\277\347\272\247\351\251\261\345\212\250\351\200\202\351\205\215.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/02.\346\235\277\347\272\247\351\251\261\345\212\250\351\200\202\351\205\215.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/02.\346\235\277\347\272\247\351\251\261\345\212\250\351\200\202\351\205\215.md" index 13e1ce985a35955f155870d98fc50b6f689f2a8d..88469c693b59a6ce3d56c397e1e8672eeca6f982 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/02.\346\235\277\347\272\247\351\251\261\345\212\250\351\200\202\351\205\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/02.\346\235\277\347\272\247\351\251\261\345\212\250\351\200\202\351\205\215.md" @@ -1,6 +1,6 @@ --- title: 板级驱动适配 -permalink: /pages/0007000201 +permalink: /pages/0003010201 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 板级驱动适配 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/03.HAL\345\261\202\345\256\236\347\216\260.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/03.HAL\345\261\202\345\256\236\347\216\260.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/03.HAL\345\261\202\345\256\236\347\216\260.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/03.HAL\345\261\202\345\256\236\347\216\260.md" index 97c9d222ebd3047654ca0f82b9c7780794388276..9e26d9da7042ad59441decd21b3bcd9e2c360482 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/03.HAL\345\261\202\345\256\236\347\216\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/03.HAL\345\261\202\345\256\236\347\216\260.md" @@ -1,6 +1,6 @@ --- title: HAL层实现 -permalink: /pages/0007000202 +permalink: /pages/0003010202 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # HAL层实现 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/04.\347\263\273\347\273\237\347\273\204\344\273\266\350\260\203\347\224\250.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/04.\347\263\273\347\273\237\347\273\204\344\273\266\350\260\203\347\224\250.md" similarity index 88% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/04.\347\263\273\347\273\237\347\273\204\344\273\266\350\260\203\347\224\250.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/04.\347\263\273\347\273\237\347\273\204\344\273\266\350\260\203\347\224\250.md" index df7eac2d35672283fb67dad49bf72b7816b26677..6beadb5f326aa6b8090f54ee081642ae5141a6c8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/04.\347\263\273\347\273\237\347\273\204\344\273\266\350\260\203\347\224\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/04.\347\263\273\347\273\237\347\273\204\344\273\266\350\260\203\347\224\250.md" @@ -1,6 +1,6 @@ --- title: 系统组件调用 -permalink: /pages/0007000203 +permalink: /pages/0003010203 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 系统组件调用 @@ -24,7 +24,7 @@ date: 2021-12-30 12:57:45 系统服务框架基于面向服务的架构,提供了服务开发、服务的子功能开发、对外接口的开发、以及多服务共进程、进程间服务调用等开发能力。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >本组件在板级系统移植中必须要使用,否则其他服务组件无法运行。 **SAMGR使用说明,请参考:[SAMGR 使用指导](https://gitee.com/openharmony/distributedschedule_samgr_lite/blob/master/README_zh.md)** @@ -35,5 +35,5 @@ date: 2021-12-30 12:57:45 DFX子系统主要包含DFR(Design for Reliability,可靠性)和DFT(Design for Testability,可测试性)特性,为开发者提供代码维测信息。 -**DFX子系统使用说明,请参考:[DFX子系统使用指导](/pages/00040d00)** +**DFX子系统使用说明,请参考:[DFX子系统使用指导](/pages/00040e00)** diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/05.lwIP\347\273\204\344\273\266\351\200\202\351\205\215.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/05.lwIP\347\273\204\344\273\266\351\200\202\351\205\215.md" new file mode 100644 index 0000000000000000000000000000000000000000..24db099876b201c652e0afad31756c38bd939f9e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/05.lwIP\347\273\204\344\273\266\351\200\202\351\205\215.md" @@ -0,0 +1,77 @@ +--- +title: lwIP组件适配 +permalink: /pages/0003010204 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:29 +--- +# lwIP组件适配 + +lwIP是一个小型开源的TCP/IP协议栈,LiteOS-M已对开源lwIP做了适配和功能增强,lwIP代码分为两部分: + +- third_party/lwip目录下是lwIP开源代码,里面只做了少量的侵入式修改,为了适配增强功能。 + +- kernel/liteos_m/components/net/lwip-2.1目录下是lwIP适配和功能增强代码,里面提供了lwIP的默认配置文件。 + +如果需要使用lwIP组件,请按如下步骤适配: + +1. 在产品目录下新建一个目录用来存放产品的适配文件,如lwip_adapter。 + +2. 在lwip_adapter目录下新建一个目录include,用来存放适配的头文件。 + +3. 在include目录下新建目录lwip,并在lwip目录下新建头文件lwipopts.h,代码如下所示,如果默认配置不能满足产品使用,可自行根据产品使用情况修改配置,如关闭DHCP功能。 + + ``` + #ifndef _LWIP_ADAPTER_LWIPOPTS_H_ + #define _LWIP_ADAPTER_LWIPOPTS_H_ + + #include_next "lwip/lwipopts.h" + + #undef LWIP_DHCP + #define LWIP_DHCP 0 // 关闭DHCP功能 + + #endif /* _LWIP_ADAPTER_LWIPOPTS_H_ */ + ``` + +4. 将kernel/liteos_m/components/net/lwip-2.1/porting目录下的BUILD.gn复制到lwip_adapter目录下,并按如下修改。 + + ``` + import("//kernel/liteos_m/liteos.gni") + import("$LITEOSTHIRDPARTY/lwip/lwip.gni") + import("$LITEOSTOPDIR/components/net/lwip-2.1/lwip_porting.gni") + + module_switch = defined(LOSCFG_NET_LWIP_SACK) + module_name = "lwip" + kernel_module(module_name) { + sources = LWIP_PORTING_FILES + LWIPNOAPPSFILES - [ "$LWIPDIR/api/sockets.c" ] + include_dirs = [ "//utils/native/lite/include" ] + } + + #添加新增加的适配头文件路径include + config("public") { + include_dirs = [ "include" ] + LWIP_PORTING_INCLUDE_DIRS + LWIP_INCLUDE_DIRS + } + ``` + +5. 在产品的配置文件(如config.json)中设置lwIP的编译路径,即步骤4中BUILD.gn的路径。 + + ``` + { + "subsystem": "kernel", + "components": [ + { "component": "liteos_m", "features":["ohos_kernel_liteos_m_lwip_path = \"//xxx/lwip_adapter\"" ] } + ] + }, + ``` + +6. 在产品的内核编译配置文件中,如kernel_config/debug.config,打开编译lwIP的开关。 + + ``` + LOSCFG_NET_LWIP=y + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/05.\344\270\211\346\226\271\347\273\204\344\273\266\351\200\202\351\205\215.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/06.\344\270\211\346\226\271\347\273\204\344\273\266\351\200\202\351\205\215.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/05.\344\270\211\346\226\271\347\273\204\344\273\266\351\200\202\351\205\215.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/06.\344\270\211\346\226\271\347\273\204\344\273\266\351\200\202\351\205\215.md" index 5d1babfd3786906e0b8fac8ee3007683ed1a866d..80dc53c00924c8291f7aca80d4791aa3e463364a 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/05.\344\270\211\346\226\271\347\273\204\344\273\266\351\200\202\351\205\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/06.\344\270\211\346\226\271\347\273\204\344\273\266\351\200\202\351\205\215.md" @@ -1,6 +1,6 @@ --- title: 三方组件适配 -permalink: /pages/0007000204 +permalink: /pages/0003010205 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 三方组件适配 @@ -63,7 +63,7 @@ date: 2021-12-30 12:57:45 hb build -f --patch ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** + >![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >最后一次打patch的产品信息会被记录,在进行下一次编译操作时,会对上一次的patch进行回退(即执行\`patch -p1 -R < xxx\`),回退patch失败或新增patch失败均会终止编译过程,请解决patch冲突后再次尝试编译。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/06.XTS\350\256\244\350\257\201.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/07.XTS\350\256\244\350\257\201.md" similarity index 91% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/06.XTS\350\256\244\350\257\201.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/07.XTS\350\256\244\350\257\201.md" index 6e25b3989af971642140324445f70d58e502d60f..356e9a863209cbb1d5704698cd878e8dd6650863 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/06.XTS\350\256\244\350\257\201.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\346\235\277\347\272\247\347\263\273\347\273\237\347\247\273\346\244\215/07.XTS\350\256\244\350\257\201.md" @@ -1,6 +1,6 @@ --- title: XTS认证 -permalink: /pages/0007000205 +permalink: /pages/0003010206 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # XTS认证 @@ -25,7 +25,7 @@ XTS是OpenHarmony生态认证测试套件的集合,当前包括acts(applicat - acts,存放acts相关测试用例源码与配置文件,其目的是帮助终端设备厂商尽早发现软件与OpenHarmony的不兼容性,确保软件在整个开发过程中满足OpenHarmony的兼容性要求。 - tools,存放acts相关测试用例开发框架。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >XTS的启动依赖SAMGR系统服务。 适配分为两步,包括: @@ -59,7 +59,7 @@ XTS是OpenHarmony生态认证测试套件的集合,当前包括acts(applicat 请在如下目录获取版本镜像:out/hispark\_pegasus/wifiiot\_hispark\_pegasus/。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >判断当前版本镜像是否集成acts测试套件方法:在map文件中查看对应.a是否被编译即可。 2. 版本镜像烧录进开发板。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" index 7ea1e98845ade5f4e49ac674586ec94498c26156..9d12da0d039b74eea2f108f96dc1c27ba2a5176c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/01.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/02.\350\275\273\351\207\217\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -1,6 +1,6 @@ --- title: 常见问题 -permalink: /pages/00070003 +permalink: /pages/00030103 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 常见问题 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" similarity index 93% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" index 5e302f03b030c93f5896bc588f7252896c2289f5..a135f391d81033104c805be446a62a4a8508289c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/01.\347\247\273\346\244\215\351\241\273\347\237\245.md" @@ -1,6 +1,6 @@ --- title: 移植须知 -permalink: /pages/00070100 +permalink: /pages/0003020000 navbar: true sidebar: true prev: true @@ -9,11 +9,11 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 移植须知 -本文详细介绍如何将OpenHarmony[小型系统](https://device.harmonyos.com/cn/docs/start/introduce/oem_start_guide-0000001054913231)的linux和LiteOS-A内核移植到新的开发板上,要求读者具有一定的嵌入式系统开发经验。建议先查看[入门指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/OpenHarmony-Overview_zh.md),以了解OpenHarmony软件架构、目录结构、内核子系统和驱动子系统相关知识。当前小型系统已适配的开发板如下表所示: +本文详细介绍如何将OpenHarmony[小型系统](/pages/00010000)的linux和LiteOS-A内核移植到新的开发板上,要求读者具有一定的嵌入式系统开发经验。建议先查看[入门指导](/pages/extra/197245/),以了解OpenHarmony软件架构、目录结构、内核子系统和驱动子系统相关知识。当前小型系统已适配的开发板如下表所示: **表 1** OpenHarmony小型系统已适配的开发板 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\347\274\226\350\257\221\346\236\204\345\273\272.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/02.\347\274\226\350\257\221\346\236\204\345\273\272.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\347\274\226\350\257\221\346\236\204\345\273\272.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/02.\347\274\226\350\257\221\346\236\204\345\273\272.md" index fab3cb47bfb9b6011e7ea6bf51dd727f8f098a64..c3f154fe5e2bd385c59f852d93b2f22fe5b103f8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\347\274\226\350\257\221\346\236\204\345\273\272.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\347\247\273\346\244\215\345\207\206\345\244\207/02.\347\274\226\350\257\221\346\236\204\345\273\272.md" @@ -1,6 +1,6 @@ --- title: 编译构建 -permalink: /pages/00070101 +permalink: /pages/0003020001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 编译构建 @@ -19,7 +19,7 @@ date: 2021-12-30 12:57:45 ## 编译环境搭建 -首先请搭建OpenHarmony基础环境,步骤请参考轻量和小型系统入门[linux环境搭建](https://device.harmonyos.com/cn/docs/start/introduce/oem_minitinier_environment_lin-0000001105407498)。用户态和LiteOS-A的内核态编译均使用llvm编译器编译,安装方法在搭建基础环境中已提供。若选择移植linux内核,请执行如下命令安装gcc-arm-linux-gnueabi交叉编译工具链,用于编译linux内核态镜像: +首先请搭建OpenHarmony基础环境,步骤请参考轻量和小型系统入门[linux环境搭建](/pages/0001000102)。用户态和LiteOS-A的内核态编译均使用llvm编译器编译,安装方法在搭建基础环境中已提供。若选择移植linux内核,请执行如下命令安装gcc-arm-linux-gnueabi交叉编译工具链,用于编译linux内核态镜像: ``` sudo apt-get install gcc-arm-linux-gnueabi @@ -27,7 +27,7 @@ sudo apt-get install gcc-arm-linux-gnueabi ## 编译构建系统介绍 -编译构建流程、编译脚本编写、目录规则、独立编译单个组件、独立编译芯片解决方案等介绍请见[编译构建子系统介绍](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/%E7%BC%96%E8%AF%91%E6%9E%84%E5%BB%BA.md)。 +编译构建流程、编译脚本编写、目录规则、独立编译单个组件、独立编译芯片解决方案等介绍请见[编译构建子系统介绍](/pages/00040200)。 ## 新建芯片解决方案 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\347\247\273\346\244\215\345\206\205\346\240\270/01.LiteOS-A\345\206\205\346\240\270.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\347\247\273\346\244\215\345\206\205\346\240\270/01.LiteOS-A\345\206\205\346\240\270.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\347\247\273\346\244\215\345\206\205\346\240\270/01.LiteOS-A\345\206\205\346\240\270.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\347\247\273\346\244\215\345\206\205\346\240\270/01.LiteOS-A\345\206\205\346\240\270.md" index 47ca7c3ec927a797110eec73c24c591005e3a941..8c5a721c4faa1deab05c4254ee9559f69a89e056 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\347\247\273\346\244\215\345\206\205\346\240\270/01.LiteOS-A\345\206\205\346\240\270.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\347\247\273\346\244\215\345\206\205\346\240\270/01.LiteOS-A\345\206\205\346\240\270.md" @@ -1,6 +1,6 @@ --- title: LiteOS-A内核 -permalink: /pages/0007010200 +permalink: /pages/0003020100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # LiteOS-A内核 @@ -36,7 +36,7 @@ LiteOS-A目录规范参考[LiteOS-A 简介](https://gitee.com/openharmony/kernel LiteOS-A提供系统运行所需的系统初始化流程和定制化配置选项。移植过程中,需要关注初始化流程中跟硬件配置相关的函数。 -如下图所示,LiteOS-A的初始化流程主要包含以下五步: +如下图所示,LiteOS-A的初始化流程主要包含以下七步: 1. 新增target\_config.h文件,并且编写单板内存相关的配置宏DDR\_MEM\_ADDR和DDR\_MEM\_SIZE,分别表示内存起始地址和内存的长度,预链接脚本board.ld.S会根据这两个宏进行展开生成链接脚本board.ld。 2. 新增定义MMU映射全局数组\(g\_archMmuInitMapping\),指定各个内存段属性及虚实映射关系,内核启动阶段根据该表建立内存映射关系。 @@ -48,10 +48,8 @@ LiteOS-A提供系统运行所需的系统初始化流程和定制化配置选项 整体启动流程如下图所示: -**图 1** 整体启动流程 - - -![](/images/zh-cn/device-dev/porting/figure/zh-cn_image_0000001126358814.png) +**图 1** 整体启动流程 +![](/images/device-dev/porting/figure/整体启动流程.png "整体启动流程") 从图1中可以看到,内核基础适配需要单板进行适配的代码包含三部分: @@ -131,18 +129,16 @@ LiteOS-A提供系统运行所需的系统初始化流程和定制化配置选项 - SystemInit函数用于单板用户态业务初始化,典型的初始化场景如图2所示: - **图 1** 业务启动流程 - - - ![](/images/zh-cn/device-dev/porting/figure/zh-cn_image_0000001126198996.png) + **图 2** 业务启动流程 + ![](/images/device-dev/porting/figure/业务启动流程.png "业务启动流程") - main函数用于内核基础初始化和单板内核态业务初始化,流程如下图3所示,整体由内核启动框架主导初始化流程,图中浅蓝色部分为启动框架中可接受外部模块注册启动的阶段。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** + >![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >同一层级内的模块不能有依赖关系。 - **图 2** 内核启动框架 - ![](/images/zh-cn/device-dev/porting/figure/内核启动框架.jpg "内核启动框架") + **图 3** 内核启动框架 + ![](/images/device-dev/porting/figure/内核启动框架.jpg "内核启动框架") **表 2** 启动框架层级 @@ -225,7 +221,7 @@ LiteOS-A提供系统运行所需的系统初始化流程和定制化配置选项 进行单板移植适配,推荐关注LOS\_INIT\_LEVEL\_ARCH至LOS\_INIT\_LEVEL\_KMOD\_TASK之间的层级,且尽可能拆分初始化行为进行细化阶段注册。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >启动框架中同一层级内的注册模块不能有依赖关系,建议新增模块按照上述启动阶段进行模块初始化的拆分,按需注册启动。 >可通过查看系统编译生成文件OHOS\_Image.map中.rodata.init.kernel.\*段内的符号表来了解当前已注册进内核启动框架中的各个模块初始化入口,以及检查新注册的模块初始化入口是否生效。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\347\247\273\346\244\215\345\206\205\346\240\270/02.Linux\345\206\205\346\240\270.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\347\247\273\346\244\215\345\206\205\346\240\270/02.Linux\345\206\205\346\240\270.md" similarity index 84% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\347\247\273\346\244\215\345\206\205\346\240\270/02.Linux\345\206\205\346\240\270.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\347\247\273\346\244\215\345\206\205\346\240\270/02.Linux\345\206\205\346\240\270.md" index c019a2f1500cfb3164755d9f18b5e51777f1f8cd..1227590733fdedfff59e4466eae10b5ee1746f00 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\347\247\273\346\244\215\345\206\205\346\240\270/02.Linux\345\206\205\346\240\270.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\347\247\273\346\244\215\345\206\205\346\240\270/02.Linux\345\206\205\346\240\270.md" @@ -1,6 +1,6 @@ --- title: Linux内核 -permalink: /pages/0007010201 +permalink: /pages/0003020101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # Linux内核 @@ -56,7 +56,7 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后 (2)编译失败,内核版本差异(函数实现调整等)需要针对性进行内核适配。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** + >![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >- 参考kernel.mk,在OpenHarmony工程的编译构建流程中会拷贝kernel/linux-4.19的代码环境后进行打补丁动作,在使用版本级编译命令前,需要kernel/linux-4.19保持原代码环境。 >- 对应拷贝后的目录位于: out/<\*\*\*\>/kernel/linux-4.19,可以在该目录下进行补丁的修改适配。 @@ -71,18 +71,16 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后 ## 验证 -调试init进程、启动shell和运行简单的用户态程序,验证内核移植是否成功。OpenHarmony[小型系统](https://device.harmonyos.com/cn/docs/start/introduce/oem_start_guide-0000001054913231)的OS镜像结构以及linux用户态的启动流程如下图1所示: +调试init进程、启动shell和运行简单的用户态程序,验证内核移植是否成功。OpenHarmony[小型系统](/pages/00010000)的OS镜像结构以及linux用户态的启动流程如下图1所示: -**图 1** 基于linux内核的OS镜像结构和用户态程序启动流程 - - -![](/images/zh-cn/device-dev/porting/figure/zh-cn_image_0000001126354076.png) +**图 1** 基于linux内核的OS镜像结构和用户态程序启动流程 +![](/images/device-dev/porting/figure/基于linux内核的OS镜像结构和用户态程序启动流程.png "基于linux内核的OS镜像结构和用户态程序启动流程") 基于上述流程,推荐按以下步骤完成验证: 1. 制作根文件系统镜像。 - 请参考[新建芯片解决方案和产品解决方案](https://device.harmonyos.com/cn/docs/develop/subsystems/oem_subsys_build_guide-0000001060378721)生成根文件系统镜像rootfs.img。从上图可以看到启动过程与产品配置强相关,在制作rootfs.img过程中请完成如下四种配置: + 请参考[新建芯片解决方案和产品解决方案](/pages/00040200)生成根文件系统镜像rootfs.img。从上图可以看到启动过程与产品配置强相关,在制作rootfs.img过程中请完成如下四种配置: - 组件配置 @@ -112,17 +110,13 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后 若串口有如下版本号日志打印,则表示init程序启动正常: - **图 2** init启动正常日志 - - - ![](/images/zh-cn/device-dev/porting/figure/init.jpg) + **图 2** init启动正常日志 + ![](/images/device-dev/porting/figure/init启动正常日志.png "init启动正常日志") 正常进入shell后执行ls命令,串口打印信息如下图: - **图 3** 正常进入shell后输入ls命令串口打印 - - - ![](/images/zh-cn/device-dev/porting/figure/shell.jpg) + **图 3** 正常进入shell后输入ls命令串口打印 + ![](/images/device-dev/porting/figure/正常进入shell后输入ls命令串口打印.png "正常进入shell后输入ls命令串口打印") 3. 配置NFS。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\351\251\261\345\212\250\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\351\251\261\345\212\250\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" similarity index 63% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\351\251\261\345\212\250\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\351\251\261\345\212\250\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" index a9b915b9ea07964ba4aada64a7fa890bf278d76a..d5c1378737b8b8a47870cc51aa15ef30c17df7fe 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\351\251\261\345\212\250\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\351\251\261\345\212\250\347\247\273\346\244\215/01.\347\247\273\346\244\215\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 移植概述 -permalink: /pages/0007010300 +permalink: /pages/0003020200 navbar: true sidebar: true prev: true @@ -9,16 +9,14 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 移植概述 -驱动主要包含两部分,平台驱动和器件驱动。平台驱动主要包括通常在SOC内的GPIO、I2C、SPI等;器件驱动则主要包含通常在SOC外的器件,如 LCD、TP、WLAN等。 +驱动主要包含两部分,平台驱动和器件驱动。平台驱动主要包括通常在SOC内的GPIO、I2C、SPI等;器件驱动则主要包含通常在SOC外的器件,如 LCD、TP、WLAN等 -**图 1** OpenHarmony 驱动分类 +**图 1** OpenHarmony 驱动分类 +![](/images/device-dev/porting/figure/OpenHarmony-驱动分类.png "OpenHarmony-驱动分类") - -![](/images/zh-cn/device-dev/porting/figure/分类.png) - -HDF驱动被设计为可以跨OS使用的驱动程序,HDF驱动框架会为驱动达成这个目标提供有力的支撑。开发HDF驱动中,请尽可能只使用HDF驱动框架提供的接口,否则会导致驱动丧失跨OS使用的特性。在开始驱动开发前,建议先了解[HDF驱动框架](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/HDF%E9%A9%B1%E5%8A%A8%E6%A1%86%E6%9E%B6.md)。 +HDF驱动被设计为可以跨OS使用的驱动程序,HDF驱动框架会为驱动达成这个目标提供有力的支撑。开发HDF驱动中,请尽可能只使用HDF驱动框架提供的接口,否则会导致驱动丧失跨OS使用的特性。在开始驱动开发前,建议先了解[HDF驱动框架](/pages/0004010000)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\351\251\261\345\212\250\347\247\273\346\244\215/02.\345\271\263\345\217\260\351\251\261\345\212\250\347\247\273\346\244\215.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\351\251\261\345\212\250\347\247\273\346\244\215/02.\345\271\263\345\217\260\351\251\261\345\212\250\347\247\273\346\244\215.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\351\251\261\345\212\250\347\247\273\346\244\215/02.\345\271\263\345\217\260\351\251\261\345\212\250\347\247\273\346\244\215.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\351\251\261\345\212\250\347\247\273\346\244\215/02.\345\271\263\345\217\260\351\251\261\345\212\250\347\247\273\346\244\215.md" index b810b65a9059578d681de751b42ddbb326f514a7..83d939476b335fb3138b31d81120924be6c75b30 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\351\251\261\345\212\250\347\247\273\346\244\215/02.\345\271\263\345\217\260\351\251\261\345\212\250\347\247\273\346\244\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\351\251\261\345\212\250\347\247\273\346\244\215/02.\345\271\263\345\217\260\351\251\261\345\212\250\347\247\273\346\244\215.md" @@ -1,6 +1,6 @@ --- title: 平台驱动移植 -permalink: /pages/0007010301 +permalink: /pages/0003020201 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 平台驱动移植 @@ -156,7 +156,7 @@ HDF为所有的平台驱动都创建了驱动模型,移植平台驱动的主 平台驱动请添加到platform的host中。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >moduleName要与驱动定义中的相同。 ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\351\251\261\345\212\250\347\247\273\346\244\215/03.\345\231\250\344\273\266\351\251\261\345\212\250\347\247\273\346\244\215.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\351\251\261\345\212\250\347\247\273\346\244\215/03.\345\231\250\344\273\266\351\251\261\345\212\250\347\247\273\346\244\215.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\351\251\261\345\212\250\347\247\273\346\244\215/03.\345\231\250\344\273\266\351\251\261\345\212\250\347\247\273\346\244\215.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\351\251\261\345\212\250\347\247\273\346\244\215/03.\345\231\250\344\273\266\351\251\261\345\212\250\347\247\273\346\244\215.md" index f8a5f246c0585bb9aa1430f14a572f9c6d30b666..1432c6a9111d66b38a852b7467e1b0fbe17e6264 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/02.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/04.\351\251\261\345\212\250\347\247\273\346\244\215/03.\345\231\250\344\273\266\351\251\261\345\212\250\347\247\273\346\244\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/03.\345\260\217\345\236\213\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/03.\351\251\261\345\212\250\347\247\273\346\244\215/03.\345\231\250\344\273\266\351\251\261\345\212\250\347\247\273\346\244\215.md" @@ -1,6 +1,6 @@ --- title: 器件驱动移植 -permalink: /pages/0007010302 +permalink: /pages/0003020202 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 器件驱动移植 @@ -54,7 +54,7 @@ date: 2021-12-30 12:57:45 产品的所有设备信息被定义在源码文件//vendor/vendor\_name/product\_name/config/device\_info/device\_info.hcs中。修改该文件,在display的host中,名为device\_lcd的device中增加配置。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** + >![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >moduleName 要与panel驱动中的moduleName相同。 ``` @@ -78,7 +78,7 @@ date: 2021-12-30 12:57:45 本节描述如何移植触摸屏驱动。触摸屏的器件驱动被放置在源码目录//drivers/framework/model/input/driver/touchscreen中。 移植触摸屏驱动主要工作是向系统注册ChipDevice模型实例。 -详细的驱动开发指导,请参考 [TOUCHSCREEN开发指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/TOUCHSCREEN.md)。 +详细的驱动开发指导,请参考 [TOUCHSCREEN开发指导](/pages/0004010301)。 1. 创建触摸屏器件驱动 @@ -152,7 +152,7 @@ date: 2021-12-30 12:57:45 产品的所有设备信息被定义在源码文件//vendor/vendor\_name/product\_name/config/device\_info/device\_info.hcs中。修改该文件,在名为input的host中,名为device\_touch\_chip的device中增加配置。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >moduleName 要与触摸屏驱动中的moduleName相同。 ``` @@ -174,7 +174,7 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负 **图 1** OpenHarmony WLAN结构示意图 -![](/images/zh-cn/device-dev/porting/figure/HDF_WIFI.png) +![](/images/device-dev/porting/figure/HDF_WIFI.png) 如图1,左半部分负责管理WLAN设备,右半部分负责WLAN流量。HDF WLAN分别为这两部分做了抽象,驱动的移植过程可以看做分别实现这两部分所需接口。这些接口有: @@ -211,8 +211,8 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->详细的接口开发指导,请参考[WLAN开发](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/WLAN.md)。 +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>详细的接口开发指导,请参考[WLAN开发](/pages/0004010303)。 具体的移植步骤如下: @@ -348,7 +348,7 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负 } ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >路径和文件中的vendor\_name、product\_name、chip\_name请替换成实际名称 >vendorId 和 deviceId需要根据实际芯片的识别码进行填写。 @@ -366,7 +366,7 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负 } ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >moduleName 要与HDF WLAN 芯片驱动中的moduleName相同。 4. 修改Kconfig文件,让移植的WLAN模组出现再内核配置中 @@ -381,7 +381,7 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负 Answer Y to enable chip_name Host driver. ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >请替换模板中的chip\_name为实际的芯片名称 5. 修改构建脚本,让驱动参与内核构建 @@ -397,7 +397,7 @@ WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负 endif ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >请替换模板中的chip\_name为实际的芯片名称 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/03.\346\240\207\345\207\206\347\263\273\347\273\237\347\247\273\346\244\215\346\214\207\345\215\227.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/04.\346\240\207\345\207\206\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\346\240\207\345\207\206\347\263\273\347\273\237\347\247\273\346\244\215\346\214\207\345\215\227.md" similarity index 92% rename from "website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/03.\346\240\207\345\207\206\347\263\273\347\273\237\347\247\273\346\244\215\346\214\207\345\215\227.md" rename to "website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/04.\346\240\207\345\207\206\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\346\240\207\345\207\206\347\263\273\347\273\237\347\247\273\346\244\215\346\214\207\345\215\227.md" index de74618cb3a8a7360114c105b3ea5f1eb8b06b12..540570fc6f2af865844907eedb1032dbf189ab2e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/08.\350\256\276\345\244\207\345\274\200\345\217\221-\347\247\273\346\244\215\351\200\202\351\205\215/03.\346\240\207\345\207\206\347\263\273\347\273\237\347\247\273\346\244\215\346\214\207\345\215\227.md" +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/04.\346\240\207\345\207\206\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/01.\346\240\207\345\207\206\347\263\273\347\273\237\347\247\273\346\244\215\346\214\207\345\215\227.md" @@ -1,6 +1,6 @@ --- title: 标准系统移植指南 -permalink: /pages/000702 +permalink: /pages/00030300 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:29 --- # 标准系统移植指南 @@ -27,11 +27,11 @@ date: 2021-12-30 12:57:45 - [1. LCD](#section212mcpsimp) - [2. 触摸屏](#section229mcpsimp) - [3. WLAN](#section274mcpsimp) - -- [开发板移植实例](#开发板移植实例) + - [4. 开发移植示例](#section11253153018415) 本文描述了移植一块开发板的通用步骤,和具体芯片相关的详细移植过程无法在此一一列举。后续社区还会陆续发布开发板移植的实例供开发者参考。 + ## 定义开发板 本文以移植名为MyProduct的开发板为例讲解移植过程,假定MyProduct是MyProductVendor公司的开发板,使用MySoCVendor公司生产的MySOC芯片作为处理器。 @@ -94,7 +94,7 @@ date: 2021-12-30 12:57:45 ./build.sh --product-name MyProduct ``` -构建完成后,可以在“//out/ohos-arm-release/packages/phone/images”目录下看到构建出来的OpenHarmony镜像文件。 +构建完成后,可以在“//out/{device_name}/packages/phone/images”目录下看到构建出来的OpenHarmony镜像文件。 ## 内核移植 @@ -113,23 +113,23 @@ date: 2021-12-30 12:57:45 }, ``` -接着需要修改定义产品的配置文件//productdefine/common/products/MyProduct.json。将刚刚定义的子系统加入到产品中。 +接着需要修改定义产品的配置文件//productdefine/common/products/MyProduct.json,将刚刚定义的子系统加入到产品中。 ### 2. 编译内核 -OpenHarmony源码中提供了Linux 4.19的内核,归档在`//kernel/linux-4.19`。本节以该内核版本为例,讲解如何编译内核。 +OpenHarmony源码中提供了Linux 4.19的内核,归档在//kernel/linux-4.19。本节以该内核版本为例,讲解如何编译内核。 -在子系统的定义中,描述了子系统构建的路径path,即`//device/MySOCVendor/MySOC/build`。这一节会在这个目录创建构建脚本,告诉构建系统如何构建内核。 +在子系统的定义中,描述了子系统构建的路径path,即\`//device/MySOCVendor/MySOC/build\`。这一节会在这个目录创建构建脚本,告诉构建系统如何构建内核。 建议的目录结构 ``` ├── build -│   ├── kernel -│   │ ├── linux -│   │ ├──standard_patch_for_4_19.patch // 基于4.19版本内核的补丁 -│   ├── BUILD.gn -│   ├── ohos.build +│ ├── kernel +│ │ ├── linux +│ │ ├──standard_patch_for_4_19.patch // 基于4.19版本内核的补丁 +│ ├── BUILD.gn +│ ├── ohos.build ``` BUILD.gn是subsystem构建的唯一入口。 @@ -211,7 +211,7 @@ root { } ``` -更详细的驱动开发指导,请参考 [LCD](/pages/00030300)。 +更详细的驱动开发指导,请参考 [LCD](/pages/0004010300)。 ### 2. 触摸屏 @@ -219,13 +219,7 @@ root { - 创建触摸屏器件驱动 -在目录中创建名为 - -``` -touch_ic_name.c -``` - -的文件。代码模板如下:注意:请替换ic\_name为你所适配芯片的名称。 +在目录中创建名为touch\_ic\_name.c的文件。代码模板如下:注意:请替换ic\_name为你所适配芯片的名称。 ``` #include "hdf_touch.h" @@ -306,14 +300,14 @@ HDF_INIT(g_touchXXXXChipEntry); } ``` -更详细的驱动开发指导,请参考 [TOUCHSCREEN](/pages/00030301) +更详细的驱动开发指导,请参考 [TOUCHSCREEN](/pages/0004010301)。 ### 3. WLAN Wi-Fi驱动分为两部分,一部分负责管理WLAN设备,另一个部分负责处理WLAN流量。HDF WLAN分别为这两部分做了抽象。目前支持SDIO接口的WLAN芯片。 **图 1** WLAN芯片 -![](/images/zh-cn/device-dev/porting/figure/WLAN芯片.png "WLAN芯片") +![](/images/device-dev/porting/figure/WLAN芯片.png "WLAN芯片") 支持一款芯片的主要工作是实现一个ChipDriver驱动。实现HDF\_WLAN\_CORE和NetDevice提供的接口。主要需要实现的接口有: @@ -327,21 +321,21 @@ Wi-Fi驱动分为两部分,一部分负责管理WLAN设备,另一个部分

HdfChipDriverFactory

-
//drivers/framework/include/wifi/hdf_wlan_chipdriver_manager.h
+

//drivers/framework/include/wifi/hdf_wlan_chipdriver_manager.h

ChipDriver的Factory,用于支持一个芯片多个Wi-Fi端口

HdfChipDriver

-
//drivers/framework/include/wifi/wifi_module.h
+

//drivers/framework/include/wifi/wifi_module.h

每个WLAN端口对应一个HdfChipDriver,用来管理一个特定的WLAN端口

NetDeviceInterFace

-
//drivers/framework/include/net/net_device.h
+

//drivers/framework/include/net/net_device.h

与协议栈之间的接口,如发送数据、设置网络接口状态等

@@ -351,8 +345,8 @@ Wi-Fi驱动分为两部分,一部分负责管理WLAN设备,另一个部分 建议适配按如下步骤操作: -1.创建HDF驱动建议将代码放置在//device/MySoCVendor/peripheral/wifi/chip\_name/ -文件模板如下: +1.创建HDF驱动建议将代码放置在//device/MySoCVendor/peripheral/wifi/chip\_name/,文件模板如下: + ``` static int32_t HdfWlanHisiChipDriverInit(struct HdfDeviceObject *device) { static struct HdfChipDriverFactory factory = CreateChipDriverFactory(); @@ -374,7 +368,7 @@ struct HdfDriverEntry g_hdfXXXChipEntry = { HDF_INIT(g_hdfXXXChipEntry); ``` -在CreateChipDriverFactory中需要创建一个HdfChipDriverFactory,接口如下: +在CreateChipDriverFactory中,需要创建一个HdfChipDriverFactory,接口如下: - -

接口

@@ -460,7 +454,8 @@ HdfChipDriver需要实现的接口有 在产品配置目录下创建芯片的配置文件//vendor/MyProductVendor/MyProduct/config/wifi/wlan\_chip\_chip\_name.hcs。 -注意: 路径中的vendor\_name、product\_name、chip\_name请替换成实际名称 +注意: 路径中的vendor\_name、product\_name、chip\_name请替换成实际名称。 + 模板如下: ``` @@ -525,7 +520,7 @@ obj-$(CONFIG_DRIVERS_WLAN_XXX) += $(HDF_DEVICE_ROOT)/MySoCVendor/peripheral/buil 当在内核中开启DRIVERS\_WLAN\_XXX开关时,会调用//device/MySoCVendor/peripheral/build/standard/中的makefile。更多详细的开发手册,请参考[WLAN开发](/pages/0006000000)。 -## 开发板移植实例 +### 4. 开发移植示例 -[DAYU开发板](https://gitee.com/openharmony-sig/devboard_device_hihope_build/blob/master/DAYU%20%E5%B9%B3%E5%8F%B0OpenHarmony%20%E9%80%82%E9%85%8D%E6%8C%87%E5%AF%BC%20-202108.pdf) +开发移植示例请参考[DAYU开发板](https://gitee.com/openharmony-sig/devboard_device_hihope_build/blob/master/DAYU%20%E5%B9%B3%E5%8F%B0OpenHarmony%20%E9%80%82%E9%85%8D%E6%8C%87%E5%AF%BC%20-202108.pdf)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/04.\346\240\207\345\207\206\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\344\270\200\347\247\215\345\277\253\351\200\237\347\247\273\346\244\215OpenHarmonyLinux\345\206\205\346\240\270\347\232\204\346\226\271\346\263\225.md" "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/04.\346\240\207\345\207\206\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\344\270\200\347\247\215\345\277\253\351\200\237\347\247\273\346\244\215OpenHarmonyLinux\345\206\205\346\240\270\347\232\204\346\226\271\346\263\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..36e2cf3b239d0c3efb9045c315f8e0ecae5acd2b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/04.\347\247\273\346\244\215/04.\346\240\207\345\207\206\347\263\273\347\273\237\350\212\257\347\211\207\347\247\273\346\244\215\346\214\207\345\257\274/02.\344\270\200\347\247\215\345\277\253\351\200\237\347\247\273\346\244\215OpenHarmonyLinux\345\206\205\346\240\270\347\232\204\346\226\271\346\263\225.md" @@ -0,0 +1,320 @@ +--- +title: 一种快速移植OpenHarmonyLinux内核的方法 +permalink: /pages/00030301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:29 +--- +# 一种快速移植OpenHarmony Linux内核的方法 + +- [移植概述](#移植概述) +- [移植到三方芯片平台的整体思路](#移植到三方芯片平台的整体思路) + - [内核态层和用户态层](#内核态层和用户态层) + - [获得内核态层的两种方法](#获得内核态层的两种方法) + - [借助已有Linux内核来移植OpenHarmony的流程](#section1233187263176) +- [移植到三方芯片平台的步骤](#移植到三方芯片平台的步骤) + - [整体构建环境的准备](#整体构建环境的准备) + - [内核态基础代码的移植](#内核态基础代码的移植) + - [内核态必选特性HDF的移植](#内核态必选特性hdf的移植) + - [编译Image](#编译image) + - [编译和运行HDF测试用例(可选)](#编译和运行hdf测试用例-可选-) + +## 移植概述 + + +本文面向希望将OpenHarmony移植到三方芯片平台硬件的开发者,介绍一种借助三方芯片平台自带Linux内核的现有能力,快速移植OpenHarmony到三方芯片平台的方法。 + + +## 移植到三方芯片平台的整体思路 + + +### 内核态层和用户态层 + +为了更好的解释整个内核移植,首先需要介绍一些概念: + +我们可以把OpenHarmony简单的分为 + +OpenHarmony = OpenHarmony内核态层 + OpenHarmony用户态层 + +![zh-cn_image_0000001162805936](/images/device-dev/porting/figure/zh-cn_image_0000001162805936.png) + +其中OpenHarmony内核态层就是上图的紫色部分,可以看到,它主要由内核本身(如Linux Kernel,LiteOS),和一些运行在内核态的一些特性组成,比如HDF等。 + +而OpenHarmony用户态层,在上图,就是紫色之外的部分。可以看到,由下往上看,它主要由系统服务层,框架层,应用层组成。在这儿我们将这三层整体称为“OpenHarmony用户态层”。 + +为什么这么区分呢?因为我们这篇文章主要是要讨论如何快速的把OpenHarmony移植到三方芯片平台上。而OpenHarmony的用户态层,整体来说和三方芯片平台的耦合度不高,移植较为方便。而内核态层中的内核本身以及HDF驱动框架等,和三方芯片平台的耦合度较高,是移植的重难点。我们先做这个区分,就是为了先把聚光灯打到我们最需要关注的OpenHarmony内核态层上,开始分析和解题。另外说明,本文只包含Linux内核的快速移植,不包含LiteOS的移植。 + + +### 获得内核态层的两种方法 + +为了表述方便,我们在下文部分地方用“OH”代替“OpenHarmony”。 + +将OH内核态层继续分解 + +OH内核态层 = OH Linux内核 + OH内核态特性(可选特性或者必选特性,如必选特性HDF,今后的可选特性HMDFS等) + +而OH Linux内核 = 标准LTS Linux内核 + 三方SoC芯片平台代码 + OH内核态基础代码(支撑OH用户态层运行的最基础代码) + +因此OH内核态层 = 标准LTS Linux内核 + 三方SoC芯片平台代码 + OH内核态基础代码 + OH内核态特性(如HDF,今后的HMDFS等) + +![zh-cn_image_0000001208365855](/images/device-dev/porting/figure/zh-cn_image_0000001208365855.png) + +而将前两项组合,标准LTS Linux 内核 + 三方SoC芯片平台代码,其实就是一个三方Linux内核的基础组成。从上面的推导可以看出,OpenHarmony内核态层其实能够由两种方法得到: + +方法一:OH内核态层 = 三方Linux内核 + OH内核态基础代码 + OH内核态特性(如HDF,今后的HMDFS等) + +也就是直接借助三方Linux内核,再加上基础OH内核态基础代码、以及HDF等OH内核态特性。 + +方法二:OH内核态层 = OH Linux内核 + OH内核态特性(如HDF,今后的HMDFS等) + +也就是直接采用OH Linux内核,然后再加入OH的其他内核态特性。 + +当前方法二中OH Linux内核支持的三方芯片平台还不够丰富。为了能够响应三方开发者快速移植OpenHarmony的要求,下文会着重介绍方法一,即借助三方已有的Linux内核,来快速移植OpenHarmony。 + + +### 借助已有Linux内核来移植OpenHarmony的流程 + + +整个移植流程可以分为三步: + +1. 准备整体构建环境,包括将三方芯片平台的现有内核代码拷贝到OpenHarmony的整体编译环境下。 + +2. OpenHarmony内核态基础代码的移植。 + +3. OpenHarmony内核态必选特性(如HDF等)的移植。 + +详细步骤在接下来的章节中介绍。 + + +## 移植到三方芯片平台的步骤 + +下面以树莓派3b (BCM2837) 为例,演示将OpenHarmony移植到树莓派的过程。 + + +### 整体构建环境的准备 + +1. 将三方内核纳入OpenHarmony编译环境。 + + 完整编译过一遍标准Hi3516DV300内核之后,clone树莓派内核源码并复制到manifest输出目录下: + + ``` + export PROJ_ROOT=[OpenHarmony manifest] + git clone https://gitee.com/xfan1024/oh-rpi3b-kernel.git + cp -r oh-rpi3b-kernel $PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b + ``` + +2. 配置树莓派内核编译环境。 + ```shell + # 进入树莓派kernel目录 + cd out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b + + # 配置编译环境,使用工程项目自带的clang + export PATH=$PROJ_ROOT/prebuilts/clang/ohos/linux-x86_64/llvm/bin:$PROJ_ROOT/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin/:$PATH + export MAKE_OPTIONS="ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- CC=clang HOSTCC=clang" + export PRODUCT_PATH=vendor/hisilicon/Hi3516DV300 + ``` + +3. 注释掉clang不识别的flag。 + + PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b/arch/arm/Makefile注释掉以下这一行: + + ```makefile + KBUILD_CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog + ``` + + +### 内核态基础代码的移植 + +目前OpenHarmony内核态的基础代码,主要是日志服务相关。轻量化内核日志服务代码包含: + +``` +drivers/staging/hilog +drivers/staging/hievent +``` + +将以上代码,从OpenHarmony内核代码目录kernel/linux/linux-4.19/drivers/staging中,拷贝到out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b/drivers/staging 下。 + +在三方内核的drivers/staging/Kconfig文件内增加如下代码: +``` +source "drivers/staging/hilog/Kconfig" + +source "drivers/staging/hievent/Kconfig" + +``` + +在内核config项中打开对应的CONFIG控制宏:CONFIG_HILOG和CONFIG_HIEVENT。 + +具体日志使用说明请参见:[Hilog_lite组件介绍](https://gitee.com/openharmony/hiviewdfx_hilog_lite/blob/master/README_zh.md)。 + + +### 内核态必选特性HDF的移植 + +1. 打HDF补丁。 + + 在Linux内核打HDF补丁时,执行补丁shell脚本合入HDF补丁。 + + 1. 配置HDF补丁脚本的三个变量参数。 + 2. 获取patch_hdf.sh脚本。 + 3. 执行patch_hdf.sh脚本依次传入三个变量参数。 + + patch_hdf.sh脚本三个参数含义为:第一个入参为工程根目录路径,第二入参为内核目录路径,第三个入参为hdf补丁文件。 + + ``` + ./patch_hdf.sh [工程根目录路径] [内核目录路径] [hdf补丁文件] + ``` + + 以树莓派3b为示例介绍: + + ``` + # 进入树莓派kernel目录 + $PROJ_ROOT/drivers/adapter/khdf/linux/patch_hdf.sh \ + $PROJ_ROOT # 指定工程根目录路径 \ + $PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b # 打补丁的内核目录路径 \ + $PROJ_ROOT/kernel/linux/patches/linux-4.19/hi3516dv300_patch/hdf.patch # HDF补丁文件 + ``` + +2. 配置config。 + + 提供HDF基本配置,如果需要其他功能,通过menuconfig打开对应驱动开关即可。 + + HDF补丁执行成功后,默认HDF开关是关闭的,打开HDF基本配置选项如下: + + ``` + CONFIG_DRIVERS_HDF=y + CONFIG_HDF_SUPPORT_LEVEL=2 + CONFIG_DRIVERS_HDF_PLATFORM=y + CONFIG_DRIVERS_HDF_PLATFORM_MIPI_DSI=y + CONFIG_DRIVERS_HDF_PLATFORM_GPIO=y + CONFIG_DRIVERS_HDF_PLATFORM_I2C=y + CONFIG_DRIVERS_HDF_PLATFORM_UART=y + CONFIG_DRIVERS_HDF_TEST=y + ``` + + 或者通过menuconfig界面打开HDF相关配置,命令如下: + + ``` + # 生成.config配置文件 + make ${MAKE_OPTIONS} rpi3b_oh_defconfig + + # 更改HDF内核配置 + make ${MAKE_OPTIONS} menuconfig + # [*] Device Drivers + # [*] HDF driver framework support ---> + ``` + + 配置如下(在Device Drivers -> HDF driver framework support目录下): + + ![zh-cn_image_0000001208524821](/images/device-dev/porting/figure/zh-cn_image_0000001208524821.png) + + +### 编译Image + +``` +# 执行编译命令 +make ${MAKE_OPTIONS} -j33 zImage +``` + + +### 编译和运行HDF测试用例(可选) + +**简介** + +HDF(Hardware Driver Foundation)自测试用例,用于测试HDF框架和外设的基本功能,本文主要介绍HDF内核态用例测试方法。 + +**预置条件** + +测试前需要在menuconfig里检查HDF测试开关CONFIG_DRIVERS_HDF_TEST=y,代码全量编译通过。 + +**用例编译和测试方法** + + +1. 编译hdf测试用例。 + +2. 用hdc_std工具推送测试文件到设备中。 + +3. 进入设备data/test目录,执行测试文件即可。 + +用例编译和测试详细步骤如下: + +1. 编译hdf测试用例。 + + 编译hdf测试用例命令和文件路径如下: + + ``` + ./build.sh --product-name Hi3516DV300 --build-target hdf_test + ``` + + 等待编译完成。 + +2. 将测试文件移动到目标移植设备上(以树莓派为例) + + + + 1. 先在树莓派里新建data/test目录。 + ``` + mkdir -p data/test + ``` + 2. 推送依赖库和测试用例到树莓派。 + ``` + hdc_std file send XXX\out\{device_name}\hdf\hdf\libhdf_test_common.z.so /system/lib + hdc_std file send XXX\out\{device_name}\tests\unittest\hdf\config\hdf_adapter_uhdf_test_config /data/test + hdc_std file send XXX\out\{device_name}\tests\unittest\hdf\devmgr\DevMgrTest /data/test + hdc_std file send XXX\out\{device_name}\tests\unittest\hdf\osal\OsalTest /data/test + hdc_std file send XXX\out\{device_name}\tests\unittest\hdf\sbuf\SbufTest /data/test + ``` + 方法二:移动到储存卡内,启动树莓派之后装载。 + + 1. 拔掉树莓派连接电脑的串口、USB线,然后拔下数据卡。 + 2. 将数据卡插入到电脑的读取口,将编译好的zImage和测试文件夹test/下载到电脑,然后移动到数据卡的根目录下。zImage文件会被替换,请提前做好备份。 + 3. 最后将数据卡插回树莓派。 + ``` + # 让树莓派文件系统读取储存卡根目录 + mount -t vfat /dev/block/mmcblk0p1 /boot + cd /boot/[测试文件目录] + # 允许修改系统文件 + mount -o remount,rw / + # 安装测试用库 + mv libhdf_test_common.z.so /system/lib + mkdir /data/test + mv * /data/test + ``` + +3. 执行测试 + 1. 进入目录执行测试文件目录data/test。 + ``` + cd /data/test + ``` + 2. 修改文件执行权限。 + ``` + chmod 777 hdf_adapter_uhdf_test_config DevMgrTest OsalTest SbufTest + ``` + 3. 开始测试。 + ``` + ./hdf_adapter_uhdf_test_config + ./DevMgrTest + ./OsalTest + ./SbufTest + ``` + 4. 如果所有测试文件输出均显示PASSED,那么HDF功能即安装成功。 + + 示例:DevMgrTest用例成功结果显示: + ``` + ./DevMgrTest + Running main() from gmock_main.cc + [==========] Running 1 test from 1 test case. + [----------] Global test environment set-up. + [----------] 1 test from DevMgrTest + [ RUN ] DevMgrTest.DriverLoaderTest_001 + [ OK ] DevMgrTest.DriverLoaderTest_001 (0 ms) + [----------] 1 test from DevMgrTest (0 ms total) + [----------] Global test environment tear-down + Gtest xml output finished + [==========] 1 test from 1 test case ran. (0 ms total) + [ PASSED ] 1 test. + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/01.GPIO.md" "b/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/01.GPIO.md" deleted file mode 100644 index c034f9a5a80805bcb879033266b0ca77059c566e..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/01.GPIO.md" +++ /dev/null @@ -1,573 +0,0 @@ ---- -title: GPIO -permalink: /pages/00030100 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# GPIO - -- [概述](#section1635911016188) - - [接口说明](#section17715915181611) - -- [使用指导](#section259614242196) - - [使用流程](#section103477714216) - - [确定GPIO管脚号](#section370083272117) - - [使用API操作GPIO管脚](#section13604050132118) - -- [使用实例](#section25941262111) - -## 概述 - -GPIO(General-purpose input/output)即通用型输入输出。通常,GPIO控制器通过分组的方式管理所有GPIO管脚,每组GPIO有一个或多个寄存器与之关联,通过读写寄存器完成对GPIO管脚的操作。 - -GPIO接口定义了操作GPIO管脚的标准方法集合,包括: - -- 设置管脚方向: 方向可以是输入或者输出\(暂不支持高阻态\) - -- 读写管脚电平值: 电平值可以是低电平或高电平 -- 设置管脚中断服务函数:设置一个管脚的中断响应函数,以及中断触发方式 -- 使能和禁止管脚中断:禁止或使能管脚中断 - -### 接口说明 - -**表 1** GPIO驱动API接口功能介绍 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

GPIO读写

-

GpioRead

-

读管脚电平值

-

GpioWrite

-

写管脚电平值

-

GPIO配置

-

GpioSetDir

-

设置管脚方向

-

GpioGetDir

-

获取管脚方向

-

GPIO中断设置

-

GpioSetIrq

-

设置管脚对应的中断服务函数

-

GpioUnSetIrq

-

取消管脚对应的中断服务函数

-

GpioEnableIrq

-

使能管脚中断

-

GpioDisableIrq

-

禁止管脚中断

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 - -## 使用指导 - -### 使用流程 - -GPIO标准API通过GPIO管脚号来操作指定管脚,使用GPIO的一般流程如[图1](#fig1399416053717)所示。 - -**图 1** GPIO使用流程图 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001170187071.png) - -### 确定GPIO管脚号 - -不同SOC芯片由于其GPIO控制器型号、参数、以及控制器驱动的不同,GPIO管脚号的换算方式不一样。 - -- Hi3516DV300 - - 控制器管理12组GPIO管脚,每组8个。 - - GPIO号 = GPIO组索引 \(0\~11\) \* 每组GPIO管脚数\(8\) + 组内偏移 - - 举例:GPIO10\_3的GPIO号 = 10 \* 8 + 3 = 83 - -- Hi3518EV300 - - 控制器管理10组GPIO管脚,每组10个。 - - GPIO号 = GPIO组索引 \(0\~9\) \* 每组GPIO管脚数\(10\) + 组内偏移 - - 举例:GPIO7\_3的GPIO管脚号 = 7 \* 10 + 3 = 73 - - -### 使用API操作GPIO管脚 - -- 设置GPIO管脚方向 - - 在进行GPIO管脚读写前,需要先通过如下函数设置GPIO管脚方向: - - int32\_t GpioSetDir\(uint16\_t gpio, uint16\_t dir\); - - **表 2** GpioSetDir参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

gpio

-

待设置的GPIO管脚号

-

dir

-

待设置的方向值

-

返回值

-

返回值描述

-

0

-

设置成功

-

负数

-

设置失败

-
- - -- 读写GPIO管脚 - - 如果要读取一个GPIO管脚电平,通过以下函数完成: - - int32\_t GpioRead\(uint16\_t gpio, uint16\_t \*val\); - - **表 3** GpioRead参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

gpio

-

待读取的GPIO管脚号

-

val

-

接收读取电平值的指针

-

返回值

-

返回值描述

-

0

-

读取成功

-

负数

-

读取失败

-
- - 如果要向GPIO管脚写入电平值,通过以下函数完成: - - int32\_t GpioWrite\(uint16\_t gpio, uint16\_t val\); - - **表 4** GpioWrite参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

gpio

-

待写入的GPIO管脚号

-

val

-

待写入的电平值

-

返回值

-

返回值描述

-

0

-

写入成功

-

负数

-

写入失败

-
- - 示例代码: - - ``` - int32_t ret; - uint16_t val; - /* 将3号GPIO管脚配置为输出 */ - ret = GpioSetDir(3, GPIO_DIR_OUT); - if (ret != 0) { - HDF_LOGE("GpioSerDir: failed, ret %d\n", ret); - return; - } - /* 向3号GPIO管脚写入低电平GPIO_VAL_LOW */ - ret = GpioWrite(3, GPIO_VAL_LOW); - if (ret != 0) { - HDF_LOGE("GpioWrite: failed, ret %d\n", ret); - return; - } - /* 将6号GPIO管脚配置为输入 */ - ret = GpioSetDir(6, GPIO_DIR_IN); - if (ret != 0) { - HDF_LOGE("GpioSetDir: failed, ret %d\n", ret); - return; - } - /* 读取6号GPIO管脚的电平值 */ - ret = GpioRead(6, &val); - ``` - - -- 设置GPIO中断 - - 如果要为一个GPIO管脚设置中断响应程序,使用如下函数: - - int32\_t GpioSetIrq\(uint16\_t gpio, uint16\_t mode, GpioIrqFunc func, void \*arg\); - - **表 5** GpioSetIrq参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

gpio

-

GPIO管脚号

-

mode

-

中断触发模式

-

func

-

中断服务程序

-

arg

-

传递给中断服务程序的入参

-

返回值

-

返回值描述

-

0

-

设置成功

-

负数

-

设置失败

-
- - >![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** - >同一时间,只能为某个GPIO管脚设置一个中断服务函数,如果重复调用GpioSetIrq函数,则之前设置的中断服务函数会被取代。 - - 当不再需要响应中断服务函数时,使用如下函数取消中断设置: - - int32\_t GpioUnSetIrq\(uint16\_t gpio\); - - **表 6** GpioUnSetIrq参数和返回值描述 - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

gpio

-

GPIO管脚号

-

返回值

-

返回值描述

-

0

-

取消成功

-

负数

-

取消失败

-
- - 在中断服务程序设置完成后,还需要先通过如下函数使能GPIO管脚的中断: - - int32\_t GpioEnableIrq\(uint16\_t gpio\); - - **表 7** GpioEnableIrq参数和返回值描述 - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

gpio

-

GPIO管脚号

-

返回值

-

返回值描述

-

0

-

使能成功

-

负数

-

使能失败

-
- - >![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** - >必须通过此函数使能管脚中断,之前设置的中断服务函数才能被正确响应。 - - 如果要临时屏蔽此中断,可以通过如下函数禁止GPIO管脚中断: - - int32\_t GpioDisableIrq\(uint16\_t gpio\); - - **表 8** GpioDisableIrq参数和返回值描述 - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

gpio

-

GPIO管脚号

-

返回值

-

返回值描述

-

0

-

禁止成功

-

负数

-

禁止失败

-
- - 示例代码: - - ``` - /* 中断服务函数 - */ - int32_t MyCallBackFunc(uint16_t gpio, void *data) - { - HDF_LOGI("%s: gpio:%u interrupt service in! data=%p\n", __func__, gpio, data); - return 0; - } - - int32_t ret; - /* 设置中断服务程序为MyCallBackFunc,入参为NULL,中断触发模式为上升沿触发 */ - ret = GpioSetIrq(3, OSAL_IRQF_TRIGGER_RISING, MyCallBackFunc, NULL); - if (ret != 0) { - HDF_LOGE("GpioSetIrq: failed, ret %d\n", ret); - return; - } - - /* 使能3号GPIO管脚中断 */ - ret = GpioEnableIrq(3); - if (ret != 0) { - HDF_LOGE("GpioEnableIrq: failed, ret %d\n", ret); - return; - } - - /* 禁止3号GPIO管脚中断 */ - ret = GpioDisableIrq(3); - if (ret != 0) { - HDF_LOGE("GpioDisableIrq: failed, ret %d\n", ret); - return; - } - - /* 取消3号GPIO管脚中断服务程序 */ - ret = GpioUnSetIrq(3); - if (ret != 0) { - HDF_LOGE("GpioUnSetIrq: failed, ret %d\n", ret); - return; - } - ``` - - -## 使用实例 - -本实例程序中,我们将测试一个GPIO管脚的中断触发:为管脚设置中断服务函数,触发方式为边沿触发,然后通过交替写高低电平到管脚,产生电平波动,制造触发条件,观察中断服务函数的执行。 - -首先需要选取一个空闲的GPIO管脚,本例程基于Hi3516DV300某开发板,GPIO管脚选择GPIO10\_3,换算成GPIO号为83。 - -读者可以根据自己使用的开发板,参考其原理图,选择一个空闲的GPIO管脚即可。 - -``` -#include "gpio_if.h" -#include "hdf_log.h" -#include "osal_irq.h" -#include "osal_time.h" - -static uint32_t g_irqCnt; - -/* 中断服务函数*/ -static int32_t TestCaseGpioIrqHandler(uint16_t gpio, void *data) -{ - HDF_LOGE("%s: irq triggered! on gpio:%u, data=%p", __func__, gpio, data); - g_irqCnt++; /* 如果中断服务函数触发执行,则将全局中断计数加1 */ - return GpioDisableIrq(gpio); -} - -/* 测试用例函数 */ -static int32_t TestCaseGpioIrqEdge(void) -{ - int32_t ret; - uint16_t valRead; - uint16_t mode; - uint16_t gpio = 83; /* 待测试的GPIO管脚号 */ - uint32_t timeout; - - /* 将管脚方向设置为输出 */ - ret = GpioSetDir(gpio, GPIO_DIR_OUT); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: set dir fail! ret:%d\n", __func__, ret); - return ret; - } - - /* 先禁止该管脚中断 */ - ret = GpioDisableIrq(gpio); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: disable irq fail! ret:%d\n", __func__, ret); - return ret; - } - - /* 为管脚设置中断服务函数,触发模式为上升沿和下降沿共同触发 */ - mode = OSAL_IRQF_TRIGGER_RISING | OSAL_IRQF_TRIGGER_FALLING; - HDF_LOGE("%s: mode:%0x\n", __func__, mode); - ret = GpioSetIrq(gpio, mode, TestCaseGpioIrqHandler, NULL); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: set irq fail! ret:%d\n", __func__, ret); - return ret; - } - - /* 使能此管脚中断 */ - ret = GpioEnableIrq(gpio); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: enable irq fail! ret:%d\n", __func__, ret); - (void)GpioUnSetIrq(gpio); - return ret; - } - - g_irqCnt = 0; /* 清除全局计数器 */ - timeout = 0; /* 等待时间清零 */ - /* 等待此管脚中断服务函数触发,等待超时时间为1000毫秒 */ - while (g_irqCnt <= 0 && timeout < 1000) { - (void)GpioRead(gpio, &valRead); - (void)GpioWrite(gpio, (valRead == GPIO_VAL_LOW) ? GPIO_VAL_HIGH : GPIO_VAL_LOW); - HDF_LOGE("%s: wait irq timeout:%u\n", __func__, timeout); - OsalMDelay(200); /* wait for irq trigger */ - timeout += 200; - } - (void)GpioUnSetIrq(gpio); - return (g_irqCnt > 0) ? HDF_SUCCESS : HDF_FAILURE; -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/02.I2C.md" "b/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/02.I2C.md" deleted file mode 100644 index acd20ad2a0e680c4f23d89053237f28e2f556275..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/02.I2C.md" +++ /dev/null @@ -1,439 +0,0 @@ ---- -title: I2C -permalink: /pages/00030101 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# I2C - -- [概述](#section5361140416) - - [接口说明](#section459052019177) - -- [使用指导](#section1695201514281) - - [使用流程](#section1338373417288) - - [打开I2C控制器](#section13751110132914) - - [进行I2C通信](#section9202183372916) - - [关闭I2C控制器](#section19481164133018) - -- [使用实例](#section5302202015300) - -## 概述 - -- I2C\(Inter Integrated Circuit\)总线是由Philips公司开发的一种简单、双向二线制同步串行总线。 -- I2C以主从方式工作,通常有一个主设备和一个或者多个从设备,主从设备通过SDA\(SerialData\)串行数据线以及SCL\(SerialClock\)串行时钟线两根线相连,如[图1 ](#fig1135561232714)所示。 - -- I2C数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。数据传输以字节为单位,高位在前,逐个bit进行传输。 -- I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址,当主设备需要和某一个从设备通信时,通过广播的方式,将从设备地址写到总线上,如果某个从设备符合此地址,将会发出应答信号,建立传输。 - -- I2C接口定义了完成I2C传输的通用方法集合,包括: - - - I2C控制器管理: 打开或关闭I2C控制器 - - I2C消息传输:通过消息传输结构体数组进行自定义传输 - - **图 1** I2C物理连线示意图 - ![](/images/zh-cn/device-dev/driver/figure/I2C物理连线示意图.png "I2C物理连线示意图") - - -### 接口说明 - -**表 1** I2C驱动API接口功能介绍 - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

I2C控制器管理接口

-

I2cOpen

-

打开I2C控制器

-

I2cClose

-

关闭I2C控制器

-

I2c消息传输接口

-

I2cTransfer

-

自定义传输

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 - -## 使用指导 - -### 使用流程 - -使用I2C设备的一般流程如[图2](#fig166181128151112)所示。 - -**图 2** I2C设备使用流程图 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123509750.png) - -### 打开I2C控制器 - -在进行I2C通信前,首先要调用I2cOpen打开I2C控制器。 - -DevHandle I2cOpen\(int16\_t number\); - -**表 2** I2cOpen参数和返回值描述 - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

number

-

I2C控制器号

-

返回值

-

返回值描述

-

NULL

-

打开I2C控制器失败

-

设备句柄

-

打开的I2C控制器设备句柄

-
- -假设系统中存在8个I2C控制器,编号从0到7,那么我们现在获取3号控制器 - -``` -DevHandle i2cHandle = NULL; /* I2C控制器句柄 / - -/* 打开I2C控制器 */ -i2cHandle = I2cOpen(3); -if (i2cHandle == NULL) { - HDF_LOGE("I2cOpen: failed\n"); - return; -} -``` - -### 进行I2C通信 - -消息传输 - -int32\_t I2cTransfer\(DevHandle handle, struct I2cMsg \*msgs, int16\_t count\); - -**表 3** I2cTransfer参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

I2C控制器设备句柄

-

msgs

-

待传输数据的消息结构体数组

-

count

-

消息数组长度

-

返回值

-

返回值描述

-

正整数

-

成功传输的消息结构体数目

-

负数

-

执行失败

-
- -I2C传输消息类型为I2cMsg,每个传输消息结构体表示一次读或写,通过一个消息数组,可以执行若干次的读写组合操作。 - -``` -int32_t ret; -uint8_t wbuff[2] = { 0x12, 0x13 }; -uint8_t rbuff[2] = { 0 }; -struct I2cMsg msgs[2]; /* 自定义传输的消息结构体数组 */ -msgs[0].buf = wbuff; /* 写入的数据 */ -msgs[0].len = 2; /* 写入数据长度为2 */ -msgs[0].addr = 0x5A; /* 写入设备地址为0x5A */ -msgs[0].flags = 0; /* 传输标记为0,默认为写 */ -msgs[1].buf = rbuff; /* 要读取的数据 */ -msgs[1].len = 2; /* 读取数据长度为2 */ -msgs[1].addr = 0x5A; /* 读取设备地址为0x5A */ -msgs[1].flags = I2C_FLAG_READ /* I2C_FLAG_READ置位 */ -/* 进行一次自定义传输,传输的消息个数为2 */ -ret = I2cTransfer(i2cHandle, msgs, 2); -if (ret != 2) { - HDF_LOGE("I2cTransfer: failed, ret %d\n", ret); - return; -} -``` - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** ->- I2cMsg结构体中的设备地址不包含读写标志位,读写信息由flags成员变量的读写控制位传递。 ->- 本函数不对消息结构体个数count做限制,其最大个数度由具体I2C控制器决定。 ->- 本函数也不对每个消息结构体中的数据长度做限制,同样由具体I2C控制器决定。 ->- 本函数可能会引起系统休眠,不允许在中断上下文调用 - -### 关闭I2C控制器 - -I2C通信完成之后,需要关闭I2C控制器,关闭函数如下所示: - -void I2cClose\(DevHandle handle\); - -**表 4** I2cClose参数和返回值描述 - - - - - - - - - - -

参数

-

参数描述

-

handle

-

I2C控制器设备句柄

-
- -``` -I2cClose(i2cHandle); /* 关闭I2C控制器 */ -``` - -## 使用实例 - -本例程以操作开发板上的I2C设备为例,详细展示I2C接口的完整使用流程。 - -本例拟对Hi3516DV300某开发板上TouchPad设备进行简单的寄存器读写访问,基本硬件信息如下: - -- SOC:hi3516dv300。 - -- Touch IC:I2C地址为0x38, IC内部寄存器位宽为1字节。 - -- 原理图信息:TouchPad设备挂接在3号I2C控制器下;IC的复位管脚为3号GPIO。 - -本例程首先对Touch IC进行复位操作(开发板上电默认会给TouchIC供电,本例程不考虑供电),然后对其内部寄存器进行随机读写,测试I2C通路是否正常。 - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->本例程重点在于展示I2C设备访问流程,并验证I2C通路,所以对于设备寄存器读写值不做关注,读写寄存器导致的行为由设备自身决定。 - -示例如下: - -``` -#include "i2c_if.h" /* I2C标准接口头文件 */ -#include "gpio_if.h" /* GPIO标准接口头文件 */ -#include "hdf_log.h" /* 标准日志打印头文件 */ -#include "osal_io.h" /* 标准IO读写接口头文件 */ -#include "osal_time.h" /* 标准延迟&睡眠接口头文件 */ - -/* 定义一个表示TP设备的结构体,存储i2c及gpio相关硬件信息 */ -struct TpI2cDevice { - uint16_t rstGpio; /* 复位管脚 */ - uint16_t busId; /* I2C总线号 */ - uint16_t addr; /* I2C设备地址 */ - uint16_t regLen; /* 寄存器字节宽度 */ - DevHandle i2cHandle; /* I2C控制器句柄 */ -}; - -/* I2C管脚io配置,需要查阅SOC寄存器手册 */ -#define I2C3_DATA_REG_ADDR 0x112f008c /* 3号I2C控制器SDA管脚配置寄存器地址 */ -#define I2C3_CLK_REG_ADDR 0x112f0090 /* 3号I2C控制器SCL管脚配置寄存器地址 */ -#define I2C_REG_CFG 0x5f1 /* 3号I2C控制器SDA及SCL管脚配置值 */ - -static void TpSocIoCfg(void) -{ - /* 将3号I2C控制器对应两个管脚的IO功能设置为I2C */ - OSAL_WRITEL(I2C_REG_CFG, IO_DEVICE_ADDR(I2C3_DATA_REG_ADDR)); - OSAL_WRITEL(I2C_REG_CFG, IO_DEVICE_ADDR(I2C3_CLK_REG_ADDR)); -} - -/* 对TP的复位管脚进行初始化, 拉高维持20ms, 再拉底维持50ms,最后再拉高维持20ms, 完成复位动作 */ -static int32_t TestCaseGpioInit(struct TpI2cDevice *tpDevice) -{ - int32_t ret; - - /* 设置复位管脚方向为输出 */ - ret = GpioSetDir(tpDevice->rstGpio, GPIO_DIR_OUT); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: set rst dir fail!:%d", __func__, ret); - return ret; - } - - ret = GpioWrite(tpDevice->rstGpio, GPIO_VAL_HIGH); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: set rst hight fail!:%d", __func__, ret); - return ret; - } - OsalMSleep(20); - - ret = GpioWrite(tpDevice->rstGpio, GPIO_VAL_LOW); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: set rst low fail!:%d", __func__, ret); - return ret; - } - OsalMSleep(50); - - ret = GpioWrite(tpDevice->rstGpio, GPIO_VAL_HIGH); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: set rst high fail!:%d", __func__, ret); - return ret; - } - OsalMSleep(20); - - return HDF_SUCCESS; -} - -/* 基于I2cTransfer方法封装一个寄存器读写的辅助函数, 通过flag表示读或写 */ -static int TpI2cReadWrite(struct TpI2cDevice *tpDevice, unsigned int regAddr, - unsigned char *regData, unsigned int dataLen, uint8_t flag) -{ - int index = 0; - unsigned char regBuf[4] = {0}; - struct I2cMsg msgs[2] = {0}; - - /* 单双字节寄存器长度适配 */ - if (tpDevice->regLen == 1) { - regBuf[index++] = regAddr & 0xFF; - } else { - regBuf[index++] = (regAddr >> 8) & 0xFF; - regBuf[index++] = regAddr & 0xFF; - } - - /* 填充I2cMsg消息结构 */ - msgs[0].addr = tpDevice->addr; - msgs[0].flags = 0; /* 标记为0,表示写入 */ - msgs[0].len = tpDevice->regLen; - msgs[0].buf = regBuf; - - msgs[1].addr = tpDevice->addr; - msgs[1].flags = (flag == 1) ? I2C_FLAG_READ : 0; /* 添加读标记位,表示读取 */ - msgs[1].len = dataLen; - msgs[1].buf = regData; - - if (I2cTransfer(tpDevice->i2cHandle, msgs, 2) != 2) { - HDF_LOGE("%s: i2c read err", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -/* TP寄存器读函数 */ -static inline int TpI2cReadReg(struct TpI2cDevice *tpDevice, unsigned int regAddr, - unsigned char *regData, unsigned int dataLen) -{ - return TpI2cReadWrite(tpDevice, regAddr, regData, dataLen, 1); -} - -/* TP寄存器写函数 */ -static inline int TpI2cWriteReg(struct TpI2cDevice *tpDevice, unsigned int regAddr, - unsigned char *regData, unsigned int dataLen) -{ - return TpI2cReadWrite(tpDevice, regAddr, regData, dataLen, 0); -} - -/* I2C例程总入口 */ -static int32_t TestCaseI2c(void) -{ - int32_t i; - int32_t ret; - unsigned char bufWrite[7] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xA, 0xB, 0xC }; - unsigned char bufRead[7] = {0}; - static struct TpI2cDevice tpDevice; - - /* IO管脚功能配置 */ - TpSocIoCfg(); - - /* TP设备信息初始化 */ - tpDevice.rstGpio = 3; - tpDevice.busId = 3; - tpDevice.addr = 0x38; - tpDevice.regLen = 1; - tpDevice.i2cHandle = NULL; - - /* GPIO管脚初始化 */ - ret = TestCaseGpioInit(&tpDevice); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gpio init fail!:%d", __func__, ret); - return ret; - } - - /* 打开I2C控制器 */ - tpDevice.i2cHandle = I2cOpen(tpDevice.busId); - if (tpDevice.i2cHandle == NULL) { - HDF_LOGE("%s: Open I2c:%u fail!", __func__, tpDevice.busId); - return -1; - } - - /* 向TP-IC的0xD5寄存器连续写7字节数据 */ - ret = TpI2cWriteReg(&tpDevice, 0xD5, bufWrite, 7); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: tp i2c write reg fail!:%d", __func__, ret); - I2cClose(tpDevice.i2cHandle); - return -1; - } - OsalMSleep(10); - - /* 从TP-IC的0xD5寄存器连续读7字节数据 */ - ret = TpI2cReadReg(&tpDevice, 0xD5, bufRead, 7); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: tp i2c read reg fail!:%d", __func__, ret); - I2cClose(tpDevice.i2cHandle); - return -1; - } - - HDF_LOGE("%s: tp i2c write&read reg success!", __func__); - for (i = 0; i < 7; i++) { - HDF_LOGE("%s: bufRead[%d] = 0x%x", __func__, i, bufRead[i]); - } - - /* 访问完毕关闭I2C控制器 */ - I2cClose(tpDevice.i2cHandle); - return ret; -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/04.SDIO.md" "b/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/04.SDIO.md" deleted file mode 100644 index bf125206a8b6af533bb54b5fb98e3f281f08b8a0..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/04.SDIO.md" +++ /dev/null @@ -1,1081 +0,0 @@ ---- -title: SDIO -permalink: /pages/00030103 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# SDIO - -- [概述](#section1155271783811) - - [接口说明](#section08064247248) - -- [使用指导](#section1878939192515) - - [使用流程](#section1490685512255) - - [打开SDIO控制器](#section10782428132616) - - [独占HOST](#section11263172312715) - - [使能SDIO设备](#section17861486271) - - [注册SDIO中断](#section521213262286) - - [进行SDIO通信](#section85661522153420) - - [释放SDIO中断](#section1683449352) - - [去使能SDIO设备](#section15379324143611) - - [释放HOST](#section536018263713) - - [关闭SDIO控制器](#section4752739183716) - -- [使用实例](#section376910122382) - -## 概述 - -- SDIO是安全数字输入输出接口(Secure Digital Input and Output)的缩写,是从SD内存卡接口的基础上演化出来的一种外设接口。SDIO接口兼容以前的SD内存卡,并且可以连接支持SDIO接口的设备。 -- SDIO的应用比较广泛,目前,有许多手机都支持SDIO功能,并且很多SDIO外设也被开发出来,使得手机外接外设更加容易。常见的SDIO外设有WLAN、GPS、CAMERA、蓝牙等。 -- SDIO总线有两端,其中一端是主机端(HOST),另一端是设备端(DEVICE)。所有的通信都是由HOST端发出命令开始的,在DEVICE端只要能解析HOST的命令,就可以同HOST进行通信了。SDIO的HOST可以连接多个DEVICE,如下图所示: - - - CLK信号:HOST给DEVICE的时钟信号。 - - VDD信号:电源信号。 - - VSS信号:Ground信号。 - - D0-3信号:4条数据线,其中,DAT1信号线复用为中断线,在1BIT模式下DAT0用来传输数据,在4BIT模式下DAT0-DAT3用来传输数据。 - - CMD信号:用于HOST发送命令和DEVICE回复响应。 - - **图 1** SDIO的HOST-DEVICE连接示意图 - - - ![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001054280608.png) - -- SDIO接口定义了操作SDIO的通用方法集合,包括打开/关闭SDIO控制器、独占/释放HOST、使能/去使能设备、申请/释放中断、读写、获取/设置公共信息等。 - -### 接口说明 - -**表 1** SDIO驱动API接口功能介绍 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

SDIO设备打开/关闭接口

-

SdioOpen

-

打开指定总线号的SDIO控制器

-

SdioClose

-

关闭SDIO控制器

-

SDIO读写接口

-

SdioReadBytes

-

从指定地址开始,增量读取指定长度的数据

-

SdioWriteBytes

-

从指定地址开始,增量写入指定长度的数据

-

SdioReadBytesFromFixedAddr

-

从固定地址读取指定长度的数据

-

SdioWriteBytesToFixedAddr

-

向固定地址写入指定长度的数据

-

SdioReadBytesFromFunc0

-

从SDIO function 0的指定地址空间读取指定长度的数据

-

SdioWriteBytesToFunc0

-

向SDIO function 0的指定地址空间写入指定长度的数据

-

SDIO设置块大小接口

-

SdioSetBlockSize

-

设置块的大小

-

SDIO获取/设置公共信息接口

-

SdioGetCommonInfo

-

获取公共信息

-

SdioSetCommonInfo

-

设置公共信息

-

SDIO刷新数据接口

-

SdioFlushData

-

刷新数据

-

SDIO独占/释放HOST接口

-

SdioClaimHost

-

独占Host

-

SdioReleaseHost

-

释放Host

-

SDIO使能/去使能功能设备接口

-

SdioEnableFunc

-

使能SDIO功能设备

-

SdioDisableFunc

-

去使能SDIO功能设备

-

SDIO申请/释放中断接口

-

SdioClaimIrq

-

申请中断

-

SdioReleaseIrq

-

释放中断

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->本文涉及的所有接口,目前只支持在内核态使用,不支持在用户态使用。 - -## 使用指导 - -### 使用流程 - -使用SDIO的一般流程如[图2](#fig1343742311264)所示。 - -**图 2** SDIO使用流程图 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123540984.png) - -### 打开SDIO控制器 - -在使用SDIO进行通信前,首先要调用SdioOpen获取SDIO控制器的设备句柄,该函数会返回指定总线号的SDIO控制器的设备句柄。 - -DevHandle SdioOpen\(int16\_t mmcBusNum, struct SdioFunctionConfig \*config\); - -**表 2** SdioOpen函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

mmcBusNum

-

总线号

-

config

-

SDIO功能配置信息

-

返回值

-

返回值描述

-

NULL

-

获取SDIO控制器的设备句柄失败

-

设备句柄

-

SDIO控制器的设备句柄

-
- -打开SDIO控制器的示例如下: - -``` -DevHandle handle = NULL; -struct SdioFunctionConfig config; -config.funcNr = 1; -config.vendorId = 0x123; -config.deviceId = 0x456; -/* 打开总线号为1的SDIO控制器 */ -handle = SdioOpen(1, &config); -if (handle == NULL) { - HDF_LOGE("SdioOpen: failed!\n"); -} -``` - -### 独占HOST - -获取到SDIO控制器的设备句柄之后,需要先独占HOST才能进行SDIO后续的一系列操作,独占HOST函数如下所示: - -void SdioClaimHost\(DevHandle handle\); - -**表 3** SdioClaimHost函数的参数描述 - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-
- -独占HOST示例如下: - -``` -SdioClaimHost(handle); /* 独占HOST */ -``` - -### 使能SDIO设备 - -在访问寄存器之前,需要先使能SDIO设备,使能SDIO设备的函数如下所示: - -int32\_t SdioEnableFunc\(DevHandle handle\); - -**表 4** SdioEnableFunc函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-

返回值

-

返回值描述

-

0

-

SDIO使能成功

-

负数

-

SDIO使能失败

-
- -使能SDIO设备的示例如下: - -``` -int32_t ret; -/* 使能SDIO设备 */ -ret = SdioEnableFunc(handle); -if (ret != 0) { - HDF_LOGE("SdioEnableFunc: failed, ret %d\n", ret); -} -``` - -### 注册SDIO中断 - -在通信之前,还需要注册SDIO中断,注册SDIO中断函数如下图所示: - -int32\_t SdioClaimIrq\(DevHandle handle, SdioIrqHandler \*handler\); - -**表 5** SdioClaimIrq函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-

handler

-

中断服务函数指针

-

返回值

-

返回值描述

-

0

-

注册中断成功

-

负数

-

注册中断失败

-
- -注册SDIO中的示例如下: - -``` -/* 中断服务函数需要根据各自平台的情况去实现 */ -static void SdioIrqFunc(void *data) -{ - if (data == NULL) { - HDF_LOGE("SdioIrqFunc: data is NULL.\n"); - return; - } - /* 需要开发者自行添加具体实现 */ -} - -int32_t ret; -/* 注册SDIO中断 */ -ret = SdioClaimIrq(handle, SdioIrqFunc); -if (ret != 0) { - HDF_LOGE("SdioClaimIrq: failed, ret %d\n", ret); -} -``` - -### 进行SDIO通信 - -- 向SDIO设备增量写入指定长度的数据 - -对应的接口函数如下所示: - -int32\_t SdioWriteBytes\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); - -**表 6** SdioWriteBytes函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-

data

-

待写入数据的指针

-

addr

-

待写入数据的起始地址

-

size

-

待写入数据的长度

-

返回值

-

返回值描述

-

0

-

SDIO写数据成功

-

负数

-

SDIO写数据失败

-
- -向SDIO设备增量写入指定长度的数据的示例如下: - -``` -int32_t ret; -uint8_t wbuff[] = {1,2,3,4,5}; -uint32_t addr = 0x100 + 0x09; -/* 向SDIO设备起始地址0x109,增量写入5个字节的数据 */ -ret = SdioWriteBytes(handle, wbuff, addr, sizeof(wbuff) / sizeof(wbuff[0])); -if (ret != 0) { - HDF_LOGE("SdioWriteBytes: failed, ret %d\n", ret); -} -``` - -- 从SDIO设备增量读取指定长度的数据 - -对应的接口函数如下所示: - -int32\_t SdioReadBytes\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); - -**表 7** SdioReadBytes函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-

data

-

接收读取数据的指针

-

addr

-

待读取数据的起始地址

-

size

-

待读取数据的长度

-

返回值

-

返回值描述

-

0

-

SDIO读数据成功

-

负数

-

SDIO读数据失败

-
- -从SDIO设备增量读取指定长度的数据的示例如下: - -``` -int32_t ret; -uint8_t rbuff[5] = {0}; -uint32_t addr = 0x100 + 0x09; -/* 从SDIO设备起始地址0x109,增量读取5个字节的数据 */ -ret = SdioReadBytes(handle, rbuff, addr, 5); -if (ret != 0) { - HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret); -} -``` - -- 向SDIO设备的固定地址写入指定长度的数据 - - 对应的接口函数如下所示: - - int32\_t SdioWriteBytesToFixedAddr\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size, uint32\_t scatterLen\); - - **表 8** SdioWriteBytesToFixedAddr函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-

data

-

待写入数据的指针

-

addr

-

待写入数据的固定地址

-

size

-

待写入数据的长度

-

scatterLen

-

集散表的长度。如果该字段不为0,则data为集散表类型。

-

返回值

-

返回值描述

-

0

-

SDIO写数据成功

-

负数

-

SDIO写数据失败

-
- - 向SDIO设备的固定地址写入指定长度的数据的示例如下: - - ``` - int32_t ret; - uint8_t wbuff[] = {1,2,3,4,5}; - uint32_t addr = 0x100 + 0x09; - /* 向SDIO设备固定地址0x109写入5个字节的数据 */ - ret = SdioWriteBytesToFixedAddr(handle, wbuff, addr, sizeof(wbuff) / sizeof(wbuff[0]), 0); - if (ret != 0) { - HDF_LOGE("SdioWriteBytesToFixedAddr: failed, ret %d\n", ret); - } - ``` - -- 从SDIO设备的固定地址读取指定长度的数据 - - 对应的接口函数如下所示: - - int32\_t SdioReadBytesFromFixedAddr\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size, uint32\_t scatterLen\); - - **表 9** SdioReadBytesFromFixedAddr函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-

data

-

接收读取数据的指针

-

addr

-

待读取数据的起始地址

-

size

-

待读取数据的长度

-

scatterLen

-

集散表的长度。如果该字段不为0,则data为集散表类型。

-

返回值

-

返回值描述

-

0

-

SDIO读数据成功

-

负数

-

SDIO读数据失败

-
- - 从SDIO设备的固定地址读取指定长度的数据的示例如下: - - ``` - int32_t ret; - uint8_t rbuff[5] = {0}; - uint32_t addr = 0x100 + 0x09; - /* 从SDIO设备固定地址0x109中读取5个字节的数据 */ - ret = SdioReadBytesFromFixedAddr(handle, rbuff, addr, 5, 0); - if (ret != 0) { - HDF_LOGE("SdioReadBytesFromFixedAddr: failed, ret %d\n", ret); - } - ``` - - -- 向SDIO function 0的指定地址空间写入指定长度的数据 - -当前只支持写入一个字节的数据,对应的接口函数如下所示: - -int32\_t SdioWriteBytesToFunc0\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); - -**表 10** SdioWriteBytesToFunc0函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-

data

-

待写入数据的指针

-

addr

-

待写入数据的起始地址

-

size

-

待写入数据的长度

-

返回值

-

返回值描述

-

0

-

SDIO写数据成功

-

负数

-

SDIO写数据失败

-
- -向SDIO function 0的指定地址空间写入指定长度的数据的示例如下: - -``` -int32_t ret; -uint8_t wbuff = 1; -/* 向SDIO function 0地址0x2中写入1字节的数据 */ -ret = SdioWriteBytesToFunc0(handle, &wbuff, 0x2, 1); -if (ret != 0) { - HDF_LOGE("SdioWriteBytesToFunc0: failed, ret %d\n", ret); -} -``` - -- 从SDIO function 0的指定地址空间读取指定长度的数据 - -当前只支持读取一个字节的数据,对应的接口函数如下所示: - -int32\_t SdioReadBytesFromFunc0\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); - -**表 11** SdioReadBytesFromFunc0函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-

data

-

接收读取数据的指针

-

addr

-

待读取数据的起始地址

-

size

-

待读取数据的长度

-

返回值

-

返回值描述

-

0

-

SDIO读数据成功

-

负数

-

SDIO读数据失败

-
- -从SDIO function 0的指定地址空间读取指定长度的数据的示例如下: - -``` -int32_t ret; -uint8_t rbuff; -/* 从SDIO function 0设备地址0x2中读取1字节的数据 */ -ret = SdioReadBytesFromFunc0(handle, &rbuff, 0x2, 1); -if (ret != 0) { - HDF_LOGE("SdioReadBytesFromFunc0: failed, ret %d\n", ret); -} -``` - -### 释放SDIO中断 - -通信完成之后,需要释放SDIO中断,函数如下所示: - -int32\_t SdioReleaseIrq\(DevHandle handle\); - -**表 12** SdioReleaseIrq函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-

返回值

-

返回值描述

-

0

-

释放SDIO中断成功

-

负数

-

释放SDIO中断失败

-
- -释放SDIO中断的示例如下: - -``` -int32_t ret; -/* 释放SDIO中断 */ -ret = SdioReleaseIrq(handle); -if (ret != 0) { - HDF_LOGE("SdioReleaseIrq: failed, ret %d\n", ret); -} -``` - -### 去使能SDIO设备 - -通信完成之后,还需要去使能SDIO设备,函数如下所示: - -int32\_t SdioDisableFunc\(DevHandle handle\); - -**表 13** SdioDisableFunc函数的参数和返回值描述 - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-

返回值

-

返回值描述

-

0

-

去使能SDIO设备成功

-

负数

-

去使能SDIO设备失败

-
- -去使能SDIO设备的示例如下: - -``` -int32_t ret; -/* 去使能SDIO设备 */ -ret = SdioDisableFunc(handle); -if (ret != 0) { - HDF_LOGE("SdioDisableFunc: failed, ret %d\n", ret); -} -``` - -### 释放HOST - -通信完成之后,还需要释放去HOST,函数如下所示: - -void SdioReleaseHost\(DevHandle handle\); - -**表 14** SdioReleaseHost函数的参数描述 - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-
- -释放HOST的示例如下: - -``` -SdioReleaseHost(handle); /* 释放HOST */ -``` - -### 关闭SDIO控制器 - -SDIO通信完成之后,最后需要关闭SDIO控制器,函数如下所示: - -void SdioClose\(DevHandle handle\); - -该函数会释放掉申请的资源。 - -**表 15** SdioClose函数的参数描述 - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SDIO控制器的设备句柄

-
- -关闭SDIO控制器的示例如下: - -``` -SdioClose(handle); /* 关闭SDIO控制器 */ -``` - -## 使用实例 - -SDIO设备完整的使用示例如下所示,首先打开总线号为1的SDIO控制器,然后独占HOST、使能设备、注册中断,接着进行SDIO通信(读写等),通信完成之后,释放中断、去使能设备、释放HOST,最后关闭SDIO控制器。 - -``` -#include "hdf_log.h" -#include "sdio_if.h" - -#define TEST_FUNC_NUM 1 /* 本测试用例中,使用编号为1的I/O function */ -#define TEST_FBR_BASE_ADDR 0x100 /* 编号为1的I/O function的FBR基地址 */ -#define TEST_ADDR_OFFSET 9 /* 本测试用例中,需要读写的寄存器的地址偏移 */ -#define TEST_DATA_LEN 3 /* 本测试用例中,读写数据的长度 */ -#define TEST_BLOCKSIZE 2 /* 本测试用例中,数据块的大小,单位字节 */ - -/* 中断服务函数,需要根据各自平台的情况去实现 */ -static void SdioIrqFunc(void *data) -{ - if (data == NULL) { - HDF_LOGE("SdioIrqFunc: data is NULL.\n"); - return; - } - /* 需要开发者自行添加具体的实现 */ -} - -void SdioTestSample(void) -{ - int32_t ret; - DevHandle handle = NULL; - uint8_t data[TEST_DATA_LEN] = {0}; - struct SdioFunctionConfig config = {1, 0x123, 0x456}; - uint8_t val; - uint32_t addr; - - /* 打开总线号为1的SDIO设备 */ - handle = SdioOpen(1, &config); - if (handle == NULL) { - HDF_LOGE("SdioOpen: failed!\n"); - return; - } - /* 独占HOST */ - SdioClaimHost(handle); - /* 使能SDIO设备 */ - ret = SdioEnableFunc(handle); - if (ret != 0) { - HDF_LOGE("SdioEnableFunc: failed, ret %d\n", ret); - goto ENABLE_ERR; - } - /* 注册中断 */ - ret = SdioClaimIrq(handle, SdioIrqFunc); - if (ret != 0) { - HDF_LOGE("SdioClaimIrq: failed, ret %d\n", ret); - goto CLAIM_IRQ_ERR; - } - /* 设置块大小为2字节 */ - ret = SdioSetBlockSize(handle, TEST_BLOCKSIZE); - if (ret != 0) { - HDF_LOGE("SdioSetBlockSize: failed, ret %d\n", ret); - goto COMM_ERR; - } - /* 从SDIO设备增量地址读取3字节的数据 */ - addr = TEST_FBR_BASE_ADDR * TEST_FUNC_NUM + TEST_ADDR_OFFSET; - ret = SdioReadBytes(handle, data, addr, TEST_DATA_LEN); - if (ret != 0) { - HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret); - goto COMM_ERR; - } - /* 向SDIO设备增量地址写入3字节的数据 */ - ret = SdioWriteBytes(handle, data, addr, TEST_DATA_LEN); - if (ret != 0) { - HDF_LOGE("SdioWriteBytes: failed, ret %d\n", ret); - goto COMM_ERR; - } - /* 从SDIO设备读取1字节的数据 */ - ret = SdioReadBytes(handle, &val, addr, 1); - if (ret != 0) { - HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret); - goto COMM_ERR; - } - /* 向SDIO设备写入1字节的数据 */ - ret = SdioWriteBytes(handle, &val, addr, 1); - if (ret != 0) { - HDF_LOGE("SdioWriteBytes: failed, ret %d\n", ret); - goto COMM_ERR; - } - /* 从SDIO设备固定地址读取3字节的数据 */ - ret = SdioReadBytesFromFixedAddr(handle, data, addr, TEST_DATA_LEN, 0); - if (ret != 0) { - HDF_LOGE("SdioReadBytesFromFixedAddr: failed, ret %d\n", ret); - goto COMM_ERR; - } - /* 向SDIO设备固定地址写入1字节的数据 */ - ret = SdioWriteBytesToFixedAddr(handle, data, addr, 1, 0); - if (ret != 0) { - HDF_LOGE("SdioWriteBytesToFixedAddr: failed, ret %d\n", ret); - goto COMM_ERR; - } - /* 从SDIO function 0读取1字节的数据 */ - addr = 0x02; - ret = SdioReadBytesFromFunc0(handle, &val, addr, 1); - if (ret != 0) { - HDF_LOGE("SdioReadBytesFromFunc0: failed, ret %d\n", ret); - goto COMM_ERR; - } - /* 向SDIO function 0写入1字节的数据 */ - ret = SdioWriteBytesToFunc0(handle, &val, addr, 1); - if (ret != 0) { - HDF_LOGE("SdioWriteBytesToFunc0: failed, ret %d\n", ret); - goto COMM_ERR; - } -COMM_ERR: - /* 释放中断 */ - ret = SdioReleaseIrq(handle); - if (ret != 0) { - HDF_LOGE("SdioReleaseIrq: failed, ret %d\n", ret); - } -CLAIM_IRQ_ERR: - /* 去使能SDIO设备 */ - ret = SdioDisableFunc(handle); - if (ret != 0) { - HDF_LOGE("SdioDisableFunc: failed, ret %d\n", ret); - } -ENABLE_ERR: - /* 释放HOST */ - SdioReleaseHost(handle); - /* 关闭SDIO设备 */ - SdioClose(handle); -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/05.SPI.md" "b/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/05.SPI.md" deleted file mode 100644 index 8f778608d39356a933c4d159185736a18c5b1fdc..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/05.SPI.md" +++ /dev/null @@ -1,579 +0,0 @@ ---- -title: SPI -permalink: /pages/00030104 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# SPI - -- [概述](#section193356154511) - - [接口说明](#section232141411476) - -- [使用指导](#section71363452477) - - [使用流程](#section32846814820) - - [获取SPI设备句柄](#section1927265711481) - - [获取SPI设备属性](#section541133418493) - - [配置SPI设备属性](#section7870106145010) - - [进行SPI通信](#section13324155195013) - - [销毁SPI设备句柄](#section19661632135117) - -- [使用实例](#section06541058155120) - -## 概述 - -- SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线。 -- SPI是由Motorola公司开发,用于在主设备和从设备之间进行通信,常用于与闪存、实时时钟、传感器以及模数转换器等进行通信。 -- SPI以主从方式工作,通常有一个主设备和一个或者多个从设备。主设备和从设备之间一般用4根线相连,它们分别是: - - SCLK – 时钟信号,由主设备产生; - - MOSI – 主设备数据输出,从设备数据输入; - - MISO – 主设备数据输入,从设备数据输出; - - CS – 片选,从设备使能信号,由主设备控制。 - - -- 一个主设备和两个从设备的连接示意图如[图1](#fig15227181812587)所示,Device A和Device B共享主设备的SCLK、MISO和MOSI三根引脚,Device A的片选CS0连接主设备的CS0,Device B的片选CS1连接主设备的CS1。 - -**图 1** SPI主从设备连接示意图。 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123742254.png) - -- SPI通信通常由主设备发起,通过以下步骤完成一次通信: - -1. 通过CS选中要通信的从设备,在任意时刻,一个主设备上最多只能有一个从设备被选中。 -2. 通过SCLK给选中的从设备提供时钟信号。 -3. 基于SCLK时钟信号,主设备数据通过MOSI发送给从设备,同时通过MISO接收从设备发送的数据,完成通信。 - -- 根据SCLK时钟信号的CPOL(Clock Polarity,时钟极性)和CPHA(Clock Phase,时钟相位)的不同组合,SPI有以下四种工作模式: - - CPOL=0,CPHA=0 时钟信号idle状态为低电平,第一个时钟边沿采样数据。 - - CPOL=0,CPHA=1 时钟信号idle状态为低电平,第二个时钟边沿采样数据。 - - CPOL=1,CPHA=0 时钟信号idle状态为高电平,第一个时钟边沿采样数据。 - - CPOL=1,CPHA=1 时钟信号idle状态为高电平,第二个时钟边沿采样数据。 - - -- SPI接口定义了操作SPI设备的通用方法集合,包括: - - SPI设备句柄获取和释放。 - - SPI读写: 从SPI设备读取或写入指定长度数据。 - - SPI自定义传输:通过消息传输结构体执行任意读写组合过程。 - - SPI设备配置:获取和设置SPI设备属性。 - - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->当前只支持主机模式,不支持从机模式。 - -### 接口说明 - -**表 1** SPI驱动API接口功能介绍 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

SPI设备句柄获取释放接口

-

SpiOpen

-

获取SPI设备句柄

-

SpiClose

-

释放SPI设备句柄

-

SPI读写接口

-

SpiRead

-

读取指定长度的数据

-

SpiWrite

-

写入指定长度的数据

-

SpiTransfer

-

SPI数据传输接口

-

SPI设备配置接口

-

-

SpiSetCfg

-

根据指定参数,配置SPI设备

-

SpiGetCfg

-

获取SPI设备配置参数

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 - -## 使用指导 - -### 使用流程 - -使用SPI的一般流程如[图2](#fig23885455594)所示。 - -**图 2** SPI使用流程图 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123703482.png) - -### 获取SPI设备句柄 - -在使用SPI进行通信时,首先要调用SpiOpen获取SPI设备句柄,该函数会返回指定总线号和片选号的SPI设备句柄。 - -DevHandle SpiOpen\(const struct SpiDevInfo \*info\); - -**表 2** SpiOpen参数和返回值描述 - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

info

-

SPI设备描述符

-

返回值

-

返回值描述

-

NULL

-

获取SPI设备句柄失败

-

设备句柄

-

对应的SPI设备句柄

-
- -假设系统中的SPI设备总线号为0,片选号为0,获取该SPI设备句柄的示例如下: - -``` -struct SpiDevInfo spiDevinfo; /* SPI设备描述符 */ -DevHandle spiHandle = NULL; /* SPI设备句柄 */ -spiDevinfo.busNum = 0; /* SPI设备总线号 */ -spiDevinfo.csNum = 0; /* SPI设备片选号 */ - -/* 获取SPI设备句柄 */ -spiHandle = SpiOpen(&spiDevinfo); -if (spiHandle == NULL) { - HDF_LOGE("SpiOpen: failed\n"); - return; -} -``` - -### 获取SPI设备属性 - -在获取到SPI设备句柄之后,需要配置SPI设备属性。配置SPI设备属性之前,可以先获取SPI设备属性,获取SPI设备属性的函数如下所示: - -int32\_t SpiGetCfg\(DevHandle handle, struct SpiCfg \*cfg\); - -**表 3** SpiGetCfg参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SPI设备句柄

-

cfg

-

SPI设备配置参数

-

返回值

-

返回值描述

-

0

-

获取配置成功

-

负数

-

获取配置失败

-
- -``` -int32_t ret; -struct SpiCfg cfg = {0}; /* SPI配置信息*/ -ret = SpiGetCfg(spiHandle, &cfg); /* 获取SPI设备属性 */ -if (ret != 0) { - HDF_LOGE("SpiGetCfg: failed, ret %d\n", ret); -} -``` - -### 配置SPI设备属性 - -在获取到SPI设备句柄之后,需要配置SPI设备属性,配置SPI设备属性的函数如下所示: - -int32\_t SpiSetCfg\(DevHandle handle, struct SpiCfg \*cfg\); - -**表 4** SpiSetCfg参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SPI设备句柄

-

cfg

-

SPI设备配置参数

-

返回值

-

返回值描述

-

0

-

配置成功

-

负数

-

配置失败

-
- -``` -int32_t ret; -struct SpiCfg cfg = {0}; /* SPI配置信息*/ -cfg.mode = SPI_MODE_LOOP; /* 以回环模式进行通信 */ -cfg.transferMode = PAL_SPI_POLLING_TRANSFER; /* 以轮询的方式进行通信 */ -cfg.maxSpeedHz = 115200; /* 最大传输频率 */ -cfg.bitsPerWord = 8; /* 读写位宽为8个比特 */ -ret = SpiSetCfg(spiHandle, &cfg); /* 配置SPI设备属性 */ -if (ret != 0) { - HDF_LOGE("SpiSetCfg: failed, ret %d\n", ret); -} -``` - -### 进行SPI通信 - -- 向SPI设备写入指定长度的数据 - -如果只向SPI设备写一次数据,则可以通过以下函数完成: - -int32\_t SpiWrite\(DevHandle handle, uint8\_t \*buf, uint32\_t len\); - -**表 5** SpiWrite参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SPI设备句柄

-

buf

-

待写入数据的指针

-

len

-

待写入的数据长度

-

返回值

-

返回值描述

-

0

-

写入成功

-

负数

-

写入失败

-
- -``` -int32_t ret; -uint8_t wbuff[4] = {0x12, 0x34, 0x56, 0x78}; -/* 向SPI设备写入指定长度的数据 */ -ret = SpiWrite(spiHandle, wbuff, 4); -if (ret != 0) { - HDF_LOGE("SpiWrite: failed, ret %d\n", ret); -} -``` - -- 从SPI设备读取指定长度的数据 - -如果只读取一次数据,则可以通过以下函数完成: - -int32\_t SpiRead\(DevHandle handle, uint8\_t \*buf, uint32\_t len\); - -**表 6** SpiRead参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SPI设备句柄

-

buf

-

待读取数据的指针

-

len

-

待读取的数据长度

-

返回值

-

返回值描述

-

0

-

读取成功

-

负数

-

读取失败

-
- -``` -int32_t ret; -uint8_t rbuff[4] = {0}; -/* 从SPI设备读取指定长度的数据 */ -ret = SpiRead(spiHandle, rbuff, 4); -if (ret != 0) { - HDF_LOGE("SpiRead: failed, ret %d\n", ret); -} -``` - -- 自定义传输 - -如果需要发起一次自定义传输,则可以通过以下函数完成: - -int32\_t SpiTransfer\(DevHandle handle, struct SpiMsg \*msgs, uint32\_t count\); - -**表 7** SpiTransfer参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

SPI设备句柄

-

msgs

-

待传输数据的数组

-

count

-

msgs数组长度

-

返回值

-

返回值描述

-

0

-

执行成功

-

负数

-

执行失败

-
- -``` -int32_t ret; -uint8_t wbuff[1] = {0x12}; -uint8_t rbuff[1] = {0}; -struct SpiMsg msg; /* 自定义传输的消息*/ -msg.wbuf = wbuff; /* 写入的数据 */ -msg.rbuf = rbuff; /* 读取的数据 */ -msg.len = 1; /* 读取、写入数据的长度都是1 */ -msg.csChange = 1; /* 进行下一次传输前关闭片选 */ -msg.delayUs = 0; /* 进行下一次传输前不进行延时 */ -msg.speed = 115200; /* 本次传输的速度 */ -/* 进行一次自定义传输,传输的msg个数为1 */ -ret = SpiTransfer(spiHandle, &msg, 1); -if (ret != 0) { - HDF_LOGE("SpiTransfer: failed, ret %d\n", ret); -} -``` - -### 销毁SPI设备句柄 - -SPI通信完成之后,需要销毁SPI设备句柄,销毁SPI设备句柄的函数如下所示: - -void SpiClose\(DevHandle handle\); - -该函数会释放掉申请的资源。 - -**表 8** SpiClose参数描述 - - - - - - - - - -

参数

-

参数描述

-

handle

-

SPI设备句柄

-
- -``` -SpiClose(spiHandle); /* 销毁SPI设备句柄 */ -``` - -## 使用实例 - -SPI设备完整的使用示例如下所示,首先获取SPI设备句柄,然后配置SPI设备属性,接着调用读写接口进行数据传输,最后销毁SPI设备句柄。 - -``` -#include "hdf_log.h" -#include "spi_if.h" - -void SpiTestSample(void) -{ - int32_t ret; - struct SpiCfg cfg; /* SPI配置信息 */ - struct SpiDevInfo spiDevinfo; /* SPI设备描述符 */ - DevHandle spiHandle = NULL; /* SPI设备句柄 */ - struct SpiMsg msg; /* 自定义传输的消息 */ - uint8_t rbuff[4] = { 0 }; - uint8_t wbuff[4] = { 0x12, 0x34, 0x56, 0x78 }; - uint8_t wbuff2[4] = { 0xa1, 0xb2, 0xc3, 0xd4 }; - - spiDevinfo.busNum = 0; /* SPI设备总线号 */ - spiDevinfo.csNum = 0; /* SPI设备片选号 */ - spiHandle = SpiOpen(&spiDevinfo); /* 根据spiDevinfo获取SPI设备句柄 */ - if (spiHandle == NULL) { - HDF_LOGE("SpiOpen: failed\n"); - return; - } - /* 获取SPI设备属性 */ - ret = SpiGetCfg(spiHandle, &cfg); - if (ret != 0) { - HDF_LOGE("SpiGetCfg: failed, ret %d\n", ret); - goto err; - } - cfg.maxSpeedHz = 115200; /* 将最大时钟频率改为115200 */ - cfg.bitsPerWord = 8; /* 传输位宽改为8比特 */ - /* 配置SPI设备属性 */ - ret = SpiSetCfg(spiHandle, &cfg); - if (ret != 0) { - HDF_LOGE("SpiSetCfg: failed, ret %d\n", ret); - goto err; - } - /* 向SPI设备写入指定长度的数据 */ - ret = SpiWrite(spiHandle, wbuff, 4); - if (ret != 0) { - HDF_LOGE("SpiWrite: failed, ret %d\n", ret); - goto err; - } - /* 从SPI设备读取指定长度的数据 */ - ret = SpiRead(spiHandle, rbuff, 4); - if (ret != 0) { - HDF_LOGE("SpiRead: failed, ret %d\n", ret); - goto err; - } - msg.wbuf = wbuff2; /* 写入的数据 */ - msg.rbuf = rbuff; /* 读取的数据 */ - msg.len = 4; /* 读取写入数据的长度为4 */ - msg.csChange = 1; /* 进行下一次传输前关闭片选 */ - msg.delayUs = 0; /* 进行下一次传输前不进行延时 */ - msg.speed = 115200; /* 本次传输的速度 */ - /* 进行一次自定义传输,传输的msg个数为1 */ - ret = SpiTransfer(spiHandle, &msg, 1); - if (ret != 0) { - HDF_LOGE("SpiTransfer: failed, ret %d\n", ret); - goto err; - } -err: - /* 销毁SPI设备句柄 */ - SpiClose(spiHandle); -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/06.UART.md" "b/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/06.UART.md" deleted file mode 100644 index 288e4579f47180e8b9a930c747af91b4f7cdf7d0..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/06.UART.md" +++ /dev/null @@ -1,695 +0,0 @@ ---- -title: UART -permalink: /pages/00030105 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# UART - -- [概述](#section833012453535) - - [接口说明](#section1680292311549) - -- [使用指导](#section12779050105412) - - [使用流程](#section1858116395510) - - [获取UART设备句柄](#section124512065617) - - [UART设置波特率](#section86881004579) - - [UART获取波特率](#section897032965712) - - [UART设置设备属性](#section129141884588) - - [UART获取设备属性](#section18689637165812) - - [设置UART传输模式](#section72713435918) - - [向UART设备写入指定长度的数据](#section128001736155919) - - [从UART设备中读取指定长度的数据](#section92851601604) - - [销毁UART设备句柄](#section1477410521406) - -- [使用实例](#section35404241311) - -## 概述 - -- UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,是通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输。 -- UART应用比较广泛,常用于输出打印信息,也可以外接各种模块,如GPS、蓝牙等。 -- 两个UART设备的连接示意图如下,UART与其他模块一般用2线(图1)或4线(图2)相连,它们分别是: - - TX:发送数据端,和对端的RX相连; - - RX:接收数据端,和对端的TX相连; - - RTS:发送请求信号,用于指示本设备是否准备好,可接受数据,和对端CTS相连; - - CTS:允许发送信号,用于判断是否可以向对端发送数据,和对端RTS相连; - - **图 1** 2线UART设备连接示意图 - - - ![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001170262141.png) - - **图 2** 4线UART设备连接示意图 - - - ![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123582482.png) - - -- UART通信之前,收发双方需要约定好一些参数:波特率、数据格式(起始位、数据位、校验位、停止位)等。通信过程中,UART通过TX发送给对端数据,通过RX接收对端发送的数据。当UART接收缓存达到预定的门限值时,RTS变为不可发送数据,对端的CTS检测到不可发送数据,则停止发送数据。 -- UART接口定义了操作UART端口的通用方法集合,包括获取、释放设备句柄、读写数据、获取和设置波特率、获取和设置设备属性。 - -### 接口说明 - -**表 1** UART驱动API接口功能介绍 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

UART获取/释放设备句柄

-

-

UartOpen

-

UART获取设备句柄

-

UartClose

-

UART释放设备句柄

-

UART读写接口

-

-

UartRead

-

从UART设备中读取指定长度的数据

-

UartWrite

-

向UART设备中写入指定长度的数据

-

UART获取/设置波特率接口

-

UartGetBaud

-

UART获取波特率

-

UartSetBaud

-

UART设置波特率

-

UART获取/设置设备属性

-

-

UartGetAttribute

-

UART获取设备属性

-

UartSetAttribute

-

UART设置设备属性

-

UART设置传输模式

-

UartSetTransMode

-

UART设置传输模式

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 - -## 使用指导 - -### 使用流程 - -使用UART的一般流程如[图3](#fig1852173020185)所示。 - -**图 3** UART使用流程图 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001170227689.png) - -### 获取UART设备句柄 - -在使用UART进行通信时,首先要调用UartOpen获取UART设备句柄,该函数会返回指定端口号的UART设备句柄。 - -DevHandle UartOpen\(uint32\_t port\); - -**表 2** UartOpen参数和返回值描述 - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

port

-

UART设备号

-

返回值

-

返回值描述

-

NULL

-

获取UART设备句柄失败

-

设备句柄

-

UART设备句柄

-
- -假设系统中的UART端口号为3,获取该UART设备句柄的示例如下: - -``` -DevHandle handle = NULL; /* UART设备句柄 */ -uint32_t port = 3; /* UART设备端口号 */ -handle = UartOpen(port); -if (handle == NULL) { - HDF_LOGE("UartOpen: failed!\n"); - return; -} -``` - -### UART设置波特率 - -在通信之前,需要设置UART的波特率,设置波特率的函数如下所示: - -int32\_t UartSetBaud\(DevHandle handle, uint32\_t baudRate\); - -**表 3** UartSetBaud参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

UART设备句柄

-

baudRate

-

待设置的波特率值

-

返回值

-

返回值描述

-

0

-

UART设置波特率成功

-

负数

-

UART设置波特率失败

-
- -假设需要设置的UART波特率为9600,设置波特率的实例如下: - -``` -int32_t ret; -/* 设置UART波特率 */ -ret = UartSetBaud(handle, 9600); -if (ret != 0) { - HDF_LOGE("UartSetBaud: failed, ret %d\n", ret); -} -``` - -### UART获取波特率 - -设置UART的波特率后,可以通过获取波特率接口来查看UART当前的波特率,获取波特率的函数如下所示: - -int32\_t UartGetBaud\(DevHandle handle, uint32\_t \*baudRate\); - -**表 4** UartGetBaud参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

UART设备句柄

-

baudRate

-

接收波特率值的指针

-

返回值

-

返回值描述

-

0

-

UART获取波特率成功

-

负数

-

UART获取波特率失败

-
- -获取波特率的实例如下: - -``` -int32_t ret; -uint32_t baudRate; -/* 获取UART波特率 */ -ret = UartGetBaud(handle, &baudRate); -if (ret != 0) { - HDF_LOGE("UartGetBaud: failed, ret %d\n", ret); -} -``` - -### UART设置设备属性 - -在通信之前,需要设置UART的设备属性,设置设备属性的函数如下图所示: - -int32\_t UartSetAttribute\(DevHandle handle, struct UartAttribute \*attribute\); - -**表 5** UartSetAttribute参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

UART设备句柄

-

attribute

-

待设置的设备属性

-

返回值

-

返回值描述

-

0

-

UART设置设备属性成功

-

负数

-

UART设置设备属性失败

-
- -设置UART的设备属性的实例如下: - -``` -int32_t ret; -struct UartAttribute attribute; -attribute.dataBits = UART_ATTR_DATABIT_7; /* UART传输数据位宽,一次传输7个bit */ -attribute.parity = UART_ATTR_PARITY_NONE; /* UART传输数据无校检 */ -attribute.stopBits = UART_ATTR_STOPBIT_1; /* UART传输数据停止位为1位 */ -attribute.rts = UART_ATTR_RTS_DIS; /* UART禁用RTS */ -attribute.cts = UART_ATTR_CTS_DIS; /* UART禁用CTS */ -attribute.fifoRxEn = UART_ATTR_RX_FIFO_EN; /* UART使能RX FIFO */ -attribute.fifoTxEn = UART_ATTR_TX_FIFO_EN; /* UART使能TX FIFO */ -/* 设置UART设备属性 */ -ret = UartSetAttribute(handle, &attribute); -if (ret != 0) { - HDF_LOGE("UartSetAttribute: failed, ret %d\n", ret); -} -``` - -### UART获取设备属性 - -设置UART的设备属性后,可以通过获取设备属性接口来查看UART当前的设备属性,获取设备属性的函数如下图所示: - -int32\_t UartGetAttribute\(DevHandle handle, struct UartAttribute \*attribute\); - -**表 6** UartGetAttribute参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

UART设备句柄

-

attribute

-

接收UART设备属性的指针

-

返回值

-

返回值描述

-

0

-

UART获取设备属性成功

-

负数

-

UART获取设备属性失败

-
- -获取UART的设备属性的实例如下: - -``` -int32_t ret; -struct UartAttribute attribute; -/* 获取UART设备属性 */ -ret = UartGetAttribute(handle, &attribute); -if (ret != 0) { - HDF_LOGE("UartGetAttribute: failed, ret %d\n", ret); -} -``` - -### 设置UART传输模式 - -在通信之前,需要设置UART的传输模式,设置传输模式的函数如下图所示: - -int32\_t UartSetTransMode\(DevHandle handle, enum UartTransMode mode\); - -**表 7** UartSetTransMode参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

UART设备句柄

-

mode

-

待设置的传输模式,

-

返回值

-

返回值描述

-

0

-

UART设置传输模式成功

-

负数

-

UART设置传输模式失败

-
- -假设需要设置的UART传输模式为UART\_MODE\_RD\_BLOCK,设置传输模式的实例如下: - -``` -int32_t ret; -/* 设置UART传输模式 */ -ret = UartSetTransMode(handle, UART_MODE_RD_BLOCK); -if (ret != 0) { - HDF_LOGE("UartSetTransMode: failed, ret %d\n", ret); -} -``` - -### 向UART设备写入指定长度的数据 - -对应的接口函数如下所示: - -int32\_t UartWrite\(DevHandle handle, uint8\_t \*data, uint32\_t size\); - -**表 8** UartWrite参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

UART设备句柄

-

data

-

待写入数据的指针

-

size

-

待写入数据的长度

-

返回值

-

返回值描述

-

0

-

UART写数据成功

-

负数

-

UART写数据失败

-
- -写入指定长度数据的实例如下: - -``` -int32_t ret; -uint8_t wbuff[5] = {1, 2, 3, 4, 5}; -/* 向UART设备写入指定长度的数据 */ -ret = UartWrite(handle, wbuff, 5); -if (ret != 0) { - HDF_LOGE("UartWrite: failed, ret %d\n", ret); -} -``` - -### 从UART设备中读取指定长度的数据 - -对应的接口函数如下所示: - -int32\_t UartRead\(DevHandle handle, uint8\_t \*data, uint32\_t size\); - -**表 9** UartRead参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

UART设备句柄

-

data

-

接收读取数据的指针

-

size

-

待读取数据的长度

-

返回值

-

返回值描述

-

非负数

-

UART读取到的数据长度

-

负数

-

UART读取数据失败

-
- -读取指定长度数据的实例如下: - -``` -int32_t ret; -uint8_t rbuff[5] = {0}; -/* 从UART设备读取指定长度的数据 */ -ret = UartRead(handle, rbuff, 5); -if (ret < 0) { - HDF_LOGE("UartRead: failed, ret %d\n", ret); -} -``` - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** ->UART返回值为非负值,表示UART读取成功。若返回值等于0,表示UART无有效数据可以读取。若返回值大于0,表示实际读取到的数据长度,该长度小于或等于传入的参数size的大小,并且不超过当前正在使用的UART控制器规定的最大单次读取数据长度的值。 - -### 销毁UART设备句柄 - -UART通信完成之后,需要销毁UART设备句柄,函数如下所示: - -void UartClose\(DevHandle handle\); - -该函数会释放申请的资源。 - -**表 10** UartClose参数和返回值描述 - - - - - - - - - - -

参数

-

参数描述

-

handle

-

UART设备句柄

-
- -销毁UART设备句柄的实例如下: - -``` -UartClose(handle); /* 销毁UART设备句柄 * -``` - -## 使用实例 - -UART设备完整的使用示例如下所示,首先获取UART设备句柄,接着设置波特率、设备属性和传输模式,之后进行UART通信,最后销毁UART设备句柄。 - -``` -#include "hdf_log.h" -#include "uart_if.h" - -void UartTestSample(void) -{ - int32_t ret; - uint32_t port; - DevHandle handle = NULL; - uint8_t wbuff[5] = { 1, 2, 3, 4, 5 }; - uint8_t rbuff[5] = { 0 }; - struct UartAttribute attribute; - attribute.dataBits = UART_ATTR_DATABIT_7; /* UART传输数据位宽,一次传输7个bit */ - attribute.parity = UART_ATTR_PARITY_NONE; /* UART传输数据无校检 */ - attribute.stopBits = UART_ATTR_STOPBIT_1; /* UART传输数据停止位为1位 */ - attribute.rts = UART_ATTR_RTS_DIS; /* UART禁用RTS */ - attribute.cts = UART_ATTR_CTS_DIS; /* UART禁用CTS */ - attribute.fifoRxEn = UART_ATTR_RX_FIFO_EN; /* UART使能RX FIFO */ - attribute.fifoTxEn = UART_ATTR_TX_FIFO_EN; /* UART使能TX FIFO */ - /* UART设备端口号,要填写实际平台上的端口号 */ - port = 1; - /* 获取UART设备句柄 */ - handle = UartOpen(port); - if (handle == NULL) { - HDF_LOGE("UartOpen: failed!\n"); - return; - } - /* 设置UART波特率为9600 */ - ret = UartSetBaud(handle, 9600); - if (ret != 0) { - HDF_LOGE("UartSetBaud: failed, ret %d\n", ret); - goto _ERR; - } - /* 设置UART设备属性 */ - ret = UartSetAttribute(handle, &attribute); - if (ret != 0) { - HDF_LOGE("UartSetAttribute: failed, ret %d\n", ret); - goto _ERR; - } - /* 设置UART传输模式为非阻塞模式 */ - ret = UartSetTransMode(handle, UART_MODE_RD_NONBLOCK); - if (ret != 0) { - HDF_LOGE("UartSetTransMode: failed, ret %d\n", ret); - goto _ERR; - } - /* 向UART设备写入5字节的数据 */ - ret = UartWrite(handle, wbuff, 5); - if (ret != 0) { - HDF_LOGE("UartWrite: failed, ret %d\n", ret); - goto _ERR; - } - /* 从UART设备读取5字节的数据 */ - ret = UartRead(handle, rbuff, 5); - if (ret < 0) { - HDF_LOGE("UartRead: failed, ret %d\n", ret); - goto _ERR; - } -_ERR: - /* 销毁UART设备句柄 */ - UartClose(handle); -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/08.MIPI_DSI.md" "b/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/08.MIPI_DSI.md" deleted file mode 100644 index a73a199e47b8da9995664526a44cf84415dc2041..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/08.MIPI_DSI.md" +++ /dev/null @@ -1,567 +0,0 @@ ---- -title: MIPI_DSI -permalink: /pages/00030107 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# MIPI DSI - -- [概述](#section16806142183217) - - [接口说明](#section129611916132011) - -- [使用指导](#section037231715335) - - [使用流程](#section49299119344) - - [获取MIPI-DSI操作句柄](#section5126155683811) - - [MIPI-DSI相应配置](#section201164274344) - - [发送/回读控制指令](#section199401342173415) - - [释放MIPI-DSI操作句柄](#section161011610357) - -- [使用实例](#section17470126123520) - -## 概述 - -- DSI(Display Serial Interface)是由移动行业处理器接口联盟(Mobile Industry Processor Interface \(MIPI\) Alliance)制定的规范,旨在降低移动设备中显示控制器的成本。它以串行的方式发送像素数据或指令给外设\(通常是LCD或者类似的显示设备\),或从外设中读取状态信息或像素信息;它定义了主机、图像数据源和目标设备之间的串行总线和通信协议。 - -- MIPI-DSI具备高速模式和低速模式两种工作模式,全部数据通道都可以用于单向的高速传输,但只有第一个数据通道才可用于低速双向传输,从属端的状态信息、像素等是通过该数据通道返回。时钟通道专用于在高速传输数据的过程中传输同步时钟信号。 -- 图1显示了简化的DSI接口。从概念上看,符合DSI的接口与基于DBI-2和DPI-2标准的接口具有相同的功能。它向外围设备传输像素或命令数据,并且可以从外围设备读取状态或像素信息。主要区别在于,DSI对所有像素数据、命令和事件进行序列化,而在传统接口中,这些像素数据、命令和事件通常需要附加控制信号才能在并行数据总线上传输。 - - **图 1** DSI发送、接收接口 - ![](/images/zh-cn/device-dev/driver/figure/DSI发送-接收接口.png "DSI发送-接收接口") - - -### 接口说明 - -**表 1** MIPI-DSI API接口功能介绍 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

设置/获取当前MIPI-DSI相关配置

-

MipiDsiSetCfg

-

设置MIPI-DSI相关配置

-

MipiDsiGetCfg

-

获取当前MIPI-DSI相关配置

-

获取/释放MIPI-DSI操作句柄

-

MipiDsiOpen

-

获取MIPI-DSI操作句柄

-

MipiDsiClose

-

释放MIPI-DSI操作句柄

-

设置MIPI-DSI进入Low power模式/High speed模式

-

MipiDsiSetLpMode

-

设置MIPI-DSI进入Low power模式

-

MipiDsiSetHsMode

-

设置MIPI-DSI进入High speed模式

-

MIPI-DSI发送/回读指令

-

MipiDsiTx

-

MIPI-DSI发送相应指令的接口

-

MipiDsiRx

-

MIPI-DSI按期望长度回读的接口

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->本文涉及的所有接口,仅限内核态使用,不支持在用户态使用 - -## 使用指导 - -### 使用流程 - -使用MIPI-DSI的一般流程如[图2](#fig99821771782)所示。 - -**图 2** MIPI-DSI使用流程图 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123514210.png) - -### 获取MIPI-DSI操作句柄 - -在进行MIPI-DSI进行通信前,首先要调用MipiDsiOpen获取操作句柄,该函数会返回指定通道ID的操作句柄。 - -DevHandle MipiDsiOpen\(uint8\_t id\); - -**表 2** MipiDsiOpen的参数和返回值描述 - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

id

-

MIPI DSI通道ID

-

返回值

-

返回值描述

-

NULL

-

获取失败

-

设备句柄

-

获取到指令通道的操作句柄, 类型为DevHandle

-
- -假设系统中的MIPI-DSI通道为0,获取该通道操作句柄的示例如下: - -``` -DevHandle mipiDsiHandle = NULL; /* 设备句柄 */ -chnId = 0; /* MIPI-DSI通道ID */ - -/* 获取操作句柄 */ -mipiDsiHandle = MipiDsiOpen(chnId); -if (mipiDsiHandle == NULL) { - HDF_LOGE("MipiDsiOpen: failed\n"); - return; -} -``` - -### MIPI-DSI相应配置 - -- 写入MIPI-DSI配置 - -int32\_t MipiDsiSetCfg\(DevHandle handle, struct MipiCfg \*cfg\); - -**表 3** MipiDsiSetCfg的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

操作句柄

-

cfg

-

MIPI-DSI相应配置buf 指针

-

返回值

-

返回值描述

-

0

-

设置成功

-

负数

-

设置失败

-
- -``` -int32_t ret; -struct MipiCfg cfg = {0}; - -/* 当前对接的屏幕配置如下 */ -cfg.lane = DSI_4_LANES; -cfg.mode = DSI_CMD_MODE; -cfg.burstMode = VIDEO_NON_BURST_MODE_SYNC_EVENTS; -cfg.format = FORMAT_RGB_24_BIT; -cfg.pixelClk = 174; -cfg.phyDataRate = 384; -cfg.timingInfo.hsaPixels = 50; -cfg.timingInfo.hbpPixels = 55; -cfg.timingInfo.hlinePixels = 1200; -cfg.timingInfo.yResLines = 1800; -cfg.timingInfo.vbpLines = 33; -cfg.timingInfo.vsaLines = 76; -cfg.timingInfo.vfpLines = 120; -cfg.timingInfo.xResPixels = 1342; -/* 写入配置数据 */ -ret = MipiDsiSetCfg(g_handle, &cfg); -if (ret != 0) { - HDF_LOGE("%s: SetMipiCfg fail! ret=%d\n", __func__, ret); - return -1; -} -``` - -- 获取当前MIPI-DSI的配置 - -int32\_t MipiDsiGetCfg\(DevHandle handle, struct MipiCfg \*cfg\); - -**表 4** MipiDsiGetCfg的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

操作句柄

-

cfg

-

MIPI-DSI相应配置buf 指针

-

返回值

-

返回值描述

-

0

-

获取成功

-

负数

-

获取失败

-
- -``` -int32_t ret; -struct MipiCfg cfg; -memset(&cfg, 0, sizeof(struct MipiCfg)); -ret = MipiDsiGetCfg(g_handle, &cfg); -if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: GetMipiCfg fail!\n", __func__); - return HDF_FAILURE; -} -``` - -### 发送/回读控制指令 - -- 发送指令 - -int32\_t MipiDsiTx\(PalHandle handle, struct DsiCmdDesc \*cmd\); - -**表 5** MipiDsiTx的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

操作句柄

-

cmd

-

需要发送的指令数据指针

-

返回值

-

返回值描述

-

0

-

发送成功

-

负数

-

发送失败

-
- -``` -int32_t ret; -struct DsiCmdDesc *cmd = OsalMemCalloc(sizeof(struct DsiCmdDesc)); -if (cmd == NULL) { - return HDF_FAILURE; -} -cmd->dtype = DTYPE_DCS_WRITE; -cmd->dlen = 1; -cmd->payload = OsalMemCalloc(sizeof(uint8_t)); -if (cmd->payload == NULL) { - HdfFree(cmd); - return HDF_FAILURE; -} -*(cmd->payload) = DTYPE_GEN_LWRITE; -MipiDsiSetLpMode(mipiHandle); -ret = MipiDsiTx(mipiHandle, cmd); -MipiDsiSetHsMode(mipiHandle); -if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: PalMipiDsiTx fail! ret=%d\n", __func__, ret); - HdfFree(cmd->payload); - HdfFree(cmd); - return HDF_FAILURE; -} -HdfFree(cmd->payload); -HdfFree(cmd); -``` - -- 回读指令 - -int32\_t MipiDsiRx\(DevHandle handle, struct DsiCmdDesc \*cmd, uint32\_t readLen, uint8\_t \*out\); - -**表 6** MipiDsiRx的参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

操作句柄

-

cmd

-

需要回读的指令数据指针

-

readLen

-

期望回读的数据长度

-

out

-

回读的数据buf指针

-

返回值

-

返回值描述

-

0

-

获取成功

-

负数

-

获取失败

-
- -``` -int32_t ret; -uint8_t readVal = 0; - -struct DsiCmdDesc *cmdRead = OsalMemCalloc(sizeof(struct DsiCmdDesc)); -if (cmdRead == NULL) { - return HDF_FAILURE; -} -cmdRead->dtype = DTYPE_DCS_READ; -cmdRead->dlen = 1; -cmdRead->payload = OsalMemCalloc(sizeof(uint8_t)); -if (cmdRead->payload == NULL) { - HdfFree(cmdRead); - return HDF_FAILURE; -} -*(cmdRead->payload) = DDIC_REG_STATUS; -MipiDsiSetLpMode(g_handle); -ret = MipiDsiRx(g_handle, cmdRead, sizeof(readVal), &readVal); -MipiDsiSetHsMode(g_handle); -if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: MipiDsiRx fail! ret=%d\n", __func__, ret); - HdfFree(cmdRead->payload); - HdfFree(cmdRead); - return HDF_FAILURE; -} -HdfFree(cmdRead->payload); -HdfFree(cmdRead); -``` - -### 释放MIPI-DSI操作句柄 - -MIPI-DSI使用完成之后,需要释放操作句柄,释放句柄的函数如下所示: - -void MipiDsiClose\(DevHandle handle\); - -该函数会释放掉由MipiDsiOpen申请的资源。 - -**表 7** MipiDsiClose的参数和返回值描述 - - - - - - - - - - -

参数

-

参数描述

-

handle

-

MIPI-DSI操作句柄

-
- -``` -MipiDsiClose(mipiHandle); /* 释放掉MIPI-DSI操作句柄 */ -``` - -## 使用实例 - -MIPI-DSI完整的使用示例如下所示: - -``` -#include "hdf.h" -#include "mipi_dsi_if.h" - -void PalMipiDsiTestSample(void) -{ - uint8_t chnId; - int32_t ret; - DevHandle handle = NULL; - - /* 设备通道编号 */ - chnId = 0; - /* 获取操作句柄 */ - handle = MipiDsiOpen(chnId); - if (handle == NULL) { - HDF_LOGE("MipiDsiOpen: failed!\n"); - return; - } - /* 配置相应参数 */ - struct MipiCfg cfg = {0}; - cfg.lane = DSI_4_LANES; - cfg.mode = DSI_CMD_MODE; - cfg.burstMode = VIDEO_NON_BURST_MODE_SYNC_EVENTS; - cfg.format = FORMAT_RGB_24_BIT; - cfg.pixelClk = 174; - cfg.phyDataRate = 384; - cfg.timingInfo.hsaPixels = 50; - cfg.timingInfo.hbpPixels = 55; - cfg.timingInfo.hlinePixels = 1200; - cfg.timingInfo.yResLines = 1800; - cfg.timingInfo.vbpLines = 33; - cfg.timingInfo.vsaLines = 76; - cfg.timingInfo.vfpLines = 120; - cfg.timingInfo.xResPixels = 1342; - /* 写入配置数据 */ - ret = MipiDsiSetCfg(g_handle, &cfg); - if (ret != 0) { - HDF_LOGE("%s: SetMipiCfg fail! ret=%d\n", __func__, ret); - return; - } - /* 发送PANEL初始化指令 */ - struct DsiCmdDesc *cmd = OsalMemCalloc(sizeof(struct DsiCmdDesc)); - if (cmd == NULL) { - return; - } - cmd->dtype = DTYPE_DCS_WRITE; - cmd->dlen = 1; - cmd->payload = OsalMemCalloc(sizeof(uint8_t)); - if (cmd->payload == NULL) { - HdfFree(cmd); - return; - } - *(cmd->payload) = DTYPE_GEN_LWRITE; - MipiDsiSetLpMode(mipiHandle); - ret = MipiDsiTx(mipiHandle, cmd); - MipiDsiSetHsMode(mipiHandle); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: MipiDsiTx fail! ret=%d\n", __func__, ret); - HdfFree(cmd->payload); - HdfFree(cmd); - return; - } - HdfFree(cmd->payload); - HdfFree(cmd); - /* 回读panel状态寄存器 */ - uint8_t readVal = 0; - struct DsiCmdDesc *cmdRead = OsalMemCalloc(sizeof(struct DsiCmdDesc)); - if (cmdRead == NULL) { - return; - } - cmdRead->dtype = DTYPE_DCS_READ; - cmdRead->dlen = 1; - cmdRead->payload = OsalMemCalloc(sizeof(uint8_t)); - if (cmdRead->payload == NULL) { - HdfFree(cmdRead); - return; - } - *(cmdRead->payload) = DDIC_REG_STATUS; - MipiDsiSetLpMode(g_handle); - ret = MipiDsiRx(g_handle, cmdRead, sizeof(readVal), &readVal); - MipiDsiSetHsMode(g_handle); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: MipiDsiRx fail! ret=%d\n", __func__, ret); - HdfFree(cmdRead->payload); - HdfFree(cmdRead); - return; - } - HdfFree(cmdRead->payload); - HdfFree(cmdRead); - /* 释放MIPI DSI设备句柄 */ - MipiDsiClose(handle); -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/03.RTC.md" "b/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/03.RTC.md" deleted file mode 100644 index 260db1a2f842b56d37d5a8663875849a14dcf4ab..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/03.RTC.md" +++ /dev/null @@ -1,957 +0,0 @@ ---- -title: RTC -permalink: /pages/00030202 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# RTC - -- [概述](#section104842041574) - - [接口说明](#section3373340142215) - -- [使用指导](#section20636145604113) - - [使用流程](#section16919828134215) - - [创建RTC设备句柄](#section1131212144310) - - [销毁RTC设备句柄](#section10744117144314) - - [注册RTC定时报警回调函数](#section14839440184320) - - [操作RTC](#section161927578433) - -- [使用实例](#section1186111020456) - -## 概述 - -RTC\(real-time clock\)为操作系统中的实时时钟设备,为操作系统提供精准的实时时间和定时报警功能。当设备下电后,通过外置电池供电,RTC继续记录操作系统时间;设备上电后,RTC提供实时时钟给操作系统,确保断电后系统时间的连续性。 - -### 接口说明 - -**表 1** RTC设备API接口功能介绍 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

RTC句柄操作

-

RtcOpen

-

获取RTC设备驱动句柄

-

RtcClose

-

释放RTC设备驱动句柄

-

RTC时间操作接口

-

RtcReadTime

-

读RTC时间信息,包括年、月、星期、日、时、分、秒、毫秒

-

RtcWriteTime

-

写RTC时间信息,包括年、月、星期、日、时、分、秒、毫秒

-

RTC报警操作接口

-

RtcReadAlarm

-

读RTC报警时间信息

-

RtcWriteAlarm

-

写RTC报警时间信息

-

RtcRegisterAlarmCallback

-

注册报警超时回调函数

-

RtcAlarmInterruptEnable

-

使能/去使能RTC报警中断

-

RTC配置操作

-

RtcGetFreq

-

读RTC外接晶振频率

-

RtcSetFreq

-

配置RTC外接晶振频率

-

RtcReset

-

RTC复位

-

读写用户定义寄存器

-

RtcReadReg

-

读用户自定义寄存器

-

RtcWriteReg

-

写用户自定义寄存器

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 - -## 使用指导 - -### 使用流程 - -在操作系统启动过程中,驱动管理模块根据配置文件加载RTC驱动,RTC驱动会检测RTC器件并初始化驱动。 - -使用RTC设备的一般流程如[图1](#fig166181128151112)所示。 - -**图 1** RTC设备使用流程图 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123675706.png) - -### 创建RTC设备句柄 - -RTC驱动加载成功后,驱动开发者使用驱动框架提供的查询接口并调用RTC设备驱动接口。 - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->当前操作系统支持一个RTC设备。 - -DevHandle RtcOpen\(void\); - -**表 2** RtcOpen参数和返回值描述 - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

void

-

NA

-

返回值

-

返回值描述

-

handle

-

操作成功返回 指针类型

-

NULL

-

操作失败

-
- -``` -DevHandle handle = NULL; - -/* 获取RTC句柄 */ -handle = RtcOpen(); -if (handle == NULL) { - /* 错误处理 */ -} -``` - -### 销毁RTC设备句柄 - -销毁RTC设备句柄,系统释放对应的资源。 - -void RtcClose\(DevHandle handle\); - -**表 3** RtcClose参数描述 - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-
- -``` -/* 销毁RTC句柄 */ -RtcClose(handle); -``` - -### 注册RTC定时报警回调函数 - -系统启动后需要注册RTC定时报警回调函数,报警超时后触发回调函数。 - -int32\_t RtcRegisterAlarmCallback\(DevHandle handle, enum RtcAlarmIndex alarmIndex, RtcAlarmCallback cb\); - -**表 4** RtcRegisterAlarmCallback参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

alarmIndex

-

报警索引

-

cb

-

定时报警回调函数

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- -注册RTC\_ALARM\_INDEX\_A的定时报警处理函数, 示例如下: - -``` -/* 用户注册RTC定时报警回调函数的方法 */ -int32_t RtcAlarmACallback(enum RtcAlarmIndex alarmIndex) -{ - if (alarmIndex == RTC_ALARM_INDEX_A) { - /* 报警A的处理 */ - } else if (alarmIndex == RTC_ALARM_INDEX_B) { - /* 报警B的处理 */ - } else { - /* 错误处理 */ - } - return 0; -} -int32_t ret; -/* 注册报警A的定时回调函数 */ -ret = RtcRegisterAlarmCallback(handle, RTC_ALARM_INDEX_A, RtcAlarmACallback); -if (ret != 0) { - /* 错误处理 */ -} -``` - -### 操作RTC - -- 读取RTC时间。 - -系统从RTC读取时间信息,包括年、月、星期、日、时、分、秒、毫秒,则可以通过以下函数完成: - -int32\_t RtcReadTime\(DevHandle handle, struct RtcTime \*time\); - -**表 5** RtcReadTime参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

time

-

RTC读取时间信息,包括年、月、星期、日、时、分、秒、毫秒

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- -``` -int32_t ret; -struct RtcTime tm; - -/* 系统从RTC读取时间信息 */ -ret = RtcReadTime(handle, &tm); -if (ret != 0) { - /* 错误处理 */ -} -``` - -- 设置RTC时间 - -设置RTC时间,则可以通过以下函数完成: - -int32\_t RtcWriteTime\(DevHandle handle, struct RtcTime \*time\); - -**表 6** RtcWriteTime参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

time

-

写RTC时间信息,包括年、月、星期、日、时、分、秒、毫秒

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->RTC起始时间为UTC 1970/01/01 Thursday 00:00:00,年的最大取值按照用户器件手册要求计算配置,星期不用配置。 - -``` -int32_t ret; -struct RtcTime tm; - -/* 设置RTC时间为 UTC 2020/01/01 00:59:00 .000 */ -tm.year = 2020; -tm.month = 01; -tm.day = 01; -tm.hour= 00; -tm.minute = 59; -tm.second = 00; -tm.millisecond = 0; -/* 写RTC时间信息 */ -ret = RtcWriteTime(handle, &tm); -if (ret != 0) { - /* 错误处理 */ -} -``` - -- 读取RTC报警时间 - -如果需要读取定时报警时间,则可以通过以下函数完成: - -int32\_t RtcReadAlarm\(DevHandle handle, enum RtcAlarmIndex alarmIndex, struct RtcTime \*time\); - -**表 7** RtcReadAlarm参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

alarmIndex

-

报警索引

-

time

-

RTC报警时间信息,包括年、月、星期、日、时、分、秒、毫秒

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- -``` -int32_t ret; -struct RtcTime alarmTime; - -/* 读RTC_ALARM_INDEX_A索引的RTC定时报警时间信息 */ -ret = RtcReadAlarm(handle, RTC_ALARM_INDEX_A, &alarmTime); -if (ret != 0) { - /* 错误处理 */ -} -``` - -- 设置RTC报警时间 - -根据报警索引设置RTC报警时间,通过以下函数完成: - -int32\_t RtcWriteAlarm\(DevHandle handle, enum RtcAlarmIndex alarmIndex, struct RtcTime \*time\); - -**表 8** RtcWriteAlarm参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

alarmIndex

-

报警索引

-

time

-

RTC报警时间信息,包括年、月、星期、日、时、分、秒、毫秒

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->RTC起始时间为UTC 1970/01/01 Thursday 00:00:00,年的最大取值按照用户器件手册要求计算配置,星期不用配置。 - -``` -int32_t ret; -struct RtcTime alarmTime; - -/* 设置RTC报警时间为2020/01/01 00:59:59 .000 */ -alarmTime.year = 2020; -alarmTime.month = 01; -alarmTime.day = 01; -alarmTime.hour = 00; -alarmTime.minute = 59; -alarmTime.second = 59; -alarmTime.millisecond = 0; -/* 设置RTC_ALARM_INDEX_A索引的定时报警时间 */ -ret = RtcWriteAlarm(handle, RTC_ALARM_INDEX_A, &alarmTime); -if (ret != 0) { - /* 错误处理 */ -} -``` - -- 设置定时报警中断使能或去使能 - -在启动报警操作前,需要先设置报警中断使能,报警超时后会触发告警回调函数,可以通过以下函数完成: - -int32\_t RtcAlarmInterruptEnable\(DevHandle handle, enum RtcAlarmIndex alarmIndex, uint8\_t enable\); - -**表 9** RtcAlarmInterruptEnable参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

alarmIndex

-

报警索引

-

enable

-

RTC报警中断配置,1:使能,0:去使能

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- -``` -int32_t ret; - -/* 设置RTC报警中断使能 */ -ret = RtcAlarmInterruptEnable(handle, RTC_ALARM_INDEX_A, 1); -if (ret != 0) { - /* 错误处理 */ -} -``` - -- 读取RTC外频 - -读取RTC外接晶体振荡频率,可以通过以下函数完成: - -int32\_t RtcGetFreq\(DevHandle handle, uint32\_t \*freq\); - -**表 10** RtcGetFreq参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

freq

-

RTC的外接晶体振荡频率,单位(HZ)

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- -``` -int32_t ret; -uint32_t freq = 0; - -/* 读取RTC外接晶体振荡频率 */ -ret = RtcGetFreq(handle, &freq); -if (ret != 0) { - /* 错误处理 */ -} -``` - -- 配置RTC外频 - -配置RTC外接晶体振荡频率,可以通过以下函数完成: - -int32\_t RtcSetFreq\(DevHandle handle, uint32\_t freq\); - -**表 11** RtcSetFreq参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

freq

-

RTC的外接晶体振荡频率,单位(HZ)

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- -``` -int32_t ret; -uint32_t freq = 32768; /* 32768 Hz */ - -/* 设置RTC外接晶体振荡频率,注意按照器件手册要求配置RTC外频 */ -ret = RtcSetFreq(handle, freq); -if (ret != 0) { - /* 错误处理 */ -} -``` - -- 复位RTC - -复位RTC,复位RTC后各配置寄存器恢复默认值,可以通过以下函数完成: - -int32\_t RtcReset\(DevHandle handle\); - -**表 12** RtcReset参数和返回值描述 - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- -``` -int32_t ret; - -/* 复位RTC,复位RTC后各配置寄存器恢复默认值 */ -ret = RtcReset(handle); -if (ret != 0) { - /* 错误处理 */ -} -``` - -- 读取RTC自定义寄存器配置 - -按照用户定义的寄存器索引,读取对应的寄存器配置,一个索引对应一字节的配置值,通过以下函数完成: - -int32\_t RtcReadReg\(DevHandle handle, uint8\_t usrDefIndex, uint8\_t \*value\); - -**表 13** RtcReadReg参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

usrDefIndex

-

用户定义的寄存器对应索引

-

value

-

寄存器值

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- -``` -int32_t ret; -uint8_t usrDefIndex = 0; /* 定义0索引对应用户定义的第一个寄存器*/ -uint8_t value = 0; - -/* 按照用户定义的寄存器索引,读取对应的寄存器配置,一个索引对应一字节的配置值 */ -ret = RtcReadReg(handle, usrDefIndex, &value); -if (ret != 0) { - /* 错误处理 */ -} -``` - -- 设置RTC自定义寄存器配置 - -按照用户定义的寄存器索引,设置对应的寄存器配置,一个索引对应一字节的配置值,通过以下函数完成: - -int32\_t RtcWriteReg\(DevHandle handle, uint8\_t usrDefIndex, uint8\_t value\); - -**表 14** RtcWriteReg参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

RTC设备句柄

-

usrDefIndex

-

用户定义的寄存器对应索引

-

value

-

寄存器值

-

返回值

-

返回值描述

-

0

-

操作成功

-

负数

-

操作失败

-
- -``` -int32_t ret; -uint8_t usrDefIndex = 0; /* 定义0索引对应用户定义第一个寄存器*/ -uint8_t value = 0x10; - -/* 按照用户的定义的寄存器索引,设置对应的寄存器配置,一个索引对应一字节的配置值 */ -ret = RtcWriteReg(handle, usrDefIndex, value); -if (ret != 0) { - /* 错误处理 */ -} -``` - -## 使用实例 - -本实例提供RTC接口的完整使用流程: - -1. 系统启动,驱动管理模块会识别系统当前的RTC器件; -2. 驱动管理模块完成RTC设备的初始化和设备创建; -3. 用户通过不同API,对该RTC设备进行对应的操作; -4. 关闭RTC设备,释放设备资源。 - -示例如下: - -``` -#include "rtc_if.h" -int32_t RtcAlarmACallback(enum RtcAlarmIndex alarmIndex) -{ - if (alarmIndex == RTC_ALARM_INDEX_A) { - /* 报警A的处理 */ - printf("RTC Alarm A callback function\n\r"); - } else if (alarmIndex == RTC_ALARM_INDEX_B) { - /* 报警B的处理 */ - printf("RTC Alarm B callback function\n\r"); - } else { - /* 错误处理 */ - } - return 0; -} - -void RtcTestSample(void) -{ - int32_t ret; - struct RtcTime tm; - struct RtcTime alarmTime; - uint32_t freq; - DevHandle handle = NULL; - - /* 获取RTC设备句柄 */ - handle = RtcOpen(); - if (handle == NULL) { - /* 错误处理 */ - } - /* 注册报警A的定时回调函数 */ - ret = RtcRegisterAlarmCallback(handle, RTC_ALARM_INDEX_A, RtcAlarmACallback); - if (ret != 0) { - /* 错误处理 */ - } - /* 设置RTC外接晶体振荡频率,注意按照器件手册要求配置RTC外频 */ - freq = 32768; /* 32768 Hz */ - ret = RtcSetFreq(handle, freq); - if (ret != 0) { - /* 错误处理 */ - } - /* 设置RTC报警中断使能 */ - ret = RtcAlarmInterruptEnable(handle, RTC_ALARM_INDEX_A, 1); - if (ret != 0) { - /* 错误处理 */ - } - /* 设置RTC时间为2020/01/01 00:00:10 .990 */ - tm.year = 2020; - tm.month = 01; - tm.day = 01; - tm.hour= 0; - tm.minute = 0; - tm.second = 10; - tm.millisecond = 990; - /* 写RTC时间信息 */ - ret = RtcWriteTime(handle, &tm); - if (ret != 0) { - /* 错误处理 */ - } - /* 设置RTC报警时间为2020/01/01 00:00:30 .100 */ - alarmTime.year = 2020; - alarmTime.month = 01; - alarmTime.day = 01; - alarmTime.hour = 0; - alarmTime.minute = 0; - alarmTime.second = 30; - alarmTime.millisecond = 100; - /* 设置RTC_ALARM_INDEX_A索引定时报警时间信息, 定时时间到后会打印"RTC Alarm A callback function" */ - ret = RtcWriteAlarm(handle, RTC_ALARM_INDEX_A, &alarmTime); - if (ret != 0) { - /* 错误处理 */ - } - - /* 读取RTC实时时间 */ - ret = RtcReadTime(handle, &tm); - if (ret != 0) { - /* 错误处理 */ - } - sleep(5) - printf("RTC read time:\n\r"); - printf("year-month-date-weekday hour:minute:second .millisecond %04u-%02u-%02u-%u %02u:%02u:%02u .%03u", - tm.year, tm.month, tm.day, tm.weekday, tm.hour, tm.minute, tm.second, tm.millisecond); - /* 销毁RTC设备句柄 */ - RtcClose(handle); -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/07.WATCHDOG.md" "b/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/07.WATCHDOG.md" deleted file mode 100644 index 46d23a00e7700bda5d0568f014bd1d52d26e0a88..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/07.WATCHDOG.md" +++ /dev/null @@ -1,570 +0,0 @@ ---- -title: WATCHDOG -permalink: /pages/00030206 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:43 ---- -# WATCHDOG - -- [概述](#section14918241977) - - [接口说明](#section20177131219818) - -- [使用指导](#section10103184312813) - - [使用流程](#section10181195910815) - - [打开看门狗设备](#section66089201107) - - [获取看门狗状态](#section786624341011) - - [设置超时时间](#section182386137111) - - [获取超时时间](#section1883310371114) - - [启动看门狗](#section82501405123) - - [喂狗](#section3547530101211) - - [停止看门狗](#section944595841217) - - [关闭看门狗设备](#section96561824121311) - -- [使用实例](#section1724514523135) - -## 概述 - -看门狗(watchdog),又叫看门狗计时器(watchdog timer),是一种硬件的计时设备,当系统的主程序发生某些错误时,导致未及时清除看门狗计时器的计时值,这时看门狗计时器就会对系统发出复位信号,使系统从悬停状态恢复到正常运作状态。 - -### 接口说明 - -**表 1** 看门狗 API接口功能介绍 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

打开/关闭看门狗

-

WatchdogOpen

-

打开看门狗设备

-

WatchdogClose

-

关闭看门狗设备

-

启动/停止看门狗

-

WatchdogStart

-

启动看门狗

-

WatchdogStop

-

停止看门狗

-

设置/获取超时时间

-

WatchdogSetTimeout

-

设置看门狗超时时间

-

WatchdogGetTimeout

-

获取看门狗超时时间

-

获取看门狗状态

-

WatchdogGetStatus

-

获取看门狗状态

-

清除看门狗定时器

-

WatchdogFeed

-

清除看门狗定时器(喂狗)

-
- ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->本文涉及看门狗的所有接口,仅限内核态使用,不支持在用户态使用。 - -## 使用指导 - -### 使用流程 - -使用看门狗的一般流程如[图1](#fig19134125410189)所示。 - -**图 1** 看门狗使用流程图 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001170229891.png) - -### 打开看门狗设备 - -在操作看门狗之前,需要使用WatchdogOpen打开一个看门狗设备,一个系统可能有多个看门狗,通过ID号来打开指定的看门狗设备: - -int32\_t WatchdogOpen\(int16\_t wdtId\); - -**表 2** WatchdogOpen参数和返回值描述 - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

wdtId

-

看门狗设备号

-

返回值

-

返回值描述

-

NULL

-

打开失败

-

DevHandle类型指针

-

看门狗设备句柄

-
- -``` -DevHandle handle = NULL; -handle = WatchdogOpen(0); /* 打开0号看门狗设备 */ -if (handle == NULL) { - HDF_LOGE("WatchdogOpen: failed, ret %d\n", ret); - return; -} -``` - -### 获取看门狗状态 - -int32\_t WatchdogGetStatus\(DevHandle handle, int32\_t \*status\); - -**表 3** WatchdogGetStatus参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

看门狗设备句柄

-

status

-

获取到的启动状态指针

-

返回值

-

返回值描述

-

0

-

获取成功

-

负数

-

获取失败

-
- -``` -int32_t ret; -int32_t status; -/* 获取Watchdog启动状态 */ -ret = WatchdogGetStatus(handle, &status); -if (ret != 0) { - HDF_LOGE("WatchdogGetStatus: failed, ret %d\n", ret); - return; -} -``` - -### 设置超时时间 - -int32\_t WatchdogSetTimeout\(PalHandle \*handle, uint32\_t seconds\); - -**表 4** WatchdogSetTimeout参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

看门狗设备句柄

-

seconds

-

超时时间,单位为秒

-

返回值

-

返回值描述

-

0

-

设置成功

-

负数

-

设置失败

-
- -``` -int32_t ret; -uint32_t timeOut = 60; -/* 设置超时时间,单位:秒 */ -ret = WatchdogSetTimeout(handle, timeOut); -if (ret != 0) { - HDF_LOGE("WatchdogSetTimeout: failed, ret %d\n", ret); - return; -} -``` - -### 获取超时时间 - -int32\_t WatchdogGetTimeout\(PalHandle \*handle, uint32\_t \*seconds\); - -**表 5** WatchdogGetTimeout参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

看门狗设备句柄

-

seconds

-

接收超时时间的指针,单位为秒

-

返回值

-

返回值描述

-

0

-

获取成功

-

负数

-

获取失败

-
- -``` -int32_t ret; -uint32_t timeOut; -/* 获取超时时间,单位:秒 */ -ret = WatchdogGetTimeout(handle, &timeOut); -if (ret != 0) { - HDF_LOGE("WatchdogGetTimeout: failed, ret %d\n", ret); - return; -} -``` - -### 启动看门狗 - -int32\_t WatchdogStart\(DevHandle handle\); - -**表 6** WatchdogStart参数和返回值描述 - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

看门狗设备句柄

-

返回值

-

返回值描述

-

0

-

启动成功

-

负数

-

启动失败

-
- -``` -int32_t ret; -/* 启动看门狗 */ -ret = WatchdogStart(handle); -if (ret != 0) { - HDF_LOGE("WatchdogStart: failed, ret %d\n", ret); - return; -} -``` - -### 喂狗 - -int32\_t WatchdogFeed\(DevHandle handle\); - -**表 7** WatchdogFeed参数和返回值描述 - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

看门狗设备句柄

-

返回值

-

返回值描述

-

0

-

喂狗成功

-

负数

-

喂狗失败

-
- -``` -int32_t ret; -/* 喂狗 */ -ret = WatchdogFeed(handle); -if (ret != 0) { - HDF_LOGE("WatchdogFeed: failed, ret %d\n", ret); - return; -} -``` - -### 停止看门狗 - -int32\_t WatchdogStop\(DevHandle handle\); - -**表 8** WatchdogStop参数和返回值描述 - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

看门狗设备句柄

-

返回值

-

返回值描述

-

0

-

停止成功

-

负数

-

停止失败

-
- -``` -int32_t ret; -/* 停止看门狗 */ -ret = WatchdogStop(handle); -if (ret != 0) { - HDF_LOGE("WatchdogStop: failed, ret %d\n", ret); - return; -} -``` - -### 关闭看门狗设备 - -当操作完毕时,使用WatchdogClose关闭打开的设备句柄: - -void WatchdogClose\(DevHandle handle\); - -**表 9** WatchdogClose参数和返回值描述 - - - - - - - - - - -

参数

-

参数描述

-

handle

-

看门狗设备句柄

-
- -``` -/* 关闭看门狗 */ -ret = WatchdogClose(handle); -``` - -## 使用实例 - -本例程提供看门狗的完整使用流程。 - -在本例程中,我们打开一个看门狗设备,设置超时时间并启动计时: - -- 首先定期喂狗,即按时清除看门狗定时器,确保系统不会因定时器超时而复位。 -- 接着再停止喂狗,观察定时器到期后系统是否发生复位行为。 - -示例如下: - -``` -#include "watchdog_if.h" -#include "hdf_log.h" -#include "osal_irq.h" -#include "osal_time.h" - -#define WATCHDOG_TEST_TIMEOUT 2 -#define WATCHDOG_TEST_FEED_TIME 6 - -static int32_t TestCaseWatchdog(void) -{ - int32_t i; - int32_t ret; - uint32_t timeout; - DevHandle handle = NULL; - - /* 打开0号看门狗设备 */ - handle = WatchdogOpen(0); - if (handle == NULL) { - HDF_LOGE("Open watchdog fail!"); - return -1; - } - - /* 设置超时时间 */ - ret = WatchdogSetTimeout(handle, WATCHDOG_TEST_TIMEOUT); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: set timeout fail! ret:%d\n", __func__, ret); - WatchdogClose(handle); - return ret; - } - - /* 回读设置的超时时间值 */ - ret = WatchdogGetTimeout(handle, &timeout); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: get timeout fail! ret:%d\n", __func__, ret); - WatchdogClose(handle); - return ret; - } - HDF_LOGI("%s: read timeout back:%u\n", __func__, timeout); - - /* 启动看门狗,开始计时 */ - ret = WatchdogStart(handle); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: satrt fail! ret:%d\n", __func__, ret); - WatchdogClose(handle); - return ret; - } - - /* 每隔1S喂狗一次 */ - for (i = 0; i < WATCHDOG_TEST_FEED_TIME; i++) { - HDF_LOGE("%s: feeding watchdog %d times... \n", __func__, i); - ret = WatchdogFeed(handle); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: feed dog fail! ret:%d\n", __func__, ret); - WatchdogClose(handle); - return ret; - } - OsalSleep(1); - } - /* 由于喂狗间隔小于超时时间,系统不会发生复位,此日志可以正常打印 */ - HDF_LOGE("%s: no reset ... feeding test OK!!!\n", __func__); - - /* 接下来持续不喂狗,使得看门狗计时器超时 */ - for (i = 0; i < WATCHDOG_TEST_FEED_TIME; i++) { - HDF_LOGE("%s: watiting dog buck %d times... \n", __func__, i); - OsalSleep(1); - } - - /* 当不喂狗时间到达之前设定的超时时间的时候,系统会发生复位,理论上观察不到此日志的打印 */ - HDF_LOGE("%s: dog has't buck!!! \n", __func__, i); - WatchdogClose(handle); - return -1; -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" similarity index 80% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" index 8fd7718b53726c375dc003f28d83118ffabd62cf..e2adf8d5af26a2920dd88856e566ecae286df69e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 内核概述 -permalink: /pages/00020000 +permalink: /pages/0004000000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 内核概述 @@ -20,10 +20,10 @@ date: 2021-12-30 12:57:42 ## 内核简介 -OpenHarmony LiteOS-M内核是面向IoT领域构建的轻量级物联网操作系统内核,具有小体积、低功耗、高性能的特点。其代码结构简单,主要包括内核最小功能集、内核抽象层、可选组件以及工程目录等。OpenHarmony LiteOS-M内核架构包含硬件相关层以及硬件无关层,如下图所示,其中Kernel Arch模块属于硬件相关层,该模块按不同编译工具链、芯片架构分类,提供统一的HAL(Hardware Abstraction Layer)接口,提升了硬件易适配性,满足AIoT类型丰富的硬件和编译工具链的拓展;Components等其他模块属于硬件无关层,其中Kernel Task等内核模块提供基础能力,Components模块提供网络、文件系统等组件能力,Utils模块提供错误处理、调测等能力,KAL(Kernel Abstraction Layer)模块提供统一的标准接口。 +OpenHarmony LiteOS-M内核是面向IoT领域构建的轻量级物联网操作系统内核,具有小体积、低功耗、高性能的特点。其代码结构简单,主要包括内核最小功能集、内核抽象层、可选组件以及工程目录等。OpenHarmony LiteOS-M内核架构包含硬件相关层以及硬件无关层,如下图所示,其中硬件相关层按不同编译工具链、芯片架构分类,提供统一的HAL(Hardware Abstraction Layer)接口,提升了硬件易适配性,满足AIoT类型丰富的硬件和编译工具链的拓展;其他模块属于硬件无关层,其中基础内核模块提供基础能力,扩展模块提供网络、文件系统等组件能力,还提供错误处理、调测等能力;KAL(Kernel Abstraction Layer)模块提供统一的标准接口。 **图 1** 内核架构图 -![](/images/zh-cn/device-dev/kernel/figure/内核架构图.png "内核架构图") +![](/images/device-dev/kernel/figure/内核架构图.png "内核架构图") ### cpu体系架构支持 @@ -42,9 +42,9 @@ CPU体系架构分为通用架构定义和特定架构定义两层,通用架

头文件位置

kernel/arch/include

+

arch/include

kernel/arch/<arch>/<arch>/<toolchain>/

+

arch/<arch>/<arch>/<toolchain>/

头文件命名

@@ -64,12 +64,12 @@ CPU体系架构分为通用架构定义和特定架构定义两层,通用架
-LiteOS-M已经支持ARM Cortex-M3、ARM Cortex-M4、ARM Cortex-M7、ARM Cortex-M33、RISC-V等主流架构,如果需要扩展CPU体系架构,请参考[芯片架构适配点](/pages/0007000100#section137431650339)。 +LiteOS-M已经支持ARM Cortex-M3、ARM Cortex-M4、ARM Cortex-M7、ARM Cortex-M33、RISC-V等主流架构,如果需要扩展CPU体系架构,请参考[芯片架构适配点](/pages/0003010100#section137431650339)。 ### 运行机制 在开发板配置文件target\_config.h配置系统时钟、每秒Tick数,可以对任务、内存、IPC、异常处理模块进行裁剪配置。系统启动时,根据配置进行指定模块的初始化。内核启动流程包含外设初始化、系统时钟配置、内核初始化、操作系统启动等,详见内核启动流程图。 **图 2** 内核启动流程 -![](/images/zh-cn/device-dev/kernel/figure/内核启动流程.png "内核启动流程") +![](/images/device-dev/kernel/figure/内核启动流程.png "内核启动流程") diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index 14dd77a0088a2d3a249c6dc9e07a01086dfd2a3c..70c80122e4f4d3d6085d5314b11110d34f40503f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000200010000 +permalink: /pages/00040000010000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 基本概念 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" index 0d407fc764a8d57a419d86c02a3570dda82d8770..b571f4e6bae5c45b56a405afc6ee350f7830e3b9 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 开发指导 -permalink: /pages/000200010001 +permalink: /pages/00040000010001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 开发指导 @@ -74,7 +74,7 @@ OpenHarmony LiteOS-M内核的中断模块提供下面几种功能,接口详细 2. 调用TestHwiTrigger接口触发指定中断(该接口在测试套中定义,通过写中断控制器的相关寄存器模拟外部中断,一般的外设设备,不需要执行这一步)。 3. 调用HalHwiDelete接口删除指定中断,此接口根据实际情况使用,判断是否需要删除中断。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 根据具体硬件,配置支持的最大中断数及可设置的中断优先级个数。 >- 中断处理程序耗时不能过长,否则会影响CPU对中断的及时响应。 >- 中断响应过程中不能直接、间接执行引起调度的LOS\_Schedule等函数。 @@ -107,7 +107,7 @@ static UINT32 Example_Interrupt(VOID) HWI_PRIOR_T hwiPrio = 3; HWI_MODE_T mode = 0; HWI_ARG_T arg = 0; - + /*创建中断*/ ret = HalHwiCreate(HWI_NUM_TEST, hwiPrio, mode, (HWI_PROC_FUNC)HwiUsrIrq, arg); if(ret == LOS_OK){ @@ -138,6 +138,6 @@ static UINT32 Example_Interrupt(VOID) ``` Hwi create success! -Hwi delete success!. +Hwi delete success! ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index 5dbbd1a694496b5cf7bf059d1a952ee7c049b528..2ef8e615c81a57892335419e0b38b778c681e627 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000200010100 +permalink: /pages/00040000010100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 基本概念 @@ -42,7 +42,7 @@ OpenHarmony LiteOS-M的任务模块可以给用户提供多个任务,实现任 **任务状态迁移** **图 1** 任务状态示意图 -![](/images/zh-cn/device-dev/kernel/figure/任务状态示意图.png "任务状态示意图") +![](/images/device-dev/kernel/figure/任务状态示意图.png "任务状态示意图") **任务状态迁移说明:** @@ -52,7 +52,7 @@ OpenHarmony LiteOS-M的任务模块可以给用户提供多个任务,实现任 - 运行态→阻塞态 - 正在运行的任务发生阻塞(挂起、延时、读信号量等)时,该任务会从就绪队列中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪队列中最高优先级任务。 + 正在运行的任务发生阻塞(挂起、延时、读信号量等)时,将该任务插入到对应的阻塞队列中,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪队列中最高优先级任务。 - 阻塞态→就绪态(阻塞态→运行态) diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" index 38d282231b506337cc1b72532c761a229b785f33..a52640f5a2859b43d7a809754753c33a1fa98cd0 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/02.\344\273\273\345\212\241\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 开发指导 -permalink: /pages/000200010101 +permalink: /pages/00040000010101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 开发指导 @@ -177,7 +177,7 @@ OpenHarmony LiteOS-M内核的任务管理模块提供下面几种功能,接口 5. 挂起指定的任务LOS\_TaskSuspend,任务挂起等待恢复操作。 6. 恢复挂起的任务LOS\_TaskResume。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 执行Idle任务时,会对待回收链表中的任务控制块和任务栈进行回收。 >- 任务名是指针,并没有分配空间,在设置任务名时,禁止将局部变量的地址赋值给任务名指针。 >- 任务栈的大小按8字节大小对齐。确定任务栈大小的原则是,够用就行,多了浪费,少了任务栈溢出。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index 4b1bff9555bee72539313de5bba9a1678b36cef7..93cce1852b21435f87a75b7a08dd08017c9c08cf 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000200010200 +permalink: /pages/00040000010200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 基本概念 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\351\235\231\346\200\201\345\206\205\345\255\230.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\351\235\231\346\200\201\345\206\205\345\255\230.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\351\235\231\346\200\201\345\206\205\345\255\230.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\351\235\231\346\200\201\345\206\205\345\255\230.md" index 60855ee2ba653917aeb1ebe60390c37a6433eb94..5d026c8b256893315bff2038178b1368fcafcf7f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\351\235\231\346\200\201\345\206\205\345\255\230.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\351\235\231\346\200\201\345\206\205\345\255\230.md" @@ -1,6 +1,6 @@ --- title: 静态内存 -permalink: /pages/000200010201 +permalink: /pages/00040000010201 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 静态内存 @@ -29,7 +29,7 @@ date: 2021-12-30 12:57:42 静态内存池由一个控制块LOS\_MEMBOX\_INFO和若干相同大小的内存块LOS\_MEMBOX\_NODE构成。控制块位于内存池头部,用于内存块管理,包含内存块大小uwBlkSize,内存块数量uwBlkNum,已分配使用的内存块数量uwBlkCnt和空闲内存块链表stFreeList。内存块的申请和释放以块大小为粒度,每个内存块包含指向下一个内存块的指针pstNext。 **图 1** 静态内存示意图 -![](/images/zh-cn/device-dev/kernel/figure/静态内存示意图.png "静态内存示意图") +![](/images/device-dev/kernel/figure/静态内存示意图.png "静态内存示意图") ## 开发指导 @@ -93,7 +93,7 @@ OpenHarmony LiteOS-M的静态内存管理主要为用户提供以下功能,接 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >初始化后的内存池的内存块数量,不等于总大小除于内存块大小,因为内存池的控制块和每个内存块的控制头,都存在内存开销,设置总大小时,需要将这些因素考虑进去。 ### 开发流程 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\345\212\250\346\200\201\345\206\205\345\255\230.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\345\212\250\346\200\201\345\206\205\345\255\230.md" similarity index 81% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\345\212\250\346\200\201\345\206\205\345\255\230.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\345\212\250\346\200\201\345\206\205\345\255\230.md" index df2fefddb5758fb39824d72851d6882998b8c542..2ab4498f6d104099080b7b676e4d233a96e2b2f8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\345\212\250\346\200\201\345\206\205\345\255\230.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\345\212\250\346\200\201\345\206\205\345\255\230.md" @@ -1,6 +1,6 @@ --- title: 动态内存 -permalink: /pages/000200010202 +permalink: /pages/00040000010202 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 动态内存 @@ -29,7 +29,7 @@ date: 2021-12-30 12:57:42 OpenHarmony LiteOS-M动态内存在TLSF算法的基础上,对区间的划分进行了优化,获得更优的性能,降低了碎片率。动态内存核心算法框图如下: **图 1** 动态内存核心算法 -![](/images/zh-cn/device-dev/kernel/figure/动态内存核心算法.png "动态内存核心算法") +![](/images/device-dev/kernel/figure/轻量系统动态内存核心算法.png "动态内存核心算法") 根据空闲内存块的大小,使用多个空闲链表来管理。根据内存空闲块大小分为两个部分:\[4, 127\]和\[27, 231\],如上图size class所示: @@ -41,7 +41,7 @@ OpenHarmony LiteOS-M动态内存在TLSF算法的基础上,对区间的划分 内存管理结构如下图所示: **图 2** 动态内存管理结构图 -![](/images/zh-cn/device-dev/kernel/figure/动态内存管理结构图.png "动态内存管理结构图") +![](/images/device-dev/kernel/figure/动态内存管理结构图.png "动态内存管理结构图") - 内存池池头部分 @@ -51,6 +51,18 @@ OpenHarmony LiteOS-M动态内存在TLSF算法的基础上,对区间的划分 包含3种类型节点:未使用空闲内存节点,已使用内存节点和尾节点。每个内存节点维护一个前序指针,指向内存池中上一个内存节点,还维护内存节点的大小和使用标记。空闲内存节点和已使用内存节点后面的内存区域是数据域,尾节点没有数据域。 +一些芯片片内RAM大小无法满足要求,需要使用片外物理内存进行扩充。对于这样的多段非连续性内存,OpenHarmony LiteOS-M内核支持把多个非连续性内存逻辑上合一,用户不感知底层的多段非连续性内存区域。OpenHarmony LiteOS-M内核内存模块把不连续的内存区域作为空闲内存结点插入到空闲内存节点链表,把不同内存区域间的不连续部分标记为虚拟的已使用内存节点,从逻辑上把多个非连续性内存区域实现为一个统一的内存池。下面通过示意图说明下多段非连续性内存的运行机制: + +**图 3** 非连续性内存合一示意图 +![](/images/device-dev/kernel/figure/非连续性内存合一示意图.png "非连续性内存合一示意图") + +结合上述示意图,非连续性内存合并为一个统一的内存池的步骤如下: +1. 把多段非连续性内存区域的第一块内存区域通过调用LOS_MemInit接口进行初始化。 +2. 获取下一个内存区域的开始地址和长度,计算该内存区域和上一块内存区域的间隔大小gapSize。 +3. 把内存区域间隔部分视为虚拟的已使用节点,使用上一个内存区域的尾节点,设置其大小为gapSize+ OS_MEM_NODE_HEAD_SIZE。 +4. 把当前内存区域划分为一个空闲内存节点和一个尾节点,把空闲内存节点插入到空闲链表,并设置各个节点的前后链接关系。 +5. 如果有更多的非连续内存区域,重复上述步骤2-4。 + ## 开发指导 @@ -148,12 +160,21 @@ OpenHarmony LiteOS-M的动态内存管理主要为用户提供以下功能,接

对指定内存池做完整性检查,仅打开LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK时有效。

+

增加非连续性内存区域

+ +

LOS_MemRegionsAdd

+ +

支持多段非连续性内存区域,把非连续性内存区域逻辑上整合为一个统一的内存池。仅打开LOSCFG_MEM_MUL_REGIONS时有效。如果内存池指针参数pool为空,则使用多段内存的第一个初始化为内存池,其他内存区域,作为空闲节点插入;如果内存池指针参数pool不为空,则把多段内存作为空闲节点,插入到指定的内存池。

+ + + ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 由于动态内存管理需要管理控制块数据结构来管理内存,这些数据结构会额外消耗内存,故实际用户可使用内存总量小于配置项OS\_SYS\_MEM\_SIZE的大小。 >- 对齐分配内存接口LOS\_MemAllocAlign/LOS\_MemMallocAlign因为要进行地址对齐,可能会额外消耗部分内存,故存在一些遗失内存,当系统释放该对齐内存时,同时回收由于对齐导致的遗失内存。 +>- 非连续性内存区域接口LOS\_MemRegionsAdd的LosMemRegion数组参数传入的非连续性内存区域需要按各个内存区域的内存开始地址升序,且内存区域不能重叠。 ### 开发流程 @@ -189,6 +210,9 @@ OpenHarmony LiteOS-M的动态内存管理主要为用户提供以下功能,接 ``` #include "los_memory.h" +#define TEST_POOL_SIZE (2*1024) +__attribute__((aligned(4))) UINT8 g_testPool[TEST_POOL_SIZE]; + VOID Example_DynMem(VOID) { UINT32 *mem = NULL; @@ -197,19 +221,19 @@ VOID Example_DynMem(VOID) /*初始化内存池*/ ret = LOS_MemInit(g_testPool, TEST_POOL_SIZE); if (LOS_OK == ret) { - printf("Mem init success!\n"); + printf("Memory pool initialized.\n"); } else { - printf("Mem init failed!\n"); + printf("Memory pool initialization failed.\n"); return; } /*分配内存*/ mem = (UINT32 *)LOS_MemAlloc(g_testPool, 4); if (NULL == mem) { - printf("Mem alloc failed!\n"); + printf("Memory allocation failed.\n"); return; } - printf("Mem alloc success!\n"); + printf("Memory allocated.\n"); /*赋值*/ *mem = 828; @@ -218,9 +242,9 @@ VOID Example_DynMem(VOID) /*释放内存*/ ret = LOS_MemFree(g_testPool, mem); if (LOS_OK == ret) { - printf("Mem free success!\n"); + printf("Memory released.\n"); } else { - printf("Mem free failed!\n"); + printf("Memory release failed.\n"); } return; @@ -232,9 +256,9 @@ VOID Example_DynMem(VOID) 输出结果如下: ``` -Mem init success! -Mem alloc success! +Memory pool initialized. +Memory allocated. *mem = 828 -Mem free success! +Memory released. ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\213\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\213\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index 29ea4665b06fa8656a2c759470090eca0177ef86..38d223944ade26a8201ec04f94613e2ccec0e72b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\213\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000200010300 +permalink: /pages/0004000001030000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 基本概念 @@ -59,5 +59,5 @@ typedef struct tagEvent { **事件销毁:**销毁指定的事件控制块。 **图 1** 事件运作原理图 -![](/images/zh-cn/device-dev/kernel/figure/事件运作原理图.png "事件运作原理图") +![](/images/device-dev/kernel/figure/事件运作原理图.png "事件运作原理图") diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\213\344\273\266/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\213\344\273\266/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" index 023ca6f34f3ef4ce2095011c441bfc5e2d9f5cce..e4c826667723df24f975e9908a78534369ae3610 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\213\344\273\266/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 开发指导 -permalink: /pages/000200010301 +permalink: /pages/0004000001030001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 开发指导 @@ -93,7 +93,7 @@ date: 2021-12-30 12:57:42 5. 处理事件控制块 6. 事件控制块销毁 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 进行事件读写操作时,事件的第25位为保留位,不可以进行位设置。 >- 对同一事件反复写入,算作一次写入。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\222\346\226\245\351\224\201/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\272\222\346\226\245\351\224\201/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 91% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\222\346\226\245\351\224\201/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\272\222\346\226\245\351\224\201/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index c7a653bd145872a531e65425cfedb22315e3c074..6adfb74ec8325eb9773c7fb92f4488da49f9f25a 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\222\346\226\245\351\224\201/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\272\222\346\226\245\351\224\201/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000200010400 +permalink: /pages/0004000001030100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 基本概念 @@ -28,5 +28,5 @@ date: 2021-12-30 12:57:42 用互斥锁处理非共享资源的同步访问时,如果有任务访问该资源,则互斥锁为加锁状态。此时其他任务如果想访问这个公共资源则会被阻塞,直到互斥锁被持有该锁的任务释放后,其他任务才能重新访问该公共资源,此时互斥锁再次上锁,如此确保同一时刻只有一个任务正在访问这个公共资源,保证了公共资源操作的完整性。 **图 1** 互斥锁运作示意图 -![](/images/zh-cn/device-dev/kernel/figure/互斥锁运作示意图.png "互斥锁运作示意图") +![](/images/device-dev/kernel/figure/互斥锁运作示意图.png "互斥锁运作示意图") diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\222\346\226\245\351\224\201/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\272\222\346\226\245\351\224\201/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\222\346\226\245\351\224\201/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\272\222\346\226\245\351\224\201/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" index 1279aabf7c8ac2b6a94b1fe2786b7cb35b226e14..5b331a716eecb9d134302bc24ac6e6cac1d7aea3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\272\222\346\226\245\351\224\201/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\272\222\346\226\245\351\224\201/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 开发指导 -permalink: /pages/000200010401 +permalink: /pages/0004000001030101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 开发指导 @@ -80,7 +80,7 @@ date: 2021-12-30 12:57:42 4. 删除互斥锁LOS\_MuxDelete。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 两个任务不能对同一把互斥锁加锁。如果某任务对已被持有的互斥锁加锁,则该任务会被挂起,直到持有该锁的任务对互斥锁解锁,才能执行对这把互斥锁的加锁操作。 >- 互斥锁不能在中断服务程序中使用。 >- LiteOS-M内核作为实时操作系统需要保证任务调度的实时性,尽量避免任务的长时间阻塞,因此在获得互斥锁之后,应该尽快释放互斥锁。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\346\266\210\346\201\257\351\230\237\345\210\227/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\346\266\210\346\201\257\351\230\237\345\210\227/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\346\266\210\346\201\257\351\230\237\345\210\227/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\346\266\210\346\201\257\351\230\237\345\210\227/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index a1bc89f216b52c0faab657402e4f1374c01355d0..572806b27ce1bd68f2133e29c23cf355b4139946 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\346\266\210\346\201\257\351\230\237\345\210\227/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\346\266\210\346\201\257\351\230\237\345\210\227/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000200010500 +permalink: /pages/0004000001030200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 基本概念 @@ -74,7 +74,7 @@ typedef struct 图 1 队列读写数据操作示意图 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001132935054.png) +![](/images/device-dev/kernel/figure/zh-cn_image_0000001132935054.png) 上图对读写队列做了示意,图中只画了尾节点写入方式,没有画头节点写入,但是两者是类似的。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\346\266\210\346\201\257\351\230\237\345\210\227/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\346\266\210\346\201\257\351\230\237\345\210\227/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\346\266\210\346\201\257\351\230\237\345\210\227/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\346\266\210\346\201\257\351\230\237\345\210\227/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" index 7b1c89d416d367485381f583eeace5eb7f689acd..403d5d723e5abf97b1ff9dc1b116138bfb47b580 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\346\266\210\346\201\257\351\230\237\345\210\227/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\346\266\210\346\201\257\351\230\237\345\210\227/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 开发指导 -permalink: /pages/000200010501 +permalink: /pages/0004000001030201 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 开发指导 @@ -75,7 +75,7 @@ date: 2021-12-30 12:57:42

LOS_QueueWriteHeadCopy

-

向指定队列头节点中写入入参bufferAddr中保存的数据。

+

向指定队列头节点中写入入参bufferAddr中保存的数据。

获取队列信息

@@ -96,7 +96,7 @@ date: 2021-12-30 12:57:42 4. 通过LOS\_QueueInfoGet获取队列信息。 5. 通过LOS\_QueueDelete删除队列。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 系统支持的最大队列数是指:整个系统的队列资源总个数,而非用户能使用的个数。例如:系统软件定时器多占用一个队列资源,那么用户能使用的队列资源就会减少一个。 >- 创建队列时传入的队列名和flags暂时未使用,作为以后的预留参数。 >- 队列接口函数中的入参timeOut是相对时间。 @@ -134,7 +134,7 @@ VOID SendEntry(VOID) ret = LOS_QueueWriteCopy(g_queue, abuf, len, 0); if(ret != LOS_OK) { - printf("send message failure, error: %x\n", ret); + printf("Failed to send the message. Error: %x\n", ret); } } @@ -144,26 +144,24 @@ VOID RecvEntry(VOID) CHAR readBuf[BUFFER_LEN] = {0}; UINT32 readLen = BUFFER_LEN; - //休眠1s - usleep(1000000); ret = LOS_QueueReadCopy(g_queue, readBuf, &readLen, 0); if(ret != LOS_OK) { - printf("recv message failure, error: %x\n", ret); + printf("Failed to receive the message. Error: %x\n", ret); } - printf("recv message: %s\n", readBuf); + printf("Message received: %s\n", readBuf); ret = LOS_QueueDelete(g_queue); if(ret != LOS_OK) { - printf("delete the queue failure, error: %x\n", ret); + printf("Failed to delete the queue. Error: %x\n", ret); } - printf("delete the queue success!\n"); + printf("Queue deleted.\n"); } UINT32 ExampleQueue(VOID) { - printf("start queue example\n"); + printf("Start queue example.\n"); UINT32 ret = 0; UINT32 task1, task2; TSK_INIT_PARAM_S initParam = {0}; @@ -176,24 +174,25 @@ UINT32 ExampleQueue(VOID) LOS_TaskLock(); ret = LOS_TaskCreate(&task1, &initParam); if(ret != LOS_OK) { - printf("create task1 failed, error: %x\n", ret); + printf("Failed to create task1. Error: %x\n", ret); return ret; } initParam.pcName = "RecvQueue"; initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)RecvEntry; + initParam.usTaskPrio = 10; ret = LOS_TaskCreate(&task2, &initParam); if(ret != LOS_OK) { - printf("create task2 failed, error: %x\n", ret); + printf("Failed to create task2. Error: %x\n", ret); return ret; } ret = LOS_QueueCreate("queue", 5, &g_queue, 0, 50); if(ret != LOS_OK) { - printf("create queue failure, error: %x\n", ret); + printf("Failed to create the queue. Error: %x\n", ret); } - printf("create the queue success!\n"); + printf("Queue created.\n"); LOS_TaskUnlock(); return ret; } @@ -204,9 +203,9 @@ UINT32 ExampleQueue(VOID) 编译运行得到的结果为: ``` -start test example -create the queue success! -recv message: test message -delete the queue success! +Start queue example. +Queue created. +Message received: test message. +Queue deleted. ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\277\241\345\217\267\351\207\217/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\344\277\241\345\217\267\351\207\217/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\277\241\345\217\267\351\207\217/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\344\277\241\345\217\267\351\207\217/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index 285e2e023ad8c87ed6114bef8acc515de3d040bb..72fe1331cd8ab3cd5dc4bcbb25a19eef6e592ec1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\277\241\345\217\267\351\207\217/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\344\277\241\345\217\267\351\207\217/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000200010600 +permalink: /pages/0004000001030300 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 基本概念 @@ -62,5 +62,5 @@ typedef struct { 信号量允许多个任务在同一时刻访问共享资源,但会限制同一时刻访问此资源的最大任务数目。当访问资源的任务数达到该资源允许的最大数量时,会阻塞其他试图获取该资源的任务,直到有任务释放该信号量。 **图 1** 信号量运作示意图 -![](/images/zh-cn/device-dev/kernel/figure/信号量运作示意图.png "信号量运作示意图") +![](/images/device-dev/kernel/figure/信号量运作示意图.png "信号量运作示意图") diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\277\241\345\217\267\351\207\217/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\344\277\241\345\217\267\351\207\217/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\277\241\345\217\267\351\207\217/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\344\277\241\345\217\267\351\207\217/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" index b45a395fa2076491d189bf3ae4a41fcff534336a..c0a622a548ce20a0e611acc6aa0758ccda7f9cea 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266-\344\277\241\345\217\267\351\207\217/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\344\277\241\345\217\267\351\207\217/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 开发指导 -permalink: /pages/000200010601 +permalink: /pages/0004000001030301 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 开发指导 @@ -71,7 +71,7 @@ date: 2021-12-30 12:57:42 3. 释放信号量LOS\_SemPost。 4. 删除信号量LOS\_SemDelete。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >由于中断不能被阻塞,因此不能在中断中使用阻塞模式申请信号量。 ## 编程实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/08.\346\227\266\351\227\264\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/08.\346\227\266\351\227\264\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index 3c91e492a84cf6aaf971cf29c3aacbcd52467634..c1aefe32abcd3d6aa2db35799e89f8265a73d9d1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/08.\346\227\266\351\227\264\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000200010700 +permalink: /pages/00040000010400 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 基本概念 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/08.\346\227\266\351\227\264\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/08.\346\227\266\351\227\264\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" index 9bc97763b0cfcdfb0f4bdcbbb72851eea1c2fa5a..df46edd408d638ca1fad99f731d3d1d7eb969f00 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/08.\346\227\266\351\227\264\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 开发指导 -permalink: /pages/000200010701 +permalink: /pages/00040000010401 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 开发指导 @@ -87,7 +87,7 @@ OpenHarmony LiteOS-M内核的时间管理提供下面几种功能,接口详细 1. 根据实际需求,完成板级配置适配,并配置系统主时钟频率OS\_SYS\_CLOCK(单位Hz)和LOSCFG\_BASE\_CORE\_TICK\_PER\_SECOND。OS\_SYS\_CLOCK的默认值基于硬件平台配置。 2. 调用时钟转换/统计接口。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 时间管理不是单独的功能模块,依赖于OS\_SYS\_CLOCK和LOSCFG\_BASE\_CORE\_TICK\_PER\_SECOND两个配置选项。 >- 系统的Tick数在关中断的情况下不进行计数,故系统Tick数不能作为准确时间使用。 >- 配置选项维护在开发板工程的文件target\_config.h。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/09.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/09.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index 91f6587b67b321ba86911a1ef5e64e00f07668e8..555ded2697e5b20b78dd0fa03a9b6242a4559024 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/09.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000200010800 +permalink: /pages/00040000010500 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 基本概念 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/09.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 88% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/09.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" index e1e2bd6b0a4079c29a00a6897be15604f50f5fc4..8cce3a358d453d50d6c1c39b4decd27057e7882e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/09.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 开发指导 -permalink: /pages/000200010801 +permalink: /pages/00040000010501 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 开发指导 @@ -88,7 +88,7 @@ OpenHarmony LiteOS-M内核的软件定时器模块提供下面几种功能,接 5. 停止定时器LOS\_SwtmrStop。 6. 删除定时器LOS\_SwtmrDelete。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 软件定时器的回调函数中不要做过多操作,不要使用可能引起任务挂起或者阻塞的接口或操作。 >- 软件定时器使用了系统的一个队列和一个任务资源,软件定时器任务的优先级设定为0,且不允许修改 。 >- 系统可配置的软件定时器资源个数是指:整个系统可使用的软件定时器资源总个数,而并非是用户可使用的软件定时器资源个数。例如:系统软件定时器多占用一个软件定时器资源数,那么用户能使用的软件定时器资源就会减少一个。 @@ -129,53 +129,54 @@ void Timer1_Callback(UINT32 arg) // 回调函数1 { UINT32 tick_last1; g_timerCount1++; - tick_last1=(UINT32)LOS_TickCountGet(); // 获取当前Tick数 + tick_last1 = (UINT32)LOS_TickCountGet(); // 获取当前Tick数 printf("g_timerCount1=%d, tick_last1=%d\n", g_timerCount1, tick_last1); } void Timer2_Callback(UINT32 arg) // 回调函数2 { UINT32 tick_last2; - tick_last2=(UINT32)LOS_TickCountGet(); + tick_last2 = (UINT32)LOS_TickCountGet(); g_timerCount2++; printf("g_timerCount2=%d tick_last2=%d\n", g_timerCount2, tick_last2); } void Timer_example(void) { - UINT32 id1; // timer id - UINT32 id2; // timer id - UINT32 uwTick; + UINT32 ret; + UINT32 id1; // timer id1 + UINT32 id2; // timer id2 + UINT32 tickCount; /*创建单次软件定时器,Tick数为1000,启动到1000Tick数时执行回调函数1 */ - LOS_SwtmrCreate (1000, LOS_SWTMR_MODE_ONCE, Timer1_Callback, &id1, 1); + LOS_SwtmrCreate(1000, LOS_SWTMR_MODE_ONCE, Timer1_Callback, &id1, 1); /*创建周期性软件定时器,每100Tick数执行回调函数2 */ LOS_SwtmrCreate(100, LOS_SWTMR_MODE_PERIOD, Timer2_Callback, &id2, 1); - printf("create Timer1 success\n"); + printf("Timer 1 created.\n"); - LOS_SwtmrStart (id1); //启动单次软件定时器 - printf("start Timer1 sucess\n"); + LOS_SwtmrStart(id1); //启动单次软件定时器 + printf("Timer 1 started.\n"); LOS_TaskDelay(200); //延时200Tick数 - LOS_SwtmrTimeGet(id1, &uwTick); // 获得单次软件定时器剩余Tick数 - printf("uwTick =%d\n", uwTick); + LOS_SwtmrTimeGet(id1, &tickCount); // 获得单次软件定时器剩余Tick数 + printf("tickCount=%d\n", tickCount); LOS_SwtmrStop(id1); // 停止软件定时器 - printf("stop Timer1 sucess\n"); + printf("Timer 1 stopped.\n"); LOS_SwtmrStart(id1); LOS_TaskDelay(1000); - LOS_SwtmrDelete(id1); // 删除软件定时器 - printf("delete Timer1 sucess\n"); - LOS_SwtmrStart(id2); // 启动周期性软件定时器 - printf("start Timer2\n"); + printf("Timer 2 started.\n"); LOS_TaskDelay(1000); LOS_SwtmrStop(id2); - LOS_SwtmrDelete(id2); + ret = LOS_SwtmrDelete(id2); // 删除软件定时器 + if (ret == LOS_OK) { + printf("Timer 2 deleted.\n"); + } } UINT32 Example_TaskEntry(VOID) @@ -187,14 +188,14 @@ UINT32 Example_TaskEntry(VOID) LOS_TaskLock(); /* 创建任务1 */ - memset(&task1, 0, sizeof(TSK_INIT_PARAM_S)); + (VOID)memset(&task1, 0, sizeof(TSK_INIT_PARAM_S)); task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Timer_example; task1.pcName = "TimerTsk"; task1.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; task1.usTaskPrio = 5; ret = LOS_TaskCreate(&g_testTaskId01, &task1); if (ret != LOS_OK) { - printf("TimerTsk create failed.\n"); + printf("Failed to create the timer task.\n"); return LOS_NOK; } @@ -210,13 +211,12 @@ UINT32 Example_TaskEntry(VOID) 编译烧录运行,输出结果如下: ``` -create Timer1 success -start Timer1 sucess -uwTick =798 -stop Timer1 sucess +Timer 1 created. +Timer 1 started. +tickCount=798 +Timer 1 stopped. g_timerCount1=1, tick_last1=1208 -delete Timer1 sucess -start Timer2 +Timer 2 started. g_timerCount2=1 tick_last2=1313 g_timerCount2=2 tick_last2=1413 g_timerCount2=3 tick_last2=1513 @@ -227,5 +227,6 @@ g_timerCount2=7 tick_last2=1913 g_timerCount2=8 tick_last2=2013 g_timerCount2=9 tick_last2=2113 g_timerCount2=10 tick_last2=2213 +Timer 2 deleted. ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/01.C++\346\224\257\346\214\201.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/01.C++\346\224\257\346\214\201.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/01.C++\346\224\257\346\214\201.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/01.C++\346\224\257\346\214\201.md" index 953f780202ea2d235ccf7ef4180f0a80e860430e..347b12e0743cacad423dc1db2f8b36e5c5a3c0c3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/01.C++\346\224\257\346\214\201.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/01.C++\346\224\257\346\214\201.md" @@ -1,6 +1,6 @@ --- title: C++支持 -permalink: /pages/0002000200 +permalink: /pages/000400000200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # C++支持 @@ -80,7 +80,7 @@ C++代码的识别主要由编译器支持,系统主要对全局对象进行 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >调用该函数时,一定要在c++业务前。另外部分与系统资源强相关的类或接口,如std::thread,std::mutex等,在三方编译器使用的c库非musl c时,存在兼容性问题,不建议使用。 ### 编程实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index 6e47e9fe64904ba136b4bcf8194d456a54ab3124..b05caa68cff225b57ce76d2d964a14b10ea1d70c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000200020100 +permalink: /pages/00040000020100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 基本概念 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" index 1a27f7a7cd58b0ae400a3f2fa20947fac549bfbd..fca302fc6a8fc2ccaa7e4c411c0fb49496bf1496 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/02.CPU\345\215\240\347\224\250\347\216\207/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 开发指导 -permalink: /pages/000200020101 +permalink: /pages/00040000020101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:29 --- # 开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" index 34069d4bee8e1d2a8490d27b2e27ae557a73dbe5..309556c44673a034e441fc238883b34398eb9023 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" @@ -1,6 +1,6 @@ --- title: FAT -permalink: /pages/000200020400 +permalink: /pages/00040000020200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # FAT @@ -48,7 +48,7 @@ FAT文件系统的使用需要底层MMC相关驱动的支持。在一个带MMC ### 开发流程 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- FATFS文件与目录操作: > - 单个文件大小不超过4G。 > - 支持同时打开的文件数最大为FAT\_MAX\_OPEN\_FILES,文件夹数最大为FAT\_MAX\_OPEN\_DIRS。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.LittleFS-\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\346\226\207\344\273\266\347\263\273\347\273\237/02.LittleFS/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 30% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.LittleFS-\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\346\226\207\344\273\266\347\263\273\347\273\237/02.LittleFS/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index 483772b5234fdd7bf109f8463505d2cfe6b39635..32540ab0290bfd7f60e5830a0be0a05dca6c486f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.LittleFS-\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\346\226\207\344\273\266\347\263\273\347\273\237/02.LittleFS/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- -title: LittleFS-基本概念 -permalink: /pages/000200020401 +title: 基本概念 +permalink: /pages/0004000002020100 navbar: true sidebar: true prev: true @@ -9,11 +9,11 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 基本概念 -LittleFS是一个小型的的Flash文件系统,它结合日志结构(log-structured)文件系统和COW(copy-on-write)文件系统的思想,以日志结构存储元数据,以COW结构存储数据。这种特殊的存储方式,使LittleFS具有强大的掉电恢复能力(power-loss resilience\)。分配COW数据块时LittleFS采用了名为统计损耗均衡的动态损耗均衡算法,使Flash设备的寿命得到有效保障。同时LittleFS针对资源紧缺的小型设备进行设计,具有极其有限的ROM和RAM占用,并且所有RAM的使用都通过一个可配置的固定大小缓冲区进行分配,不会随文件系统的扩大占据更多的系统资源。 +LittleFS是一个小型的Flash文件系统,它结合日志结构(log-structured)文件系统和COW(copy-on-write)文件系统的思想,以日志结构存储元数据,以COW结构存储数据。这种特殊的存储方式,使LittleFS具有强大的掉电恢复能力(power-loss resilience\)。分配COW数据块时LittleFS采用了名为统计损耗均衡的动态损耗均衡算法,使Flash设备的寿命得到有效保障。同时LittleFS针对资源紧缺的小型设备进行设计,具有极其有限的ROM和RAM占用,并且所有RAM的使用都通过一个可配置的固定大小缓冲区进行分配,不会随文件系统的扩大占据更多的系统资源。 当在一个资源非常紧缺的小型设备上,寻找一个具有掉电恢复能力并支持损耗均衡的Flash文件系统时,LittleFS是一个比较好的选择。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/03.LittleFS-\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\346\226\207\344\273\266\347\263\273\347\273\237/02.LittleFS/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/03.LittleFS-\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\346\226\207\344\273\266\347\263\273\347\273\237/02.LittleFS/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" index 6c8f303ce23af0c9a2bae07f1e7a40c985deab00..2f5b5986bc01d4a64d7359b631331386a9a59fb5 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/03.LittleFS-\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/03.\346\211\251\345\261\225\347\273\204\344\273\266/03.\346\226\207\344\273\266\347\263\273\347\273\237/02.LittleFS/02.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- -title: LittleFS-开发指导 -permalink: /pages/000200020402 +title: 开发指导 +permalink: /pages/0004000002020101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213-\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213-\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" index 22264112912c15c1d9a95a68b0f4930ee33d5046..1902d7fe9b5f3409b8effc2b0c63d36e90894887 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213-\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" @@ -1,6 +1,6 @@ --- -title: 内存调测-内存信息统计 -permalink: /pages/0002000300 +title: 内存信息统计 +permalink: /pages/00040000030000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 内存信息统计 @@ -30,7 +30,7 @@ date: 2021-12-30 12:57:42 - 碎片率:衡量内存池的碎片化程度,碎片率高表现为内存池剩余内存很多,但是最大空闲内存块很小,可以用公式(fragment=100-100\*最大空闲内存块大小/剩余内存大小)来度量; -- 其他参数:通过调用接口(详见[内存管理](/pages/000200010200)章节接口说明),扫描内存池的节点信息,统计出相关信息。 +- 其他参数:通过调用接口(详见[内存管理](/pages/00040000010200)章节接口说明),扫描内存池的节点信息,统计出相关信息。 ## 功能配置 @@ -63,7 +63,7 @@ typedef struct { 本实例实现如下功能: -1.创建一个监控线程,用于获取内存池的信息; +1.创建一个监控任务,用于获取内存池的信息; 2.调用LOS\_MemInfoGet接口,获取内存池的基础信息; diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/02.\345\206\205\345\255\230\350\260\203\346\265\213-\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213/02.\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/02.\345\206\205\345\255\230\350\260\203\346\265\213-\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213/02.\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" index 3296a3c5268c381f35c907db336ed60be4bcb1fc..f72f95d86ffea2b9504f56a8c84eae00cbfaca4a 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/02.\345\206\205\345\255\230\350\260\203\346\265\213-\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213/02.\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" @@ -1,6 +1,6 @@ --- -title: 内存调测-内存泄漏检测 -permalink: /pages/0002000301 +title: 内存泄漏检测 +permalink: /pages/00040000030001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 内存泄漏检测 @@ -56,7 +56,7 @@ node size LR[0] LR[1] LR[2] 0x100179cc: 0x5c 0x9b02c24e 0x9b02c246 0x9b008ef0 ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >开启内存检测会影响内存申请的性能,且每个内存节点都会记录LR地址,内存开销也加大。 ### 编程实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/03.\345\206\205\345\255\230\350\260\203\346\265\213-\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213/03.\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/03.\345\206\205\345\255\230\350\260\203\346\265\213-\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213/03.\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" index d9d2fd04856f744acab0d54372d9edb655a11cb6..3fc7a52a78e067ab4423e6b212d18d89c3035181 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/03.\345\206\205\345\255\230\350\260\203\346\265\213-\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/01.\345\206\205\345\255\230\350\260\203\346\265\213/03.\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" @@ -1,6 +1,6 @@ --- -title: 内存调测-踩内存检测 -permalink: /pages/0002000302 +title: 踩内存检测 +permalink: /pages/00040000030002 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 踩内存检测 @@ -35,7 +35,7 @@ LOSCFG\_BASE\_MEM\_NODE\_INTEGRITY\_CHECK:开关宏,默认关闭;若打开 由于该功能只会检测出哪个内存节点被破坏了,并给出前节点信息(因为内存分布是连续的,当前节点最有可能被前节点破坏)。如果要进一步确认前节点在哪里申请的,需开启内存泄漏检测功能,通过LR记录,辅助定位。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >开启该功能,节点头多了魔鬼数字字段,会增大节点头大小。由于实时检测完整性,故性能影响较大;若性能敏感的场景,可以不开启该功能,使用LOS\_MemIntegrityCheck接口检测。 ## 开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/04.\345\274\202\345\270\270\350\260\203\346\265\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/02.\345\274\202\345\270\270\350\260\203\346\265\213.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/04.\345\274\202\345\270\270\350\260\203\346\265\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/02.\345\274\202\345\270\270\350\260\203\346\265\213.md" index ff2daa67015f9ec46a721c1971b21bc931577ff7..0f763203c0573a5b5642090b5439376985f3e434 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/04.\345\274\202\345\270\270\350\260\203\346\265\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/02.\345\274\202\345\270\270\350\260\203\346\265\213.md" @@ -1,6 +1,6 @@ --- title: 异常调测 -permalink: /pages/0002000303 +permalink: /pages/000400000301 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 异常调测 @@ -34,7 +34,7 @@ OpenHarmony LiteOS-M提供异常接管调测手段,帮助开发者定位分析 堆栈分析原理如下图所示,实际堆栈信息根据不同CPU架构有所差异,此处仅做示意。 **图 1** 堆栈分析原理示意图 -![](/images/zh-cn/device-dev/kernel/figure/堆栈分析原理示意图.png "堆栈分析原理示意图") +![](/images/device-dev/kernel/figure/堆栈分析原理示意图.png "堆栈分析原理示意图") 图中不同颜色的寄存器表示不同的函数。可以看到函数调用过程中,寄存器的保存。通过FP寄存器,栈回溯到异常函数的父函数,继续按照规律对栈进行解析,推出函数调用关系,方便用户定位问题。 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/03.Trace\350\260\203\346\265\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/03.Trace\350\260\203\346\265\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..70658771f5c02540ded2f953a701e52857c4fb7a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/03.Trace\350\260\203\346\265\213.md" @@ -0,0 +1,364 @@ +--- +title: Trace调测 +permalink: /pages/000400000302 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# Trace调测 + +- [基本概念](#section1) + +- [运行机制](#section2) + +- [接口说明](#section3) + +- [开发指导](#section4) + + - [开发流程](#section4.1) + + - [编程实例](#section4.2) + + - [实例代码](#section4.3) + + - [结果验证](#section4.4) + +## 基本概念 +Trace调测旨在帮助开发者获取内核的运行流程,各个模块、任务的执行顺序,从而可以辅助开发者定位一些时序问题或者了解内核的代码运行过程。 + +## 运行机制 +内核提供一套Hook框架,将Hook点预埋在各个模块的主要流程中, 在内核启动初期完成Trace功能的初始化,并注册Trace的处理函数到Hook中。 + +当系统触发到一个Hook点时,Trace模块会对输入信息进行封装,添加Trace帧头信息,包含事件类型、运行的cpuid、运行的任务id、运行的相对时间戳等信息; + +Trace提供2种工作模式,离线模式和在线模式。 + +离线模式会将trace frame记录到预先申请好的循环buffer中。如果循环buffer记录的frame过多则可能出现翻转,会覆盖之前的记录,故保持记录的信息始终是最新的信息。Trace循环buffer的数据可以通过shell命令导出进行详细分析,导出信息已按照时间戳信息完成排序。 + +![](/images/device-dev/kernel/figure/zh-cn_image_0000001127390512.png) + +在线模式需要配合IDE使用,实时将trace frame记录发送给IDE,IDE端进行解析并可视化展示。 + +## 接口说明 +OpenHarmony LiteOS-M内核的Trace模块提供下面几种功能,接口详细信息可以查看[API](https://gitee.com/openharmony/kernel_liteos_m/blob/master/components/trace/los_trace.h)参考。 + +**表 1** Trace模块接口说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名

+

描述

+

启停控制

+

LOS_TraceStart

+

启动Trace

+

LOS_TraceStop

+

停止Trace

+

操作Trace记录的数据

+

LOS_TraceRecordDump

+

输出Trace缓冲区数据

+

LOS_TraceRecordGet

+

获取Trace缓冲区的首地址

+

LOS_TraceReset

+

清除Trace缓冲区中的事件

+

过滤Trace记录的数据

+

LOS_TraceEventMaskSet

+

设置事件掩码,仅记录某些模块的事件

+

屏蔽某些中断号事件

+

LOS_TraceHwiFilterHookReg

+

注册过滤特定中断号事件的钩子函数

+

插桩函数

+

LOS_TRACE_EASY

+

简易插桩

+

LOS_TRACE

+

标准插桩

+
+ + +1. 当用户需要针对自定义事件进行追踪时,可按规则在目标源代码中进行插桩,系统提供如下2种插桩接口: + ++ LOS_TRACE_EASY(TYPE, IDENTITY, params...) 简易插桩。 + + - 一句话插桩,用户在目标源代码中插入该接口即可。 + + - TYPE有效取值范围为[0, 0xF],表示不同的事件类型,不同取值表示的含义由用户自定义。 + + - IDENTITY类型UINTPTR,表示事件操作的主体对象。 + + - Params类型UINTPTR,表示事件的参数。 + + - 示例: + + ``` + 假设需要新增对文件(fd1、fd2)读写操作的简易插桩, + 自定义读操作为type:1, 写操作为type:2,则 + 在读fd1文件的适当位置插入: + LOS_TRACE_EASY(1, fd1, flag, size); + 在读fd2文件的适当位置插入: + LOS_TRACE_EASY(1, fd2, flag, size); + 在写fd1文件的适当位置插入: + LOS_TRACE_EASY(2, fd1, flag, size); + 在写fd2文件的适当位置插入: + LOS_TRACE_EASY(2, fd2,flag, size); + ``` + ++ LOS_TRACE(TYPE, IDENTITY, params...) 标准插桩。 + + - 相比简易插桩,支持动态过滤事件和参数裁剪,但使用上需要用户按规则来扩展。 + + - TYPE用于设置具体的事件类型,可以在头文件los_trace.h中的enum LOS_TRACE_TYPE中自定义事件类型。定义方法和规则可以参考其他事件类型。 + + - IDENTITY和Params的类型及含义同简易插桩。 + + - 示例: +``` + 1.在enum LOS_TRACE_MASK中定义事件掩码,即模块级别的事件类型。 + 定义规范为TRACE_#MOD#_FLAG,#MOD#表示模块名,例如: + TRACE_FS_FLAG = 0x4000 + 2.在enum LOS_TRACE_TYPE中定义具体事件类型。定义规范为#TYPE# = TRACE_#MOD#_FLAG | NUMBER,例如: + FS_READ = TRACE_FS_FLAG | 0; // 读文件 + FS_WRITE = TRACE_FS_FLAG | 1; // 写文件 + 3.定义事件参数。定义规范为#TYPE#_PARAMS(IDENTITY, parma1...) IDENTITY, ... + 其中的#TYPE#就是上面2中的#TYPE#,例如: + #define FS_READ_PARAMS(fp, fd, flag, size) fp, fd, flag, size + 宏定义的参数对应于Trace缓冲区中记录的事件参数,用户可对任意参数字段进行裁剪: + 当定义为空时,表示不追踪该类型事件: + #define FS_READ_PARAMS(fp, fd, flag, size) // 不追踪文件读事件 + 4.在适当位置插入代码桩。定义规范为LOS_TRACE(#TYPE#, #TYPE#_PARAMS(IDENTITY, parma1...)) + LOS_TRACE(FS_READ, fp, fd, flag, size); // 读文件的代码桩, + #TYPE#之后的入参就是上面3中的FS_READ_PARAMS函数的入参 +``` +2. 预置的Trace事件及参数均可以通过上述方式进行裁剪,参数详见kernel\include\los_trace.h。 + +3. Trace Mask事件过滤接口LOS_TraceEventMaskSet(UINT32 mask),其入参mask仅高28位生效(对应LOS_TRACE_MASK中某模块的使能位),仅用于模块的过滤,暂不支持针对某个特定事件的细粒度过滤。例如:LOS_TraceEventMaskSet(0x202),则实际设置生效的mask为0x200(TRACE_QUE_FLAG),QUE模块的所有事件均会被采集。一般建议使用的方法为: + LOS_TraceEventMaskSet(TRACE_EVENT_FLAG | TRACE_MUX_FLAG | TRACE_SEM_FLAG | TRACE_QUE_FLAG); + +4. 如果仅需要过滤简易插桩事件,通过设置Trace Mask为TRACE_MAX_FLAG即可。 + +5. Trace缓冲区有限,事件写满之后会覆盖写,用户可通过LOS_TraceRecordDump中打印的CurEvtIndex识别最新记录。 + +6. Trace的典型操作流程为:LOS_TraceStart、 LOS_TraceStop、 LOS_TraceRecordDump. + +7. 针对中断事件的Trace, 提供中断号过滤,用于解决某些场景下特定中断号频繁触发导致其他事件被覆盖的情况,用户可自定义中断过滤的规则, + + 示例如下: +``` +BOOL Example_HwiNumFilter(UINT32 hwiNum) +{ + if ((hwiNum == TIMER_INT) || (hwiNum == DMA_INT)) { + return TRUE; + } + return FALSE; +} +LOS_TraceHwiFilterHookReg(Example_HwiNumFilter); +``` +则当中断号为TIMER_INT 或者DMA_INT时,不记录中断事件。 + +## 开发指导 + +### 开发流程 + +开启Trace调测的典型流程如下: + +1. 配置Trace模块相关宏。 + +需要在target_config.h头文件中修改配置: + +| 配置项 | 含义 | 设置值 | +| ------------------------------ | ------------------------------------------------------------ | ------ | +| LOSCFG_KERNEL_TRACE | Trace模块的裁剪开关 | YES/NO | +| LOSCFG_RECORDER_MODE_OFFLINE | Trace工作模式为离线模式 | YES/NO | +| LOSCFG_RECORDER_MODE_ONLINE | Trace工作模式为在线模式 | YES/NO | +| LOSCFG_TRACE_CLIENT_INTERACT | 使能与Trace IDE (dev tools)的交互,包括数据可视化和流程控制 | YES/NO | +| LOSCFG_TRACE_FRAME_CORE_MSG | 记录CPUID、中断状态、锁任务状态 | YES/NO | +| LOSCFG_TRACE_FRAME_EVENT_COUNT | 记录事件的次序编号 | YES/NO | +| LOSCFG_TRACE_FRAME_MAX_PARAMS | 配置记录事件的最大参数个数 | INT | +| LOSCFG_TRACE_BUFFER_SIZE | 配置Trace的缓冲区大小 | INT | + +2. (可选)预置事件参数和事件桩(或使用系统默认的事件参数配置和事件桩)。 + +3. (可选)调用LOS_TraceStop停止Trace后,清除缓冲区LOS_TraceReset(系统默认已启动trace)。 + +4. (可选)调用LOS_TraceEventMaskSet设置需要追踪的事件掩码(系统默认的事件掩码仅使能中断与任务事件),事件掩码参见los_trace.h 中的LOS_TRACE_MASK定义。 + +5. 在需要记录事件的代码起始点调用LOS_TraceStart。 + +6. 在需要记录事件的代码结束点调用LOS_TraceStop。 + +7. 调用LOS_TraceRecordDump输出缓冲区数据(函数的入参为布尔型,FALSE表示格式化输出,TRUE表示输出到windows客户端)。 + + +上述第3-7步中的接口,均封装有对应的shell命令,对应关系如下 + +- LOS_TraceReset —— trace_reset + +- LOS_TraceEventMaskSet —— trace_mask + +- LOS_TraceStart —— trace_start + +- LOS_TraceStop —— trace_stop + +- LOS_TraceRecordDump —— trace_dump + +### 编程实例 + + 本实例实现如下功能: + + 1. 创建一个用于Trace测试的任务。 + + 2. 设置事件掩码。 + + 3. 启动trace。 + + 4. 停止trace。 + + 5. 格式化输出trace数据。 + +### 示例代码 + +实例代码如下: + +```C +#include "los_trace.h" +UINT32 g_traceTestTaskId; +VOID Example_Trace(VOID) +{ + UINT32 ret; + LOS_TaskDelay(10); + /* 开启trace */ + ret = LOS_TraceStart(); + if (ret != LOS_OK) { + dprintf("trace start error\n"); + return; + } + /* 触发任务切换的事件 */ + LOS_TaskDelay(1); + LOS_TaskDelay(1); + LOS_TaskDelay(1); + /* 停止trace */ + LOS_TraceStop(); + LOS_TraceRecordDump(FALSE); +} + +UINT32 Example_Trace_test(VOID){ + UINT32 ret; + TSK_INIT_PARAM_S traceTestTask; + /* 创建用于trace测试的任务 */ + memset(&traceTestTask, 0, sizeof(TSK_INIT_PARAM_S)); + traceTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Trace; + traceTestTask.pcName = "TestTraceTsk"; /* 测试任务名称 */ + traceTestTask.uwStackSize = 0x800; + traceTestTask.usTaskPrio = 5; + traceTestTask.uwResved = LOS_TASK_STATUS_DETACHED; + ret = LOS_TaskCreate(&g_traceTestTaskId, &traceTestTask); + if(ret != LOS_OK){ + dprintf("TraceTestTask create failed .\n"); + return LOS_NOK; + } + /* 系统默认情况下已启动trace, 因此可先关闭trace后清除缓存区后,再重启trace */ + LOS_TraceStop(); + LOS_TraceReset(); + /* 开启任务模块事件记录 */ + LOS_TraceEventMaskSet(TRACE_TASK_FLAG); + return LOS_OK; +} +``` + +### 结果验证 + +输出结果如下: + +```c +*******TraceInfo begin******* +clockFreq = 50000000 +CurEvtIndex = 7 +Index Time(cycles) EventType CurTask Identity params +0 0x366d5e88 0x45 0x1 0x0 0x1f 0x4 0x0 +1 0x366d74ae 0x45 0x0 0x1 0x0 0x8 0x1f +2 0x36940da6 0x45 0x1 0xc 0x1f 0x4 0x9 +3 0x3694337c 0x45 0xc 0x1 0x9 0x8 0x1f +4 0x36eea56e 0x45 0x1 0xc 0x1f 0x4 0x9 +5 0x36eec810 0x45 0xc 0x1 0x9 0x8 0x1f +6 0x3706f804 0x45 0x1 0x0 0x1f 0x4 0x0 +7 0x37070e59 0x45 0x0 0x1 0x0 0x8 0x1f +*******TraceInfo end******* +``` + +输出的事件信息包括:发生时间、事件类型、事件发生在哪个任务中、事件操作的主体对象、事件的其他参数。 + +- EventType:表示的具体事件可查阅头文件los_trace.h中的enum LOS_TRACE_TYPE。 + +- CurrentTask:表示当前运行在哪个任务中,值为taskid。 + +- Identity:表示事件操作的主体对象,可查阅头文件los_trace.h中的#TYPE#_PARAMS。 + +- params:表示的事件参数可查阅头文件los_trace.h中的#TYPE#_PARAMS。 + +下面以序号为0的输出项为例,进行说明。 + +``` +Index Time(cycles) EventType CurTask Identity params +0 0x366d5e88 0x45 0x1 0x0 0x1f 0x4 +``` + +- Time cycles可换算成时间,换算公式为cycles/clockFreq,单位为s。 + +- 0x45为TASK_SWITCH即任务切换事件,当前运行的任务taskid为0x1。 + +- Identity和params的含义需要查看TASK_SWITCH_PARAMS宏定义: + +```c +#define TASK_SWITCH_PARAMS(taskId, oldPriority, oldTaskStatus, newPriority, newTaskStatus) \ +taskId, oldPriority, oldTaskStatus, newPriority, newTaskStatus +``` + +因为#TYPE#_PARAMS(IDENTITY, parma1...) IDENTITY, ...,所以Identity为taskId(0x0),第一个参数为oldPriority(0x1f) + +> ![](/images/device-dev/public_sys-resources/icon-note.gif)**说明** + + > params的个数由LOSCFG_TRACE_FRAME_MAX_PARAMS配置,默认为3,超出的参数不会被记录,用户应自行合理配置该值。 + + 综上所述,任务由0x1切换到0x0,0x1任务的优先级为0x1f,状态为0x4,0x0任务的优先级为0x0。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/04.LMS\350\260\203\346\265\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/04.LMS\350\260\203\346\265\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..a1be2d60e1c9a80dceaf34feeaa0ca2c2c9e6a87 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/04.\345\206\205\346\240\270\350\260\203\346\265\213/04.LMS\350\260\203\346\265\213.md" @@ -0,0 +1,306 @@ +--- +title: LMS调测 +permalink: /pages/000400000303 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# LMS调测 + +- [基本概念](#section1) + +- [运行机制](#section2) + +- [接口说明](#section3) + +- [开发指导](#section4) + + - [开发流程](#section4.1.1) + + - [编程实例](#section4.1.2) + + - [实例代码](#section4.1.3) + + - [结果验证](#section4.1.4) + + +## 基本概念 +LMS全称为Lite Memory Sanitizer,是一种实时检测内存操作合法性的调测工具。LMS能够实时检测缓冲区溢出(buffer overflow),释放后使用(use after free) 和重复释放(double Free), 在异常发生的第一时间通知操作系统,结合backtrace等定位手段,能准确定位到产生内存问题的代码行,极大提升内存问题定位效率。 + +## 运行机制 +LMS使用影子内存映射标记系统内存的状态,一共可标记为三个状态:可读写,不可读写,已释放。影子内存存放在内存池的尾部。 + +- 内存从堆上申请后,会将数据区的影子内存设置为“可读写”状态,并将头结点区的影子内存设置为“不可读写”状态。 + +- 内存在堆上被释放时,会将被释放内存的影子内存设置为“已释放”状态。 + +- 编译代码时,会在代码中的读写指令前插入检测函数,对地址的合法性进行检验。主要是检测访问内存的影子内存的状态值,若检测到影子内存为不可读写,则会报溢出错误;若检测到影子内存为已释放,则会报释放后使用错误。 + +- 在内存释放时,会检测被释放地址的影子内存状态值,若检测到影子内存非可读写,则会报重复释放错误。 + +## 接口说明 + +OpenHarmony LiteOS-M内核的LMS模块提供下面几种功能,接口详细信息可以查看[API](https://gitee.com/openharmony/kernel_liteos_m/blob/master/components/lms/los_lms.h)参考。 + + +1. 支持多内存池检测; + +2. 支持LOS_MemAlloc、LOS_MemAllocAlign、LOS_MemRealloc申请出的内存检测; + +3. 支持安全函数的访问检测(默认开启); + +4. 支持libc 高频函数的访问检测,包括:memset、memcpy、memmove、strcat、strcpy、strncat、strncpy。 + +5. 可动态设置的功能如下: + +**表 1** LMS模块接口说明 + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名

+

描述

+

添加指定内存池被检测

+

LOS_LmsCheckPoolAdd

+

将指定内存池的地址范围添加到LMS的内存检测链表上,当访问的地址在链表范围内时,LMS才进行合法性校验;且LOS_MemInit接口会调用该接口,默认将初始化的内存池挂入到检测链表中。

+

删除指定内存池不被检测

+

LOS_LmsCheckPoolDel

+

不检测指定内存池地址范围内的合法性校验。

+

使能指定内存段锁保护

+

LOS_LmsAddrProtect

+

为某段内存地址上锁,设置为不可读写,一旦访问则报错。

+

去能指定内存段锁保护

+

LOS_LmsAddrDisableProtect

+

为某段内存地址解锁,设置为可读写。

+
+ + +## 开发指导 + +### 开发流程 + +开启LMS调测的典型流程如下: + +1. 配置LMS模块相关宏。 + + 配置LMS控制宏LOSCFG_KERNEL_LMS,默认关,在kernel/liteos_a目录下执行 make update_config命令配置"Kernel->Enable Lite Memory Sanitizer"中打开: + + | 配置项 | menuconfig选项 | 含义 | 设置值 | + | ------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------ | + | LOSCFG_KERNEL_LMS | Enable Lms Feature | Lms模块的裁剪开关 | YES/NO | + | LOSCFG_LMS_MAX_RECORD_POOL_NUM | Lms check pool max num | LMS支持的检测内存池最大个数 | INT | + | LOSCFG_LMS_LOAD_CHECK | Enable lms read check | LMS内存读检测的裁剪开关 | YES/NO | + | LOSCFG_LMS_STORE_CHECK | Enable lms write check | LMS内存写检测的裁剪开关 | YES/NO | + | LOSCFG_LMS_CHECK_STRICT | Enable lms strict check, byte-by-byte | LMS内存逐字节严格检测的裁剪开关 | YES/NO | + +2. 在被检测模块的编译脚本中,增加LMS检测编译选项-fsanitize=kernel-address。 + +3. 为避免编译器优化,增加-O0编译选项。 + +4. gcc与clang编译选项存在差异,参照如下示例: + + ``` + if ("$ohos_build_compiler_specified" == "gcc") { + cflags_c = [ + "-O0", + "-fsanitize=kernel-address", + ] + } else { + cflags_c = [ + "-O0", + "-fsanitize=kernel-address", + "-mllvm", + "-asan-instrumentation-with-call-threshold=0", + "-mllvm", + "-asan-stack=0", + "-mllvm", + "-asan-globals=0", + ] + } + ``` + +5. 重新编译,查看串口输出。如果检测到内存问题,会输出检测结果。 + +### 编程实例 + + 本实例实现如下功能: + + 1. 创建一个用于Lms测试的任务。 + + 2. 构造内存溢出错误和释放后使用错误。 + + 3. 添加-fsanitize=kernel-address后编译执行,观察输出结果 + +### 示例代码 + +实例代码如下: + +```C +#define PAGE_SIZE (0x1000U) +#define INDEX_MAX 20 + +UINT32 g_lmsTestTaskId; +char g_testLmsPool[2 * PAGE_SIZE]; + +STATIC VOID testPoolInit(void) +{ + UINT32 ret = LOS_MemInit(g_testLmsPool, 2 * PAGE_SIZE); + if (ret != 0) { + PRINT_ERR("%s failed, ret = 0x%x\n", __FUNCTION__, ret); + return; + } +} + +static VOID LmsTestOsmallocOverflow(VOID) +{ + PRINTK("\n######%s start ######\n", __FUNCTION__); + UINT32 i; + CHAR *str = (CHAR *)LOS_MemAlloc(g_testLmsPool, INDEX_MAX); + PRINTK("str[%2d]=0x%2x ", INDEX_MAX, str[INDEX_MAX]); /* trigger heap overflow at str[INDEX_MAX] */ + PRINTK("\n######%s stop ######\n", __FUNCTION__); +} + +static VOID LmsTestUseAfterFree(VOID) +{ + PRINTK("\n######%s start ######\n", __FUNCTION__); + UINT32 i; + CHAR *str = (CHAR *)LOS_MemAlloc(g_testLmsPool, INDEX_MAX); + LOS_MemFree(g_testLmsPool, str); + PRINTK("str[%2d]=0x%2x ", 0, str[0]); /* trigger use after free at str[0] */ + PRINTK("\n######%s stop ######\n", __FUNCTION__); +} + +VOID LmsTestCaseTask(VOID) +{ + testPoolInit(); + LmsTestOsmallocOverflow(); + LmsTestUseAfterFree(); +} + +UINT32 Example_Lms_test(VOID){ + UINT32 ret; + TSK_INIT_PARAM_S lmsTestTask; + /* 创建用于lms测试的任务 */ + memset(&lmsTestTask, 0, sizeof(TSK_INIT_PARAM_S)); + lmsTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)LmsTestCaseTask; + lmsTestTask.pcName = "TestLmsTsk"; /* 测试任务名称 */ + lmsTestTask.uwStackSize = 0x800; + lmsTestTask.usTaskPrio = 5; + lmsTestTask.uwResved = LOS_TASK_STATUS_DETACHED; + ret = LOS_TaskCreate(&g_lmsTestTaskId, &lmsTestTask); + if(ret != LOS_OK){ + PRINT_ERR("LmsTestTask create failed .\n"); + return LOS_NOK; + } + return LOS_OK; +} +``` + +### 结果验证 + +输出结果如下: + +```c +######LmsTestOsmallocOverflow start ###### +[ERR]***** Kernel Address Sanitizer Error Detected Start ***** +[ERR]Heap buffer overflow error detected +[ERR]Illegal READ address at: [0x4157a3c8] +[ERR]Shadow memory address: [0x4157be3c : 4] Shadow memory value: [2] +OsBackTrace fp = 0x402c0f88 +runTask->taskName = LmsTestCaseTask +runTask->taskID = 2 +*******backtrace begin******* +traceback fp fixed, trace using fp = 0x402c0fd0 +traceback 0 -- lr = 0x400655a4 fp = 0x402c0ff8 +traceback 1 -- lr = 0x40065754 fp = 0x402c1010 +traceback 2 -- lr = 0x40044bd0 fp = 0x402c1038 +traceback 3 -- lr = 0x40004e14 fp = 0xcacacaca + +[LMS] Dump info around address [0x4157a3c8]: + + [0x4157a3a0]: 00 00 00 00 00 00 00 00 | [0x4157be3a | 0]: 1 1 + [0x4157a3a8]: ba dc cd ab 00 00 00 00 | [0x4157be3a | 4]: 2 2 + [0x4157a3b0]: 20 00 00 80 00 00 00 00 | [0x4157be3b | 0]: 2 0 + [0x4157a3b8]: 00 00 00 00 00 00 00 00 | [0x4157be3b | 4]: 0 0 + [0x4157a3c0]: 00 00 00 00 00 00 00 00 | [0x4157be3c | 0]: 0 0 + [0x4157a3c8]: [ba] dc cd ab a8 a3 57 41 | [0x4157be3c | 4]: [2] 2 + [0x4157a3d0]: 2c 1a 00 00 00 00 00 00 | [0x4157be3d | 0]: 2 3 + [0x4157a3d8]: 00 00 00 00 00 00 00 00 | [0x4157be3d | 4]: 3 3 + [0x4157a3e0]: 00 00 00 00 00 00 00 00 | [0x4157be3e | 0]: 3 3 + [0x4157a3e8]: 00 00 00 00 00 00 00 00 | [0x4157be3e | 4]: 3 3 + [0x4157a3f0]: 00 00 00 00 00 00 00 00 | [0x4157be3f | 0]: 3 3 +[ERR]***** Kernel Address Sanitizer Error Detected End ***** +str[20]=0xffffffba +######LmsTestOsmallocOverflow stop ###### + +###### LmsTestUseAfterFree start ###### +[ERR]***** Kernel Address Sanitizer Error Detected Start ***** +[ERR]Use after free error detected +[ERR]Illegal READ address at: [0x4157a3d4] +[ERR]Shadow memory address: [0x4157be3d : 2] Shadow memory value: [3] +OsBackTrace fp = 0x402c0f90 +runTask->taskName = LmsTestCaseTask +runTask->taskID = 2 +*******backtrace begin******* +traceback fp fixed, trace using fp = 0x402c0fd8 +traceback 0 -- lr = 0x40065680 fp = 0x402c0ff8 +traceback 1 -- lr = 0x40065758 fp = 0x402c1010 +traceback 2 -- lr = 0x40044bd0 fp = 0x402c1038 +traceback 3 -- lr = 0x40004e14 fp = 0xcacacaca + +[LMS] Dump info around address [0x4157a3d4]: + + [0x4157a3a8]: ba dc cd ab 00 00 00 00 | [0x4157be3a | 4]: 2 2 + [0x4157a3b0]: 20 00 00 80 00 00 00 00 | [0x4157be3b | 0]: 2 0 + [0x4157a3b8]: 00 00 00 00 00 00 00 00 | [0x4157be3b | 4]: 0 0 + [0x4157a3c0]: 00 00 00 00 00 00 00 00 | [0x4157be3c | 0]: 0 0 + [0x4157a3c8]: ba dc cd ab a8 a3 57 41 | [0x4157be3c | 4]: 2 2 + [0x4157a3d0]: 2c 1a 00 00 [00] 00 00 00 | [0x4157be3d | 0]: 2 [3] + [0x4157a3d8]: 00 00 00 00 00 00 00 00 | [0x4157be3d | 4]: 3 3 + [0x4157a3e0]: 00 00 00 00 00 00 00 00 | [0x4157be3e | 0]: 3 3 + [0x4157a3e8]: ba dc cd ab c8 a3 57 41 | [0x4157be3e | 4]: 2 2 + [0x4157a3f0]: 0c 1a 00 00 00 00 00 00 | [0x4157be3f | 0]: 2 3 + [0x4157a3f8]: 00 00 00 00 00 00 00 00 | [0x4157be3f | 4]: 3 3 +[ERR]***** Kernel Address Sanitizer Error Detected End ***** +str[ 0]=0x 0 +######LmsTestUseAfterFree stop ###### +``` +输出的关键信息包括: +- 错误类型: + - Heap buffer overflow堆内存越界 + - Use after free 释放后使用 +- 错误操作: + - Illegal Read非法读 + - Illegal Write非法写 + - Illegal Double free重复释放 +- 上下文: + - 当前任务信息(taskName, taskId) + - 回溯栈(backtrace) +- 出错地址的内存信息: + - 内存的值、及对应影子内存的值 + - 内存地址:内存值| [影子内存地址 | 影子内存字节内偏移]:影子内存值 + - 影子内存值:0(可读可写)、3(已释放)、2(红区)、1(填充值)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/01.\345\206\205\346\240\270\347\274\226\347\240\201\350\247\204\350\214\203.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/01.\345\206\205\346\240\270\347\274\226\347\240\201\350\247\204\350\214\203.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/01.\345\206\205\346\240\270\347\274\226\347\240\201\350\247\204\350\214\203.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/01.\345\206\205\346\240\270\347\274\226\347\240\201\350\247\204\350\214\203.md" index 545625e8ecc5c9c88ca59f4e54de979a73a1e8d6..2949a5fd1849f2f916ea9cad871017545a87516e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/01.\345\206\205\346\240\270\347\274\226\347\240\201\350\247\204\350\214\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/01.\345\206\205\346\240\270\347\274\226\347\240\201\350\247\204\350\214\203.md" @@ -1,6 +1,6 @@ --- title: 内核编码规范 -permalink: /pages/0002000400 +permalink: /pages/000400000400 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 内核编码规范 @@ -169,7 +169,8 @@ OsMuxInit struct MyType { // 跟随语句放行末,前置1空格 ... }; // 右大括号后面紧跟分号 -int Foo(int a) { // 函数左大括号独占一行,放行首 +int Foo(int a) +{ // 函数左大括号独占一行,放行首 if (a > 0) { Foo(); // 一行只有一条语句 Bar(); diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/02.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204/01.\345\217\214\345\220\221\351\223\276\350\241\250.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/02.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204/01.\345\217\214\345\220\221\351\223\276\350\241\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..af91802960972dafd657ab9da937fc9162cd6865 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/02.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204/01.\345\217\214\345\220\221\351\223\276\350\241\250.md" @@ -0,0 +1,204 @@ +--- +title: 双向链表 +permalink: /pages/00040000040100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# 双向链表 + +- [基本概念](#section1990715203418) +- [功能说明](#section848334511411) +- [开发流程](#section01781261552) +- [编程实例](#section67569495514) + - [实例描述](#section48761994551) + - [示例代码](#section1280202685519) + - [结果验证](#section5811249105512) + + +## 基本概念 + +双向链表是指含有往前和往后两个方向的链表,即每个结点中除存放下一个节点指针外,还增加一个指向前一个节点的指针。其头指针head是唯一确定的。 + +从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点,这种数据结构形式使得双向链表在查找时更加方便,特别是大量数据的遍历。由于双向链表具有对称性,能方便地完成各种插入、删除等操作,但需要注意前后方向的操作。 + +## 功能说明 + +双向链表模块为用户提供下面几种功能,接口详细信息可以查看API参考。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名

+

描述

+

初始化链表

+

LOS_ListInit

+

将指定双向链表节点初始化为双向链表

+

LOS_DL_LIST_HEAD

+

定义一个双向链表节点并以该节点初始化为双向链表

+

增加节点

+

LOS_ListAdd

+

将指定节点插入到双向链表头端

+

LOS_ListTailInsert

+

将指定节点插入到双向链表尾端

+

删除节点

+

LOS_ListDelete

+

将指定节点从链表中删除

+

LOS_ListDelInit

+

将指定节点从链表中删除,并使用该节点初始化链表

+

判断双向链表是否为空

+

LOS_ListEmpty

+

判断链表是否为空

+

获取结构体信息

+

LOS_DL_LIST_ENTRY

+

获取包含链表的结构体地址,接口的第一个入参表示的是链表中的某个节点,第二个入参是要获取的结构体名称,第三个入参是链表在该结构体中的名称

+

LOS_OFF_SET_OF

+

获取指定结构体内的成员相对于结构体起始地址的偏移量

+

遍历双向链表

+

LOS_DL_LIST_FOR_EACH

+

遍历双向链表

+

LOS_DL_LIST_FOR_EACH_SAFE

+

遍历双向链表,并存储当前节点的后继节点用于安全校验

+

遍历包含双向链表的结构体

+

LOS_DL_LIST_FOR_EACH_ENTRY

+

遍历指定双向链表,获取包含该链表节点的结构体地址

+

LOS_DL_LIST_FOR_EACH_ENTRY_SAFE

+

遍历指定双向链表,获取包含该链表节点的结构体地址,并存储包含当前节点的后继节点的结构体地址

+
+ +## 开发流程 + +双向链表的典型开发流程: + +1. 调用LOS\_ListInit/LOS\_DL\_LIST\_HEAD初始双向链表。 +2. 调用LOS\_ListAdd向链表插入节点。 +3. 调用LOS\_ListTailInsert向链表尾部插入节点。 +4. 调用LOS\_ListDelete删除指定节点。 +5. 调用LOS\_ListEmpty判断链表是否为空。 +6. 调用LOS\_ListDelInit删除指定节点并以此节点初始化链表。 + +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>- 需要注意节点指针前后方向的操作。 +>- 链表操作接口,为底层接口,不对入参进行判空,需要使用者确保传参合法。 +>- 如果链表节点的内存是动态申请的,删除节点时,要注意释放内存。 + +## 编程实例 + +### 实例描述 + +本实例实现如下功能: + +1. 初始化双向链表。 +2. 增加节点。 +3. 删除节点。 +4. 测试操作是否成功。 + +### 示例代码 + +示例代码如下: + +``` +#include "stdio.h" +#include "los_list.h" + +static UINT32 ListSample(VOID) +{ + LOS_DL_LIST listHead = {NULL,NULL}; + LOS_DL_LIST listNode1 = {NULL,NULL}; + LOS_DL_LIST listNode2 = {NULL,NULL}; + + //首先初始化链表 + printf("Initial head\n"); + LOS_ListInit(&listHead); + + //添加节点1和节点2,并校验他们的相互关系 + LOS_ListAdd(&listHead, &listNode1); + if (listNode1.pstNext == &listHead && listNode1.pstPrev == &listHead) { + printf("Add listNode1 success\n"); + } + + LOS_ListTailInsert(&listHead, &listNode2); + if (listNode2.pstNext == &listHead && listNode2.pstPrev == &listNode1) { + printf("Tail insert listNode2 success\n"); + } + + //删除两个节点 + LOS_ListDelete(&listNode1); + LOS_ListDelete(&listNode2); + + //确认链表为空 + if (LOS_ListEmpty(&listHead)) { + printf("Delete success\n"); + } + + return LOS_OK; +} +``` + +### 结果验证 + +编译运行得到的结果为: + +``` +Initial head +Add listNode1 success +Tail insert listNode2 success +Delete success +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201-CMSIS\346\224\257\346\214\201.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201/01.CMSIS\346\224\257\346\214\201.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201-CMSIS\346\224\257\346\214\201.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201/01.CMSIS\346\224\257\346\214\201.md" index 7ce304f544691c93dcbd1d3b8e7e1e8891908d7d..465a9b92581a7b2d88b0c9dbb3746193ad9e542e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201-CMSIS\346\224\257\346\214\201.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201/01.CMSIS\346\224\257\346\214\201.md" @@ -1,6 +1,6 @@ --- -title: 标准库支持-CMSIS支持 -permalink: /pages/0002000402 +title: CMSIS支持 +permalink: /pages/00040000040200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # CMSIS支持 @@ -470,7 +470,7 @@ CMSIS-RTOS2组件可以作为库或源代码提供(下图显示了库)。通 静态对象分配需要访问RTOS对象控制块定义。特定于实现的头文件(下图中的os\_xx .h)提供对此类控制块定义的访问。对于OpenHarmony LiteOS-M内核,由文件名以los\_开头的头文件提供,这些文件包含OpenHarmony LiteOS-M内核的这些定义。 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001132778524.png) +![](/images/device-dev/kernel/figure/zh-cn_image_0000001132778524.png) ### 编程实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/04.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201-POSIX\346\224\257\346\214\201.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201/02.POSIX\346\224\257\346\214\201.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/04.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201-POSIX\346\224\257\346\214\201.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201/02.POSIX\346\224\257\346\214\201.md" index e0e4253a98523aa692e571340d7fb55c6e35c498..265f3dd1a9772a84ab7aafc08836720ddd5901eb 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/04.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201-POSIX\346\224\257\346\214\201.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/01.\350\275\273\351\207\217\347\263\273\347\273\237\345\206\205\346\240\270/05.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223\346\224\257\346\214\201/02.POSIX\346\224\257\346\214\201.md" @@ -1,6 +1,6 @@ --- -title: 标准库支持-POSIX支持 -permalink: /pages/0002000403 +title: POSIX支持 +permalink: /pages/00040000040201 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # POSIX支持 @@ -263,7 +263,8 @@ OpenHarmony内核使用**musl libc**库以及自研接口,支持部分标准PO

删除文件

-

#include <fcntl.h

+

#include <fcntl.h>

int open(const char *path, int oflags, ...);

diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" similarity index 91% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" index 70226d614f7bd6a6284b9150623914b8c3d474c3..7665be5dff62d110bc39756b308cb68cd9cb4b6f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/01.\345\206\205\346\240\270\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 内核概述 -permalink: /pages/00020100 +permalink: /pages/0004000100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 内核概述 @@ -46,7 +46,7 @@ OpenHarmony 轻量级内核是基于IoT领域轻量级物联网操作系统Huawe **图 1** OpenHarmony LiteOS-A内核架构图 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001191018697.png) +![](/images/device-dev/kernel/figure/zh-cn_image_0000001191018697.png) - 基础内核主要包括内核的基础机制,如调度、内存管理、中断异常等 - 扩展组件主要包括文件系统、网络协议和安全等扩展功能 @@ -57,16 +57,16 @@ OpenHarmony 轻量级内核是基于IoT领域轻量级物联网操作系统Huawe 基础内核组件实现精简,主要包括内核的基础机制,如调度、内存管理、中断异常、内核通信等; -- 进程管理:支持进程和线程,基于Task实现进程,进程独立4GB地址空间 +- 进程管理:支持进程和线程,基于Task实现进程,进程独立4GiB地址空间 - 多核调度:支持任务和中断亲核性设置,支持绑核运行 - 实时调度:支持高优先级抢占,同优先级时间片轮转 -- 虚拟内存:支持缺页异常,内核空间静态映射到0-1G地址,用户空间映射到1-4G地址 +- 虚拟内存:支持缺页异常,内核空间静态映射到0-1GiB地址,用户空间映射到1-4GiB地址 - 内核通信:事件、信号量、互斥锁、队列 - 时间管理:软件定时器、系统时钟 **文件系统** -轻量级内核支持FAT,JFFS2,NFS,ramfs,procfs等众多文件系统,并对外提供完整的POSIX标准的操作接口,功能非常强大;内部使用VFS层作为统一的适配层框架,方便移植新的文件系统,各个文件系统也能自动利用VFS层提供的丰富的功能。 +轻量级内核支持FAT,JFFS2,NFS,ramfs,procfs等众多文件系统,并对外提供完整的POSIX标准的操作接口;内部使用VFS层作为统一的适配层框架,方便移植新的文件系统,各个文件系统也能自动利用VFS层提供的丰富的功能。 主要特性有: @@ -105,6 +105,6 @@ OpenHarmony 轻量级内核是基于IoT领域轻量级物联网操作系统Huawe - 动态链接:支持标准ELF链接执行、加载地址随机化 - 进程通信:支持轻量级LiteIPC,同时也支持标准的Mqueue、Pipe、Fifo、Signal等机制 -- 系统调用:支持170+系统调用 ,同时有支持VDSO机制 +- 系统调用:支持170+系统调用,同时有支持VDSO机制 - 权限管理:支持进程粒度的特权划分和管控,UGO三种权限配置 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/01.\345\206\205\346\240\270\346\200\201\345\220\257\345\212\250.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/01.\345\206\205\346\240\270\346\200\201\345\220\257\345\212\250.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/01.\345\206\205\346\240\270\346\200\201\345\220\257\345\212\250.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/01.\345\206\205\346\240\270\346\200\201\345\220\257\345\212\250.md" index a8856624480e131ddaa31a2f43422adb80fc6cf8..37e0daab49873d67ec0432b87282a7fc257b42d7 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/01.\345\206\205\346\240\270\346\200\201\345\220\257\345\212\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/01.\345\206\205\346\240\270\346\200\201\345\220\257\345\212\250.md" @@ -1,6 +1,6 @@ --- title: 内核态启动 -permalink: /pages/0002010100 +permalink: /pages/000400010100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 内核态启动 @@ -25,7 +25,7 @@ date: 2021-12-30 12:57:42 **图 1** 内核启动流程图 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001178856385.png) +![](/images/device-dev/kernel/figure/zh-cn_image_0000001178856385.png) **表 1** 启动框架层级 @@ -99,7 +99,7 @@ date: 2021-12-30 12:57:42

LOS_INIT_LEVEL_KMOD_TASK

内核任务创建

-

说明:进行内核任务的创建(内核线程,软件定时器任务)

+

说明:进行内核任务的创建(内核任务,软件定时器任务)

例如:资源回收系统常驻任务的创建、SystemInit任务创建、CPU占用率统计任务创建

@@ -142,7 +142,7 @@ cpu 0 entering scheduler 根据上述系统启动阶段的打印可知,内核在启动时进行了该注册模块的初始化函数调用,完成该模块的初始化操作。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >启动框架中同一层级内的注册模块不能有依赖关系,建议新增模块按照上述启动阶段进行模块初始化的拆分,按需注册启动。 >可通过查看系统编译生成文件OHOS\_Image.map中.rodata.init.kernel.\*段内的符号表来了解当前已注册进内核启动框架中的各个模块初始化入口,以及检查新注册的模块初始化入口是否生效。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/02.\347\224\250\346\210\267\346\200\201\345\220\257\345\212\250.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/02.\347\224\250\346\210\267\346\200\201\345\220\257\345\212\250.md" similarity index 77% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/02.\347\224\250\346\210\267\346\200\201\345\220\257\345\212\250.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/02.\347\224\250\346\210\267\346\200\201\345\220\257\345\212\250.md" index f1d655e78777b356fe841ad289dd28ec143ed729..76423ac71d33212176dc561cf579e23038966ba9 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/02.\347\224\250\346\210\267\346\200\201\345\220\257\345\212\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/02.\345\206\205\346\240\270\345\220\257\345\212\250/02.\347\224\250\346\210\267\346\200\201\345\220\257\345\212\250.md" @@ -1,6 +1,6 @@ --- title: 用户态启动 -permalink: /pages/0002010101 +permalink: /pages/000400010101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 用户态启动 @@ -24,7 +24,7 @@ date: 2021-12-30 12:57:42 根进程是系统第一个用户态进程,进程ID为1,它是所有用户态进程的祖先。 **图 1** 进程树示意图 -![](/images/zh-cn/device-dev/kernel/figure/进程树示意图.png "进程树示意图") +![](/images/device-dev/kernel/figure/进程树示意图.png "进程树示意图") ### 根进程的启动过程 @@ -51,8 +51,8 @@ LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args) - 启动关键系统程序或服务,如交互进程shell。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >在OpenHarmony 中**init**进程通过读取/etc/init.cfg,根据配置执行指定命令,或启动指定进程(详见:[init启动引导](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-boot-init.md))。 + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >在OpenHarmony 中**init**进程通过读取/etc/init.cfg,根据配置执行指定命令,或启动指定进程(详见:[init启动引导](/pages/00040d01))。 - 监控回收孤儿进程,清理子进程中的僵尸进程。 @@ -61,7 +61,7 @@ LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args) 用户态程序常见编译方式有如下两种: -1. [利用框架编译用户态进程](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-running.md)。 +1. [利用框架编译用户态进程](/pages/000100020101)。 2. 手动编译 实例: @@ -70,7 +70,7 @@ LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args) clang --target=arm-liteos --sysroot=prebuilts/lite/sysroot -o helloworld helloworld.c ``` - **clang**:参考[LLVM安装指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-linux.md)安装LLVM编译器。 + **clang**:参考[LLVM安装指导](/pages/0001000102)安装LLVM编译器。 **--target**:--target=arm-liteos,指定编译平台为arm-liteos。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\345\217\212\345\274\202\345\270\270\345\244\204\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\345\217\212\345\274\202\345\270\270\345\244\204\347\220\206.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\345\217\212\345\274\202\345\270\270\345\244\204\347\220\206.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\345\217\212\345\274\202\345\270\270\345\244\204\347\220\206.md" index 309d492b0883ca3c2b6eed78008adcb51aaec5ba..7cf0a1b882612e9424603fb284b33b8d048803fa 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\345\217\212\345\274\202\345\270\270\345\244\204\347\220\206.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/01.\344\270\255\346\226\255\345\217\212\345\274\202\345\270\270\345\244\204\347\220\206.md" @@ -1,6 +1,6 @@ --- title: 中断及异常处理 -permalink: /pages/0002010200 +permalink: /pages/000400010200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 中断及异常处理 @@ -39,7 +39,7 @@ date: 2021-12-30 12:57:42 **图 1** 中断向量表 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001173449871.png) +![](/images/device-dev/kernel/figure/zh-cn_image_0000001173449871.png) ## 开发指导 @@ -72,12 +72,12 @@ date: 2021-12-30 12:57:42

LOS_IntUnLock

-

打开当前处理器所有中断响应

+

打开当前处理器所有中断响应

LOS_IntLock

-

关闭当前处理器所有中断响应

+

关闭当前处理器所有中断响应

LOS_IntRestore

diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/01.\350\277\233\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/01.\350\277\233\347\250\213.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/01.\350\277\233\347\250\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/01.\350\277\233\347\250\213.md" index 70ea97c4b2e97148c1352db555e147f1f369ad7f..2e6ae9a80952d28aabbad466969a207958bee681 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/01.\350\277\233\347\250\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/01.\350\277\233\347\250\213.md" @@ -1,6 +1,6 @@ --- title: 进程 -permalink: /pages/000201020100 +permalink: /pages/00040001020100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 进程 @@ -41,7 +41,7 @@ date: 2021-12-30 12:57:42 - 僵尸(Zombies):进程运行结束,等待父进程回收其控制块资源。 **图 1** 进程状态迁移示意图 -![](/images/zh-cn/device-dev/kernel/figure/进程状态迁移示意图.png "进程状态迁移示意图") +![](/images/device-dev/kernel/figure/进程状态迁移示意图.png "进程状态迁移示意图") **进程状态迁移说明:** @@ -88,7 +88,7 @@ OpenHarmony 提供的进程模块主要用于实现用户态进程的隔离, **图 2** 进程管理示意图 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127519136.png) +![](/images/device-dev/kernel/figure/zh-cn_image_0000001127519136.png) ## 开发指导 @@ -184,7 +184,7 @@ OpenHarmony 提供的进程模块主要用于实现用户态进程的隔离, 不支持内核态进程创建,内核态不涉及进程相关开发。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- idle线程的数量跟随CPU核心数,每个CPU均有一个相应的idle线程。 >- 不支持创建除KProcess和KIdle进程之外的其它内核态进程。 >- 用户态进程通过系统调用进入内核态后创建的线程属于KProcess, 不属于当前用户态进程。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/02.\344\273\273\345\212\241.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/02.\344\273\273\345\212\241.md" similarity index 73% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/02.\344\273\273\345\212\241.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/02.\344\273\273\345\212\241.md" index f7267c9a483d73d32114b3257ff46d61a1da6b1b..12c2f707b289003013a71ed11515b23167ce7106 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/02.\344\273\273\345\212\241.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/02.\344\273\273\345\212\241.md" @@ -1,6 +1,6 @@ --- title: 任务 -permalink: /pages/000201020101 +permalink: /pages/00040001020101 navbar: true sidebar: true prev: true @@ -9,9 +9,9 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- -# 线程 +# 任务 - [基本概念](#section138411646175417) - [运行机制](#section1381918945512) @@ -23,64 +23,66 @@ date: 2021-12-30 12:57:42 ## 基本概念 -从系统的角度看,线程是竞争系统资源的最小运行单元。线程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它线程运行。 +从系统的角度看,任务Task是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。 -OpenHarmony 内核中同优先级进程内的线程统一调度、运行。 +OpenHarmony 内核中使用一个任务表示一个线程。 -OpenHarmony 内核中的线程采用抢占式调度机制,同时支持时间片轮转调度和FIFO调度方式。 +OpenHarmony 内核中同优先级进程内的任务统一调度、运行。 -OpenHarmony 内核的线程一共有32个优先级\(0-31\),最高优先级为0,最低优先级为31。 +OpenHarmony 内核中的任务采用抢占式调度机制,同时支持时间片轮转调度和FIFO调度方式。 -当前进程内, 高优先级的线程可抢占低优先级线程,低优先级线程必须在高优先级线程阻塞或结束后才能得到调度。 +OpenHarmony 内核的任务一共有32个优先级\(0-31\),最高优先级为0,最低优先级为31。 -**线程状态说明**: +当前进程内, 高优先级的任务可抢占低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。 -- 初始化(Init):线程正在被创建。 +**任务状态说明**: -- 就绪(Ready):线程在就绪列表中,等待CPU调度。 -- 运行(Running):线程正在运行。 -- 阻塞(Blocked):线程被阻塞挂起。Blocked状态包括:pending\(因为锁、事件、信号量等阻塞\)、suspended(主动pend)、delay\(延时阻塞\)、pendtime\(因为锁、事件、信号量时间等超时等待\)。 -- 退出(Exit):线程运行结束,等待父线程回收其控制块资源。 +- 初始化(Init):任务正在被创建。 -**图 1** 线程状态迁移示意图 -![](/images/zh-cn/device-dev/kernel/figure/线程状态迁移示意图.png "线程状态迁移示意图") +- 就绪(Ready):任务在就绪列表中,等待CPU调度。 +- 运行(Running):任务正在运行。 +- 阻塞(Blocked):任务被阻塞挂起。Blocked状态包括:pending\(因为锁、事件、信号量等阻塞\)、suspended(主动pend)、delay\(延时阻塞\)、pendtime\(因为锁、事件、信号量时间等超时等待\)。 +- 退出(Exit):任务运行结束,等待父任务回收其控制块资源。 -**线程状态迁移说明:** +**图 1** 任务状态迁移示意图 + + +**任务状态迁移说明:** - Init→Ready: - 线程创建拿到控制块后为初始化阶段\(Init状态\),当线程初始化完成将线程插入调度队列,此时线程进入就绪状态。 + 任务创建拿到控制块后为初始化阶段\(Init状态\),当任务初始化完成将任务插入调度队列,此时任务进入就绪状态。 - Ready→Running: - 线程创建后进入就绪态,发生线程切换时,就绪列表中最高优先级的线程被执行,从而进入运行态,此刻该线程从就绪列表中删除。 + 任务创建后进入就绪态,发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态,此刻该任务从就绪列表中删除。 - Running→Blocked: - 正在运行的线程发生阻塞(挂起、延时、读信号量等)时,线程状态由运行态变成阻塞态,然后发生线程切换,运行就绪列表中剩余最高优先级线程。 + 正在运行的任务发生阻塞(挂起、延时、读信号量等)时,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中剩余最高优先级任务。 - Blocked→Ready : - 阻塞的线程被恢复后(线程恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的线程会被加入就绪列表,从而由阻塞态变成就绪态。 + 阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态。 - Ready→Blocked: - 线程也有可能在就绪态时被阻塞(挂起),此时线程状态会由就绪态转变为阻塞态,该线程从就绪列表中删除,不会参与线程调度,直到该线程被恢复。 + 任务也有可能在就绪态时被阻塞(挂起),此时任务状态会由就绪态转变为阻塞态,该任务从就绪列表中删除,不会参与任务调度,直到该任务被恢复。 - Running→Ready: - 有更高优先级线程创建或者恢复后,会发生线程调度,此刻就绪列表中最高优先级线程变为运行态,那么原先运行的线程由运行态变为就绪态,并加入就绪列表中。 + 有更高优先级任务创建或者恢复后,会发生任务调度,此刻就绪列表中最高优先级任务变为运行态,那么原先运行的任务由运行态变为就绪态,并加入就绪列表中。 - Running→Exit: - 运行中的线程运行结束,线程状态由运行态变为退出态。若为设置了分离属性(LOS\_TASK\_STATUS\_DETACHED)的线程,运行结束后将直接销毁。 + 运行中的任务运行结束,任务状态由运行态变为退出态。若为设置了分离属性(LOS\_TASK\_STATUS\_DETACHED)的任务,运行结束后将直接销毁。 ## 运行机制 -OpenHarmony 线程管理模块提供线程创建、线程延时、线程挂起和线程恢复、锁线程调度和解锁线程调度、根据ID查询线程控制块信息功能。 +OpenHarmony 任务管理模块提供任务创建、任务延时、任务挂起和任务恢复、锁任务调度和解锁任务调度、根据ID查询任务控制块信息功能。 -用户创建线程时,系统会将线程栈进行初始化,预置上下文。此外,系统还会将“线程入口函数”地址放在相应位置。这样在线程第一次启动进入运行态时,将会执行线程入口函数。 +用户创建任务时,系统会将任务栈进行初始化,预置上下文。此外,系统还会将“任务入口函数”地址放在相应位置。这样在任务第一次启动进入运行态时,将会执行任务入口函数。 ## 开发指导 @@ -95,115 +97,115 @@ OpenHarmony 线程管理模块提供线程创建、线程延时、线程挂起 -

线程的创建和删除

+

任务的创建和删除

LOS_TaskCreateOnly

-

创建线程,并使该线程进入Init状态,不执行线程调度

+

创建任务,并使该任务进入Init状态,不执行任务调度

LOS_TaskCreate

-

创建线程,并使该线程进入Ready状态,并调度

+

创建任务,并使该任务进入Ready状态,并调度

LOS_TaskDelete

-

删除指定的线程

+

删除指定的任务

-

线程状态控制

+

任务状态控制

LOS_TaskResume

-

恢复挂起的线程

+

恢复挂起的任务

LOS_TaskSuspend

-

挂起指定的线程

+

挂起指定的任务

LOS_TaskDelay

-

线程延时等待

+

任务延时等待

LOS_TaskYield

-

显式放权,调整调用线程优先级的线程调度顺序

+

显式放权,调整调用任务优先级的任务调度顺序

-

线程调度的控制

+

任务调度的控制

LOS_TaskLock

-

锁线程调度

+

锁任务调度

LOS_TaskUnlock

-

解锁线程调度

+

解锁任务调度

-

线程优先级的控制

+

任务优先级的控制

LOS_CurTaskPriSet

-

设置当前线程的优先级

+

设置当前任务的优先级

LOS_TaskPriSet

-

设置指定线程的优先级

+

设置指定任务的优先级

LOS_TaskPriGet

-

获取指定线程的优先级

+

获取指定任务的优先级

-

线程信息获取

+

任务信息获取

LOS_CurTaskIDGet

-

获取当前线程的ID

+

获取当前任务的ID

LOS_TaskInfoGet

-

获取指定线程的信息

+

获取指定任务的信息

-

线程绑核操作

+

任务绑核操作

LOS_TaskCpuAffiSet

-

绑定指定线程到指定cpu上运行,仅在多核下使用

+

绑定指定任务到指定cpu上运行,仅在多核下使用

LOS_TaskCpuAffiGet

-

获取指定线程的绑核信息,仅在多核下使用

+

获取指定任务的绑核信息,仅在多核下使用

-

线程调度参数的控制

+

任务调度参数的控制

LOS_GetTaskScheduler

-

获取指定线程的调度策略

+

获取指定任务的调度策略

LOS_SetTaskScheduler

-

设置指定线程的调度参数,包括优先级和调度策略

+

设置指定任务的调度参数,包括优先级和调度策略

-

系统支持的最大线程数

+

系统支持的最大任务数

LOS_GetSystemTaskMaximum

-

获取系统支持的最大线程数目

+

获取系统支持的最大任务数目

@@ -211,23 +213,23 @@ OpenHarmony 线程管理模块提供线程创建、线程延时、线程挂起 ### 开发流程 -线程的典型开发流程: +任务的典型开发流程: -1. 通过LOS\_TaskCreate创建一个线程。 - - 指定线程的执行入口函数 +1. 通过LOS\_TaskCreate创建一个任务。 + - 指定任务的执行入口函数 - - 指定线程名 - - 指定线程的栈大小 - - 指定线程的优先级 - - 指定线程的属性,是否支持LOS\_TASK\_STATUS\_DETACHED属性 - - 多核运行时,可以选择设置线程的绑核属性 + - 指定任务名 + - 指定任务的栈大小 + - 指定任务的优先级 + - 指定任务的属性,是否支持LOS\_TASK\_STATUS\_DETACHED属性 + - 多核运行时,可以选择设置任务的绑核属性 -2. 线程参与调度运行,执行用户指定的业务代码。 -3. 线程执行结束,如果线程设置了LOS\_TASK\_STATUS\_DETACHED属性,则线程运行结束后自动回收线程资源,如果未设置LOS\_TASK\_STATUS\_DETACHED属性,则需要调用LOS\_TaskDelete接口回收线程资源。 +2. 任务参与调度运行,执行用户指定的业务代码。 +3. 任务执行结束,如果任务设置了LOS\_TASK\_STATUS\_DETACHED属性,则任务运行结束后自动回收任务资源,如果未设置LOS\_TASK\_STATUS\_DETACHED属性,则需要调用LOS\_TaskDelete接口回收任务资源。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->- 内核态具有最高权限,可以操作任意进程内的线程。 ->- 用户态进程通过系统调用进入内核态后创建的线程属于KProcess, 不属于当前用户态进程。 +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>- 内核态具有最高权限,可以操作任意进程内的任务。 +>- 用户态进程通过系统调用进入内核态后创建的任务属于KProcess, 不属于当前用户态进程。 ### 编程实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/03.\350\260\203\345\272\246\345\231\250.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/03.\350\260\203\345\272\246\345\231\250.md" similarity index 92% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/03.\350\260\203\345\272\246\345\231\250.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/03.\350\260\203\345\272\246\345\231\250.md" index a46673237a9edbbe92762ecbb2d40fd08670e407..8be28410caed4999478e139743ae4273a44306ab 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/03.\350\260\203\345\272\246\345\231\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/02.\350\277\233\347\250\213\347\256\241\347\220\206/03.\350\260\203\345\272\246\345\231\250.md" @@ -1,6 +1,6 @@ --- title: 调度器 -permalink: /pages/000201020102 +permalink: /pages/00040001020102 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 调度器 @@ -37,14 +37,14 @@ OpenHarmony 采用进程优先级队列+线程优先级队列的方式,进程 **图 1** 调度优先级桶队列示意图 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127520662.png) +![](/images/device-dev/kernel/figure/zh-cn_image_0000001127520662.png) OpenHarmony 在系统启动内核初始化之后开始调度,运行过程中创建的进程或线程会被加入到调度队列,系统根据进程和线程的优先级及线程的时间片消耗情况选择最优的线程进行调度运行,线程一旦调度到就会从调度队列上删除,线程在运行过程中发生阻塞,会被加入到对应的阻塞队列中并触发一次调度,调度其它线程运行。如果调度队列上没有可以调度的线程,则系统就会选择KIdle进程的线程进行调度运行。 **图 2** 调度流程示意图 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001176974089.png) +![](/images/device-dev/kernel/figure/zh-cn_image_0000001176974089.png) ## 开发指导 @@ -71,6 +71,6 @@ OpenHarmony 在系统启动内核初始化之后开始调度,运行过程中 ### 开发流程 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >系统启动初始化阶段,不允许触发调度。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\240\206\345\206\205\345\255\230\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\240\206\345\206\205\345\255\230\347\256\241\347\220\206.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\240\206\345\206\205\345\255\230\347\256\241\347\220\206.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\240\206\345\206\205\345\255\230\347\256\241\347\220\206.md" index 66fedec31b3bd5d09debda54634a28817629cd11..6307e94b487e3c6b9147ed419f4526080fd18268 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\240\206\345\206\205\345\255\230\347\256\241\347\220\206.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/01.\345\240\206\345\206\205\345\255\230\347\256\241\347\220\206.md" @@ -1,6 +1,6 @@ --- title: 堆内存管理 -permalink: /pages/000201020200 +permalink: /pages/00040001020200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 堆内存管理 @@ -32,7 +32,7 @@ date: 2021-12-30 12:57:42 堆内存管理,即在内存资源充足的情况下,根据用户需求,从系统配置的一块比较大的连续内存(内存池,也是堆内存)中分配任意大小的内存块。当用户不需要该内存块时,又可以释放回系统供下一次使用。与静态内存相比,动态内存管理的优点是按需分配,缺点是内存池中容易出现碎片。OpenHarmony LiteOS-A堆内存在TLSF算法的基础上,对区间的划分进行了优化,获得更优的性能,降低了碎片率。动态内存核心算法框图如下: **图 1** 动态内存核心算法 -![](/images/zh-cn/device-dev/kernel/figure/动态内存核心算法-19.png "动态内存核心算法-19") +![](/images/device-dev/kernel/figure/动态内存核心算法-19.png "动态内存核心算法-19") 根据空闲内存块的大小,使用多个空闲链表来管理。根据内存空闲块大小分为两个部分:\[4, 127\]和\[27, 231\],如上图size class所示: @@ -44,7 +44,7 @@ date: 2021-12-30 12:57:42 内存管理结构如下图所示: **图 2** 动态内存管理结构图 -![](/images/zh-cn/device-dev/kernel/figure/动态内存管理结构图-20.png "动态内存管理结构图-20") +![](/images/device-dev/kernel/figure/动态内存管理结构图-20.png "动态内存管理结构图-20") - 内存池池头部分 @@ -149,7 +149,7 @@ OpenHarmony LiteOS-A的堆内存管理主要为用户提供以下功能,接口 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 由于动态内存管理需要管理控制块数据结构来管理内存,这些数据结构会额外消耗内存,故实际用户可使用内存总量小于配置项OS\_SYS\_MEM\_SIZE的大小。 >- 对齐分配内存接口LOS\_MemAllocAlign/LOS\_MemMallocAlign因为要进行地址对齐,可能会额外消耗部分内存,故存在一些遗失内存,当系统释放该对齐内存时,同时回收由于对齐导致的遗失内存。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\347\211\251\347\220\206\345\206\205\345\255\230\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\347\211\251\347\220\206\345\206\205\345\255\230\347\256\241\347\220\206.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\347\211\251\347\220\206\345\206\205\345\255\230\347\256\241\347\220\206.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\347\211\251\347\220\206\345\206\205\345\255\230\347\256\241\347\220\206.md" index 5e5f5344b6d3d36266235a5ddc4b28ee1e27449e..7f232a68a25dcf12d9b9083e9150accbfb6c7087 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\347\211\251\347\220\206\345\206\205\345\255\230\347\256\241\347\220\206.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/02.\347\211\251\347\220\206\345\206\205\345\255\230\347\256\241\347\220\206.md" @@ -1,6 +1,6 @@ --- title: 物理内存管理 -permalink: /pages/000201020201 +permalink: /pages/00040001020201 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 物理内存管理 @@ -31,7 +31,7 @@ date: 2021-12-30 12:57:42 如下图所示,LiteOS-A内核的物理内存使用分布视图,主要由内核镜像、内核堆及物理页组成。内核堆部分见堆内存管理一节。 **图 1** 物理内存使用分布图 -![](/images/zh-cn/device-dev/kernel/figure/物理内存使用分布图.png "物理内存使用分布图") +![](/images/device-dev/kernel/figure/物理内存使用分布图.png "物理内存使用分布图") 伙伴算法把所有空闲页帧分成9个内存块组,每组中内存块包含2的幂次方个页帧,例如:第0组的内存块包含2的0次方个页帧,即1个页帧;第8组的内存块包含2的8次方个页帧,即256个页帧。相同大小的内存块挂在同一个链表上进行管理。 @@ -40,7 +40,7 @@ date: 2021-12-30 12:57:42 系统申请12KiB内存,即3个页帧时,9个内存块组中索引为3的链表挂着一块大小为8个页帧的内存块满足要求,分配出12KiB内存后还剩余20KiB内存,即5个页帧,将5个页帧分成2的幂次方之和,即4跟1,尝试查找伙伴进行合并。4个页帧的内存块没有伙伴则直接插到索引为2的链表上,继续查找1个页帧的内存块是否有伙伴,索引为0的链表上此时有1个,如果两个内存块地址连续则进行合并,并将内存块挂到索引为1的链表上,否则不做处理。 **图 2** 内存申请示意图 - ![](/images/zh-cn/device-dev/kernel/figure/内存申请示意图.png "内存申请示意图") + ![](/images/device-dev/kernel/figure/内存申请示意图.png "内存申请示意图") - 释放内存 @@ -48,7 +48,7 @@ date: 2021-12-30 12:57:42 系统释放12KiB内存,即3个页帧,将3个页帧分成2的幂次方之和,即2跟1,尝试查找伙伴进行合并,索引为1的链表上有1个内存块,若地址连续则合并,并将合并后的内存块挂到索引为2的链表上,索引为0的链表上此时也有1个,如果地址连续则进行合并,并将合并后的内存块挂到索引为1的链表上,此时继续判断是否有伙伴,重复上述操作。 **图 3** 内存释放示意图 - ![](/images/zh-cn/device-dev/kernel/figure/内存释放示意图.png "内存释放示意图") + ![](/images/device-dev/kernel/figure/内存释放示意图.png "内存释放示意图") ## 开发指导 @@ -119,7 +119,7 @@ date: 2021-12-30 12:57:42 内存申请时根据需要调用相关接口,小内存申请建议使用堆内存申请相关接口,4KiB及以上内存申请可以使用上述物理内存相关接口。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 物理内存申请相关接口需要在OsSysMemInit接口完成初始化之后再使用; >- 内存申请的基本单位是页帧,即4KiB; >- 物理内存申请时,有地址连续要求的使用LOS\_PhysPagesAllocContiguous接口,无地址连续的要求尽量使用LOS\_PhysPagesAlloc接口,将连续的大块内存留给有需要的模块使用。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\350\231\232\346\213\237\345\206\205\345\255\230\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\350\231\232\346\213\237\345\206\205\345\255\230\347\256\241\347\220\206.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\350\231\232\346\213\237\345\206\205\345\255\230\347\256\241\347\220\206.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\350\231\232\346\213\237\345\206\205\345\255\230\347\256\241\347\220\206.md" index 08bcc21828cb69ea846b7919dcd48cb0b9b56cf2..f692f0cdb68e2e535a5d891e5935ac0d2fcb48a8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\350\231\232\346\213\237\345\206\205\345\255\230\347\256\241\347\220\206.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/03.\350\231\232\346\213\237\345\206\205\345\255\230\347\256\241\347\220\206.md" @@ -1,6 +1,6 @@ --- title: 虚拟内存管理 -permalink: /pages/000201020202 +permalink: /pages/00040001020202 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 虚拟内存管理 @@ -107,11 +107,11 @@ date: 2021-12-30 12:57:42 虚拟内存管理中,虚拟地址空间是连续的,但是其映射的物理内存并不一定是连续的,如下图所示。可执行程序加载运行,CPU访问虚拟地址空间的代码或数据时存在两种情况: -- CPU访问的虚拟地址所在的页,如V0,已经与具体的物理页P0做映射,CPU通过找到进程对应的页表条目(详见[虚实映射](/pages/000201020203)),根据页表条目中的物理地址信息访问物理内存中的内容并返回。 +- CPU访问的虚拟地址所在的页,如V0,已经与具体的物理页P0做映射,CPU通过找到进程对应的页表条目(详见[虚实映射](/pages/00040001020203)),根据页表条目中的物理地址信息访问物理内存中的内容并返回。 - CPU访问的虚拟地址所在的页,如V2,没有与具体的物理页做映射,系统会触发缺页异常,系统申请一个物理页,并把相应的信息拷贝到物理页中,并且把物理页的起始地址更新到页表条目中。此时CPU重新执行访问虚拟内存的指令便能够访问到具体的代码或数据。 **图 1** 内存映射示意图 -![](/images/zh-cn/device-dev/kernel/figure/内存映射示意图.png "内存映射示意图") +![](/images/device-dev/kernel/figure/内存映射示意图.png "内存映射示意图") ## 开发指导 @@ -341,6 +341,6 @@ date: 2021-12-30 12:57:42 3. vmalloc接口及内存申请系列接口可以在内核中根据需要申请内存。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >内存申请系列接口申请的内存要求物理内存是连续的,当系统内存无法满足大块连续内存的申请条件时会申请失败,一般适用于小块内存的申请;vmalloc相关接口申请的内存可以获得不连续的物理内存,但其是以页(当前系统一个页为4096字节)为单位的,当需要申请以页为整数倍的内存时可以通过vmalloc申请,例如文件系统中文件读取需要较大的缓存,便可以通过vmalloc相关接口申请内存。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/04.\350\231\232\345\256\236\346\230\240\345\260\204.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/04.\350\231\232\345\256\236\346\230\240\345\260\204.md" similarity index 93% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/04.\350\231\232\345\256\236\346\230\240\345\260\204.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/04.\350\231\232\345\256\236\346\230\240\345\260\204.md" index da9ffe9c16d98d0e46bbcd9c79cd4b853a5da73d..d615d54a8dbbc726cbac29d218bcb681e33e3c52 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/04.\350\231\232\345\256\236\346\230\240\345\260\204.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/03.\345\206\205\345\255\230\347\256\241\347\220\206/04.\350\231\232\345\256\236\346\230\240\345\260\204.md" @@ -1,6 +1,6 @@ --- title: 虚实映射 -permalink: /pages/000201020203 +permalink: /pages/00040001020203 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 虚实映射 @@ -25,18 +25,18 @@ date: 2021-12-30 12:57:42 虚实映射是指系统通过内存管理单元(MMU,Memory Management Unit)将进程空间的虚拟地址与实际的物理地址做映射,并指定相应的访问权限、缓存属性等。程序执行时,CPU访问的是虚拟内存,通过MMU页表条目找到对应的物理内存,并做相应的代码执行或数据读写操作。MMU的映射由页表(Page Table)来描述,其中保存虚拟地址和物理地址的映射关系以及访问权限等。每个进程在创建的时候都会创建一个页表,页表由一个个页表条目(Page Table Entry, PTE)构成,每个页表条目描述虚拟地址区间与物理地址区间的映射关系。MMU中有一块页表缓存,称为快表(TLB, Translation Lookaside Buffers),做地址转换时,MMU首先在TLB中查找,如果找到对应的页表条目可直接进行转换,提高了查询效率。CPU访问内存或外设的示意图如下: **图 1** CPU访问内存或外设的示意图 -![](/images/zh-cn/device-dev/kernel/figure/CPU访问内存或外设的示意图.png "CPU访问内存或外设的示意图") +![](/images/device-dev/kernel/figure/CPU访问内存或外设的示意图.png "CPU访问内存或外设的示意图") ## 运行机制 虚实映射其实就是一个建立页表的过程。MMU有多级页表,LiteOS-A内核采用二级页表描述进程空间。每个一级页表条目描述符占用4个字节,可表示1MiB的内存空间的映射关系,即1GiB用户空间(LiteOS-A内核中用户空间占用1GiB)的虚拟内存空间需要1024个。系统创建用户进程时,在内存中申请一块4KiB大小的内存块作为一级页表的存储区域,二级页表根据当前进程的需要做动态的内存申请。 -- 用户程序加载启动时,会将代码段、数据段映射进虚拟内存空间(详细可参考[动态加载与链接](/pages/0002010301)),此时并没有物理页做实际的映射; +- 用户程序加载启动时,会将代码段、数据段映射进虚拟内存空间(详细可参考[动态加载与链接](/pages/000400010301)),此时并没有物理页做实际的映射; - 程序执行时,如下图粗箭头所示,CPU访问虚拟地址,通过MMU查找是否有对应的物理内存,若该虚拟地址无对应的物理地址则触发缺页异常,内核申请物理内存并将虚实映射关系及对应的属性配置信息写进页表,并把页表条目缓存至TLB,接着CPU可直接通过转换关系访问实际的物理内存; - 若CPU访问已缓存至TLB的页表条目,无需再访问保存在内存中的页表,可加快查找速度。 **图 2** CPU访问内存示意图 -![](/images/zh-cn/device-dev/kernel/figure/CPU访问内存示意图.png "CPU访问内存示意图") +![](/images/device-dev/kernel/figure/CPU访问内存示意图.png "CPU访问内存示意图") ## 开发指导 @@ -96,6 +96,6 @@ date: 2021-12-30 12:57:42 3. 通过LOS\_ArchMmuUnmap解除映射关系。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >上述接口的使用都是基于MMU初始化完成以及相关进程页表的建立,MMU在系统启动阶段已完成初始化,进程创建的时候会建立页表,开发者无需介入操作。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266.md" index e4a1e837c01f183667db43136e1fe4ba7441067e..a8c654eeac787d38134aada521c239c2395346b3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/01.\344\272\213\344\273\266.md" @@ -1,6 +1,6 @@ --- title: 事件 -permalink: /pages/000201020300 +permalink: /pages/00040001020300 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 事件 @@ -69,7 +69,7 @@ typedef struct tagEvent { 读事件条件满足与否取决于入参eventMask和mode,eventMask即需要关注的事件类型掩码。mode是具体处理方式,分以下三种情况: -- LOS\_WAITMODE\_AND:逻辑与,基于接口传入的事件类型掩码eventMask,只有这些事件都已经发生才能读取成功,否则该任务将阻塞等待或者返回错误码。。 +- LOS\_WAITMODE\_AND:逻辑与,基于接口传入的事件类型掩码eventMask,只有这些事件都已经发生才能读取成功,否则该任务将阻塞等待或者返回错误码。 - LOS\_WAITMODE\_OR:逻辑或,基于接口传入的事件类型掩码eventMask,只要这些事件中有任一种事件发生就可以读取成功,否则该任务将阻塞等待或者返回错误码。 - LOS\_WAITMODE\_CLR:这是一种附加读取模式,需要与所有事件模式或任一事件模式结合使用(LOS\_WAITMODE\_AND | LOS\_WAITMODE\_CLR或 LOS\_WAITMODE\_OR | LOS\_WAITMODE\_CLR)。在这种模式下,当设置的所有事件模式或任一事件模式读取成功后,会自动清除事件控制块中对应的事件类型位。 @@ -78,7 +78,7 @@ typedef struct tagEvent { **事件销毁:**销毁指定的事件控制块。 **图 1** 事件运作原理图 -![](/images/zh-cn/device-dev/kernel/figure/事件运作原理图-21.png "事件运作原理图-21") +![](/images/device-dev/kernel/figure/事件运作原理图-21.png "事件运作原理图-21") ## 开发指导 @@ -151,7 +151,7 @@ OpenHarmony LiteOS-A内核的事件模块提供下面几种功能。 5. 处理事件控制块 6. 事件控制块销毁 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 进行事件读写操作时,事件的第25位为保留位,不可以进行位设置。 >- 对同一事件反复写入,算作一次写入。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\277\241\345\217\267\351\207\217.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\277\241\345\217\267\351\207\217.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\277\241\345\217\267\351\207\217.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\277\241\345\217\267\351\207\217.md" index d6db172c949c3578ae82822d5bf4598bbabb01a0..1e95e89d593f751ca7579c503751bfa4280992f0 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\277\241\345\217\267\351\207\217.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/02.\344\277\241\345\217\267\351\207\217.md" @@ -1,6 +1,6 @@ --- title: 信号量 -permalink: /pages/000201020301 +permalink: /pages/00040001020301 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 信号量 @@ -83,7 +83,7 @@ typedef struct { 运行示意图如下图所示: **图 1** 信号量运作示意图 -![](/images/zh-cn/device-dev/kernel/figure/信号量运作示意图-22.png "信号量运作示意图-22") +![](/images/device-dev/kernel/figure/信号量运作示意图-22.png "信号量运作示意图-22") ## 开发指导 @@ -139,7 +139,7 @@ typedef struct { 3. 释放信号量LOS\_SemPost。 4. 删除信号量LOS\_SemDelete。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >由于中断不能被阻塞,因此不能在中断中使用阻塞模式申请信号量。 ### 编程实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\344\272\222\346\226\245\351\224\201.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\344\272\222\346\226\245\351\224\201.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\344\272\222\346\226\245\351\224\201.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\344\272\222\346\226\245\351\224\201.md" index 6e1f3f5d12ee55c1126e1074225fb5de7d3d2485..5e1f18ba22f308e30ac4cecb4fbec69bdb9649a8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\344\272\222\346\226\245\351\224\201.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/03.\344\272\222\346\226\245\351\224\201.md" @@ -1,6 +1,6 @@ --- title: 互斥锁 -permalink: /pages/000201020302 +permalink: /pages/00040001020302 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 互斥锁 @@ -62,7 +62,7 @@ date: 2021-12-30 12:57:42 用互斥锁处理非共享资源的同步访问时,如果有任务访问该资源,则互斥锁为加锁状态。此时其他任务如果想访问这个公共资源则会被阻塞,直到互斥锁被持有该锁的任务释放后,其他任务才能重新访问该公共资源,此时互斥锁再次上锁,如此确保同一时刻只有一个任务正在访问这个公共资源,保证了公共资源操作的完整性。 **图 1** 互斥锁运作示意图 -![](/images/zh-cn/device-dev/kernel/figure/互斥锁运作示意图-23.png "互斥锁运作示意图-23") +![](/images/device-dev/kernel/figure/互斥锁运作示意图-23.png "互斥锁运作示意图-23") ## 开发指导 @@ -193,7 +193,7 @@ date: 2021-12-30 12:57:42 4. 销毁互斥锁LOS\_MuxDestroy。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 两个任务不能对同一把互斥锁加锁。如果某任务对已被持有的互斥锁加锁,则该任务会被挂起,直到持有该锁的任务对互斥锁解锁,才能执行对这把互斥锁的加锁操作。 >- 互斥锁不能在中断服务程序中使用。 >- LiteOS-A内核作为实时操作系统需要保证任务调度的实时性,尽量避免任务的长时间阻塞,因此在获得互斥锁之后,应该尽快释放互斥锁。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\346\266\210\346\201\257\351\230\237\345\210\227.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\346\266\210\346\201\257\351\230\237\345\210\227.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\346\266\210\346\201\257\351\230\237\345\210\227.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\346\266\210\346\201\257\351\230\237\345\210\227.md" index 1de4625a5745c5a9ca415be10d57b573b39a87e5..e544d3fa39f48286d8fe4f8156de830ddc516b12 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\346\266\210\346\201\257\351\230\237\345\210\227.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/04.\346\266\210\346\201\257\351\230\237\345\210\227.md" @@ -1,6 +1,6 @@ --- title: 消息队列 -permalink: /pages/000201020303 +permalink: /pages/00040001020303 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 消息队列 @@ -82,7 +82,7 @@ typedef struct { - 删除队列时,根据队列ID找到对应队列,把队列状态置为未使用,把队列控制块置为初始状态,并释放队列所占内存。 **图 1** 队列读写数据操作示意图 -![](/images/zh-cn/device-dev/kernel/figure/队列读写数据操作示意图.png "队列读写数据操作示意图") +![](/images/device-dev/kernel/figure/队列读写数据操作示意图.png "队列读写数据操作示意图") 上图对读写队列做了示意,图中只画了尾节点写入方式,没有画头节点写入,但是两者是类似的。 @@ -142,7 +142,7 @@ typedef struct {

LOS_QueueWriteHeadCopy

-

向指定队列头节点中写入入参bufferAddr中保存的数据

+

向指定队列头节点中写入入参bufferAddr中保存的数据

获取队列信息

@@ -163,7 +163,7 @@ typedef struct { 4. 通过LOS\_QueueInfoGet获取队列信息。 5. 通过LOS\_QueueDelete删除队列。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 系统支持的最大队列数是指:整个系统的队列资源总个数,而非用户能使用的个数。例如:系统软件定时器多占用一个队列资源,那么用户能使用的队列资源就会减少一个。 >- 创建队列时传入的队列名和flags暂时未使用,作为以后的预留参数。 >- 队列接口函数中的入参timeOut是相对时间。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/05.\350\257\273\345\206\231\351\224\201.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/05.\350\257\273\345\206\231\351\224\201.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/05.\350\257\273\345\206\231\351\224\201.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/05.\350\257\273\345\206\231\351\224\201.md" index e52bc7ccb4df12783a434b6e039a16a791c923f9..696b4860dbc26483d6158c057e16e577c7962447 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/05.\350\257\273\345\206\231\351\224\201.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/05.\350\257\273\345\206\231\351\224\201.md" @@ -1,6 +1,6 @@ --- title: 读写锁 -permalink: /pages/000201020304 +permalink: /pages/00040001020304 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 读写锁 @@ -140,7 +140,7 @@ date: 2021-12-30 12:57:42 5. 删除读写锁LOS\_RwlockDestroy。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 读写锁不能在中断服务程序中使用。 >- LiteOS-A内核作为实时操作系统需要保证任务调度的实时性,尽量避免任务的长时间阻塞,因此在获得读写锁之后,应该尽快释放该锁。 >- 持有读写锁的过程中,不得再调用LOS\_TaskPriSet等接口更改持有读写锁任务的优先级 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/06.\347\224\250\346\210\267\346\200\201\345\277\253\351\200\237\344\272\222\346\226\245\351\224\201.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/06.\347\224\250\346\210\267\346\200\201\345\277\253\351\200\237\344\272\222\346\226\245\351\224\201.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/06.\347\224\250\346\210\267\346\200\201\345\277\253\351\200\237\344\272\222\346\226\245\351\224\201.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/06.\347\224\250\346\210\267\346\200\201\345\277\253\351\200\237\344\272\222\346\226\245\351\224\201.md" index 146df126bfb8445684e68f830eab83c846690fcd..00412c0245e1d79d90a192cd1ee179dacc357797 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/06.\347\224\250\346\210\267\346\200\201\345\277\253\351\200\237\344\272\222\346\226\245\351\224\201.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/06.\347\224\250\346\210\267\346\200\201\345\277\253\351\200\237\344\272\222\346\226\245\351\224\201.md" @@ -1,6 +1,6 @@ --- title: 用户态快速互斥锁 -permalink: /pages/000201020305 +permalink: /pages/00040001020305 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 用户态快速互斥锁 @@ -31,7 +31,7 @@ Futex\(Fast userspace mutex,用户态快速互斥锁\)是内核提供的一种 当前哈希桶共有80个,0\~63号桶用于存放私有锁(以虚拟地址进行哈希),64\~79号桶用于存放共享锁(以物理地址进行哈希),私有/共享属性通过用户态锁的初始化以及Futex系统调用入参确定。 **图 1** Futex设计图 -![](/images/zh-cn/device-dev/kernel/figure/Futex设计图.jpg "Futex设计图") +![](/images/device-dev/kernel/figure/Futex设计图.jpg "Futex设计图") 如图1,每个futex哈希桶中存放被futex\_list串联起来的哈希值相同的futex node,每个futex node对应一个被挂起的task,node中key值唯一标识一把用户态锁,具有相同key值的node被queue\_list串联起来表示被同一把锁阻塞的task队列。 @@ -72,6 +72,6 @@ Futex有以下三种操作: ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >Futex系统调用通常与用户态逻辑共同组成用户态锁,故推荐使用用户态POSIX接口的锁。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/07.\344\277\241\345\217\267.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/07.\344\277\241\345\217\267.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/07.\344\277\241\345\217\267.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/07.\344\277\241\345\217\267.md" index c8d20178be850fb6bf93ea5141476df278145556..88fcad5b5ca0a3bbecc71b770b971c610f870116 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/07.\344\277\241\345\217\267.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/04.\345\206\205\346\240\270\351\200\232\344\277\241\346\234\272\345\210\266/07.\344\277\241\345\217\267.md" @@ -1,6 +1,6 @@ --- title: 信号 -permalink: /pages/000201020306 +permalink: /pages/00040001020306 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 信号 @@ -76,7 +76,7 @@ date: 2021-12-30 12:57:42 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >信号机制为提供给用户态程序进程间通信的能力,故推荐使用上表1列出的用户态POSIX相关接口。 >注册回调函数: >``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206.md" index d978d457ceaa4dae9f04f963504cbdfdf46ce982..e3666f1cf166ea8aaa0dcd145da4bf6e192ba2a3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/05.\346\227\266\351\227\264\347\256\241\347\220\206.md" @@ -1,6 +1,6 @@ --- title: 时间管理 -permalink: /pages/0002010204 +permalink: /pages/000400010204 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 时间管理 @@ -89,7 +89,7 @@ OpenHarmony LiteOS-A内核的时间管理提供下面几种功能,接口详细 1. 调用时间转换接口; 2. 获取系统Tick数完成时间统计等。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 获取系统Tick数需要在系统时钟使能之后。 >- 时间管理不是单独的功能模块,依赖于los\_config.h中的OS\_SYS\_CLOCK和LOSCFG\_BASE\_CORE\_TICK\_PER\_SECOND两个配置选项。 >- 系统的Tick数在关中断的情况下不进行计数,故系统Tick数不能作为准确时间计算。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250.md" index 04bbcac169ef4c11ed3f95c16deff277cfcd3b60..673ba4f498418fec7273c3ffa9b67bf6bf3d24fa 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/06.\350\275\257\344\273\266\345\256\232\346\227\266\345\231\250.md" @@ -1,6 +1,6 @@ --- title: 软件定时器 -permalink: /pages/0002010205 +permalink: /pages/000400010205 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 软件定时器 @@ -134,7 +134,7 @@ OpenHarmony LiteOS-A内核的软件定时器模块提供下面几种功能,接 5. 停止定时器LOS\_SwtmrStop。 6. 删除定时器LOS\_SwtmrDelete。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 软件定时器的回调函数中不要做过多操作,不要使用可能引起任务挂起或者阻塞的接口或操作。 >- 软件定时器使用了系统的一个队列和一个任务资源,软件定时器任务的优先级设定为0,且不允许修改 。 >- 系统可配置的软件定时器资源个数是指:整个系统可使用的软件定时器资源总个数,而并非是用户可使用的软件定时器资源个数。例如:系统软件定时器多占用一个软件定时器资源数,那么用户能使用的软件定时器资源就会减少一个。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\216\237\345\255\220\346\223\215\344\275\234.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\216\237\345\255\220\346\223\215\344\275\234.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\216\237\345\255\220\346\223\215\344\275\234.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\216\237\345\255\220\346\223\215\344\275\234.md" index ed92cf38e68ede3df389b312affee44d9a0ed123..5c281cd6841c5bbd8b77b5d683381f760392b23f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\216\237\345\255\220\346\223\215\344\275\234.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/03.\345\237\272\347\241\200\345\206\205\346\240\270/07.\345\216\237\345\255\220\346\223\215\344\275\234.md" @@ -1,6 +1,6 @@ --- title: 原子操作 -permalink: /pages/0002010206 +permalink: /pages/000400010206 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 原子操作 @@ -214,7 +214,7 @@ OpenHarmony LiteOS-A内核的原子操作模块提供下面几种功能,接口 有多个任务对同一个内存数据进行加减或交换等操作时,使用原子操作保证结果的可预知性。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >原子操作接口仅支持整型数据。 ### 编程实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/01.\347\263\273\347\273\237\350\260\203\347\224\250.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/01.\347\263\273\347\273\237\350\260\203\347\224\250.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/01.\347\263\273\347\273\237\350\260\203\347\224\250.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/01.\347\263\273\347\273\237\350\260\203\347\224\250.md" index de1c4d60b0d85660dad0211e57ba2000197d02f6..a9995c797bdace8d212c43fbf40a5e319ed99dec 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/01.\347\263\273\347\273\237\350\260\203\347\224\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/01.\347\263\273\347\273\237\350\260\203\347\224\250.md" @@ -1,6 +1,6 @@ --- title: 系统调用 -permalink: /pages/0002010300 +permalink: /pages/000400010300 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 系统调用 @@ -29,11 +29,11 @@ OpenHarmony LiteOS-A实现了用户态与内核态的区分隔离,用户态程 如图1所示,用户程序通过调用System API(系统API,通常是系统提供的POSIX接口)进行内核资源访问与交互请求,POSIX接口内部会触发SVC/SWI异常,完成系统从用户态到内核态的切换,然后对接到内核的Syscall Handler(系统调用统一处理接口)进行参数解析,最终分发至具体的内核处理函数。 **图 1** 系统调用示意图 -![](/images/zh-cn/device-dev/kernel/figure/系统调用示意图.png "系统调用示意图") +![](/images/device-dev/kernel/figure/系统调用示意图.png "系统调用示意图") Syscall Handler的具体实现在kernel/liteos\_a/syscall/los\_syscall.c中OsArmA32SyscallHandle函数,在进入系统软中断异常时会调用此函数,并且按照kernel/liteos\_a/syscall/syscall\_lookup.h中的清单进行系统调用的入参解析,执行各系统调用最终对应的内核处理函数。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 系统调用提供基础的用户态程序与内核的交互功能,不建议开发者直接使用系统调用接口,推荐使用内核提供的对外POSIX接口,若需要新增系统调用接口,详见开发指导。 >- 内核向用户态提供的系统调用接口清单详见kernel/liteos\_a/syscall/syscall\_lookup.h,内核相应的系统调用对接函数清单详见kernel/liteos\_a/syscall/los\_syscall.h。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/02.\345\212\250\346\200\201\345\212\240\350\275\275\344\270\216\351\223\276\346\216\245.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/02.\345\212\250\346\200\201\345\212\240\350\275\275\344\270\216\351\223\276\346\216\245.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/02.\345\212\250\346\200\201\345\212\240\350\275\275\344\270\216\351\223\276\346\216\245.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/02.\345\212\250\346\200\201\345\212\240\350\275\275\344\270\216\351\223\276\346\216\245.md" index 113dae5813c839180c8f42f20e8189741e07605a..36a5fff5569e47f4cc0a0a3c50500ba8b057da28 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/02.\345\212\250\346\200\201\345\212\240\350\275\275\344\270\216\351\223\276\346\216\245.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/02.\345\212\250\346\200\201\345\212\240\350\275\275\344\270\216\351\223\276\346\216\245.md" @@ -1,6 +1,6 @@ --- title: 动态加载与链接 -permalink: /pages/0002010301 +permalink: /pages/000400010301 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 动态加载与链接 @@ -33,14 +33,14 @@ OpenHarmony系统的动态加载与链接机制主要是由内核加载器以及 ## 运行机制 **图 1** 动态加载流程 -![](/images/zh-cn/device-dev/kernel/figure/动态加载流程.png "动态加载流程") +![](/images/device-dev/kernel/figure/动态加载流程.png "动态加载流程") 1. 内核将应用程序ELF文件的PT\_LOAD段信息映射至进程空间。对于ET\_EXEC类型的文件,根据PT\_LOAD段中p\_vaddr进行固定地址映射;对于ET\_DYN类型(位置无关的可执行程序,通过编译选项“-fPIE”得到)的文件,内核通过mmap接口选择base基址进行映射(load\_addr = base + p\_vaddr)。 2. 若应用程序是静态链接的(静态链接不支持编译选项“-fPIE”),设置堆栈信息后跳转至应用程序ELF文件中e\_entry指定的地址并运行;若程序是动态链接的,应用程序ELF文件中会有PT\_INTERP段,保存动态链接器的路径信息(ET\_DYN类型)。musl的动态链接器是libc-musl.so的一部分,libc-musl.so的入口即动态链接器的入口。内核通过mmap接口选择base基址进行映射,设置堆栈信息后跳转至base + e\_entry(该e\_entry为动态链接器的入口)地址并运行动态链接器。 3. 动态链接器自举并查找应用程序依赖的所有共享库并对导入符号进行重定位,最后跳转至应用程序的e\_entry(或base + e\_entry),开始运行应用程序。 **图 2** 程序执行流程 -![](/images/zh-cn/device-dev/kernel/figure/程序执行流程.png "程序执行流程") +![](/images/device-dev/kernel/figure/程序执行流程.png "程序执行流程") 1. 加载器与链接器调用mmap映射PT\_LOAD段; 2. 内核调用map\_pages接口查找并映射pagecache已有的缓存; diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/03.\350\231\232\346\213\237\345\212\250\346\200\201\345\205\261\344\272\253\345\272\223.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/03.\350\231\232\346\213\237\345\212\250\346\200\201\345\205\261\344\272\253\345\272\223.md" similarity index 92% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/03.\350\231\232\346\213\237\345\212\250\346\200\201\345\205\261\344\272\253\345\272\223.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/03.\350\231\232\346\213\237\345\212\250\346\200\201\345\205\261\344\272\253\345\272\223.md" index 6909cc065b41442400e70fdb517b9f80b9c38afa..6afeaff12f683e1fde8936d1448d2c05a46c962e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/03.\350\231\232\346\213\237\345\212\250\346\200\201\345\205\261\344\272\253\345\272\223.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/03.\350\231\232\346\213\237\345\212\250\346\200\201\345\205\261\344\272\253\345\272\223.md" @@ -1,6 +1,6 @@ --- title: 虚拟动态共享库 -permalink: /pages/0002010302 +permalink: /pages/000400010302 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 虚拟动态共享库 @@ -32,7 +32,7 @@ VDSO总体可分为数据页与代码页两部分: - 代码页提供屏蔽系统调用的主要逻辑; **图 1** VDSO系统设计 -![](/images/zh-cn/device-dev/kernel/figure/VDSO系统设计.jpg "VDSO系统设计") +![](/images/device-dev/kernel/figure/VDSO系统设计.jpg "VDSO系统设计") 如图1所示,当前VDSO机制有以下几个主要步骤: @@ -54,7 +54,7 @@ VDSO总体可分为数据页与代码页两部分: ⑨ 将从VDSO数据页获取到的数据作为结果返回给用户程序; ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 当前VDSO机制支持LibC库clock\_gettime接口的CLOCK\_REALTIME\_COARSE与CLOCK\_MONOTONIC\_COARSE功能,clock\_gettime接口的使用方法详见POSIX标准。用户调用C库接口clock\_gettime\(CLOCK\_REALTIME\_COARSE, &ts\)或者clock\_gettime\(CLOCK\_MONOTONIC\_COARSE, &ts\)即可使用VDSO机制。 >- 使用VDSO机制得到的时间精度会与系统tick中断的精度保持一致,适用于对时间没有高精度要求且短时间内会高频触发clock\_gettime或gettimeofday系统调用的场景,若有高精度要求,不建议采用VDSO机制。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/04.\350\275\273\351\207\217\347\272\247\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/04.\350\275\273\351\207\217\347\272\247\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/04.\350\275\273\351\207\217\347\272\247\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/04.\350\275\273\351\207\217\347\272\247\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241.md" index c897a8756a5dcee1aacc7ecb2b62220e512f4c75..1c06529e9fd6f8cf5c1b51a8ac8f135a61cd7fa1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/04.\350\275\273\351\207\217\347\272\247\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/04.\350\275\273\351\207\217\347\272\247\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241.md" @@ -1,6 +1,6 @@ --- title: 轻量级进程间通信 -permalink: /pages/0002010303 +permalink: /pages/000400010303 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 轻量级进程间通信 @@ -78,6 +78,6 @@ LiteIPC中有两个主要概念,一个是ServiceManager,另一个是Service ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >LiteIPC模块接口都只在LiteOS-A内部使用。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\350\231\232\346\213\237\346\226\207\344\273\266\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/01.\350\231\232\346\213\237\346\226\207\344\273\266\347\263\273\347\273\237.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\350\231\232\346\213\237\346\226\207\344\273\266\347\263\273\347\273\237.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/01.\350\231\232\346\213\237\346\226\207\344\273\266\347\263\273\347\273\237.md" index afc94540d41df71ba76b4fa44c49eef5e87a0f20..2b1f7ba847678eb4e6399584c45dd52dc3741b87 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\350\231\232\346\213\237\346\226\207\344\273\266\347\263\273\347\273\237.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/01.\350\231\232\346\213\237\346\226\207\344\273\266\347\263\273\347\273\237.md" @@ -1,6 +1,6 @@ --- title: 虚拟文件系统 -permalink: /pages/0002010304 +permalink: /pages/00040001030400 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 虚拟文件系统 @@ -44,13 +44,13 @@ OpenHarmony内核中,VFS框架是通过在内存中的树结构来实现的, Vnode通过哈希以及LRU机制进行管理。当系统启动后,对文件或目录的访问会优先从哈希链表中查找Vnode缓存,若缓存没有命中,则并从对应文件系统中搜索目标文件或目录,创建并缓存对应的Vnode。当Vnode缓存数量达到上限时,将淘汰长时间未访问的Vnode,其中挂载点Vnode与设备节点Vnode不参与淘汰。当前系统中Vnode的规格默认为512,该规格可以通过LOSCFG\_MAX\_VNODE\_SIZE进行配置。Vnode数量过大,会造成较大的内存占用;Vnode数量过少,则会造成搜索性能下降。下图展示了Vnode的创建流程。 **图 1** Vnode创建流程 - ![](/images/zh-cn/device-dev/kernel/figure/Vnode创建流程.png "Vnode创建流程") + ![](/images/device-dev/kernel/figure/Vnode创建流程.png "Vnode创建流程") 1. PathCache:PathCache是路径缓存,它通过哈希表存储,利用父节点Vnode的地址和子节点的文件名,可以从PathCache中快速查找到子节点对应的Vnode。下图展示了文件/目录的查找流程。 **图 2** 文件查找流程 - ![](/images/zh-cn/device-dev/kernel/figure/文件查找流程.png "文件查找流程") + ![](/images/device-dev/kernel/figure/文件查找流程.png "文件查找流程") 1. PageCache:PageCache是内核中文件的缓存。当前PageCache仅支持缓存二进制文件,在初次访问文件时通过mmap映射到内存中,下次再访问时,直接从PageCache中读取,可以提升对同一个文件的读写速度。另外基于PageCache可实现以文件为基底的进程间通信。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" index ae2098f5913870f6f851f598e5101644a8e44a1e..448bc0014374fb45d0f0a278b5f2e65a82433f6f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/01.FAT.md" @@ -1,6 +1,6 @@ --- title: FAT -permalink: /pages/000201030500 +permalink: /pages/0004000103040100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # FAT @@ -45,7 +45,7 @@ SD卡或MMC的设备名为mmcblk\[x\]p\[y\],文件系统类型为“vfat”。 mount("/dev/mmcblk0p0", "/mnt", "vfat", 0, NULL); ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- FAT文件系统中,单个文件不能大于4 GiB。 >- 当有两个SD卡插槽时,卡0和卡1不固定,先插上的为卡0,后插上的为卡1。 >- 当多分区功能打开,存在多分区的情况下,卡0注册的设备节点/dev/mmcblk0\(主设备\)和/dev/mmcblk0p0\(次设备\)是同一个设备,禁止对主设备进行操作。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/02.JFFS2.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/02.JFFS2.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/02.JFFS2.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/02.JFFS2.md" index e900d11be2e7f7ba571b72232a97eb1ae0ffe77c..32aa3a4cfb8ad57b5fbb409a1f062fbc91bbd3ee 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/02.JFFS2.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/02.JFFS2.md" @@ -1,6 +1,6 @@ --- title: JFFS2 -permalink: /pages/000201030501 +permalink: /pages/0004000103040101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # JFFS2 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/03.NFS.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/03.NFS.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/03.NFS.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/03.NFS.md" index dcb7ebf5e6776fbd82359f708d9bf8b58edd6636..38f8890edf1607f9470e22d1fbe053fd4865cadf 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/03.NFS.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/03.NFS.md" @@ -1,6 +1,6 @@ --- title: NFS -permalink: /pages/000201030502 +permalink: /pages/0004000103040102 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # NFS @@ -109,7 +109,7 @@ Mount nfs finished. 该命令将服务器10.67.212.178上的/home/sqbin/nfs目录挂载到OpenHarmony内核设备上的/nfs上。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >本例默认nfs server已经配置可用,即示例中服务器10.67.212.178上的/home/sqbin/nfs已配置可访问。 >mount命令的格式为: >``` @@ -142,6 +142,6 @@ drwxr-xr-x 0 u:0 g:0 dir 同样地,在客户端\(OpenHarmony内核系统\)上创建文件和目录,在NFS服务器上也可以访问,读者可自行体验。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >目前,NFS客户端仅支持NFS v3部分规范要求,因此对于规范支持不全的服务器,无法完全兼容。在开发测试过程中,建议使用Linux的NFS server,其对NFS支持很完善。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/04.Ramfs.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/04.Ramfs.md" similarity index 91% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/04.Ramfs.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/04.Ramfs.md" index 485b22da4b9d412423da92a89815248ee1cde0f4..922d3a4ffd0713d82402d94311a7a77cb8fdb7f0 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/04.Ramfs.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/04.Ramfs.md" @@ -1,6 +1,6 @@ --- title: Ramfs -permalink: /pages/000201030503 +permalink: /pages/0004000103040103 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # Ramfs @@ -71,7 +71,7 @@ rmdir(pathname) umount("/dev/shm") ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >- RAMFS只能挂载一次,一次挂载成功后,后面不能继续挂载到其他目录。 >- RAMFS属于调测功能,默认配置为关闭,正式产品中不要使用该功能。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/05.Procfs.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/05.Procfs.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/05.Procfs.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/05.Procfs.md" index 8c0d3a73e645555409e8b8d94141a3ec5dd2df19..d73c81a4bd5bc79cb54c6444fa92b066331b3a96 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/06.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/05.Procfs.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/02.\346\224\257\346\214\201\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237/05.Procfs.md" @@ -1,6 +1,6 @@ --- title: Procfs -permalink: /pages/000201030504 +permalink: /pages/0004000103040104 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # Procfs diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/07.\351\200\202\351\205\215\346\226\260\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/03.\351\200\202\351\205\215\346\226\260\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/07.\351\200\202\351\205\215\346\226\260\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/03.\351\200\202\351\205\215\346\226\260\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237.md" index d570105e43d843564bd6ac3e489202b56f557d7c..52c81735c22ea88e80699abb4d6cf1a6c02ce2cf 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/07.\351\200\202\351\205\215\346\226\260\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/04.\346\211\251\345\261\225\347\273\204\344\273\266/05.\346\226\207\344\273\266\347\263\273\347\273\237/03.\351\200\202\351\205\215\346\226\260\347\232\204\346\226\207\344\273\266\347\263\273\347\273\237.md" @@ -1,6 +1,6 @@ --- title: 适配新的文件系统 -permalink: /pages/0002010306 +permalink: /pages/00040001030402 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # 适配新的文件系统 @@ -41,7 +41,7 @@ struct VnodeOps g_yourFsVnodeOps = { FSMAP_ENTRY(yourfs_fsmap, "your fs name", g_yourFsMountOps, TRUE, TRUE); // 注册文件系统 ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >1. open和close接口不是必须要实现的接口,因为这两个接口是对文件的操作,对下层的文件系统一般是不感知的,只有当要适配的文件系统需要在open和close时做一些特别的操作时,才需要实现。 >2. 适配文件系统,对基础知识的要求较高,适配者需要对要适配的文件系统的原理和实现具有深刻的理解,本节中不会事无巨细地介绍相关的基础知识,如果您在适配的过程中遇到疑问,建议参考kernel/liteos\_a/fs目录下已经适配好的文件系统的代码,可能就会豁然开朗。 @@ -228,7 +228,7 @@ int VfsJffs2Lookup(struct Vnode *parentVnode, const char *path, int len, struct 核心的逻辑其实在使用私有数据完成接口的功能,这些接口都是些文件系统的通用功能,文件系统在移植前本身应该都有相应实现,所以关键是归纳总结出文件系统所需的私有数据是什么,将其存储在vnode中,供之后使用。一般情况下,私有数据的内容是可以唯一定位到文件在存储介质上位置的信息,大部分文件系统本身都会有类似数据结构可以直接使用,比如JFFS2的inode数据结构。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >1. 访问文件时,不一定会调用文件系统中的Lookup接口,仅在上层的路径缓存失效时才会调用到。 >2. 通过VfsHashGet找到了已经存在的Vnode,不要直接将其作为结果返回,其储存的信息可能已经失效,请更新相应字段后再返回。 >3. Vnode会根据内存占用在后台自动释放,需要持久保存的信息,不要只保存在Vnode中。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/01.Shell\344\273\213\347\273\215.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/01.Shell\344\273\213\347\273\215.md" similarity index 92% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/01.Shell\344\273\213\347\273\215.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/01.Shell\344\273\213\347\273\215.md" index 137a0bcafa4d3249aec92f3ed4cee83c4b4a55d4..61b798c3b98af37a32a4ad6667d8f4cce7f4e020 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/01.Shell\344\273\213\347\273\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/01.Shell\344\273\213\347\273\215.md" @@ -1,6 +1,6 @@ --- title: Shell介绍 -permalink: /pages/000201040000 +permalink: /pages/00040001040000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # Shell介绍 @@ -23,7 +23,7 @@ OpenHarmony内核提供的Shell支持调试常用的基本功能,包含系统 - 网络相关命令:支持查询接到开发板的其他设备的IP、查询本机IP、测试网络连接、设置开发板的AP和station模式等相关功能。 - 新增命令的详细流程可参见[Shell命令开发指导](/pages/000201040001)和[Shell命令编程实例](/pages/000201040002)。 + 新增命令的详细流程可参见[Shell命令开发指导](/pages/00040001040001)和[Shell命令编程实例](/pages/00040001040002)。 ## 注意事项 @@ -43,7 +43,7 @@ OpenHarmony内核提供的Shell支持调试常用的基本功能,包含系统 - Shell功能不符合POSIX标准,仅供调试使用。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** + >![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >Shell功能仅供调试使用,在Debug版本中开启(使用时通过menuconfig在配置项中开启"LOSCFG\_DEBUG\_VERSION"编译开关进行相关控制),商用产品中禁止包含该功能。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/02.Shell\345\221\275\344\273\244\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/02.Shell\345\221\275\344\273\244\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/02.Shell\345\221\275\344\273\244\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/02.Shell\345\221\275\344\273\244\345\274\200\345\217\221\346\214\207\345\257\274.md" index b0ee9b4e5b2a91956be9905458e8e14de5dabd39..293ebefc5e53dbc2d8009e8a515d51e84d05e6a5 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/02.Shell\345\221\275\344\273\244\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/02.Shell\345\221\275\344\273\244\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: Shell命令开发指导 -permalink: /pages/000201040001 +permalink: /pages/00040001040001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # Shell命令开发指导 @@ -137,7 +137,7 @@ date: 2021-12-30 12:57:42 osCmdReg(CMD_TYPE_EX, "ls", XARGS, (CMD_CBK_FUNC)osShellCmdLs) ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >命令关键字必须是唯一的,也即两个不同的命令项不能拥有相同的命令关键字,否则只会执行其中一个。 >Shell在执行用户命令时,如果存在多个命令关键字相同的命令,只会执行其中在"help"命令中排序在最前面的一个。 @@ -172,7 +172,7 @@ date: 2021-12-30 12:57:42 4. 输入Shell命令,有两种输入方式: - 在串口工具中直接输入Shell命令。 - - 在telnet工具中输入Shell命令(telnet使用方式详见[telnet](/pages/0002010400030209))。 + - 在telnet工具中输入Shell命令(telnet使用方式详见[telnet](/pages/000400010400030208))。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/03.Shell\345\221\275\344\273\244\347\274\226\347\250\213\345\256\236\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/03.Shell\345\221\275\344\273\244\347\274\226\347\250\213\345\256\236\344\276\213.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/03.Shell\345\221\275\344\273\244\347\274\226\347\250\213\345\256\236\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/03.Shell\345\221\275\344\273\244\347\274\226\347\250\213\345\256\236\344\276\213.md" index 7590a551ca69a4f3c0e850cbd98412480ce018e1..527c5de8509e9faf719a0aba6496e369e9f0c3c8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/03.Shell\345\221\275\344\273\244\347\274\226\347\250\213\345\256\236\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/03.Shell\345\221\275\344\273\244\347\274\226\347\250\213\345\256\236\344\276\213.md" @@ -1,6 +1,6 @@ --- title: Shell命令编程实例 -permalink: /pages/000201040002 +permalink: /pages/00040001040002 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # Shell命令编程实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/01.cpup.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/01.cpup.md" similarity index 93% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/01.cpup.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/01.cpup.md" index c7a86508f2a193b7e4eb4fe12c1c2932a231ac4b..c71cbbbc104482631f5ff0f195bafa7055bbee7b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/01.cpup.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/01.cpup.md" @@ -1,6 +1,6 @@ --- title: cpup -permalink: /pages/0002010400030000 +permalink: /pages/000400010400030000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # cpup @@ -70,6 +70,11 @@ cpup \[_mode_\] \[_taskID_\] ## 输出说明 -**图 1** 指令输出结果 -![](/images/zh-cn/device-dev/kernel/figure/指令输出结果.png "指令输出结果") +**示例** 指令输出结果 + +```shell +OHOS # cpup 1 5 + +pid 5 CpuUsage in 1s: 0.0 +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/02.date.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/02.date.md" similarity index 47% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/02.date.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/02.date.md" index 5215cafa0694a31cdc2654c94111b4bc45403bb0..f17c5ac6bfb7e2321fd3772b50d6bc2a377dddda 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/02.date.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/02.date.md" @@ -1,6 +1,6 @@ --- title: date -permalink: /pages/0002010400030001 +permalink: /pages/000400010400030001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # date @@ -22,32 +22,30 @@ date: 2021-12-30 12:57:42 ## 命令功能 -date命令用于查询及设置系统日期和时间。 +date命令用于查询系统日期和时间。 ## 命令格式 -date +- date -date --help +- date --help -date +\[_Format_\] +- date +\[_Format_\] -date -s_ _\[_YY/MM/DD_\] +- date -u -date_ _-s_ _\[_hh:mm:ss_\]__ - -date -r \[_Filename_\] ## 参数说明 **表 1** 参数说明 + - @@ -55,35 +53,21 @@ date -r \[_Filename_\] - - - - - - - - - - - - - @@ -91,17 +75,19 @@ date -r \[_Filename_\] ## 使用指南 -- date参数缺省时,默认显示当前系统日期和时间。 -- --help、+Format、-s、-r不能混合使用。 +- date参数缺省时,默认显示系统UTC日期和时间。 +- --help、+Format、-u不能混合使用。 +- 目前命令不支持设置时间和日期。 ## 使用实例 -举例: - -输入date +%Y--%m--%d。 +举例:输入 date +%Y--%m--%d ## 输出说明 -**图 1** 按指定格式打印系统日期 -![](/images/zh-cn/device-dev/kernel/figure/按指定格式打印系统日期.png "按指定格式打印系统日期") +**示例** 按指定格式打印系统日期 +```shell +OHOS:/$ date +%Y--%m--%d +1970--01--01 +``` \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/03.dmesg.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/03.dmesg.md" similarity index 83% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/03.dmesg.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/03.dmesg.md" index f4cdb0f5d1e622c9ce2078ffdaad40994c813439..ca6a40e1cd20d5aaf95db9085a1cee57f64716ee 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/03.dmesg.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/03.dmesg.md" @@ -1,6 +1,6 @@ --- title: dmesg -permalink: /pages/0002010400030002 +permalink: /pages/000400010400030002 navbar: true sidebar: true prev: true @@ -9,34 +9,35 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # dmesg -- [命令功能](#section4643204919313) -- [命令格式](#section6553153635) -- [参数说明](#section208971157532) -- [使用指南](#section213115219413) -- [使用实例](#section13736564418) -- [输出说明](#section194005101413) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 dmesg命令用于控制内核dmesg缓存区。 -## 命令格式 +## 命令格式 -dmesg +- dmesg -dmesg \[_-c/-C/-D/-E/-L/-U_\] +- dmesg \[_-c/-C/-D/-E/-L/-U_\] -dmesg -s \[_size_\] +- dmesg -s \[_size_\] -dmesg -l \[_level_\] +- dmesg -l \[_level_\] -dmesg \> \[_fileA_\] +- dmesg \> \[_fileA_\] -## 参数说明 + +## 参数说明 **表 1** 参数说明 @@ -79,9 +80,9 @@ dmesg \> \[_fileA_\] - -

参数

参数说明

取值范围

+

取值范围

使用帮助。

N/A

+

N/A

+Format

根据Format格式打印日期和时间。

--help中列出的占位符。

-

-s YY/MM/DD

-

设置系统时间,用“/”分割的年月日。

-

>= 1970/01/01

+

--help中列出的占位符。

-s hh:mm:ss

+

-u

设置系统时间,用“:”分割的时分秒。

+

显示UTC,而不是当前时区

N/A

-

-r Filename

-

查询Filename文件的修改时间。

-

N/A

+

N/A

-s size

设置缓存区大小 size是要设置的大小。

+

设置缓存区大小,size是要设置的大小。

N/A

+

1-81920

-l level

@@ -101,7 +102,7 @@ dmesg \> \[_fileA_\]
-## 使用指南 +## 使用指南 - 该命令依赖于LOSCFG\_SHELL\_DMESG,使用时通过menuconfig在配置项中开启"Enable Shell dmesg": @@ -113,14 +114,15 @@ dmesg \> \[_fileA_\] 2. 关闭串口打印会影响shell使用,建议先连接telnet再尝试关闭串口。 -## 使用实例 - -举例: +## 使用实例 -输入dmesg \> /usr/dmesg.log。 +举例:输入dmesg \> dmesg.log。 -## 输出说明 +## 输出说明 -**图 1** dmesg重定向到文件。 -![](/images/zh-cn/device-dev/kernel/figure/dmesg重定向到文件.png "dmesg重定向到文件") +**示例** dmesg重定向到文件。 +```shell +OHOS # dmesg > dmesg.log +Dmesg write log to dmesg.log success +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/04.exec.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/04.exec.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/04.exec.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/04.exec.md" index 36986b1a438da1232ac873ae6ad1bb323fe75fe1..0bdf1de0a5676ad78bea26aaa4083d70365ef00a 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/04.exec.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/04.exec.md" @@ -1,6 +1,6 @@ --- title: exec -permalink: /pages/0002010400030003 +permalink: /pages/000400010400030003 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # exec @@ -68,6 +68,6 @@ OHOS # exec helloworld OHOS # hello world! ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >可执行文件执行后,先打印“OHOS \#”提示符原因:目前Shell “exec”命令执行均为后台执行,结果可能导致提示符提前打印。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/05.free.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/05.free.md" similarity index 55% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/05.free.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/05.free.md" index 5e4666715037854f6b48fff26e75d537d5a6b91a..6f73236f8001aa52753f80901dd832ba21f5be86 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/05.free.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/05.free.md" @@ -1,6 +1,6 @@ --- title: free -permalink: /pages/0002010400030004 +permalink: /pages/000400010400030004 navbar: true sidebar: true prev: true @@ -9,26 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # free -- [命令功能](#section175151514841) -- [命令格式](#section8488721749) -- [参数说明](#section27272181949) -- [使用指南](#section148661259410) -- [使用实例](#section68081530242) -- [输出说明](#section171235517543) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 -free命令可显示系统内存的使用情况,同时显示系统的text段、data段、rodata段、bss段大小。 +free命令可显示系统内存的使用情况。 -## 命令格式 +## 命令格式 -free \[_-k | -m_\] +free \[_-b | -k | -m | -g | -t_\] -## 参数说明 +## 参数说明 **表 1** 参数说明 @@ -48,6 +48,20 @@ free \[_-k | -m_\]

N/A

+

--help/-h

+ +

查看free命令支持的参数列表。

+ +

N/A

+ + +

-b

+ +

以Byte为单位显示。

+ +

N/A

+ +

-k

以KiB为单位显示。

@@ -62,23 +76,54 @@ free \[_-k | -m_\]

N/A

+

-g

+ +

以GiB为单位显示。

+ +

N/A

+ + +

-t

+ +

以TiB为单位显示。

+ +

N/A

+ + -## 使用指南 +## 使用指南 无。 -## 使用实例 +## 使用实例 -举例:分别输入free、free -k、free -m. +举例:分别输入free、free -k、free -m。 -## 输出说明 +## 输出说明 -**图 1** 以三种方式显示内存使用情况 -![](/images/zh-cn/device-dev/kernel/figure/以三种方式显示内存使用情况.png "以三种方式显示内存使用情况") +**示例** 以三种方式显示内存使用情况 -**表 2** 输出说明 +```shell +OHOS:/$ free + total used free shared buffers +Mem: 2819652 2754468 65184 0 0 +-/+ buffers/cache: 2754468 65184 +Swap: 0 0 0 +OHOS:/$ free -k + total used free shared buffers +Mem: 2753 2692 60 0 0 +-/+ buffers/cache: 2692 60 +Swap: 0 0 0 +OHOS:/$ free -m + total used free shared buffers +Mem: 2 2 0 0 0 +-/+ buffers/cache: 2 0 +Swap: 0 0 0 +``` + +**表 2** 输出元素说明 - - - - - - - - - - - - -

输出

@@ -102,31 +147,15 @@ free \[_-k | -m_\]

表示未被分配的内存大小。

heap

-

表示已分配堆大小。

-

text

+

shared

表示代码段大小。

+

表示共享内存大小。

data

+

buffers

表示数据段大小。

-

rodata

-

表示只读数据段大小。

-

bss

-

表示未初始化全局变量占用内存大小。

+

表示缓冲区内存大小。

- diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/06.help.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/06.help.md" new file mode 100644 index 0000000000000000000000000000000000000000..72e717b1477321a72297bdbe86952e889aa1d863 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/06.help.md" @@ -0,0 +1,76 @@ +--- +title: help +permalink: /pages/000400010400030005 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# help + +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) + +## 命令功能 + +help命令用于显示当前操作系统内所有操作指令和部分toybox指令。 + +## 命令格式 + +help + +## 参数说明 + +无。 + +## 使用指南 + +help用于显示当前操作系统内所有操作指令。 + +## 使用实例 + +举例:输入help。 + +## 输出说明 + +**示例** 查看系统内所有操作指令 + +```shell +OHOS:/$ help +OHOS:/$ help +*******************shell commands:************************* + +arp cat cat_logmpp cd chgrp chmod +chown cp cpup date dhclient dmesg +dns format free help hi3881 hwi +ifconfig ipdebug kill log ls lsfd +memcheck mkdir mount netstat oom panicreset +partinfo partition ping ping6 pmm pwd +reset rm rmdir sem shm stack +statfs su swtmr sync systeminfo task +telnet touch umount uname v2p vmm +watch writeproc + +After shell prompt "OHOS # ": +Use ` [args ...]` to run built-in shell commands listed above. +Use `exec [args ...]` or `./ [args ...]` to run external commands. + +*******************toybox commands:************************ + +chgrp chmod chown cp date du free help ifconfig kill ls mkdir mount +mv ping ps reboot rm rmdir top touch umount uname + +Use `toybox help [command]` to show usage information for a specific command. + +Use `shell` to enter interactive legacy shell. +Use `alias` to display command aliases. +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/07.hwi.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/07.hwi.md" new file mode 100644 index 0000000000000000000000000000000000000000..3704e23f81eed4543654607e38df1c2baf1392d7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/07.hwi.md" @@ -0,0 +1,175 @@ +--- +title: hwi +permalink: /pages/000400010400030006 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# hwi + +- [命令功能](#section445335110416) +- [命令格式](#section1795712553416) +- [参数说明](#section92544592410) +- [使用指南](#section104151141252) +- [使用实例](#section11545171957) +- [输出说明](#section075617368542) + +## 命令功能 + +hwi命令查询当前中断信息 + +## 命令格式 + +hwi + +## 参数说明 + +无。 + +## 使用指南 + +- 输入hwi即显示当前中断号、中断次数及注册中断名称。 +- 若开关LOSCFG\_CPUP\_INCLUDE\_IRQ打开,则还会显示各个中断的处理时间(cycles)、CPU占用率以及中断类型。 + +## 使用实例 + +举例:输入hwi + +## 输出说明 + +- 显示中断信息(LOSCFG\_CPUP\_INCLUDE\_IRQ关闭) + +```shell +OHOS # hwi + InterruptNo Count Name + 0: 0: + 1: 1025641: + 2: 0: + 29: 824049: + 37: 0: rtc_alarm + 38: 24: uart_pl011 + 48: 3: GPIO + 59: 0: + 62: 530: MMC_IRQ + 63: 70: MMC_IRQ + 64: 280: ETH + 67: 58: tde + 68: 0: JPGE_0 + 69: 0: IVE + 70: 0: VGS + 72: 0: VEDU_0 + 73: 0: nnie0 + 74: 0: nnie_gdc0 + 75: 0: VPSS + 76: 0: VI_PROC0 + 77: 0: JPEGD_0 + 83: 49455: HIFB_SOFT_INT + 87: 0: AIO interrupt + 88: 0: VI_CAP0 + 89: 0: MIPI_RX + 90: 49455: VO int + 91: 49456: HIFB Int + 96: 17601: MMC_IRQ + 100: 0: SPI_HI35XX + 101: 0: SPI_HI35XX + 102: 0: SPI_HI35XX + +``` + +- 显示中断信息(LOSCFG\_CPUP\_INCLUDE\_IRQ打开) + +```shell +OHOS # hwi + InterruptNo Count ATime(us) CPUUSE CPUUSE10s CPUUSE1s Mode Name + 0: 0 0 0.0 0.0 0.0 normal + 1: 937031 0 0.1 0.1 0.1 normal + 2: 0 0 0.0 0.0 0.0 normal + 29: 726166 5 0.54 0.57 0.59 normal + 37: 0 0 0.0 0.0 0.0 normal rtc_alarm + 38: 17 5 0.0 0.0 0.0 normal uart_pl011 + 48: 3 4 0.0 0.0 0.0 normal GPIO + 59: 0 0 0.0 0.0 0.0 normal + 62: 531 1 0.0 0.0 0.0 normal MMC_IRQ + 63: 69 1 0.0 0.0 0.0 normal MMC_IRQ + 64: 292 2 0.0 0.0 0.0 normal ETH + 67: 54 76 0.0 0.0 0.0 shared tde + 68: 0 0 0.0 0.0 0.0 shared JPGE_0 + 69: 0 0 0.0 0.0 0.0 shared IVE + 70: 0 0 0.0 0.0 0.0 shared VGS + 72: 0 0 0.0 0.0 0.0 shared VEDU_0 + 73: 0 0 0.0 0.0 0.0 shared nnie0 + 74: 0 0 0.0 0.0 0.0 shared nnie_gdc0 + 75: 0 0 0.0 0.0 0.0 shared VPSS + 76: 0 0 0.0 0.0 0.0 shared VI_PROC0 + 77: 0 0 0.0 0.0 0.0 shared JPEGD_0 + 83: 45529 8 0.5 0.5 0.5 shared HIFB_SOFT_INT + 87: 0 0 0.0 0.0 0.0 shared AIO interrupt + 88: 0 0 0.0 0.0 0.0 shared VI_CAP0 + 89: 0 0 0.0 0.0 0.0 shared MIPI_RX + 90: 45534 11 0.6 0.7 0.7 shared VO int + 91: 45533 2 0.1 0.1 0.1 shared HIFB Int + 96: 17383 2 0.0 0.0 0.0 normal MMC_IRQ + 100: 0 0 0.0 0.0 0.0 normal SPI_HI35XX + 101: 0 0 0.0 0.0 0.0 normal SPI_HI35XX + 102: 0 0 0.0 0.0 0.0 normal SPI_HI35XX +``` + +**表 1** 输出说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

输出

+

说明

+

InterruptNo

+

中断号。

+

Count

+

中断次数。

+

Name

+

注册中断名称。

+

CYCLECOST

+

中断的处理时间(cycles)。

+

CPUUSE

+

CPU占用率。

+

CPUUSE10s

+

最近10s CPU占用率。

+

CPUUSE1s

+

最近1s CPU占用率。

+

mode

+

中断类型:

+
  • normal: 非共享中断。
  • shared: 共享中断。
+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/08.kill.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/08.kill.md" new file mode 100644 index 0000000000000000000000000000000000000000..fa0ecc85db165ef7bb011c7c7465b0911a51954f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/08.kill.md" @@ -0,0 +1,170 @@ +--- +title: kill +permalink: /pages/000400010400030007 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# kill + +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) + +## 命令功能 + +命令用于发送特定信号给指定进程。 + +## 命令格式 + +kill \[-l \[_signo_\] | _-s signo_ | _-signo_\] _pid..._ + +## 参数说明 + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--help

+

查看kill命令支持的参数列表

+

N/A

+

-l

+

列出信号名称和编号。

+

N/A

+

-s

+

发送信号

+

N/A

+

signo

+

信号ID。

+

[1,30]

+

pid

+

进程ID。

+

[1,MAX_INT]

+
+ +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>signo有效范围为\[0,64\],建议取值范围为\[1,30\],其余为保留内容。 + +## 使用指南 + +- 必须指定发送的信号编号及进程号。 + +- 进程编号取值范围根据系统配置变化,例如系统最大支持pid为256,则取值范围缩小为\[1-256\]。 + + +## 使用实例 + +- 查看当前进程列表,查看需要杀死的进程PID(42)。 + +``` +OHOS:/$ ps + + allCpu(%): 4.67 sys, 195.33 idle + + PID PPID PGID UID Status VirtualMem ShareMem PhysicalMem CPUUSE10s PName + 1 -1 1 0 Pending 0x33b000 0xbb000 0x4db02 0.0 init + 2 -1 2 0 Pending 0xdabc08 0 0xdabc08 1.14 KProcess + 3 1 3 7 Pending 0x72e000 0x1a3000 0x1d24c2 0.0 foundation + 4 1 4 8 Pending 0x362000 0xbb000 0x5c6ff 0.0 bundle_daemon + 5 1 5 1 Pending 0xdfa000 0x2e7000 0x1484f0 0.0 appspawn + 6 1 6 0 Pending 0x688000 0x137000 0x11bca0 0.0 media_server + 7 1 7 0 Pending 0x9d2000 0x103000 0xa1cdf 0.88 wms_server + 8 1 8 2 Pending 0x1f5000 0x48000 0x47dc2 0.2 mksh + 10 5 5 101 Pending 0x11ec000 0x2f9000 0x206047 0.93 com.huawei.launcher + 12 1 12 0 Pending 0x4d4000 0x112000 0xe0882 0.0 deviceauth_service + 13 1 13 0 Pending 0x34f000 0xbd000 0x51799 0.0 sensor_service + 14 1 14 2 Pending 0x34e000 0xb3000 0x52184 0.0 ai_server + 15 1 15 0 Pending 0x61f000 0x13b000 0x168071 0.45 softbus_server + 42 8 42 2 Pending 0x1c1000 0x3a000 0x1106a 0.9 test_demo + 43 8 43 2 Running 0x1d7000 0x3a000 0x1e577 0.0 toybox +``` + +发送信号9(SIGKILL默认行为为立即终止进程)给42号进程**test\_demo**(用户态进程):**kill -s 9 42**(kill -9 42效果相同),并查看当前进程列表,42号进程已终止。 + +``` +OHOS:/$ kill -s 9 42 +OHOS:/$ +[1] + Killed ./nfs/test_demo +OHOS:/$ ps + + allCpu(%): 4.73 sys, 195.27 idle + + PID PPID PGID UID Status VirtualMem ShareMem PhysicalMem CPUUSE10s PName + 1 -1 1 0 Pending 0x33b000 0xbb000 0x4e01c 0.0 init + 2 -1 2 0 Pending 0xda5fa4 0 0xda5fa4 1.14 KProcess + 3 1 3 7 Pending 0x72e000 0x1a3000 0x1d29dc 0.0 foundation + 4 1 4 8 Pending 0x362000 0xbb000 0x5cc19 0.0 bundle_daemon + 5 1 5 1 Pending 0xdfa000 0x2e7000 0x148a0a 0.0 appspawn + 6 1 6 0 Pending 0x688000 0x137000 0x11c1ba 0.0 media_server + 7 1 7 0 Pending 0x9d2000 0x103000 0xa21f9 0.89 wms_server + 8 1 8 2 Pending 0x1f5000 0x48000 0x482dc 0.2 mksh + 10 5 5 101 Pending 0x11ec000 0x2f9000 0x206561 0.93 com.huawei.launcher + 12 1 12 0 Pending 0x4d4000 0x112000 0xe0d9c 0.0 deviceauth_service + 13 1 13 0 Pending 0x34f000 0xbd000 0x51cb3 0.0 sensor_service + 14 1 14 2 Pending 0x34e000 0xb3000 0x5269e 0.0 ai_server + 15 1 15 0 Pending 0x61f000 0x13b000 0x16858b 0.51 softbus_server + 45 8 45 2 Running 0x1d7000 0x3a000 0x1e9f5 0.0 toybox +``` + +- 发送不存在的信号值 kill -100 31 + +## 输出说明 + +发送成功或失败输出结果如下。 + +**示例 1** 发送信号给指定进程 + +```shell +OHOS:/$ kill -s 9 42 +OHOS:/$ +[1] + Killed ./nfs/test_demo +``` + +信号发送成功会显示的提示进程已被杀死。 + +**示例 2** 信号发送失败 + +```shell +OHOS:/$ kill -100 31 +kill: Unknown signal '(null)' +``` + +信号发送失败,示例2所示原因为信号发送命令参数无效,请排查信号编号及进程编号是否有效。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/09.log.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/09.log.md" similarity index 85% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/09.log.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/09.log.md" index edede432fa49e5306843e99600ea27da7692024c..c5d1a93fd050afff7418934f98f41fcf05acf66f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/09.log.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/09.log.md" @@ -1,6 +1,6 @@ --- title: log -permalink: /pages/0002010400030008 +permalink: /pages/000400010400030008 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # log @@ -45,7 +45,7 @@ log level \[_levelNum_\]

配置日志打印等级。

-

[0x0,0x5]

+

[0,5]

@@ -73,15 +73,20 @@ log level \[_levelNum_\] 若level不在有效范围内,会打印提示信息。 -- 若log level命令不加\[levelNum\]参数,则默认查看当前打印等级,并且提示使用方法。 +- 若log level命令不加\[levelNum\]参数,则默认查看当前打印等级,并且提示使用方法。 -## 使用实例 +- 开源小型系统源码设置level 为4或者5会有超多打印。 -举例: +## 使用实例 -输入log level 4 +举例:输入log level 3 ## 输出说明 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179847649.png) +**示例** 设置当前日志打印级别为3 + +```shell +OHOS # log level 3 +Set current log level WARN +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/10.memcheck.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/10.memcheck.md" similarity index 50% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/10.memcheck.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/10.memcheck.md" index abe9577b39cd04073d0432e046552fff4645ac3c..64f5bb0823038b15c921843d68f4b684fdcadfa3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/10.memcheck.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/10.memcheck.md" @@ -1,6 +1,6 @@ --- title: memcheck -permalink: /pages/0002010400030009 +permalink: /pages/000400010400030009 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # memcheck @@ -39,13 +39,43 @@ memcheck ## 使用实例 -举例:输入memcheck +举例: + +- 输入memcheck +- 输入memcheck出现内存越界 ## 输出说明 -**图 1** 当前没有内存越界 -![](/images/zh-cn/device-dev/kernel/figure/当前没有内存越界.png "当前没有内存越界") +**示例 1** 当前没有内存越界 + +```shell +OHOS # memcheck +system memcheck over, all passed! +``` + +**示例 2** 出现内存越界 -**图 2** 出现内存越界 -![](/images/zh-cn/device-dev/kernel/figure/出现内存越界.png "出现内存越界") +```shell +[L0S DLnkCheckMenl 349, memory check +stFreeNodeInfo.pstPrev:0x7e0d31f3 is out of legal mem range[0x80ba5f40, 0х83d00000] +cur node: 0x81f2ce0c +pre node: 0x81f28a98 +pre node was allocated by task:sofia +uwEхcTуpe = 0х2 +puмExcBuffAddr pc = 0x803ad7a4 +puwExcBuffAddr lr = 0x803ad7a4 +puwExcBuffAddr sp = 0х80cb7de0 +puwExcBuffAddr fp = 0x80cb7dec +*******backtrace begin******* +traceback 0 -- lr = 0х8037cb84 +traceback 0 -- fp = 0х80cb7e1c +traceback 1 -- lr = 0х8037033c +traceback 1 -- fp = 0х80cb7e24 +traceback 2 -- lr = 0x8000d108 +traceback 2 -- fp = 0х80cb7e94 +traceback 3 -- lr = 0х8037c7ac +traceback 3 -- fp = 0х80cb7ea4 +traceback 4 -- lr = 0x803ad9e8 +traceback 4 -- fp = 9x11111111 +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/11.oom.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/11.oom.md" similarity index 74% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/11.oom.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/11.oom.md" index 1384f282ac50f078423e834cf3e620c6219e7903..dd1784ee95e5e4b476179fc0b58708a53935b512 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/11.oom.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/11.oom.md" @@ -1,6 +1,6 @@ --- title: oom -permalink: /pages/000201040003000a +permalink: /pages/00040001040003000a navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # oom @@ -25,15 +25,16 @@ date: 2021-12-30 12:57:42 ## 命令格式 -oom +- oom -oom -i \[_interval_\] +- oom -i \[_interval_\] -oom -m \[_mem byte_\] +- oom -m \[_mem byte_\] -oom -r \[_mem byte_\] +- oom -r \[_mem byte_\] + +- oom -h | --help -oom -h | --help ## 参数说明 @@ -83,13 +84,76 @@ oom -h | --help - 参数缺省时,显示oom功能当前配置信息。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >当系统内存不足时,会打印出内存不足的提示信息。 +- oom -i 100 ## 输出说明 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001134008030.png) +**示例 1** oom缺省打印配置信息 + +```shell +OHOS:/$ oom +[oom] oom loop task status: enabled + oom low memory threshold: 0x80000(byte) + oom reclaim memory threshold: 0x500000(byte) + oom check interval: 100(microsecond) +``` + +系统内存不足时打印提示信息 + +```shell +T:20 Enter:IT MEM 00M 001 +[oom] OS is in low memory state +total physical memory: 0x1bcf000(byte), used: 0x1b50000(byte) ,free: 0x7f000(byte), low memory threshold: 0x80000(byte) +[oom] candidate victim process init pid: 1, actual phy mem byte:82602 +[oom] candidate victim process shell pid: 3, actual phy mem byte:14950e +[oom] candidate victim process testsuits app pid: 4, actual phy mem byte:1334598 +[oom] candidate victim process UserProcess12 pid: 12, actual phy mem byte:25951558 +[oom] max phy mem used process UserProcess12 pid: 12, actual phy mem 25951558 +################excFrom: User!#################### +data abort fsr:0x817, far:0x225af000 +Abort caused by a write instruction. Translation fault, page +excType: data abort +processName = UserProcess12 +processID = 12 +process aspace = 0х01000000 -> 0х3f000000 +taskName = threado +taskID = 22 +task user stack = 0х20e17000 -> 0х20e21000 +pc = 0x93969dc in /usr/bin/testsuits app ---> 0x19f9dc +ulr = 0x93969cc in /usr/bin/testsuits app ---> 0x19f9cc +usp = 0х20e20c68fp = 0x20e20c8c +R0 = 0х20e35000 +R1 = 0x225af000 +R2 = 0x0 +R3 = 0х28e35000 +R4 = 0х0 +R5 = 0х9500000 +R6 = 0х14 +R7 = 0х97822c4 +R8 = 0x970cfa8 +R9 = 0x9090909 +R10 = 0xa0a0a0a +R11 = 0x20e20c8c +R12 = 0х0 +CPSR = 0х80000010 +*******backtrace beain******* +traceback 0 -- lr = 0x9242e1c fp = 0х20e20cc4 lr in /usr/bin/testsuits apr 0x4be1c +traceback 1 -- 1r = 0х92430cc fp = 0x20e20cdc lr in /usr/bin/testsuits app --> 0x4c0cc +traceback 2 -- 1r = 0x9396ab0 fp = 0x20e20cec lr in /usr/bin/testsuits app -> 0х19fab0 +traceback 3 -- lr = 0x9393eb4 fp = 0x20e20cf4 lr in /usr/bin/testsuits ap --> 0x19ceb4 +traceback 4 -- lr = 0x92427d4 fp = 0x20e20d44 lr in /usr/bin/testsuits app --> 0x4b7d4 +traceback 5 -- 1r = 0x20c4df50 fp = 0хb0b0b0b 1r in /1ib/libc.so - -> 0x62f50 +``` + +**示例 2** 设置 oom 线程任务检查的时间间隔 + +```shell +OHOS:/$ oom -i 100 +[oom] set oom check interval (100)ms successful +``` **表 2** 输出说明 @@ -129,4 +193,3 @@ oom -h | --help - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/12.pmm.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/12.pmm.md" similarity index 86% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/12.pmm.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/12.pmm.md" index d61da15586080d0fcb72682a5fa62a885b3c538b..79a8cb055c2f6bebe848ae1202008e8f1fc8e429 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/12.pmm.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/12.pmm.md" @@ -1,6 +1,6 @@ --- title: pmm -permalink: /pages/000201040003000b +permalink: /pages/00040001040003000b navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # pmm @@ -38,12 +38,38 @@ Debug版本才具备的命令。 ## 使用实例 -输入pmm +举例:输入pmm ## 输出说明 -**图 1** 查看物理页使用情况 -![](/images/zh-cn/device-dev/kernel/figure/查看物理页使用情况.png "查看物理页使用情况") +**示例** 查看物理页使用情况 + +```shell +OHOS # pmm + + phys_seg base size free_pages + -------- ------- ---------- --------- + 0x4065552c 0x809b0000 0x07550000 22344 +order = 0, free_count = 16 +order = 1, free_count = 12 +order = 2, free_count = 8 +order = 3, free_count = 6 +order = 4, free_count = 13 +order = 5, free_count = 16 +order = 6, free_count = 12 +order = 7, free_count = 4 +order = 8, free_count = 79 +active anon 0 +inactive anon 0 +active file 1385 +inactice file 84 + +pmm pages: total = 30032, used = 7688, free = 22344 +pathCache number = 325 +pathCache memory size = 17621(B) +Vnode number = 67 +Vnode memory size = 10720(B) +``` **表 1** 输出说明 @@ -101,4 +127,3 @@ Debug版本才具备的命令。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/13.reset.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/13.reset.md" similarity index 87% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/13.reset.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/13.reset.md" index b998043bc961f8760503443525b013d3a21c043b..1297bcd33b72c2136cc99acac14c6d401b2d1148 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/13.reset.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/13.reset.md" @@ -1,6 +1,6 @@ --- title: reset -permalink: /pages/000201040003000c +permalink: /pages/00040001040003000c navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # reset @@ -34,7 +34,7 @@ reset ## 使用指南 -reset命令输入后,设备会在立刻重启。 +reset命令输入后,设备会立刻重启。 ## 使用实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/14.sem.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/14.sem.md" similarity index 87% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/14.sem.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/14.sem.md" index 32b40d675381626b76cd862cbe92ec92adde445d..b97507fe1013b19b8359b303165b635df0ff4f29 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/14.sem.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/14.sem.md" @@ -1,6 +1,6 @@ --- title: sem -permalink: /pages/000201040003000d +permalink: /pages/00040001040003000d navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # sem @@ -69,16 +69,48 @@ sem \[_ID__ / fulldata_\] ## 使用实例 -举例1:输入 sem fulldata +举例:输入 sem fulldata ## 输出说明 -**图 1** 查询所有在用的信号量信息 -![](/images/zh-cn/device-dev/kernel/figure/查询所有在用的信号量信息.png "查询所有在用的信号量信息") +**示例** 查询所有在用的信号量信息 + +```shell +OHOS # sem + + SemID Count + ---------- ----- + 0x00000000 1 + + SemID Count + ---------- ----- + 0x00000001 0 + + SemID Count + ---------- ----- + 0x00000002 0 + + SemID Count + ---------- ----- + 0x00000003 1 + + SemID Count + ---------- ----- + 0x00000004 0 + + SemID Count + ---------- ----- + 0x00000005 1 + + SemID Count + ---------- ----- + 0x00000006 0 +``` **表 2** 输出说明 +

输出

说明

@@ -98,7 +130,7 @@ sem \[_ID__ / fulldata_\]
->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >● sem命令的ID参数输入形式以十进制形式表示或十六进制形式表示皆可。 >● sem命令的ID参数在\[0, 1023\]范围内时,返回对应ID的信号量的状态(如果对应ID的信号量未被使用则进行提示);其他取值时返回参数错误的提示。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/15.stack.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/15.stack.md" similarity index 85% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/15.stack.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/15.stack.md" index e58f5dfea160739b1dd998dc9e86720b431834e5..94712b9297e45065ecfc18838d74c8ad373138cf 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/15.stack.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/15.stack.md" @@ -1,6 +1,6 @@ --- title: stack -permalink: /pages/000201040003000e +permalink: /pages/00040001040003000e navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # stack @@ -38,14 +38,22 @@ stack ## 使用实例 -输入:stack +举例:输入stack ## 输出说明 -**图 1** 系统堆栈使用情况 +**示例** 系统堆栈使用情况 +```shell +OHOS # stack -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001133848370.png) + stack name cpu id stack addr total size used size + ---------- ------ --------- -------- -------- + svc_stack 1 0x405c4000 0x2000 0x484 + svc_stack 0 0x405c6000 0x2000 0xae4 + exc_stack 1 0x405c8000 0x1000 0x0 + exc_stack 0 0x405c9000 0x1000 0x0 +``` **表 1** 输出说明 @@ -83,4 +91,3 @@ stack - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/16.su.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/16.su.md" similarity index 77% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/16.su.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/16.su.md" index 8bc8c84f2f2c2a47203d2c84f3c1f713c6e11d4a..d1ebb58e3f1ac2bd8c232a6e6822cfdf9d8689c7 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/16.su.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/16.su.md" @@ -1,6 +1,6 @@ --- title: su -permalink: /pages/000201040003000f +permalink: /pages/00040001040003000f navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:42 +date: 2021-12-30 18:31:30 --- # su @@ -45,14 +45,14 @@ su \[_uid_\] \[_gid_\]

目标用户的用户id值。

-
  • 为空。
  • [0,60000]
+ [0,60000]

gid

目标用户的群组id值。

-
  • 为空。
  • [0,60000]
+ [0,60000]

@@ -70,6 +70,17 @@ su \[_uid_\] \[_gid_\] ## 输出说明 -**图 1** **切换到**为uid为1000,gid为1000的用户 -![](/images/zh-cn/device-dev/kernel/figure/切换到为uid为1000-gid为1000的用户.png "切换到为uid为1000-gid为1000的用户") +**示例** 从当前用户切换至uid为1000,gid为1000的用户 + +```shell +OHOS # ls +Directory /data/system/param: +-rw-r--r-- 0 u:0 g:0 hello_1.txt +OHOS # su 1000 1000 +OHOS # touch hello 2.txt +OHOS # ls +Directory /data/system/param: +-rw-r--r-- O u:1000 g:1000 hello 2.txt +-гw-r--r-- 0 u:0 g:0 hello_1.txt +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/17.swtmr.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/17.swtmr.md" similarity index 78% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/17.swtmr.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/17.swtmr.md" index dbc7bb4b0c618c5161543e715e632930d079560d..e18a1df0be104288c749f282a901fa7758440986 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/17.swtmr.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/17.swtmr.md" @@ -1,6 +1,6 @@ --- title: swtmr -permalink: /pages/0002010400030010 +permalink: /pages/000400010400030010 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # swtmr @@ -58,15 +58,48 @@ swtmr \[_ID_\] ## 使用实例 -举例:输入swtmr和swtmr 1 +举例: + +- swtmr +- swtmr 1 ## 输出说明 -**图 1** 查询所有软件定时器相关信息 -![](/images/zh-cn/device-dev/kernel/figure/查询所有软件定时器相关信息.png "查询所有软件定时器相关信息") +**示例 1** 查询所有软件定时器相关信息 + +```shell +OHOS # swtmr + +SwTmrID State Mode Interval Count Arg handlerAddr +---------- ------- ------- --------- ------- ---------- -------- +0x00000000 Ticking Period 100 77 0x40802a50 0x4037b8a0 + +SwTmrID State Mode Interval Count Arg handlerAddr +---------- ------- ------- --------- ------- ---------- -------- +0x00000001 Ticking Period 1000 876 0x00000000 0x4037fc04 + +SwTmrID State Mode Interval Count Arg handlerAddr +---------- ------- ------- --------- ------- ---------- -------- +0x00000002 Ticking Period 100 76 0x00000000 0x403727f4 + +SwTmrID State Mode Interval Count Arg handlerAddr +---------- ------- ------- --------- ------- ---------- -------- +0x00000016 Ticking NSD 10 6 0x8021e000 0x401fe7d8 + +SwTmrID State Mode Interval Count Arg handlerAddr +---------- ------- ------- --------- ------- ---------- -------- +0x00000079 Ticking NSD 30000 1749 0x406189d8 0x40160e1c +``` + +**示例 2** 查询对应 ID 的软件定时器信息 + +```shell +OHOS # swtmr 1 -**图 2** 查询对应 ID 的软件定时器信息 -![](/images/zh-cn/device-dev/kernel/figure/查询对应-ID-的软件定时器信息.png "查询对应-ID-的软件定时器信息") +SwTmrID State Mode Interval Count Arg handlerAddr +---------- ------- ------- --------- ------- ---------- -------- +0x00000001 Ticking Period 1000 841 0x00000000 0x4037fc04 +``` **表 2** 输出说明 @@ -117,7 +150,7 @@ swtmr \[_ID_\] ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- swtmr命令的ID参数输入形式以十进制形式表示或十六进制形式表示皆可。 >- swtmr命令的ID参数在\[0, 当前软件定时器个数 - 1\]范围内时,返回对应ID的软件定时器的状态;其他取值时返回错误提示。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/18.systeminfo.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/18.systeminfo.md" similarity index 92% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/18.systeminfo.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/18.systeminfo.md" index a28cc4a23a40ffe351877d46f2d93d911e048716..31554b76b1ea8214e88ff539fb5d71fa0e2d0b81 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/18.systeminfo.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/18.systeminfo.md" @@ -1,6 +1,6 @@ --- title: systeminfo -permalink: /pages/0002010400030011 +permalink: /pages/000400010400030011 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # systeminfo @@ -42,8 +42,18 @@ systeminfo ## 输出说明 -**图 1** 查看系统资源使用情况 -![](/images/zh-cn/device-dev/kernel/figure/查看系统资源使用情况.png "查看系统资源使用情况") +**示例** 查看系统资源使用情况 + +```shell +OHOS:/$ systeminfo + + Module Used Total Enabled +-------------------------------------------- + Task 96 256 YES + Sem 435 1024 YES + Queue 13 1024 YES + SwTmr 20 1024 YES +``` **表 1** 输出说明 @@ -101,4 +111,3 @@ systeminfo - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/19.task.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/19.task.md" similarity index 77% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/19.task.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/19.task.md" index c37b561074bc45d23269877a945af5b4df6db93e..4d774920b71574585e3b1912daa746fad884d613 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/19.task.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/19.task.md" @@ -1,6 +1,6 @@ --- title: task -permalink: /pages/0002010400030012 +permalink: /pages/000400010400030012 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # task @@ -53,7 +53,7 @@ task/task -a ## 使用指南 -- 参数缺省时默认打印部分任务信息。 +参数缺省时默认打印部分任务信息。 ## 使用实例 @@ -61,8 +61,36 @@ task/task -a ## 输出说明 -**图 1** 查询任务部分信息 -![](/images/zh-cn/device-dev/kernel/figure/查询任务部分信息.png "查询任务部分信息") +**示例** 查询任务部分信息 + +```shell +OHOS # task + + allCpu(%): 3.54 sys, 196.46 idle + + PID PPID PGID UID Status VirtualMem ShareMem PhysicalMem CPUUSE10s PName + 1 -1 1 0 Pending 0x33b000 0xbb000 0x4dc8b 0.0 init + 2 -1 2 0 Pending 0x193318e 0 0x193318e 1.11 KProcess + 3 1 3 7 Pending 0x730000 0x1a2000 0x1d34f6 0.0 foundation + 4 1 4 8 Pending 0x35e000 0xb8000 0x56777 0.0 bundle_daemon + 5 1 5 1 Pending 0xdfa000 0x2e7000 0x1487ce 0.0 appspawn + 6 1 6 0 Pending 0x688000 0x137000 0x11c518 0.0 media_server + 7 1 7 0 Pending 0x9d2000 0x103000 0xa1ddf 0.89 wms_server + 8 1 1 1000 Running 0x2bf000 0x8f000 0x2a8c6 0.0 shell + 9 5 5 101 Pending 0x11ea000 0x2f9000 0x20429d 0.97 com.huawei.launcher + 11 1 11 0 Pending 0x4d4000 0x112000 0xe0ad7 0.0 deviceauth_service + 12 1 12 0 Pending 0x34f000 0xbd000 0x519ee 0.0 sensor_service + 13 1 13 2 Pending 0x34e000 0xb3000 0x523d9 0.0 ai_server + 14 1 14 0 Pending 0x61f000 0x13b000 0x16841c 0.50 softbus_server + + TID PID Affi CPU Status StackSize WaterLine CPUUSE10s MEMUSE TaskName + 23 1 0x3 -1 Pending 0x3000 0xe44 0.0 0 init + 1 2 0x1 -1 Pending 0x4000 0x2c4 0.37 0 Swt_Task + 2 2 0x3 -1 Pending 0x4000 0x204 0.0 0 system_wq + 3 2 0x2 -1 Pending 0x4000 0x514 0.65 0 Swt_Task + 4 2 0x3 -1 Pending 0x1000 0x36c 0.0 0 ResourcesTask + 7 2 0x3 -1 Pending 0x4e20 0xa5c 0.0 0 PlatformWorkerThread +``` **表 2** 输出说明 @@ -135,4 +163,3 @@ task/task -a - diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/20.uname.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/20.uname.md" new file mode 100644 index 0000000000000000000000000000000000000000..e895b8d0dac77957526a2a50e3a351541b3602e7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/20.uname.md" @@ -0,0 +1,112 @@ +--- +title: uname +permalink: /pages/000400010400030013 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# uname + +- [命令功能](#section01) +- [命令格式](#section02) +- [使用指南](#section03) +- [使用实例](#section04) +- [输出说明](#section05) + +## 命令功能 + +uname命令用于显示当前操作系统的名称,版本创建时间,系统名称,版本信息等。 + +## 命令格式 + +uname \[_-a | -s | -r | -m | -n | -v | --help_\] + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

--help

+

显示uname指令格式提示。

+

无参数

+

默认显示操作系统名称。

+

-a

+

显示全部信息。

+

-s

+

显示操作系统名称。

+

-r

+

显示内核发行版本。

+

-m

+

显示系统架构名称。

+

-n

+

显示主机的网络域名称。

+

-v

+

显示版本信息。

+
+ +## 使用指南 + +- uname用于显示当前操作系统名称。 + +- 除参数--help和-a以外,其他参数可以相互搭配使用;uname -a 等价于 uname -srmnv。 + + +## 使用实例 + +举例: + +- uname -a +- uname -ms + +## 输出说明 + +**示例 1** 查看系统详细信息 + +```shell +OHOS:/$ uname -a +Huawei LiteOS hisilicon 2.0.0.37 Huawei LiteOS 2.0.0.37 Oct 21 2021 17:39:32 Cortex-A7 +OHOS:/$ +``` + +**示例 2** 只查看操作系统名称和系统架构名称 + +```shell +OHOS:/$ uname -ms +Huawei LiteOS Cortex-A7 +OHOS:/$ +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/21.vmm.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/21.vmm.md" similarity index 80% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/21.vmm.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/21.vmm.md" index 47bb6af216fd607aea0bf573f9c8375cb33a994d..d555c7184383a4e9ef97789da2b87bb3c69e455e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/21.vmm.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/21.vmm.md" @@ -1,6 +1,6 @@ --- title: vmm -permalink: /pages/0002010400030014 +permalink: /pages/000400010400030014 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # vmm @@ -26,9 +26,10 @@ date: 2021-12-30 12:57:43 ## 命令格式 -vmm \[_-a / -h / --help_\] +- vmm \[_-a / -h / --help_\] + +- vmm \[_pid_\] -vmm \[_pid_\] ## 参数说明 @@ -45,21 +46,21 @@ vmm \[_pid_\]

-a

-

输出所有进程的虚拟内存使用情况

+

输出所有进程的虚拟内存使用情况。

N/A

-h | --help

-

命令格式说明

+

命令格式说明。

N/A

pid

-

进程ID,说明指定进程的虚拟内存使用情况

+

进程ID,说明指定进程的虚拟内存使用情况。

[0,63]

@@ -73,12 +74,37 @@ vmm \[_pid_\] ## 使用实例 -输入vmm 3 +举例:输入vmm 3 ## 输出说明 -**图 1** PID为3的进程虚拟内存使用信息 -![](/images/zh-cn/device-dev/kernel/figure/PID为3的进程虚拟内存使用信息.png "PID为3的进程虚拟内存使用信息") +**示例** PID为3的进程虚拟内存使用信息 + +```shell +OHOS # vmm 3 + + PID aspace name base size pages + ---- ------ ---- ---- ----- ---- + 3 0x408c0118 foundation 0x01000000 0x3e000000 800 + + region name base size mmu_flags pages pg/ref + ------ ---- ---- ---- --------- ----- ----- + 0x408cb364 /bin/foundation 0x06da3000 0x00001000 CH US RD 1 1 + 0x408cb80c /bin/foundation 0x06da4000 0x00001000 CH US RD EX 1 1 + 0x408cb720 /bin/foundation 0x06da5000 0x00001000 CH US RD 1 1 + 0x408cb9a8 /bin/foundation 0x06da6000 0x00001000 CH US RD WR 1 1 + 0x413efde4 HEAP 0x12b43000 0x00015000 CH US RD WR 19 19 + 0x408c3d34 /lib/libc.so 0x23b08000 0x0004a000 CH US RD 25 2 + 0x408cbd44 /lib/libc.so 0x23b52000 0x00068000 CH US RD EX 58 10 + 0x408c3dc0 /lib/libc.so 0x23bba000 0x00002000 CH US RD WR 2 2 + 0x408cc128 /lib/libc.so 0x23bbc000 0x00002000 CH US RD WR 2 2 + 0x408d1634 MMAP 0x23bbe000 0x00005000 CH US RD WR 5 5 + 0x408c4e10 VDSO 0x23bc3000 0x00002000 CH US RD EX 2 2 + 0x408dbaec /lib/libc++.so 0x23bc5000 0x00046000 CH US RD 51 5 + 0x408deba8 /lib/libc++.so 0x23c0b000 0x0009f000 CH US RD EX 29 10 + 0x408debf4 /lib/libc++.so 0x23caa000 0x00006000 CH US RD 6 6 + 0x408c3ce0 /lib/libc++.so 0x23cb0000 0x00001000 CH US RD WR 1 1 +``` **表 2** 进程基本信息 @@ -168,4 +194,3 @@ vmm \[_pid_\] - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/22.watch.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/22.watch.md" similarity index 63% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/22.watch.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/22.watch.md" index 145daa7c37b24c730a65e46ca492d27811a4e841..1cd04e7c1be99fa0c3bb81ae13c8705e54b9b1df 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/22.watch.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/22.watch.md" @@ -1,6 +1,6 @@ --- title: watch -permalink: /pages/0002010400030015 +permalink: /pages/000400010400030015 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # watch @@ -26,9 +26,10 @@ watch命令用于周期性的监视一个命令的运行结果。 ## 命令格式 -watch +- watch + +- watch \[_-c/-n/-t/--count/--interval/-no-title/--over_\] \[_command_\] -watch \[_-c/-n/-t/--count/--interval/-no-title/--over_\] \[_command_\] ## 参数说明 @@ -99,15 +100,54 @@ watch运行过程中可以执行**watch --over**结束本次watch命令。 ## 使用实例 -输入举例: - -watch -n 2 -c 6 task +举例:watch -n 2 -c 6 task ## 输出说明 -**图 1** watch task 结果 -![](/images/zh-cn/device-dev/kernel/figure/watch-task-结果.png "watch-task-结果") - ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->示例中,总共有6次task命令打印,每次间隔2秒,截图为最后一次打印详情。 +**示例** watch task 结果 + +```shell +OHOS # watch -n 2 -c 6 task +Thu Jan 1 23:57:13 1970 + +OHOS # + allCpu(%): 3.55 sys, 196.45 idle + + PID PPID PGID UID Status VirtualMem ShareMem PhysicalMem CPUUSE10s PName + 1 -1 1 0 Pending 0x33b000 0xbb000 0x4dc8b 0.0 init + 2 -1 2 0 Running 0x19524f2 0 0x19524f2 1.14 KProcess + 3 1 3 7 Pending 0x730000 0x1a2000 0x1d34f6 0.0 foundation + 4 1 4 8 Pending 0x35e000 0xb8000 0x56777 0.0 bundle_daemon + 5 1 5 1 Pending 0xdfa000 0x2e7000 0x1487ce 0.0 appspawn + 6 1 6 0 Pending 0x688000 0x137000 0x11c518 0.0 media_server + 7 1 7 0 Pending 0x9d2000 0x103000 0xa1ddf 0.95 wms_server + 8 1 1 1000 Running 0x2bf000 0x8f000 0x2a8c6 0.0 shell + 9 5 5 101 Pending 0x11ea000 0x2f9000 0x20429d 1.2 com.huawei.launcher + 11 1 11 0 Pending 0x4d4000 0x112000 0xe0ad7 0.0 deviceauth_service + 12 1 12 0 Pending 0x34f000 0xbd000 0x519ee 0.0 sensor_service + 13 1 13 2 Pending 0x34e000 0xb3000 0x523d9 0.0 ai_server + 14 1 14 0 Pending 0x61f000 0x13b000 0x16841c 0.51 softbus_server + + TID PID Affi CPU Status StackSize WaterLine CPUUSE10s MEMUSE TaskName + 23 1 0x3 -1 Pending 0x3000 0xe44 0.0 0 init + 1 2 0x1 -1 Pending 0x4000 0x2c4 0.64 0 Swt_Task + 2 2 0x3 -1 Pending 0x4000 0x204 0.0 0 system_wq + 3 2 0x2 -1 Pending 0x4000 0x514 0.40 0 Swt_Task + 4 2 0x3 -1 Pending 0x1000 0x36c 0.0 0 ResourcesTask + 7 2 0x3 -1 Pending 0x4e20 0xa5c 0.0 0 PlatformWorkerThread + 8 2 0x3 -1 Pending 0x4e20 0xa6c 0.0 0 PlatformWorkerThread + 9 2 0x3 -1 Pending 0x4e20 0xa5c 0.0 0 PlatformWorkerThread + 10 2 0x3 -1 PendTime 0x4000 0x3e4 0.5 0 hi_vdec_thread + 11 2 0x3 -1 Pending 0x3000 0x4cc 0.0 0 bcache_async_task + 12 2 0x3 -1 Pending 0x2710 0x224 0.0 0 LiteOS usb pnp notify handle kt + 13 2 0x3 -1 Pending 0x4000 0x204 0.0 0 vibrator_queue + 14 2 0x3 -1 Pending 0x3000 0x37c 0.0 0 bcache_async_task + 15 2 0x3 -1 Pending 0x20000 0x3e4 0.0 0 eth_irq_Task + 16 2 0x3 -1 PendTime 0x2000 0x3a4 0.0 0 MessageDispatcher + 17 2 0x3 0 Running 0x3000 0x73c 0.0 0 shellcmd_watch + 18 2 0x3 -1 Pending 0x2710 0x3ac 0.0 0 GPIO_IRQ_TSK_0_4 +``` + +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>示例中,总共有6次task命令打印,每次间隔2秒,示例1为最后一次打印详情。 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/23.reboot.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/23.reboot.md" new file mode 100644 index 0000000000000000000000000000000000000000..4081e6dd4c24e5b1af8dbafa153052e7ed7985f9 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/23.reboot.md" @@ -0,0 +1,46 @@ +--- +title: reboot +permalink: /pages/000400010400030016 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# reboot + +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) + +## 命令功能 + +reboot命令用于重启设备。 + +## 命令格式 + +reboot + +## 参数说明 + +无。 + +## 使用指南 + +reboot命令输入后,设备会立刻重启。 + +## 使用实例 + +reboot + +## 输出说明 + +无。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/24.top.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/24.top.md" new file mode 100644 index 0000000000000000000000000000000000000000..19bbd3fff1013afd80d74b34b57c641672440709 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/01.\347\263\273\347\273\237\345\221\275\344\273\244/24.top.md" @@ -0,0 +1,189 @@ +--- +title: top +permalink: /pages/000400010400030017 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# top + +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) + +## 命令功能 + +top命令用于查询进程及线程信息。 + +## 命令格式 + +top \[_-a_\] + +## 参数说明 + +**表 1** 参数说明 + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--help

+

查看top命令支持的参数列表。

+

N/A

+

-a

+

显示更详细的信息。

+

N/A

+
+ +## 使用指南 + +参数缺省时默认打印部分任务信息。 + +## 使用实例 + +举例:输入top + +## 输出说明 + +**示例** top 命令显示详情 + +```shell +OHOS:/$ top + + allCpu(%): 4.68 sys, 195.32 idle + + PID PPID PGID UID Status VirtualMem ShareMem PhysicalMem CPUUSE10s PName + 1 -1 1 0 Pending 0x33b000 0xbb000 0x4e01c 0.0 init + 2 -1 2 0 Pending 0xd838c0 0 0xd838c0 1.16 KProcess + 3 1 3 7 Pending 0x72e000 0x1a3000 0x1d29dc 0.0 foundation + 4 1 4 8 Pending 0x362000 0xbb000 0x5cc19 0.0 bundle_daemon + 5 1 5 1 Pending 0xdfa000 0x2e7000 0x148a0a 0.0 appspawn + 6 1 6 0 Pending 0x688000 0x137000 0x11c1ba 0.0 media_server + 7 1 7 0 Pending 0x9d2000 0x103000 0xa21f9 0.87 wms_server + 8 1 8 2 Pending 0x1f5000 0x48000 0x462dc 0.0 mksh + 9 5 5 101 Pending 0x11ea000 0x2f9000 0x204561 0.94 com.huawei.launcher + 11 1 11 0 Pending 0x4d4000 0x112000 0xe0d9c 0.0 deviceauth_service + 12 1 12 0 Pending 0x34f000 0xbd000 0x51cb3 0.0 sensor_service + 13 1 13 2 Pending 0x34e000 0xb3000 0x5269e 0.0 ai_server + 14 1 14 0 Pending 0x61f000 0x13b000 0x16858b 0.45 softbus_server + 43 8 43 2 Running 0x1d7000 0x3a000 0x1e9f5 0.0 toybox + + TID PID Affi CPU Status StackSize WaterLine CPUUSE10s MEMUSE TaskName + 23 1 0x3 -1 Pending 0x3000 0xcf4 0.0 0 init + 1 2 0x1 -1 Pending 0x4000 0x2c4 0.33 0 Swt_Task + 2 2 0x3 -1 Pending 0x4000 0x204 0.0 0 system_wq + 3 2 0x2 -1 Pending 0x4000 0x514 0.75 0 Swt_Task + 4 2 0x3 -1 Pending 0x1000 0x3ac 0.0 0 ResourcesTask + 7 2 0x3 -1 Pending 0x4e20 0xa5c 0.0 0 PlatformWorkerThread + 8 2 0x3 -1 Pending 0x4e20 0xa6c 0.0 0 PlatformWorkerThread + 9 2 0x3 -1 Pending 0x4e20 0xbf4 0.0 0 PlatformWorkerThread + 10 2 0x3 -1 Pending 0x3000 0x4dc 0.0 0 bcache_async_task + 11 2 0x3 -1 PendTime 0x4000 0x3e4 0.5 0 hi_vdec_thread + 12 2 0x3 -1 Pending 0x2710 0x224 0.0 0 LiteOS usb pnp notify handle kt + 13 2 0x3 -1 Pending 0x3000 0x37c 0.0 0 bcache_async_task + 14 2 0x3 -1 Pending 0x4000 0x204 0.0 0 vibrator_queue + 15 2 0x3 -1 Pending 0x20000 0x35c 0.0 0 eth_irq_Task + 16 2 0x3 -1 PendTime 0x2000 0x354 0.0 0 MessageDispatcher + 18 2 0x3 -1 Pending 0x2710 0x200 0.0 0 GPIO_IRQ_TSK_0_4 + 19 2 0x3 -1 Pending 0x4000 0x204 0.0 0 dispWQ + 20 2 0x3 -1 Pending 0x4000 0x204 0.0 0 hdf_sensor_test_work_queue + 21 2 0x3 -1 PendTime 0x6000 0x40c 0.2 0 tcpip_thread + 22 2 0x3 -1 Pending 0x4000 0x36c 0.0 0 SendToSer + 61 2 0x3 -1 Pending 0x4000 0x244 0.0 0 USB_GIANT_Task + 63 2 0x3 -1 Pending 0x4000 0x244 0.0 0 USB_NGIAN_ISOC_Task + 64 2 0x3 -1 Pending 0x4000 0x244 0.0 0 USB_NGIAN_BULK_TasK +``` + +**表2** 输出元素说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

输出

+

说明

+

PID

+

进程ID。

+

PPID

+

父进程ID。

+

PGID

+

进程组ID。

+

UID

+

用户ID。

+

Status

+

任务当前的状态。

+

CPUUSE10s

+

10秒内CPU使用率。

+

PName

+

进程名。

+

TID

+

任务ID。

+

StackSize

+

任务堆栈的大小。

+

WaterLine

+

栈使用的峰值。

+

MEMUSE

+

内存使用量。

+

TaskName

+

任务名。

+
diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/01.cat.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/01.cat.md" similarity index 88% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/01.cat.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/01.cat.md" index fc84ff12c239892a53363a36ba480fe9b2945149..036195b7dda49add4a77b6569479a07336c0aa86 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/01.cat.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/01.cat.md" @@ -1,6 +1,6 @@ --- title: cat -permalink: /pages/0002010400030100 +permalink: /pages/000400010400030100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # cat @@ -61,6 +61,10 @@ cat用于显示文本文件的内容。 ## 输出说明 -**图 1** 查看 hello-harmony.txt 文件的信息 -![](/images/zh-cn/device-dev/kernel/figure/查看-hello-harmony-txt-文件的信息.png "查看-hello-harmony-txt-文件的信息") +**示例** 查看 hello-harmony.txt 文件的信息 + +```shell +OHOS # cat hello-harmony.txt +OHOS # Hello Harmony ;) +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/02.cd.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/02.cd.md" similarity index 89% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/02.cd.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/02.cd.md" index 885f049bc4b2be6f8d2b566b4891ade91fb8dfd5..5329d6e6360441f1e0d2b4ba53f68c3b292c7075 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/02.cd.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/02.cd.md" @@ -1,6 +1,6 @@ --- title: cd -permalink: /pages/0002010400030101 +permalink: /pages/000400010400030101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # cd @@ -58,6 +58,7 @@ cd \[_path_\] - 路径名以 /(斜杠)开头时,表示根目录。 - .(点)表示当前目录。 - ..(点点)表示父目录。 +- cd - 可以在最近访问的两个目录切换。 ## 使用实例 @@ -65,6 +66,12 @@ cd \[_path_\] ## 输出说明 -**图 1** 显示结果如下 -![](/images/zh-cn/device-dev/kernel/figure/显示结果如下.png "显示结果如下") +**示例** 显示结果如下 + +```shell +OHOS:/nfs$ cd ../ +OHOS:/$ ls +bin etc nfs sdcard system tmp vendor +dev lib proc storage test usr +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/03.chgrp.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/03.chgrp.md" similarity index 66% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/03.chgrp.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/03.chgrp.md" index 04a9c1b22e69eaec32e90380f6a4d9aeac331905..13aaffd3c135a1f6b151da6b95ebf90a28bf4bf5 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/03.chgrp.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/03.chgrp.md" @@ -1,6 +1,6 @@ --- title: chgrp -permalink: /pages/0002010400030102 +permalink: /pages/000400010400030102 navbar: true sidebar: true prev: true @@ -9,30 +9,31 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # chgrp -- [命令功能](#section6103119161418) -- [命令格式](#section186958132141) -- [参数说明](#section81796174141) -- [使用指南](#section14330152417140) -- [使用实例](#section951823119149) -- [输出说明](#section14271133125715) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 chgrp用于修改文件的群组。 -## 命令格式 +## 命令格式 chgrp \[_group_\] \[_pathname_\] -## 参数说明 +## 参数说明 **表 1** 参数说明 +

参数

参数说明

@@ -58,16 +59,24 @@ chgrp \[_group_\] \[_pathname_\]
-## 使用指南 +## 使用指南 -在需要修改的文件名前加上文件群组值就可以修改该文件的所属组。 +- 在需要修改的文件名前加上文件群组值就可以修改该文件的所属组。 +- fatfs文件系统不支持修改用户组id。 -## 使用实例 +## 使用实例 -举例:chgrp 100 hello-harmony.txt +举例:chgrp 100 testfile -## 输出说明 +## 输出说明 -**图 1** 修改 hello-harmony.txt 文件的群组为100 -![](/images/zh-cn/device-dev/kernel/figure/修改-hello-harmony-txt-文件的群组为100.png "修改-hello-harmony-txt-文件的群组为100") +**示例** 修改 /dev目录下testfile 文件的群组为100 +```shell +OHOS:/dev$ ll testfile +-rw-r--r-- 0 0 0 0 1970-01-01 00:00 testfile +OHOS:/dev$ chgrp 100 testfile +OHOS:/dev$ ll testfile +-rw-r--r-- 0 0 100 0 1970-01-01 00:00 testfile +OHOS:/dev$ +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/04.chmod.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/04.chmod.md" similarity index 60% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/04.chmod.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/04.chmod.md" index c51425fc55fcb567326f8703318888a4f4f2dc01..9890afc74c803eba5a2d8582cfba29a380bf37c9 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/04.chmod.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/04.chmod.md" @@ -1,6 +1,6 @@ --- title: chmod -permalink: /pages/0002010400030103 +permalink: /pages/000400010400030103 navbar: true sidebar: true prev: true @@ -9,26 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # chmod -- [命令功能](#section13992936121418) -- [命令格式](#section63342439147) -- [参数说明](#section894414671411) -- [使用指南](#section182415221419) -- [使用实例](#section8518195718147) -- [输出说明](#section127391818158) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 chmod用于修改文件操作权限。 -## 命令格式 +## 命令格式 -chmod \[_mode_\] \[_pathname_\] +chmod \[_mode_\] \[_filename_\] -## 参数说明 +## 参数说明 **表 1** 参数说明 @@ -48,7 +48,7 @@ chmod \[_mode_\] \[_pathname_\]

[0,777]

-

pathname

+

filename

文件路径。

@@ -58,16 +58,25 @@ chmod \[_mode_\] \[_pathname_\] -## 使用指南 +## 使用指南 -在需要修改的文件名前加上文件权限值就可以修改该文件的权限值。 +- 在需要修改的文件名前加上文件权限值就可以修改该文件的权限值。 +- fatfs文件系统所有创建的文件和挂载节点的权限属性保持一致,目前节点的权限只有用户读写权限,group和others权限不生效;且只允许修改用户读写权限,读写权限只有rw和ro两种。其他文件系统无限制。 -## 使用实例 +## 使用实例 -举例:chmod 666 hello-harmony.txt +举例:修改hello-harmony.txt 文件权限为644和777。 -## 输出说明 +## 输出说明 -**图 1** 修改 hello-harmony.txt 文件的权限为666 -![](/images/zh-cn/device-dev/kernel/figure/修改-hello-harmony-txt-文件的权限为666.png "修改-hello-harmony-txt-文件的权限为666") +**示例** 修改/dev目录下 hello-harmony.txt 文件的权限 + +```shell +OHOS:/dev$ chmod 644 hello-harmony.txt +OHOS:/dev$ ll hello-harmony.txt +-rw-r--r-- 0 0 0 0 1970-01-01 00:00 hello-harmony.txt +OHOS:/dev$ chmod 777 hello-harmony.txt +OHOS:/dev$ ll hello-harmony.txt +-rwxrwxrwx 0 0 0 0 1970-01-01 00:00 hello-harmony.txt +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/05.chown.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/05.chown.md" similarity index 50% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/05.chown.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/05.chown.md" index cf3ae88d1ef2a738c254feff769b75dfead1b102..8d58e5fbece810c9b9e3e9cb284802496c7e6925 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/05.chown.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/05.chown.md" @@ -1,6 +1,6 @@ --- title: chown -permalink: /pages/0002010400030104 +permalink: /pages/000400010400030104 navbar: true sidebar: true prev: true @@ -9,26 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # chown -- [命令功能](#section247414691513) -- [命令格式](#section14773151018159) -- [参数说明](#section598731391517) -- [使用指南](#section16524152071510) -- [使用实例](#section17901152561510) -- [输出说明](#section15513163115816) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 -chmod用于将指定文件的拥有者改为指定的用户或组。 +chown用于修改指定文件的拥有者。 -## 命令格式 +## 命令格式 -chown \[_owner_\] \[_group_\] \[_pathname_\] +chown \[_owner_\] \[_pathname_\] -## 参数说明 +## 参数说明 **表 1** 参数说明 @@ -48,14 +48,6 @@ chown \[_owner_\] \[_group_\] \[_pathname_\]

[0,0xFFFFFFFF]

-

group

- -

文件群组。

- -

1、为空。

-

2、[0,0xFFFFFFFF]

- -

pathname

文件路径。

@@ -66,18 +58,23 @@ chown \[_owner_\] \[_group_\] \[_pathname_\] -## 使用指南 +## 使用指南 -- 在需要修改的文件名前加上文件拥有者和文件群组就可以分别修改该文件的拥有者和群组。 -- 当owner或group值为-1时则表示对应的owner或group不修改。 -- group参数可以为空。 +修改文件的所有者,目前fatfs不支持修改。 -## 使用实例 +## 使用实例 -举例:chown 100 200 hello-harmony.txt +举例:chown 100 testfile -## 输出说明 +## 输出说明 -**图 1** 修改 hello-harmony.txt 文件的uid为100,gid为200 -![](/images/zh-cn/device-dev/kernel/figure/修改-hello-harmony-txt-文件的uid为100-gid为200.png "修改-hello-harmony-txt-文件的uid为100-gid为200") +**示例 1** 修改 /dev下的testfile 文件的uid为100 +```shell +OHOS:/dev$ touch testfile +OHOS:/dev$ ll testfile +-rw-r--r-- 0 0 100 0 1970-01-01 00:00 testfile +OHOS:/dev$ chown 100 testfile +OHOS:/dev$ ll testfile +-rw-r--r-- 0 100 100 0 1970-01-01 00:00 testfile +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/06.cp.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/06.cp.md" similarity index 54% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/06.cp.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/06.cp.md" index b6aaedc852570c69a0ed3af298fe91a55baae977..a96ca8ebb446498818161f4fb762d6d434c03eff 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/06.cp.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/06.cp.md" @@ -1,6 +1,6 @@ --- title: cp -permalink: /pages/0002010400030105 +permalink: /pages/000400010400030105 navbar: true sidebar: true prev: true @@ -9,73 +9,92 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # cp -- [命令功能](#section6841203041513) -- [命令格式](#section24286359150) -- [参数说明](#section558617385152) -- [使用指南](#section16128156162) -- [使用实例](#section19354171211618) -- [输出说明](#section16754183195914) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 拷贝文件,创建一份副本。 -## 命令格式 +## 命令格式 cp \[_SOURCEFILE_\] \[_DESTFILE_\] -## 参数说明 +## 参数说明 **表 1** 参数说明 - - - - - + + + + - -

参数

参数说明

+

参数说明

取值范围

+

取值范围

SOURCEFILE

+

--help

源文件路径。

+

使用帮助。

目前只支持文件,不支持目录。

+

N/A

+

SOURCEFILE

+

源文件路径。

+

目前只支持文件,不支持目录;支持多文件同时拷贝。

DESTFILE

目的文件路径。

+

目的文件路径。

支持目录以及文件。

+

支持目录以及文件。

-## 使用指南 +## 使用指南 - 同一路径下,源文件与目的文件不能重名。 - 源文件必须存在,且不为目录。 - 源文件路径支持“\*”和“?”通配符,“\*”代表任意多个字符,“?”代表任意单个字符。目的路径不支持通配符。当源路径可匹配多个文件时,目的路径必须为目录。 - 目的路径为目录时,该目录必须存在。此时目的文件以源文件命名。 - 目的路径为文件时,所在目录必须存在。此时拷贝文件的同时为副本重命名。 -- 目前不支持多文件拷贝。参数大于2个时,只对前2个参数进行操作。 - 目的文件不存在时创建新文件,已存在则覆盖。 -拷贝系统重要资源时,会对系统造成死机等重大未知影响,如用于拷贝/dev/uartdev-0 文件时,会产生系统卡死现象。 +> ![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** +> +> 拷贝系统重要资源时,会对系统造成死机等重大未知影响,如用于拷贝/dev/uartdev-1 文件时,会产生系统卡死现象。 -## 使用实例 +## 使用实例 -举例:cp hello-harmony.txt ./tmp/ +举例:cp hello-OHOS.txt hello-harmony.txt ./tmp/ -## 输出说明 +## 输出说明 -**图 1** 显示结果如下 -![](/images/zh-cn/device-dev/kernel/figure/显示结果如下-24.png "显示结果如下-24") +**示例** 同时拷贝两个文件至指定目录 +```shell +OHOS:/$ ls +bin hello-OHOS.txt proc system vendor +dev hello-harmony.txt sdcard userdata +etc lib storage usr +OHOS:/$ mkdir tmp +OHOS:/$ cp hello-OHOS.txt hello-harmony.txt tmp/ +OHOS:/$ ll tmp +total 0 +-rwxrwxrwx 1 0 0 0 1979-12-31 00:00 hello-OHOS.txt* +-rwxrwxrwx 1 0 0 0 1979-12-31 00:00 hello-harmony.txt* +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/07.format.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/07.format.md" similarity index 82% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/07.format.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/07.format.md" index 78e704b8a886972348bc3e68e3343ee1db5ecc93..85261f9de9ad4859ce9d4bef8446751e6a9dc7fa 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/07.format.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/07.format.md" @@ -1,6 +1,6 @@ --- title: format -permalink: /pages/0002010400030106 +permalink: /pages/000400010400030106 navbar: true sidebar: true prev: true @@ -9,26 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # format -- [命令功能](#section1922331919169) -- [命令格式](#section249226169) -- [参数说明](#section985173416177) -- [使用指南](#section1510162714162) -- [使用实例](#section25691431161611) -- [输出说明](#section17368112365920) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 format指令用于格式化磁盘。 -## 命令格式 +## 命令格式 format <_dev\_inodename_\> <_sectors_\> <_option_\> \[_label_\] -## 参数说明 +## 参数说明 **表 1** 参数说明 @@ -64,19 +64,22 @@ format <_dev\_inodename_\> <_sectors_\> <_option_\> \[_label_\] -## 使用指南 +## 使用指南 - format指令用于格式化磁盘,设备名可以在dev目录下查找。format时必须安装存储卡。 - format只能格式化U盘、sd和mmc卡,对Nand flash和Nor flash格式化不起作用。 - sectors参数必须传入合法值,传入非法参数可能引发异常。 -## 使用实例 +## 使用实例 -举例:输入format /dev/mmcblk0 128 2 +举例:输入format /dev/mmcblk1 128 2 -## 输出说明 +## 输出说明 -结果如下 - -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001134008686.png) +**示例** 格式化mmc卡 +```shell +OHOS # format /dev/mmcblk1 128 2 +Format to FAT32, 128 sectors per cluster. +format /dev/mmcblk1 Success +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/08.ls.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/08.ls.md" new file mode 100644 index 0000000000000000000000000000000000000000..eadd47018a67dad84dbd24f1174b348897e60b26 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/08.ls.md" @@ -0,0 +1,334 @@ +--- +title: ls +permalink: /pages/000400010400030107 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# ls + +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) + +## 命令功能 + +ls命令用来显示当前目录的内容。 + +## 命令格式 + +ls \[_-ACHLSZacdfhiklmnopqrstux1_\] \[_--color_\[_=auto_\]\] \[_directory..._\] + +> **说明:** 系统启动过程中已经通过 alias 为 ls=toybox ls --color=auto 、ll = ls -alF 、 la=ls -A 和 l=ls -CF 赋能,使这几个命令的初始行为就和linux相同(详细效果见输出说明)。所以若要查看help列表,请输入'toybox ls --help'。 + +## 参数说明 + +**表 1** 展示功能参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--help

+

查看ls命令支持的参数列表,使用方式。

+

N/A

+

-a

+

显示所有文件包括.hidden隐藏类型的文件。

+

N/A

+

-b

+

转义非图形字符。

+

N/A

+

-c

+

使用ctime作为文件的时间戳。"ls -lc"

+

N/A

+

-d

+

只显示path名称不显示path所包含的内容。

+

N/A

+

-i

+

显示文件的节点号。

+

N/A

+

-p

+

在path名称后放一个"/"。

+

N/A

+

-q

+

显示不可打印字符比如'?'。

+

N/A

+

-s

+

统计目录和其成员所占用的内存大小,单位为1024字节。

+

N/A

+

-u

+

以文件的最后访问时间为时间戳,配合 -l 一起使用。

+

N/A

+

-A

+

列出所有文件除了.和..

+

N/A

+

-H

+

跟随命令行符号链接。

+

N/A

+

-L

+

跟随符号链接。

+

N/A

+

-Z

+

安全上下文。

+

N/A

+

path

+

path为空时,显示当前目录的内容。

+

path为无效文件名时,显示失败,提示:

+

ls error: No such directory。

+

path为有效目录路径时,会显示对应目录下的内容。

+

1.为空。

+

2.有效的目录路径。

+
+ +**表2** 输出格式参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-1

+

每行列出一个文件。

+

N/A

+

-c

+

列,垂直排序。

+

N/A

+

-g

+

类似于 -l 但没有所有者。

+

N/A

+

-h

+

统计path目录下文件的总大小,单位为KiB。

+

N/A

+

-l

+

详细的显示path目录下文件的信息。

+

N/A

+

-m

+

文件之间添加逗号。

+

N/A

+

-n

+

类似 -l 数字格式显示uid/gid。

+

N/A

+

-o

+

类似 -l 但显示列表不包括组。

+

N/A

+

-x

+

列,水平排序。

+

N/A

+

-ll

+

文件的时间属性显示纳秒。

+

N/A

+

--color

+

彩色打印。

+

默认配置为:device=yellow symlink=turquoise/red dir=blue socket=purple files: exe=green suid=red suidfile=redback stickydir=greenback=auto means detect if output is a tty.

+
+ +**表3** 排序参数说明(默认为按首字母排序) + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-f

+

不排序。

+

N/A

+

-r

+

按首字母反向排序。

+

N/A

+

-t

+

按文件的最后修改时间排序,最近时间为排头。

+

N/A

+

-S

+

按文件大小来排序,大文件为排头。

+

N/A

+
+ +## 使用指南 + +- ls命令显示当前目录的内容。 +- ll可以显示文件的大小。 +- proc下ll无法统计文件大小,显示为0。 +- dev、proc、无法统计文件时间信息。 + +> ![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** +> +> fatfs的文件节点信息继承其父节点,父节点号为0。故在hi3516dv300开发板上ls -i显示的文件节点号全为0。 + +## 使用实例 + +举例: + +- ls +- ll + +## 输出说明 + +**示例 1** ls命令查看当前路径下的内容 + +```shell +OHOS:/$ ls +bin etc nfs sdcard system usr +dev lib proc storage userdata vendor +``` + +**示例 2** ll命令查看当前路径下的内容 + +```shell +OHOS:/$ ll +total 20 +drwxrwxrwx 1 0 0 2048 2021-11-21 17:52 bin/ +drwxr-xr-x 0 0 0 0 1970-01-01 00:00 dev/ +drwxrwxrwx 1 0 0 2048 2021-11-21 17:52 etc/ +drwxrwxrwx 1 0 0 2048 2021-11-21 17:52 lib/ +drwxrwxrwx 0 0 0 4096 2021-10-25 02:17 nfs/ +dr-xr-xr-x 0 0 0 0 1970-01-01 00:00 proc/ +drwxrwxrwx 1 0 0 4096 1979-12-31 00:00 sdcard/ +drwxrwxrwx 1 0 0 2048 2021-11-21 17:52 storage/ +drwxrwxrwx 1 0 0 2048 2021-11-21 17:52 system/ +drwxrwxrwx 1 0 0 2048 2021-11-21 17:52 userdata/ +drwxrwxrwx 1 0 0 2048 2021-11-21 17:52 usr/ +drwxrwxrwx 1 0 0 2048 2021-11-21 17:52 vendor/ +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/09.lsfd.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/09.lsfd.md" similarity index 50% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/09.lsfd.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/09.lsfd.md" index 5ed2d45bd63e424c2caa0ab316fe208a113f271b..0e108a4a7ece750e4a308fb7f8e9d68b6adb452c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/09.lsfd.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/09.lsfd.md" @@ -1,6 +1,6 @@ --- title: lsfd -permalink: /pages/0002010400030108 +permalink: /pages/000400010400030108 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # lsfd @@ -37,6 +37,44 @@ lsfd命令显示当前已经打开文件的fd号以及文件的名字。 ## 输出说明 -**图 1** lsfd输出说明 -![](/images/zh-cn/device-dev/kernel/figure/lsfd输出说明.png "lsfd输出说明") +**示例** lsfd输出说明 + +```shell +OHOS # lsfd + fd filename + 3 /dev/console1 + 4 /dev/hilog + 5 /dev/hilog + 6 /dev/hilog + 7 /dev/lite_ipc + 8 /dev/hilog + 9 /dev/lite_ipc + 10 /dev/vb + 11 /dev/hilog + 12 /dev/vo + 13 /dev/hilog + 14 /dev/hilog + 15 /dev/sys + 16 /dev/lite_ipc + 17 /dev/lite_ipc + 18 /dev/hi_tde + 19 /dev/fb0 + 20 /dev/vo + 21 /dev/mmz_userdev + 22 /dev/hi_tde + 23 /dev/lite_ipc + 24 /dev/hdf/hdf_input_event1 + 25 /dev/lite_ipc + 26 /dev/mmz_userdev + 27 /dev/lite_ipc + 28 /dev/hilog + 29 /dev/hilog + 30 /dev/hdf/hdf_sensor_manager_ap + 31 /dev/hilog + 32 /dev/lite_ipc + 33 /dev/lite_ipc + 34 /dev/lite_ipc +``` + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/10.mkdir.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/10.mkdir.md" new file mode 100644 index 0000000000000000000000000000000000000000..b14f182ff79c80ba4f02d9eba9d9ed5df4239489 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/10.mkdir.md" @@ -0,0 +1,138 @@ +--- +title: mkdir +permalink: /pages/000400010400030109 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:30 +--- +# mkdir + +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) + +## 命令功能 + +mkdir命令用来创建一个目录。 + +## 命令格式 + +mkdir \[_-vp_\] \[_-m mode_\] \[_dirname..._\] + +## 参数说明 + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--help

+

查看mkdir命令支持的参数列表

+

N/A

+

-m

+

设置即将创建目录的权限。

+

N/A

+

-p

+

递归逐级创建父子目录。

+

N/A

+

-v

+

打印创建目录过程中的详细信息。

+

N/A

+

directory

+

需要创建的目录。

+

N/A

+
+ +## 使用指南 + +- mkdir后加所需要创建的目录名会在当前目录下创建目录。 +- mkdir后加路径,再加上需要创建的目录名,即在指定目录下创建目录。 +- mkdir后加参数,提供目录权限定制,目录逐级创建等功能。 + +> ![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** +> +> fatfs文件系统所有创建的文件和其挂载节点的权限属性保持一致,目前节点的权限只有用户读写权限,group和others权限不生效, +> +> 且只有读写位可设置,有rw和ro两种,因此mkdir在附加-m参数时,创建的目录权限仅有777和555两种,可执行权限也不生效。 + +## 使用实例 + +举例: + +- mkdir testpath +- mkdir -m 777 testpath +- mkdir -pv testpath01/testpath02/testpath03 + +## 输出说明 + +**示例 1** 创建默认文件 + +```shell +OHOS:/tmp$ mkdir testpath +OHOS:/tmp$ ll +total 2 +drwxrwxrwx 1 0 0 2048 1979-12-31 00:00 testpath/ +``` + +**示例 2** 创建指定mode的目录 + +```shell +OHOS:/tmp$ mkdir -m 777 testpath +OHOS:/tmp$ ll +total 2 +drwxrwxrwx 1 0 0 2048 1979-12-31 00:00 testpath/ +``` + +**示例 3** 逐级创建目录 + +```shell +OHOS:/tmp$ mkdir -pv testpath01/testpath02/testpath03 +mkdir: created directory 'testpath01' +mkdir: created directory 'testpath01/testpath02' +mkdir: created directory 'testpath01/testpath02/testpath03' +OHOS:/tmp$ ll +total 2 +drwxrwxrwx 1 0 0 2048 1979-12-31 00:00 testpath01/ +OHOS:/tmp$ ll testpath01/ +total 2 +drwxrwxrwx 1 0 0 2048 1979-12-31 00:00 testpath02/ +OHOS:/tmp$ ll testpath01/testpath02/ +total 2 +drwxrwxrwx 1 0 0 2048 1979-12-31 00:00 testpath03/ +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/11.mount.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/11.mount.md" similarity index 42% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/11.mount.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/11.mount.md" index 92b03ee494a13f55b8f118c15c3d750aa277f696..1b35f01e8939f029f7b9d2cfcdbd8f2966b73451 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/11.mount.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/11.mount.md" @@ -1,6 +1,6 @@ --- title: mount -permalink: /pages/000201040003010a +permalink: /pages/00040001040003010a navbar: true sidebar: true prev: true @@ -9,26 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # mount -- [命令功能](#section11631837182) -- [命令格式](#section1697638111820) -- [参数说明](#section1650151221819) -- [使用指南](#section124541520171912) -- [使用实例](#section7424625171917) -- [输出说明](#section14757018116) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 mount命令用来将设备挂载到指定目录。 -## 命令格式 +## 命令格式 -mount <_device_\> <_path_\> <_name_\> \[_uid gid_\] +mount \[_-f_\] \[_-t TYPE_\] \[_-o OPTION,_\] \[\[_DEVICE_\] _DIR_\] -## 参数说明 +## 参数说明 **表 1** 参数说明 @@ -41,51 +41,71 @@ mount <_device_\> <_path_\> <_name_\> \[_uid gid_\] -

device

+

--help

-

要挂载的设备(格式为设备所在路径)。

+

查看mount命令支持的参数列表。

-

系统拥有的设备。

+

N/A

-

path

+

-f

-

指定目录。

-

用户必须具有指定目录中的执行(搜索)许可权。

+

佯装挂载动作(实际不做挂载)。

-

N/A

+

N/A

-

name

+

-t

-

文件系统的种类。

+

文件系统的种类。

-

vfat, yaffs, jffs, ramfs, nfs,procfs, romfs.

+

TYPE:vfat, yaffs, jffs, ramfs, nfs,procfs, romfs.

-

uid gid

+

-o

-

uid是指用户ID。

-

gid是指组ID。

-

可选参数,缺省值uid:0,gid:0。

+

挂载选项。

-

N/A

+

N/A

+ + +

DEVICE

+ +

要挂载的设备(格式为设备所在路径)。

+ +

系统拥有的设备。

+ + +

DIR

+ +

指定目录。

+

用户必须具有指定目录中的执行(搜索)许可权。

+ +

N/A

-## 使用指南 +## 使用指南 mount后加需要挂载的设备信息、指定目录以及设备文件格式,就能成功挂载文件系统到指定目录。 -## 使用实例 - -举例:mount /dev/mmcblk0p0 /bin1/vs/sd vfat +## 使用实例 -## 输出说明 +举例:mount -t nfs 192.168.1.3:/nfs nfs -将/dev/mmcblk0p0 挂载到/bin1/vs/sd目录 +## 输出说明 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001134008688.png) +**示例** 将服务器端nfs目录192.168.1.3:/nfs挂载到当前系统下新建的/nfs目录: +```shell +OHOS:/$ mkdir nfs +OHOS:/$ mount -t nfs 192.168.1.3:/nfs nfs +Mount nfs on 192.168.1.3:/nfs, uid:0, gid:0 +Mount nfs finished. +OHOS:/$ ls nfs/ +16d.xml gpio_test ohos_test.txt userfs_vfat.img +OHOS_Image.bin hello rootfs_vfat.img +dev_tools mksh_rootfs_vfat.img test_demo +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/12.partinfo.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/12.partinfo.md" similarity index 85% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/12.partinfo.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/12.partinfo.md" index 680f864b3598365c8e9ba9bd03da19a6379cbd6f..cbd7e0a7cfd326ee258d2c6e16462bce0322a7f5 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/12.partinfo.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/12.partinfo.md" @@ -1,6 +1,6 @@ --- title: partinfo -permalink: /pages/000201040003010b +permalink: /pages/00040001040003010b navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # partinfo @@ -53,13 +53,26 @@ partinfo <_dev\_inodename_\> ## 使用指南 -无 +无。 ## 使用实例 -partinfo /dev/mmcblk0p0 +举例:partinfo /dev/mmcblk0p0 ## 输出说明 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001133848906.png) +**示例** 查看系统分区信息 + +```shell +OHOS # partinfo /dev/mmcblk0p0 + +part info : +disk id : 0 +part_id in system: 1 +part no in disk : 0 +part no in mbr : 0 +part filesystem : 00 +part sec start : 20480 +part sec count : 102400 +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/13.partition.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/13.partition.md" similarity index 93% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/13.partition.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/13.partition.md" index c706a47c3ee717ccaf52a845a6729f7b9cedd97b..f0ceb7f7f698383fe9ea8bc32224ec7c883005c0 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/13.partition.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/13.partition.md" @@ -1,6 +1,6 @@ --- title: partition -permalink: /pages/000201040003010c +permalink: /pages/00040001040003010c navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # partition @@ -71,5 +71,8 @@ partition \[_nand / spinor_\] 查看spinor flash分区信息 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179848349.png) +```shell +OHOS # partition spinor +spinor partition num:0, blkdev name:/dev/spinorblk0, mountpt:/, startaddr:0x00500000, length:0x00a00000 +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/14.pwd.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/14.pwd.md" similarity index 82% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/14.pwd.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/14.pwd.md" index ae896d706e380e30157a1ee5340edc406147bc51..a2d2fd1186c7f9ef638d6e6cc5b70b757b9f58f6 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/14.pwd.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/14.pwd.md" @@ -1,6 +1,6 @@ --- title: pwd -permalink: /pages/000201040003010d +permalink: /pages/00040001040003010d navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # pwd @@ -42,6 +42,10 @@ pwd 命令将当前目录的全路径名称(从根目录)写入标准输出 ## 输出说明 -**图 1** 查看当前路径 -![](/images/zh-cn/device-dev/kernel/figure/查看当前路径.png "查看当前路径") +**示例** 查看当前路径 + +```shell +OHOS:/sdcard/nfs$ pwd +/sdcard/nfs +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/15.rm.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/15.rm.md" similarity index 43% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/15.rm.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/15.rm.md" index 4502252e3234afb165550ed0294e731c6cceb27c..0a973a819ed3cbd1a464072b9416330923179ef5 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/15.rm.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/15.rm.md" @@ -1,6 +1,6 @@ --- title: rm -permalink: /pages/000201040003010e +permalink: /pages/00040001040003010e navbar: true sidebar: true prev: true @@ -9,26 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # rm -- [命令功能](#section181141523142613) -- [命令格式](#section8800926132619) -- [参数说明](#section15476229152617) -- [使用指南](#section10578163215262) -- [使用实例](#section18548133511263) -- [输出说明](#section1565323814265) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 rm命令用来删除文件或文件夹。 -## 命令格式 +## 命令格式 -rm \[_-r_\] \[_dirname / filename_\] +rm \[_-fv_\] _FILE or rm_ \[_-rv_\] \[_PATH_ | _filename_\]... -## 参数说明 +## 参数说明 **表 1** 参数说明 @@ -43,12 +43,26 @@ rm \[_-r_\] \[_dirname / filename_\]

-r

-

可选参数,若是删除目录则需要该参数。

+

删除空目录或非空目录。

N/A

-

dirname/filename

+

-f

+ +

强制删除:不需要确认,删除不存的文件在也不报错。

+ +

N/A

+ + +

-v

+ +

显示删除的过程。

+ +

N/A

+ + +

PATH/filename

要删除文件或文件夹的名称,支持输入路径。

@@ -58,23 +72,41 @@ rm \[_-r_\] \[_dirname / filename_\] -## 使用指南 +## 使用指南 -- rm命令一次只能删除一个文件或文件夹。 +- rm命令能同时删除多个文件或文件夹。 - rm -r命令可以删除非空目录。 +- 删除不存在的文件会报错。 -## 使用实例 +## 使用实例 举例: -1. 输入rm log1.txt -2. 输入rm -r sd - -## 输出说明 - -**图 1** 用 rm 命令删除文件 log1.txt -![](/images/zh-cn/device-dev/kernel/figure/用-rm-命令删除文件-log1-txt.png "用-rm-命令删除文件-log1-txt") - -**图 2** 用 rm -r 删除目录 sd -![](/images/zh-cn/device-dev/kernel/figure/用-rm--r-删除目录-sd.png "用-rm--r-删除目录-sd") - +- 输入rm testfile +- 输入rm -r testpath/ + +## 输出说明 + +**示例 1** 用 rm 命令删除文件 testfile + +```shell +OHOS:/$ ls +bin etc proc storage testfile usr +dev lib sdcard system userdata vendor +OHOS:/$ rm testfile +OHOS:/$ ls +bin etc proc storage userdata vendor +dev lib sdcard system usr +``` + +**示例 2** 用 rm -r 删除非空目录 testpath + +```shell +OHOS:/$ ls +bin etc proc storage testpath usr +dev lib sdcard system userdata vendor +OHOS:/$ rm -r testpath/ +OHOS:/$ ls +bin etc proc storage userdata vendor +dev lib sdcard system usr +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/16.rmdir.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/16.rmdir.md" similarity index 35% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/16.rmdir.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/16.rmdir.md" index b41e0a1bde34116940c6d52b2e89bc7243261dab..a354299619b7748f8d410c90cbfe92f721f7998b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/16.rmdir.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/16.rmdir.md" @@ -1,6 +1,6 @@ --- title: rmdir -permalink: /pages/000201040003010f +permalink: /pages/00040001040003010f navbar: true sidebar: true prev: true @@ -9,26 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # rmdir -- [命令功能](#section1839611420266) -- [命令格式](#section329574512266) -- [参数说明](#section15865747102620) -- [使用指南](#section107857508261) -- [使用实例](#section11196165315262) -- [输出说明](#section1073811415613) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 rmdir命令用来删除一个目录。 -## 命令格式 +## 命令格式 -rmdir \[_dir_\] +rmdir \[_-p_\] \[_dirname..._\] -## 参数说明 +## 参数说明 **表 1** 参数说明 @@ -41,7 +41,28 @@ rmdir \[_dir_\] -

dir

+

--help

+ +

查看rmdir命令支持的参数列表。

+ +

N/A

+ + +

-p

+ +

删除路径。

+ +

N/A

+ + +

--ignore-fail-on-non-empty

+ +

忽略删除非空目录导致的故障。

+ +

N/A

+ + +

dir

需要删除目录的名称,删除目录必须为空,支持输入路径。

@@ -51,18 +72,24 @@ rmdir \[_dir_\] -## 使用指南 +## 使用指南 - rmdir命令只能用来删除目录。 - rmdir一次只能删除一个目录。 - rmdir只能删除空目录。 -## 使用实例 +## 使用实例 举例:输入rmdir dir -## 输出说明 +## 输出说明 -**图 1** 删除一个名为 dir 的目录 -![](/images/zh-cn/device-dev/kernel/figure/删除一个名为-dir-的目录.png "删除一个名为-dir-的目录") +**示例** 删除一个名为 dir 的目录 +```shell +OHOS:/test$ mkdir dir +OHOS:/test$ ls +dir +OHOS:/test$ rmdir dir/ +OHOS:/test$ ls +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/17.statfs.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/17.statfs.md" similarity index 85% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/17.statfs.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/17.statfs.md" index 88a82b991b49df2b249782caffbbd18f2ce3764f..ed412debeb300e09804b6305afebf00a7d595dff 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/17.statfs.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/17.statfs.md" @@ -1,6 +1,6 @@ --- title: statfs -permalink: /pages/0002010400030110 +permalink: /pages/000400010400030110 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # statfs @@ -58,8 +58,22 @@ statfs \[_directory_\] 以nfs文件系统为例: -statfs /nfs +输入statfs /nfs -**图 1** statfs输出说明 -![](/images/zh-cn/device-dev/kernel/figure/statfs输出说明.png "statfs输出说明") +**示例** 但因nfs文件系统信息 + +```shell +OHOS # statfs ./nfs +statfs got: + f_type = 26985 + cluster_size = 512 + total_clusters = 1579575176 + free_clusters = 499254808 + avail_clusters = 499254808 + f_namelen = 255 + +./nfs + total size: 808742490112 Bytes + free size: 255618461696 Bytes +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/18.sync.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/18.sync.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/18.sync.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/18.sync.md" index 3262992bb71a58fec97e7da1cf24fc9aa975bed9..76130e07589660eb6dd7658701e06a7aee18a62f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/18.sync.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/18.sync.md" @@ -1,6 +1,6 @@ --- title: sync -permalink: /pages/0002010400030111 +permalink: /pages/000400010400030111 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # sync diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/19.touch.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/19.touch.md" similarity index 45% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/19.touch.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/19.touch.md" index 6f5e9cab37eb56b54845bb27c212740e3de226e2..b4aeeac016727441c01ed91d6b795ed4a457e4b8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/19.touch.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/19.touch.md" @@ -1,6 +1,6 @@ --- title: touch -permalink: /pages/0002010400030112 +permalink: /pages/000400010400030112 navbar: true sidebar: true prev: true @@ -9,31 +9,32 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:30 --- # touch -- [命令功能](#section17541924112716) -- [命令格式](#section866182711274) -- [参数说明](#section268912296270) -- [使用指南](#section412093332714) -- [使用实例](#section414434814354) -- [输出说明](#section1028419515711) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section405) +- [输出说明](#section06) -## 命令功能 +## 命令功能 - touch命令用来在指定的目录下创建一个不存在的空文件。 - touch命令操作已存在的文件会成功,不会更新时间戳。 -## 命令格式 +## 命令格式 -touch \[_filename_\] +touch \[_filename_\] -## 参数说明 +## 参数说明 **表 1** 参数说明 + - + + + + @@ -52,21 +60,43 @@ touch \[_filename_\]

参数

参数说明

@@ -42,7 +43,14 @@ touch \[_filename_\]

filename

+

--help

+

查看touch命令支持的参数列表

+

N/A

+

filename

需要创建文件的名称。

-## 使用指南 +## 使用指南 - touch命令用来创建一个空文件,该文件可读写。 -- 使用touch命令一次只能创建一个文件。 +- 使用touch命令允许一次创建多个文件。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** + >![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >在系统重要资源路径下使用touch命令创建文件,会对系统造成死机等未知影响,如在/dev路径下执行touch uartdev-0,会产生系统卡死现象。 +## 使用实例 + +举例: + +- touch file.c +- touch testfile1 testfile2 testfile3 -## 使用实例 +## 输出说明 -举例:输入touch file.c 输出说明 +**示例 1** 创建一个名为 file.c 的文件 -## 输出说明 +```shell +OHOS:/tmp$ ls +OHOS:/tmp$ touch file.c +OHOS:/tmp$ ls +file.c +OHOS:/tmp$ ll +total 0 +-rwxrwxrwx 1 0 0 0 1979-12-31 00:00 file.c* +``` -**图 1** 创建一个名为 file.c 的文件 -![](/images/zh-cn/device-dev/kernel/figure/创建一个名为-file-c-的文件.png "创建一个名为-file-c-的文件") +**示例 2** 同时创建三个文件 +```shell +OHOS:/tmp$ touch testfile1 testfile2 testfile3 +OHOS:/tmp$ ll +total 0 +-rwxrwxrwx 1 0 0 0 1979-12-31 00:00 testfile1* +-rwxrwxrwx 1 0 0 0 1979-12-31 00:00 testfile2* +-rwxrwxrwx 1 0 0 0 1979-12-31 00:00 testfile3* +OHOS:/tmp$ +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/20.writeproc.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/20.writeproc.md" similarity index 93% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/20.writeproc.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/20.writeproc.md" index 42c51ee18a23d575d1ad87e73416e6a4386b501a..1621851618fe3b4b36ad0417747c03383dc1a63c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/20.writeproc.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/20.writeproc.md" @@ -1,6 +1,6 @@ --- title: writeproc -permalink: /pages/0002010400030113 +permalink: /pages/000400010400030113 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # writeproc @@ -62,7 +62,7 @@ writeproc <_data_\> \>\> /proc/<_filename_\> proc文件实现自身的write函数,调用writeproc命令后会将入参传入write函数。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >procfs不支持多线程访问。 ## 使用实例 @@ -77,6 +77,6 @@ OHOS \# writeproc test \>\> /proc/uptime test \>\> /proc/uptime ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >uptime proc文件临时实现write函数,INFO日志为实现的测试函数打印的日志。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/21.umount.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/21.umount.md" similarity index 33% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/21.umount.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/21.umount.md" index 8f6e3c5aa4117c6541b02a99e2759d4de94cd32c..cf2fb0d8a75b11ca0790c14e603ccb0f9399dc54 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/21.umount.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/21.umount.md" @@ -1,6 +1,6 @@ --- title: umount -permalink: /pages/0002010400030114 +permalink: /pages/000400010400030114 navbar: true sidebar: true prev: true @@ -9,26 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # umount -- [命令功能](#section365125133520) -- [命令格式](#section9615254123512) -- [参数说明](#section63446577355) -- [使用指南](#section92931509368) -- [使用实例](#section144311323616) -- [输出说明](#section360525113611) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 umount命令用来卸载指定文件系统。 -## 命令格式 +## 命令格式 -umount \[_dir_\] +umount \[_-a \[-t TYPE\]_\] \[_dir_\] -## 参数说明 +## 参数说明 **表 1** 参数说明 @@ -41,7 +41,29 @@ umount \[_dir_\] -

dir

+

--help

+ +

查看umount命令支持的参数列表。

+ +

N/A

+ + +

-a

+ +

卸载所有已挂载的目录。

+ +

N/A

+ + + +

-t

+ +

同-a选项一起使用,限制-a,只卸载-t所指定的文件系统类型。

+ +

N/A

+ + +

dir

需要卸载文件系统对应的目录。

@@ -51,18 +73,31 @@ umount \[_dir_\] -## 使用指南 +## 使用指南 umount后加上需要卸载的指定文件系统的目录,即将指定文件系统卸载。 -## 使用实例 +## 使用实例 + +举例: + +- umount ./nfs +- umount -a -t nfs ./nfs + +## 输出说明 -举例:umount /bin1/vs/sd +将已在./nfs挂载的文件系统卸载掉。 -## 输出说明 +**示例 1** umount输出示例 -将已在/bin1/vs/sd挂载的文件系统卸载 +```shell +OHOS:/$ umount ./nfs/ +umount ok +``` -**图 1** umount输出示例 -![](/images/zh-cn/device-dev/kernel/figure/umount输出示例.png "umount输出示例") +**示例 2** umount指定文件类型 +```shell +OHOS:/$ umount -a -t nfs ./nfs/ +umount ok +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/22.du.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/22.du.md" new file mode 100644 index 0000000000000000000000000000000000000000..b41b7a9006285626eb09de738cfbdf752bbcaaa2 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/22.du.md" @@ -0,0 +1,105 @@ +--- +title: du +permalink: /pages/000400010400030115 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# du + +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) + +## 命令功能 + +du显示指定的文件所占用的磁盘空间。 + +## 命令格式 + +du \[_-kKmh_\] \[_file..._\] + +## 参数说明 + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--help

+

查看du命令支持的参数列表。

+

N/A

+

-k

+

显示占用的块,每块1024bytes(默认)。

+

N/A

+

-K

+

显示占用的块,每块512bytes(posix)。

+

N/A

+

-m

+

兆字节为单位。

+

N/A

+

-h

+

以K,M,G为单位,提高信息的可读性(例如,1K 243M 2G)。

+

N/A

+

file

+

指定的需要统计的文件。

+

N/A

+
+ +## 使用指南 + +- 不支持统计目录的大小,只支持统计文件的大小。 +- file的内容既为文件名,不能包含其所在的目录。 + +## 使用实例 + +举例:du -h testfile + +## 输出说明 + +**示例** 显示结果如下 + +```shell +OHOS:/$ du -h testfile +1.8K testfile +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/23.mv.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/23.mv.md" new file mode 100644 index 0000000000000000000000000000000000000000..d2edbb6130ce8179214a21cb7158701a3c1b8a46 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/02.\346\226\207\344\273\266\345\221\275\344\273\244/23.mv.md" @@ -0,0 +1,148 @@ +--- +title: mv +permalink: /pages/000400010400030116 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# mv + +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) + +## 命令功能 + +移动文件 + +## 命令格式 + +mv \[_-fivn_\] _SOURCE... DEST_ + +## 参数说明 + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

--help

+

使用帮助。

+

N/A

+

-f

+

通过删除目标文件强制复制。

+

N/A

+

-i

+

若指定移动的源目录或文件与目标中目录或文件同名,则会先询问是否覆盖旧文件,输入 y 直接覆盖,输入 n 取消该操作。

+

N/A

+

-n

+

不要覆盖任何已存在的文件或目录。

+

N/A

+

-v

+

目前本参数toybox官方最新代码虽然支持,但同样也不生效。

+

N/A

+

SOURCE

+

源文件路径。

+

目前只支持文件,不支持目录;支持多文件同时移动。

+

DEST

+

目的文件路径。

+

支持目录以及文件。

+
+ +## 使用指南 + +- 源文件路径支持“\*”和“?”通配符,“\*”代表任意多个字符,“?”代表任意单个字符。目的路径不支持通配符。当源路径可匹配多个文件时,目的路径必须为目录。 +- 目的路径为目录时,该目录必须存在。此时目的文件以源文件命名。 +- 目的路径为文件时,所在目录必须存在。 +- 目的文件已存在则会覆盖。 + +## 使用实例 + +举例: + +- mv -i test.txt testpath/ + +- mv test?.txt testpath/ (移动 test3.txt testA.txt test_.txt) + + +## 输出说明 + +**示例 1** 显示结果如下 + +```shell +OHOS:/$ touch test.txt +OHOS:/$ mkdir testpath +OHOS:/$ touch testpath/test.txt +OHOS:/$ mv -i test.txt testpath/ +mv: overwrite 'testpath//test.txt' (Y/n):y +OHOS:/$ ls +bin etc proc storage testpath usr +dev lib sdcard system userdata vendor +OHOS:/$ cp testpath/test.txt ./ +OHOS:/$ ls +bin etc proc storage test.txt userdata vendor +dev lib sdcard system testpath usr +OHOS:/$ mv -i test.txt testpath/ +mv: overwrite 'testpath//test.txt' (Y/n):n +OHOS:/$ ls +bin etc proc storage test.txt userdata vendor +dev lib sdcard system testpath usr +``` + +**示例 2** 通配符使用 + +```shell +OHOS:/$ ls +bin etc proc storage test.txt testA.txt testpath usr +dev lib sdcard system test3.txt test_.txt userdata vendor +OHOS:/$ mv test?.txt testpath/ +OHOS:/$ ls +bin etc proc storage test.txt userdata vendor +dev lib sdcard system testpath usr +OHOS:/$ ls testpath/ +test.txt test3.txt testA.txt test_.txt +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/01.arp.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/01.arp.md" similarity index 63% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/01.arp.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/01.arp.md" index dfac6586931bc6a8656634e6262e2dbd0a3e76fb..aaf372343111c39144cf8c39146be24b04e31f32 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/01.arp.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/01.arp.md" @@ -1,6 +1,6 @@ --- title: arp -permalink: /pages/0002010400030200 +permalink: /pages/000400010400030200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # arp @@ -25,11 +25,12 @@ date: 2021-12-30 12:57:43 ## 命令格式 -arp +- arp -arp \[_-i IF_\] -s _IPADDR HWADDR_ +- arp \[_-i IF_\] -s _IPADDR HWADDR_ + +- arp \[_-i IF_\] -d _IPADDR_ -arp \[_-i IF_\] -d _IPADDR_ ## 参数说明 @@ -85,43 +86,45 @@ arp \[_-i IF_\] -d _IPADDR_ 举例: -1. 输入arp - - **图 1** 打印整个 ARP 缓存表 - - - ![](/images/zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58.png) - - **表 2** 参数说明 - - - - - - - - - - - - - - - - - - - -

参数

-

说明

-

Address

-

表示网络设备的IPv4地址。

-

HWaddress

-

表示网络设备的MAC地址。

-

Iface

-

表示该ARP表项使用的接口名。

-

Type

-

表示该ARP表项是动态的还是静态的,动态是指ARP表项由协议栈自动创建,静态是指ARP表项是由用户增加的。

-
+输入arp + +**示例** 打印整个 ARP 缓存表 + +```shell +OHOS # arp +Address HWaddress Iface Type +192.168.1.10 E6:2B:99:2C:4B:20 eth0 static +``` +**表 2** 参数说明 + + + + + + + + + + + + + + + + + + + +

参数

+

说明

+

Address

+

表示网络设备的IPv4地址。

+

HWaddress

+

表示网络设备的MAC地址。

+

Iface

+

表示该ARP表项使用的接口名。

+

Type

+

表示该ARP表项是动态的还是静态的,动态是指ARP表项由协议栈自动创建,静态是指ARP表项是由用户增加的。

+
diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/02.dhclient.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/02.dhclient.md" new file mode 100644 index 0000000000000000000000000000000000000000..ef60f227ac119458e7bef035cb0ed50f81c89010 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/02.dhclient.md" @@ -0,0 +1,109 @@ +--- +title: dhclient +permalink: /pages/000400010400030201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# dhclient + +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) + +## 命令功能 + +设置和查看dhclient的参数。 + +## 命令格式 + +- dhclient <_netif name_\> + +- dhclient -x <_netif name_\> + +## 参数说明 + +**表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值范围

+

-h | --help

+

查看dhclient命令支持的参数列表,及使用方式。

+

N/A

+

<netif name>

+

启动对应网卡的dhcp请求。

+

网卡名字,eth0。

+

-x <netif name>

+

关闭对应网卡的dhcp功能。

+

网卡名字,eth0。

+
+ +## 使用指南 + +无。 + +## 使用实例 + +举例: + +- dhclient eth0 +- dhclient -x eth0 + + +## 输出说明 + +**示例 1** 启动网卡eth0的dhcp请求 + +```shell +OHOS:/$ dhclient eth0 +OHOS:/$ ifconfig +lo ip:127.0.0.1 netmask:255.0.0.0 gateway:127.0.0.1 + ip6: ::1/64 + HWaddr 00 MTU:0 Running Link UP +eth0 ip:192.168.1.10 netmask:255.255.255.0 gateway:192.168.1.1 + HWaddr 42:da:81:bc:58:94 MTU:1500 Running Default Link UP +OHOS:/$ +``` + +**示例 2** 关闭网卡eth0的dhcp请求 + +```shell +OHOS:/$ dhclient -x eth0 +NetifStatusCallback(eth0): nsc event: 0xf0 +OHOS:/$ ifconfig +lo ip:127.0.0.1 netmask:255.0.0.0 gateway:127.0.0.1 + ip6: ::1/64 + HWaddr 00 MTU:0 Running Link UP +eth0 ip:0.0.0.0 netmask:0.0.0.0 gateway:0.0.0.0 + HWaddr 42:da:81:bc:58:94 MTU:1500 Running Default Link UP +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/04.ifconfig.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/03.ifconfig.md" similarity index 42% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/04.ifconfig.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/03.ifconfig.md" index 53fe441bbc7d4ead5e967d15754a6c0254422459..422d2cc5a35c91858e1134968d7130201b02bceb 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/04.ifconfig.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/03.ifconfig.md" @@ -1,6 +1,6 @@ --- title: ifconfig -permalink: /pages/0002010400030203 +permalink: /pages/000400010400030202 navbar: true sidebar: true prev: true @@ -9,38 +9,40 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # ifconfig -- [命令功能](#section174940284379) -- [命令格式](#section136073203715) -- [参数说明](#section6493235203710) -- [使用指南](#section05763403371) -- [使用实例](#section168802042123717) -- [输出说明](#section124638211109) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 ifconfig命令用来查询和设置网卡的IP地址、网络掩码、网关、硬件mac地址等参数。并能够启用/关闭网卡。 -## 命令格式 +## 命令格式 -ifconfig +ifconfig [option] -\[_-a_\] +option: -<_interface_\> <_address_\> \[_netmask _\] \[_gateway _\] +- \[_-a_\] -\[_hw ether _\] \[_mtu _\] +- <_interface_\> <_address_\> \[_netmask _\] \[_gateway _\] +- \[_hw ether _\] \[_mtu _\] -\[_inet6 add _\] +- \[_inet6 add _\] -\[_inet6 del _\] +- \[_inet6 del _\] -\[_up|down_\] +- \[_up|down_\] -## 参数说明 + +## 参数说明 **表 1** 参数说明 @@ -142,187 +144,190 @@ ifconfig -## 使用指南 +## 使用指南 - 命令需要启动TCP/IP协议栈后才能使用。 - 由于IP冲突检测需要反应时间,每次使用ifconfig设置IP后会有2S左右的延时。 -## 使用实例 - -1. ifconfig eth0 192.168.100.31 netmask 255.255.255.0 gateway 192.168.100.1 hw ether 00:49:cb:6c:a1:31 -2. ifconfig -a -3. ifconfig eth0 inet6 add 2001:a:b:c:d:e:f:d -4. ifconfig eth0 inet6 del 2001:a:b:c:d:e:f:d - -## 输出说明 - -1. 设置网络参数 - - ``` - OHOS # ifconfig eth0 192.168.100.31 netmask 255.255.255.0 gateway 192.168.100.1 hw ether 00:49:cb:6c:a1:31 - OHOS # ifconfig - eth0 ip:192.168.100.31 netmask:255.255.255.0 gateway:192.168.100.1 - HWaddr 00:49:cb:6c:a1:31 MTU:1500 Running Default Link UP - lo ip:127.0.0.1 netmask:255.0.0.0 gateway:127.0.0.1 - ip6: ::1/64 - HWaddr 00 MTU:0 Running Link UP - ``` - - 输出的各参数说明如下表所示: - - **表 2** 参数说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

说明

-

ip

-

板子IP地址。

-

netmask

-

网络掩码。

-

gateway

-

网关。

-

HWaddr

-

板子硬件mac地址。

-

MTU

-

网络最大传输单元。

-

Running/Stop

-

网卡是否正在运行。

-

Default

-

有这项说明此网卡连接到默认网关。

-

Link UP/Down

-

网卡连接状态。

-
- -2. 获取协议栈统计信息 - - ``` - OHOS # ifconfig -a - RX packets:6922 errors:0 ip dropped:4312 link dropped:67 overrun:0 bytes:0 (0.0 B) - RX packets(ip6):3 errors:0 dropped:0 overrun:0 bytes:0 (0.0 B) - TX packets:1394 errors:0 link dropped:67 overrun:0 bytes:0(0.0 B) - TX packets(ip6):3 errors:0 overrun:0 bytes:0(0.0 B) - ``` - - 输出的各参数说明如下表所示: - - **表 3** ifconfig -a 参数说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

说明

-

RX packets

-

IP层已接收的正常数据包的个数。

-

RX error

-

IP层已接收的错误数据包的个数,错误类型包括长度错误,校验错误,IP option错误,IP首部protocol错误等。

-

RX dropped

-

IP层已丢弃的数据包的个数,丢弃原因包括数据包错误,封包无法转发,本地网卡处于关闭状态等。

-

RX overrun

-

MAC层向上层协议栈投递封包失败的个数,失败原因主要是协议栈资源不足。

-

RX bytes

-

IP层已接收的正常数据包的总长度,不包括重组未完成的分片的长度。

-

TX packets

-

IP层已正常发送或转发的数据包的个数。

-

TX error

-

IP层发送失败的数据包的个数,失败原因包括封包无法路由,封包在协议栈内处理失败等。

-

TX dropped

-

MAC层由于发送失败而丢弃的数据包个数,失败原因包括网卡驱动处理封包失败等。

-

TX overrun

-

暂未使用。

-

TX bytes

-

IP层已正常发送或者转发的数据包的总长度。

-
- -3. 设置IPv6的地址信息 - - ``` - OHOS # ifconfig eth0 inet6 add 2001:a:b:c:d:e:f:d - OHOS # ifconfig - eth1 ip:192.168.3.60 netmask:255.255.255.0 gateway:0.0.0.0 - HWaddr 00:0e:c6:a8:5a:c2 MTU:1500 Running Link UP - eth0 ip:192.168.2.60 netmask:255.255.255.0 gateway:0.0.0.0 - ip6: 2001:A:B:C:D:E:F:D/64 - HWaddr 46:44:02:02:03:03 MTU:1500 Running Link UP - lo ip:127.0.0.1 netmask:255.0.0.0 gateway:127.0.0.1 - ip6: ::1/64 - HWaddr 00 MTU:16436 Running Link UP - ``` - -4. 删除IPv6的地址信息 - - ``` - OHOS # ifconfig eth0 inet6 del 2001:a:b:c:d:e:f:d - OHOS # ifconfig - eth1 ip:192.168.3.60 netmask:255.255.255.0 gateway:0.0.0.0 - HWaddr 00:0e:c6:a8:5a:c2 MTU:1500 Running Link UP - eth0 ip:192.168.2.60 netmask:255.255.255.0 gateway:0.0.0.0 - HWaddr 46:44:02:02:03:03 MTU:1500 Running Link UP - lo ip:127.0.0.1 netmask:255.0.0.0 gateway:127.0.0.1 - ip6: ::1/64 - HWaddr 00 MTU:16436 Running Link UP - ``` +## 使用实例 + +- ifconfig eth0 192.168.100.31 netmask 255.255.255.0 gateway 192.168.100.1 hw ether 00:49:cb:6c:a1:31 +- ifconfig -a +- ifconfig eth0 inet6 add 2001:a:b:c:d:e:f:d +- ifconfig eth0 inet6 del 2001:a:b:c:d:e:f:d + +## 输出说明 + +**示例 1** 设置网络参数 + +```shell +OHOS:/$ ifconfig eth0 192.168.100.31 netmask 255.255.255.0 gateway 192.168.100.1 hw ether 00:49:cb:6c:a1:31 +OHOS:/$ ifconfig +lo ip:127.0.0.1 netmask:255.0.0.0 gateway:127.0.0.1 + ip6: ::1/64 + HWaddr 00 MTU:0 Running Link UP +eth0 ip:192.168.100.31 netmask:255.255.255.0 gateway:192.168.100.1 + HWaddr 00:49:cb:6c:a1:31 MTU:1500 Running Default Link UP +``` + +输出的各参数说明如下表所示: + +**表 2** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

说明

+

ip

+

板子IP地址。

+

netmask

+

网络掩码。

+

gateway

+

网关。

+

HWaddr

+

板子硬件mac地址。

+

MTU

+

网络最大传输单元。

+

Running/Stop

+

网卡是否正在运行。

+

Default

+

有这项说明此网卡连接到默认网关。

+

Link UP/Down

+

网卡连接状态。

+
+ +**示例 2** 获取协议栈统计信息 + +```shell +OHOS # ifconfig -a +RX packets:6922 errors:0 ip dropped:4312 link dropped:67 overrun:0 bytes:0 (0.0 B) +RX packets(ip6):3 errors:0 dropped:0 overrun:0 bytes:0 (0.0 B) +TX packets:1394 errors:0 link dropped:67 overrun:0 bytes:0(0.0 B) +TX packets(ip6):3 errors:0 overrun:0 bytes:0(0.0 B) +``` + +输出的各参数说明如下表所示: + +**表 3** ifconfig -a 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

说明

+

RX packets

+

IP层已接收的正常数据包的个数。

+

RX error

+

IP层已接收的错误数据包的个数,错误类型包括长度错误,校验错误,IP option错误,IP首部protocol错误等。

+

RX dropped

+

IP层已丢弃的数据包的个数,丢弃原因包括数据包错误,封包无法转发,本地网卡处于关闭状态等。

+

RX overrun

+

MAC层向上层协议栈投递封包失败的个数,失败原因主要是协议栈资源不足。

+

RX bytes

+

IP层已接收的正常数据包的总长度,不包括重组未完成的分片的长度。

+

TX packets

+

IP层已正常发送或转发的数据包的个数。

+

TX error

+

IP层发送失败的数据包的个数,失败原因包括封包无法路由,封包在协议栈内处理失败等。

+

TX dropped

+

MAC层由于发送失败而丢弃的数据包个数,失败原因包括网卡驱动处理封包失败等。

+

TX overrun

+

暂未使用。

+

TX bytes

+

IP层已正常发送或者转发的数据包的总长度。

+
+**示例 3** 设置IPv6的地址信息 + +```shell +OHOS:/$ ifconfig eth0 inet6 add 2001:a:b:c:d:e:f:d +NetifStatusCallback(eth0): nsc event: 0x8 +NetifStatusCallback(eth0): nsc status changed: 0 +NetifStatusCallback(eth0): nsc event: 0x200 +NetifStatusCallback(eth0): nsc event: 0x8 +NetifStatusCallback(eth0): nsc status changed: 1 +NetifStatusCallback(eth0): nsc event: 0x200 +NetifStatusCallback(eth0): nsc event: 0x200 +OHOS:/$ ifconfig +lo ip:127.0.0.1 netmask:255.0.0.0 gateway:127.0.0.1 + ip6: ::1/64 + HWaddr 00 MTU:0 Running Link UP +eth0 ip:192.168.1.10 netmask:255.255.255.0 gateway:192.168.1.1 + ip6: 2001:A:B:C:D:E:F:D/64 + HWaddr 66:2f:e5:bd:24:e6 MTU:1500 Running Default Link UP +``` + +**示例 4** 删除IPv6的地址信息 + +```shell +OHOS:/$ ifconfig eth0 inet6 del 2001:a:b:c:d:e:f:d +NetifStatusCallback(eth0): nsc event: 0x200 +OHOS:/$ ifconfig +lo ip:127.0.0.1 netmask:255.0.0.0 gateway:127.0.0.1 + ip6: ::1/64 + HWaddr 00 MTU:0 Running Link UP +eth0 ip:192.168.1.10 netmask:255.255.255.0 gateway:192.168.1.1 + HWaddr 66:2f:e5:bd:24:e6 MTU:1500 Running Default Link UP +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/05.ipdebug.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/04.ipdebug.md" similarity index 93% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/05.ipdebug.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/04.ipdebug.md" index 80e59b1e80051193d3b08a71a0918b349a183658..26adc040c6169b36212a52da62acade1246a7d77 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/05.ipdebug.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/04.ipdebug.md" @@ -1,6 +1,6 @@ --- title: ipdebug -permalink: /pages/0002010400030204 +permalink: /pages/000400010400030203 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # ipdebug @@ -28,13 +28,13 @@ ipdebug ## 使用指南 -输入命令ipdebug。 +举例:输入命令ipdebug。 ## 输出说明 -ipdebug打印信息如下: +**示例** ipdebug打印信息如下: -``` +```shell OHOS # ipdebug ================= || Prefix List || diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/06.netstat.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/05.netstat.md" similarity index 79% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/06.netstat.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/05.netstat.md" index 4ad976718fcba0300710be6ecd9194f0a4f4a123..ad2c5ecf079da4ad4624c3c5711daf37f96357db 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/06.netstat.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/05.netstat.md" @@ -1,6 +1,6 @@ --- title: netstat -permalink: /pages/0002010400030205 +permalink: /pages/000400010400030204 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # netstat @@ -30,23 +30,37 @@ netstat ## 参数说明 -无 +无。 ## 使用指南 -直接输入命令。 +无。 ## 使用实例 举例:输入netstat -**图 1** netstat 打印信息 - - -![](/images/zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58-25.png) - ## 输出说明 +**示例** netstat 打印信息 + +```shell +OHOS # netstat +========== total sockets 128 ====== unused sockets 119 ========== +Proto Recv-Q Send-Q Local Address Foreign Address State +tcp 0 0 192.168.1.10:578 192.168.1.3:2049 ESTABLISHED +tcp 0 0 192.168.1.10:58653 0.0.0.0:0 LISTEN +tcp 0 0 192.168.1.10:58652 0.0.0.0:0 LISTEN +tcp 0 0 192.168.1.10:58651 0.0.0.0:0 LISTEN + +Proto Recv-Q Send-Q Local Address Foreign Address +udp 0 0 127.0.0.1:62177 127.0.0.1:62178 +udp 0 0 0.0.0.0:5684 0.0.0.0:0 +udp 0 0 127.0.0.1:62179 127.0.0.1:62180 +udp 0 0 127.0.0.1:62180 127.0.0.1:62179 +udp 0 0 127.0.0.1:62178 127.0.0.1:62177 +``` + **表 1** 输出说明 @@ -91,6 +105,5 @@ netstat ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >形如“========== total sockets 32 ====== unused sockets 22 BootTime 27 s ========== ”,表示一共32个套接字,未使用套接字22个,距系统启动已经过27秒。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/07.ntpdate.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/06.ntpdate.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/07.ntpdate.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/06.ntpdate.md" index 1eed8a80c4fc52a2c63d5507583fbecc35c9ceb3..0fc82d26538955c95cea2c707f1951bfe3e918e4 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/07.ntpdate.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/06.ntpdate.md" @@ -1,6 +1,6 @@ --- title: ntpdate -permalink: /pages/0002010400030206 +permalink: /pages/000400010400030205 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # ntpdate diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/08.ping.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/07.ping.md" similarity index 56% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/08.ping.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/07.ping.md" index 87f450230cc0a3e8424e82dc73d3b0ba0c6f0f0b..05db87eb5ddcb0a173b1363a239787275b6de319 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/08.ping.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/07.ping.md" @@ -1,6 +1,6 @@ --- title: ping -permalink: /pages/0002010400030207 +permalink: /pages/000400010400030206 navbar: true sidebar: true prev: true @@ -9,30 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # ping -- [命令功能](#section119672573385) -- [命令格式](#section869419010390) -- [参数说明](#section9877183173918) -- [使用指南](#section1097046193914) -- [使用实例](#section14564129113911) -- [输出说明](#section1621732891215) +- [命令功能](#section01) +- [命令格式](#section02) +- [参数说明](#section03) +- [使用指南](#section04) +- [使用实例](#section05) +- [输出说明](#section06) -## 命令功能 +## 命令功能 ping命令用于测试网络连接是否正常。 -## 命令格式 +## 命令格式 -ping_ _\[_-n cnt_\] \[_-w interval_\] \[_-l data\_len_\]_ _ +ping _\[-4\] \[-c cnt\] \[-f\] \[-i interval\] \[-q\] \[-s size\] _ -ping \[_-t_\] \[_-w interval_\] __ - -ping _-k_ - -## 参数说明 +## 参数说明 **表 1** 参数说明 @@ -45,66 +41,88 @@ ping _-k_ -

IP

+

--help

-

要测试是否网络连通的IPv4地址。

+

查看ping命令支持的参数列表

-

N/A

+

N/A

-

-n cnt

+

-4

+ +

强制以IPV4通讯协议ping目标地址。

-

执行的次数,不带本参数则默认为4次。

+

0-65500

+ + +

-c CNT

+ +

执行的次数,不带本参数则默认为3次。

1-65535

-

-w interval

+

-f

+ +

隐式的ping IPv4地址,其默认参数配置等价于"-c 15 -i 0.2"

+ +

N/A

+ + +

-i interval

发送两次ping包的时间间隔,单位毫秒。

-

>0

+

1-200

-

-l data_len

+

-q

-

ping包,即ICMP echo request报文的数据长度,不包含ICMP包头。

+

隐式的ping IPv4地址,如果主机还存活,则在返回 true 后停止ping。

-

0-65500

+

N/A

-

-t

+

-s SIZE

-

表示永久ping,直到使用ping -k杀死ping线程。

+

设置每个ping包的大小,SIZE是以字节为单位的数据(默认为56字节)。

-

N/A

+

0-4088

-

-k

+

IP

-

杀死ping线程,停止ping。

+

要测试是否网络连通的IPv4地址。

-

N/A

+

N/A

-## 使用指南 +## 使用指南 - ping命令用来测试到目的IP的网络连接是否正常,参数为目的IP地址。 - 如果目的IP不可达,会显示请求超时。 - 如果显示发送错误,说明没有到目的IP的路由。 - 命令需要启动TCP/IP协议栈后才能使用。 -## 使用实例 - -举例:输入ping 192.168.1.10 +## 使用实例 -## 输出说明 +举例:输入ping 192.168.1.3 -**图 1** ping tftp 服务器地址 +## 输出说明 +**示例** ping tftp 服务器地址 -![](/images/zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58-26.png) +```shell +OHOS:/$ ping 192.168.1.3 +Ping 192.168.1.3 (192.168.1.3): 56(84) bytes. +84 bytes from 192.168.1.3: icmp_seq=0 ttl=0 time=0 ms +84 bytes from 192.168.1.3: icmp_seq=0 ttl=0 time=1 ms +84 bytes from 192.168.1.3: icmp_seq=0 ttl=0 time=0 ms +--- 192.168.1.3 ping statistics --- +3 packets transmitted, 3 received, 0% packet loss +round-trip min/avg/max = 0/0/0 ms +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/09.ping6.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/08.ping6.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/09.ping6.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/08.ping6.md" index eb9819fae662f998422272336f13e859bdbc435e..d5649f637d0e8b415a2c63d30121561c51cf4cc2 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/09.ping6.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/08.ping6.md" @@ -1,6 +1,6 @@ --- title: ping6 -permalink: /pages/0002010400030208 +permalink: /pages/000400010400030207 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # ping6 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/10.telnet.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/09.telnet.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/10.telnet.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/09.telnet.md" index d3e562bca362d91edb44cf8e9328bf69bbd220c6..66efdc7a80732231265d2d227653eda38421b3ac 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/10.telnet.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/09.telnet.md" @@ -1,6 +1,6 @@ --- title: telnet -permalink: /pages/0002010400030209 +permalink: /pages/000400010400030208 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # telnet @@ -63,7 +63,7 @@ telnet \[_on | off_\] - telnet启动要确保网络驱动及网络协议栈已经初始化完成,且板子的网卡是link up状态。 - 暂时无法支持多个客户端(telnet + IP)同时连接开发板。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** + >![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >telnet属于调测功能,默认配置为关闭,正式产品中禁止使用该功能。 @@ -73,6 +73,10 @@ telnet \[_on | off_\] ## 输出说明 -**图 1** 输入 telnet on -![](/images/zh-cn/device-dev/kernel/figure/输入-telnet-on.png "输入-telnet-on") +**示例** 输入 telnet on + +```shell +OHOS # telnet on +OHOS # start telnet server successfully, waiting for connection. +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/11.tftp.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/10.tftp.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/11.tftp.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/10.tftp.md" index 0fca3611f2cc758c2b3952c569634549c3cf5064..f3ff3663b7f35aaf414ead41628365c4a22fa214 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/11.tftp.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/04.Shell\345\221\275\344\273\244\344\275\277\347\224\250\350\257\246\350\247\243/03.\347\275\221\347\273\234\345\221\275\344\273\244/10.tftp.md" @@ -1,6 +1,6 @@ --- title: tftp -permalink: /pages/000201040003020a +permalink: /pages/000400010400030209 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # tftp @@ -81,7 +81,7 @@ tftp命令可以从TFTP服务器上下载文件。 2. OpenHarmony单板使用tftp命令上传、下载文件。 3. 传输的文件大小是有限制的不能大于32M。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** + >![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >tftp属于调测功能,默认配置为关闭,正式产品中禁止使用该功能。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/05.\351\255\224\346\263\225\351\224\256\344\275\277\347\224\250\346\226\271\346\263\225.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/05.\351\255\224\346\263\225\351\224\256\344\275\277\347\224\250\346\226\271\346\263\225.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/05.\351\255\224\346\263\225\351\224\256\344\275\277\347\224\250\346\226\271\346\263\225.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/05.\351\255\224\346\263\225\351\224\256\344\275\277\347\224\250\346\226\271\346\263\225.md" index 074a90299945815e68fe3159ea8bda65fcfae79a..8427601d2dca1b5738897230ac4d824393bff1e0 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/05.\351\255\224\346\263\225\351\224\256\344\275\277\347\224\250\346\226\271\346\263\225.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/05.\351\255\224\346\263\225\351\224\256\344\275\277\347\224\250\346\226\271\346\263\225.md" @@ -1,6 +1,6 @@ --- title: 魔法键使用方法 -permalink: /pages/000201040004 +permalink: /pages/00040001040004 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 魔法键使用方法 @@ -30,7 +30,7 @@ date: 2021-12-30 12:57:43 Debug ---\> Enable MAGIC KEY;若关闭该选项,则魔法键失效。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >1. 可以在menuconfig中,将光标移动到LOSCFG\_ENABLE\_MAGICKEY上,输入“?”,查看帮助信息。 2. 输入“ctrl + r”键,打开魔法键检测功能。 @@ -46,6 +46,6 @@ Debug ---\> Enable MAGIC KEY;若关闭该选项,则魔法键失效。 - ctrl + e:系统进行简单完整性内存池检查,检查出错会输出相关错误信息,检查正常会输出“system memcheck over, all passed!”。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >魔法键检测功能打开情况下,如果需要通过UART或者USB转虚拟串口输入特殊字符需避免与魔法键值重复,否则魔法键会被误触发,而原有设计功能可能出现错误。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/06.\347\224\250\346\210\267\346\200\201\345\274\202\345\270\270\344\277\241\346\201\257\350\257\264\346\230\216.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/06.\347\224\250\346\210\267\346\200\201\345\274\202\345\270\270\344\277\241\346\201\257\350\257\264\346\230\216.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/06.\347\224\250\346\210\267\346\200\201\345\274\202\345\270\270\344\277\241\346\201\257\350\257\264\346\230\216.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/06.\347\224\250\346\210\267\346\200\201\345\274\202\345\270\270\344\277\241\346\201\257\350\257\264\346\230\216.md" index 337553654bf8c76d065c07259045b25cfd1fb8e3..e24a2d250cdc437f1cbcdcc4330c7a77f24b1197 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/06.\347\224\250\346\210\267\346\200\201\345\274\202\345\270\270\344\277\241\346\201\257\350\257\264\346\230\216.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/01.Shell/06.\347\224\250\346\210\267\346\200\201\345\274\202\345\270\270\344\277\241\346\201\257\350\257\264\346\230\216.md" @@ -1,6 +1,6 @@ --- title: 用户态异常信息说明 -permalink: /pages/000201040005 +permalink: /pages/00040001040005 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 用户态异常信息说明 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/02.Trace.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/02.Trace.md" new file mode 100644 index 0000000000000000000000000000000000000000..52515e9f594c72ca6b9e36da14ad09084aab925b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/02.Trace.md" @@ -0,0 +1,526 @@ +--- +title: Trace +permalink: /pages/000400010401 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# Trace调测 + +- [基本概念](#section1) + +- [运行机制](#section2) + +- [接口说明](#section3) + + - [内核态](#section3.1) + + - [用户态](#section3.2) + +- [开发指导](#section4) + + - [内核态开发流程](#section4.1.1) + + - [内核态编程实例](#section4.1.2) + + - [内核态实例代码](#section4.1.3) + + - [内核态结果验证](#section4.1.4) + + - [用户态开发流程](#section4.2.1) + + - [用户态编程实例](#section4.2.2) + + - [用户态实例代码](#section4.2.3) + + - [用户态结果验证](#section4.2.4) + +## 基本概念 +Trace调测旨在帮助开发者获取内核的运行流程,各个模块、任务的执行顺序,从而可以辅助开发者定位一些时序问题或者了解内核的代码运行过程。 + +## 运行机制 +内核提供一套Hook框架,将Hook点预埋在各个模块的主要流程中, 在内核启动初期完成Trace功能的初始化,并注册Trace的处理函数到Hook中。 + +当系统触发到一个Hook点时,Trace模块会对输入信息进行封装,添加Trace帧头信息,包含事件类型、运行的cpuid、运行的任务id、运行的相对时间戳等信息; + +Trace提供2种工作模式,离线模式和在线模式。 + +离线模式会将trace frame记录到预先申请好的循环buffer中。如果循环buffer记录的frame过多则可能出现翻转,会覆盖之前的记录,故保持记录的信息始终是最新的信息。Trace循环buffer的数据可以通过shell命令导出进行详细分析,导出信息已按照时间戳信息完成排序。 + +![](/images/device-dev/kernel/figure/zh-cn_image_0000001127390512.png) + +在线模式需要配合IDE使用,实时将trace frame记录发送给IDE,IDE端进行解析并可视化展示。 + +## 接口说明 + +### 内核态 + +OpenHarmony LiteOS-A内核的Trace模块提供下面几种功能,接口详细信息可以查看[API](https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/include/los_trace.h)参考。 + +**表 1** Trace模块接口说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名

+

描述

+

启停控制

+

LOS_TraceStart

+

启动Trace

+

LOS_TraceStop

+

停止Trace

+

操作Trace记录的数据

+

LOS_TraceRecordDump

+

输出Trace缓冲区数据

+

LOS_TraceRecordGet

+

获取Trace缓冲区的首地址

+

LOS_TraceReset

+

清除Trace缓冲区中的事件

+

过滤Trace记录的数据

+

LOS_TraceEventMaskSet

+

设置事件掩码,仅记录某些模块的事件

+

屏蔽某些中断号事件

+

LOS_TraceHwiFilterHookReg

+

注册过滤特定中断号事件的钩子函数

+

插桩函数

+

LOS_TRACE_EASY

+

简易插桩

+

LOS_TRACE

+

标准插桩

+
+ + +1. 当用户需要针对自定义事件进行追踪时,可按规则在目标源代码中进行插桩,系统提供如下2种插桩接口: + ++ LOS_TRACE_EASY(TYPE, IDENTITY, params...) 简易插桩。 + + - 一句话插桩,用户在目标源代码中插入该接口即可。 + + - TYPE有效取值范围为[0, 0xF],表示不同的事件类型,不同取值表示的含义由用户自定义。 + + - IDENTITY类型UINTPTR,表示事件操作的主体对象。 + + - Params类型UINTPTR,表示事件的参数。 + + - 示例: + + ``` + 假设需要新增对文件(fd1、fd2)读写操作的简易插桩, + 自定义读操作为type:1, 写操作为type:2,则 + 在读fd1文件的适当位置插入: + LOS_TRACE_EASY(1, fd1, flag, size); + 在读fd2文件的适当位置插入: + LOS_TRACE_EASY(1, fd2, flag, size); + 在写fd1文件的适当位置插入: + LOS_TRACE_EASY(2, fd1, flag, size); + 在写fd2文件的适当位置插入: + LOS_TRACE_EASY(2, fd2,flag, size); + ``` + ++ LOS_TRACE(TYPE, IDENTITY, params...) 标准插桩。 + + - 相比简易插桩,支持动态过滤事件和参数裁剪,但使用上需要用户按规则来扩展。 + + - TYPE用于设置具体的事件类型,可以在头文件los_trace.h中的enum LOS_TRACE_TYPE中自定义事件类型。定义方法和规则可以参考其他事件类型。 + + - IDENTITY和Params的类型及含义同简易插桩。 + + - 示例: +``` + 1.在enum LOS_TRACE_MASK中定义事件掩码,即模块级别的事件类型。 + 定义规范为TRACE_#MOD#_FLAG,#MOD#表示模块名,例如: + TRACE_FS_FLAG = 0x4000 + 2.在enum LOS_TRACE_TYPE中定义具体事件类型。定义规范为#TYPE# = TRACE_#MOD#_FLAG | NUMBER,例如: + FS_READ = TRACE_FS_FLAG | 0; // 读文件 + FS_WRITE = TRACE_FS_FLAG | 1; // 写文件 + 3.定义事件参数。定义规范为#TYPE#_PARAMS(IDENTITY, parma1...) IDENTITY, ... + 其中的#TYPE#就是上面2中的#TYPE#,例如: + #define FS_READ_PARAMS(fp, fd, flag, size) fp, fd, flag, size + 宏定义的参数对应于Trace缓冲区中记录的事件参数,用户可对任意参数字段进行裁剪: + 当定义为空时,表示不追踪该类型事件: + #define FS_READ_PARAMS(fp, fd, flag, size) // 不追踪文件读事件 + 4.在适当位置插入代码桩。定义规范为LOS_TRACE(#TYPE#, #TYPE#_PARAMS(IDENTITY, parma1...)) + LOS_TRACE(FS_READ, fp, fd, flag, size); // 读文件的代码桩, + #TYPE#之后的入参就是上面3中的FS_READ_PARAMS函数的入参 +``` +2. 预置的Trace事件及参数均可以通过上述方式进行裁剪,参数详见kernel\include\los_trace.h。 + +3. Trace Mask事件过滤接口LOS_TraceEventMaskSet(UINT32 mask),其入参mask仅高28位生效(对应LOS_TRACE_MASK中某模块的使能位),仅用于模块的过滤,暂不支持针对某个特定事件的细粒度过滤。例如:LOS_TraceEventMaskSet(0x202),则实际设置生效的mask为0x200(TRACE_QUE_FLAG),QUE模块的所有事件均会被采集。一般建议使用的方法为: + LOS_TraceEventMaskSet(TRACE_EVENT_FLAG | TRACE_MUX_FLAG | TRACE_SEM_FLAG | TRACE_QUE_FLAG); + +4. 如果仅需要过滤简易插桩事件,通过设置Trace Mask为TRACE_MAX_FLAG即可。 + +5. Trace缓冲区有限,事件写满之后会覆盖写,用户可通过LOS_TraceRecordDump中打印的CurEvtIndex识别最新记录。 + +6. Trace的典型操作流程为:LOS_TraceStart、 LOS_TraceStop、 LOS_TraceRecordDump. + +7. 针对中断事件的Trace, 提供中断号过滤,用于解决某些场景下特定中断号频繁触发导致其他事件被覆盖的情况,用户可自定义中断过滤的规则, + + 示例如下: +``` +BOOL Example_HwiNumFilter(UINT32 hwiNum) +{ + if ((hwiNum == TIMER_INT) || (hwiNum == DMA_INT)) { + return TRUE; + } + return FALSE; +} +LOS_TraceHwiFilterHookReg(Example_HwiNumFilter); +``` +则当中断号为TIMER_INT 或者DMA_INT时,不记录中断事件。 + +### 用户态 + +新增trace字符设备,位于"/dev/trace",通过对设备节点的read\write\ioctl,实现用户态trace的读写和控制: + +- read: 用户态读取Trace记录数据 + +- write: 用户态事件写入 + +- ioctl: 用户态Trace控制操作,包括 +```C +#define TRACE_IOC_MAGIC 'T' +#define TRACE_START _IO(TRACE_IOC_MAGIC, 1) +#define TRACE_STOP _IO(TRACE_IOC_MAGIC, 2) +#define TRACE_RESET _IO(TRACE_IOC_MAGIC, 3) +#define TRACE_DUMP _IO(TRACE_IOC_MAGIC, 4) +#define TRACE_SET_MASK _IO(TRACE_IOC_MAGIC, 5) +``` +分别对应Trace启动(LOS_TraceStart)、停止(LOS_TraceStop)、清除记录(LOS_TraceReset)、dump记录(LOS_TraceRecordDump)、设置事件过滤掩码(LOS_TraceEventMaskSet) + +具体的使用方法参见[用户态编程实例](#section4.2.2) + + + +## 开发指导 + +### 内核态开发流程 + +开启Trace调测的典型流程如下: + +1. 配置Trace模块相关宏。 + +配置Trace控制宏LOSCFG_KERNEL_TRACE,默认关,在kernel/liteos_a目录下执行 make update_config命令配置"Kernel->Enable Hook Feature->Enable Trace Feature"中打开: + +| 配置项 | menuconfig选项 | 含义 | 设置值 | +| ------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------ | +| LOSCFG_KERNEL_TRACE | Enable Trace Feature | Trace模块的裁剪开关 | YES/NO | +| LOSCFG_RECORDER_MODE_OFFLINE | Trace work mode ->Offline mode | Trace工作模式为离线模式 | YES/NO | +| LOSCFG_RECORDER_MODE_ONLINE | Trace work mode ->Online mode | Trace工作模式为在线模式 | YES/NO | +| LOSCFG_TRACE_CLIENT_INTERACT | Enable Trace Client Visualization and Control | 使能与Trace IDE (dev tools)的交互,包括数据可视化和流程控制 | YES/NO | +| LOSCFG_TRACE_FRAME_CORE_MSG | Enable Record more extended content ->Record cpuid, hardware interrupt status, task lock status | 记录CPUID、中断状态、锁任务状态 | YES/NO | +| LOSCFG_TRACE_FRAME_EVENT_COUNT | Enable Record more extended content ->Record event count, which indicate the sequence of happened events | 记录事件的次序编号 | YES/NO | +| LOSCFG_TRACE_FRAME_MAX_PARAMS | Record max params | 配置记录事件的最大参数个数 | INT | +| LOSCFG_TRACE_BUFFER_SIZE | Trace record buffer size | 配置Trace的缓冲区大小 | INT | + +2. (可选)预置事件参数和事件桩(或使用系统默认的事件参数配置和事件桩)。 + +3. (可选)调用LOS_TraceStop停止Trace后,清除缓冲区LOS_TraceReset(系统默认已启动trace)。 + +4. (可选)调用LOS_TraceEventMaskSet设置需要追踪的事件掩码(系统默认的事件掩码仅使能中断与任务事件),事件掩码参见los_trace.h 中的LOS_TRACE_MASK定义。 + +5. 在需要记录事件的代码起始点调用LOS_TraceStart。 + +6. 在需要记录事件的代码结束点调用LOS_TraceStop。 + +7. 调用LOS_TraceRecordDump输出缓冲区数据(函数的入参为布尔型,FALSE表示格式化输出,TRUE表示输出到Trace IDE)。 + + +上述第3-7步中的接口,均封装有对应的shell命令,开启shell后可执行相应的命令,对应关系如下: + +- LOS_TraceReset —— trace_reset + +- LOS_TraceEventMaskSet —— trace_mask + +- LOS_TraceStart —— trace_start + +- LOS_TraceStop —— trace_stop + +- LOS_TraceRecordDump —— trace_dump + +### 内核态编程实例 + + 本实例实现如下功能: + + 1. 创建一个用于Trace测试的任务。 + + 2. 设置事件掩码。 + + 3. 启动trace。 + + 4. 停止trace。 + + 5. 格式化输出trace数据。 + +### 内核态示例代码 + +实例代码如下: + +```C +#include "los_trace.h" +UINT32 g_traceTestTaskId; +VOID Example_Trace(VOID) +{ + UINT32 ret; + LOS_TaskDelay(10); + /* 开启trace */ + ret = LOS_TraceStart(); + if (ret != LOS_OK) { + dprintf("trace start error\n"); + return; + } + /* 触发任务切换的事件 */ + LOS_TaskDelay(1); + LOS_TaskDelay(1); + LOS_TaskDelay(1); + /* 停止trace */ + LOS_TraceStop(); + LOS_TraceRecordDump(FALSE); +} + +UINT32 Example_Trace_test(VOID){ + UINT32 ret; + TSK_INIT_PARAM_S traceTestTask; + /* 创建用于trace测试的任务 */ + memset(&traceTestTask, 0, sizeof(TSK_INIT_PARAM_S)); + traceTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Trace; + traceTestTask.pcName = "TestTraceTsk"; /* 测试任务名称 */ + traceTestTask.uwStackSize = 0x800; + traceTestTask.usTaskPrio = 5; + traceTestTask.uwResved = LOS_TASK_STATUS_DETACHED; + ret = LOS_TaskCreate(&g_traceTestTaskId, &traceTestTask); + if(ret != LOS_OK){ + dprintf("TraceTestTask create failed .\n"); + return LOS_NOK; + } + /* 系统默认情况下已启动trace, 因此可先关闭trace后清除缓存区后,再重启trace */ + LOS_TraceStop(); + LOS_TraceReset(); + /* 开启任务模块事件记录 */ + LOS_TraceEventMaskSet(TRACE_TASK_FLAG); + return LOS_OK; +} +LOS_MODULE_INIT(Example_Trace_test, LOS_INIT_LEVEL_KMOD_EXTENDED); +``` + +### 内核态结果验证 + +输出结果如下: + +```c +*******TraceInfo begin******* +clockFreq = 50000000 +CurEvtIndex = 7 +Index Time(cycles) EventType CurTask Identity params +0 0x366d5e88 0x45 0x1 0x0 0x1f 0x4 0x0 +1 0x366d74ae 0x45 0x0 0x1 0x0 0x8 0x1f +2 0x36940da6 0x45 0x1 0xc 0x1f 0x4 0x9 +3 0x3694337c 0x45 0xc 0x1 0x9 0x8 0x1f +4 0x36eea56e 0x45 0x1 0xc 0x1f 0x4 0x9 +5 0x36eec810 0x45 0xc 0x1 0x9 0x8 0x1f +6 0x3706f804 0x45 0x1 0x0 0x1f 0x4 0x0 +7 0x37070e59 0x45 0x0 0x1 0x0 0x8 0x1f +*******TraceInfo end******* +``` + +输出的事件信息包括:发生时间、事件类型、事件发生在哪个任务中、事件操作的主体对象、事件的其他参数。 + +- EventType:表示的具体事件可查阅头文件los_trace.h中的enum LOS_TRACE_TYPE。 + +- CurrentTask:表示当前运行在哪个任务中,值为taskid。 + +- Identity:表示事件操作的主体对象,可查阅头文件los_trace.h中的#TYPE#_PARAMS。 + +- params:表示的事件参数可查阅头文件los_trace.h中的#TYPE#_PARAMS。 + +下面以序号为0的输出项为例,进行说明。 + +``` +Index Time(cycles) EventType CurTask Identity params +0 0x366d5e88 0x45 0x1 0x0 0x1f 0x4 +``` + +- Time cycles可换算成时间,换算公式为cycles/clockFreq,单位为s。 + +- 0x45为TASK_SWITCH即任务切换事件,当前运行的任务taskid为0x1。 + +- Identity和params的含义需要查看TASK_SWITCH_PARAMS宏定义: + +```c +#define TASK_SWITCH_PARAMS(taskId, oldPriority, oldTaskStatus, newPriority, newTaskStatus) \ +taskId, oldPriority, oldTaskStatus, newPriority, newTaskStatus +``` + +因为#TYPE#_PARAMS(IDENTITY, parma1...) IDENTITY, ...,所以Identity为taskId(0x0),第一个参数为oldPriority(0x1f) + +> ![](/images/device-dev/public_sys-resources/icon-note.gif)**说明** + + > params的个数由menuconfig中Enable Trace Feature --> Record max params配置,默认为3,超出的参数不会被记录,用户应自行合理配置该值。 + + 综上所述,任务由0x1切换到0x0,0x1任务的优先级为0x1f,状态为0x4,0x0任务的优先级为0x0。 + +### 用户态开发流程 +通过在menuconfig配置"Driver->Enable TRACE DRIVER",开启Trace驱动。该配置仅在内核Enable Trace Feature后,才可在Driver的选项中可见。 +1. 打开“/dev/trace”字符文件,进行读写和IOCTL操作; +2. 系统提供用户态的trace命令,该命令位于/bin目录下,cd bin 后可执行如下命令: +- ./trace reset 清除Trace记录 + +- ./trace mask num 设置Trace事件过滤掩码 + +- ./trace start 启动Trace + +- ./trace stop 停止Trace + +- ./trace dump 0/1 格式化输出Trace记录 + +- ./trace read nBytes 读取Trace记录 + +- ./trace write type id params... 写用户态事件 + 如:./trace write 0x1 0x1001 0x2 0x3 则写入一条用户态事件,其事件类型为0x1, id为0x1001,参数有2个,分别是0x2和0x3. + + 用户态命令行的典型使用方法如下: + + ./trace start + + ./trace write 0x1 0x1001 0x2 0x3 + + ./trace stop + + ./trace dump 0 + +### 用户态编程实例 + + 本实例实现如下功能: + + 1. 打开trace字符设备。 + + 2. 设置事件掩码。 + + 3. 启动trace。 + + 4. 写trace事件。 + + 5. 停止trace。 + + 6. 格式化输出trace数据。 + +### 用户态示例代码 +实例代码如下 +```c +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TRACE_IOC_MAGIC 'T' +#define TRACE_START _IO(TRACE_IOC_MAGIC, 1) +#define TRACE_STOP _IO(TRACE_IOC_MAGIC, 2) +#define TRACE_RESET _IO(TRACE_IOC_MAGIC, 3) +#define TRACE_DUMP _IO(TRACE_IOC_MAGIC, 4) +#define TRACE_SET_MASK _IO(TRACE_IOC_MAGIC, 5) +#define TRACE_USR_MAX_PARAMS 3 + +typedef struct { + unsigned int eventType; + uintptr_t identity; + uintptr_t params[TRACE_USR_MAX_PARAMS]; +} UsrEventInfo; + +int main(int argc, char **argv) +{ + size_t mask; + + int fd = open("/dev/trace", O_RDWR); + if (fd == -1) { + printf("Trace open failed.\n"); + exit(EXIT_FAILURE); + } + + ioctl(fd, TRACE_STOP, NULL); + ioctl(fd, TRACE_RESET, NULL); /* clear all events */ + + mask = 0x10000; /* filter kernel events */ + ioctl(fd, TRACE_SET_MASK, mask); + + ioctl(fd, TRACE_START, NULL); /* start trace */ + sleep(1); + + UsrEventInfo info = { + .eventType = 0x1, + .identity = 0x0001, + .params = {1, 2, 3}, + }; + (void)write(fd, &info, sizeof(UsrEventInfo)); + + info.eventType = 0x2; + info.identity = 0x0002; + (void)write(fd, &info, sizeof(UsrEventInfo)); + + ioctl(fd, TRACE_STOP, NULL); + ioctl(fd, TRACE_DUMP, 0); + + close(fd); + return 0; +} +``` +### 用户态结果验证 +输出结果如下: + +```c +*******TraceInfo begin******* +clockFreq = 50000000 +CurEvtIndex = 2 +Index Time(cycles) EventType CurTask Identity params +0 0x366d5e88 0xfffffff1 0x1 0x1 0x1 0x2 0x3 +1 0x366d74ae 0xfffffff2 0x1 0x2 0x1 0x2 0x3 +*******TraceInfo end******* +``` +示例代码中调用了2次write,对应产生2条Trace记录; +用户层事件的EventType高28位固定均为1(即0xfffffff0),仅低4位表示具体的事件类型。 \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/03.Perf\350\260\203\346\265\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/03.Perf\350\260\203\346\265\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..039816172cefbe019b3afb4447a07ab846df761c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/03.Perf\350\260\203\346\265\213.md" @@ -0,0 +1,519 @@ +--- +title: Perf调测 +permalink: /pages/000400010402 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# Perf调测 + +- [基本概念](#section1) + +- [运行机制](#section2) + +- [接口说明](#section3) + + - [内核态](#section3.1) + + - [用户态](#section3.2) + +- [开发指导](#section4) + + - [内核态开发流程](#section4.1.1) + + - [内核态编程实例](#section4.1.2) + + - [内核态实例代码](#section4.1.3) + + - [内核态结果验证](#section4.1.4) + + - [用户态开发流程](#section4.2.1) + + - [用户态编程实例](#section4.2.2) + + - [用户态实例代码](#section4.2.3) + + - [用户态结果验证](#section4.2.4) + +## 基本概念 +Perf为性能分析工具,依赖PMU(Performance Monitoring Unit)对采样事件进行计数和上下文采集,统计出热点分布(hot spot)和热路径(hot path)。 + +## 运行机制 +基于事件采样原理,以性能事件为基础,当事件发生时,相应的事件计数器溢出发生中断,在中断处理函数中记录事件信息,包括当前的pc、当前运行的任务ID以及调用栈等信息。 + +Perf提供2种工作模式,计数模式和采样模式。 + +计数模式仅统计事件发生的次数和耗时,采样模式会收集上下文数据到环形buffer中,需要IDE进行数据解析生成热点函数与热点路径。 + +## 接口说明 + +### 内核态 + +OpenHarmony LiteOS-A内核的Perf模块提供下面几种功能,接口详细信息可以查看[API](https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/include/los_perf.h)参考。 + +**表 1** Perf模块接口说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名

+

描述

+

开启/停止Perf采样

+

LOS_PerfStart

+

开启采样

+

LOS_PerfStop

+

停止采样

+

配置Perf采样事件

+

LOS_PerfConfig

+

配置采样事件的类型、周期等

+

读取采样数据

+

LOS_PerfDataRead

+

读取采样数据到指定地址

+

注册采样数据缓冲区的钩子函数

+

LOS_PerfNotifyHookReg

+

注册缓冲区水线到达的处理钩子

+

LOS_PerfFlushHookReg

+

注册缓冲区刷cache的钩子

+
+ +1. Perf采样事件的结构体为PerfConfigAttr,详细字段含义及取值详见kernel\include\los_perf.h。 + +2. 采样数据缓冲区为环形buffer,buffer中读过的区域可以覆盖写,未被读过的区域不能被覆盖写。 + +3. 缓冲区有限,用户可通过注册水线到达的钩子进行buffer溢出提醒或buffer读操作。默认水线值为buffer总大小的1/2。 + 示例如下: + ```c + VOID Example_PerfNotifyHook(VOID) + { + CHAR buf[LOSCFG_PERF_BUFFER_SIZE] = {0}; + UINT32 len; + PRINT_DEBUG("perf buffer reach the waterline!\n"); + len = LOS_PerfDataRead(buf, LOSCFG_PERF_BUFFER_SIZE); + OsPrintBuff(buf, len); /* print data */ + } + LOS_PerfNotifyHookReg(Example_PerfNotifyHook); + ``` + +4. 若perf采样的buffer涉及到cpu 跨cache,则用户可通过注册刷cache的钩子,进行cache同步。 + 示例如下: + ```c + VOID Example_PerfFlushHook(VOID *addr, UINT32 size) + { + OsCacheFlush(addr, size); /* platform interface */ + } + LOS_PerfNotifyHookReg(Example_PerfFlushHook); + ``` + 刷cache接口视具体的平台自行配置。 + +### 用户态 + +新增perf字符设备,位于"/dev/perf",通过对设备节点的read\write\ioctl,实现用户态perf的读写和控制: + +- read: 用户态读取perf记录数据 + +- write: 用户态采样事件配置 + +- ioctl: 用户态Perf控制操作,包括 + ```C + #define PERF_IOC_MAGIC 'T' + #define PERF_START _IO(PERF_IOC_MAGIC, 1) + #define PERF_STOP _IO(PERF_IOC_MAGIC, 2) + ``` + 分别对应Perf启动(LOS_PerfStart)、停止(LOS_PerfStop) + +具体的使用方法参见[用户态编程实例](#section4.2.2) + + + +## 开发指导 + +### 内核态开发流程 + +开启Perf调测的典型流程如下: + +1. 配置Perf模块相关宏。 + + 配置Perf控制宏LOSCFG_KERNEL_PERF,默认关,在kernel/liteos_a目录下执行 make update_config命令配置"Kernel->Enable Perf Feature"中打开: + + | 配置项 | menuconfig选项 | 含义 | 设置值 | + | ------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------ | + | LOSCFG_KERNEL_PERF | Enable Perf Feature | Perf模块的裁剪开关 | YES/NO | + | LOSCFG_PERF_CALC_TIME_BY_TICK | Time-consuming Calc Methods->By Tick | Perf计时单位为tick | YES/NO | + | LOSCFG_PERF_CALC_TIME_BY_CYCLE | Time-consuming Calc Methods->By Cpu Cycle | Perf计时单位为cycle | YES/NO | + | LOSCFG_PERF_BUFFER_SIZE | Perf Sampling Buffer Size | Perf采样buffer的大小 | INT | + | LOSCFG_PERF_HW_PMU | Enable Hardware Pmu Events for Sampling | 使能硬件PMU事件,需要目标平台支持硬件PMU | YES/NO | + | LOSCFG_PERF_TIMED_PMU | Enable Hrtimer Period Events for Sampling | 使能高精度周期事件,需要目标平台支持高精度定时器 | YES/NO | + | LOSCFG_PERF_SW_PMU | Enable Software Events for Sampling | 使能软件事件,需要开启LOSCFG_KERNEL_HOOK | INT | + +2. 调用LOS_PerfConfig配置需要采样的事件。 + + Perf提供2种模式的配置,及3大类型的事件配置: + + 2种模式:计数模式(仅统计事件发生次数)、采样模式(收集上下文如任务ID、pc、backtrace等)。 + + 3种事件类型:CPU硬件事件(cycle、branch、icache、dcache等)、高精度周期事件(cpu clock)、OS软件事件(task switch、mux pend、irq等)。 + +3. 在需要采样的代码起始点调用LOS_PerfStart(UINT32 sectionId), 入参sectionId标记不同的采样回话id。 + +4. 在需要采样的代码结束点调用LOS_PerfStop。 + +5. 调用输出缓冲区数据的接口LOS_PerfDataRead读取采样数据,并使用IDE工具进行解析。 + + +### 内核态编程实例 + + 本实例实现如下功能: + + 1. 创建perf测试任务。 + + 2. 配置采样事件。 + + 3. 启动perf。 + + 4. 执行需要统计的算法。 + + 5. 停止perf。 + + 6. 输出统计结果。 + +### 内核态示例代码 + +前提条件:在menuconfig菜单中完成perf模块的配置。 + +实例代码如下: + +```C +#include "los_perf.h" +STATIC VOID OsPrintBuff(const CHAR *buf, UINT32 num) +{ + UINT32 i = 0; + PRINTK("num: "); + for (i = 0; i < num; i++) { + PRINTK(" %02d", i); + } + PRINTK("\n"); + PRINTK("hex: "); + for (i = 0; i < num; i++) { + PRINTK(" %02x", buf[i]); + } + PRINTK("\n"); +} + +STATIC VOID perfTestHwEvent(VOID) +{ + UINT32 ret; + CHAR *buf = NULL; + UINT32 len; + + PerfConfigAttr attr = { + .eventsCfg = { + .type = PERF_EVENT_TYPE_HW, + .events = { + [0] = {PERF_COUNT_HW_CPU_CYCLES, 0xFFFF}, + [1] = {PERF_COUNT_HW_BRANCH_INSTRUCTIONS, 0xFFFFFF00}, + }, + .eventsNr = 2, + .predivided = 1, /* cycle counter increase every 64 cycles */ + }, + .taskIds = {0}, + .taskIdsNr = 0, + .needSample = 0, + .sampleType = PERF_RECORD_IP | PERF_RECORD_CALLCHAIN, + }; + + ret = LOS_PerfConfig(&attr); + if (ret != LOS_OK) { + PRINT_ERR("perf config error %u\n", ret); + return; + } + + PRINTK("------count mode------\n"); + LOS_PerfStart(0); + test(); /* this is any test function*/ + LOS_PerfStop(); + + PRINTK("--------sample mode------ \n"); + attr.needSample = 1; + LOS_PerfConfig(&attr); + LOS_PerfStart(2); + test(); /* this is any test function*/ + LOS_PerfStop(); + + buf = LOS_MemAlloc(m_aucSysMem1, LOSCFG_PERF_BUFFER_SIZE); + if (buf == NULL) { + PRINT_ERR("buffer alloc failed\n"); + return; + } + + /* get sample data */ + len = LOS_PerfDataRead(buf, LOSCFG_PERF_BUFFER_SIZE); + OsPrintBuff(buf, len); /* print data */ + + (VOID)LOS_MemFree(m_aucSysMem1, buf); +} + +UINT32 Example_Perf_test(VOID){ + UINT32 ret; + TSK_INIT_PARAM_S perfTestTask; + /* 创建用于perf测试的任务 */ + memset(&perfTestTask, 0, sizeof(TSK_INIT_PARAM_S)); + perfTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)perfTestHwEvent; + perfTestTask.pcName = "TestPerfTsk"; /* 测试任务名称 */ + perfTestTask.uwStackSize = 0x800; + perfTestTask.usTaskPrio = 5; + perfTestTask.uwResved = LOS_TASK_STATUS_DETACHED; + ret = LOS_TaskCreate(&g_perfTestTaskId, &perfTestTask); + if(ret != LOS_OK){ + PRINT_ERR("PerfTestTask create failed.\n"); + return LOS_NOK; + } + return LOS_OK; +} +LOS_MODULE_INIT(perfTestHwEvent, LOS_INIT_LEVEL_KMOD_EXTENDED); +``` + +### 内核态结果验证 + +输出结果如下: + +```c +--------count mode---------- +[EMG] [cycles] eventType: 0xff: 5466989440 +[EMG] [branches] eventType: 0xc: 602166445 +------- sample mode---------- +[EMG] dump section data, addr: 0x8000000 length: 0x800000 +num: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 ... +hex: 00 ef ef ef 00 00 00 00 14 00 00 00 60 00 00 00 00 00 00 00 70 88 36 40 08 00 00 00 6b 65 72 6e 65 6c 00 00 01 00 00 00 cc 55 30 40 08 00 00 00 6b 65 72 6e 65 6c 00 00 +``` + +- 针对计数模式,系统在perf stop后会打印: + + 事件名称(cycles)、事件类型(0xff)、事件发生的次数(5466989440)。 + + 当采样事件为硬件PMU事件时,打印的事件类型为实际的硬件事件id,非enum PmuHWId中定义的抽象类型。 + +- 针对采样模式,系统在perf stop后会打印采样数据的地址和长度: + + dump section data, addr: (0x8000000) length: (0x5000) + + 用户可以通过JTAG口导出该片内存,再使用IDE线下工具解析。 + + 或者通过LOS_PerfDataRead将数据读到指定地址,进行查看或进一步处理。示例中OsPrintBuff为测试接口,其按字节打印Read到的采样数据,num表示第几个字节,hex表示该字节中的数值。 + +### 用户态开发流程 +通过在menuconfig配置"Driver->Enable PERF DRIVER",开启Perf驱动。该配置仅在内核Enable Perf Feature后,才可在Driver的选项中可见。 +1. 打开“/dev/perf”字符文件,进行读写和IOCTL操作; +2. 系统提供用户态的perf命令,该命令位于/bin目录下,cd bin 后可执行如下命令: +- ./perf start [id] 启动perf采样, id 为可选项,默认值为0 + +- ./perf stop 停止perf采样 + +- ./perf read \ 从采样缓冲区中读取nBytes数据并打印内容 + +- ./perf list 罗列-e支持的具体事件 + +- ./perf stat/record [option] \ 计数/采样模式命令 + +option可选如下: + +- -e,配置采样事件。可使用./perf list 中罗列的同类型事件。 + +- -p,配置事件采样周期。 + +- -o, 指定perf采样数据结果保存的文件路径。 + +- -t,任务Id过滤(白名单),只采取指定任务中的上下文。如果不指定改参数,则默认采集所有的任务。 + +- -s, 配置采样的具体上下文类型,可查阅los_perf.h中定义的PerfSampleType。 + +- -P, 进程Id过滤(白名单),只采取指定进程中的上下文。如果不指定改参数,则默认采集所有进程。 + +- -d, 是否进行分频(事件每发生64次累计+1),该选项仅在硬件cycle事件上生效。 + +command 为待统计的子程序。 + +用户态命令行的典型使用方法如下: + +./perf list 查看可使用的事件列表, 输出如下: + +```c +cycles [Hardware event] +instruction [Hardware event] +dcache [Hardware event] +dcache-miss [Hardware event] +icache [Hardware event] +icache-miss [Hardware event] +branch [Hardware event] +branch-miss [Hardware event] +clock [Timed event] +task-switch [Software event] +irq-in [Software event] +mem-alloc [Software event] +mux-pend [Software event] +``` +./perf stat -e cycles os_dump, 输出如下: + +```c +type: 0 +events[0]: 255, 0xffff +predivided: 0 +sampleType: 0x0 +needSample: 0 +usage os_dump [--help | -l | SERVICE] + --help: shows this help + -l: only list services, do not dump them + SERVICE: dumps only service SERVICE +time used: 0.058000(s) +[cycles] eventType: 0xff [core 0]: 21720647 +[cycles] eventType: 0xff [core 1]: 13583830 +``` + +./perf record -e cycles os_dump, 输出如下: + +```c +type: 0 +events[0]: 255, 0xffff +predivided: 0 +sampleType: 0x60 +needSample: 1 +usage os_dump [--help | -l | SERVICE] + --help: shows this help + -l: only list services, do not dump them + SERVICE: dumps only service SERVICE +dump perf data, addr: 0x408643d8 length: 0x5000 +time used: 0.059000(s) +save perf data success at /storage/data/perf.data +``` +> ![](/images/device-dev/public_sys-resources/icon-note.gif)**说明** + + > 在进行./perf stat/record命令后,用户可多次执行./perf start 和 ./perf stop进行采样, 采样的事件配置为最近一次执行./perf stat/record 中设置的参数。 + +### 用户态编程实例 + + 本实例实现如下功能: + + 1. 打开perf字符设备。 + + 4. 写perf配置事件。 + + 3. 启动perf。 + + 5. 停止perf。 + + 6. 读取perf采样数据。 + +### 用户态示例代码 +实例代码如下 +```c +#include "fcntl.h" +#include "user_copy.h" +#include "sys/ioctl.h" +#include "fs/driver.h" +#include "los_dev_perf.h" +#include "los_perf.h" +#include "los_init.h" + +/* perf ioctl */ +#define PERF_IOC_MAGIC 'T' +#define PERF_START _IO(PERF_IOC_MAGIC, 1) +#define PERF_STOP _IO(PERF_IOC_MAGIC, 2) + +int main(int argc, char **argv) +{ + char *buf = NULL; + ssize_t len; + + int fd = open("/dev/perf", O_RDWR); + if (fd == -1) { + printf("Perf open failed.\n"); + exit(EXIT_FAILURE); + } + + PerfConfigAttr attr = { + .eventsCfg = { +#ifdef LOSCFG_PERF_HW_PMU + .type = PERF_EVENT_TYPE_HW, + .events = { + [0] = {PERF_COUNT_HW_CPU_CYCLES, 0xFFFF}, + }, +#elif defined LOSCFG_PERF_TIMED_PMU + .type = PERF_EVENT_TYPE_TIMED, + .events = { + [0] = {PERF_COUNT_CPU_CLOCK, 100}, + }, +#elif defined LOSCFG_PERF_SW_PMU + .type = PERF_EVENT_TYPE_SW, + .events = { + [0] = {PERF_COUNT_SW_TASK_SWITCH, 1}, + }, +#endif + .eventsNr = 1, /* 1 event */ + .predivided = 0, + }, + .taskIds = {0}, + .taskIdsNr = 0, + .processIds = {0}, + .processIdsNr = 0, + .needSample = 1, + .sampleType = PERF_RECORD_IP | PERF_RECORD_CALLCHAIN, + }; + (void)write(fd, &attr, sizeof(PerfConfigAttr)); /* perf config */ + + ioctl(fd, PERF_START, NULL); /* perf start */ + test(); + ioctl(fd, PERF_STOP, NULL); /* perf stop */ + + buf = (char *)malloc(LOSCFG_PERF_BUFFER_SIZE); + if (buf == NULL) { + printf("no memory for read perf 0x%x\n", LOSCFG_PERF_BUFFER_SIZE); + return -1; + } + + len = read(fd, buf, LOSCFG_PERF_BUFFER_SIZE); + OsPrintBuff(buf, len); /* print data */ + + free(buf); + close(fd); + return 0; +} +``` +### 用户态结果验证 +输出结果如下: + +```c +[EMG] dump section data, addr: 0x8000000 length: 0x800000 +num: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 ... +hex: 00 ef ef ef 00 00 00 00 14 00 00 00 60 00 00 00 00 00 00 00 70 88 36 40 08 00 00 00 6b 65 72 6e 65 6c 00 00 01 00 00 00 cc 55 30 40 08 00 00 00 6b 65 72 6e 65 6c 00 00 +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.LMS\350\260\203\346\265\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.LMS\350\260\203\346\265\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..8377f4970626a398ea875e8d4da6a6eea077a55f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.LMS\350\260\203\346\265\213.md" @@ -0,0 +1,490 @@ +--- +title: LMS调测 +permalink: /pages/000400010403 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# LMS调测 + +- [基本概念](#section1) + +- [运行机制](#section2) + +- [接口说明](#section3) + + - [内核态](#section3.1) + + - [用户态](#section3.2) + +- [开发指导](#section4) + + - [内核态开发流程](#section4.1.1) + + - [内核态编程实例](#section4.1.2) + + - [内核态实例代码](#section4.1.3) + + - [内核态结果验证](#section4.1.4) + + - [用户态开发流程](#section4.2.1) + + - [用户态编程实例](#section4.2.2) + + - [用户态实例代码](#section4.2.3) + + - [用户态结果验证](#section4.2.4) + +## 基本概念 +LMS全称为Lite Memory Sanitizer,是一种实时检测内存操作合法性的调测工具。LMS能够实时检测缓冲区溢出(buffer overflow),释放后使用(use after free) 和重复释放(double Free), 在异常发生的第一时间通知操作系统,结合backtrace等定位手段,能准确定位到产生内存问题的代码行,极大提升内存问题定位效率。 + +## 运行机制 +LMS使用影子内存映射标记系统内存的状态,一共可标记为三个状态:可读写,不可读写,已释放。影子内存存放在内存池的尾部。 + +- 内存从堆上申请后,会将数据区的影子内存设置为“可读写”状态,并将头结点区的影子内存设置为“不可读写”状态。 + +- 内存在堆上被释放时,会将被释放内存的影子内存设置为“已释放”状态。 + +- 编译代码时,会在代码中的读写指令前插入检测函数,对地址的合法性进行检验。主要是检测访问内存的影子内存的状态值,若检测到影子内存为不可读写,则会报溢出错误;若检测到影子内存为已释放,则会报释放后使用错误。 + +- 在内存释放时,会检测被释放地址的影子内存状态值,若检测到影子内存非可读写,则会报重复释放错误。 + +## 接口说明 + +### 内核态 + +OpenHarmony LiteOS-A内核的LMS模块提供下面几种功能,接口详细信息可以查看[API](https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/include/los_lms.h)参考。 + + +1. 支持多内存池检测; + +2. 支持LOS_MemAlloc、LOS_MemAllocAlign、LOS_MemRealloc申请出的内存检测; + +3. 支持安全函数的访问检测(默认开启); + +4. 支持libc 高频函数的访问检测,包括:memset、memcpy、memmove、strcat、strcpy、strncat、strncpy。 + +5. 可动态设置的功能如下: + +**表 1** LMS模块接口说明 + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名

+

描述

+

添加指定内存池被检测

+

LOS_LmsCheckPoolAdd

+

将指定内存池的地址范围添加到LMS的内存检测链表上,当访问的地址在链表范围内时,LMS才进行合法性校验;且LOS_MemInit接口会调用该接口,默认将初始化的内存池挂入到检测链表中。

+

删除指定内存池不被检测

+

LOS_LmsCheckPoolDel

+

不检测指定内存池地址范围内的合法性校验。

+

使能指定内存段锁保护

+

LOS_LmsAddrProtect

+

为某段内存地址上锁,设置为不可读写,一旦访问则报错。

+

去能指定内存段锁保护

+

LOS_LmsAddrDisableProtect

+

为某段内存地址解锁,设置为可读写。

+
+ + +### 用户态 + +用户态仅提供LMS检测库,不提供对外接口。 + +## 开发指导 + +### 内核态开发流程 + +开启LMS调测的典型流程如下: + +1. 配置LMS模块相关宏。 + + 配置LMS控制宏LOSCFG_KERNEL_LMS,默认关,在kernel/liteos_a目录下执行 make update_config命令配置"Kernel->Enable Lite Memory Sanitizer"中打开: + + | 配置项 | menuconfig选项 | 含义 | 设置值 | + | ------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------ | + | LOSCFG_KERNEL_LMS | Enable Lms Feature | Lms模块的裁剪开关 | YES/NO | + | LOSCFG_LMS_MAX_RECORD_POOL_NUM | Lms check pool max num | LMS支持的检测内存池最大个数 | INT | + | LOSCFG_LMS_LOAD_CHECK | Enable lms read check | LMS内存读检测的裁剪开关 | YES/NO | + | LOSCFG_LMS_STORE_CHECK | Enable lms write check | LMS内存写检测的裁剪开关 | YES/NO | + | LOSCFG_LMS_CHECK_STRICT | Enable lms strict check, byte-by-byte | LMS内存逐字节严格检测的裁剪开关 | YES/NO | + +2. 在被检测模块的编译脚本中,增加LMS检测编译选项-fsanitize=kernel-address。 + +3. 为避免编译器优化,增加-O0编译选项。 + +4. gcc与clang编译选项存在差异,参照如下示例: + + ``` + if ("$ohos_build_compiler_specified" == "gcc") { + cflags_c = [ + "-O0", + "-fsanitize=kernel-address", + ] + } else { + cflags_c = [ + "-O0", + "-fsanitize=kernel-address", + "-mllvm", + "-asan-instrumentation-with-call-threshold=0", + "-mllvm", + "-asan-stack=0", + "-mllvm", + "-asan-globals=0", + ] + } + ``` + +5. 重新编译,查看串口输出。如果检测到内存问题,会输出检测结果。 + +### 内核态编程实例 + + 本实例实现如下功能: + + 1. 创建一个用于Lms测试的任务。 + + 2. 构造内存溢出错误和释放后使用错误。 + + 3. 添加-fsanitize=kernel-address后编译执行,观察输出结果 + +### 内核态示例代码 + +实例代码如下: + +```C +#define PAGE_SIZE (0x1000U) +#define INDEX_MAX 20 + +UINT32 g_lmsTestTaskId; +char g_testLmsPool[2 * PAGE_SIZE]; + +STATIC VOID testPoolInit(void) +{ + UINT32 ret = LOS_MemInit(g_testLmsPool, 2 * PAGE_SIZE); + if (ret != 0) { + PRINT_ERR("%s failed, ret = 0x%x\n", __FUNCTION__, ret); + return; + } +} + +static VOID LmsTestOsmallocOverflow(VOID) +{ + PRINTK("\n######%s start ######\n", __FUNCTION__); + UINT32 i; + CHAR *str = (CHAR *)LOS_MemAlloc(g_testLmsPool, INDEX_MAX); + PRINTK("str[%2d]=0x%2x ", INDEX_MAX, str[INDEX_MAX]); /* trigger heap overflow at str[INDEX_MAX] */ + PRINTK("\n######%s stop ######\n", __FUNCTION__); +} + +static VOID LmsTestUseAfterFree(VOID) +{ + PRINTK("\n######%s start ######\n", __FUNCTION__); + UINT32 i; + CHAR *str = (CHAR *)LOS_MemAlloc(g_testLmsPool, INDEX_MAX); + LOS_MemFree(g_testLmsPool, str); + PRINTK("str[%2d]=0x%2x ", 0, str[0]); /* trigger use after free at str[0] */ + PRINTK("\n######%s stop ######\n", __FUNCTION__); +} + +VOID LmsTestCaseTask(VOID) +{ + testPoolInit(); + LmsTestOsmallocOverflow(); + LmsTestUseAfterFree(); +} + +UINT32 Example_Lms_test(VOID){ + UINT32 ret; + TSK_INIT_PARAM_S lmsTestTask; + /* 创建用于lms测试的任务 */ + memset(&lmsTestTask, 0, sizeof(TSK_INIT_PARAM_S)); + lmsTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)LmsTestCaseTask; + lmsTestTask.pcName = "TestLmsTsk"; /* 测试任务名称 */ + lmsTestTask.uwStackSize = 0x800; + lmsTestTask.usTaskPrio = 5; + lmsTestTask.uwResved = LOS_TASK_STATUS_DETACHED; + ret = LOS_TaskCreate(&g_lmsTestTaskId, &lmsTestTask); + if(ret != LOS_OK){ + PRINT_ERR("LmsTestTask create failed .\n"); + return LOS_NOK; + } + return LOS_OK; +} +LOS_MODULE_INIT(Example_Lms_test, LOS_INIT_LEVEL_KMOD_EXTENDED); +``` + +### 内核态结果验证 + +输出结果如下: + +```c +######LmsTestOsmallocOverflow start ###### +[ERR][KProcess:LmsTestCaseTask]***** Kernel Address Sanitizer Error Detected Start ***** +[ERR][KProcess:LmsTestCaseTask]Heap buffer overflow error detected +[ERR][KProcess:LmsTestCaseTask]Illegal READ address at: [0x4157a3c8] +[ERR][KProcess:LmsTestCaseTask]Shadow memory address: [0x4157be3c : 4] Shadow memory value: [2] +OsBackTrace fp = 0x402c0f88 +runTask->taskName = LmsTestCaseTask +runTask->taskID = 2 +*******backtrace begin******* +traceback fp fixed, trace using fp = 0x402c0fd0 +traceback 0 -- lr = 0x400655a4 fp = 0x402c0ff8 +traceback 1 -- lr = 0x40065754 fp = 0x402c1010 +traceback 2 -- lr = 0x40044bd0 fp = 0x402c1038 +traceback 3 -- lr = 0x40004e14 fp = 0xcacacaca + +[LMS] Dump info around address [0x4157a3c8]: + + [0x4157a3a0]: 00 00 00 00 00 00 00 00 | [0x4157be3a | 0]: 1 1 + [0x4157a3a8]: ba dc cd ab 00 00 00 00 | [0x4157be3a | 4]: 2 2 + [0x4157a3b0]: 20 00 00 80 00 00 00 00 | [0x4157be3b | 0]: 2 0 + [0x4157a3b8]: 00 00 00 00 00 00 00 00 | [0x4157be3b | 4]: 0 0 + [0x4157a3c0]: 00 00 00 00 00 00 00 00 | [0x4157be3c | 0]: 0 0 + [0x4157a3c8]: [ba] dc cd ab a8 a3 57 41 | [0x4157be3c | 4]: [2] 2 + [0x4157a3d0]: 2c 1a 00 00 00 00 00 00 | [0x4157be3d | 0]: 2 3 + [0x4157a3d8]: 00 00 00 00 00 00 00 00 | [0x4157be3d | 4]: 3 3 + [0x4157a3e0]: 00 00 00 00 00 00 00 00 | [0x4157be3e | 0]: 3 3 + [0x4157a3e8]: 00 00 00 00 00 00 00 00 | [0x4157be3e | 4]: 3 3 + [0x4157a3f0]: 00 00 00 00 00 00 00 00 | [0x4157be3f | 0]: 3 3 +[ERR][KProcess:LmsTestCaseTask]***** Kernel Address Sanitizer Error Detected End ***** +str[20]=0xffffffba +######LmsTestOsmallocOverflow stop ###### + +###### LmsTestUseAfterFree start ###### +[ERR][KProcess:LmsTestCaseTask]***** Kernel Address Sanitizer Error Detected Start ***** +[ERR][KProcess:LmsTestCaseTask]Use after free error detected +[ERR][KProcess:LmsTestCaseTask]Illegal READ address at: [0x4157a3d4] +[ERR][KProcess:LmsTestCaseTask]Shadow memory address: [0x4157be3d : 2] Shadow memory value: [3] +OsBackTrace fp = 0x402c0f90 +runTask->taskName = LmsTestCaseTask +runTask->taskID = 2 +*******backtrace begin******* +traceback fp fixed, trace using fp = 0x402c0fd8 +traceback 0 -- lr = 0x40065680 fp = 0x402c0ff8 +traceback 1 -- lr = 0x40065758 fp = 0x402c1010 +traceback 2 -- lr = 0x40044bd0 fp = 0x402c1038 +traceback 3 -- lr = 0x40004e14 fp = 0xcacacaca + +[LMS] Dump info around address [0x4157a3d4]: + + [0x4157a3a8]: ba dc cd ab 00 00 00 00 | [0x4157be3a | 4]: 2 2 + [0x4157a3b0]: 20 00 00 80 00 00 00 00 | [0x4157be3b | 0]: 2 0 + [0x4157a3b8]: 00 00 00 00 00 00 00 00 | [0x4157be3b | 4]: 0 0 + [0x4157a3c0]: 00 00 00 00 00 00 00 00 | [0x4157be3c | 0]: 0 0 + [0x4157a3c8]: ba dc cd ab a8 a3 57 41 | [0x4157be3c | 4]: 2 2 + [0x4157a3d0]: 2c 1a 00 00 [00] 00 00 00 | [0x4157be3d | 0]: 2 [3] + [0x4157a3d8]: 00 00 00 00 00 00 00 00 | [0x4157be3d | 4]: 3 3 + [0x4157a3e0]: 00 00 00 00 00 00 00 00 | [0x4157be3e | 0]: 3 3 + [0x4157a3e8]: ba dc cd ab c8 a3 57 41 | [0x4157be3e | 4]: 2 2 + [0x4157a3f0]: 0c 1a 00 00 00 00 00 00 | [0x4157be3f | 0]: 2 3 + [0x4157a3f8]: 00 00 00 00 00 00 00 00 | [0x4157be3f | 4]: 3 3 +[ERR][KProcess:LmsTestCaseTask]***** Kernel Address Sanitizer Error Detected End ***** +str[ 0]=0x 0 +######LmsTestUseAfterFree stop ###### +``` +输出的关键信息包括: +- 错误类型: + - Heap buffer overflow堆内存越界 + - Use after free 释放后使用 +- 错误操作: + - Illegal Read非法读 + - Illegal Write非法写 + - Illegal Double free重复释放 +- 上下文: + - 当前任务信息(taskName, taskId) + - 回溯栈(backtrace) +- 出错地址的内存信息: + - 内存的值、及对应影子内存的值 + - 内存地址:内存值| [影子内存地址 | 影子内存字节内偏移]:影子内存值 + - 影子内存值:0(可读可写)、3(已释放)、2(红区)、1(填充值)。 + + +### 用户态开发流程 +在待检测的app编译脚本中,添加如下参数即可, 完整示例可参见/kernel/liteos_a/apps/lms/BUILD.gn +``` +if ("$ohos_build_compiler_specified" == "gcc") { + cflags_c = [ + "-O0", + "-fsanitize=kernel-address", + "-funwind-tables", + "-fasynchronous-unwind-tables", + ] + } else { + cflags_c = [ + "-O0", + "-fsanitize=kernel-address", + "-mllvm", + "-asan-instrumentation-with-call-threshold=0", + "-mllvm", + "-asan-stack=0", + "-mllvm", + "-asan-globals=0", + "-funwind-tables", + "-fasynchronous-unwind-tables", + ] + } + ldflags = [ + "-rdynamic", + "-lunwind", + "-lusrlms", + "-Wl,--wrap=realloc", + "-Wl,--wrap=calloc", + "-Wl,--wrap=malloc", + "-Wl,--wrap=free", + "-Wl,--wrap=valloc", + "-Wl,--wrap=aligned_alloc", + "-Wl,--wrap=memset", + "-Wl,--wrap=memcpy", + "-Wl,--wrap=memmove", + "-Wl,--wrap=strcpy", + "-Wl,--wrap=strcat", + ] + deps = [ "//kernel/liteos_a/kernel/extended/lms/usr:usrlmslib" ] + ``` + +### 用户态编程实例 + + 本实例实现如下功能: + + 1. 构造内存溢出错误和释放后使用错误。 + + 2. 添加对应编译选项后,重新编译执行 + +### 用户态示例代码 +实例代码如下 +```c +static void BufWriteTest(void *buf, int start, int end) +{ + for (int i = start; i <= end; i++) { + ((char *)buf)[i] = 'a'; + } +} + +static void BufReadTest(void *buf, int start, int end) +{ + char tmp; + for (int i = start; i <= end; i++) { + tmp = ((char *)buf)[i]; + } +} + +static void LmsMallocTest(void) +{ + printf("\n-------- LmsMallocTest Start --------\n"); + char *buf = (char *)malloc(16); + BufReadTest(buf, -1, 16); + free(buf); + printf("\n-------- LmsMallocTest End --------\n"); +} + +static void LmsFreeTest(void) +{ + printf("\n-------- LmsFreeTest Start --------\n"); + char *buf = (char *)malloc(16); + free(buf); + BufReadTest(buf, 1, 1); + free(buf); + printf("\n-------- LmsFreeTest End --------\n"); +} + +int main(int argc, char * const * argv) +{ + printf("\n############### Lms Test start ###############\n"); + char *tmp = (char *)malloc(5000); + LmsMallocTest(); + LmsFreeTest(); + printf("\n############### Lms Test End ###############\n"); +} +``` +### 用户态结果验证 +输出结果如下: + +```c +***** Lite Memory Sanitizer Error Detected ***** +Heap buffer overflow error detected! +Illegal READ address at: [0x1f8b3edf] +Shadow memory address: [0x3d34d3ed : 6] Shadow memory value: [2] + +Accessable heap addr 0 +Heap red zone 2 +Heap freed buffer 3 + +Dump info around address [0x1f8b3edf]: + + [0x1f8b3eb8]: 74 55 8b 1f 74 55 8b 1f | [0x3d34d3eb | 4]: 0 0 + [0x1f8b3ec0]: f8 9c 8b 1f 00 00 00 00 | [0x3d34d3ec | 0]: 0 0 + [0x1f8b3ec8]: 00 00 00 00 9c fc fc fc | [0x3d34d3ec | 4]: 0 0 + [0x1f8b3ed0]: 21 00 00 00 41 00 00 00 | [0x3d34d3ed | 0]: 0 0 + [0x1f8b3ed8]: 60 55 8b 1f 60 55 8b [1f]| [0x3d34d3ed | 4]: 2 [2] + [0x1f8b3ee0]: 50 4e 0b 00 00 00 00 00 | [0x3d34d3ee | 0]: 0 0 + [0x1f8b3ee8]: 09 00 00 00 00 00 00 00 | [0x3d34d3ee | 4]: 0 0 + [0x1f8b3ef0]: 00 00 00 00 08 03 09 00 | [0x3d34d3ef | 0]: 2 2 + [0x1f8b3ef8]: 00 00 00 00 00 00 00 00 | [0x3d34d3ef | 4]: 2 2 +***** Lite Memory Sanitizer Error Detected End ***** + +Backtrace() returned 5 addresses + #01: [0x4d6c] -> ./sample_usr_lms + #02: <(null)+0x2004074>[0x4074] -> ./sample_usr_lms + #03: <(null)+0x2003714>[0x3714] -> ./sample_usr_lms + #04: [0x363c] -> ./sample_usr_lms + #05: <(null)+0x1f856f30>[0x56f30] -> /lib/libc.so +-------- LMS_malloc_test End -------- + +***** Lite Memory Sanitizer Error Detected ***** +Use after free error detected! +Illegal Double free address at: [0x1f8b3ee0] +Shadow memory address: [0x3d34d3ee : 0] Shadow memory value: [3] + +Accessable heap addr 0 +Heap red zone 2 +Heap freed buffer 3 + + +Dump info around address [0x1f8b3ee0]: + + [0x1f8b3ec0]: f8 9c 8b 1f 00 00 00 00 | [0x3d34d3ec | 0]: 0 0 + [0x1f8b3ec8]: 00 00 00 00 fc fd fc fc | [0x3d34d3ec | 4]: 0 0 + [0x1f8b3ed0]: 21 00 00 00 20 01 00 00 | [0x3d34d3ed | 0]: 0 0 + [0x1f8b3ed8]: 60 55 8b 1f 60 55 8b 1f | [0x3d34d3ed | 4]: 2 2 + [0x1f8b3ee0]: [20] 60 9a 1f 40 61 9a 1f | [0x3d34d3ee | 0]: [3] 3 + [0x1f8b3ee8]: 60 62 9a 1f 80 63 9a 1f | [0x3d34d3ee | 4]: 3 3 + [0x1f8b3ef0]: 20 40 8b 1f 20 20 8b 1f | [0x3d34d3ef | 0]: 3 3 + [0x1f8b3ef8]: 00 00 00 00 00 00 00 00 | [0x3d34d3ef | 4]: 3 3 + [0x1f8b3f00]: 00 00 00 00 00 00 00 00 | [0x3d34d3f0 | 0]: 3 3 +***** Lite Memory Sanitizer Error Detected End ***** + +Backtrace() returned 5 addresses + #01: [0x4d6c] -> ./sample_usr_lms + #02: [0x5548] -> ./sample_usr_lms + #03: <(null)+0x2003fc4>[0x3fc4] -> ./sample_usr_lms + #04: [0x3664] -> ./sample_usr_lms + #05: <(null)+0x1f856f30>[0x56f30] -> /lib/libc.so + +-------- LMS_free_test End -------- +``` +输出的Backtrace中包含地址所在的文件名,用户需查找对应文件中地址对应的代码行号。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/03.\350\277\233\347\250\213\350\260\203\346\265\213-CPU\345\215\240\347\224\250\347\216\207.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/05.\350\277\233\347\250\213\350\260\203\346\265\213/01.CPU\345\215\240\347\224\250\347\216\207.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/03.\350\277\233\347\250\213\350\260\203\346\265\213-CPU\345\215\240\347\224\250\347\216\207.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/05.\350\277\233\347\250\213\350\260\203\346\265\213/01.CPU\345\215\240\347\224\250\347\216\207.md" index b6b2f54cc3c8a1e76e8df55978caab2863ba25cd..ff2e413b8e74c175f9e78ab4b06cc9bff4672b2c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/03.\350\277\233\347\250\213\350\260\203\346\265\213-CPU\345\215\240\347\224\250\347\216\207.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/05.\350\277\233\347\250\213\350\260\203\346\265\213/01.CPU\345\215\240\347\224\250\347\216\207.md" @@ -1,6 +1,6 @@ --- -title: 进程调测-CPU占用率 -permalink: /pages/0002010402 +title: CPU占用率 +permalink: /pages/00040001040400 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # CPU占用率 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/06.\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/06.\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" index bb24d9a5296c527c7ed40081c5fa2ed9e8ebf69f..70ab4ede8c09ce6027e11e76f7cf2e15a864f1de 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/06.\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\206\205\345\255\230\344\277\241\346\201\257\347\273\237\350\256\241.md" @@ -1,6 +1,6 @@ --- title: 内存信息统计 -permalink: /pages/000201040300 +permalink: /pages/00040001040500 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 内存信息统计 @@ -61,7 +61,7 @@ typedef struct { 本实例实现如下功能: -1. 创建一个监控线程,用于获取内存池的信息; +1. 创建一个监控任务,用于获取内存池的信息; 2. 调用LOS\_MemInfoGet接口,获取内存池的基础信息; 3. 利用公式算出使用率及碎片率。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.\345\206\205\345\255\230\350\260\203\346\265\213/02.\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/06.\345\206\205\345\255\230\350\260\203\346\265\213/02.\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.\345\206\205\345\255\230\350\260\203\346\265\213/02.\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/06.\345\206\205\345\255\230\350\260\203\346\265\213/02.\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" index e23236590ab79e38baac03579f159e3220952e4b..598af4654c0ecf9f1120f927e4d13ca1e17ee616 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.\345\206\205\345\255\230\350\260\203\346\265\213/02.\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/06.\345\206\205\345\255\230\350\260\203\346\265\213/02.\345\206\205\345\255\230\346\263\204\346\274\217\346\243\200\346\265\213.md" @@ -1,6 +1,6 @@ --- title: 内存泄漏检测 -permalink: /pages/000201040301 +permalink: /pages/00040001040501 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 内存泄漏检测 @@ -54,7 +54,7 @@ node size LR[0] LR[1] LR[2] 0x100179cc: 0x5c 0x9b02c24e 0x9b02c246 0x9b008ef0 ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >开启内存检测会影响内存申请的性能,且每个内存节点都会记录LR地址,内存开销也加大。 ### 编程实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.\345\206\205\345\255\230\350\260\203\346\265\213/03.\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/06.\345\206\205\345\255\230\350\260\203\346\265\213/03.\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.\345\206\205\345\255\230\350\260\203\346\265\213/03.\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/06.\345\206\205\345\255\230\350\260\203\346\265\213/03.\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" index 3181733c85ba2c9577d12100228875ad172452b7..1cbbfb962412553cdbeaade76ed24b370f9a3f99 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/04.\345\206\205\345\255\230\350\260\203\346\265\213/03.\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/06.\345\206\205\345\255\230\350\260\203\346\265\213/03.\350\270\251\345\206\205\345\255\230\346\243\200\346\265\213.md" @@ -1,6 +1,6 @@ --- title: 踩内存检测 -permalink: /pages/000201040302 +permalink: /pages/00040001040502 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 踩内存检测 @@ -34,7 +34,7 @@ LOSCFG\_BASE\_MEM\_NODE\_INTEGRITY\_CHECK:开关宏,默认关闭;若打开 由于该功能只会检测出哪个内存节点被破坏了,并给出前节点信息(因为内存分布是连续的,当前节点最有可能被前节点破坏)。如果要进一步确认前节点在哪里申请的,需开启内存泄漏检测功能,通过LR记录,辅助定位。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >开启该功能,节点头多了魔鬼数字字段,会增大节点头大小。由于实时检测完整性,故性能影响较大;若性能敏感的场景,可以不开启该功能,使用LOS\_MemIntegrityCheck接口检测。 ## 开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" new file mode 100644 index 0000000000000000000000000000000000000000..c651d5cbbfe838ed7dda5ba386e97ecb1c89116d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -0,0 +1,19 @@ +--- +title: 基本概念 +permalink: /pages/00040001040600 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# 基本概念 + +Debug版本的musl-libc库为用户提供内存泄漏检测、堆内存统计、踩内存分析以及backtrace功能等维测手段,可以提高用户态内存相关问题的定位效率。 + +采用了对malloc/free接口进行插桩,保存关键节点信息,然后程序在申请和释放内存时进行内存节点完整性校验,最后在程序结束时通过统计节点信息得到内存统计信息并根据统计信息判断内存是否泄漏的设计思想。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/02.\350\277\220\350\241\214\346\234\272\345\210\266.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/02.\350\277\220\350\241\214\346\234\272\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..e0045d417c3044ff58f7812d03e9e83179d17cd2 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/02.\350\277\220\350\241\214\346\234\272\345\210\266.md" @@ -0,0 +1,71 @@ +--- +title: 运行机制 +permalink: /pages/00040001040601 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# 运行机制 + +- [内存泄漏检查](#section142061581018) +- [堆内存统计](#section136902041337) +- [内存完整性检查](#section196491231761) + +## 内存泄漏检查 + +对于每个进程,内存调测模块维护了128个链表(当前系统的线程最大数量为128个),每个链表的索引为线程ID。 + +申请内存时:保存关键信息到内存节点控制块,根据当前线程ID将内存节点控制块挂到对应链表; + +释放内存时:根据需要释放的内存地址匹配内存节点控制块并将该控制块删除。 + +**图 1** 堆内存节点信息链表 +![](/images/device-dev/kernel/figure/堆内存节点信息链表.png "堆内存节点信息链表") + +申请内存时,返回地址会被保存到LR寄存器中。进程运行过程中,系统会在内存节点控制块中添加疑似泄漏点对应的lr等信息。如下图所示: + +**图 2** 堆内存节点信息 +![](/images/device-dev/kernel/figure/堆内存节点信息.png "堆内存节点信息") + +其中,TID表示线程ID;PID表示进程ID;ptr表示申请的内存地址;size表示申请的内存大小;lr\[n\]表示函数调用栈地址,变量n可以根据具体场景的需要进行配置。 + +释放内存时,将free等接口的入参指针与node的ptr字段进行匹配,如果相同则删除该内存节点控制块信息。 + +用户通过串口或文件等方式,将各个进程内存调测信息导出,利用addr2line工具将导出的信息转换成导致内存泄漏的代码行,便可以解决内存泄露问题。 + +**图 3** 泄漏点代码行定位流程 +![](/images/device-dev/kernel/figure/泄漏点代码行定位流程.png "泄漏点代码行定位流程") + +## 堆内存统计 + +用户态线程堆内存使用统计具有一定的实际意义,统计线程申请的堆内存占比,为用户程序的内存使用优化提供数据支持。用户态堆内存统计模块主要涉及的接口为malloc和free。如[图1](#fig4294145810543),每个进程维护128个链表,链表索引即线程ID,申请内存时系统将ptr和size信息记录在内存节点控制块中并将节点控制块挂在以线程ID为头信息的链表上,堆内存释放时根据ptr从对应的链表上移除相应的堆内存块信息;同时计算出当前线程所持有的堆内存总的使用量,并更新当前进程的堆内存使用量和堆内存使用峰值。 + +## 内存完整性检查 + +- 使用malloc申请内存(小于等于0x1c000bytes时通过堆分配算法分配) + + 用户程序申请堆内存时,在堆内存节点处添加校验值等信息,如果校验值异常,则很有可能是前一块堆内存使用越界导致的(目前无法识别校验值被野指针破坏的场景)。在内存申请、释放时校验内存节点校验值的正确性,若内存节点被破坏,校验失败时则输出tid、pid及当前被踩节点前一块堆内存申请时保存的调用栈信息,通过addr2line工具可获得具体的代码行信息,辅助用户解决问题。 + + **图 4** node节点头信息添加校验值 + ![](/images/device-dev/kernel/figure/node节点头信息添加校验值.png "node节点头信息添加校验值") + + free堆内存时,不会立即把该内存块释放掉,而是在内存中写入魔术数字0xFE,并放到free队列中\(保证在一定时间内不会再被malloc函数分配\),当有野指针或use-after-free的情况对该内存进行读取的操作时,能够发现数据异常,但是对于写操作则无法判断出来。 + + **图 5** free流程图 + ![](/images/device-dev/kernel/figure/free流程图.png "free流程图") + + +- 使用malloc申请内存(大于0x1c000bytes时通过mmap申请) + + 当malloc通过mmap申请大块内存时,在返回给用户使用的内存区间头和尾分别多申请一个页,一个页PAGE\_SIZE当前为0x1000,这两个页分别通过mprotect接口设置权限为PROT\_NONE(无可读可写权限),可以有效防止内存越界读写问题:越界读写数据时由于无读写权限而导致用户程序异常,根据异常调用栈信息可找到相应的代码逻辑。 + + **图 6** malloc通过mmap机制申请内存的内存布局 + ![](/images/device-dev/kernel/figure/malloc通过mmap机制申请内存的内存布局.png "malloc通过mmap机制申请内存的内存布局") + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/03.\344\275\277\347\224\250\346\214\207\345\257\274/01.\346\216\245\345\217\243\350\257\264\346\230\216.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/03.\344\275\277\347\224\250\346\214\207\345\257\274/01.\346\216\245\345\217\243\350\257\264\346\230\216.md" new file mode 100644 index 0000000000000000000000000000000000000000..3f41569bf76ce8364a8dbe161221e10077a65ae5 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/03.\344\275\277\347\224\250\346\214\207\345\257\274/01.\346\216\245\345\217\243\350\257\264\346\230\216.md" @@ -0,0 +1,68 @@ +--- +title: 接口说明 +permalink: /pages/0004000104060200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# 接口说明 + +**表 1** 内存调测模块接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名

+

描述

+

内存调测功能

+

mem_check_init

+

初始化内存检测模块。

+

watch_mem

+

获取线程级堆内存使用信息。

+

check_leak

+

检查是否有堆内存泄漏。

+

check_heap_integrity

+

检查堆内存的完整性。

+

调用栈回溯功能

+

backtrace

+

获取调用栈地址信息。

+

backtrace_symbols

+

根据地址信息获取符号信息。

+

print_trace

+

输出函数调用栈信息。

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/03.\344\275\277\347\224\250\346\214\207\345\257\274/02.\344\275\277\347\224\250\350\257\264\346\230\216/01.\346\216\245\345\217\243\350\260\203\347\224\250\346\226\271\345\274\217.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/03.\344\275\277\347\224\250\346\214\207\345\257\274/02.\344\275\277\347\224\250\350\257\264\346\230\216/01.\346\216\245\345\217\243\350\260\203\347\224\250\346\226\271\345\274\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..f1d1490f1745ab6ec601a046e5a8c9ffc0f0551c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/03.\344\275\277\347\224\250\346\214\207\345\257\274/02.\344\275\277\347\224\250\350\257\264\346\230\216/01.\346\216\245\345\217\243\350\260\203\347\224\250\346\226\271\345\274\217.md" @@ -0,0 +1,160 @@ +--- +title: 接口调用方式 +permalink: /pages/000400010406020100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# 接口调用方式 + +- [示例代码](#section5490173592518) +- [编译](#section534302242515) +- [调测信息](#section1017419992515) +- [调用栈解析](#section1485163282417) + +## 示例代码 + +代码功能:显式调用调测模块的相关接口对用户代码进行内存校验。 + +``` +#include +#include +#include +#include // 包含提供内存调测接口声明的头文件 + +#define MALLOC_LEAK_SIZE 0x300 + +void func(void) { + char *ptr = malloc(MALLOC_LEAK_SIZE); + memset(ptr, '3', MALLOC_LEAK_SIZE); +} + +int main() +{ + mem_check_init(NULL); // 通过串口输出内存调测信息,必须在用户程序第一次申请堆内存之前调用(一般在main函数入口调用),否则调测信息不准确。 + // mem_check_init("/storage/mem_debug.txt"); // 内存调测信息输出到/storage/mem_debug.txt文件中,如果该文件创建失败,则信息通过串口输出。 + char *ptr = malloc(MALLOC_LEAK_SIZE); + memset(ptr, '1', MALLOC_LEAK_SIZE); + + watch_mem(); // 在当前代码逻辑处查看线程级内存统计信息。 + func(); + check_heap_integrity(); // 检查堆内存节点完整性。 + check_leak(); // 在当前代码逻辑处检查堆内存是否泄漏(一般在程序退出之前校验比较准确,若在malloc和free调用逻辑之间做校验,则结果不准确)。 + return 0; +} +``` + +## 编译 + +``` +$ clang -o mem_check mem_check.c -funwind-tables -rdynamic -g -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 -target arm-liteos --sysroot=/home//harmony/out/hispark_taurus/ipcamera_hispark_taurus/sysroot $(clang -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 -target arm-liteos -print-file-name=libunwind.a) +``` + +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>- 本编译示例基于将编译器的路径写入环境变量中,即.bashrc文件中。 +>- 编译用户程序及所需的lib库时,需要添加编译选项-funwind-tables,-rdynamic,-g,用于栈回溯。 +>- -mfloat-abi=softfp,-mcpu=cortex-a7,-mfpu=neon-vfpv4编译选项用于指定具体的芯片架构、浮点数计算优化、fpu,与具体的libc库使用的编译选项保持一致,否则链接时可能出现找不到libc库文件。 +>- -target arm-liteos用于指定编译器相关库文件路径。 +>- --sysroot=/home//harmony/out/hispark\_taurus/ipcamera\_hispark\_taurus/sysroot用于指定编译器库文件搜索根目录,假设OpenHarmony工程代码存放路径为/home//harmony。其中out/hispark\_taurus/ipcamera\_hispark\_taurus路径为在编译时,hb set命令指定的具体产品,本示例选择的是ipcamera\_hispark\_taurus产品。 +>- $\(clang -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 -target arm-liteos -print-file-name=libunwind.a\)用于指定相应的unwind库的路径。 + +## 调测信息 + +``` +OHOS # ./mem_check +OHOS # +==PID:4== Heap memory statistics(bytes): // 堆内存统计信息 + [Check point]: // check点调用栈 + #00: [0x86c] -> mem_check + #01: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so + + [TID: 18, Used: 0x320] // 18号线程堆内存占用,当前进程仅一个线程 + +==PID:4== Total heap: 0x320 byte(s), Peak: 0x320 byte(s) + +Check heap integrity ok! // 堆内存完整性检查 + +==PID:4== Detected memory leak(s): // 内存泄漏信息及调用栈 + [Check point]: + #00: [0x2da4c] -> /lib/libc.so + #01: [0x878] -> mem_check + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x850] -> mem_check + #01: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x810] -> mem_check + #01: [0x870] -> mem_check + #02: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so + +==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s). + +==PID:4== Detected memory leak(s): + [Check point]: + #00: [0x2da4c] -> /lib/libc.so + #01: [0x111ec] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x850] -> mem_check + #01: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x810] -> mem_check + #01: [0x870] -> mem_check + #02: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so + +==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s). + +Check heap integrity ok! +``` + +## 调用栈解析 + +提供parse\_mem\_info.sh脚本可以对调用栈进行解析,解析脚本存放的路径:kernel/liteos\_a/tools/scripts/parse\_memory/parse\_mem\_info.sh。利用脚本可以将相应的调测信息转换成具体的源码行号,如下命令所示,mem\_debug.txt保存的是内存调测信息,elf1、elf2等文件是需要解析的elf文件。 + +``` +$ ./parse_mem_info.sh mem_debug.txt elf1 elf2 elf3 ... +``` + +例如: + +``` +$ ./parse_mem_info.sh mem_debug.txt mem_check +Compiler is [gcc/llvm]: llvm +Now using addr2line ... + +==PID:4== Heap memory statistics(bytes): + [Check point]: + #00: [0x86c] at /usr1/xxx/TEST_ELF/mem_check.c:22 + #01: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so + + [TID: 18, Used: 0x320] + +==PID:4== Total heap: 0x320 byte(s), Peak: 0x320 byte(s) + +Check heap integrity ok! + +==PID:4== Detected memory leak(s): + [Check point]: + #00: [0x2da4c] -> /lib/libc.so + #01: [0x878] at /usr1/xxx/TEST_ELF/mem_check.c:28 + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x850] at /usr1/xxx/TEST_ELF/mem_check.c:17 + #01: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x810] at /usr1/xxx/TEST_ELF/mem_check.c:9 + #01: [0x870] at /usr1/xxx/TEST_ELF/mem_check.c:24 + #02: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so + +==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s). +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/03.\344\275\277\347\224\250\346\214\207\345\257\274/02.\344\275\277\347\224\250\350\257\264\346\230\216/02.\345\221\275\344\273\244\350\241\214\345\217\202\346\225\260\346\226\271\345\274\217.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/03.\344\275\277\347\224\250\346\214\207\345\257\274/02.\344\275\277\347\224\250\350\257\264\346\230\216/02.\345\221\275\344\273\244\350\241\214\345\217\202\346\225\260\346\226\271\345\274\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..5633f2c7e9e6c6508bea2f3e79b62dee459fe567 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/03.\344\275\277\347\224\250\346\214\207\345\257\274/02.\344\275\277\347\224\250\350\257\264\346\230\216/02.\345\221\275\344\273\244\350\241\214\345\217\202\346\225\260\346\226\271\345\274\217.md" @@ -0,0 +1,242 @@ +--- +title: 命令行参数方式 +permalink: /pages/000400010406020101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# 命令行参数方式 + +- [示例代码](#section13793104782316) +- [编译](#section1676431122320) +- [使用mwatch参数命令](#section1703415132311) +- [调用栈解析](#section1880675510221) +- [使用mrecord参数命令](#section071022822210) + +对用户态进程进行内存相关的检查时,除了接口调用方式还可以通过命令行方式进行内存统计、内存泄漏或内存完整性检查。 + +``` +--mwatch:初始化内存调测功能,注册信号。内存调测信息将从串口输出; +--mrecord :初始化内存调测功能,注册信号。内存调测信息将保存至f_path文件,若f_path创建失败,则内存调测信息将从串口输出 +``` + +在待调测的进程未退出时可使用信号机制获取对应信息: + +``` +kill -35 # 查看线程级堆内存占用 +kill -36 # 检查是否存在堆内存泄漏 +kill -37 # 检查堆内存头节点是否完整 +``` + +## 示例代码 + +代码功能:构造内存问题利用命令行方式进行内存调测。 + +``` +#include +#include +#include + +#define MALLOC_LEAK_SIZE 0x300 + +void func(void) { + char *ptr = malloc(MALLOC_LEAK_SIZE); + memset(ptr, '3', MALLOC_LEAK_SIZE); +} + +int main() +{ + char *ptr = malloc(MALLOC_LEAK_SIZE); + memset(ptr, '1', MALLOC_LEAK_SIZE); + func(); + while (1); +} +``` + +## 编译 + +参考[接口调用一节](/pages/000400010406020100#section534302242515)。 + +## 使用mwatch参数命令 + +``` +OHOS # ./mem_check --mwatch // 利用task命令可以查到mem_check进程的pid为4 +OHOS # +OHOS # kill -35 4 // 查看堆内存统计信息 +OHOS # +==PID:4== Heap memory statistics(bytes): + [Check point]: + #00: [0x58dfc] -> /lib/libc.so + + [TID: 18, Used: 0x640] + +==PID:4== Total heap: 0x640 byte(s), Peak: 0x640 byte(s) + +OHOS # kill -36 4 // 检查是否存在堆内存泄漏 +OHOS # +==PID:4== Detected memory leak(s): + [Check point]: + #00: [0x2da4c] -> /lib/libc.so + #01: [0x58dfc] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x724] -> mem_check + #01: <(null)+0x2555a9dc>[0x219dc] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x6ec] -> mem_check + #01: [0x740] -> mem_check + #02: <(null)+0x2555a9dc>[0x219dc] -> /lib/libc.so + +==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s). + +OHOS # kill -37 4 // 检查堆内存头节点的完整性 +OHOS # +Check heap integrity ok! +``` + +## 调用栈解析 + +将调测信息保存至test.txt文件中,利用脚本进行解析,获取内存泄漏的具体行号。 + +``` +$ ./parse_mem_info.sh test.txt mem_check +Compiler is [gcc/llvm]: llvm +Now using addr2line ... + +==PID:4== Detected memory leak(s): + [Check point]: + #00: [0x2da4c] -> /lib/libc.so + #01: [0x58dfc] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x724] at /usr1/xxx/TEST_ELF/mem_check.c:14 + #01: <(null)+0x2555a9dc>[0x219dc] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x6ec] at /usr1/xxx/TEST_ELF/mem_check.c:8 + #01: [0x740] at /usr1/xxx/TEST_ELF/mem_check.c:19 + #02: <(null)+0x2555a9dc>[0x219dc] -> /lib/libc.so + +==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s). +``` + +## 使用mrecord参数命令 + +1. 执行用户程序并指定记录内存调测信息的文件路径 + + ``` + OHOS # ./mem_check --mrecord /storage/check.txt + ``` + +2. 利用kill -35 统计内存信息,该信息将会输出到文件中,使用cat命令查看 + + ``` + OHOS # kill -35 4 + OHOS # Memory statistics information saved in /storage/pid(4)_check.txt + + OHOS # cat /storage/pid(4)_check.txt + + ==PID:4== Heap memory statistics(bytes): + [Check point]: + #00: [0x5973c] -> /lib/libc.so + + [TID: 18, Used: 0x640] + + ==PID:4== Total heap: 0x640 byte(s), Peak: 0x640 byte(s) + ``` + +3. 利用kill -36 校验内存完整性,该信息将会输出到文件中,使用cat命令查看 + + ``` + OHOS # kill -36 4 + OHOS # Leak check information saved in /storage/pid(4)_check.txt + + OHOS # cat /storage/pid(4)_check.txt + + ==PID:4== Heap memory statistics(bytes): + [Check point]: + #00: [0x5973c] -> /lib/libc.so + + [TID: 18, Used: 0x640] + + ==PID:4== Total heap: 0x640 byte(s), Peak: 0x640 byte(s) + + ==PID:4== Detected memory leak(s): + [Check point]: + #00: [0x2e38c] -> /lib/libc.so + #01: [0x5973c] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x724] -> mem_check + #01: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x6ec] -> mem_check + #01: [0x740] -> mem_check + #02: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so + + ==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s). + ``` + +4. 利用kill -9 杀掉当前进程,进程退出后会默认校验内存完整性,该信息将会输出到文件中,使用cat命令查看 + + ``` + OHOS # kill -9 4 + OHOS # Leak check information saved in /storage/pid(4)_check.txt + + Check heap integrity ok! + + OHOS # cat /storage/pid(4)_check.txt + OHOS # + ==PID:4== Heap memory statistics(bytes): + [Check point]: + #00: [0x5973c] -> /lib/libc.so + + [TID: 18, Used: 0x640] + + ==PID:4== Total heap: 0x640 byte(s), Peak: 0x640 byte(s) + + ==PID:4== Detected memory leak(s): + [Check point]: + #00: [0x2e38c] -> /lib/libc.so + #01: [0x5973c] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x724] -> mem_check + #01: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x6ec] -> mem_check + #01: [0x740] -> mem_check + #02: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so + + ==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s). + + ==PID:4== Detected memory leak(s): + [Check point]: + #00: [0x2e38c] -> /lib/libc.so + #01: [0x11b2c] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x724] -> mem_check + #01: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so + + [TID:18 Leak:0x320 byte(s)] Allocated from: + #00: [0x6ec] -> mem_check + #01: [0x740] -> mem_check + #02: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so + + ==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s). + ``` + + +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>上述连续记录的信息会逐步追加到初始化时所指定的文件中,故最后cat文件时,文件中还包含历史记录的信息内容。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/04.\345\270\270\350\247\201\351\227\256\351\242\230\345\234\272\346\231\257.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/04.\345\270\270\350\247\201\351\227\256\351\242\230\345\234\272\346\231\257.md" new file mode 100644 index 0000000000000000000000000000000000000000..6af964f39ab948986e5e4ee3c400114611bb17a2 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/07.\347\224\250\346\210\267\346\200\201\345\206\205\345\255\230\350\260\203\346\265\213/04.\345\270\270\350\247\201\351\227\256\351\242\230\345\234\272\346\231\257.md" @@ -0,0 +1,65 @@ +--- +title: 常见问题场景 +permalink: /pages/00040001040603 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# 常见问题场景 + +- [UAF\(Use after free\)](#section4427132815445) +- [Double free](#section827194818458) +- [堆内存节点被踩](#section1763741216461) + +## UAF\(Use after free\) + +- 申请小块内存(不大于0x1c000字节) + + free之后: + + 读操作:读取free之后的内存大概率是魔术数字\(0xFEFEFEFE\) + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >free之后的堆内存不会立即释放进堆内存池,会先放至固定长度的队列中,并置魔术数字0xFE,队列满后会将先放至队列中的内存块释放进堆内存池 + + 写操作:无法校验。 + + +- 申请大块内存(大于0x1c000) + + 堆内存由malloc通过调用mmap接口申请,free之后若仍访问该内存,则用户程序异常(该内存区间已被unmap)。 + + +## Double free + +Double free时,用户程序将会异常退出。 + +## 堆内存节点被踩 + +- 申请小块内存(不大于0x1c000) + + 堆内存节点被踩时,用户程序将会异常退出,并输出破坏被踩节点的可能的堆内存申请调用栈,对于野指针踩内存情况无法校验出来。例如用户程序mem\_check中存在堆内存越界踩的情况,利用命令行方式可以获得踩内存的可能的具体位置。 + + ``` + OHOS # ./mem_check --mwatch + OHOS # + ==PID:6== Memory integrity information: + [TID:28 allocated addr: 0x272e1ea0, size: 0x120] The possible attacker was allocated from: + #00: [0x640e8] -> /lib/libc.so + #01: [0x21d0] -> mem_check + ``` + + 可以通过调用栈解析脚本对调用栈信息进行解析。 + + +- 申请大块内存(大于0x1c000) + + 堆内存由malloc通过mmap接口申请,申请得到的堆内存块前后各置一个size为PAGE\_SIZE大小的区间,设置无读写权限,读写操作会触发用户程序异常。 + + diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/05.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/01.\344\270\264\347\273\210\351\201\227\350\250\200.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/08.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/01.\344\270\264\347\273\210\351\201\227\350\250\200.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/05.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/01.\344\270\264\347\273\210\351\201\227\350\250\200.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/08.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/01.\344\270\264\347\273\210\351\201\227\350\250\200.md" index 4a9118075354d721c41bfec62e105c776aebde1a..80d6bd2dc38ec38d68f63411868eb7d27a41fce1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/05.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/01.\344\270\264\347\273\210\351\201\227\350\250\200.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/08.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/01.\344\270\264\347\273\210\351\201\227\350\250\200.md" @@ -1,6 +1,6 @@ --- title: 临终遗言 -permalink: /pages/000201040400 +permalink: /pages/00040001040700 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 临终遗言 @@ -102,7 +102,7 @@ VOID LOS_ExcInfoRegHook(UINT32 startAddr, UINT32 space, CHAR *buf, log_read_writ 该功能依赖于宏LOSCFG\_SAVE\_EXCINFO,使用临终遗言功能时,在配置项中开启“ Enable Saving Exception Information ”:Debug-\> Enable Saving Exception Information ;若关闭该选项,则该功能失效。功能开启后,可在SystemInit中调用LOS\_ExcInfoRegHook来注册存取异常信息的位置、大小、内存缓冲区以及存取函数。当系统进入异常时,会将异常时系统各类信息先保存在注册时传入的内存缓冲区中,最后调用注册的存取函数,将异常信息写入到物理存储介质中。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 注册的存取位置不要跟其他存储重叠。 >- 注册的内存缓冲区不能太小,建议不低于16KiB,否则异常信息会存储不完整。 >- 注册的读写函数对应的具体存储介质的驱动功能正常,才能保证存取功能正常。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/05.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/02.\345\270\270\350\247\201\351\227\256\351\242\230\345\256\232\344\275\215\346\226\271\346\263\225.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/08.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/02.\345\270\270\350\247\201\351\227\256\351\242\230\345\256\232\344\275\215\346\226\271\346\263\225.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/05.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/02.\345\270\270\350\247\201\351\227\256\351\242\230\345\256\232\344\275\215\346\226\271\346\263\225.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/08.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/02.\345\270\270\350\247\201\351\227\256\351\242\230\345\256\232\344\275\215\346\226\271\346\263\225.md" index 92eac0486e3f84bc4d6d4ae6ea7dda4512bdca98..96a2e631be03b466d48b719a18e84ad3952808ea 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/05.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/02.\345\270\270\350\247\201\351\227\256\351\242\230\345\256\232\344\275\215\346\226\271\346\263\225.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/05.\350\260\203\346\265\213\344\270\216\345\267\245\345\205\267/08.\345\205\266\344\273\226\345\206\205\346\240\270\350\260\203\346\265\213\346\211\213\346\256\265/02.\345\270\270\350\247\201\351\227\256\351\242\230\345\256\232\344\275\215\346\226\271\346\263\225.md" @@ -1,6 +1,6 @@ --- title: 常见问题定位方法 -permalink: /pages/000201040401 +permalink: /pages/00040001040701 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 常见问题定位方法 @@ -23,7 +23,7 @@ date: 2021-12-30 12:57:43 图1 异常信息 -![](/images/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001173429547.png) +![](/images/device-dev/kernel/figure/zh-cn_image_0000001173429547.png) 上图中的异常信息主要解释4个标签: diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/01.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204-\345\217\214\345\220\221\351\223\276\350\241\250.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/01.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204/01.\345\217\214\345\220\221\351\223\276\350\241\250.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/01.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204-\345\217\214\345\220\221\351\223\276\350\241\250.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/01.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204/01.\345\217\214\345\220\221\351\223\276\350\241\250.md" index a5988e7ccdf0a0e645408b65ccc0d74fb2273bb6..44c64fa22c5b4a5389d0ed75aa191d20142aaae3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/01.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204-\345\217\214\345\220\221\351\223\276\350\241\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/01.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204/01.\345\217\214\345\220\221\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@ --- -title: 基本数据结构-双向链表 -permalink: /pages/0002010500 +title: 双向链表 +permalink: /pages/00040001050000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 双向链表 @@ -175,7 +175,7 @@ date: 2021-12-30 12:57:43 5. 调用LOS\_ListEmpty判断链表是否为空。 6. 调用LOS\_ListDelInit删除指定节点并以此节点初始化链表。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 需要注意节点指针前后方向的操作。 >- 链表操作接口,为底层接口,不对入参进行判空,需要使用者确保传参合法。 >- 如果链表节点的内存是动态申请的,删除节点时,要注意释放内存。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/02.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204-\344\275\215\346\223\215\344\275\234.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/01.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204/02.\344\275\215\346\223\215\344\275\234.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/02.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204-\344\275\215\346\223\215\344\275\234.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/01.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204/02.\344\275\215\346\223\215\344\275\234.md" index b04133bc303c9ba9ddb04cfe14ac7bad5fc6039e..eda514c09d3e8ddf5e652096dc940c774f2133fe 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/02.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204-\344\275\215\346\223\215\344\275\234.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/01.\345\237\272\346\234\254\346\225\260\346\215\256\347\273\223\346\236\204/02.\344\275\215\346\223\215\344\275\234.md" @@ -1,6 +1,6 @@ --- -title: 基本数据结构-位操作 -permalink: /pages/0002010501 +title: 位操作 +permalink: /pages/00040001050001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 位操作 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/02.\346\240\207\345\207\206\345\272\223.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/02.\346\240\207\345\207\206\345\272\223.md" index fdb22508971be4e46f427eacc7fef5d8a1f5ab13..d851b7c9a3df5a7271ea653244817dd15163f258 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/03.\346\240\207\345\207\206\345\272\223.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/02.\345\260\217\345\236\213\347\263\273\347\273\237\345\206\205\346\240\270/06.\351\231\204\345\275\225/02.\346\240\207\345\207\206\345\272\223.md" @@ -1,6 +1,6 @@ --- title: 标准库 -permalink: /pages/0002010502 +permalink: /pages/000400010501 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 标准库 @@ -28,7 +28,7 @@ OpenHarmony内核使用musl libc库,支持标准POSIX接口,开发者可基 ## 标准库接口框架 **图 1** POSIX接口框架 -![](/images/zh-cn/device-dev/kernel/figure/POSIX接口框架.png "POSIX接口框架") +![](/images/device-dev/kernel/figure/POSIX接口框架.png "POSIX接口框架") musl libc库支持POSIX标准,涉及的系统调用相关接口由OpenHarmony内核适配支持 ,以满足接口对外描述的功能要求。 diff --git "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/01.Linux\345\206\205\346\240\270\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/01.Linux\345\206\205\346\240\270\346\246\202\350\277\260.md" similarity index 72% rename from "website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/01.Linux\345\206\205\346\240\270\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/01.Linux\345\206\205\346\240\270\346\246\202\350\277\260.md" index 75af310f0ea76830a48c766086729e116aa5fc84..490b081da22637e9576e25e0dcd4d0f82c68a964 100644 --- "a/website/docs/01.\346\226\207\346\241\243/03.\350\256\276\345\244\207\345\274\200\345\217\221-\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/01.Linux\345\206\205\346\240\270\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/01.Linux\345\206\205\346\240\270\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: Linux内核概述 -permalink: /pages/00020200 +permalink: /pages/0004000200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # Linux内核概述 @@ -28,7 +28,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/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/02.OpenHarmony\345\274\200\345\217\221\346\235\277Patch\344\275\277\347\224\250\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/02.OpenHarmony\345\274\200\345\217\221\346\235\277Patch\344\275\277\347\224\250\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..c8ec56ca01fac838d515db5569aa9aa7722879d9 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/02.OpenHarmony\345\274\200\345\217\221\346\235\277Patch\344\275\277\347\224\250\346\214\207\345\257\274.md" @@ -0,0 +1,48 @@ +--- +title: OpenHarmony开发板Patch使用指导 +permalink: /pages/0004000201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# OpenHarmony开发板Patch使用指导 + +1. 合入HDF补丁 + + 在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) + ``` + +2. 合入芯片平台驱动补丁 + + 以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 + ``` + +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 + ``` + + > **须知:** + > + >由于OpenHarmony工程的编译构建流程中会拷贝kernel/linux/linux-\*\.\*的代码环境后进行打补丁动作,在使用OpenHarmony的版本级编译命令前,需要kernel/linux/linux-\*\.\*原代码环境。 + > + >根据不同系统工程,编译完成后会在out目录下的kernel目录中生成对应实际编译的内核,基于此目录的内核,进行对应的config修改,将最后生成的\.config文件cp到config仓对应的路径文件里,即可生效。 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/03.Linux\345\206\205\346\240\270\347\274\226\350\257\221\344\270\216\346\236\204\345\273\272\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/03.Linux\345\206\205\346\240\270\347\274\226\350\257\221\344\270\216\346\236\204\345\273\272\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..9d106fa946345bce303dd1488920744eff9f4242 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/01.\345\206\205\346\240\270/03.\346\240\207\345\207\206\347\263\273\347\273\237\345\206\205\346\240\270/03.Linux\345\206\205\346\240\270\347\274\226\350\257\221\344\270\216\346\236\204\345\273\272\346\214\207\345\257\274.md" @@ -0,0 +1,25 @@ +--- +title: Linux内核编译与构建指导 +permalink: /pages/0004000202 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# Linux内核编译与构建指导 + +以hi3516dv300开源开发板+ubuntu x86主机开发环境为例 + +使用工程的全量编译命令,编译生成uImage内核镜像 + +``` +./build.sh --product-name Hi3516DV300 # 编译hi3516dv300镜像 + --build-target build_kernel # 编译hi3516dv300的uImage内核镜像 + --gn-args linux_kernel_version=\"linux-5.10\" # 编译指定内核版本 +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/01.HDF\345\274\200\345\217\221\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/01.HDF\345\274\200\345\217\221\346\246\202\350\277\260.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/01.HDF\345\274\200\345\217\221\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/01.HDF\345\274\200\345\217\221\346\246\202\350\277\260.md" index 48240909735a0d87deb53c62caef5dd253104e4e..fd5bad3ca57b82dc21f2aa64bb056b5fef91d41f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/01.HDF\345\274\200\345\217\221\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/01.HDF\345\274\200\345\217\221\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: HDF开发概述 -permalink: /pages/00030000 +permalink: /pages/0004010000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # HDF开发概述 diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/02.\351\251\261\345\212\250\345\274\200\345\217\221.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/02.\351\251\261\345\212\250\345\274\200\345\217\221.md" similarity index 70% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/02.\351\251\261\345\212\250\345\274\200\345\217\221.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/02.\351\251\261\345\212\250\345\274\200\345\217\221.md" index f42f35fbe9831a7cb64720cff69f3da596ac6393..23424a593b47f0241a9fc36c65bfe28b6bda1e0d 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/02.\351\251\261\345\212\250\345\274\200\345\217\221.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/02.\351\251\261\345\212\250\345\274\200\345\217\221.md" @@ -1,6 +1,6 @@ --- title: 驱动开发 -permalink: /pages/00030001 +permalink: /pages/0004010001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 驱动开发 @@ -20,10 +20,8 @@ date: 2021-12-30 12:57:43 HDF框架以组件化的驱动模型作为核心设计思路,为开发者提供更精细化的驱动管理,让驱动开发和部署更加规范。HDF框架将一类设备驱动放在同一个host里面,开发者也可以将驱动功能分层独立开发和部署,支持一个驱动多个node,HDF驱动模型如下图所示: -**图 1** HDF驱动模型 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001054564784.png) +**图 1** HDF驱动模型 +![](/images/device-dev/driver/figures/HDF驱动模型.png "HDF驱动模型") ## 驱动开发步骤 @@ -79,28 +77,91 @@ HDF框架以组件化的驱动模型作为核心设计思路,为开发者提 HDF_INIT(g_sampleDriverEntry); ``` -2. 驱动编译 - - 驱动代码的编译必须要使用HDF框架提供的Makefile模板进行编译。 +2. 驱动编译 + + - liteos + + 涉及makefile和BUILD.gn修改: + + * makefile部分: + + 驱动代码的编译必须要使用HDF框架提供的Makefile模板进行编译。 + + ``` + include $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/lite.mk #导入hdf预定义内容,必需 + MODULE_NAME := #生成的结果文件 + LOCAL_INCLUDE := #本驱动的头文件目录 + LOCAL_SRCS := #本驱动的源代码文件 + LOCAL_CFLAGS := #自定义的编译选项 + include $(HDF_DRIVER) #导入模板makefile完成编译 + ``` + + 编译结果文件链接到内核镜像,添加到drivers/adapter/khdf/liteos目录下的hdf_lite.mk里面,示例如下: + + ``` + LITEOS_BASELIB += -lxxx #链接生成的静态库 + LIB_SUBDIRS += #驱动代码Makefile的目录 + ``` + + * BUILD.gn部分: + + 添加模块BUILD.gn参考定义如下内容: + + ``` + import("//build/lite/config/component/lite_component.gni") + import("//drivers/adapter/khdf/liteos/hdf.gni") + module_switch = defined(LOSCFG_DRIVERS_HDF_xxx) + module_name = "xxx" + hdf_driver(module_name) { + sources = [ + "xxx/xxx/xxx.c", #模块要编译的源码文件 + ] + public_configs = [ ":public" ] #使用依赖的头文件配置 + } + config("public") { #定义依赖的头文件配置 + include_dirs = [ + "xxx/xxx/xxx", #依赖的头文件目录 + ] + } + ``` + + 把新增模块的BUILD.gn所在的目录添加到/drivers/adapter/khdf/liteos/BUILD.gn里面: + + ``` + group("liteos") { + public_deps = [ ":$module_name" ] + deps = [ + "xxx/xxx", #新增模块BUILD.gn所在的目录,目录结构相对于/drivers/adapter/khdf/liteos + ] + } + ``` + + - linux + + 如果需要定义模块控制宏,需要在模块目录xxx里面添加Kconfig文件,并把Kconfig文件路径添加到drivers/adapter/khdf/linux/Kconfig里面: + + ``` + source "drivers/hdf/khdf/xxx/Kconfig" #目录为hdf模块软链接到kernel里面的目录 + ``` + + 添加模块目录到drivers/adapter/khdf/linux/Makefile: + + ``` + obj-$(CONFIG_DRIVERS_HDF) += xxx/ + ``` + + 在模块目录xxx里面添加Makefile文件,在Makefile文件里面添加模块代码编译规则: + + ``` + obj-y += xxx.o + ``` - ``` - include $(LITEOSTOPDIR)/../../drivers/adapter/lite/khdf/lite.mk #导入hdf预定义内容,必需 - MODULE_NAME := #生成的结果文件 - LOCAL_INCLUDE := #本驱动的头文件目录 - LOCAL_SRCS := #本驱动的源代码文件 - LOCAL_CFLAGS := #自定义的编译选项 - include $(HDF_DRIVER) #导入模板makefile完成编译 - ``` - - 编译结果文件链接到内核镜像,添加到vendor目录下的hdf\_vendor.mk里面,示例如下: - ``` - LITEOS_BASELIB += -lxxx #链接生成的静态库 - LIB_SUBDIRS += #驱动代码Makefile的目录 - ``` 3. 驱动配置 - HDF使用HCS作为配置描述源码,HCS详细介绍参考[配置管理](/pages/00030004)介绍。 + HDF使用HCS作为配置描述源码,HCS详细介绍参考[配置管理](/pages/0004010004)介绍。 驱动配置包含两部分,HDF框架定义的驱动设备描述和驱动的私有配置信息,具体写法如下: @@ -169,7 +230,7 @@ HDF框架以组件化的驱动模型作为核心设计思路,为开发者提 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >驱动加载方式支持按需加载和按序加载两种方式,具体使用方法如下: >- 按需加载 > ``` @@ -180,7 +241,7 @@ HDF框架以组件化的驱动模型作为核心设计思路,为开发者提 > DEVICE_PRELOAD_INVALID > } DevicePreload; > ``` -> 配置文件中preload 字段配成 0 (DEVICE\_PRELOAD\_ENABLE ),则系统启动过程中默认加载;配成1(DEVICE\_PRELOAD\_ENABLE\_STEP2),当系统支持快启的时候,则在系统系统完成之后再加载这一类驱动,否则和DEVICE\_PRELOAD\_ENABLE 含义相同;配成2(DEVICE\_PRELOAD\_DISABLE),则系统启动过程中默认不加载,支持后续动态加载,当用户态获取驱动服务(参考[消息机制](/pages/00030003))时,如果驱动服务不存在时,HDF框架会尝试动态加载该驱动。 +> 配置文件中preload 字段配成 0 (DEVICE\_PRELOAD\_ENABLE ),则系统启动过程中默认加载;配成1(DEVICE\_PRELOAD\_ENABLE\_STEP2),当系统支持快启的时候,则在系统完成之后再加载这一类驱动,否则和DEVICE\_PRELOAD\_ENABLE 含义相同;配成2(DEVICE\_PRELOAD\_DISABLE),则系统启动过程中默认不加载,支持后续动态加载,当用户态获取驱动服务(参考[消息机制](/pages/0004010003))时,如果驱动服务不存在时,HDF框架会尝试动态加载该驱动。 >- 按序加载(需要驱动为默认加载) > 配置文件中的priority(取值范围为整数0到200)是用来表示host和驱动的优先级,不同的host内的驱动,host的priority值越小,驱动加载优先级越高;同一个host内驱动的priority值越小,加载优先级越高。 diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/03.\351\251\261\345\212\250\346\234\215\345\212\241\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/03.\351\251\261\345\212\250\346\234\215\345\212\241\347\256\241\347\220\206.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/03.\351\251\261\345\212\250\346\234\215\345\212\241\347\256\241\347\220\206.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/03.\351\251\261\345\212\250\346\234\215\345\212\241\347\256\241\347\220\206.md" index 6ef0a80c4408cf468123aad920c7b02ba050d2ed..30e98fb6a3b31cc28614193e80037a1752d62ba5 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/03.\351\251\261\345\212\250\346\234\215\345\212\241\347\256\241\347\220\206.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/03.\351\251\261\345\212\250\346\234\215\345\212\241\347\256\241\347\220\206.md" @@ -1,6 +1,6 @@ --- title: 驱动服务管理 -permalink: /pages/00030002 +permalink: /pages/0004010002 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 驱动服务管理 diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/04.\351\251\261\345\212\250\346\266\210\346\201\257\346\234\272\345\210\266\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/04.\351\251\261\345\212\250\346\266\210\346\201\257\346\234\272\345\210\266\347\256\241\347\220\206.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/04.\351\251\261\345\212\250\346\266\210\346\201\257\346\234\272\345\210\266\347\256\241\347\220\206.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/04.\351\251\261\345\212\250\346\266\210\346\201\257\346\234\272\345\210\266\347\256\241\347\220\206.md" index c87698dbbf0893a1560b334cac506b0fe115b252..0bf6f8f7825ab396c758ca03d5f405273b0be517 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/04.\351\251\261\345\212\250\346\266\210\346\201\257\346\234\272\345\210\266\347\256\241\347\220\206.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/04.\351\251\261\345\212\250\346\266\210\346\201\257\346\234\272\345\210\266\347\256\241\347\220\206.md" @@ -1,6 +1,6 @@ --- title: 驱动消息机制管理 -permalink: /pages/00030003 +permalink: /pages/0004010003 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 驱动消息机制管理 @@ -62,7 +62,7 @@ date: 2021-12-30 12:57:43 ## 开发步骤 -1. 将驱动配置信息中服务策略policy字段设置为2(SERVICE\_POLICY\_CAPACITY,参考[policy定义](/pages/00030002))。 +1. 将驱动配置信息中服务策略policy字段设置为2(SERVICE\_POLICY\_CAPACITY,参考[policy定义](/pages/0004010002))。 ``` device_sample :: Device { diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/05.\351\205\215\347\275\256\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/05.\351\205\215\347\275\256\347\256\241\347\220\206.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/05.\351\205\215\347\275\256\347\256\241\347\220\206.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/05.\351\205\215\347\275\256\347\256\241\347\220\206.md" index d7afdfd34d12102ebd15af47b19297455808eceb..28ddd83f3d831ad7be7c754defc8a90a23a9b689 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/05.\351\205\215\347\275\256\347\256\241\347\220\206.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/05.\351\205\215\347\275\256\347\256\241\347\220\206.md" @@ -1,6 +1,6 @@ --- title: 配置管理 -permalink: /pages/00030004 +permalink: /pages/0004010004 navbar: true sidebar: true prev: true @@ -9,24 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # 配置管理 - [配置概述](#section59914284576) - [配置语法](#section533713333580) -- [关键字](#section1316625413586) -- [基本结构](#section173481622115918) -- [数据类型](#section96521601302) -- [预处理](#section8164295515) -- [注释](#section0338205819610) -- [引用修改](#section179799204716) -- [节点复制](#section382424014712) -- [删除](#section165211112586) -- [属性引用](#section192841514490) -- [模板](#section520134294) + - [关键字](#section4522107333) + - [基本结构](#section853042911312) + - [数据类型](#section177001259134) + - [预处理](#section14867121641) + - [注释](#section1323412417) + - [引用修改](#section193708571145) + - [节点复制](#section1487792020513) + - [删除](#section1096515391155) + - [属性引用](#section20271317611) + - [模板](#section958819191063) + - [配置生成](#section106152531919) -- [hc-gen介绍](#section8260625101012) + - [hc-gen介绍](#section359734416616) + ## 配置概述 @@ -39,10 +41,8 @@ HC-GEN**\(H**DF **C**onfiguration **G**enerator**\)**是HCS配置转换工具 以下是使用HCB模式的典型应用场景: -**图 1** 配置使用流程图 - - -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001053405727.png) +**图 1** 配置使用流程图 +![](/images/device-dev/driver/figures/配置使用流程图.png "配置使用流程图") HCS经过HC-GEN编译生成HCB文件,HDF驱动框架中的HCS Parser模块会从HCB文件中重建配置树,HDF驱动模块使用HCS Parser提供的配置读取接口获取配置内容。 @@ -50,7 +50,7 @@ HCS经过HC-GEN编译生成HCB文件,HDF驱动框架中的HCS Parser模块会 HCS的语法介绍如下: -## 关键字 +### 关键字 HCS配置语法保留了以下关键字。 @@ -103,7 +103,7 @@ HCS配置语法保留了以下关键字。 -## 基本结构 +### 基本结构 HCS主要分为属性\(Attribute\)和节点\(Node\)两种结构。 @@ -150,7 +150,7 @@ HCS主要分为属性\(Attribute\)和节点\(Node\)两种结构。 - 节点中可以增加match\_attr属性,其值为一个全局唯一的字符串。在解析配置时可以调用查找接口以该属性的值查找到包含该属性的节点。 -## 数据类型 +### 数据类型 在属性定义中使用自动数据类型,不显式指定类型,属性支持的数据类型如下: @@ -183,7 +183,7 @@ attr_bar = ["hello", "world"]; bool类型中**true**表示真,**false**表示假。 -## 预处理 +### 预处理 **include** @@ -197,7 +197,7 @@ bool类型中**true**表示真,**false**表示假。 - 文件名必须使用双引号\(""\),不在同一目录使用相对路径引用。被include文件也必须是合法的HCS文件。 - 多个include,如果存在相同的节点,后者覆盖前者,其余的节点依次展开。 -## 注释 +### 注释 支持两种注释风格。 @@ -215,11 +215,11 @@ bool类型中**true**表示真,**false**表示假。 */ ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >多行注释不支持嵌套。 -## 引用修改 +### 引用修改 引用修改可以实现修改另外任意一个节点的内容,语法为: @@ -271,7 +271,7 @@ root { - 引用同级node,可以直接使用node名称,否则被引用的节点必须使用绝对路径,节点间使用“.”分隔,root表示根节点,格式为root开始的节点路径序列,例如root.foo.bar即为一个合法的绝对路径。 - 如果出现修改冲突(即多处修改同一个属性),编译器将提示warning,因为这种情况下只会生效某一个修改而导致最终结果不确定。 -## 节点复制 +### 节点复制 节点复制可以实现在节点定义时从另一个节点先复制内容,用于定义内容相似的节点。语法为: @@ -310,9 +310,9 @@ root { 在上述示例中,编译后bar节点即包含attr\_0属性也包含attr\_1属性,在bar中对attr\_0的修改不会影响到foo。 -在foo和bar在同级node中可不指定foo的路径,否则需要使用绝对路径引用,参考[引用修改](#section179799204716)。 +在foo和bar在同级node中可不指定foo的路径,否则需要使用绝对路径引用,参考[引用修改](#section193708571145)。 -## 删除 +### 删除 要对include导入的base配置树中不需要的节点或属性进行删除,可以使用delete关键字。下面的举例中sample1.hcs通过include导入了sample2.hcs中的配置内容,并使用delete删除了sample2.hcs中的attribute2属性和foo\_2节点,示例如下: @@ -343,10 +343,10 @@ root { } ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >在同一个HCS文件中不允许使用delete,建议直接删除不需要的属性。 -## 属性引用 +### 属性引用 为了在解析配置时快速定位到关联的节点,可以把节点作为属性的右值,通过读取属性查找到对应节点。语法为: @@ -366,7 +366,7 @@ node2 { } ``` -## 模板 +### 模板 模板的用途在于生成严格一致的node结构,以便对同类型node进行遍历和管理。 @@ -411,7 +411,7 @@ root { hc-gen是配置生成的工具,可以对HCS配置语法进行检查并把HCS源文件转化成HCB二进制文件。 -## hc-gen介绍 +### hc-gen介绍 hc-gen参数说明: diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/06.HDF\345\274\200\345\217\221\345\256\236\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/06.HDF\345\274\200\345\217\221\345\256\236\344\276\213.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/06.HDF\345\274\200\345\217\221\345\256\236\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/06.HDF\345\274\200\345\217\221\345\256\236\344\276\213.md" index 790ed6a1f584e8e07ceee735c95e3cf41c146512..d500b1e130a5bc1d07de6fc9abf05c2f68c4f3e8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/06.HDF\345\274\200\345\217\221\345\256\236\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/01.HDF\351\251\261\345\212\250\346\241\206\346\236\266/06.HDF\345\274\200\345\217\221\345\256\236\344\276\213.md" @@ -1,6 +1,6 @@ --- title: HDF开发实例 -permalink: /pages/00030005 +permalink: /pages/0004010005 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- # HDF开发实例 @@ -21,7 +21,7 @@ date: 2021-12-30 12:57:43 ## 添加配置 -在HDF框架的配置文件(例如vendor/hisilicon/xxx/config/device\_info)中添加该驱动的配置信息,如下所示: +在HDF框架的配置文件(例如vendor/hisilicon/xxx/hdf_config/device\_info)中添加该驱动的配置信息,如下所示: ``` root { @@ -242,10 +242,10 @@ int main() } ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >用户态应用程序使用了HDF框架中的消息发送接口,因此在编译用户态程序的过程中需要依赖HDF框架对外提供的hdf\_core和osal的动态库,在gn编译文件中添加如下依赖项: >deps = \[ ->"//drivers/adapter/lite/uhdf/manager:hdf\_core", ->"//drivers/adapter/lite/uhdf/posix:hdf\_posix\_osal", +>"//drivers/adapter/uhdf/manager:hdf\_core", +>"//drivers/adapter/uhdf/posix:hdf\_posix\_osal", >\] diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/01.ADC.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/01.ADC.md" new file mode 100644 index 0000000000000000000000000000000000000000..f16b47b03fd84abdae42a950fc8d6086396c0a75 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/01.ADC.md" @@ -0,0 +1,437 @@ +--- +title: ADC +permalink: /pages/0004010100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# ADC + +- [概述](#section268031773165048) +- [接口说明](#section752964871810) +- [开发步骤](#section100579767165048) +- [开发实例](#section1745221471165048) + +## 概述 + +ADC(Analog to Digital Converter),即模拟-数字转换器,是一种将模拟信号转换成对应数字信号的设备,在HDF框架中,ADC模块接口适配模式采用统一服务模式,这需要一个设备服务来作为ADC模块的管理器,统一处理外部访问,这会在配置文件中有所体现。统一服务模式适合于同类型设备对象较多的情况,如ADC可能同时具备十几个控制器,采用独立服务模式需要配置更多的设备节点,且服务会占据内存资源。 + +**图 1** ADC统一服务 +![](/images/device-dev/driver/figures/ADC统一服务.png "ADC统一服务") + +## 接口说明 + +AdcMethod定义: + +``` +struct AdcMethod { + int32_t (*read)(struct AdcDevice *device, uint32_t channel, uint32_t *val); + int32_t (*start)(struct AdcDevice *device); + int32_t (*stop)(struct AdcDevice *device); +}; +``` + +**表 1** AdcMethod结构体成员的回调函数功能说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

函数成员

+

入参

+

出参

+

返回值

+

功能

+

read

+

device: 结构体指针,核心层ADC控制器;channel:uint32_t,传入的通道号;

+

val:uint32_t指针,要传出的信号数据;

+

HDF_STATUS相关状态

+

读取ADC采样的信号数据

+

stop

+

device: 结构体指针,核心层ADC控制器;

+

+

HDF_STATUS相关状态

+

关闭ADC设备

+

start

+

device: 结构体指针,核心层ADC控制器;

+

+

HDF_STATUS相关状态

+

开启ADC设备

+
+ +## 开发步骤 + +ADC模块适配的三个环节是配置属性文件,实例化驱动入口,以及实例化核心层接口函数。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加adc\_config.hcs器件属性文件。 + +3. **实例化ADC控制器对象:** + - 初始化AdcDevice成员。 + - 实例化AdcDevice成员AdcMethod。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化AdcDevice成员AdcMethod,其定义和成员说明见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如挂载后的信息反馈,信号采集的成功与否等。 + + +## 开发实例 + +接下来以 adc\_hi35xx.c 为示例, 展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 + + 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + ADC驱动入口参考: + + ADC模块这种类型的控制器会出现很多个设备挂接的情况,因而在HDF框架中首先会为这类型的设备创建一个管理器对象。这样,需要打开某个设备时,管理器对象会根据指定参数查找到指定设备。 + + ADC管理器的驱动由核心层实现,厂商不需要关注这部分内容的实现,这个但在实现Init函数的时候需要调用核心层的AdcDeviceAdd函数,它会实现相应功能。 + + ``` + static struct HdfDriverEntry g_hi35xxAdcDriverEntry = { + .moduleVersion = 1, + .Init = Hi35xxAdcInit, + .Release = Hi35xxAdcRelease, + .moduleName = "hi35xx_adc_driver",//【必要且与HCS文件里面的名字匹配】 + }; + HDF_INIT(g_hi35xxAdcDriverEntry); //调用HDF_INIT将驱动入口注册到HDF框架中 + + //核心层adc_core.c管理器服务的驱动入口 + struct HdfDriverEntry g_adcManagerEntry = { + .moduleVersion = 1, + .Init = AdcManagerInit, + .Release = AdcManagerRelease, + .moduleName = "HDF_PLATFORM_ADC_MANAGER",//这与device_info文件中device0对应 + }; + HDF_INIT(g_adcManagerEntry); + ``` + +2. 完成驱动入口注册之后,下一步请在device\_info.hcs文件中添加deviceNode信息,并在adc\_config.hcs中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值对于厂商驱动的实现以及核心层AdcDevice相关成员的默认值或限制范围有密切关系。 + + 统一服务模式的特点是device\_info文件中第一个设备节点必须为ADC管理器,其各项参数必须如下设置: + + + + + + + + + + + + + + + + + + + +

成员名

+

+

moduleName

+

固定为 HDF_PLATFORM_ADC_MANAGER

+

serviceName

+

+

policy

+

具体配置为0,不发布服务

+

deviceMatchAttr

+

没有使用,可忽略

+
+ + 从第二个节点开始配置具体ADC控制器信息,此节点并不表示某一路ADC控制器,而是代表一个资源性质设备,用于描述一类ADC控制器的信息。本例只有一个ADC设备,如有多个设备,则需要在device\_info文件增加deviceNode信息,以及在adc\_config文件中增加对应的器件属性。 + + - device\_info.hcs 配置参考。 + + ``` + root { + device_info { + platform :: host { + device_adc :: device { + device0 :: deviceNode { + policy = 0; + priority = 50; + permission = 0644; + moduleName = "HDF_PLATFORM_ADC_MANAGER"; + serviceName = "HDF_PLATFORM_ADC_MANAGER"; + } + device1 :: deviceNode { + policy = 0; // 等于0,不需要发布服务 + priority = 55; // 驱动启动优先级 + permission = 0644; // 驱动创建设备节点权限 + moduleName = "hi35xx_adc_driver"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致; + serviceName = "HI35XX_ADC_DRIVER"; //【必要】驱动对外发布服务的名称,必须唯一 + deviceMatchAttr = "hisilicon_hi35xx_adc";//【必要】用于配置控制器私有数据,要与adc_config.hcs中对应控制器保持一致 + } // 具体的控制器信息在 adc_config.hcs 中 + } + } + } + } + ``` + + - adc\_config.hcs 配置参考。 + + ``` + root { + platform { + adc_config_hi35xx { + match_attr = "hisilicon_hi35xx_adc"; + template adc_device { + regBasePhy = 0x120e0000;//寄存器物理基地址 + regSize = 0x34; //寄存器位宽 + deviceNum = 0; //设备号 + validChannel = 0x1; //有效通道 + dataWidth = 10; //信号接收的数据位宽 + scanMode = 1; //扫描模式 + delta = 0; //delta参数 + deglitch = 0; + glitchSample = 5000; + rate = 20000; + } + device_0 :: adc_device { + deviceNum = 0; + validChannel = 0x2; + } + } + } + } + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层AdcDevice对象的初始化为核心,包括初始化厂商自定义结构体(传递参数和数据),实例化AdcDevice成员AdcMethod(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考。 + + 从驱动的角度看,自定义结构体是参数和数据的载体,而且adc\_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,其中一些重要数值也会传递给核心层AdcDevice对象,例如设备号、总线号等。 + + ``` + struct Hi35xxAdcDevice { + struct AdcDevice device;//【必要】是核心层控制对象,具体描述见下面 + volatile unsigned char *regBase;//【必要】寄存器基地址 + volatile unsigned char *pinCtrlBase; + uint32_t regBasePhy; //【必要】寄存器物理基地址 + uint32_t regSize; //【必要】寄存器位宽 + uint32_t deviceNum; //【必要】设备号 + uint32_t dataWidth; //【必要】信号接收的数据位宽 + uint32_t validChannel; //【必要】有效通道 + uint32_t scanMode; //【必要】扫描模式 + uint32_t delta; + uint32_t deglitch; + uint32_t glitchSample; + uint32_t rate; //【必要】采样率 + }; + + //AdcDevice是核心层控制器结构体,其中的成员在Init函数中会被赋值 + struct AdcDevice { + const struct AdcMethod *ops; + OsalSpinlock spin; + uint32_t devNum; + uint32_t chanNum; + const struct AdcLockMethod *lockOps; + void *priv; + }; + ``` + + - AdcDevice成员回调函数结构体AdcMethod的实例化,AdcLockMethod回调函数结构体本例未实现,若要实例化,可参考I2C驱动开发,其他成员在Init函数中初始化。 + + ``` + static const struct AdcMethod g_method = { + .read = Hi35xxAdcRead, + .stop = Hi35xxAdcStop, + .start = Hi35xxAdcStart, + }; + ``` + + - init函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + + + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

控制器对象非法

+

HDF_ERR_INVALID_PARAM

+

参数非法

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

传输成功

+

HDF_FAILURE

+

传输失败

+
+ + 函数说明: + + 初始化自定义结构体对象,初始化AdcDevice成员,并调用核心层AdcDeviceAdd函数。 + + ``` + static int32_t Hi35xxAdcInit(struct HdfDeviceObject *device) + { + int32_t ret; + struct DeviceResourceNode *childNode = NULL; + ... + //遍历、解析adc_config.hcs中的所有配置节点,并分别调用Hi35xxAdcParseInit函数来初始化device + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + ret = Hi35xxAdcParseInit(device, childNode);//函数定义见下 + ... + } + return ret; + } + + static int32_t Hi35xxAdcParseInit(struct HdfDeviceObject *device, struct DeviceResourceNode *node) + { + int32_t ret; + struct Hi35xxAdcDevice *hi35xx = NULL; //【必要】自定义结构体对象 + (void)device; + + hi35xx = (struct Hi35xxAdcDevice *)OsalMemCalloc(sizeof(*hi35xx)); //【必要】内存分配 + ... + ret = Hi35xxAdcReadDrs(hi35xx, node); //【必要】将adc_config文件的默认值填充到结构体中 + ... + hi35xx->regBase = OsalIoRemap(hi35xx->regBasePhy, hi35xx->regSize);//【必要】地址映射 + ... + hi35xx->pinCtrlBase = OsalIoRemap(HI35XX_ADC_IO_CONFIG_BASE, HI35XX_ADC_IO_CONFIG_SIZE); + ... + Hi35xxAdcDeviceInit(hi35xx); //【必要】ADC设备的初始化 + hi35xx->device.priv = (void *)node; //【必要】存储设备属性 + hi35xx->device.devNum = hi35xx->deviceNum;//【必要】初始化AdcDevice成员 + hi35xx->device.ops = &g_method; //【必要】AdcMethod的实例化对象的挂载 + ret = AdcDeviceAdd(&hi35xx->device); //【必要且重要】调用此函数填充核心层结构体,返回成功信号后驱动才完全接入平台核心层 + ... + return HDF_SUCCESS; + + __ERR__: + if (hi35xx != NULL) { //不成功的话,需要反向执行初始化相关函数 + if (hi35xx->regBase != NULL) { + OsalIoUnmap((void *)hi35xx->regBase); + hi35xx->regBase = NULL; + } + AdcDeviceRemove(&hi35xx->device); + OsalMemFree(hi35xx); + } + return ret; + } + ``` + + - Release 函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + 无。 + + 函数说明: + + 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。 + + ``` + static void Hi35xxAdcRelease(struct HdfDeviceObject *device) + { + const struct DeviceResourceNode *childNode = NULL; + ... + //遍历、解析adc_config.hcs中的所有配置节点,并分别进行release操作 + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + Hi35xxAdcRemoveByNode(childNode);//函数定义见下 + } + } + + static void Hi35xxAdcRemoveByNode(const struct DeviceResourceNode *node) + { + int32_t ret; + int32_t deviceNum; + struct AdcDevice *device = NULL; + struct Hi35xxAdcDevice *hi35xx = NULL; + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + ... + ret = drsOps->GetUint32(node, "deviceNum", (uint32_t *)&deviceNum, 0); + ... + //可以调用AdcDeviceGet函数通过设备的deviceNum获取AdcDevice对象, 以及调用AdcDeviceRemove函数来释放AdcDevice对象的内容 + device = AdcDeviceGet(deviceNum); + if (device != NULL && device->priv == node) { + AdcDevicePut(device); + AdcDeviceRemove(device); //【必要】主要是从管理器驱动那边移除AdcDevice对象 + hi35xx = (struct Hi35xxAdcDevice *)device;//【必要】通过强制转换获取自定义的对象并进行release操作 + OsalIoUnmap((void *)hi35xx->regBase); + OsalMemFree(hi35xx); + } + return + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/02.GPIO.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/02.GPIO.md" new file mode 100644 index 0000000000000000000000000000000000000000..9c1f3996df585a7197f8f72722d048edf98b8a92 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/02.GPIO.md" @@ -0,0 +1,431 @@ +--- +title: GPIO +permalink: /pages/0004010101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# GPIO + +- [概述](#section1826197354103451) +- [接口说明](#section752964871810) +- [开发步骤](#section731175315103451) +- [开发实例](#section800425816103451) + +## 概述 + +GPIO(General-purpose input/output)即通用型输入输出,在HDF框架中, + +GPIO的接口适配模式采用无服务模式,用于不需要在用户态提供API的设备类型,或者没有用户态和内核区分的OS系统,其关联方式是DevHandle直接指向设备对象内核态地址(DevHandle是一个void类型指针)。 + +**图 1** GPIO无服务模式结构图 +![](/images/device-dev/driver/figures/GPIO无服务模式结构图.png "GPIO无服务模式结构图") + +## 接口说明 + +GpioMethod定义: + +``` +struct GpioMethod { + int32_t (*request)(struct GpioCntlr *cntlr, uint16_t local);// 【可选】 + int32_t (*release)(struct GpioCntlr *cntlr, uint16_t local);// 【可选】 + int32_t (*write)(struct GpioCntlr *cntlr, uint16_t local, uint16_t val); + int32_t (*read)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *val); + int32_t (*setDir)(struct GpioCntlr *cntlr, uint16_t local, uint16_t dir); + int32_t (*getDir)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *dir); + int32_t (*toIrq)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *irq);// 【可选】 + int32_t (*setIrq)(struct GpioCntlr *cntlr, uint16_t local, uint16_t mode, GpioIrqFunc func, void *arg); + int32_t (*unsetIrq)(struct GpioCntlr *cntlr, uint16_t local); + int32_t (*enableIrq)(struct GpioCntlr *cntlr, uint16_t local); + int32_t (*disableIrq)(struct GpioCntlr *cntlr, uint16_t local); +} +``` + +**表 1** GpioMethod结构体成员的回调函数功能说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

函数成员

+

入参

+

出参

+

返回值

+

功能

+

write

+

cntlr:结构体指针,核心层GPIO控制器;local:uint16_t,GPIO端口标识号 ;val:uint16_t,电平传入值;

+

+

HDF_STATUS相关状态

+

GPIO引脚写入电平值

+

read

+

cntlr:结构体指针,核心层GPIO控制器;local:uint16_t,GPIO端口标识;

+

val:uint16_t 指针,用于传出电平值 ;

+

HDF_STATUS相关状态

+

GPIO引脚读取电平值

+

setDir

+

cntlr:结构体指针,核心层GPIO控制器;local:uint16_t,GPIO端口标识号 ;dir:uint16_t,管脚方向传入值;

+

+

HDF_STATUS相关状态

+

设置GPIO引脚输入/输出方向

+

getDir

+

cntlr:结构体指针,核心层GPIO控制器;local:uint16_t,GPIO端口标识号 ;

+

dir:uint16_t 指针,用于传出管脚方向值 ;

+

HDF_STATUS相关状态

+

读GPIO引脚输入/输出方向

+

setIrq

+

cntlr:结构体指针,核心层GPIO控制器;local:uint16_t,GPIO端口标识号;mode:uint16_t,表示触发模式(边沿或电平);func:函数指针,中断服务程序 ;arg:void指针,中断服务程序入参;

+

+

HDF_STATUS相关状态

+

将GPIO引脚设置为中断模式

+

unsetIrq

+

cntlr:结构体指针,核心层GPIO控制器;local:uint16_t,GPIO端口标识号 ;

+

+

HDF_STATUS相关状态

+

取消GPIO中断设置

+

enableIrq

+

cntlr:结构体指针,核心层GPIO控制器;local:uint16_t,GPIO端口标识号;

+

+

HDF_STATUS相关状态

+

使能GPIO管脚中断

+

disableIrq

+

cntlr:结构体指针,核心层GPIO控制器;local:uint16_t,GPIO端口标识号;

+

+

HDF_STATUS相关状态

+

禁止GPIO管脚中断

+
+ +## 开发步骤 + +GPIO模块适配的三个环节是配置属性文件,实例化驱动入口,以及实例化核心层接口函数。GPIO控制器分组管理所有管脚,相关参数会在属性文件中有所体现;驱动入口和接口函数的实例化环节是厂商驱动接入HDF的核心环节。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加gpio\_config.hcs器件属性文件。 + +3. **实例化GPIO控制器对象:** + - 初始化GpioCntlr成员。 + - 实例化GpioCntlr成员GpioMethod。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化GpioCntlr成员GpioMethod,详见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如GPIO控制状态,中断响应情况等。 + + +## 开发实例 + +下方将以gpio\_hi35xx.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 + + 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + GPIO 驱动入口参考: + + ``` + struct HdfDriverEntry g_gpioDriverEntry = { + .moduleVersion = 1, + .Bind = Pl061GpioBind, //GPIO不需要实现Bind,本例是一个空实现,厂商可根据自身需要添加相关操作 + .Init = Pl061GpioInit, //见Init参考 + .Release = Pl061GpioRelease, //见Release参考 + .moduleName = "hisi_pl061_driver",//【必要且需要与HCS文件中里面的moduleName匹配】 + }; + //调用HDF_INIT将驱动入口注册到HDF框架中 + HDF_INIT(g_gpioDriverEntry); + ``` + +2. 完成驱动入口注册之后,下一步请在device\_info.hcs文件中添加deviceNode信息,并在 gpio\_config.hcs 中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值与核心层GpioCntlr 成员的默认值或限制范围有密切关系。 + + 本例只有一个GPIO控制器,如有多个器件信息,则需要在device\_info文件增加deviceNode信息,以及在gpio\_config文件中增加对应的器件属性。 + + - device\_info.hcs 配置参考。 + + ``` + root { + device_info { + platform :: host { + hostName = "platform_host"; + priority = 50; + device_gpio :: device { + device0 :: deviceNode { + policy = 0; // 等于0,不需要发布服务 + priority = 10; // 驱动启动优先级 + permission = 0644; // 驱动创建设备节点权限 + moduleName = "hisi_pl061_driver"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致; + deviceMatchAttr = "hisilicon_hi35xx_pl061";//【必要】用于配置控制器私有数据,要与 gpio_config.hcs 中 + //对应控制器保持一致,其他控制器信息也在文件中 + } + } + } + } + } + ``` + + - gpio\_config.hcs 配置参考。 + + ``` + root { + platform { + gpio_config { + controller_0x120d0000 { + match_attr = "hisilicon_hi35xx_pl061"; //【必要】必须和device_info.hcs中的deviceMatchAttr值一致 + groupNum = 12; //【必要】GPIO组索引 需要根据设备情况填写 + bitNum = 8; //【必要】每组GPIO管脚数 + regBase = 0x120d0000;//【必要】物理基地址 + regStep = 0x1000; //【必要】寄存器偏移步进 + irqStart = 48; //【必要】开启中断 + irqShare = 0; //【必要】共享中断 + } + } + } + } + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层GpioCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化GpioCntlr成员GpioMethod(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考。 + + 从驱动的角度看,自定义结构体是参数和数据的载体,而且gpio\_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,其中一些重要数值也会传递给核心层GpioCntlr对象,例如索引、管脚数等。 + + ``` + struct Pl061GpioCntlr { + struct GpioCntlr cntlr;//【必要】 是核心层控制对象,其成员定义见下面 + volatile unsigned char *regBase; //【必要】寄存器基地址 + uint32_t phyBase; //【必要】 物理基址 + uint32_t regStep; //【必要】 寄存器偏移步进 + uint32_t irqStart; //【必要】 中断开启 + uint16_t groupNum; //【必要】 用于描述厂商的GPIO端口号的参数 + uint16_t bitNum; //【必要】 用于描述厂商的GPIO端口号的参数 + uint8_t irqShare; //【必要】 共享中断 + struct Pl061GpioGroup *groups; //【可选】 根据厂商需要设置 + }; + struct Pl061GpioGroup { //包括寄存器地址,中断号,中断函数和和锁 + volatile unsigned char *regBase; + unsigned int index; + unsigned int irq; + OsalIRQHandle irqFunc; + OsalSpinlock lock; + }; + + // GpioCntlr是核心层控制器结构体,其中的成员在Init函数中会被赋值 + struct GpioCntlr { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + struct GpioMethod *ops; + struct DListHead list; + OsalSpinlock spin; + uint16_t start; + uint16_t count; + struct GpioInfo *ginfos; + void *priv; + }; + ``` + + - GpioCntlr成员回调函数结构体GpioMethod的实例化,其他成员在Init函数中初始化。 + + ``` + //GpioMethod结构体成员都是回调函数,厂商需要根据表1完成相应的函数功能。 + static struct GpioMethod g_method = { + .request = NULL, + .release = NULL, + .write = Pl061GpioWrite, //写管脚 + .read = Pl061GpioRead, //读管脚 + .setDir = Pl061GpioSetDir, //设置管脚方向 + .getDir = Pl061GpioGetDir, //获取管脚方向 + .toIrq = NULL, + .setIrq = Pl061GpioSetIrq, //设置管脚中断,如不具备此能力可忽略 + .unsetIrq = Pl061GpioUnsetIrq, //取消管脚中断设置,如不具备此能力可忽略 + .enableIrq = Pl061GpioEnableIrq, //使能管脚中断,如不具备此能力可忽略 + .disableIrq = Pl061GpioDisableIrq,//禁止管脚中断,如不具备此能力可忽略 + }; + ``` + + - Init函数参考 + + 入参: + + HdfDeviceObject这个是整个驱动对外暴露的接口参数,具备HCS配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态(下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + **表 2** Init函数说明 + + + + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

控制器对象非法

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_INVALID_PARAM

+

参数非法

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

初始化成功

+

HDF_FAILURE

+

初始化失败

+
+ + 函数说明: + + 初始化自定义结构体对象,初始化GpioCntlr成员,调用核心层GpioCntlrAdd函数,【可选】接入VFS。 + + ``` + static int32_t Pl061GpioInit(struct HdfDeviceObject *device) + { + ... + struct Pl061GpioCntlr *pl061 = &g_pl061;//利用静态全局变量完成初始化 + //static struct Pl061GpioCntlr g_pl061 = { + // .groups = NULL, + // .groupNum = PL061_GROUP_MAX, + // .bitNum = PL061_BIT_MAX, + //}; + ret = Pl061GpioReadDrs(pl061, device->property);//利用从gpio_config.HCS文件读取的属性值来初始化自定义结构体对象成员 + ... + pl061->regBase = OsalIoRemap(pl061->phyBase, pl061->groupNum * pl061->regStep);//地址映射 + ... + ret = Pl061GpioInitCntlrMem(pl061); // 内存分配 + ... + pl061->cntlr.count = pl061->groupNum * pl061->bitNum;//【必要】管脚数量计算 + pl061->cntlr.priv = (void *)device->property; //【必要】存储设备属性 + pl061->cntlr.ops = &g_method; // 【必要】GpioMethod的实例化对象的挂载 + pl061->cntlr.device = device; // 【必要】使HdfDeviceObject与GpioCntlr可以相互转化的前提 + ret = GpioCntlrAdd(&pl061->cntlr); // 【必要】调用此函数填充核心层结构体,返回成功信号后驱动才完全接入平台核心层 + ... + Pl061GpioDebugCntlr(pl061); + #ifdef PL061_GPIO_USER_SUPPORT //【可选】若支持用户级的虚拟文件系统,则接入 + if (GpioAddVfs(pl061->bitNum) != HDF_SUCCESS) { + HDF_LOGE("%s: add vfs fail!", __func__); + } + #endif + ... + } + ``` + + - Release 函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + 无。 + + 函数说明: + + 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。 + + ``` + static void Pl061GpioRelease(struct HdfDeviceObject *device) + { + struct GpioCntlr *cntlr = NULL; + struct Pl061GpioCntlr *pl061 = NULL; + ... + cntlr = GpioCntlrFromDevice(device);//【必要】通过强制转换获取核心层控制对象 + //return (device == NULL) ? NULL : (struct GpioCntlr *)device->service; + ... + #ifdef PL061_GPIO_USER_SUPPORT + GpioRemoveVfs();//与Init中GpioAddVfs相反 + #endif + GpioCntlrRemove(cntlr); //【必要】取消设备信息、服务等内容在核心层上的挂载 + pl061 = ToPl061GpioCntlr(cntlr); //return (struct Pl061GpioCntlr *)cntlr; + Pl061GpioRleaseCntlrMem(pl061); //【必要】锁和内存的释放 + OsalIoUnmap((void *)pl061->regBase);//【必要】解除地址映射 + pl061->regBase = NULL; + } + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/03.I2C.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/03.I2C.md" new file mode 100644 index 0000000000000000000000000000000000000000..a72456a4deb7d56c1a3c44947481ffb532ff1d34 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/03.I2C.md" @@ -0,0 +1,414 @@ +--- +title: I2C +permalink: /pages/0004010102 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# I2C + +- [概述](#section2040078630114257) +- [接口说明](#section752964871810) +- [开发步骤](#section1085786591114257) +- [开发实例](#section1773332551114257) + +## 概述 + +I2C\(Inter Integrated Circuit\)总线是由Philips公司开发的一种简单、双向二线制同步串行总线,在HDF框架中,I2C模块接口适配模式采用统一服务模式,这需要一个设备服务来作为I2C模块的管理器,统一处理外部访问,这会在配置文件中有所体现。统一服务模式适合于同类型设备对象较多的情况,如I2C可能同时具备十几个控制器,采用独立服务模式需要配置更多的设备节点,且服务会占据内存资源。 + +**图 1** I2C统一服务模式结构图 +![](/images/device-dev/driver/figures/I2C统一服务模式结构图.png "I2C统一服务模式结构图") + +## 接口说明 + +I2cMethod和I2cLockMethod定义: + +``` +struct I2cMethod { +int32_t (*transfer)(struct I2cCntlr *cntlr, struct I2cMsg *msgs, int16_t count); +}; +struct I2cLockMethod {//锁机制操作结构体 + int32_t (*lock)(struct I2cCntlr *cntlr);//加锁 + void (*unlock)(struct I2cCntlr *cntlr); //解锁 +}; +``` + +**表 1** I2cMethod结构体成员的回调函数功能说明 + + + + + + + + + + + + + + + + +

函数成员

+

入参

+

出参

+

返回值

+

功能

+

transfer

+

cntlr:结构体指针,核心层I2C控制器;msgs:结构体指针,用户消息 ;count:uint16_t,消息数量

+

+

HDF_STATUS相关状态

+

传递用户消息

+
+ +## 开发步骤 + +I2C模块适配的三个环节是配置属性文件,实例化驱动入口,以及实例化核心层接口函数。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加i2c\_config.hcs器件属性文件。 + +3. **实例化I2C控制器对象:** + - 初始化I2cCntlr成员。 + - 实例化I2cCntlr成员I2cMethod和I2cLockMethod。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化I2cCntlr成员I2cMethod和I2cLockMethod,详见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如挂载后的信息反馈,消息传输的成功与否等。 + + +## 开发实例 + +下方将以i2c\_hi35xx.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 + + 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + I2C驱动入口参考: + + I2C模块这种类型的控制器会出现很多个设备挂接的情况,因而在HDF框架中首先会为这类型的设备创建一个管理器对象,并同时对外发布一个管理器服务来统一处理外部访问。这样,用户需要打开某个设备时,会先获取到管理器服务,然后管理器服务根据用户指定参数查找到指定设备。 + + I2C管理器服务的驱动由核心层实现,厂商不需要关注这部分内容的实现,这个但在实现Init函数的时候需要调用核心层的I2cCntlrAdd函数,它会实现相应功能。 + + ``` + struct HdfDriverEntry g_i2cDriverEntry = { + .moduleVersion = 1, + .Init = Hi35xxI2cInit, + .Release = Hi35xxI2cRelease, + .moduleName = "hi35xx_i2c_driver",//【必要且与config.hcs文件里面匹配】 + }; + HDF_INIT(g_i2cDriverEntry); //调用HDF_INIT将驱动入口注册到HDF框架中 + + //核心层i2c_core.c 管理器服务的驱动入口 + struct HdfDriverEntry g_i2cManagerEntry = { + .moduleVersion = 1, + .Bind = I2cManagerBind, + .Init = I2cManagerInit, + .Release = I2cManagerRelease, + .moduleName = "HDF_PLATFORM_I2C_MANAGER",//这与device_info文件中device0对应 + }; + HDF_INIT(g_i2cManagerEntry); + ``` + +2. 完成驱动入口注册之后,下一步请在device\_info.hcs文件中添加deviceNode信息,并在i2c\_config.hcs中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值对于厂商驱动的实现以及核心层I2cCntlr相关成员的默认值或限制范围有密切关系。 + + 统一服务模式的特点是device\_info文件中第一个设备节点必须为I2C管理器,其各项参数必须如[表2](#table96651915911)设置: + + **表 2** 统一服务模式的特点 + + + + + + + + + + + + + + + + + + + +

成员名

+

+

moduleName

+

固定为 HDF_PLATFORM_I2C_MANAGER

+

serviceName

+

固定为 HDF_PLATFORM_I2C_MANAGER

+

policy

+

具体配置为1或2取决于是否对用户态可见

+

deviceMatchAttr

+

没有使用,可忽略

+
+ + 从第二个节点开始配置具体I2C控制器信息,此节点并不表示某一路I2C控制器,而是代表一个资源性质设备,用于描述一类I2C控制器的信息。多个控制器之间相互区分的参数是busID和reg\_pbase,这在i2c\_config文件中有所体现。 + + - device\_info.hcs 配置参考。 + + ``` + root { + device_info { + match_attr = "hdf_manager"; + device_i2c :: device { + device0 :: deviceNode { + policy = 2; + priority = 50; + permission = 0644; + moduleName = "HDF_PLATFORM_I2C_MANAGER"; + serviceName = "HDF_PLATFORM_I2C_MANAGER"; + deviceMatchAttr = "hdf_platform_i2c_manager"; + } + device1 :: deviceNode { + policy = 0; // 等于0,不需要发布服务 + priority = 55; // 驱动启动优先级 + permission = 0644; // 驱动创建设备节点权限 + moduleName = "hi35xx_i2c_driver"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致; + serviceName = "HI35XX_I2C_DRIVER"; //【必要】驱动对外发布服务的名称,必须唯一 + deviceMatchAttr = "hisilicon_hi35xx_i2c";//【必要】用于配置控制器私有数据,要与i2c_config.hcs中对应控制器保持一致 + // 具体的控制器信息在 i2c_config.hcs 中 + } + } + } + } + ``` + + - i2c\_config.hcs 配置参考。 + + ``` + root { + platform { + i2c_config { + match_attr = "hisilicon_hi35xx_i2c";//【必要】需要和device_info.hcs中的deviceMatchAttr值一致 + template i2c_controller { //模板公共参数,继承该模板的节点如果使用模板中的默认值,则节点字段可以缺省 + bus = 0; //【必要】i2c 识别号 + reg_pbase = 0x120b0000; //【必要】物理基地址 + reg_size = 0xd1; //【必要】寄存器位宽 + irq = 0; //【可选】根据厂商需要来使用 + freq = 400000; //【可选】根据厂商需要来使用 + clk = 50000000; //【可选】根据厂商需要来使用 + } + controller_0x120b0000 :: i2c_controller { + bus = 0; + } + controller_0x120b1000 :: i2c_controller { + bus = 1; + reg_pbase = 0x120b1000; + } + ... + } + } + } + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层I2cCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化I2cCntlr成员I2cMethod(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考 + + 从驱动的角度看,自定义结构体是参数和数据的载体,而且i2c\_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,其中一些重要数值也会传递给核心层I2cCntlr对象,例如设备号、总线号等。 + + ``` + // 厂商自定义功能结构体 + struct Hi35xxI2cCntlr { + struct I2cCntlr cntlr; //【必要】是核心层控制对象,具体描述见下面 + OsalSpinlock spin; //【必要】厂商需要基于此锁变量对各个 i2c 操作函数实现对应的加锁解锁 + volatile unsigned char *regBase; //【必要】寄存器基地址 + uint16_t regSize; //【必要】寄存器位宽 + int16_t bus; //【必要】i2c_config.hcs 文件中可读取具体值 + uint32_t clk; //【可选】厂商自定义 + uint32_t freq; //【可选】厂商自定义 + uint32_t irq; //【可选】厂商自定义 + uint32_t regBasePhy; //【必要】寄存器物理基地址 + }; + + // I2cCntlr是核心层控制器结构体,其中的成员在Init函数中会被赋值 + struct I2cCntlr { + struct OsalMutex lock; + void *owner; + int16_t busId; + void *priv; + const struct I2cMethod *ops; + const struct I2cLockMethod *lockOps; + }; + ``` + + - I2cCntlr成员回调函数结构体I2cMethod的实例化,和锁机制回调函数结构体I2cLockMethod实例化,其他成员在Init函数中初始化。 + + ``` + // i2c_hi35xx.c 中的示例 + static const struct I2cMethod g_method = { + .transfer = Hi35xxI2cTransfer, + }; + + static const struct I2cLockMethod g_lockOps = { + .lock = Hi35xxI2cLock, //加锁函数 + .unlock = Hi35xxI2cUnlock,//解锁函数 + }; + ``` + + - init函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + **表 3** init函数入参及返回值参考 + + + + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

控制器对象非法

+

HDF_ERR_INVALID_PARAM

+

参数非法

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

传输成功

+

HDF_FAILURE

+

传输失败

+
+ + 函数说明: + + 初始化自定义结构体对象,初始化I2cCntlr成员,调用核心层I2cCntlrAdd函数,【可选】接入VFS。 + + ``` + static int32_t Hi35xxI2cInit(struct HdfDeviceObject *device) + { + ... + //遍历、解析 i2c_config.hcs 中的所有配置节点,并分别进行初始化,需要调用Hi35xxI2cParseAndInit函数 + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + ret = Hi35xxI2cParseAndInit(device, childNode);//函数定义见下 + ... + } + ... + } + + static int32_t Hi35xxI2cParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) + { + struct Hi35xxI2cCntlr *hi35xx = NULL; + ... + hi35xx = (struct Hi35xxI2cCntlr *)OsalMemCalloc(sizeof(*hi35xx)); // 内存分配 + ... + hi35xx->regBase = OsalIoRemap(hi35xx->regBasePhy, hi35xx->regSize); // 地址映射 + ... + Hi35xxI2cCntlrInit(hi35xx); // 【必要】i2c设备的初始化 + + hi35xx->cntlr.priv = (void *)node; //【必要】存储设备属性 + hi35xx->cntlr.busId = hi35xx->bus; //【必要】初始化I2cCntlr成员busId + hi35xx->cntlr.ops = &g_method; //【必要】I2cMethod的实例化对象的挂载 + hi35xx->cntlr.lockOps = &g_lockOps; //【必要】I2cLockMethod的实例化对象的挂载 + (void)OsalSpinInit(&hi35xx->spin); //【必要】锁的初始化 + ret = I2cCntlrAdd(&hi35xx->cntlr); //【必要】调用此函数填充核心层结构体,返回成功信号后驱动才完全接入平台核心层 + ... + #ifdef USER_VFS_SUPPORT + (void)I2cAddVfsById(hi35xx->cntlr.busId);//【可选】若支持用户级的虚拟文件系统,则接入 + #endif + return HDF_SUCCESS; + __ERR__: //不成功的话,需要反向执行初始化相关函数 + if (hi35xx != NULL) { + if (hi35xx->regBase != NULL) { + OsalIoUnmap((void *)hi35xx->regBase); + hi35xx->regBase = NULL; + } + OsalMemFree(hi35xx); + hi35xx = NULL; + } + return ret; + } + ``` + + - Release 函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + 无。 + + 函数说明: + + 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。 + + ``` + static void Hi35xxI2cRelease(struct HdfDeviceObject *device) + { + ... + //与Hi35xxI2cInit一样,需要将对每个节点分别进行释放 + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + Hi35xxI2cRemoveByNode(childNode);//函数定义见下 + } + } + + static void Hi35xxI2cRemoveByNode(const struct DeviceResourceNode *node) + { + ... + //【必要】可以调用 I2cCntlrGet 函数通过设备的 busid 获取 I2cCntlr 对象, 以及调用 I2cCntlrRemove 函数来释放 I2cCntlr 对象的内容 + cntlr = I2cCntlrGet(bus); + if (cntlr != NULL && cntlr->priv == node) { + ... + I2cCntlrRemove(cntlr); + //【必要】解除地址映射,锁和内存的释放 + hi35xx = (struct Hi35xxI2cCntlr *)cntlr; + OsalIoUnmap((void *)hi35xx->regBase); + (void)OsalSpinDestroy(&hi35xx->spin); + OsalMemFree(hi35xx); + } + return; + } + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/04.MIPI-DSI.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/04.MIPI-DSI.md" new file mode 100644 index 0000000000000000000000000000000000000000..e97f01263729e1d31c3362ecf46cb9f489df515f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/04.MIPI-DSI.md" @@ -0,0 +1,352 @@ +--- +title: MIPI-DSI +permalink: /pages/0004010103 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# MIPI-DSI + +- [概述](#section1266787503161538) +- [接口说明](#section752964871810) +- [开发步骤](#section545182932161538) +- [开发实例](#section1167576616161538) + +## 概述 + +DSI(Display Serial Interface)是由移动行业处理器接口联盟(Mobile Industry Processor Interface \(MIPI\) Alliance)制定的规范。在HDF框架中,MIPI-DSI的接口适配模式采用无服务模式,用于不需要在用户态提供API的设备类型,或者没有用户态和内核区分的OS系统,其关联方式是DevHandle直接指向设备对象内核态地址(DevHandle是一个void类型指针)。 + +**图 1** DSI无服务模式结构图 +![](/images/device-dev/driver/figures/DSI无服务模式结构图.png "DSI无服务模式结构图") + +## 接口说明 + +MipiDsiCntlrMethod定义: + +``` +struct MipiDsiCntlrMethod { // 核心层结构体的成员函数 + int32_t (*setCntlrCfg)(struct MipiDsiCntlr *cntlr); + int32_t (*setCmd)(struct MipiDsiCntlr *cntlr, struct DsiCmdDesc *cmd); + int32_t (*getCmd)(struct MipiDsiCntlr *cntlr, struct DsiCmdDesc *cmd, uint32_t readLen, uint8_t *out); + void (*toHs)(struct MipiDsiCntlr *cntlr); + void (*toLp)(struct MipiDsiCntlr *cntlr); + void (*enterUlps)(struct MipiDsiCntlr *cntlr);//【可选】进入超低功耗模式 + void (*exitUlps)(struct MipiDsiCntlr *cntlr); //【可选】退出超低功耗模式 + int32_t (*powerControl)(struct MipiDsiCntlr *cntlr, uint8_t enable);//【可选】使能/去使能功耗控制 + int32_t (*attach)(struct MipiDsiCntlr *cntlr);//【可选】将一个DSI设备连接上host +}; +``` + +**表 1** MipiDsiCntlrMethod成员的回调函数功能说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

成员函数

+

入参

+

出参

+

返回状态

+

功能

+

setCntlrCfg

+

cntlr: 结构体指针,MipiDsi控制器 ;

+

+

HDF_STATUS相关状态

+

设置控制器参数

+

setCmd

+

cntlr: 结构体指针,MipiDsi控制器 ;cmd: 结构体指针,指令传入值

+

+

HDF_STATUS相关状态

+

向显示设备发送指令

+

getCmd

+

cntlr: 结构体指针,MipiDsi控制器 ;

+

cmd: 结构体指针,用于传出指令值;

+

HDF_STATUS相关状态

+

从显示设备读取信息指令

+

toHs

+

cntlr: 结构体指针,MipiDsi控制器 ;

+

+

HDF_STATUS相关状态

+

设置为高速模式

+

toLp

+

cntlr: 结构体指针,MipiDsi控制器 ;

+

+

HDF_STATUS相关状态

+

设置为低电模式

+
+ +## 开发步骤 + +MIPI-DSI模块适配的三个环节是配置属性文件,实例化驱动入口,以及实例化核心层接口函数。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加mipidsi\_config.hcs器件属性文件。 + +3. **实例化MIPIDSI控制器对象:** + - 初始化MipiDsiCntlr成员。 + - 实例化MipiDsiCntlr成员MipiDsiCntlrMethod。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化MipiDsiCntlr成员MipiDsiCntlrMethod,其定义和成员说明见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如挂载后的信息反馈,数据传输的成功与否等。 + + +## 开发实例 + +下方将以mipi\_tx\_hi35xx.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 一般来说,驱动开发首先需要在 xx\_config.hcs 中配置器件属性,并在device\_info.hcs文件中添加deviceNode描述。器件属性值与核心层MipiDsiCntlr 成员的默认值或限制范围有密切关系,deviceNode信息与驱动入口注册相关。 + + 但本例中MIPI控制器无需配置额外属性,如有厂商需要,则需要在device\_info文件的deviceNode增加deviceMatchAttr信息,以及增加mipidsi\_config文件。 + + device\_info.hcs 配置参考: + + ``` + root { + device_info { + match_attr = "hdf_manager"; + platform :: host { + hostName = "platform_host"; + priority = 50; + device_mipi_dsi:: device { + device0 :: deviceNode { + policy = 0; + priority = 150; + permission = 0644; + moduleName = "HDF_MIPI_TX"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致; + serviceName = "HDF_MIPI_TX"; // 【必要且唯一】驱动对外发布服务的名称 + } + } + } + } + } + ``` + +2. 完成器件属性文件的配置之后,下一步请实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HdfDriverEntry结构体的函数指针成员会被厂商操作函数填充,HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组,方便调用。 + + 一般在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + - MIPI-DSI驱动入口参考。 + + ``` + struct HdfDriverEntry g_mipiTxDriverEntry = { + .moduleVersion = 1, + .Init = Hi35xxMipiTxInit, //见Init参考 + .Release = Hi35xxMipiTxRelease,//见Release参考 + .moduleName = "HDF_MIPI_TX", //【必要】需要与device_info.hcs 中保持一致。 + }; + HDF_INIT(g_mipiTxDriverEntry); //调用HDF_INIT将驱动入口注册到HDF框架中 + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层MipiDsiCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化MipiDsiCntlr成员MipiDsiCntlrMethod(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考。 + + 从驱动的角度看,自定义结构体是参数和数据的载体,一般来说,config文件中的数值也会用来初始化结构体成员,但本例的mipidsi无器件属性文件,故基本成员结构与MipiDsiCntlr无太大差异。 + + ``` + typedef struct { + unsigned int devno; // 设备号 + short laneId[LANE_MAX_NUM]; // lane号 + OutPutModeTag outputMode; // 输出模式选择:刷新模式,命令行模式和视频流模式 + VideoModeTag videoMode; // 显示设备的同步模式 + OutputFormatTag outputFormat; // 输出DSI图像数据格式:RGB or YUV + SyncInfoTag syncInfo; // 时序相关的设置 + unsigned int phyDataRate; // mbps + unsigned int pixelClk; // KHz + } ComboDevCfgTag; + + // MipiDsiCntlr是核心层控制器结构体,其中的成员在Init函数中会被赋值 + struct MipiDsiCntlr { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + unsigned int devNo; // 设备号 + struct MipiCfg cfg; + struct MipiDsiCntlrMethod *ops; + struct OsalMutex lock; + void *priv; + }; + ``` + + - MipiDsiCntlr成员回调函数结构体MipiDsiCntlrMethod的实例化,其他成员在Init函数中初始化。 + + ``` + static struct MipiDsiCntlrMethod g_method = { + .setCntlrCfg = Hi35xxSetCntlrCfg, + .setCmd = Hi35xxSetCmd, + .getCmd = Hi35xxGetCmd, + .toHs = Hi35xxToHs, + .toLp = Hi35xxToLp, + }; + ``` + + - Init函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + + + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

无效对象

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_INVALID_PARAM

+

无效参数

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

执行成功

+

HDF_FAILURE

+

执行失败

+
+ + 函数说明: + + MipiDsiCntlrMethod的实例化对象的挂载,调用MipiDsiRegisterCntlr,以及其他厂商自定义初始化操作。 + + ``` + static int32_t Hi35xxMipiTxInit(struct HdfDeviceObject *device) + { + int32_t ret; + g_mipiTx.priv = NULL; //g_mipiTx是定义的全局变量 + //static struct MipiDsiCntlr g_mipiTx { + // .devNo=0 + //}; + g_mipiTx.ops = &g_method;//MipiDsiCntlrMethod的实例化对象的挂载 + ret = MipiDsiRegisterCntlr(&g_mipiTx, device);//【必要】调用核心层函数和g_mipiTx初始化核心层全局变量 + ... + return MipiTxDrvInit(0); //【必要】厂商对设备的初始化,形式不限 + } + + //mipi_dsi_core.c核心层 + int32_t MipiDsiRegisterCntlr(struct MipiDsiCntlr *cntlr, struct HdfDeviceObject *device) + { + ... + //定义的全局变量:static struct MipiDsiHandle g_mipiDsihandle[MAX_CNTLR_CNT]; + if (g_mipiDsihandle[cntlr->devNo].cntlr == NULL) { + (void)OsalMutexInit(&g_mipiDsihandle[cntlr->devNo].lock); + (void)OsalMutexInit(&(cntlr->lock)); + + g_mipiDsihandle[cntlr->devNo].cntlr = cntlr;//初始化MipiDsiHandle成员 + g_mipiDsihandle[cntlr->devNo].priv = NULL; + cntlr->device = device; //使HdfDeviceObject与MipiDsiHandle可以相互转化的前提 + device->service = &(cntlr->service); //使HdfDeviceObject与MipiDsiHandle可以相互转化的前提 + cntlr->priv = NULL; + ... + return HDF_SUCCESS; + } + ... + return HDF_FAILURE; + } + ``` + + - Release函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + 无。 + + 函数说明: + + 该函数需要在驱动入口结构体中赋值给 Release 接口, 当 HDF 框架调用 Init 函数初始化驱动失败时,可以调用 Release 释放驱动资源, 该函数中需包含释放内存和删除控制器等操作。所有强制转换获取相应对象的操作前提是在Init函数中具备对应赋值的操作。 + + ``` + static void Hi35xxMipiTxRelease(struct HdfDeviceObject *device) + { + struct MipiDsiCntlr *cntlr = NULL; + ... + cntlr = MipiDsiCntlrFromDevice(device);//这里有HdfDeviceObject到MipiDsiCntlr的强制转化 + //return (device == NULL) ? NULL : (struct MipiDsiCntlr *)device->service; + ... + MipiTxDrvExit(); //【必要】对厂商设备所占资源的释放 + MipiDsiUnregisterCntlr(&g_mipiTx); //空函数 + g_mipiTx.priv = NULL; + HDF_LOGI("%s: unload mipi_tx driver 1212!", __func__); + } + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/05.MMC.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/05.MMC.md" new file mode 100644 index 0000000000000000000000000000000000000000..735a2504c1a41615aa8aec416b857ccaded84783 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/05.MMC.md" @@ -0,0 +1,565 @@ +--- +title: MMC +permalink: /pages/0004010104 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# MMC + +- [概述](#section1846388309162704) +- [接口说明](#section752964871810) +- [开发步骤](#section1617495117162704) +- [开发实例](#section1220893490162704) + +## 概述 + +MMC(MultiMedia Card),即多媒体卡,在HDF框架中,MMC的接口适配模式采用独立服务模式,在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用。 + +**图 1** MMC独立服务模式结构图 +![](/images/device-dev/driver/figures/MMC独立服务模式结构图.png "MMC独立服务模式结构图") + +## 接口说明 + +MmcCntlrOps定义: + +``` +struct MmcCntlrOps { + int32_t (*request)(struct MmcCntlr *cntlr, struct MmcCmd *cmd); + int32_t (*setClock)(struct MmcCntlr *cntlr, uint32_t clock); + int32_t (*setPowerMode)(struct MmcCntlr *cntlr, enum MmcPowerMode mode); + int32_t (*setBusWidth)(struct MmcCntlr *cntlr, enum MmcBusWidth width); + int32_t (*setBusTiming)(struct MmcCntlr *cntlr, enum MmcBusTiming timing); + int32_t (*setSdioIrq)(struct MmcCntlr *cntlr, bool enable); + int32_t (*hardwareReset)(struct MmcCntlr *cntlr); + int32_t (*systemInit)(struct MmcCntlr *cntlr); + int32_t (*setEnhanceSrobe)(struct MmcCntlr *cntlr, bool enable); + int32_t (*switchVoltage)(struct MmcCntlr *cntlr, enum MmcVolt volt); + bool (*devReadOnly)(struct MmcCntlr *cntlr); + bool (*devPluged)(struct MmcCntlr *cntlr); + bool (*devBusy)(struct MmcCntlr *cntlr); + int32_t (*tune)(struct MmcCntlr *cntlr, uint32_t cmdCode); + int32_t (*rescanSdioDev)(struct MmcCntlr *cntlr); +}; +``` + +**表 1** MmcCntlrOps结构体成员的回调函数功能说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

成员函数

+

入参

+

返回值

+

功能

+

doRequest

+

cntlr: 核心层结构体指针;mmc控制器 ;cmd: 结构体指针,传入命令值

+

HDF_STATUS相关状态

+

request相应处理

+

setClock

+

cntlr: 核心层结构体指针;mmc控制器 ;clock: 时钟传入值

+

HDF_STATUS相关状态

+

设置时钟频率

+

setPowerMode

+

cntlr: 核心层结构体指针;mmc控制器 ;mode: 枚举值(见MmcPowerMode定义),功耗模式

+

HDF_STATUS相关状态

+

设置功耗模式

+

setBusWidth

+

cntlr: 核心层结构体指针;mmc控制器 ;width: 枚举值(见MmcBusWidth定义),总线带宽

+

HDF_STATUS相关状态

+

设置总线带宽

+

setBusTiming

+

cntlr: 核心层结构体指针;mmc控制器 ;timing: 枚举值(见MmcBusTiming定义),总线时序

+

HDF_STATUS相关状态

+

设置总线时序

+

setSdioIrq

+

cntlr: 核心层结构体指针;mmc控制器 ;enable: 布尔值,控制中断

+

HDF_STATUS相关状态

+

使能/去使能SDIO中断

+

hardwareReset

+

cntlr: 核心层结构体指针;mmc控制器 ;

+

HDF_STATUS相关状态

+

复位硬件

+

systemInit

+

cntlr: 核心层结构体指针;mmc控制器 ;

+

HDF_STATUS相关状态

+

系统初始化

+

setEnhanceSrobe

+

cntlr: 核心层结构体指针,mmc控制器 ;enable: 布尔值,设置功能

+

HDF_STATUS相关状态

+

设置增强选通

+

switchVoltage

+

cntlr: 核心层结构体指针;mmc控制器 ;volt: 枚举值,电压值(3.3,1.8,1.2V);

+

HDF_STATUS相关状态

+

设置电压值

+

devReadOnly

+

cntlr: 核心层结构体指针;mmc控制器 ;

+

布尔值

+

检验设备是否只读

+

cardPluged

+

cntlr: 核心层结构体指针;mmc控制器 ;

+

布尔值

+

检验设备是否拔出

+

devBusy

+

cntlr: 核心层结构体指针;mmc控制器 ;

+

布尔值

+

检验设备是否忙碌

+

tune

+

cntlr: 核心层结构体指针;mmc控制器 ;cmdCode: uint32_t,命令代码;

+

HDF_STATUS相关状态

+

调谐

+

rescanSdioDev

+

cntlr: 核心层结构体指针;mmc控制器 ;

+

HDF_STATUS相关状态

+

扫描并添加SDIO设备

+
+ +## 开发步骤 + +MMC模块适配的三个环节是配置属性文件,实例化驱动入口,以及实例化核心层接口函数。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加mmc\_config.hcs器件属性文件。 + +3. **实例化MMC控制器对象:** + - 初始化MmcCntlr成员。 + - 实例化MmcCntlr成员MmcCntlrOps。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化MmcCntlr成员MmcCntlrOps,其定义和成员说明见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如挂载后的信息反馈,设备启动是否成功等。 + + +## 开发实例 + +下方将以himci.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 + + 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + MMC驱动入口参考: + + ``` + struct HdfDriverEntry g_mmcDriverEntry = { + .moduleVersion = 1, + .Bind = HimciMmcBind, //见Bind参考 + .Init = HimciMmcInit, //见Init参考 + .Release = HimciMmcRelease, //见Release参考 + .moduleName = "hi3516_mmc_driver",//【必要且与HCS文件中里面的moduleName匹配】 + }; + HDF_INIT(g_mmcDriverEntry); //调用HDF_INIT将驱动入口注册到HDF框架中 + ``` + +2. 完成驱动入口注册之后,下一步请在device\_info.hcs文件中添加deviceNode信息,并在mmc\_config.hcs中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值与核心层MmcCntlr成员的默认值或限制范围有密切关系。 + + 如有多个器件信息,则需要在device\_info文件增加deviceNode信息,以及在mmc\_config文件中增加对应的器件属性**。** + + - device\_info.hcs 配置参考。 + + ``` + root { + device_info { + match_attr = "hdf_manager"; + platform :: host { + hostName = "platform_host"; + priority = 50; + device_mmc:: device { + device0 :: deviceNode { + policy = 2; + priority = 10; + permission = 0644; + moduleName = "hi3516_mmc_driver"; //【必要】用于指定驱动名称,需要与驱动Entry中的moduleName一致; + serviceName = "HDF_PLATFORM_MMC_0"; //【必要】驱动对外发布服务的名称,必须唯一 + deviceMatchAttr = "hi3516_mmc_emmc";//【必要】用于配置控制器私有数据,要与 mmc_config.hcs 中对应控制器保持一致 + } + device1 :: deviceNode { + policy = 1; + priority = 20; + permission = 0644; + moduleName = "hi3516_mmc_driver"; + serviceName = "HDF_PLATFORM_MMC_1"; + deviceMatchAttr = "hi3516_mmc_sd"; //SD类型 + } + device2 :: deviceNode { + policy = 1; + priority = 30; + permission = 0644; + moduleName = "hi3516_mmc_driver"; + serviceName = "HDF_PLATFORM_MMC_2"; + deviceMatchAttr = "hi3516_mmc_sdio";//SDIO类型 + } + } + } + } + } + ``` + + - mmc\_config.hcs 配置参考。 + + ``` + root { + platform { + mmc_config { + template mmc_controller {//模板公共参数,继承该模板的节点如果使用模板中的默认值,则节点字段可以缺省 + match_attr = ""; + voltDef = 0; // 3.3V + freqMin = 50000; //【必要】最小频率值 + freqMax = 100000000; //【必要】最大频率值 + freqDef = 400000; //【必要】默认频率值 + maxBlkNum = 2048; //【必要】最大的block号 + maxBlkSize = 512; //【必要】最大的block个数 + ocrDef = 0x300000; //【必要】工作电压设置相关 + caps2 = 0; //【必要】属性寄存器相关,见mmc_caps.h 中 MmcCaps2 定义 + regSize = 0x118; //【必要】寄存器位宽 + hostId = 0; //【必要】主机号 + regBasePhy = 0x10020000;//【必要】寄存器物理基地址 + irqNum = 63; //【必要】中断号 + devType = 2; //【必要】模式选择:emmc, SD, SDIO ,COMBO + caps = 0x0001e045; //【必要】属性寄存器相关,见mmc_caps.h 中 MmcCaps 定义 + } + controller_0x10100000 :: mmc_controller { + match_attr = "hi3516_mmc_emmc";//【必要】需要和device_info.hcs中的deviceMatchAttr值一致 + hostId = 0; + regBasePhy = 0x10100000; + irqNum = 96; + devType = 0; // emmc类型 + caps = 0xd001e045; + caps2 = 0x60; + } + controller_0x100f0000 :: mmc_controller { + match_attr = "hi3516_mmc_sd"; + hostId = 1; + regBasePhy = 0x100f0000; + irqNum = 62; + devType = 1; // sd类型 + caps = 0xd001e005; + } + controller_0x10020000 :: mmc_controller { + match_attr = "hi3516_mmc_sdio"; + hostId = 2; + regBasePhy = 0x10020000; + irqNum = 63; + devType = 2; // sdio类型 + caps = 0x0001e04d; + } + } + } + } + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层MmcCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化MmcCntlr成员MmcCntlrOps(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考。 + + 从驱动的角度看,自定义结构体是参数和数据的载体,而且mmc\_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员 ,一些重要数值也会传递给核心层对象。 + + ``` + struct HimciHost { + struct MmcCntlr *mmc;//【必要】核心层结构体 + struct MmcCmd *cmd; //【必要】核心层结构体,传递命令的,相关命令见枚举量 MmcCmdCode + //【可选】根据厂商驱动需要添加 + void *base; + enum HimciPowerStatus powerStatus; + uint8_t *alignedBuff; + uint32_t buffLen; + struct scatterlist dmaSg; + struct scatterlist *sg; + uint32_t dmaSgNum; + DMA_ADDR_T dmaPaddr; + uint32_t *dmaVaddr; + uint32_t irqNum; + bool isTuning; + uint32_t id; + struct OsalMutex mutex; + bool waitForEvent; + HIMCI_EVENT himciEvent; + }; + //MmcCntlr是核心层控制器结构体,其中的成员在bind函数中会被赋值 + struct MmcCntlr { + struct IDeviceIoService service; + struct HdfDeviceObject *hdfDevObj; + struct PlatformDevice device; + struct OsalMutex mutex; + struct OsalSem released; + uint32_t devType; + struct MmcDevice *curDev; + struct MmcCntlrOps *ops; + struct PlatformQueue *msgQueue; + uint16_t index; + uint16_t voltDef; + uint32_t vddBit; + uint32_t freqMin; + uint32_t freqMax; + uint32_t freqDef; + union MmcOcr ocrDef; + union MmcCaps caps; + union MmcCaps2 caps2; + uint32_t maxBlkNum; + uint32_t maxBlkSize; + uint32_t maxReqSize; + bool devPluged; + bool detecting; + void *priv; + }; + ``` + + - MmcCntlr成员回调函数结构体MmcCntlrOps的实例化,其他成员在Bind函数中初始化。 + + ``` + static struct MmcCntlrOps g_himciHostOps = { + .request = HimciDoRequest, + .setClock = HimciSetClock, + .setPowerMode = HimciSetPowerMode, + .setBusWidth = HimciSetBusWidth, + .setBusTiming = HimciSetBusTiming, + .setSdioIrq = HimciSetSdioIrq, + .hardwareReset = HimciHardwareReset, + .systemInit = HimciSystemInit, + .setEnhanceSrobe= HimciSetEnhanceSrobe, + .switchVoltage = HimciSwitchVoltage, + .devReadOnly = HimciDevReadOnly, + .devPluged = HimciCardPluged, + .devBusy = HimciDevBusy, + .tune = HimciTune, + .rescanSdioDev = HimciRescanSdioDev, + }; + ``` + + - Bind函数参考 + + 入参**:** + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + + + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

控制器对象非法

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_INVALID_PARAM

+

参数非法

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

初始化成功

+

HDF_FAILURE

+

初始化失败

+
+ + 函数说明: + + MmcCntlr,HimciHost,HdfDeviceObject之间互相赋值,方便其他函数可以相互转化,初始化自定义结构体HimciHost对象,初始化MmcCntlr成员,调用核心层MmcCntlrAdd函数。 + + ``` + static int32_t HimciMmcBind(struct HdfDeviceObject *obj) + { + struct MmcCntlr *cntlr = NULL; + struct HimciHost *host = NULL; + int32_t ret; + cntlr = (struct MmcCntlr *)OsalMemCalloc(sizeof(struct MmcCntlr)); + host = (struct HimciHost *)OsalMemCalloc(sizeof(struct HimciHost)); + + host->mmc = cntlr; //【必要】使HimciHost与MmcCntlr可以相互转化的前提 + cntlr->priv = (void *)host; //【必要】使HimciHost与MmcCntlr可以相互转化的前提 + cntlr->ops = &g_himciHostOps; //【必要】MmcCntlrOps的实例化对象的挂载 + cntlr->hdfDevObj = obj; //【必要】使HdfDeviceObject与MmcCntlr可以相互转化的前提 + obj->service = &cntlr->service; //【必要】使HdfDeviceObject与MmcCntlr可以相互转化的前提 + ret = MmcCntlrParse(cntlr, obj); //【必要】 初始化 cntlr. 失败就 goto _ERR; + ... + ret = HimciHostParse(host, obj); //【必要】 初始化 host对象的相关属性,失败就 goto _ERR; + ... + ret = HimciHostInit(host, cntlr);//厂商自定义的初始化,失败就 goto _ERR; + ... + ret = MmcCntlrAdd(cntlr); //调用核心层函数 失败就 goto _ERR; + ... + (void)MmcCntlrAddDetectMsgToQueue(cntlr);//将卡检测消息添加到队列中。 + HDF_LOGD("HimciMmcBind: success."); + return HDF_SUCCESS; + _ERR: + HimciDeleteHost(host); + HDF_LOGD("HimciMmcBind: fail, err = %d.", ret); + return ret; + } + ``` + + - Init函数参考 + + 入参: + + HdfDeviceObject是整个驱动对外暴露的接口参数,具备HCS配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态。 + + 函数说明: + + 实现ProcMciInit。 + + ``` + static int32_t HimciMmcInit(struct HdfDeviceObject *obj) + { + static bool procInit = false; + (void)obj; + if (procInit == false) { + if (ProcMciInit() == HDF_SUCCESS) { + procInit = true; + HDF_LOGD("HimciMmcInit: proc init success."); + } + } + HDF_LOGD("HimciMmcInit: success."); + return HDF_SUCCESS; + } + ``` + + - Release函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + 无。 + + 函数说明: + + 释放内存和删除控制器等操作,该函数需要在驱动入口结构体中赋值给Release接口,当HDF框架调用Init函数初始化驱动失败时,可以调用 Release释放驱动资源。所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。 + + ``` + static void HimciMmcRelease(struct HdfDeviceObject *obj) + { + struct MmcCntlr *cntlr = NULL; + ... + cntlr = (struct MmcCntlr *)obj->service;//这里有HdfDeviceObject到MmcCntlr的强制转化,通过service成员,赋值见Bind函数 + ... + HimciDeleteHost((struct HimciHost *)cntlr->priv);//厂商自定义的内存释放函数,这里有MmcCntlr到HimciHost的强制转化 + } + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/06.PWM.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/06.PWM.md" new file mode 100644 index 0000000000000000000000000000000000000000..9b0014e04c8ed9294e839c2e36f7a4f7beaf5216 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/06.PWM.md" @@ -0,0 +1,364 @@ +--- +title: PWM +permalink: /pages/0004010105 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# PWM + +- [概述](#section1591602238164144) +- [接口说明](#section752964871810) +- [开发步骤](#section967396342164144) +- [开发实例](#section1883877829164144) + +## 概述 + +PWM(Pulse Width Modulator)即脉冲宽度调节器,在HDF框架中,PWM的接口适配模式采用独立服务模式,在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用。 + +**图 1** PWM独立服务模式结构图 +![](/images/device-dev/driver/figures/PWM独立服务模式结构图.png "PWM独立服务模式结构图") + +## 接口说明 + +PwmMethod定义: + +``` +struct PwmMethod { + int32_t (*setConfig)(struct PwmDev *pwm, struct PwmConfig *config); + int32_t (*open)(struct PwmDev *pwm); + int32_t (*close)(struct PwmDev *pwm); +}; +``` + +**表 1** PwmMethod结构体成员的回调函数功能说明 + + + + + + + + + + + + + + + + + + + + + + + + +

成员函数

+

入参

+

返回值

+

功能

+

setConfig

+

pwm: 结构体指针,核心层PWM控制器;

+

config: 结构体指针,属性传入值;

+

HDF_STATUS相关状态

+

配置属性

+

open

+

pwm: 结构体指针,核心层PWM控制器;

+

HDF_STATUS相关状态

+

打开设备

+

close

+

pwm: 结构体指针,核心层PWM控制器;

+

HDF_STATUS相关状态

+

关闭设备

+
+ +## 开发步骤 + +PWM模块适配HDF框架的三个环节是配置属性文件,实例化驱动入口,以及填充核心层接口函数。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加pwm\_config.hcs器件属性文件。 + +3. **实例化PWM控制器对象:** + - 初始化PwmDev成员。 + - 实例化PwmDev成员PwmMethod。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化PwmDev成员PwmMethod,其定义和成员说明见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如PWM控制状态,中断响应情况等。 + + +## 开发实例 + +下方将以pwm\_hi35xx.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 + + 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + PWM驱动入口参考 + + ``` + struct HdfDriverEntry g_hdfPwm = { + .moduleVersion = 1, + .moduleName = "HDF_PLATFORM_PWM",//【必要 且与 HCS文件中里面的moduleName匹配】 + .Bind = HdfPwmBind, + .Init = HdfPwmInit, + .Release = HdfPwmRelease, + }; + //调用HDF_INIT将驱动入口注册到HDF框架中 + HDF_INIT(g_hdfPwm); + ``` + +2. 完成驱动入口注册之后,下一步请在device\_info.hcs文件中添加deviceNode信息,并在 pwm\_config.hcs 中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值与核心层PwmDev成员的默认值或限制范围有密切关系。 如有更多个器件信息,则需要在device\_info文件增加deviceNode信息,以及在pwm\_config文件中增加对应的器件属性**。** + - device\_info.hcs 配置参考。 + + ``` + root { + device_info { + platform :: host { + hostName = "platform_host"; + priority = 50; + device_pwm :: device {//为每一个 pwm 控制器配置一个HDF设备节点,存在多个时【必须】添加,否则不用 + device0 :: deviceNode { + policy = 1; // 等于1,向内核态发布服务 + priority = 80; // 驱动启动优先级 + permission = 0644;// 驱动创建设备节点权限 + moduleName = "HDF_PLATFORM_PWM"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致; + serviceName = "HDF_PLATFORM_PWM_0";//【必要且唯一】驱动对外发布服务的名称 + deviceMatchAttr = "hisilicon_hi35xx_pwm_0";//【必要】用于配置控制器私有数据,要与 pwm_config.hcs 中对应 + // 控制器保持一致,具体的控制器信息在 pwm_config.hcs 中 + } + device1 :: deviceNode { + policy = 1; + priority = 80; + permission = 0644; + moduleName = "HDF_PLATFORM_PWM"; + serviceName = "HDF_PLATFORM_PWM_1"; + deviceMatchAttr = "hisilicon_hi35xx_pwm_1"; + } + } + } + } + } + ``` + + - pwm\_config.hcs 配置参考。 + + ``` + root { + platform { + pwm_config { + template pwm_device { //【必要】模板配置,继承该模板的节点如果使用模板中的默认值,则节点字段可以缺省 + serviceName = ""; + match_attr = ""; + num = 0; //【必要】设备号 + base = 0x12070000; //【必要】地址映射需要 + } + device_0x12070000 :: pwm_device { + match_attr = "hisilicon_hi35xx_pwm_0";//【必要】需要和device_info.hcs中的deviceMatchAttr值一致 + } + device_0x12070020 :: pwm_device { //存在多个设备时【必须】添加,否则不用 + match_attr = "hisilicon_hi35xx_pwm_1"; + num = 1; + base = 0x12070020; //【必要】地址映射需要 + } + } + } + } + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层PwmDev对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化PwmDev成员PwmMethod(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考。 + + 从驱动的角度看,自定义结构体是参数和数据的载体,而且pwm\_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,一些重要数值也会传递给核心层对象,例如设备号等。 + + ``` + struct HiPwm { + struct PwmDev dev; //【必要】 核心层结构体 + volatile unsigned char *base; + struct HiPwmRegs *reg; // 设备属性结构体,可自定义 + bool supportPolarity; + }; + + // PwmDev是核心层控制器结构体,其中的成员在Init函数中会被赋值 + struct PwmDev { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + struct PwmConfig cfg; //属性结构体,相关定义见下 + struct PwmMethod *method; //钩子函数模板 + bool busy; + uint32_t num; //设备号 + OsalSpinlock lock; + void *priv; //私有数据,一般存储自定义结构体首地址,方便调用 + }; + struct PwmConfig { + uint32_t duty; // 占空时间 nanoseconds + uint32_t period; // pwm 周期 nanoseconds + uint32_t number; // pwm 连续个数 + uint8_t polarity; // Polarity + // ------------------- | -------------- + // PWM_NORMAL_POLARITY | Normal polarity + // PWM_INVERTED_POLARITY | Inverted polarity + // + uint8_t status; // 运行状态 + // ------------------ | ----------------- + // PWM_DISABLE_STATUS | Disabled + // PWM_ENABLE_STATUS | Enabled + }; + ``` + + - PwmDev成员回调函数结构体PwmMethod的实例化,其他成员在Init函数中初始化。 + + ``` + // pwm_hi35xx.c 中的示例:钩子函数的填充 + struct PwmMethod g_pwmOps = { + .setConfig = HiPwmSetConfig,//配置属性 + }; + ``` + + - Init函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + + + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

控制器对象非法

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_INVALID_PARAM

+

参数非法

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

初始化成功

+

HDF_FAILURE

+

初始化失败

+
+ + 函数说明: + + 初始化自定义结构体对象,初始化PwmDev成员,调用核心层PwmDeviceAdd函数。 + + ``` + //此处bind函数为空函数,可与init函数结合,也可根据厂商需要实现相关操作 + static int32_t HdfPwmBind(struct HdfDeviceObject *obj) + { + (void)obj; + return HDF_SUCCESS; + } + + static int32_t HdfPwmInit(struct HdfDeviceObject *obj) + { + int ret; + struct HiPwm *hp = NULL; + ... + hp = (struct HiPwm *)OsalMemCalloc(sizeof(*hp)); + ... + ret = HiPwmProbe(hp, obj); //【必要】实现见下 + ... + return ret; + } + + static int32_t HiPwmProbe(struct HiPwm *hp, struct HdfDeviceObject *obj) + { + uint32_t tmp; + struct DeviceResourceIface *iface = NULL; + + iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);//初始化自定义结构体HiPwm + ... + + hp->reg = (struct HiPwmRegs *)hp->base; //初始化自定义结构体HiPwm + hp->supportPolarity = false; //初始化自定义结构体HiPwm + hp->dev.method = &g_pwmOps; //PwmMethod的实例化对象的挂载 + hp->dev.cfg.duty = PWM_DEFAULT_DUTY_CYCLE; //初始化PwmDev + hp->dev.cfg.period = PWM_DEFAULT_PERIOD; //初始化PwmDev + hp->dev.cfg.polarity = PWM_DEFAULT_POLARITY; //初始化PwmDev + hp->dev.cfg.status = PWM_DISABLE_STATUS; //初始化PwmDev + hp->dev.cfg.number = 0; //初始化PwmDev + hp->dev.busy = false; //初始化PwmDev + if (PwmDeviceAdd(obj, &(hp->dev)) != HDF_SUCCESS) {//【重要】调用核心层函数,初始化hp->dev 的设备和服务 + OsalIoUnmap((void *)hp->base); + return HDF_FAILURE; + } + return HDF_SUCCESS; + } + ``` + + - Release 函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + 无。 + + 函数说明: + + 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。 + + ``` + static void HdfPwmRelease(struct HdfDeviceObject *obj) + { + struct HiPwm *hp = NULL; + ... + hp = (struct HiPwm *)obj->service;//这里有HdfDeviceObject到HiPwm的强制转化 + ... + PwmDeviceRemove(obj, &(hp->dev));//【必要】调用核心层函数,释放PwmDev的设备和服务,这里有HiPwm到PwmDev的强制转化 + HiPwmRemove(hp); //释放HiPwm + } + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/07.RTC.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/07.RTC.md" new file mode 100644 index 0000000000000000000000000000000000000000..b8502ca2b9f75fc2176945dd20132b60b04e38b1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/07.RTC.md" @@ -0,0 +1,474 @@ +--- +title: RTC +permalink: /pages/0004010106 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# RTC + +- [概述](#section509989381142407) +- [接口说明](#section752964871810) +- [开发步骤](#section1784450860142407) +- [开发实例](#section1594883301142407) + +## 概述 + +RTC\(real-time clock\)为操作系统中的实时时钟设备,在HDF框架中,RTC的接口适配模式采用独立服务模式,在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用。 + +**图 1** RTC独立服务模式结构图 +![](/images/device-dev/driver/figures/RTC独立服务模式结构图.png "RTC独立服务模式结构图") + +## 接口说明 + +RtcMethod定义: + +``` +struct RtcMethod { + int32_t (*ReadTime)(struct RtcHost *host, struct RtcTime *time); + int32_t (*WriteTime)(struct RtcHost *host, const struct RtcTime *time); + int32_t (*ReadAlarm)(struct RtcHost *host, enum RtcAlarmIndex alarmIndex, struct RtcTime *time); + int32_t (*WriteAlarm)(struct RtcHost *host, enum RtcAlarmIndex alarmIndex, const struct RtcTime *time); + int32_t (*RegisterAlarmCallback)(struct RtcHost *host, enum RtcAlarmIndex alarmIndex, RtcAlarmCallback cb); + int32_t (*AlarmInterruptEnable)(struct RtcHost *host, enum RtcAlarmIndex alarmIndex, uint8_t enable); + int32_t (*GetFreq)(struct RtcHost *host, uint32_t *freq); + int32_t (*SetFreq)(struct RtcHost *host, uint32_t freq); + int32_t (*Reset)(struct RtcHost *host); + int32_t (*ReadReg)(struct RtcHost *host, uint8_t usrDefIndex, uint8_t *value); + int32_t (*WriteReg)(struct RtcHost *host, uint8_t usrDefIndex, uint8_t value); +}; +``` + +**表 1** RtcMethod结构体成员的回调函数功能说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

函数

+

入参

+

出参

+

返回值

+

功能

+

ReadTime

+

host: 结构体指针,核心层RTC控制器 ;

+

time: 结构体指针,传出的时间值;

+

HDF_STATUS相关状态

+

读RTC时间信息

+

WriteTime

+

host: 结构体指针,核心层RTC控制器 ;time: 结构体指针,时间传入值;

+

+

HDF_STATUS相关状态

+

写RTC时间信息(包括毫秒~年)

+

ReadAlarm

+

host: 结构体指针,核心层RTC控制器 ;alarmIndex: 枚举值,闹钟报警索引 ;

+

time: 结构体指针,传出的时间值;

+

HDF_STATUS相关状态

+

读RTC报警时间信息

+

WriteAlarm

+

host: 结构体指针,核心层RTC控制器 ;alarmIndex: 枚举值,闹钟报警索引 ;time: 结构体指针,时间传入值;

+

+

HDF_STATUS相关状态

+

写RTC报警时间信息

+

RegisterAlarmCallback

+

host: 结构体指针,核心层RTC控制器 ;alarmIndex: 枚举值,闹钟报警索引 ;cb:函数指针,回调函数;

+

+

HDF_STATUS相关状态

+

注册报警超时回调函数

+

AlarmInterruptEnable

+

host: 结构体指针,核心层RTC控制器 ;alarmIndex: 枚举值,闹钟报警索引 ;enable: 布尔值,控制报警;

+

+

HDF_STATUS相关状态

+

使能/去使能RTC报警中断

+

GetFreq

+

host: 结构体指针,核心层RTC控制器 ;

+

freq: uint32_t指针,传出的频率值;

+

HDF_STATUS相关状态

+

读RTC外接晶振频率

+

SetFreq

+

host: 结构体指针,核心层RTC控制器 ;freq: uint32_t,频率传入值;

+

+

HDF_STATUS相关状态

+

配置RTC外接晶振频率

+

Reset

+

host: 结构体指针,核心层RTC控制器 ;

+

+

HDF_STATUS相关状态

+

RTC复位

+

ReadReg

+

host: 结构体指针,核心层RTC控制器 ;usrDefIndex: 结构体,用户自定义寄存器索引;

+

value: uint8_t指针,传出的寄存器值;

+

HDF_STATUS相关状态

+

按照用户定义的寄存器索引,读取对应的寄存器配置,一个索引对应一字节的配置值

+

WriteReg

+

host: 结构体指针,核心层RTC控制器 ;usrDefIndex: 结构体,用户自定义寄存器索引;value: uint8_t,寄存器传入值;

+

+

HDF_STATUS相关状态

+

按照用户定义的寄存器索引,设置对应的寄存器配置,一个索引对应一字节的配置值

+
+ +## 开发步骤 + +RTC模块适配HDF框架的三个环节是配置属性文件,实例化驱动入口,以及填充核心层接口函数。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加rtc\_config.hcs器件属性文件。 + +3. **实例化RTC控制器对象:** + - 初始化RtcHost成员。 + - 实例化RtcHost成员RtcMethod。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化RtcHost成员RtcMethod,其定义和成员说明见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如RTC控制状态,中断响应情况等。 + + +## 开发实例 + +下方将以rtc\_hi35xx.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 + + 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + RTC驱动入口参考: + + ``` + struct HdfDriverEntry g_rtcDriverEntry = { + .moduleVersion = 1, + .Bind = HiRtcBind, //见Bind参考 + .Init = HiRtcInit, //见Init参考 + .Release = HiRtcRelease, //见Release参考 + .moduleName = "HDF_PLATFORM_RTC",//【必要】且与 HCS 里面的名字匹配 + }; + //调用HDF_INIT将驱动入口注册到HDF框架中 + HDF_INIT(g_rtcDriverEntry); + ``` + +2. 完成驱动入口注册之后,下一步请在device\_info.hcs文件中添加deviceNode信息,并在 rtc\_config.hcs 中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值与核心层RtcHost成员的默认值或限制范围有密切关系。 + + 本例只有一个RTC控制器,如有多个器件信息,则需要在device\_info文件增加deviceNode信息,以及在rtc\_config文件中增加对应的器件属性。 + + - device\_info.hcs 配置参考。 + + ``` + root { + device_info { + platform :: host { + device_rtc :: device { + device0 :: deviceNode { + policy = 1; //2:用户态可见,1:内核态可见,0:不需要发布服务 + priority = 30; //优先级越大,值越小 + permission = 0644; //驱动创建设备节点权限 + moduleName = "HDF_PLATFORM_RTC"; //【必要】用于指定驱动名称,需要与驱动Entry中的moduleName一致 + serviceName = "HDF_PLATFORM_RTC"; //【必要】驱动对外发布服务的名称,必须唯一 + deviceMatchAttr = "hisilicon_hi35xx_rtc";//【必要】需要与设备hcs文件中的 match_attr 匹配 + } + } + } + } + } + ``` + + - rtc\_config.hcs 配置参考。 + + ``` + root { + platform { + rtc_config { + controller_0x12080000 { + match_attr = "hisilicon_hi35xx_rtc";//【必要】需要和device_info.hcs中的deviceMatchAttr值一致 + rtcSpiBaseAddr = 0x12080000; //地址映射相关 + regAddrLength = 0x100; //地址映射相关 + irq = 37; //中断号 + supportAnaCtrl = false; + supportLock = false; + anaCtrlAddr = 0xff; + lock0Addr = 0xff; + lock1Addr = 0xff; + lock2Addr = 0xff; + lock3Addr = 0xff; + } + } + } + } + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层RtcHost对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化RtcHost成员RtcMethod(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考。 + + 从驱动的角度看,自定义结构体是参数和数据的载体,而且rtc\_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员。 + + ``` + struct RtcConfigInfo { + uint32_t spiBaseAddr; //地址映射相关 + volatile void *remapBaseAddr; //地址映射相关 + uint16_t regAddrLength; //地址映射相关 + uint8_t supportAnaCtrl; //是否支持anactrl + uint8_t supportLock; //是否支持锁 + uint8_t irq; //中断号 + uint8_t alarmIndex; //闹钟索引 + uint8_t anaCtrlAddr; //anactrl地址 + struct RtcLockAddr lockAddr; //锁地址 + RtcAlarmCallback cb; //回调函数 + struct OsalMutex mutex; //互斥锁 + }; + + // RtcHost是核心层控制器结构体,其中的成员在Init函数中会被赋值 + struct RtcHost { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + struct RtcMethod *method; + void *data; + }; + ``` + + - RtcHost成员回调函数结构体RtcMethod的实例化,其他成员在Init函数中初始化。 + + ``` + // rtc_hi35xx.c 中的示例:钩子函数的填充 + static struct RtcMethod g_method = { + .ReadTime = HiRtcReadTime, + .WriteTime = HiRtcWriteTime, + .ReadAlarm = HiReadAlarm, + .WriteAlarm = HiWriteAlarm, + .RegisterAlarmCallback = HiRegisterAlarmCallback, + .AlarmInterruptEnable = HiAlarmInterruptEnable, + .GetFreq = HiGetFreq, + .SetFreq = HiSetFreq, + .Reset = HiReset, + .ReadReg = HiReadReg, + .WriteReg = HiWriteReg, + }; + ``` + + - Bind 函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + **表 2** Bind 函数入参及返回值对照表 + + + + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

控制器对象非法

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_INVALID_PARAM

+

参数非法

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

初始化成功

+

HDF_FAILURE

+

初始化失败

+
+ + 函数说明: + + 关联HdfDeviceObject对象和RtcHost。 + + ``` + static int32_t HiRtcBind(struct HdfDeviceObject *device) + { + struct RtcHost *host = NULL; + host = RtcHostCreate(device); //实际是申请内存并挂接device: host->device = device; + //使HdfDeviceObject与RtcHost可以相互转化的前提 + ... + device->service = &host->service;//使HdfDeviceObject与RtcHost可以相互转化的前提 + //方便后续通过调用RtcHostFromDevice 实现全局性质的host 使用 + return HDF_SUCCESS; + } + ``` + + - Init函数参考 + + 入参**:** + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值**:** + + HDF\_STATUS相关状态。 + + 函数说明: + + 初始化自定义结构体对象,初始化RtcHost成员。 + + ``` + static int32_t HiRtcInit(struct HdfDeviceObject *device) + { + struct RtcHost *host = NULL; + struct RtcConfigInfo *rtcInfo = NULL; + ... + host = RtcHostFromDevice(device);//这里有HdfDeviceObject到RtcHost的强制转化 + rtcInfo = OsalMemCalloc(sizeof(*rtcInfo)); + ... + //HiRtcConfigData 会从设备配置树中读取属性填充rtcInfo 的supportAnaCtrl, supportLock, spiBaseAddr, regAddrLength, irq + //为HiRtcSwInit 和HiRtcSwInit 提供参数,...函数内部处理失败后内存释放等操作 + if (HiRtcConfigData(rtcInfo, device->property) != 0) { + ... + } + if (HiRtcSwInit(rtcInfo) != 0) {//地址映射以及中断注册相关 + ... + } + if (HiRtcHwInit(rtcInfo) != 0) {//初始化anaCtrl 和 lockAddr 相关内容 + ... + } + + host->method = &g_method;//RtcMethod的实例化对象的挂载 + host->data = rtcInfo; //使RtcConfigInfo与RtcHost可以相互转化的前提 + HDF_LOGI("Hdf dev service:%s init success!", HdfDeviceGetServiceName(device)); + return HDF_SUCCESS; + } + ``` + + - Release 函数参考 + + 入参**:** + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值**:** + + 无。 + + 函数说明: + + 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。所有强制转换获取相应对象的操作前提是在Init或Bind函数中具备对应赋值的操作。 + + ``` + static void HiRtcRelease(struct HdfDeviceObject *device) + { + struct RtcHost *host = NULL; + struct RtcConfigInfo *rtcInfo = NULL; + ... + host = RtcHostFromDevice(device); //这里有HdfDeviceObject到RtcHost的强制转化 + rtcInfo = (struct RtcConfigInfo *)host->data;//这里有RtcHost到RtcConfigInfo的强制转化 + if (rtcInfo != NULL) { + HiRtcSwExit(rtcInfo); + OsalMemFree(rtcInfo); //释放RtcConfigInfo + host->data = NULL; + } + RtcHostDestroy(host); //释放RtcHost + } + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/08.SDIO.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/08.SDIO.md" new file mode 100644 index 0000000000000000000000000000000000000000..2e9c63d079a3331083f1886095685d223cba5ece --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/08.SDIO.md" @@ -0,0 +1,545 @@ +--- +title: SDIO +permalink: /pages/0004010107 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# SDIO + +- [概述](#section1347805272150053) +- [接口说明](#section752964871810) +- [开发步骤](#section581179475150053) +- [开发实例](#section2112250242150053) + +## 概述 + +SDIO由SD卡发展而来,被统称为mmc(MultiMediaCard),相关技术差别不大,在HDF框架中,SDIO的接口适配模式采用独立服务模式,在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用。 + +**图 1** SDIO独立服务模式结构图 +![](/images/device-dev/driver/figures/SDIO独立服务模式结构图.png "SDIO独立服务模式结构图") + +## 接口说明 + +SdioDeviceOps定义: + +``` +// 函数模板 +struct SdioDeviceOps { + int32_t (*incrAddrReadBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size); + int32_t (*incrAddrWriteBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size); + int32_t (*fixedAddrReadBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen); + int32_t (*fixedAddrWriteBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen); + int32_t (*func0ReadBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size); + int32_t (*func0WriteBytes)(struct SdioDevice *dev, uint8_t *data, uint32_t addr, uint32_t size); + int32_t (*setBlockSize)(struct SdioDevice *dev, uint32_t blockSize); + int32_t (*getCommonInfo)(struct SdioDevice *dev, SdioCommonInfo *info, uint32_t infoType); + int32_t (*setCommonInfo)(struct SdioDevice *dev, SdioCommonInfo *info, uint32_t infoType); + int32_t (*flushData)(struct SdioDevice *dev); + int32_t (*enableFunc)(struct SdioDevice *dev); + int32_t (*disableFunc)(struct SdioDevice *dev); + int32_t (*claimIrq)(struct SdioDevice *dev, SdioIrqHandler *irqHandler); + int32_t (*releaseIrq)(struct SdioDevice *dev); + int32_t (*findFunc)(struct SdioDevice *dev, struct SdioFunctionConfig *configData); + int32_t (*claimHost)(struct SdioDevice *dev); + int32_t (*releaseHost)(struct SdioDevice *dev); +}; +``` + +**表 1** SdioDeviceOps结构体成员的回调函数功能说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

函数

+

入参

+

出参

+

返回值

+

功能

+

incrAddrReadBytes

+

dev: 结构体指针,SDIO设备控制器;addr: uint32_t,地址值;size: uint32_t,大小

+

data: uint8_t指针,传出值;

+

HDF_STATUS相关状态

+

从指定的SDIO地址增量读取给定长度的数据

+

incrAddrWriteBytes

+

dev: 结构体指针,SDIO设备控制器;data: uint8_t指针,传入值;addr: uint32_t,地址值;size: uint32_t,大小

+

+

HDF_STATUS相关状态

+

将给定长度的数据增量写入指定的SDIO地址

+

fixedAddrReadBytes

+

dev: 结构体指针,SDIO设备控制器;addr: uint32_t,地址值;size: uint32_t,大小;scatterLen: uint32_t,数据长度;

+

data: uint8_t指针,传出值;

+

HDF_STATUS相关状态

+

从固定SDIO地址读取给定长度的数据。

+

fixedAddrWriteBytes

+

dev: 结构体指针,SDIO设备控制器;data: uint8_t指针,传入值;addr: uint32_t,地址值;size: uint32_t,大小;scatterLen: uint32_t,数据长度;

+

+

HDF_STATUS相关状态

+

将给定长度的数据写入固定SDIO地址

+

func0ReadBytes

+

dev: 结构体指针,SDIO设备控制器;addr: uint32_t,地址值;size: uint32_t,大小;

+

data: uint8_t指针,传出值;

+

HDF_STATUS相关状态

+

从SDIO函数0的地址空间读取给定长度的数据。

+

func0WriteBytes

+

dev: 结构体指针,SDIO设备控制器;data: uint8_t指针,传入值;addr: uint32_t,地址值;size: uint32_t,大小;

+

+

HDF_STATUS相关状态

+

将给定长度的数据写入SDIO函数0的地址空间。

+

setBlockSize

+

dev: 结构体指针,SDIO设备控制器;blockSize: uint32_t,Block大小

+

+

HDF_STATUS相关状态

+

设置block大小

+

getCommonInfo

+

dev: 联合体指针,SDIO设备控制器;infoType: uint32_t,info类型;

+

info: 结构体指针,传出SdioFuncInfo信息;

+

HDF_STATUS相关状态

+

获取CommonInfo,说明见下

+

setCommonInfo

+

dev: 结构体指针,SDIO设备控制器;info: 联合体指针,SdioFuncInfo信息传入;infoType: uint32_t,info类型;

+

+

HDF_STATUS相关状态

+

设置CommonInfo,说明见下

+

flushData

+

dev: 结构体指针,SDIO设备控制器;

+

+

HDF_STATUS相关状态

+

当SDIO需要重新初始化或发生意外错误时调用的函数

+

enableFunc

+

dev: 结构体指针,SDIO设备控制器;

+

+

HDF_STATUS相关状态

+

使能SDIO设备

+

disableFunc

+

dev: 结构体指针,SDIO设备控制器;

+

+

HDF_STATUS相关状态

+

去使能SDIO设备

+

claimIrq

+

dev: 结构体指针,SDIO设备控制器;irqHandler: void函数指针;

+

+

HDF_STATUS相关状态

+

注册SDIO中断

+

releaseIrq

+

dev: 结构体指针,SDIO设备控制器;

+

+

HDF_STATUS相关状态

+

释放SDIO中断

+

findFunc

+

dev: 结构体指针,SDIO设备控制器;configData: 结构体指针, SDIO函数关键信息

+

+

HDF_STATUS相关状态

+

寻找匹配的funcNum

+

claimHost

+

dev: 结构体指针,SDIO设备控制器;

+

+

HDF_STATUS相关状态

+

独占HOST

+

releaseHost

+

dev: 结构体指针,SDIO设备控制器;

+

+

HDF_STATUS相关状态

+

释放HOST

+
+ +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>CommonInfo包括maxBlockNum\(单个request中最大block数\), maxBlockSize\(单个block最大字节数\), maxRequestSize\(单个Request最大字节数\), enTimeout\(最大超时时间,毫秒\), funcNum\(功能编号1\~7\), irqCap\(IRQ capabilities\), \(void \*\)data. + +## 开发步骤 + +SDIO模块适配HDF框架的三个环节是配置属性文件,实例化驱动入口,以及填充核心层接口函数。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加sdio\_config.hcs器件属性文件。 + +3. **实例化SDIO控制器对象:** + - 初始化SdioDevice成员。 + - 实例化SdioDevice成员SdioDeviceOps。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化SdioDevice成员SdioDeviceOps,其定义和成员说明见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如SDIO控制状态,中断响应情况等。 + + +## 开发实例 + +下方将以sdio\_adapter.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 + + 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + SDIO 驱动入口参考: + + ``` + struct HdfDriverEntry g_sdioDriverEntry = { + .moduleVersion = 1, + .Bind = Hi35xxLinuxSdioBind, //见Bind参考 + .Init = Hi35xxLinuxSdioInit, //见Init参考 + .Release = Hi35xxLinuxSdioRelease,//见Release参考 + .moduleName = "HDF_PLATFORM_SDIO",//【必要 且与 HCS文件中里面的moduleName匹配】 + }; + //调用HDF_INIT将驱动入口注册到HDF框架中 + HDF_INIT(g_sdioDriverEntry); + ``` + +2. 完成驱动入口注册之后,下一步请在device\_info.hcs文件中添加deviceNode信息,并在 sdio\_config.hcs 中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值与核心层SdioDevice成员的默认值或限制范围有密切关系。 + + 本例只有一个SDIO控制器,如有多个器件信息,则需要在device\_info文件增加deviceNode信息,以及在sdio\_config文件中增加对应的器件属性。 + + - device\_info.hcs 配置参考: + + ``` + root { + device_info { + match_attr = "hdf_manager"; + platform :: host { + hostName = "platform_host"; + priority = 50; + device_sdio :: device { + device0 :: deviceNode { + policy = 1; + priority = 70; + permission = 0644; + moduleName = "HDF_PLATFORM_SDIO"; //【必要】用于指定驱动名称,需要与驱动Entry中的moduleName一致; + serviceName = "HDF_PLATFORM_MMC_2"; //【必要】驱动对外发布服务的名称,必须唯一 + deviceMatchAttr = "hisilicon_hi35xx_sdio_0";//【必要】用于配置控制器私有数据,要与sdio_config.hcs中对应控制器保持一致 + } + } + } + } + } + ``` + + - sdio\_config.hcs 配置参考: + + ``` + root { + platform { + sdio_config { + template sdio_controller { + match_attr = ""; + hostId = 2; //【必要】模式固定为2,在mmc_config.hcs有介绍 + devType = 2; //【必要】模式固定为2,在mmc_config.hcs有介绍 + } + controller_0x2dd1 :: sdio_controller { + match_attr = "hisilicon_hi35xx_sdio_0";//【必要】需要和device_info.hcs中的deviceMatchAttr值一致 + } + } + } + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层SdioDevice对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化SdioDevice成员SdioDeviceOps(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考: + + 从驱动的角度看,自定义结构体是参数和数据的载体,而且sdio\_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,一些重要数值也会传递给核心层对象。 + + ``` + typedef struct { + uint32_t maxBlockNum; // 单个request最大的block个数 + uint32_t maxBlockSize; // 单个block最大的字节数1~2048 + uint32_t maxRequestSize; // 单个request最大的字节数 1~2048 + uint32_t enTimeout; // 最大超时时间,单位毫秒,且不能超过一秒 + uint32_t funcNum; // 函数编号1~7 + uint32_t irqCap; // 中断能力 + void *data; // 私有数据 + } SdioFuncInfo; + + //SdioDevice是核心层控制器结构体,其中的成员在Bind函数中会被赋值 + struct SdioDevice { + struct SdDevice sd; + struct SdioDeviceOps *sdioOps; + struct SdioRegister sdioReg; + uint32_t functions; + struct SdioFunction *sdioFunc[SDIO_MAX_FUNCTION_NUMBER]; + struct SdioFunction *curFunction; + struct OsalThread thread; /* irq thread */ + struct OsalSem sem; + bool irqPending; + bool threadRunning; + }; + ``` + + - SdioDevice成员回调函数结构体SdioDeviceOps的实例化,其他成员在Init函数中初始化。 + + ``` + static struct SdioDeviceOps g_sdioDeviceOps = { + .incrAddrReadBytes = Hi35xxLinuxSdioIncrAddrReadBytes, + .incrAddrWriteBytes = Hi35xxLinuxSdioIncrAddrWriteBytes, + .fixedAddrReadBytes = Hi35xxLinuxSdioFixedAddrReadBytes, + .fixedAddrWriteBytes = Hi35xxLinuxSdioFixedAddrWriteBytes, + .func0ReadBytes = Hi35xxLinuxSdioFunc0ReadBytes, + .func0WriteBytes = Hi35xxLinuxSdioFunc0WriteBytes, + .setBlockSize = Hi35xxLinuxSdioSetBlockSize, + .getCommonInfo = Hi35xxLinuxSdioGetCommonInfo, + .setCommonInfo = Hi35xxLinuxSdioSetCommonInfo, + .flushData = Hi35xxLinuxSdioFlushData, + .enableFunc = Hi35xxLinuxSdioEnableFunc, + .disableFunc = Hi35xxLinuxSdioDisableFunc, + .claimIrq = Hi35xxLinuxSdioClaimIrq, + .releaseIrq = Hi35xxLinuxSdioReleaseIrq, + .findFunc = Hi35xxLinuxSdioFindFunc, + .claimHost = Hi35xxLinuxSdioClaimHost, + .releaseHost = Hi35xxLinuxSdioReleaseHost, + }; + ``` + + - Bind函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + **表 2** Bind函数入参及返回值 + + + + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

控制器对象非法

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_INVALID_PARAM

+

参数非法

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

初始化成功

+

HDF_FAILURE

+

初始化失败

+
+ + 函数说明: + + 初始化自定义结构体对象,初始化SdioCntlr成员,调用核心层SdioCntlrAdd函数,以及其他厂商自定义初始化操作。 + + ``` + static int32_t Hi35xxLinuxSdioBind(struct HdfDeviceObject *obj) + { + struct MmcCntlr *cntlr = NULL; + int32_t ret; + ... + cntlr = (struct MmcCntlr *)OsalMemCalloc(sizeof(struct MmcCntlr));// 分配内存 + ... + cntlr->ops = &g_sdioCntlrOps; //【必要】struct MmcCntlrOps g_sdioCntlrOps={ + // .rescanSdioDev = Hi35xxLinuxSdioRescan,}; + cntlr->hdfDevObj = obj; //【必要】使HdfDeviceObject与MmcCntlr可以相互转化的前提 + obj->service = &cntlr->service;//【必要】使HdfDeviceObject与MmcCntlr可以相互转化的前提 + ret = Hi35xxLinuxSdioCntlrParse(cntlr, obj);//【必要】初始化cntlr 的 index, devType, 失败则 goto _ERR; + ... + ret = MmcCntlrAdd(cntlr); //【必要】调用核心层mmc_core.c的函数, 失败则 goto _ERR; + ... + ret = MmcCntlrAllocDev(cntlr, (enum MmcDevType)cntlr->devType);//【必要】调用核心层mmc_core.c的函数, 失败则 goto _ERR; + ... + + MmcDeviceAddOps(cntlr->curDev, &g_sdioDeviceOps);//【必要】调用核心层mmc_core.c的函数, 钩子函数挂载 + HDF_LOGD("Hi35xxLinuxSdioBind: Success!"); + return HDF_SUCCESS; + + _ERR: + Hi35xxLinuxSdioDeleteCntlr(cntlr); + HDF_LOGE("Hi35xxLinuxSdioBind: Fail!"); + return HDF_FAILURE; + } + ``` + + - Init函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态。 + + 函数说明: + + 无操作,可根据厂商需要添加。 + + ``` + static int32_t Hi35xxLinuxSdioInit(struct HdfDeviceObject *obj) + { + (void)obj;//无操作,可根据厂商需要添加 + HDF_LOGD("Hi35xxLinuxSdioInit: Success!"); + return HDF_SUCCESS; + } + ``` + + - Release函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + 无。 + + 函数说明: + + 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。所有强制转换获取相应对象的操作前提是在Bind函数中具备对应赋值的操作。 + + ``` + static void Hi35xxLinuxSdioRelease(struct HdfDeviceObject *obj) + { + if (obj == NULL) { + return; + } + Hi35xxLinuxSdioDeleteCntlr((struct MmcCntlr *)obj->service);//【必要】自定义的内存释放函数,这里有HdfDeviceObject到MmcCntlr的强制转化 + } + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/09.SPI.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/09.SPI.md" new file mode 100644 index 0000000000000000000000000000000000000000..0b7eed3036046c0a37c99b54ab33f147a4c12047 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/09.SPI.md" @@ -0,0 +1,462 @@ +--- +title: SPI +permalink: /pages/0004010108 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# SPI + +- [概述](#section84922229152909) +- [接口说明](#section752964871810) +- [开发步骤](#section799667984152909) +- [开发实例](#section956157227152909) + +## 概述 + +SPI是串行外设接口(Serial Peripheral Interface)的缩写,在HDF框架中,SPI的接口适配模式采用独立服务模式,在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用。 + +**图 1** SPI独立服务模式结构图 +![](/images/device-dev/driver/figures/SPI独立服务模式结构图.png "SPI独立服务模式结构图") + +## 接口说明 + +SpiCntlrMethod定义: + +``` +struct SpiCntlrMethod { + int32_t (*GetCfg)(struct SpiCntlr *cntlr, struct SpiCfg *cfg); + int32_t (*SetCfg)(struct SpiCntlr *cntlr, struct SpiCfg *cfg); + int32_t (*Transfer)(struct SpiCntlr *cntlr, struct SpiMsg *msg, uint32_t count); + int32_t (*Open)(struct SpiCntlr *cntlr); + int32_t (*Close)(struct SpiCntlr *cntlr); +}; +``` + +**表 1** SpiCntlrMethod结构体成员的回调函数功能说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

成员函数

+

入参

+

返回值

+

功能

+

Transfer

+

cntlr: 结构体指针,核心层spi控制器;msg: 结构体指针,Spi消息;count: uint32_t,消息个数

+

HDF_STATUS相关状态

+

传输消息

+

SetCfg

+

cntlr: 结构体指针,核心层spi控制器;cfg: 结构体指针,Spi属性

+

HDF_STATUS相关状态

+

设置控制器属性

+

GetCfg

+

cntlr: 结构体指针,核心层spi控制器;cfg: 结构体指针,Spi属性

+

HDF_STATUS相关状态

+

获取控制器属性

+

Open

+

cntlr: 结构体指针,核心层spi控制器;

+

HDF_STATUS相关状态

+

打开SPI

+

Close

+

cntlr: 结构体指针,核心层spi控制器;

+

HDF_STATUS相关状态

+

关闭SPI

+
+ +## 开发步骤 + +SPI模块适配HDF框架的三个环节是配置属性文件,实例化驱动入口,以及实例化核心层接口函数。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加spi\_config.hcs器件属性文件。 + +3. **实例化SPI控制器对象:** + - 初始化SpiCntlr成员。 + - 实例化SpiCntlr成员SpiCntlrMethod。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化SpiCntlr成员SpiCntlrMethod,其定义和成员说明见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如spi控制状态,中断响应情况等。 + + +## 开发实例 + +下方将以spi\_hi35xx.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 + + 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + SPI驱动入口参考: + + ``` + struct HdfDriverEntry g_hdfSpiDevice = { + .moduleVersion = 1, + .moduleName = "HDF_PLATFORM_SPI",//【必要 且与 HCS文件中里面的moduleName匹配】 + .Bind = HdfSpiDeviceBind, //见Bind参考 + .Init = HdfSpiDeviceInit, //见Init参考 + .Release = HdfSpiDeviceRelease, //见Release参考 + }; + //调用HDF_INIT将驱动入口注册到HDF框架中 + HDF_INIT(g_hdfSpiDevice); + ``` + +2. 完成驱动入口注册之后,下一步请在device\_info.hcs文件中添加deviceNode信息,并在 spi\_config.hcs 中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值与核心层SpiCntlr 成员的默认值或限制范围有密切关系。 + + 本例只有一个SPI控制器,如有多个器件信息,则需要在device\_info文件增加deviceNode信息,以及在spi\_config文件中增加对应的器件属性。 + + - device\_info.hcs 配置参考。 + + ``` + root { + device_info { + match_attr = "hdf_manager"; + platform :: host { + hostName = "platform_host"; + priority = 50; + device_spi :: device { //为每一个 SPI 控制器配置一个HDF设备节点 + device0 :: deviceNode { + policy = 1; + priority = 60; + permission = 0644; + moduleName = "HDF_PLATFORM_SPI"; + serviceName = "HDF_PLATFORM_SPI_0"; + deviceMatchAttr = "hisilicon_hi35xx_spi_0"; + } + device1 :: deviceNode { + policy = 1; + priority = 60; + permission = 0644; + moduleName = "HDF_PLATFORM_SPI"; // 【必要】用于指定驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 + serviceName = "HDF_PLATFORM_SPI_1"; // 【必要且唯一】驱动对外发布服务的名称 + deviceMatchAttr = "hisilicon_hi35xx_spi_1";// 需要与设备hcs文件中的 match_attr 匹配 + } + ... + } + } + } + } + ``` + + - spi\_config.hcs 配置参考。 + + ``` + root { + platform { + spi_config {//每一个SPI控制器配置私有数据 + template spi_controller {//模板公共参数, 继承该模板的节点如果使用模板中的默认值, 则节点字段可以缺省 + serviceName = ""; + match_attr = ""; + transferMode = 0; // 数据传输模式:中断传输(0),流控传输(1),DMA传输(2) + busNum = 0; // 总线号 + clkRate = 100000000; + bitsPerWord = 8; // 传输位宽 + mode = 19; // SPI 数据的输入输出模式 + maxSpeedHz = 0; // 最大时钟频率 + minSpeedHz = 0; // 最小时钟频率 + speed = 2000000; // 当前消息传输速度 + fifoSize = 256; // FIFO大小 + numCs = 1; // 片选号 + regBase = 0x120c0000; // 地址映射需要 + irqNum = 100; // 中断号 + REG_CRG_SPI = 0x120100e4; // CRG_REG_BASE(0x12010000) + 0x0e4 + CRG_SPI_CKEN = 0; + CRG_SPI_RST = 0; + REG_MISC_CTRL_SPI = 0x12030024; // MISC_REG_BASE(0x12030000) + 0x24 + MISC_CTRL_SPI_CS = 0; + MISC_CTRL_SPI_CS_SHIFT = 0; + } + controller_0x120c0000 :: spi_controller { + busNum = 0; //【必要】总线号 + CRG_SPI_CKEN = 0x10000; // (0x1 << 16) 0:close clk, 1:open clk + CRG_SPI_RST = 0x1; // (0x1 << 0) 0:cancel reset, 1:reset + match_attr = "hisilicon_hi35xx_spi_0";//【必要】需要和device_info.hcs中的deviceMatchAttr值一致 + } + controller_0x120c1000 :: spi_controller { + busNum = 1; + CRG_SPI_CKEN = 0x20000; // (0x1 << 17) 0:close clk, 1:open clk + CRG_SPI_RST = 0x2; // (0x1 << 1) 0:cancel reset, 1:reset + match_attr = "hisilicon_hi35xx_spi_1"; + regBase = 0x120c1000; //【必要】地址映射需要 + irqNum = 101; //【必要】中断号 + } + ... + // 【可选】可新增,但需要在 device_info.hcs 添加对应的节点 + } + } + } + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层SpiCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化SpiCntlr成员SpiCntlrMethod(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考。 + + 从驱动的角度看,自定义结构体是参数和数据的载体,而且spi\_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,一些重要数值也会传递给核心层对象,例如设备号、总线号等。 + + ``` + struct Pl022 {//对应于hcs中的参数 + struct SpiCntlr *cntlr; + struct DListHead deviceList; + struct OsalSem sem; + volatile unsigned char *phyBase; + volatile unsigned char *regBase; + uint32_t irqNum; + uint32_t busNum; + uint32_t numCs; + uint32_t curCs; + uint32_t speed; + uint32_t fifoSize; + uint32_t clkRate; + uint32_t maxSpeedHz; + uint32_t minSpeedHz; + uint32_t regCrg; + uint32_t clkEnBit; + uint32_t clkRstBit; + uint32_t regMiscCtrl; + uint32_t miscCtrlCsShift; + uint32_t miscCtrlCs; + uint16_t mode; + uint8_t bitsPerWord; + uint8_t transferMode; + }; + + //SpiCntlr是核心层控制器结构体,其中的成员在Init函数中会被赋值 + struct SpiCntlr { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + uint32_t busNum; + uint32_t numCs; + uint32_t curCs; + struct OsalMutex lock; + struct SpiCntlrMethod *method; + struct DListHead list; + void *priv; + }; + ``` + + - SpiCntlr成员回调函数结构体SpiCntlrMethod的实例化,其他成员在Init函数中初始化。 + + ``` + // spi_hi35xx.c 中的示例:钩子函数的实例化 + struct SpiCntlrMethod g_method = { + .Transfer = Pl022Transfer, + .SetCfg = Pl022SetCfg, + .GetCfg = Pl022GetCfg, + .Open = Pl022Open, + .Close = Pl022Close, + }; + ``` + + - Bind 函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值**:** + + HDF\_STATUS相关状态。 + + 函数说明**:** + + 将 SpiCntlr 对象同 HdfDeviceObject 进行了关联。 + + ``` + static int32_t HdfSpiDeviceBind(struct HdfDeviceObject *device) + { + ... + return (SpiCntlrCreate(device) == NULL) ? HDF_FAILURE : HDF_SUCCESS; + } + + struct SpiCntlr *SpiCntlrCreate(struct HdfDeviceObject *device) + { + struct SpiCntlr *cntlr = NULL; //创建核心层 SpiCntlr 对象 + ... + cntlr = (struct SpiCntlr *)OsalMemCalloc(sizeof(*cntlr));//分配内存 + ... + cntlr->device = device; //使HdfDeviceObject与SpiCntlr可以相互转化的前提 + device->service = &(cntlr->service);//使HdfDeviceObject与SpiCntlr可以相互转化的前提 + (void)OsalMutexInit(&cntlr->lock); //锁初始化 + DListHeadInit(&cntlr->list); //添加对应的节点 + cntlr->priv = NULL; + return cntlr; + } + ``` + + - Init函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值**:** + + HDF\_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + **表 2** init函数入参和返回值 + + + + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

控制器对象非法

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_INVALID_PARAM

+

参数非法

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

初始化成功

+

HDF_FAILURE

+

初始化失败

+
+ + 函数说明**:** + + 初始化自定义结构体对象,初始化SpiCntlr成员。 + + ``` + static int32_t HdfSpiDeviceInit(struct HdfDeviceObject *device) + { + int32_t ret; + struct SpiCntlr *cntlr = NULL; + ... + cntlr = SpiCntlrFromDevice(device);//这里有HdfDeviceObject到SpiCntlr的强制转化,通过service成员,赋值见Bind函数 + //return (device == NULL) ? NULL : (struct SpiCntlr *)device->service; + ... + ret = Pl022Init(cntlr, device);//【必要】实例化厂商自定义操作对象,示例见下 + ... + ret = Pl022Probe(cntlr->priv); + ... + return ret; + } + + static int32_t Pl022Init(struct SpiCntlr *cntlr, const struct HdfDeviceObject *device) + { + int32_t ret; + struct Pl022 *pl022 = NULL; + ... + pl022 = (struct Pl022 *)OsalMemCalloc(sizeof(*pl022));//申请内存 + ... + ret = SpiGetBaseCfgFromHcs(pl022, device->property); //初始化busNum, numCs, speed, fifoSize, clkRate,mode, bitsPerWord, transferMode参数值 + ... + ret = SpiGetRegCfgFromHcs(pl022, device->property); //初始化regBase, phyBase, irqNum, regCrg, clkEnBit,clkRstBit, regMiscCtrl, regMiscCtrl, miscCtrlCs,miscCtrlCsShift参数值 + ... + //计算最大,最小速度对应的频率 + pl022->maxSpeedHz = (pl022->clkRate) / ((SCR_MIN + 1) * CPSDVSR_MIN); + pl022->minSpeedHz = (pl022->clkRate) / ((SCR_MAX + 1) * CPSDVSR_MAX); + DListHeadInit(&pl022->deviceList);//初始化DList链表 + pl022->cntlr = cntlr; //使Pl022与SpiCntlr可以相互转化的前提 + cntlr->priv = pl022; //使Pl022与SpiCntlr可以相互转化的前提 + cntlr->busNum = pl022->busNum; //给SpiCntlr的busNum赋值 + cntlr->method = &g_method; //SpiCntlrMethod的实例化对象的挂载 + ... + ret = Pl022CreatAndInitDevice(pl022); + if (ret != 0) { + Pl022Release(pl022); //初始化失败就释放Pl022对象 + return ret; + } + return 0; + } + ``` + + - Release函数参考 + + 入参**:** + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + 无。 + + 函数说明: + + 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。 + + ``` + static void HdfSpiDeviceRelease(struct HdfDeviceObject *device) + { + struct SpiCntlr *cntlr = NULL; + ... + cntlr = SpiCntlrFromDevice(device);//这里有HdfDeviceObject到SpiCntlr的强制转化,通过service成员,赋值见Bind函数 + // return (device==NULL) ?NULL:(struct SpiCntlr *)device->service; + ... + if (cntlr->priv != NULL) { + Pl022Remove((struct Pl022 *)cntlr->priv);//这里有SpiCntlr到Pl022的强制转化 + } + SpiCntlrDestroy(cntlr); //释放Pl022对象 + } + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/10.UART.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/10.UART.md" new file mode 100644 index 0000000000000000000000000000000000000000..a7c05dfaeeee14d4c80e1dabd2a2073be1ced1e9 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/10.UART.md" @@ -0,0 +1,560 @@ +--- +title: UART +permalink: /pages/0004010109 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# UART + +- [概述](#section1761881586154520) +- [接口说明](#section752964871810) +- [开发步骤](#section944397404154520) +- [开发实例](#section774610224154520) + +## 概述 + +UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,在HDF框架中,UART的接口适配模式采用独立服务模式。在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用。 + +**图 1** UART独立服务模式结构图 +![](/images/device-dev/driver/figures/UART独立服务模式结构图.png "UART独立服务模式结构图") + +## 接口说明 + +UartHostMethod定义: + +``` +struct UartHostMethod { + int32_t (*Init)(struct UartHost *host); + int32_t (*Deinit)(struct UartHost *host); + int32_t (*Read)(struct UartHost *host, uint8_t *data, uint32_t size); + int32_t (*Write)(struct UartHost *host, uint8_t *data, uint32_t size); + int32_t (*GetBaud)(struct UartHost *host, uint32_t *baudRate); + int32_t (*SetBaud)(struct UartHost *host, uint32_t baudRate); + int32_t (*GetAttribute)(struct UartHost *host, struct UartAttribute *attribute); + int32_t (*SetAttribute)(struct UartHost *host, struct UartAttribute *attribute); + int32_t (*SetTransMode)(struct UartHost *host, enum UartTransMode mode); + int32_t (*pollEvent)(struct UartHost *host, void *filep, void *table); +}; +``` + +**表 1** UartHostMethod结构体成员的回调函数功能说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

函数

+

入参

+

出参

+

返回值

+

功能

+

Init

+

host: 结构体指针,核心层uart控制器;

+

+

HDF_STATUS相关状态

+

初始化Uart设备

+

Deinit

+

host: 结构体指针,核心层uart控制器;

+

+

HDF_STATUS相关状态

+

去初始化Uart设备

+

Read

+

host: 结构体指针,核心层uart控制器;size:uint32_t,数据大小;

+

data: uint8_t指针,传出的数据

+

HDF_STATUS相关状态

+

接收数据 RX

+

Write

+

host: 结构体指针,核心层uart控制器;data:uint8_t指针,传入数据;size:uint32_t,数据大小;

+

+

HDF_STATUS相关状态

+

发送数据 TX

+

SetBaud

+

host: 结构体指针,核心层uart控制器;baudRate: uint32_t指针,波特率传入值;

+

+

HDF_STATUS相关状态

+

设置波特率

+

GetBaud

+

host: 结构体指针,核心层uart控制器;

+

baudRate: uint32_t指针,传出的波特率;

+

HDF_STATUS相关状态

+

获取当前设置的波特率

+

GetAttribute

+

host: 结构体指针,核心层uart控制器;

+

attribute: 结构体指针,传出的属性值(见uart_if.h中UartAttribute定义)

+

HDF_STATUS相关状态

+

获取设备uart相关属性

+

SetAttribute

+

host: 结构体指针,核心层uart控制器;attribute: 结构体指针,属性传入值;

+

+

HDF_STATUS相关状态

+

设置设备uart相关属性

+

SetTransMode

+

host: 结构体指针,核心层uart控制器;mode: 枚举值(见uart_if.h中UartTransMode定义),传输模式

+

+

HDF_STATUS相关状态

+

设置传输模式

+

PollEvent

+

host: 结构体指针,核心层uart控制器;filep: void 指针,file ;table: void 指针,poll_table ;

+

+

HDF_STATUS相关状态

+

poll机制

+
+ +## 开发步骤 + +UART模块适配HDF框架的三个环节是配置属性文件,实例化驱动入口,以及实例化核心层接口函数。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加uart\_config.hcs器件属性文件。 + +3. **实例化UART控制器对象:** + - 初始化UartHost成员。 + - 实例化UartHost成员UartHostMethod。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化UartHost成员UartHostMethod,其定义和成员说明见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如UART控制状态,中断响应情况等。 + + +## 开发实例 + +下方将以uart\_hi35xx.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 + + 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + UART驱动入口参考: + + ``` + struct HdfDriverEntry g_hdfUartDevice = { + .moduleVersion = 1, + .moduleName = "HDF_PLATFORM_UART",//【必要且与 HCS 里面的名字匹配】 + .Bind = HdfUartDeviceBind, //见Bind参考 + .Init = HdfUartDeviceInit, //见Init参考 + .Release = HdfUartDeviceRelease, //见Release参考 + }; + //调用HDF_INIT将驱动入口注册到HDF框架中 + HDF_INIT(g_hdfUartDevice); + ``` + +2. 完成驱动入口注册之后,下一步请在device\_info.hcs文件中添加deviceNode信息,并在 uart\_config.hcs 中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值与核心层UartHost成员的默认值或限制范围有密切关系。 + + 本例只有一个UART控制器,如有多个器件信息,则需要在device\_info文件增加deviceNode信息,以及在uart\_config文件中增加对应的器件属性。 + + - device\_info.hcs 配置参考。 + + ``` + root { + device_info { + match_attr = "hdf_manager"; + platform :: host { + hostName = "platform_host"; + priority = 50; + device_uart :: device { + device0 :: deviceNode { + policy = 1; //驱动服务发布的策略,policy大于等于1(用户态可见为2,仅内核态可见为1); + priority = 40; //驱动启动优先级 + permission = 0644; //驱动创建设备节点权限 + moduleName = "HDF_PLATFORM_UART"; //驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 + serviceName = "HDF_PLATFORM_UART_0";//驱动对外发布服务的名称,必须唯一,必须要按照HDF_PLATFORM_UART_X的格式,X为UART控制器编号 + deviceMatchAttr = "hisilicon_hi35xx_uart_0";//驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值一致 + } + device1 :: deviceNode { + policy = 2; + permission = 0644; + priority = 40; + moduleName = "HDF_PLATFORM_UART"; + serviceName = "HDF_PLATFORM_UART_1"; + deviceMatchAttr = "hisilicon_hi35xx_uart_1"; + } + ... + } + } + } + } + ``` + + - uart\_config.hcs 配置参考。 + + ``` + root { + platform { + template uart_controller {//模板公共参数, 继承该模板的节点如果使用模板中的默认值, 则节点字段可以缺省 + match_attr = ""; + num = 0; //【必要】设备号 + baudrate = 115200; //【必要】波特率,数值可按需填写 + fifoRxEn = 1; //【必要】使能接收FIFO + fifoTxEn = 1; //【必要】使能发送FIFO + flags = 4; //【必要】标志信号 + regPbase = 0x120a0000; //【必要】地址映射需要 + interrupt = 38; //【必要】中断号 + iomemCount = 0x48; //【必要】地址映射需要 + } + controller_0x120a0000 :: uart_controller { + match_attr = "hisilicon_hi35xx_uart_0";//【必要】必须和device_info.hcs中对应的设备的deviceMatchAttr值一致 + } + controller_0x120a1000 :: uart_controller { + num = 1; + baudrate = 9600; + regPbase = 0x120a1000; + interrupt = 39; + match_attr = "hisilicon_hi35xx_uart_1"; + } + ... + // 【可选】可新增,但需要在 device_info.hcs 添加对应的节点 + } + } + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层UartHost对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化UartHost成员UartHostMethod(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考。 + + 从驱动的角度看,自定义结构体是参数和数据的载体,而且uart\_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,一些重要数值也会传递给核心层对象,例如设备号等。 + + ``` + struct UartPl011Port { //接口相关的结构体 + int32_t enable; + unsigned long physBase; //物理地址 + uint32_t irqNum; //中断号 + uint32_t defaultBaudrate;//默认波特率 + uint32_t flags; //标志信号,下面三个宏与之相关 + #define PL011_FLG_IRQ_REQUESTED (1 << 0) + #define PL011_FLG_DMA_RX_REQUESTED (1 << 1) + #define PL011_FLG_DMA_TX_REQUESTED (1 << 2) + struct UartDmaTransfer *rxUdt; //DMA传输相关 + struct UartDriverData *udd; //见下 + }; + struct UartDriverData { //数据传输相关的结构体 + uint32_t num; + uint32_t baudrate; //波特率(可设置) + struct UartAttribute attr; //数据位、停止位等传输属性相关 + struct UartTransfer *rxTransfer; //缓冲区相关,可理解为FIFO结构 + wait_queue_head_t wait; //条件变量相关的排队等待信号 + int32_t count; //数据数量 + int32_t state; //uart控制器状态 + #define UART_STATE_NOT_OPENED 0 + #define UART_STATE_OPENING 1 + #define UART_STATE_USEABLE 2 + #define UART_STATE_SUSPENED 3 + uint32_t flags; //状态标志 + #define UART_FLG_DMA_RX (1 << 0) + #define UART_FLG_DMA_TX (1 << 1) + #define UART_FLG_RD_BLOCK (1 << 2) + RecvNotify recv; //函数指针类型,指向串口数据接收函数 + struct UartOps *ops; //自定义函数指针结构体,详情见device/hisilicon/drivers/uart/uart_pl011.c + void *private; //一般用来存储UartPl011Port首地址,方便调用 + }; + + // UartHost是核心层控制器结构体,其中的成员在Init函数中会被赋值 + struct UartHost { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + uint32_t num; + OsalAtomic atom; + void *priv; //一般存储厂商自定义结构体首地址,方便后者被调用 + struct UartHostMethod *method; //核心层钩子函数,厂商需要实现其成员函数功能并实例化 + }; + ``` + + - UartHost成员回调函数结构体UartHostMethod的实例化,其他成员在Bind函数中初始化。 + + ``` + // uart_hi35xx.c 中的示例:钩子函数的实例化 + struct UartHostMethod g_uartHostMethod = { + .Init = Hi35xxInit, + .Deinit = Hi35xxDeinit, + .Read = Hi35xxRead, + .Write = Hi35xxWrite, + .SetBaud = Hi35xxSetBaud, + .GetBaud = Hi35xxGetBaud, + .SetAttribute = Hi35xxSetAttribute, + .GetAttribute = Hi35xxGetAttribute, + .SetTransMode = Hi35xxSetTransMode, + .pollEvent = Hi35xxPollEvent, + }; + ``` + + - Bind函数参考 + + 入参: + + HdfDeviceObject 这个是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + **返回值:** + + HDF\_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + **表 2** Bind函数入参和返回值 + + + + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

控制器对象非法

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_INVALID_PARAM

+

参数非法

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

初始化成功

+

HDF_FAILURE

+

初始化失败

+
+ + 函数说明: + + 初始化自定义结构体对象,初始化UartHost成员。 + + ``` + //uart_hi35xx.c + static int32_t HdfUartDeviceBind(struct HdfDeviceObject *device) + { + ... + return (UartHostCreate(device) == NULL) ? HDF_FAILURE : HDF_SUCCESS;//【必须做】调用核心层函数 UartHostCreate + } + //uart_core.c 核心层 UartHostCreate 函数说明 + struct UartHost *UartHostCreate(struct HdfDeviceObject *device) + { + struct UartHost *host = NULL; //新建 UartHost + ... + host = (struct UartHost *)OsalMemCalloc(sizeof(*host));//分配内存 + ... + host->device = device; //【必要】使HdfDeviceObject与UartHost可以相互转化的前提 + device->service = &(host->service);//【必要】使HdfDeviceObject与UartHost可以相互转化的前提 + host->device->service->Dispatch = UartIoDispatch;//为 service 成员的 Dispatch 方法赋值 + OsalAtomicSet(&host->atom, 0); //原子量初始化或者原子量设置 + host->priv = NULL; + host->method = NULL; + return host; + } + ``` + + - Init函数参考 + + 入参**:** + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + HDF\_STATUS相关状态。 + + 函数说明: + + 初始化自定义结构体对象,初始化UartHost成员,调用核心层UartAddDev函数,接入VFS。 + + ``` + int32_t HdfUartDeviceInit(struct HdfDeviceObject *device) + { + int32_t ret; + struct UartHost *host = NULL; + HDF_LOGI("%s: entry", __func__); + ... + host = UartHostFromDevice(device);//通过service成员后强制转为UartHost,赋值是在Bind函数中 + ... + ret = Hi35xxAttach(host, device); //完成UartHost对象的初始化,见下 + ... + host->method = &g_uartHostMethod; //UartHostMethod的实例化对象的挂载 + return ret; + } + //完成 UartHost 对象的初始化 + static int32_t Hi35xxAttach(struct UartHost *host, struct HdfDeviceObject *device) + { + int32_t ret; + //udd 和 port 对象是厂商自定义的结构体对象,可根据需要实现相关功能 + struct UartDriverData *udd = NULL; + struct UartPl011Port *port = NULL; + ... + // 【必要相关功能】步骤【1】~【7】主要实现对 udd 对象的实例化赋值,然后赋值给核心层UartHost对象上 + udd = (struct UartDriverData *)OsalMemCalloc(sizeof(*udd));//【1】 + ... + port = (struct UartPl011Port *)OsalMemCalloc(sizeof(struct UartPl011Port));//【2】 + ... + udd->ops = Pl011GetOps();//【3】设备开启、关闭、属性设置、发送操作等函数挂载 + udd->recv = PL011UartRecvNotify;//【4】数据接收通知函数(条件锁机制)挂载 + udd->count = 0; //【5】 + port->udd = udd; //【6】使UartPl011Port与UartDriverData可以相互转化的前提 + ret = UartGetConfigFromHcs(port, device->property);//【必要】 此步骤是将 HdfDeviceObject 的属性传递给厂商自定义结构体 + // 用于相关操作,示例代码见下 + ... + udd->private = port; //【7】 + + host->priv = udd; //【必要】使UartHost与UartDriverData可以相互转化的前提 + host->num = udd->num;//【必要】uart 设备号 + UartAddDev(host); //【必要】核心层uart_dev.c 中的函数,作用:注册了一个字符设备节点到vfs, 这样从用户态可以通过这个虚拟文件节点访问uart + return HDF_SUCCESS; + } + + static int32_t UartGetConfigFromHcs(struct UartPl011Port *port, const struct DeviceResourceNode *node) + { + uint32_t tmp, regPbase, iomemCount; + struct UartDriverData *udd = port->udd; + struct DeviceResourceIface *iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + ... + //通过请求参数提取相应的值,并赋值给厂商自定义的结构体 + if (iface->GetUint32(node, "num", &udd->num, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: read busNum fail", __func__); + return HDF_FAILURE; + } + ... + return 0; + } + ``` + + - Release函数参考 + + 入参: + + HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。 + + 返回值: + + 无。 + + 函数说明: + + 该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源, 该函数中需包含释放内存和删除控制器等操作。所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。 + + ``` + void HdfUartDeviceRelease(struct HdfDeviceObject *device) + { + struct UartHost *host = NULL; + ... + host = UartHostFromDevice(device);//这里有HdfDeviceObject到UartHost的强制转化,通过service成员,赋值见Bind函数 + ... + if (host->priv != NULL) { + Hi35xxDetach(host); //厂商自定义的内存释放函数,见下 + } + UartHostDestroy(host); //调用核心层函数释放host + } + + static void Hi35xxDetach(struct UartHost *host) + { + struct UartDriverData *udd = NULL; + struct UartPl011Port *port = NULL; + ... + udd = host->priv; //这里有UartHost到UartDriverData的转化 + ... + UartRemoveDev(host);//VFS注销 + port = udd->private;//这里有UartDriverData到UartPl011Port的转化 + if (port != NULL) { + if (port->physBase != 0) { + OsalIoUnmap((void *)port->physBase);//地址反映射 + } + (void)OsalMemFree(port); + udd->private = NULL; + } + (void)OsalMemFree(udd);//释放UartDriverData + host->priv = NULL; + } + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/11.WatchDog.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/11.WatchDog.md" new file mode 100644 index 0000000000000000000000000000000000000000..8a4bc0188025efb3f38576a3295d97a734cdca34 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/11.WatchDog.md" @@ -0,0 +1,378 @@ +--- +title: WatchDog +permalink: /pages/000401010a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:31 +--- +# WatchDog + +- [概述](#section1315827527160117) +- [接口说明](#section752964871810) +- [开发步骤](#section477974542160117) +- [开发实例](#section1832270347160117) + +## 概述 + +看门狗(Watchdog),又叫看门狗计时器(Watchdog timer),是一种硬件的计时设备,在HDF框架中,Watchdog接口适配模式采用独立服务模式,在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDFDeviceManager的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用。 + +**图 1** Watchdog独立服务模式结构图 +![](/images/device-dev/driver/figures/Watchdog独立服务模式结构图.png "Watchdog独立服务模式结构图") + +## 接口说明 + +WatchdogMethod定义: + +``` +struct WatchdogMethod { + int32_t (*getStatus)(struct WatchdogCntlr *wdt, int32_t *status); + int32_t (*setTimeout)(struct WatchdogCntlr *wdt, uint32_t seconds); + int32_t (*getTimeout)(struct WatchdogCntlr *wdt, uint32_t *seconds); + int32_t (*start)(struct WatchdogCntlr *wdt); + int32_t (*stop)(struct WatchdogCntlr *wdt); + int32_t (*feed)(struct WatchdogCntlr *wdt); + int32_t (*getPriv)(struct WatchdogCntlr *wdt); //【可选】如果WatchdogCntlr 中的priv成员存在,则按需实例化 + void (*releasePriv)(struct WatchdogCntlr *wdt);//【可选】 +}; +``` + +**表 1** WatchdogMethod成员的回调函数功能说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

成员函数

+

入参

+

出参

+

返回值

+

功能

+

getStatus

+

wdt: 结构体指针,核心层WDG控制器;

+

status: int32_t指针,表示狗的状态(打开或关闭);

+

HDF_STATUS相关状态

+

获取看门狗所处的状态

+

start

+

wdt: 结构体指针,核心层WDG控制器;

+

+

HDF_STATUS相关状态

+

打开开门狗

+

stop

+

wdt: 结构体指针,核心层WDG控制器;

+

+

HDF_STATUS相关状态

+

关闭开门狗

+

setTimeout

+

wdt: 结构体指针,核心层WDG控制器;seconds: uint32_t,时间传入值;

+

+

HDF_STATUS相关状态

+

设置超时时间值,单位秒,需要保证看门狗实际运行的时间符合该值

+

getTimeout

+

wdt: 结构体指针,核心层WDG控制器;

+

seconds: uint32_t,传出的时间值

+

HDF_STATUS相关状态

+

回读设置的超时时间值

+

feed

+

wdt: 结构体指针,核心层WDG控制器;

+

+

HDF_STATUS相关状态

+

喂狗

+
+ +## 开发步骤 + +Watchdog模块适配HDF框架的三个环节是配置属性文件,实例化驱动入口,以及实例化核心层接口函数。 + +1. **实例化驱动入口:** + - 实例化HdfDriverEntry结构体成员。 + - 调用HDF\_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 + +2. **配置属性文件:** + - 在device\_info.hcs文件中添加deviceNode描述。 + - 【可选】添加watchdog\_config.hcs器件属性文件。 + +3. **实例化Watchdog控制器对象:** + - 初始化WatchdogCntlr成员。 + - 实例化WatchdogCntlr成员WatchdogMethod。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >实例化WatchdogCntlr成员WatchdogMethod,其定义和成员说明见[接口说明](#section752964871810)。 + + +4. **驱动调试:** + + 【可选】针对新增驱动程序,建议验证驱动基本功能,例如挂载后的信息反馈,超时时间设置的成功与否等。 + + +## 开发实例 + +下方将以watchdog\_hi35xx.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。 + +1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf\_device\_desc.h 中定义)类型的全局变量,且moduleName要和device\_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 + + 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 + + Watchdog驱动入口参考: + + ``` + struct HdfDriverEntry g_watchdogDriverEntry = { + .moduleVersion = 1, + .Bind = Hi35xxWatchdogBind, //见Bind参考 + .Init = Hi35xxWatchdogInit, //见Init参考 + .Release = Hi35xxWatchdogRelease, //见Release参考 + .moduleName = "HDF_PLATFORM_WATCHDOG",//【必要且与HCS文件中里面的moduleName匹配】 + }; + HDF_INIT(g_watchdogDriverEntry);//调用HDF_INIT将驱动入口注册到HDF框架中 + ``` + +2. 完成驱动入口注册之后,下一步请在device\_info.hcs文件中添加deviceNode信息,并在 watchdog\_config.hcs 中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值与核心层WatchdogCntlr 成员的默认值或限制范围有密切关系。 + + 本例只有一个Watchdog控制器,如有多个器件信息,则需要在device\_info文件增加deviceNode信息,以及在watchdog\_config文件中增加对应的器件属性。 + + - device\_info.hcs 配置参考。 + + ``` + root { + device_info { + match_attr = "hdf_manager"; + device_watchdog :: device { // 设备节点 + device0 :: deviceNode { // 驱动的DeviceNode节点 + policy = 1; // policy字段是驱动服务发布的策略,如果需要面向用户态,则为2 + priority = 20; // 驱动启动优先级 + permission = 0644; // 驱动创建设备节点权限 + moduleName = "HDF_PLATFORM_WATCHDOG"; + // 【必要】驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 + serviceName = "HDF_PLATFORM_WATCHDOG_0"; + // 【必要且唯一】驱动对外发布服务的名称 + deviceMatchAttr = "hisilicon_hi35xx_watchdog_0"; + // 【必要】驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 + } + } + } + } + ``` + + - watchdog\_config.hcs 配置参考。 + + ``` + root { + platform { + template watchdog_controller {//【必要】模板配置,继承该模板的节点如果使用模板中的默认值,则节点字段可以缺省 + id = 0; + match_attr = ""; + regBase = 0x12050000; //【必要】地址映射需要 + regStep = 0x1000; //【必要】地址映射需要 + } + controller_0x12050000 :: watchdog_controller {//【必要】是作为设备驱动私有数据匹配的关键字 + match_attr = "hisilicon_hi35xx_watchdog_0"; //【必要】必须和device_info.hcs中的deviceMatchAttr值一致 + } + //存在多个 watchdog 时【必须】添加,否则不用 + ... + } + } + ``` + +3. 完成驱动入口注册之后,最后一步就是以核心层WatchdogCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化WatchdogCntlr成员WatchdogMethod(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 + - 自定义结构体参考。 + + 从驱动的角度看,自定义结构体是参数和数据的载体,而且watchdog\_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,其中一些重要数值也会传递给核心层WatchdogCntlr对象,例如索引、管脚数等。 + + ``` + struct Hi35xxWatchdog { + struct WatchdogCntlr wdt; //【必要】是链接上下层的载体,具体描述见下面 + OsalSpinlock lock; + volatile unsigned char *regBase;//【必要】地址映射需要 + uint32_t phyBase; //【必要】地址映射需要 + uint32_t regStep; //【必要】地址映射需要 + }; + //WatchdogCntlr是核心层控制器结构体,其中的成员在Init函数中会被赋值 + struct WatchdogCntlr { + struct IDeviceIoService service;//驱动服务 + struct HdfDeviceObject *device; //驱动设备 + OsalSpinlock lock; //此变量在HDF核心层被调用来实现自旋锁功能 + struct WatchdogMethod *ops; //接口回调函数 + int16_t wdtId; //WDG设备的识别id + void *priv; //存储指针 + }; + ``` + + - WatchdogCntlr成员回调函数结构体WatchdogMethod的实例化,其他成员在Init和Bind函数中初始化。 + + ``` + static struct WatchdogMethod g_method = { + .getStatus = Hi35xxWatchdogGetStatus, + .start = Hi35xxWatchdogStart, + .stop = Hi35xxWatchdogStop, + .setTimeout = Hi35xxWatchdogSetTimeout, + .getTimeout = Hi35xxWatchdogGetTimeout, + .feed = Hi35xxWatchdogFeed, + }; + ``` + + - Init函数和Bind函数参考 + + 入参**:** + + HdfDeviceObject :HDF框架给每一个驱动创建的设备对象,用来保存设备相关的私有数据和服务接口。 + + 返回值**:** + + HDF\_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf\_base.h中HDF\_STATUS 定义)。 + + **表 2** Init函数和Bind函数入参和返回值 + + + + + + + + + + + + + + + + + + + + + + +

状态(值)

+

问题描述

+

HDF_ERR_INVALID_OBJECT

+

找不到 WDG 设备

+

HDF_ERR_MALLOC_FAIL

+

内存分配失败

+

HDF_ERR_IO

+

I/O 错误

+

HDF_SUCCESS

+

初始化成功

+

HDF_FAILURE

+

初始化失败

+
+ + 函数说明**:** + + 初始化自定义结构体对象,初始化WatchdogCntlr成员,调用核心层WatchdogCntlrAdd函数。 + + ``` + //一般而言,Init函数需要根据入参(HdfDeviceObject对象)的属性值初始化Hi35xxWatchdog结构体的成员, + //但本例中是在bind函数中实现的 + static int32_t Hi35xxWatchdogInit(struct HdfDeviceObject *device) + { + (void)device; + return HDF_SUCCESS; + } + + static int32_t Hi35xxWatchdogBind(struct HdfDeviceObject *device) + { + int32_t ret; + struct Hi35xxWatchdog *hwdt = NULL; + ... + hwdt = (struct Hi35xxWatchdog *)OsalMemCalloc(sizeof(*hwdt));//Hi35xxWatchdog 结构体的内存申请 + ... + hwdt->regBase = OsalIoRemap(hwdt->phyBase, hwdt->regStep); //地址映射 + ... + hwdt->wdt.priv = (void *)device->property;//【可选】此处是将设备属性的内容赋值给priv成员,但后续没有调用 priv 成员, + // 如果需要用到priv成员,需要额外实例化WatchdogMethod的getPriv和releasePriv成员函数 + hwdt->wdt.ops = &g_method; //【必要】将实例化后的对象赋值给ops成员,就可以实现顶层调用WatchdogMethod成员函数 + hwdt->wdt.device = device; //【必要】这是为了方便HdfDeviceObject与WatchdogcCntlr相互转化 + ret = WatchdogCntlrAdd(&hwdt->wdt); //【必要】调用此函数初始化核心层结构体,返回成功信号后驱动才完全接入平台核心层 + if (ret != HDF_SUCCESS) { //不成功的话,需要释放Init函数申请的资源 + OsalIoUnmap((void *)hwdt->regBase); + OsalMemFree(hwdt); + return ret; + } + return HDF_SUCCESS; + } + ``` + + - Release函数参考 + + 入参: + + HdfDeviceObject :HDF框架给每一个驱动创建的设备对象,用来保存设备相关的私有数据和服务接口。 + + 返回值**:** + + 无。 + + 函数说明**:** + + 该函数需要在驱动入口结构体中赋值给Release,当HDF框架调用Init函数初始化驱动失败时,可以调用Release释放驱动资源。该函数中需包含释放内存和删除控制器等操作。所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。 + + ``` + static void Hi35xxWatchdogRelease(struct HdfDeviceObject *device) + { + struct WatchdogCntlr *wdt = NULL; + struct Hi35xxWatchdog *hwdt = NULL; + ... + wdt = WatchdogCntlrFromDevice(device);//这里会通过service成员将HdfDeviceObject转化为WatchdogCntlr + //return (device == NULL) ? NULL : (struct WatchdogCntlr *)device->service; + if (wdt == NULL) { + return; + } + WatchdogCntlrRemove(wdt); //核心层函数,实际执行wdt->device->service = NULL以及cntlr->lock的释放 + hwdt = (struct Hi35xxWatchdog *)wdt; //这里将WatchdogCntlr转化为HimciHost + if (hwdt->regBase != NULL) { //解除地址映射 + OsalIoUnmap((void *)hwdt->regBase); + hwdt->regBase = NULL; + } + OsalMemFree(hwdt); //释放厂商自定义对象占用的内存 + } + ``` + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/01.GPIO.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/01.GPIO.md" similarity index 87% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/01.GPIO.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/01.GPIO.md" index b865731adc05565d49bc0a64155e2ad72e19b425..9eee61b7348fbd0241cf231194a5738af9c64b47 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/01.GPIO.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/01.GPIO.md" @@ -1,6 +1,6 @@ --- title: GPIO -permalink: /pages/00030200 +permalink: /pages/0004010200 navbar: true sidebar: true prev: true @@ -9,13 +9,12 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- -# GPIO +# GPIO - [概述](#section1635911016188) - - [接口说明](#section17715915181611) - +- [接口说明](#section589913442203) - [使用指导](#section259614242196) - [使用流程](#section103477714216) - [确定GPIO管脚号](#section370083272117) @@ -35,81 +34,79 @@ GPIO接口定义了操作GPIO管脚的标准方法集合,包括: - 设置管脚中断服务函数:设置一个管脚的中断响应函数,以及中断触发方式 - 使能和禁止管脚中断:禁止或使能管脚中断 -### 接口说明 +## 接口说明 **表 1** GPIO驱动API接口功能介绍 - -

功能分类

+ + - - - - - - - - - - - - - - - - - - - - -

功能分类

接口名

+

接口名

描述

+

描述

GPIO读写

+

GPIO读写

GpioRead

+

GpioRead

读管脚电平值

+

读管脚电平值

GpioWrite

+

GpioWrite

写管脚电平值

+

写管脚电平值

GPIO配置

+

GPIO配置

GpioSetDir

+

GpioSetDir

设置管脚方向

+

设置管脚方向

GpioGetDir

+

GpioGetDir

获取管脚方向

+

获取管脚方向

GPIO中断设置

+

GPIO中断设置

GpioSetIrq

+

GpioSetIrq

设置管脚对应的中断服务函数

+

设置管脚对应的中断服务函数

GpioUnSetIrq

+

GpioUnSetIrq

取消管脚对应的中断服务函数

+

取消管脚对应的中断服务函数

GpioEnableIrq

+

GpioEnableIrq

使能管脚中断

+

使能管脚中断

GpioDisableIrq

+

GpioDisableIrq

禁止管脚中断

+

禁止管脚中断

->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 ## 使用指导 ### 使用流程 -GPIO标准API通过GPIO管脚号来操作指定管脚,使用GPIO的一般流程如[图1](#fig1399416053717)所示。 - -**图 1** GPIO使用流程图 - +GPIO标准API通过GPIO管脚号来操作指定管脚,使用GPIO的一般流程如[图1](#fig16151101653713)所示。 -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001170187071.png) +**图 1** GPIO使用流程图 +![](/images/device-dev/driver/figures/GPIO使用流程图.png "GPIO使用流程图") ### 确定GPIO管脚号 @@ -339,7 +336,7 @@ GPIO标准API通过GPIO管脚号来操作指定管脚,使用GPIO的一般流
- >![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** + >![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >同一时间,只能为某个GPIO管脚设置一个中断服务函数,如果重复调用GpioSetIrq函数,则之前设置的中断服务函数会被取代。 当不再需要响应中断服务函数时,使用如下函数取消中断设置: @@ -412,7 +409,7 @@ GPIO标准API通过GPIO管脚号来操作指定管脚,使用GPIO的一般流 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** + >![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >必须通过此函数使能管脚中断,之前设置的中断服务函数才能被正确响应。 如果要临时屏蔽此中断,可以通过如下函数禁止GPIO管脚中断: diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/02.I2C.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/02.I2C.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/02.I2C.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/02.I2C.md" index 0c52327ec2c637f780f4110a7f2c93994a13f239..05088b6202d39ecad89b766c3dc54de8a57f227f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/02.I2C.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/02.I2C.md" @@ -1,6 +1,6 @@ --- title: I2C -permalink: /pages/00030201 +permalink: /pages/0004010201 navbar: true sidebar: true prev: true @@ -9,13 +9,12 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- -# I2C +# I2C - [概述](#section5361140416) - - [接口说明](#section459052019177) - +- [接口说明](#section545869122317) - [使用指导](#section1695201514281) - [使用流程](#section1338373417288) - [打开I2C控制器](#section13751110132914) @@ -38,10 +37,10 @@ date: 2021-12-30 12:57:43 - I2C消息传输:通过消息传输结构体数组进行自定义传输 **图 1** I2C物理连线示意图 - ![](/images/zh-cn/device-dev/driver/figure/I2C物理连线示意图.png "I2C物理连线示意图") + ![](/images/device-dev/driver/figures/I2C物理连线示意图.png "I2C物理连线示意图") -### 接口说明 +## 接口说明 **表 1** I2C驱动API接口功能介绍 @@ -76,19 +75,17 @@ date: 2021-12-30 12:57:43 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 ## 使用指导 ### 使用流程 -使用I2C设备的一般流程如[图2](#fig166181128151112)所示。 - -**图 2** I2C设备使用流程图 - +使用I2C设备的一般流程如[图2](#fig183017194234)所示。 -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123509750.png) +**图 2** I2C设备使用流程图 +![](/images/device-dev/driver/figures/I2C设备使用流程图.png "I2C设备使用流程图") ### 打开I2C控制器 @@ -212,7 +209,7 @@ if (ret != 2) { } ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >- I2cMsg结构体中的设备地址不包含读写标志位,读写信息由flags成员变量的读写控制位传递。 >- 本函数不对消息结构体个数count做限制,其最大个数度由具体I2C控制器决定。 >- 本函数也不对每个消息结构体中的数据长度做限制,同样由具体I2C控制器决定。 @@ -259,7 +256,7 @@ I2cClose(i2cHandle); /* 关闭I2C控制器 */ 本例程首先对Touch IC进行复位操作(开发板上电默认会给TouchIC供电,本例程不考虑供电),然后对其内部寄存器进行随机读写,测试I2C通路是否正常。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >本例程重点在于展示I2C设备访问流程,并验证I2C通路,所以对于设备寄存器读写值不做关注,读写寄存器导致的行为由设备自身决定。 示例如下: diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/03.RTC.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/03.RTC.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/03.RTC.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/03.RTC.md" index da9ffe7efb48b15561c7553b47ca3b127565c643..401f4af71f0f1488a6344a631d81ecfabc5791d8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/03.RTC.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/03.RTC.md" @@ -1,6 +1,6 @@ --- title: RTC -permalink: /pages/00030102 +permalink: /pages/0004010202 navbar: true sidebar: true prev: true @@ -9,13 +9,12 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- -# RTC +# RTC - [概述](#section104842041574) - - [接口说明](#section3373340142215) - +- [接口说明](#section20331159102519) - [使用指导](#section20636145604113) - [使用流程](#section16919828134215) - [创建RTC设备句柄](#section1131212144310) @@ -29,7 +28,7 @@ date: 2021-12-30 12:57:43 RTC\(real-time clock\)为操作系统中的实时时钟设备,为操作系统提供精准的实时时间和定时报警功能。当设备下电后,通过外置电池供电,RTC继续记录操作系统时间;设备上电后,RTC提供实时时钟给操作系统,确保断电后系统时间的连续性。 -### 接口说明 +## 接口说明 **表 1** RTC设备API接口功能介绍 @@ -120,7 +119,7 @@ RTC\(real-time clock\)为操作系统中的实时时钟设备,为操作系统 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 ## 使用指导 @@ -129,18 +128,16 @@ RTC\(real-time clock\)为操作系统中的实时时钟设备,为操作系统 在操作系统启动过程中,驱动管理模块根据配置文件加载RTC驱动,RTC驱动会检测RTC器件并初始化驱动。 -使用RTC设备的一般流程如[图1](#fig166181128151112)所示。 - -**图 1** RTC设备使用流程图 - +使用RTC设备的一般流程如[图1](#fig1610020107333)所示。 -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123675706.png) +**图 1** RTC设备使用流程图 +![](/images/device-dev/driver/figures/RTC设备使用流程图.png "RTC设备使用流程图") ### 创建RTC设备句柄 RTC驱动加载成功后,驱动开发者使用驱动框架提供的查询接口并调用RTC设备驱动接口。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >当前操作系统支持一个RTC设备。 DevHandle RtcOpen\(void\); @@ -381,7 +378,7 @@ int32\_t RtcWriteTime\(DevHandle handle, struct RtcTime \*time\); ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >RTC起始时间为UTC 1970/01/01 Thursday 00:00:00,年的最大取值按照用户器件手册要求计算配置,星期不用配置。 ``` @@ -508,7 +505,7 @@ int32\_t RtcWriteAlarm\(DevHandle handle, enum RtcAlarmIndex alarmIndex, struct ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >RTC起始时间为UTC 1970/01/01 Thursday 00:00:00,年的最大取值按照用户器件手册要求计算配置,星期不用配置。 ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/04.SDIO.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/04.SDIO.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/04.SDIO.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/04.SDIO.md" index 19ddd1a5e899de3dec77f7b80ddfde7a95c3ddcb..567e802da63c02ed4576c9fcfdaf837212ffbaf4 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/04.SDIO.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/04.SDIO.md" @@ -1,6 +1,6 @@ --- title: SDIO -permalink: /pages/00030203 +permalink: /pages/0004010203 navbar: true sidebar: true prev: true @@ -9,13 +9,12 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- -# SDIO +# SDIO - [概述](#section1155271783811) - - [接口说明](#section08064247248) - +- [接口说明](#section12601496259) - [使用指导](#section1878939192515) - [使用流程](#section1490685512255) - [打开SDIO控制器](#section10782428132616) @@ -42,14 +41,12 @@ date: 2021-12-30 12:57:43 - D0-3信号:4条数据线,其中,DAT1信号线复用为中断线,在1BIT模式下DAT0用来传输数据,在4BIT模式下DAT0-DAT3用来传输数据。 - CMD信号:用于HOST发送命令和DEVICE回复响应。 - **图 1** SDIO的HOST-DEVICE连接示意图 - - - ![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001054280608.png) + **图 1** SDIO的HOST-DEVICE连接示意图 + ![](/images/device-dev/driver/figures/SDIO的HOST-DEVICE连接示意图.png "SDIO的HOST-DEVICE连接示意图") - SDIO接口定义了操作SDIO的通用方法集合,包括打开/关闭SDIO控制器、独占/释放HOST、使能/去使能设备、申请/释放中断、读写、获取/设置公共信息等。 -### 接口说明 +## 接口说明 **表 1** SDIO驱动API接口功能介绍 @@ -171,19 +168,17 @@ date: 2021-12-30 12:57:43 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >本文涉及的所有接口,目前只支持在内核态使用,不支持在用户态使用。 ## 使用指导 ### 使用流程 -使用SDIO的一般流程如[图2](#fig1343742311264)所示。 - -**图 2** SDIO使用流程图 - +使用SDIO的一般流程如[图2](#fig1969028202613)所示。 -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123540984.png) +**图 2** SDIO使用流程图 +![](/images/device-dev/driver/figures/SDIO使用流程图.png "SDIO使用流程图") ### 打开SDIO控制器 diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/05.SPI.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/05.SPI.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/05.SPI.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/05.SPI.md" index a3d60c0bdfa99f1f2a0200142831bf45804f51aa..25e3a2555efe5dacac40af6e195257d3d452e5db 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/05.SPI.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/05.SPI.md" @@ -1,6 +1,6 @@ --- title: SPI -permalink: /pages/00030204 +permalink: /pages/0004010204 navbar: true sidebar: true prev: true @@ -9,13 +9,12 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- -# SPI +# SPI - [概述](#section193356154511) - - [接口说明](#section232141411476) - +- [接口说明](#section1325964832615) - [使用指导](#section71363452477) - [使用流程](#section32846814820) - [获取SPI设备句柄](#section1927265711481) @@ -37,12 +36,10 @@ date: 2021-12-30 12:57:43 - CS – 片选,从设备使能信号,由主设备控制。 -- 一个主设备和两个从设备的连接示意图如[图1](#fig15227181812587)所示,Device A和Device B共享主设备的SCLK、MISO和MOSI三根引脚,Device A的片选CS0连接主设备的CS0,Device B的片选CS1连接主设备的CS1。 - -**图 1** SPI主从设备连接示意图。 - +- 一个主设备和两个从设备的连接示意图如[图1](#fig89085710359)所示,Device A和Device B共享主设备的SCLK、MISO和MOSI三根引脚,Device A的片选CS0连接主设备的CS0,Device B的片选CS1连接主设备的CS1。 -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123742254.png) +**图 1** SPI主从设备连接示意图。 +![](/images/device-dev/driver/figures/SPI主从设备连接示意图.png "SPI主从设备连接示意图") - SPI通信通常由主设备发起,通过以下步骤完成一次通信: @@ -64,10 +61,10 @@ date: 2021-12-30 12:57:43 - SPI设备配置:获取和设置SPI设备属性。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >当前只支持主机模式,不支持从机模式。 -### 接口说明 +## 接口说明 **表 1** SPI驱动API接口功能介绍 @@ -125,19 +122,17 @@ date: 2021-12-30 12:57:43 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 ## 使用指导 ### 使用流程 -使用SPI的一般流程如[图2](#fig23885455594)所示。 - -**图 2** SPI使用流程图 - +使用SPI的一般流程如[图2](#fig1586912310348)所示。 -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123703482.png) +**图 2** SPI使用流程图 +![](/images/device-dev/driver/figures/SPI使用流程图.png "SPI使用流程图") ### 获取SPI设备句柄 diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/06.UART.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/06.UART.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/06.UART.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/06.UART.md" index 0108370d8667ae714dd83ccff63effffb8be3d04..2f121f518dca3c7e486bd3197e5cac99c5b8d1a0 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/06.UART.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/06.UART.md" @@ -1,6 +1,6 @@ --- title: UART -permalink: /pages/00030205 +permalink: /pages/0004010205 navbar: true sidebar: true prev: true @@ -9,13 +9,12 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- -# UART +# UART - [概述](#section833012453535) - - [接口说明](#section1680292311549) - +- [接口说明](#section1928742202715) - [使用指导](#section12779050105412) - [使用流程](#section1858116395510) - [获取UART设备句柄](#section124512065617) @@ -40,21 +39,17 @@ date: 2021-12-30 12:57:43 - RTS:发送请求信号,用于指示本设备是否准备好,可接受数据,和对端CTS相连; - CTS:允许发送信号,用于判断是否可以向对端发送数据,和对端RTS相连; - **图 1** 2线UART设备连接示意图 - - - ![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001170262141.png) - - **图 2** 4线UART设备连接示意图 - + **图 1** 2线UART设备连接示意图 + ![](/images/device-dev/driver/figures/2线UART设备连接示意图.png "2线UART设备连接示意图") - ![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123582482.png) + **图 2** 4线UART设备连接示意图 + ![](/images/device-dev/driver/figures/4线UART设备连接示意图.png "4线UART设备连接示意图") - UART通信之前,收发双方需要约定好一些参数:波特率、数据格式(起始位、数据位、校验位、停止位)等。通信过程中,UART通过TX发送给对端数据,通过RX接收对端发送的数据。当UART接收缓存达到预定的门限值时,RTS变为不可发送数据,对端的CTS检测到不可发送数据,则停止发送数据。 - UART接口定义了操作UART端口的通用方法集合,包括获取、释放设备句柄、读写数据、获取和设置波特率、获取和设置设备属性。 -### 接口说明 +## 接口说明 **表 1** UART驱动API接口功能介绍 @@ -128,19 +123,17 @@ date: 2021-12-30 12:57:43 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 ## 使用指导 ### 使用流程 -使用UART的一般流程如[图3](#fig1852173020185)所示。 - -**图 3** UART使用流程图 - +使用UART的一般流程如[图3](#fig99673244388)所示。 -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001170227689.png) +**图 3** UART使用流程图 +![](/images/device-dev/driver/figures/UART使用流程图.png "UART使用流程图") ### 获取UART设备句柄 @@ -592,7 +585,7 @@ if (ret < 0) { } ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >UART返回值为非负值,表示UART读取成功。若返回值等于0,表示UART无有效数据可以读取。若返回值大于0,表示实际读取到的数据长度,该长度小于或等于传入的参数size的大小,并且不超过当前正在使用的UART控制器规定的最大单次读取数据长度的值。 ### 销毁UART设备句柄 diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/07.WATCHDOG.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/07.WATCHDOG.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/07.WATCHDOG.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/07.WATCHDOG.md" index 68a967f910a86ac9f5085bdd8bdf3ddc1f784910..7d32d802a93c22fad24852330bab1e279f05ab6f 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/07.WATCHDOG.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/07.WATCHDOG.md" @@ -1,6 +1,6 @@ --- title: WATCHDOG -permalink: /pages/00030106 +permalink: /pages/0004010206 navbar: true sidebar: true prev: true @@ -9,13 +9,12 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- -# WATCHDOG +# WATCHDOG - [概述](#section14918241977) - - [接口说明](#section20177131219818) - +- [接口说明](#section1180575010271) - [使用指导](#section10103184312813) - [使用流程](#section10181195910815) - [打开看门狗设备](#section66089201107) @@ -33,7 +32,7 @@ date: 2021-12-30 12:57:43 看门狗(watchdog),又叫看门狗计时器(watchdog timer),是一种硬件的计时设备,当系统的主程序发生某些错误时,导致未及时清除看门狗计时器的计时值,这时看门狗计时器就会对系统发出复位信号,使系统从悬停状态恢复到正常运作状态。 -### 接口说明 +## 接口说明 **表 1** 看门狗 API接口功能介绍 @@ -99,25 +98,23 @@ date: 2021-12-30 12:57:43 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >本文涉及看门狗的所有接口,仅限内核态使用,不支持在用户态使用。 ## 使用指导 ### 使用流程 -使用看门狗的一般流程如[图1](#fig19134125410189)所示。 - -**图 1** 看门狗使用流程图 - +使用看门狗的一般流程如[图1](#fig430533913392)所示。 -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001170229891.png) +**图 1** 看门狗使用流程图 +![](/images/device-dev/driver/figures/看门狗使用流程图.png "看门狗使用流程图") ### 打开看门狗设备 在操作看门狗之前,需要使用WatchdogOpen打开一个看门狗设备,一个系统可能有多个看门狗,通过ID号来打开指定的看门狗设备: -int32\_t WatchdogOpen\(int16\_t wdtId\); +DevHandle WatchdogOpen\(int16\_t wdtId\); **表 2** WatchdogOpen参数和返回值描述 @@ -214,7 +211,7 @@ if (ret != 0) { ### 设置超时时间 -int32\_t WatchdogSetTimeout\(PalHandle \*handle, uint32\_t seconds\); +int32\_t WatchdogSetTimeout\(DevHandle \*handle, uint32\_t seconds\); **表 4** WatchdogSetTimeout参数和返回值描述 @@ -266,7 +263,7 @@ if (ret != 0) { ### 获取超时时间 -int32\_t WatchdogGetTimeout\(PalHandle \*handle, uint32\_t \*seconds\); +int32\_t WatchdogGetTimeout\(DevHandle \*handle, uint32\_t \*seconds\); **表 5** WatchdogGetTimeout参数和返回值描述 diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/08.MIPIDSI.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/08.MIPIDSI.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/08.MIPIDSI.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/08.MIPIDSI.md" index a7c1e7bc64b4d6ead82c04362ba7afe8a083b4c4..c2187c68f6a1dc34d50a47c02bdd9616b3c6801d 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/08.MIPIDSI.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/08.MIPIDSI.md" @@ -1,6 +1,6 @@ --- title: MIPIDSI -permalink: /pages/00030207 +permalink: /pages/0004010207 navbar: true sidebar: true prev: true @@ -9,13 +9,12 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:31 --- -# MIPI DSI +# MIPI DSI - [概述](#section16806142183217) - - [接口说明](#section129611916132011) - +- [接口说明](#section12720125432316) - [使用指导](#section037231715335) - [使用流程](#section49299119344) - [获取MIPI-DSI操作句柄](#section5126155683811) @@ -33,10 +32,10 @@ date: 2021-12-30 12:57:43 - 图1显示了简化的DSI接口。从概念上看,符合DSI的接口与基于DBI-2和DPI-2标准的接口具有相同的功能。它向外围设备传输像素或命令数据,并且可以从外围设备读取状态或像素信息。主要区别在于,DSI对所有像素数据、命令和事件进行序列化,而在传统接口中,这些像素数据、命令和事件通常需要附加控制信号才能在并行数据总线上传输。 **图 1** DSI发送、接收接口 - ![](/images/zh-cn/device-dev/driver/figure/DSI发送-接收接口.png "DSI发送-接收接口") + ![](/images/device-dev/driver/figures/DSI发送-接收接口.png "DSI发送-接收接口") -### 接口说明 +## 接口说明 **表 1** MIPI-DSI API接口功能介绍 @@ -100,19 +99,17 @@ date: 2021-12-30 12:57:43 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >本文涉及的所有接口,仅限内核态使用,不支持在用户态使用 ## 使用指导 ### 使用流程 -使用MIPI-DSI的一般流程如[图2](#fig99821771782)所示。 - -**图 2** MIPI-DSI使用流程图 - +使用MIPI-DSI的一般流程如[图2](#fig129103491241)所示。 -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001123514210.png) +**图 2** MIPI-DSI使用流程图 +![](/images/device-dev/driver/figures/MIPI-DSI使用流程图.png) ### 获取MIPI-DSI操作句柄 @@ -229,7 +226,7 @@ cfg.timingInfo.vsaLines = 76; cfg.timingInfo.vfpLines = 120; cfg.timingInfo.xResPixels = 1342; /* 写入配置数据 */ -ret = MipiDsiSetCfg(g_handle, &cfg); +ret = MipiDsiSetCfg(mipiDsiHandle, &cfg); if (ret != 0) { HDF_LOGE("%s: SetMipiCfg fail! ret=%d\n", __func__, ret); return -1; @@ -281,7 +278,7 @@ int32\_t MipiDsiGetCfg\(DevHandle handle, struct MipiCfg \*cfg\); int32_t ret; struct MipiCfg cfg; memset(&cfg, 0, sizeof(struct MipiCfg)); -ret = MipiDsiGetCfg(g_handle, &cfg); +ret = MipiDsiGetCfg(mipiDsiHandle, &cfg); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: GetMipiCfg fail!\n", __func__); return HDF_FAILURE; @@ -425,9 +422,9 @@ if (cmdRead->payload == NULL) { return HDF_FAILURE; } *(cmdRead->payload) = DDIC_REG_STATUS; -MipiDsiSetLpMode(g_handle); -ret = MipiDsiRx(g_handle, cmdRead, sizeof(readVal), &readVal); -MipiDsiSetHsMode(g_handle); +MipiDsiSetLpMode(mipiDsiHandle); +ret = MipiDsiRx(mipiDsiHandle, cmdRead, sizeof(readVal), &readVal); +MipiDsiSetHsMode(mipiDsiHandle); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: MipiDsiRx fail! ret=%d\n", __func__, ret); HdfFree(cmdRead->payload); @@ -479,13 +476,13 @@ void PalMipiDsiTestSample(void) { uint8_t chnId; int32_t ret; - DevHandle handle = NULL; + DevHandle mipiDsiHandle = NULL; /* 设备通道编号 */ chnId = 0; /* 获取操作句柄 */ - handle = MipiDsiOpen(chnId); - if (handle == NULL) { + mipiDsiHandle = MipiDsiOpen(chnId); + if (mipiDsiHandle == NULL) { HDF_LOGE("MipiDsiOpen: failed!\n"); return; } @@ -506,7 +503,7 @@ void PalMipiDsiTestSample(void) cfg.timingInfo.vfpLines = 120; cfg.timingInfo.xResPixels = 1342; /* 写入配置数据 */ - ret = MipiDsiSetCfg(g_handle, &cfg); + ret = MipiDsiSetCfg(mipiDsiHandle, &cfg); if (ret != 0) { HDF_LOGE("%s: SetMipiCfg fail! ret=%d\n", __func__, ret); return; @@ -549,9 +546,9 @@ void PalMipiDsiTestSample(void) return; } *(cmdRead->payload) = DDIC_REG_STATUS; - MipiDsiSetLpMode(g_handle); - ret = MipiDsiRx(g_handle, cmdRead, sizeof(readVal), &readVal); - MipiDsiSetHsMode(g_handle); + MipiDsiSetLpMode(mipiDsiHandle); + ret = MipiDsiRx(mipiDsiHandle, cmdRead, sizeof(readVal), &readVal); + MipiDsiSetHsMode(mipiDsiHandle); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: MipiDsiRx fail! ret=%d\n", __func__, ret); HdfFree(cmdRead->payload); diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/09.PWM.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/09.PWM.md" new file mode 100644 index 0000000000000000000000000000000000000000..5a96942b0cef31498d5b2d90a3033c48e67002e0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/03.\345\271\263\345\217\260\351\251\261\345\212\250\344\275\277\347\224\250/09.PWM.md" @@ -0,0 +1,490 @@ +--- +title: PWM +permalink: /pages/0004010208 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:32 +--- +# PWM + +- [概述](#section1_PWM_des) + - [PwmConfig结构体](#section1.1_PWM_des) +- [接口说明](#section2_PWM_des) +- [使用指导](#section3_PWM_des) + - [使用流程](#section3.1_PWM_des) + - [获取PWM设备句柄](#section3.2_PWM_des) + - [销毁PWM设备句柄](#section3.3_PWM_des) + - [使能](#section3.4_PWM_des) + - [禁用](#section3.5_PWM_des) + - [设置PWM设备周期](#section3.6_PWM_des) + - [设置PWM设备占空时间](#section3.7_PWM_des) + - [设置PWM设备极性](#section3.8_PWM_des) + - [设置PWM设备参数](#section3.9_PWM_des) + - [获取PWM设备参数](#section3.10_PWM_des) + +- [使用实例](#section3_PWM_des) + +## 概述 + +- PWM是脉冲宽度调制(Pulse Width Modulation)的缩写,是一种对模拟信号电平进行数字编码,转换为脉冲的一种技术。常用于马达控制、背光亮度调节等。 + +- PWM接口定义了操作PWM设备的通用方法集合,包括: + - PWM设备句柄获取和销毁。 + - PWM周期、占空比、极性的设置。 + - PWM使能和关闭。 + - PWM配置信息的获取和设置 + +### PwmConfig结构体 + +**表1** PwmConfig结构体介绍 + + + +| 名称 | 描述 | +| -------- | ------------------------------------------------------------ | +| duty | 占空时间,以纳秒为单位 | +| period | PWM周期,以纳秒为单位 | +| number | 要生成的方波数。正值表示将生成指定数量的方波,0表示方波将不断产生 | +| polarity | 极性:正极性/反极性 | +| status | 状态:启用状态/禁用状态 | + +## 接口说明 + +**表2** PWM设备API接口功能介绍 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
功能分类接口名描述
PWM句柄操作PwmOpen获取PWM设备驱动句柄
PwmClose释放PWM设备驱动句柄
使能/禁用PWMPwmEnable使能PWM
PwmDisable禁用PWM
PWM配置操作PwmSetPeriod设置PWM周期
PwmSetDuty设置PWM占空时间
PwmSetPolarity设置PWM极性
设置/获取PWM配置信息PwmSetConfig设置PWM设备参数
PwmGetConfig获取PWM设备参数
+ + + + +>PWM当前仅限内核态使用,不支持在用户态使用。 + +## 使用指导 + +### 使用流程 + +在操作系统启动过程中,驱动管理模块根据配置文件加载PWM驱动,PWM驱动会检测PWM器件并初始化驱动。 + +使用PWM设备的一般流程如[图1](#fig1_PWM_des)所示。 + +**图 1** PWM设备使用流程图 + + +![](/images/device-dev/driver/figures/PWM设备使用流程图.png) + +### 获取PWM设备句柄 + +在操作PWM设备时,首先要调用PwmOpen获取PWM设备句柄,该函数会返回指定设备号的PWM设备句柄。 + +```c +DevHandle PwmOpen(uint32_t num); +``` + +**表3** PwmOpen参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | ----------------------- | +| void | NA | +| num | PWM设备编号 | +| **返回值** | **返回值描述** | +| handle | 获取成功返回PWM设备句柄 | +| NULL | 获取失败 | + + +```c +uint32_t num = 0; /* PWM设备号 */ +DevHandle handle = NULL; + +/* 获取PWM设备句柄 */ +handle = PwmOpen(num); +if (handle == NULL) { + /* 错误处理 */ +} +``` + +### 销毁PWM设备句柄 + +关闭PWM设备,系统释放对应的资源。 + +```c +void PwmClose(DevHandle handle); +``` + +**表4** PwmClose参数描述 + + + +| 参数 | 参数描述 | +| ------ | ----------- | +| handle | PWM设备句柄 | + + +```c +/* 销毁PWM设备句柄 */ +PwmClose(handle); +``` + +### 使能 + +启用PWM设备。 + +```c +int32_t PwmEnable(DevHandle handle); +``` + +**表5** PwmEnable参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| **返回值** | **返回值描述** | +| 0 | 使能成功 | +| 负数 | 使能失败 | + +```c +int32_t ret; + +/*启用PWM设备*/ +ret = PwmEnable(handle); +if (ret != 0) { + /*错误处理*/ +} +``` + +### 禁用 + +禁用PWM设备。 + +```c +int32_t PwmDisable(DevHandle handle); +``` + +**表6** PwmDisable参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| **返回值** | **返回值描述** | +| 0 | 禁用成功 | +| 负数 | 禁用失败 | + +```c +int32_t ret; + +/*禁用PWM设备*/ +ret = PwmDisable(handle); +if (ret != 0) { + /*错误处理*/ +} +``` + +### 设置PWM设备周期 + +设置PWM设备周期。 + +```c +int32_t PwmSetPeriod(DevHandle handle, uint32_t period); +``` + +**表7** PwmSetPeriod参数描述 + + + +| 参数 | 参数描述 | +| ---------- | ------------------------ | +| handle | PWM设备句柄 | +| period | 要设置的周期,单位为纳秒 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +int32_t ret; + +/*设置周期为50000000纳秒*/ +ret = PwmSetPeriod(handle, 50000000); +if (ret != 0) { + /*错误处理*/ +} +``` +### 设置PWM设备占空时间 + +设置PWM设备占空时间。 + +```c +int32_t PwmSetDuty(DevHandle handle, uint32_t duty); +``` + +**表8** PwmSetDuty参数描述 + + + +| 参数 | 参数描述 | +| ---------- | ---------------------------- | +| handle | PWM设备句柄 | +| duty | 要设置的占空时间,单位为纳秒 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +int32_t ret; + +/*设置占空时间为25000000纳秒*/ +ret = PwmSetDuty(handle, 25000000); +if (ret != 0) { + /*错误处理*/ +} +``` +### 设置PWM设备极性 + +设置PWM设备极性。 + +```c +int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity); +``` + +**表9** PwmSetPolarity参数描述 + + + +| 参数 | 参数描述 | +| ---------- | ------------------- | +| handle | PWM设备句柄 | +| polarity | 要设置的极性,正/反 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +int32_t ret; + +/*设置极性为反*/ +ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); +if (ret != 0) { + /*错误处理*/ +} +``` + + +### 设置PWM设备参数 + +设置PWM设备参数。 + +```c +int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config); +``` + +**表10** PwmSetConfig参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| *config | 参数指针 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +int32_t ret; +struct PwmConfig pcfg; +pcfg.duty = 25000000; /*占空时间为25000000纳秒*/ +pcfg.period = 50000000; /*周期为50000000纳秒*/ +pcfg.number = 0; /*不断产生方波*/ +pcfg.polarity = PWM_INVERTED_POLARITY; /*极性为反*/ +pcfg.status = PWM_ENABLE_STATUS; /*运行状态为启用*/ + +/*设置PWM设备参数*/ +ret = PwmSetConfig(handle, &pcfg); +if (ret != 0) { + /*错误处理*/ +} +``` + +### 获取PWM设备参数 + +获取PWM设备参数。 + +```c +int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config); +``` + +**表11** PwmGetConfig参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| *config | 参数指针 | +| **返回值** | **返回值描述** | +| 0 | 获取成功 | +| 负数 | 获取失败 | + +```c +int32_t ret; +struct PwmConfig pcfg; + +/*获取PWM设备参数*/ +ret = PwmGetConfig(handle, &pcfg); +if (ret != 0) { + /*错误处理*/ +} +``` + +## 使用实例 + +PWM设备完整的使用示例如下所示,首先获取PWM设备句柄,然后设置设备周期、占空时间、极性,获取设备参数。使能,设置设备参数,禁用,最后销毁PWM设备句柄。 + +``` +void PwmTestSample(void) +{ + int32_t ret; + uint32_t num; + DevHandle handle = NULL; + + struct PwmConfig pcfg; + pcfg.duty = 20000000; /*占空时间为20000000纳秒*/ + pcfg.period = 40000000; /*周期为40000000纳秒*/ + pcfg.number = 100; /*生成100个方波*/ + pcfg.polarity = PWM_NORMAL_POLARITY; /*极性为正*/ + pcfg.status = PWM_ENABLE_STATUS; /*运行状态为启用*/ + + /* PWM设备编号,要填写实际平台上的编号 */ + num = 1; + + /* 获取PWM设备句柄 */ + handle = PwmOpen(num); + if (handle == NULL) { + HDF_LOGE("PwmOpen: failed!\n"); + return; + } + + /*设置周期为50000000纳秒*/ + ret = PwmSetPeriod(handle, 50000000); + if (ret != 0) { + HDF_LOGE("PwmSetPeriod: failed, ret %d\n", ret); + goto _ERR; + } + + /*设置占空时间为25000000纳秒*/ + ret = PwmSetDuty(handle, 25000000); + if (ret != 0) { + HDF_LOGE("PwmSetDuty: failed, ret %d\n", ret); + goto _ERR; + } + + /*设置极性为反*/ + ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); + if (ret != 0) { + HDF_LOGE("PwmSetPolarity: failed, ret %d\n", ret); + goto _ERR; + } + + /*获取PWM设备参数*/ + ret = PwmGetConfig(handle, &pcfg); + if (ret != 0) { + HDF_LOGE("PwmGetConfig: failed, ret %d\n", ret); + goto _ERR; + } + + /*启用PWM设备*/ + ret = PwmEnable(handle); + if (ret != 0) { + HDF_LOGE("PwmEnable: failed, ret %d\n", ret); + goto _ERR; + } + + /*设置PWM设备参数*/ + ret = PwmSetConfig(handle, &pcfg); + if (ret != 0) { + HDF_LOGE("PwmSetConfig: failed, ret %d\n", ret); + goto _ERR; + } + + /*禁用PWM设备*/ + ret = PwmDisable(handle); + if (ret != 0) { + HDF_LOGE("PwmDisable: failed, ret %d\n", ret); + goto _ERR; + } + +_ERR: + /* 销毁PWM设备句柄 */ + PwmClose(handle); +} +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/01.LCD.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/01.LCD.md" similarity index 87% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/01.LCD.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/01.LCD.md" index a2a138092b4f6cc6d63250769fe9af00cd7751c0..2f6a949f844aec4a10c87c909e5f9edba2532c5c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/01.LCD.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/01.LCD.md" @@ -1,6 +1,6 @@ --- title: LCD -permalink: /pages/00030300 +permalink: /pages/0004010300 navbar: true sidebar: true prev: true @@ -9,65 +9,57 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:43 +date: 2021-12-30 18:31:32 --- # LCD - [概述](#section141575391542) - - [接口说明](#section14711163785519) - -- [开发指导](#section12394223125615) - - [开发步骤](#section515923045814) - +- [接口说明](#section53793327396) +- [开发步骤](#section12394223125615) - [开发实例](#section7441155155813) ## 概述 -LCD(Liquid Crystal Display)液晶显示驱动,对LCD进行上电,并通过接口初始化LCD内部寄存器,使LCD正常工作。Display驱动模型基于HDF( Hardware Driver Foundation)[驱动框架](/pages/00030000)开发,实现跨OS、跨平台,为LCD硬件提供上下电功能、发送初始化序列功能,使LCD进入正常的工作模式,显示芯片平台侧的图像数据,基于HDF驱动框架的Display驱动模型如[图1](#fig69138814229)。 +LCD(Liquid Crystal Display)液晶显示驱动,对LCD进行上电,并通过接口初始化LCD内部寄存器,使LCD正常工作。Display驱动模型基于HDF( Hardware Driver Foundation)[驱动框架](/pages/0004010000)开发,实现跨OS、跨平台,为LCD硬件提供上下电功能、发送初始化序列功能,使LCD进入正常的工作模式,显示芯片平台侧的图像数据,基于HDF驱动框架的Display驱动模型如[图1](#fig69138814229)。 **图 1** 基于HDF驱动框架的Display驱动模型 -![](/images/zh-cn/device-dev/driver/figure/基于HDF驱动框架的Display驱动模型.png "基于HDF驱动框架的Display驱动模型") - -- **Display驱动模型介绍** +![](/images/device-dev/driver/figures/基于HDF驱动框架的Display驱动模型.png "基于HDF驱动框架的Display驱动模型") - Display驱动模型主要由平台驱动层、芯片平台适配层、LCD器件驱动层三部分组成。驱动模型基于HDF驱动框架开发,通过Platform层和OSAL层提供的接口,屏蔽内核形态的差异,使得器件驱动可以便利的迁移到不同OS及芯片平台。模型向上对接Display公共hal层,支撑HDI接口的实现,通过Display-HDI(Hardware Display Interface)对图形服务提供各类驱动能力接口。 +**Display驱动模型介绍** - (1)Display平台驱动层:通过HDF提供的IOService数据通道,与公共Hal层对接,集中接收并处理各类上层调用指令; +Display驱动模型主要由平台驱动层、芯片平台适配层、LCD器件驱动层三部分组成。驱动模型基于HDF驱动框架开发,通过Platform层和OSAL层提供的接口,屏蔽内核形态的差异,使得器件驱动可以便利的迁移到不同OS及芯片平台。模型向上对接Display公共hal层,支撑HDI接口的实现,通过Display-HDI(Hardware Display Interface)对图形服务提供各类驱动能力接口。 - (2)SOC平台驱动适配层:借助此SOC适配层,实现Display驱动和SOC侧驱动解耦,主要完成芯片平台相关的参数配置,并传递平台驱动层的调用到器件驱动层; +- (1)Display平台驱动层:通过HDF提供的IOService数据通道,与公共Hal层对接,集中接收并处理各类上层调用指令; +- (2)SOC平台驱动适配层:借助此SOC适配层,实现Display驱动和SOC侧驱动解耦,主要完成芯片平台相关的参数配置,并传递平台驱动层的调用到器件驱动层; +- (3)LCD器件驱动层:在器件驱动层中,主要实现和器件自身强相关的驱动适配接口,例如发送初始化序列、上下电、背光设置等。 - (3)LCD器件驱动层:在器件驱动层中,主要实现和器件自身强相关的驱动适配接口,例如发送初始化序列、上下电、背光设置等。 +基于Display驱动模型开发LCD驱动,可以借助平台提供的各种能力及接口,较大程度的降低器件驱动的开发周期和难度,提升开发效率。 - 基于Display驱动模型开发LCD驱动,可以借助平台提供的各种能力及接口,较大程度的降低器件驱动的开发周期和难度,提升开发效率。 - - -### 接口说明 +## 接口说明 LCD接口通常可分为MIPI DSI接口、TTL接口和LVDS接口,常用的是MIPI DSI接口和TTL接口,下面对常用的MIPI DSI接口和TTL接口作简要介绍。 - MIPI DSI接口 **图 2** MIPI DSI接口 - ![](/images/zh-cn/device-dev/driver/figure/MIPI-DSI接口.png "MIPI-DSI接口") + ![](/images/device-dev/driver/figures/MIPI-DSI接口.png "MIPI-DSI接口") MIPI DSI接口是MIPI(移动行业处理器接口)联盟定义的显示接口,主要用于移动终端显示屏接口,接口数据传输遵循MIPI协议,MIPI DSI接口为数据接口,传输图像数据,通常情况下MIPI DSI接口的控制信息以MIPI包形式通过MIPI DSI接口发送到对端IC,不需要额外的外设接口。 - TTL接口 **图 3** TTL接口 - ![](/images/zh-cn/device-dev/driver/figure/TTL接口.png "TTL接口") + ![](/images/device-dev/driver/figures/TTL接口.png "TTL接口") TTL(Transistor Transistor Logic)即晶体管-晶体管逻辑,TTL电平信号由TTL器件产生,TTL器件是数字集成电路的一大门类,它采用双极型工艺制造,具有高速度、低功耗和品种多等特点。 TTL接口是并行方式传输数据的接口,有数据信号、时钟信号和控制信号(行同步、帧同步、数据有效信号等),在控制信号控制下完成数据传输。通常TTL接口的LCD,内部寄存器读写需要额外的外设接口,比如SPI接口、I2C接口等。 -## 开发指导 +## 开发步骤 Display驱动模型基于HDF驱动框架、Platform接口及OSAL接口开发,可以做到不区分OS(LiteOS、Linux)和芯片平台(Hi35xx、Hi38xx、V3S等),为LCD器件提供统一的驱动模型。 -### 开发步骤 - 1. 添加LCD驱动相关的设备描述配置。 2. 在SOC平台驱动适配层中适配对应的芯片平台驱动。 3. 添加器件驱动,并在驱动入口函数Init中注册Panel驱动数据,驱动数据接口主要包括如下接口: diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/02.TOUCHSCREEN.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/02.TOUCHSCREEN.md" similarity index 86% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/02.TOUCHSCREEN.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/02.TOUCHSCREEN.md" index d80cdaa42993595d6ab93d214163ab6cef70f1fa..ca838c5bcb0544cdb302988f7f7ea59d1a1b30cb 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/02.TOUCHSCREEN.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/02.TOUCHSCREEN.md" @@ -1,6 +1,6 @@ --- title: TOUCHSCREEN -permalink: /pages/00030301 +permalink: /pages/0004010301 navbar: true sidebar: true prev: true @@ -9,16 +9,13 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # TOUCHSCREEN - [概述](#section175431838101617) - - [接口说明](#section17667171301711) - -- [开发指导](#section65745222184) - - [开发步骤](#section865734181916) - +- [接口说明](#section105459441659) +- [开发步骤](#section65745222184) - [开发实例](#section263714411191) - [设备描述配置](#section18249155619195) - [板级配置及器件私有配置](#section3571192072014) @@ -34,13 +31,13 @@ date: 2021-12-30 12:57:44 - **Touchscreen驱动层次说明** - 本节主要介绍基于input驱动模型开发touchscreen器件驱动,其整体的框架模型如[图1](#fig6251184817261)。 + 本节主要介绍基于input驱动模型开发touchscreen器件驱动,input模型整体的框架如[图1](#fig6251184817261)。 Input驱动模型基于HDF驱动框架、PLATFORM接口、OSAL接口进行开发,向上对接规范化的驱动接口HDI(Hardware Driver Interface)层,通过Input-HDI层对外提供硬件能力,即上层input service可以通过HDI接口层获取相应的驱动能力,进而操控touchscreen等输入设备。 **图 1** 基于HDF驱动框架的input驱动模型 -![](/images/zh-cn/device-dev/driver/figure/基于HDF驱动框架的input驱动模型.png "基于HDF驱动框架的input驱动模型") +![](/images/device-dev/driver/figures/基于HDF驱动框架的input驱动模型.png "基于HDF驱动框架的input驱动模型") - **Input驱动模型介绍** @@ -59,10 +56,10 @@ date: 2021-12-30 12:57:44 - **基于HDF驱动框架开发器件驱动的优势** - 在HDF(Hardware Driver Foundation)[驱动管理框架](/pages/00030001)的基础上,input驱动模型调用OSAL接口层和Platfom接口层提供的基础接口进行开发,包括bus通信接口、操作系统原生接口(memory、lock、thread、timer等)。由于OSAL接口和Platform接口屏蔽了芯片平台差异,所以基于input驱动模型实现的touchscreen驱动可以进行跨平台、跨OS迁移,以便逐步实现驱动的一次开发,多端部署。 + 在HDF(Hardware Driver Foundation)[驱动管理框架](/pages/0004010001)的基础上,input驱动模型调用OSAL接口层和Platfom接口层提供的基础接口进行开发,包括bus通信接口、操作系统原生接口(memory、lock、thread、timer等)。由于OSAL接口和Platform接口屏蔽了芯片平台差异,所以基于input驱动模型实现的touchscreen驱动可以进行跨平台、跨OS迁移,以便逐步实现驱动的一次开发,多端部署。 -### 接口说明 +## 接口说明 Touchscreen器件的硬件接口相对简单,根据PIN脚的属性,可以简单分为如下三类: @@ -71,7 +68,7 @@ Touchscreen器件的硬件接口相对简单,根据PIN脚的属性,可以简 - 通信接口 **图 2** Touchscreen器件常用管脚 -![](/images/zh-cn/device-dev/driver/figure/Touchscreen器件常用管脚.png "Touchscreen器件常用管脚") +![](/images/device-dev/driver/figures/Touchscreen器件常用管脚.png "Touchscreen器件常用管脚") 如上图所示的三类接口,分别做简要说明如下: @@ -86,34 +83,33 @@ Touchscreen器件的硬件接口相对简单,根据PIN脚的属性,可以简 - INT:中断管脚,需要在驱动初始化时,配置为输入上拉状态。在驱动IC检测到外部触摸信号后,通过操作中断管脚来触发中断,器件驱动则会在中断处理函数中进行报点数据读取等操作。 3. **通信接口** - - I2C:由于touchscreen的报点数据量相对较少,所以一般选用I2C方式传输数据。I2C的具体协议及对应操作接口,可以参考Platform接口层中的[“I2C”使用指南](/pages/00030201#section1695201514281)。 - - SPI:部分厂商,由于需要传递的数据不止报点坐标,而是需要获取基础容值,数据量较大,所以会选用SPI通信方式。SPI的具体协议及对应操作接口,可以参考Platform接口层中的[“SPI” 使用指南](/pages/00030204#section71363452477)。 + - I2C:由于touchscreen的报点数据量相对较少,所以一般选用I2C方式传输数据。I2C的具体协议及对应操作接口,可以参考Platform接口层中的[“I2C”使用指南](/pages/0004010201#section5361140416)。 + - SPI:部分厂商,由于需要传递的数据不止报点坐标,而是需要获取基础容值,数据量较大,所以会选用SPI通信方式。SPI的具体协议及对应操作接口,可以参考Platform接口层中的[“SPI” 使用指南](/pages/0004010204#section193356154511)。 -## 开发指导 +## 开发步骤 Input驱动模型是基于HDF框架、Platform接口和OSAL接口开发,不区分操作系统和芯片平台,为touchscreen等输入器件提供统一的驱动开发架构。 -- 如下以touchscreen器件驱动为例,说明input驱动模型的完整加载流程: - - (1)设备描述配置:由开发者参考已有模板进行设备描述配置,包括驱动加载顺序、板级硬件信息、器件私有数据信息等。 +如下以touchscreen器件驱动为例,说明input驱动模型的完整加载流程: - (2)加载input设备管理驱动:input设备管理驱动由HDF驱动加载,完成设备manager的创建并对其初始化。 +(1)设备描述配置:由开发者参考已有模板进行设备描述配置,包括驱动加载顺序、板级硬件信息、器件私有数据信息等。 - (3)加载平台驱动:平台驱动由HDF框架加载,主要完成板级配置解析及硬件初始化,并提供器件注册接口。 +(2)加载input设备管理驱动:input设备管理驱动由HDF驱动加载,完成设备manager的创建并对其初始化。 - (4)加载器件驱动:器件驱动也由HDF框架加载,完成器件设备的实例化,包括器件私有配置解析和平台预留的差异化接口适配。 +(3)加载平台驱动:平台驱动由HDF框架加载,主要完成板级配置解析及硬件初始化,并提供器件注册接口。 - (5)器件设备向平台驱动注册:将实例化的器件设备向平台驱动注册,实现设备和驱动的绑定,并完成中断注册、上下电等器件初始化工作。 +(4)加载器件驱动:器件驱动也由HDF框架加载,完成器件设备的实例化,包括器件私有配置解析和平台预留的差异化接口适配。 - (6)input设备注册:在器件初始化完成后,实例化input设备,并将其注册到input manager进行管理。 +(5)器件设备向平台驱动注册:将实例化的器件设备向平台驱动注册,实现设备和驱动的绑定,并完成中断注册、上下电等器件初始化工作。 +(6)input设备注册:在器件初始化完成后,实例化input设备,并将其注册到input manager进行管理。 -### 开发步骤 +请参考如下相关步骤: 1. 设备描述配置 - 目前Input驱动基于HDF驱动框架编写,驱动的加载启动由HDF驱动管理框架统一处理。首先需要在对应的配置文件中,将驱动信息注册进去,如是否加载、加载优先级,此后HDF驱动框架会逐一启动注册过的驱动模块。驱动的相关配置请参考[HDF驱动框架配置指导](/pages/00030001#section1969312275533)。 + 目前Input驱动基于HDF驱动框架编写,驱动的加载启动由HDF驱动管理框架统一处理。首先需要在对应的配置文件中,将驱动信息注册进去,如是否加载、加载优先级,此后HDF驱动框架会逐一启动注册过的驱动模块。驱动的相关配置请参考[HDF驱动框架配置指导](/pages/0004010001#section1969312275533)。 2. 板级配置及Touchscreen器件私有配置 @@ -121,7 +117,7 @@ Input驱动模型是基于HDF框架、Platform接口和OSAL接口开发,不区 3. 实现器件差异化适配接口 - 根据硬件单板设计的通信接口,使用Platform接口层提供的管脚操作接口配置对应的复位管脚、中断管脚以及电源操作,对于GPIO的操作,可参考[GPIO操作接口指导](/pages/00030200#section259614242196) + 根据硬件单板设计的通信接口,使用Platform接口层提供的管脚操作接口配置对应的复位管脚、中断管脚以及电源操作,对于GPIO的操作,可参考[GPIO操作接口指导](/pages/0004010200#section1635911016188) ## 开发实例 @@ -130,7 +126,7 @@ Input驱动模型是基于HDF框架、Platform接口和OSAL接口开发,不区 ### 设备描述配置 -如下配置主要包含input驱动模型各模块层级信息,具体原理可参考[HDF驱动开发指南](/pages/00030001),HDF框架依据该配置信息实现对Input模型各模块的依次加载等。 +如下配置主要包含input驱动模型各模块层级信息,具体原理可参考[HDF驱动开发指南](/pages/0004010001),HDF框架依据该配置信息实现对Input模型各模块的依次加载等。 ``` input :: host { diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/03.SENSOR.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/03.SENSOR.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/03.SENSOR.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/03.SENSOR.md" index 94d5d4932a44b2af8b919d1cfcc1ddec6634da8b..09c72e1e3513a1c3899516228b4792376bdf9387 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/03.SENSOR.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/03.SENSOR.md" @@ -1,6 +1,6 @@ --- title: SENSOR -permalink: /pages/00030302 +permalink: /pages/0004010302 navbar: true sidebar: true prev: true @@ -9,16 +9,13 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # SENSOR - [概述](#section3634112111) - - [接口说明](#section188213414114) - -- [开发指导](#section1140943382) - - [开发步骤](#section7893102915819) - +- [接口说明](#section20930112117478) +- [开发步骤](#section1140943382) - [开发实例](#section257750691) - [测试指导](#section106021256121219) @@ -27,7 +24,7 @@ date: 2021-12-30 12:57:44 Sensor(传感器)驱动模块为上层Sensor服务系统提供稳定的Sensor基础能力API,包括Sensor列表查询、Sensor启停、Sensor订阅及去订阅,Sensor参数配置等功能;基于HDF(**H**ardware **D**river **F**oundation)驱动框架开发的Sensor驱动模型,实现跨操作系统迁移,器件差异配置等功能。Sensor驱动模型如下图1所示: **图 1** Sensor驱动模型图 -![](/images/zh-cn/device-dev/driver/figure/Sensor驱动模型图.png "Sensor驱动模型图") +![](/images/device-dev/driver/figures/Sensor驱动模型图.png "Sensor驱动模型图") Sensor驱动模型对外开放的API接口能力如下: @@ -35,7 +32,7 @@ Sensor驱动模型对外开放的API接口能力如下: - 提供Sensor驱动模型能力接口:依赖HDF驱动框架实现Sensor器件驱动的注册,加载,去注册,器件探测等能力,提供同一类型Sensor器件驱动归一接口, 寄存器配置解析操作接口,总线访问抽象接口,平台抽象接口。 - 提供开发者实现的能力接口:依赖HDF驱动框架的HCS\(**H**DF **C**onfiguration **S**ource\)配置管理,根据同类型Sensor差异化配置,实现Sensor器件参数序列化配置和器件部分操作接口,简化Sensor器件驱动开发。 -### 接口说明 +## 接口说明 Sensor驱动模型对HDI开放的API接口功能,参考表1。 @@ -201,7 +198,7 @@ Sensor驱动模型对驱动开发者开放的功能接口,驱动开发者无 -Sensor驱动模型要求驱动开发者实现的接口功能,参考表3 +Sensor驱动模型要求驱动开发者实现的接口功能,参考表3。 **表 3** Sensor驱动模型要求驱动开发者实现的接口列表 @@ -218,22 +215,22 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考表3

int32_t init(void)

-

传感器器设备探测成功后,需要对传感器器设备初始化配置。

+

传感器设备探测成功后,需要对传感器器设备初始化配置。

int32_t GetInfo(struct SensorBasicInfo *info)

-

从传感器器设备的HCS配置里,获取当前传感器设备的基本信息。

+

从传感器设备的HCS配置里,获取当前传感器设备的基本信息。

int32_t Enable(void)

-

根据当前传感器器设备的HCS配置,下发传感器设备使能操作组的寄存器配置。

+

根据当前传感器设备的HCS配置,下发传感器设备使能操作组的寄存器配置。

int32_t Disable(void)

-

根据当前传感器器设备的HCS配置,下发传感器设备去使能操作组的寄存器配置。

+

根据当前传感器设备的HCS配置,下发传感器设备去使能操作组的寄存器配置。

int32_t SetBatch(int64_t samplingInterval, int64_t reportInterval)

@@ -261,23 +258,21 @@ Sensor驱动模型要求驱动开发者实现的接口功能,参考表3 接口实现参考[SENSOR](#section257750691)章节。 -## 开发指导 +## 开发步骤 Sensor驱动是基于HDF框架、PLATFORM和OSAL基础接口进行开发,不区分操作系统和芯片平台,为不同Sensor器件提供统一的驱动模型。本篇开发指导以加速度计传感器为例,介绍传感器驱动开发。 -### 开发步骤 - 1. 加速度计传感器驱动注册。HDF驱动框架会提供统一的驱动管理模型,通过加速计传感器模块配置信息,识别并加载对应模块驱动。 2. 加速度计传感器驱动初始化和去初始化。HDF驱动框架通过init入口函数,依次启动传感器设备驱动加载和分配传感器设备数据配置资源。HDF驱动框架通过release函数,释放驱动加载的资源和配置。 3. 加速度计传感器寄存器组配置解析。不同类型传感器需要在hcs里配置器件对应的HCS配置文件,然后再设备驱动启动过程中探测器件是否在位,然后加载对应的配置文件,生成配置的结构体对象。 4. 加速度计传感器驱动操作接口实现。实现各个类型传感器归一化驱动接口,如init,GetInfo,Enable,Disable,SetBatch,SetMode,SetOption,ReadSensorData等函数,完成传感器驱动配置下发和数据上报功能。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >传感器驱动模型已经提供一部分能力集,包括驱动设备管理能力,抽象总线和平台操作接口能力,通用配置操作接口能力,配置解析操作接口能力,接口参考[表2](#table1156812588320)。需要开发人员实现部分有:1、传感器部分操作接口([表3](#table1083014911336));2、传感器HCS差异化数据配置;3、驱动基本功能验证。 ## 开发实例 -基于HDF驱动模型,加载启动加速度计传感器驱动,代码形式如下,具体原理可参考[HDF驱动开发指南](/pages/00030001)。加速度传感器选择通讯接口方式为I2C,厂家选择博世BMI160加速度传感器。 +基于HDF驱动模型,加载启动加速度计传感器驱动,代码形式如下,具体原理可参考[HDF驱动开发指南](/pages/0004010001)。加速度传感器选择通讯接口方式为I2C,厂家选择博世BMI160加速度传感器。 1. 加速度计传感器驱动入口注册 @@ -299,7 +294,7 @@ HDF_INIT(g_sensorAccelDevEntry); - 加速度计传感器设备配置描述 -加速度传感器模型使用HCS作为配置描述源码,HCS配置字段详细介绍参考[配置管理](/pages/00030004)介绍。 +加速度传感器模型使用HCS作为配置描述源码,HCS配置字段详细介绍参考[配置管理](/pages/0004010004)介绍。 ``` /* 加速度计传感器设备HCS配置 */ diff --git "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" index 4d576a7cedb77232e18a5a5d40f2aef92d8b4273..7d5aa11efce5d5b06d66a4fbe34f426182141a5d 100644 --- "a/website/docs/01.\346\226\207\346\241\243/04.\350\256\276\345\244\207\345\274\200\345\217\221-\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/04.WLAN.md" @@ -1,6 +1,6 @@ --- title: WLAN -permalink: /pages/00030303 +permalink: /pages/0004010303 navbar: true sidebar: true prev: true @@ -9,31 +9,27 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # WLAN - [概述](#section729758162218) - [WLAN驱动接口架构](#section178022416377) - - [接口说明](#section149681312202415) - -- [开发指导](#section15957746172412) - - [开发步骤](#section11776186132513) +- [接口说明](#section7331102018815) +- [开发步骤](#section15957746172412) - [开发实例](#section1395253612512) ## 概述 -WLAN是基于HDF(Hardware Driver Foundation)驱动框架开发的模块,该模块可实现跨操作系统迁移,自适应器件差异,模块化拼装编译等功能。各WLAN厂商驱动开发人员可根据WLAN模块提供的向下统一接口适配各自的驱动代码,实现如下能力:建立/关闭WLAN热点、扫描、关联WLAN热点等;对HDI层向上提供能力如下:设置MAC地址、设置发射功率、获取设备的MAC地址等。[WLAN模块框架图](#fig967034316227)如下: - -**图 1** WLAN框架 - +WLAN是基于HDF(Hardware Driver Foundation)驱动框架开发的模块,该模块可实现跨操作系统迁移,自适应器件差异,模块化拼装编译等功能。各WLAN厂商驱动开发人员可根据WLAN模块提供的向下统一接口适配各自的驱动代码,实现如下能力:建立/关闭WLAN热点、扫描、关联WLAN热点等;对HDI层向上提供能力如下:设置MAC地址、设置发射功率、获取设备的MAC地址等。[WLAN模块框架图](#fig4415112614415)如下: -![](/images/zh-cn/device-dev/driver/figure/zh-cn_image_0000001170383063.png) +**图 1** WLAN框架 +![](/images/device-dev/driver/figures/WLAN框架.png "WLAN框架") ### WLAN驱动接口架构 -WLAN模块有三部分对外开放的API接口,如[下图2](#fig15016395217)所示: +WLAN模块有三部分对外开放的API接口,如[下图2](#fig1492411431166)所示: 1. 对HDI层提供的能力接口。 @@ -41,12 +37,10 @@ WLAN模块有三部分对外开放的API接口,如[下图2](#fig15016395217) 3. 提供给各厂商实现的能力接口。 -**图 2** WLAN模块开放能力分布图 +**图 2** WLAN模块开放能力分布图 +![](/images/device-dev/driver/figures/WLAN模块开放能力分布图.png "WLAN模块开放能力分布图") - -![](/images/zh-cn/device-dev/driver/figure/接口分布图4.png) - -### 接口说明 +## 接口说明 WLAN驱动模块提供给驱动开发人员可直接调用的能力接口,主要功能有:创建/释放WifiModule、关联/取消关联、申请/释放NetBuf、lwip的pbuf和NetBuf的相互转换等。提供的部分接口说明如[表1](#table1521573319472)所示: @@ -245,12 +239,10 @@ WLAN驱动模块对HDI层提供的能力接口,主要功能有:创建/销毁 -## 开发指导 +## 开发步骤 WLAN驱动基于HDF框架和PLATFORM框架开发,不区分OS和芯片平台,为不同厂商的WLAN模组提供统一的驱动模型,各WLAN模组厂商根据如下指导适配WLAN驱动框架。 -### 开发步骤 - 1. 通过wifi\_config.hcs文件,配置硬件参数:module\(不同feature\),芯片等。 2. 解析配置文件, 生成全量配置的结构体对象。 3. Module初始化,创建Module。 @@ -258,7 +250,7 @@ WLAN驱动基于HDF框架和PLATFORM框架开发,不区分OS和芯片平台, 5. 总线初始化。 6. 上层wpa业务挂接。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >以上驱动框架适配步骤一部分已经提供(详细见开发实例),待开发人员实现的部分有:1、根据硬件,修改配置参数;2、适配挂接chip;3、测试自验证。 ## 开发实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/05.USB.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/05.USB.md" new file mode 100644 index 0000000000000000000000000000000000000000..667528c594effafd99a48ab767ef3fca4ee9d239 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/04.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221/05.USB.md" @@ -0,0 +1,1564 @@ +--- +title: USB +permalink: /pages/0004010304 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:32 +--- +# USB + +- [概述](#section127mcpsimp) + - [接口说明](#section141mcpsimp) + +- [开发指导](#section581mcpsimp) + - [Host DDK API驱动开发步骤](#section584mcpsimp) + - [Host RAW API驱动开发步骤](#section594mcpsimp) + - [Device DDK API驱动开发步骤](#section600mcpsimp) + +- [开发实例](#section607mcpsimp) + - [Host DDK API驱动开发](#section609mcpsimp) + - [Host RAW API驱动开发](#section612mcpsimp) + - [Device DDK API驱动开发](#section615mcpsimp) + + +## 概述 + +USB Host部分,主要包括协议封装、设备管理、驱动安装与卸载等。 + +USB Device部分,支持USB功能设备的开发,提供USB设备相关功能,主要包括设备管理、配置管理、IO管理,实现USB功能设备创建、配置、数据通信等。 + +USB Host驱动模型如下图1所示: + +**图 1** USB Host驱动模型图 +![](/images/device-dev/driver/figures/USB-Host驱动模型图.png "USB-Host驱动模型图") + +**图 2** USB Device驱动模型图 +![](/images/device-dev/driver/figures/USB-Device驱动模型图.png "USB-Device驱动模型图") + +USB驱动模型对外开放的API接口能力如下: + +- Usb Host DDK提供给用户态可直接调用的驱动能力接口,按照功能分类三大类:DDK初始化类、对interface对象操作类、对request对象操作类,可以提供DDK初始化、interface绑定和释放,打开和关闭操作,request的申请和释放,同步和异步传输等。 +- Usb Deivce DDK提供设备管理、IO管理、配置管理,主要功能有:创建和删除设备、获取和打开接口、同步和异步传输等。 + +### 接口说明 + +USB驱动模型Host侧开放的API接口功能,参考[图1](#fig1649563542917)。 + +**表 1** USB驱动模型Host侧开放的API接口功能介绍 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

头文件

+

接口名称

+

功能描述

+

usb_ddk_interface.h

+

int32_t UsbInitHostSdk(struct UsbSession **session);

+

USB主机端驱动开发工具包初始化

+

int32_t UsbExitHostSdk(const struct UsbSession *session);

+

USB主机端驱动开发工具包退出

+

const struct UsbInterface *UsbClaimInterface(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr, uint8_t interfaceIndex);

+

获取USB接口对象

+

int UsbReleaseInterface(const struct UsbInterface *interfaceObj);

+

释放USB接口对象

+

int UsbAddOrRemoveInterface(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr, uint8_t interfaceIndex, UsbInterfaceStatus status);

+

增加移除接口

+

UsbInterfaceHandle *UsbOpenInterface(const struct UsbInterface *interfaceObj);

+

打开USB对象接口

+

int32_t UsbCloseInterface(const UsbInterfaceHandle *interfaceHandle);

+

关闭USB接口对象

+

int32_t UsbSelectInterfaceSetting(const UsbInterfaceHandle *interfaceHandle, uint8_t settingIndex, struct UsbInterface **interfaceObj);

+

设置可选配置

+

int32_t UsbGetPipeInfo(const UsbInterfaceHandle *interfaceHandle, uint8_t settingIndex, uint8_t pipeId, struct UsbPipeInfo *pipeInfo);

+

获取指定可选设置的管道信息

+

int32_t UsbClearInterfaceHalt(const UsbInterfaceHandle *interfaceHandle, uint8_t pipeAddress);

+

清除指定索引的管道状态

+

struct UsbRequest *UsbAllocRequest(const UsbInterfaceHandle *interfaceHandle, int isoPackets, int length);

+

分配请求对象

+

int UsbFreeRequest(const struct UsbRequest *request);

+

释放请求对象

+

int UsbSubmitRequestAsync(const struct UsbRequest *request);

+

发送异步请求

+

int32_t UsbFillRequest(const struct UsbRequest *request, const UsbInterfaceHandle *interfaceHandle, const struct UsbRequestParams *params);

+

填充请求

+

sint UsbCancelRequest(const struct UsbRequest *request);

+

取消异步请求

+

int UsbSubmitRequestSync(const struct UsbRequest *request);

+

发送同步请求

+

usb_raw_api.h

+

int UsbRawInit(struct UsbSession **session);

+

USB驱动开发工具包专家模式初始化

+

int UsbRawExit(const struct UsbSession *session);

+

USB驱动开发工具包专家模式退出

+

UsbRawHandle *UsbRawOpenDevice(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr);

+

打开USB设备对象

+

int UsbRawCloseDevice(const UsbRawHandle *devHandle);

+

关闭USB设备对象

+

int UsbRawSendControlRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbControlRequestData *requestData);

+

执行同步控制传输

+

int UsbRawSendBulkRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRequestData *requestData);

+

执行同步批量传输

+

int UsbRawSendInterruptRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRequestData *requestData);

+

执行同步中断传输

+

int UsbRawGetConfigDescriptor(const UsbRawDevice *rawDev, uint8_t configIndex, struct UsbRawConfigDescriptor **config);

+

获取给定设备指定ID的设备配置描述符

+

void UsbRawFreeConfigDescriptor(const struct UsbRawConfigDescriptor *config);

+

释放配置描述符内存空间

+

int UsbRawGetConfiguration(const UsbRawHandle *devHandle, int *config);

+

获取当前激活配置

+

int UsbRawSetConfiguration(const UsbRawHandle *devHandle, int config);

+

设置当前激活配置

+

int UsbRawGetDescriptor(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawDescriptorParam *param, const unsigned char *data);

+

获取描述符信息

+

UsbRawDevice *UsbRawGetDevice(const UsbRawHandle *devHandle);

+

由设备句柄获取设备指针

+

int UsbRawGetDeviceDescriptor(const UsbRawDevice *rawDev, struct UsbDeviceDescriptor *desc);

+

获取给定设备的USB设备描述符

+

int UsbRawClaimInterface(const UsbRawHandle *devHandle, int interfaceNumber);

+

声明给定设备句柄上的接口

+

int UsbRawReleaseInterface(const UsbRawHandle *devHandle, int interfaceNumber);

+

释放之前声明的接口

+

int UsbRawResetDevice(const UsbRawHandle *devHandle);

+

复位设备

+

struct UsbRawRequest *UsbRawAllocRequest(const UsbRawHandle *devHandle, int isoPackets, int length);

+

分配一个带有指定数量的同步包描述符的传输请求

+

int UsbRawFreeRequest(const struct UsbRawRequest *request);

+

释放之前分配的传输请求

+

int UsbRawFillBulkRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData);

+

填充批量传输请求所需信息

+

int UsbRawFillControlSetup(const unsigned char *setup, const struct UsbControlRequestData *requestData);

+

填充控制传输设置包所需信息

+

int UsbRawFillControlRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData);

+

填充控制传输请求所需信息

+

int UsbRawFillInterruptRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData);

+

填充中断传输请求所需信息

+

int UsbRawFillIsoRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData);

+

填充同步传输(Isochronous Transfers)请求所需信息

+

int UsbRawSubmitRequest(const struct UsbRawRequest *request);

+

提交一个传输请求

+

int UsbRawCancelRequest(const struct UsbRawRequest *request);

+

取消一个传输请求

+

int UsbRawHandleRequests(const UsbRawHandle *devHandle);

+

传输请求事件完成处理

+
+ +USB驱动模型Device侧开放的API接口功能,参考[图2](#fig8847615103013)。 + +**表 2** USB驱动模型Device侧开放的API接口功能介绍 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

头文件

+

头文件

+

功能描述

+

usbfn_device.h

+

const struct UsbFnDevice *UsbFnCreateDevice(const char *udcName, const struct UsbFnDescriptorData *descriptor);

+

创建Usb设备

+

int UsbFnRemoveDevice(struct UsbFnDevice *fnDevice);

+

删除Usb设备

+

const struct UsbFnDevice *UsbFnGetDevice(const char *udcName);

+

获取Usb设备

+

usbfn_interface.h

+

int UsbFnStartRecvInterfaceEvent(struct UsbFnInterface *interface, uint32_t eventMask, UsbFnEventCallback callback, void *context);

+

开始接受Event事件

+

int UsbFnStopRecvInterfaceEvent(struct UsbFnInterface *interface);

+

停止接受Event事件

+

UsbFnInterfaceHandle UsbFnOpenInterface(struct UsbFnInterface *interface);

+

打开一个接口

+

int UsbFnCloseInterface(UsbFnInterfaceHandle handle);

+

关闭一个接口

+

int UsbFnGetInterfacePipeInfo(struct UsbFnInterface *interface, uint8_t pipeId, struct UsbFnPipeInfo *info);

+

获取管道信息

+

int UsbFnSetInterfaceProp(const struct UsbFnInterface *interface, const char *name, const char *value);

+

设置自定义属性

+

usbfn_request.h

+

struct UsbFnRequest *UsbFnAllocCtrlRequest(UsbFnInterfaceHandle handle, uint32_t len);

+

申请一个控制请求

+

struct UsbFnRequest *UsbFnAllocRequest(UsbFnInterfaceHandle handle, uint8_t pipe, uint32_t len);

+

申请一个数据请求

+

int UsbFnFreeRequest(struct UsbFnRequest *req);

+

释放一个请求

+

int UsbFnSubmitRequestAsync(struct UsbFnRequest *req);

+

发送异步请求

+

int UsbFnSubmitRequestSync(struct UsbFnRequest *req, uint32_t timeout);

+

发送同步请求

+

int UsbFnCancelRequest(struct UsbFnRequest *req);

+

取消请求

+
+ +## 开发指导 + +USB驱动是基于HDF框架、PLATFORM和OSAL基础接口进行开发,不区分操作系统和芯片平台,为不同USB器件提供统一的驱动模型。本篇开发指导以串口为例,分别介绍USB Host和USB Device驱动开发。 + +### 开发步骤 + +### Host DDK API驱动开发步骤 + +1. 驱动匹配表配置。 +2. 初始化Host DDK。 +3. 待步骤2初始化完后获取UsbInterface接口对象。 +4. 打开步骤3获取到的UsbInterface接口对象,获取相应接口的UsbInterfaceHandle对象。 +5. 根据步骤4获取到的UsbInterfaceHandle对象,获取指定索引为pipeIndex的pipeInfo信息。 +6. 为步骤4获取到的UsbInterfaceHandle预先分配待发送的IO Request对象。 +7. 根据输入参数params填充步骤6预先分配的IO Request。 +8. 提交IO Request对象,可以选择同步或异步两种模式。 + +### Host RAW API驱动开发步骤 + +1. 驱动匹配表配置。 +2. 初始化Host RAW,并打开USB设备,然后获取描述符,通过描述符获取接口、端点信息。 +3. 分配Request,并根据传输类型使用相应接口对Request进行填充。 +4. 提交IO Request对象,可以选择同步或异步两种模式。 + +### Device DDK API驱动开发步骤 + +1. 构造描述符。 +2. 创建设备,使用步骤1构造的描述符实例化一个USB设备。 +3. 根据创建的设备获取接口(UsbFnDeviceGetInterface),获取Pipe信息(UsbFnInterfaceGetPipeInfo),打开接口获取Handle(UsbFnInterfaceOpen),根据Handle和Pipe号获取Request(UsbFnRequestAlloc)。 +4. 接收Event事件(UsbFnInterfaceStartRecvEvent)如Enable、Setup等事件,回调函数(UsbFnEventCallback)中对Event事件做出响应。 +5. 收发数据,可以选择同步异步发送模式。 + +## 开发实例 + +本实例提供USB串口驱动开发示例,并简要对具体关键点进行开发说明。 + +### Host DDK API驱动开发 + +``` +root { + module = "usb_pnp_device"; + usb_pnp_config { + match_attr = "usb_pnp_match"; + usb_pnp_device_id = "UsbPnpDeviceId"; + UsbPnpDeviceId { + idTableList = [ + "host_acm_table" + ]; + host_acm_table { + //驱动模块名,该字段的值必须和驱动入口结构的moduleName一致 + moduleName = "usbhost_acm"; + //驱动对外发布服务的名称,必须唯一 + serviceName = "usbhost_acm_pnp_service"; + //驱动私有数据匹配关键字 + deviceMatchAttr = "usbhost_acm_pnp_matchAttr"; + //从该字段开始(包含该字段)之后数据长度,以byte为单位 + length = 21; + //USB驱动匹配规则vendorId+productId+interfaceSubClass+interfaceProtocol+interfaceNumber + matchFlag = 0x0303; + //厂商编号 + vendorId = 0x12D1; + //产品编号 + productId = 0x5000; + //设备出厂编号,低16位 + bcdDeviceLow = 0x0000; + //设备出厂编号,高16位 + bcdDeviceHigh = 0x0000; + //USB分配的设备类代码 + deviceClass = 0; + //USB分配的子类代码 + deviceSubClass = 0; + //USB分配的设备协议代码 + deviceProtocol = 0; + //接口类型,根据实际需要可填写多个 + interfaceClass = [0]; + //接口子类型,根据实际需要可填写多个 + interfaceSubClass = [2, 0]; + //接口所遵循的协议,根据实际需要可填写多个 + interfaceProtocol = [1, 2]; + //接口的编号,根据实际需要可填写多个 + interfaceNumber = [2, 3]; + } + } + } +} + +#include "usb_serial.h" +#include "hdf_base.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "osal_time.h" +#include "securec.h" +#include "usb_ddk_interface.h" +#include "hdf_usb_pnp_manage.h" + +#define HDF_LOG_TAG USB_HOST_ACM +#define STR_LEN 512 + +static struct UsbRequest *g_syncRequest = NULL; +static struct UsbRequest *g_ctrlCmdRequest = NULL; +static bool g_acmReleaseFlag = false; +static uint8_t *g_acmReadBuffer = NULL; +... +static int SerialCtrlMsg(struct AcmDevice *acm, uint8_t request, + uint16_t value, void *buf, uint16_t len) +{ + int ret; + uint16_t index = acm->intPipe->interfaceId; + struct UsbControlParams controlParams; + struct UsbRequestParams params; + if (acm == NULL || buf == NULL) { + HDF_LOGE("%s:invalid param", __func__); + return HDF_ERR_IO; + } + if (acm->ctrlReq == NULL) { + acm->ctrlReq = UsbAllocRequest(acm->ctrDevHandle, 0, len); + if (acm->ctrlReq == NULL) { + HDF_LOGE("%s: UsbAllocRequest failed", __func__); + return HDF_ERR_IO; + } + } + + controlParams.request = request; + controlParams.target = USB_REQUEST_TARGET_INTERFACE; + controlParams.reqType = USB_REQUEST_TYPE_CLASS; + controlParams.directon = USB_REQUEST_DIR_TO_DEVICE; + controlParams.value = value; + controlParams.index = index; + controlParams.data = buf; + controlParams.size = len; + + params.interfaceId = USB_CTRL_INTERFACE_ID; + params.pipeAddress = acm->ctrPipe->pipeAddress; + params.pipeId = acm->ctrPipe->pipeId; + params.requestType = USB_REQUEST_PARAMS_CTRL_TYPE; + params.timeout = USB_CTRL_SET_TIMEOUT; + params.ctrlReq = UsbControlSetUp(&controlParams); + ret = UsbFillRequest(acm->ctrlReq, acm->ctrDevHandle, ¶ms); + if (HDF_SUCCESS != ret) { + HDF_LOGE("%s: failed, ret=%d ", __func__, ret); + return ret; + } + ret = UsbSubmitRequestSync(acm->ctrlReq); //发送同步IO Request + if (HDF_SUCCESS != ret) { + HDF_LOGE("UsbSubmitRequestSync failed, ret=%d ", ret); + return ret; + } + if (!acm->ctrlReq->compInfo.status) { + HDF_LOGE("%s status=%d ", __func__, acm->ctrlReq->compInfo.status); + } + return HDF_SUCCESS; +} +... +static struct UsbInterface *GetUsbInterfaceById(const struct AcmDevice *acm, + uint8_t interfaceIndex) +{ + struct UsbInterface *tmpIf = NULL; + tmpIf = (struct UsbInterface *)UsbClaimInterface(acm->session, acm->busNum, + acm->devAddr, interfaceIndex); //获取UsbInterface接口对象 + return tmpIf; +} +... +static struct UsbPipeInfo *EnumePipe(const struct AcmDevice *acm, + uint8_t interfaceIndex, UsbPipeType pipeType, UsbPipeDirection pipeDirection) +{ + uint8_t i; + int ret; + struct UsbInterfaceInfo *info = NULL; + UsbInterfaceHandle *interfaceHandle = NULL; + if (pipeType == USB_PIPE_TYPE_CONTROL) + { + info = &acm->ctrIface->info; + interfaceHandle = acm->ctrDevHandle; + } + else + { + info = &acm->iface[interfaceIndex]->info; + interfaceHandle = InterfaceIdToHandle(acm, info->interfaceIndex); + } + + for (i = 0; i <= info->pipeNum; i++) { + struct UsbPipeInfo p; + ret = UsbGetPipeInfo(interfaceHandle, info->curAltSetting, i, &p);//获取指定索引为i的pipeInfo信息 + if (ret < 0) { + continue; + } + if ((p.pipeDirection == pipeDirection) && (p.pipeType == pipeType)) { + struct UsbPipeInfo *pi = OsalMemCalloc(sizeof(*pi)); + if (pi == NULL) { + HDF_LOGE("%s: Alloc pipe failed", __func__); + return NULL; + } + p.interfaceId = info->interfaceIndex; + *pi = p; + return pi; + } + } + return NULL; +} + +static struct UsbPipeInfo *GetPipe(const struct AcmDevice *acm, + UsbPipeType pipeType, UsbPipeDirection pipeDirection) +{ + uint8_t i; + if (acm == NULL) { + HDF_LOGE("%s: invalid params", __func__); + return NULL; + } + for (i = 0; i < acm->interfaceCnt; i++) { + struct UsbPipeInfo *p = NULL; + if (!acm->iface[i]) { + continue; + } + p = EnumePipe(acm, i, pipeType, pipeDirection); + if (p == NULL) { + continue; + } + return p; + } + return NULL; +} + +/* HdfDriverEntry implementations */ +static int32_t UsbSerialDriverBind(struct HdfDeviceObject *device) +{ + struct UsbPnpNotifyServiceInfo *info = NULL; + errno_t err; + struct AcmDevice *acm = NULL; + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + acm = (struct AcmDevice *)OsalMemCalloc(sizeof(*acm)); + if (acm == NULL) { + HDF_LOGE("%s: Alloc usb serial device failed", __func__); + return HDF_FAILURE; + } + if (OsalMutexInit(&acm->lock) != HDF_SUCCESS) { + HDF_LOGE("%s:%d OsalMutexInit failed", __func__, __LINE__); + goto error; + } + info = (struct UsbPnpNotifyServiceInfo *)device->priv; + if (info != NULL) { + HDF_LOGD("%s:%d busNum=%d,devAddr=%d,interfaceLength=%d", + __func__, __LINE__, info->busNum, info->devNum, info->interfaceLength); + acm->busNum = info->busNum; + acm->devAddr = info->devNum; + acm->interfaceCnt = info->interfaceLength; + err = memcpy_s((void *)(acm->interfaceIndex), USB_MAX_INTERFACES, + (const void*)info->interfaceNumber, info->interfaceLength); + if (err != EOK) { + HDF_LOGE("%s:%d memcpy_s failed err=%d", + __func__, __LINE__, err); + goto lock_error; + } + } else { + HDF_LOGE("%s:%d info is NULL!", __func__, __LINE__); + goto lock_error; + } + acm->device = device; + device->service = &(acm->service); + acm->device->service->Dispatch = UsbSerialDeviceDispatch; + HDF_LOGD("UsbSerialDriverBind=========================OK"); + return HDF_SUCCESS; + +lock_error: + if (OsalMutexDestroy(&acm->lock)) { + HDF_LOGE("%s:%d OsalMutexDestroy failed", __func__, __LINE__); + } +error: + OsalMemFree(acm); + acm = NULL; + return HDF_FAILURE; +} +... +static int AcmAllocReadRequests(struct AcmDevice *acm) +{ + int ret; + struct UsbRequestParams readParams; + for (int i = 0; i < ACM_NR; i++) { + acm->readReq[i] = UsbAllocRequest(InterfaceIdToHandle(acm, acm->dataInPipe->interfaceId), 0, acm->readSize); //分配待发送的readReq IO Request对象 + if (!acm->readReq[i]) { + HDF_LOGE("readReq request failed"); + goto error; + } + readParams.userData = (void *)acm; + readParams.pipeAddress = acm->dataInPipe->pipeAddress; + readParams.pipeId = acm->dataInPipe->pipeId; + readParams.interfaceId = acm->dataInPipe->interfaceId; + readParams.callback = AcmReadBulk; + readParams.requestType = USB_REQUEST_PARAMS_DATA_TYPE; + readParams.timeout = USB_CTRL_SET_TIMEOUT; + readParams.dataReq.numIsoPackets = 0; + readParams.dataReq.directon = (acm->dataInPipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & 0x1; + readParams.dataReq.length = acm->readSize; + ret = UsbFillRequest(acm->readReq[i], InterfaceIdToHandle(acm, acm->dataInPipe->interfaceId), &readParams); //填充待发送的readReq对象 + if (HDF_SUCCESS != ret) { + HDF_LOGE("%s: UsbFillRequest failed, ret=%d n", __func__, ret); + goto error; + } + } + return HDF_SUCCESS; + +error: + AcmFreeReadRequests(acm); + return HDF_ERR_MALLOC_FAIL; +} + +static int AcmAllocNotifyRequest(struct AcmDevice *acm) +{ + int ret; + struct UsbRequestParams intParams = {}; + acm->notifyReq = UsbAllocRequest(InterfaceIdToHandle(acm, acm->intPipe->interfaceId), 0, acm->intSize); //分配待发送的中断IO Request对象 + if (!acm->notifyReq) { + HDF_LOGE("notifyReq request failed"); + return HDF_ERR_MALLOC_FAIL; + } + intParams.userData = (void *)acm; + intParams.pipeAddress = acm->intPipe->pipeAddress; + intParams.pipeId = acm->intPipe->pipeId; + intParams.interfaceId = acm->intPipe->interfaceId; + intParams.callback = AcmCtrlIrq; + intParams.requestType = USB_REQUEST_PARAMS_DATA_TYPE; + intParams.timeout = USB_CTRL_SET_TIMEOUT; + intParams.dataReq.numIsoPackets = 0; + intParams.dataReq.directon = (acm->intPipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & DIRECTION_MASK; + intParams.dataReq.length = acm->intSize; + ret = UsbFillRequest(acm->notifyReq, InterfaceIdToHandle(acm, acm->intPipe->interfaceId), &intParams); //填充预先分配的中断IO Request + if (HDF_SUCCESS != ret) { + HDF_LOGE("%s: UsbFillRequest failed, ret=%d n", __func__, ret); + goto error; + } + return HDF_SUCCESS; + +error: + AcmFreeNotifyReqeust(acm); + return ret; +} + +static void AcmReleaseInterfaces(struct AcmDevice *acm) +{ + for (int i = 0; i < acm->interfaceCnt; i++) { + if (acm->iface[i]) { + UsbReleaseInterface(acm->iface[i]); + acm->iface[i] = NULL; + } + } + if (acm->ctrIface) { + UsbReleaseInterface(acm->ctrIface); + acm->ctrIface = NULL; + } +} + +static int32_t AcmClaimInterfaces(struct AcmDevice *acm) +{ + for (int i = 0; i < acm->interfaceCnt; i++) { + acm->iface[i] = GetUsbInterfaceById((const struct AcmDevice *)acm, acm->interfaceIndex[i]); //获取UsbInterface接口对象 + if (acm->iface[i] == NULL) { + HDF_LOGE("%s: interface%d is null", __func__, acm->interfaceIndex[i]); + goto error; + } + } + + acm->ctrIface = GetUsbInterfaceById((const struct AcmDevice *)acm, USB_CTRL_INTERFACE_ID); //获取控制接口对应的UsbInterface接口对象 + if (acm->ctrIface == NULL) { + HDF_LOGE("%s: GetUsbInterfaceById null", __func__); + goto error; + } + + return HDF_SUCCESS; + + error: + AcmReleaseInterfaces(acm); + return HDF_FAILURE; +} + +static void AcmCloseInterfaces(struct AcmDevice *acm) +{ + for (int i = 0; i < acm->interfaceCnt; i++) { + if (acm->devHandle[i]) { + UsbCloseInterface(acm->devHandle[i]); + acm->devHandle[i] = NULL; + } + } + if (acm->ctrDevHandle) { + UsbCloseInterface(acm->ctrDevHandle); + acm->ctrDevHandle = NULL; + } +} + +static int32_t AcmOpenInterfaces(struct AcmDevice *acm) +{ + for (int i = 0; i < acm->interfaceCnt; i++) { + if (acm->iface[i]) { + acm->devHandle[i] = UsbOpenInterface(acm->iface[i]); //打开获取到的UsbInterface接口对象 + if (acm->devHandle[i] == NULL) { + HDF_LOGE("%s: UsbOpenInterface null", __func__); + goto error; + } + } + } + acm->ctrDevHandle = UsbOpenInterface(acm->ctrIface); + if (acm->ctrDevHandle == NULL) { + HDF_LOGE("%s: ctrDevHandle UsbOpenInterface null", __func__); + goto error; + } + + return HDF_SUCCESS; + +error: + AcmCloseInterfaces(acm); + return HDF_FAILURE; +} + +static int32_t AcmGetPipes(struct AcmDevice *acm) +{ + acm->dataInPipe = GetPipe(acm, USB_PIPE_TYPE_BULK, USB_PIPE_DIRECTION_IN);//获取dataInPipe的pipeInfo信息 + if (acm->dataInPipe == NULL) { + HDF_LOGE("dataInPipe is NULL"); + goto error; + } + + acm->dataOutPipe = GetPipe(acm, USB_PIPE_TYPE_BULK, USB_PIPE_DIRECTION_OUT);//获取dataOutPipe的pipeInfo信息 + if (acm->dataOutPipe == NULL) { + HDF_LOGE("dataOutPipe is NULL"); + goto error; + } + + acm->ctrPipe = EnumePipe(acm, acm->ctrIface->info.interfaceIndex, USB_PIPE_TYPE_CONTROL, USB_PIPE_DIRECTION_OUT); //获取控制pipe的pipeInfo信息 + if (acm->ctrPipe == NULL) { + HDF_LOGE("ctrPipe is NULL"); + goto error; + } + + acm->intPipe = GetPipe(acm, USB_PIPE_TYPE_INTERRUPT, USB_PIPE_DIRECTION_IN);//获取中断pipe的pipeInfo信息 + if (acm->intPipe == NULL) { + HDF_LOGE("intPipe is NULL"); + goto error; + } + + acm->readSize = acm->dataInPipe->maxPacketSize; + acm->writeSize = acm->dataOutPipe->maxPacketSize; + acm->ctrlSize = acm->ctrPipe->maxPacketSize; + acm->intSize = acm->intPipe->maxPacketSize; + + return HDF_SUCCESS; + +error: + AcmFreePipes(acm); + return HDF_FAILURE; +} + +static void AcmFreeRequests(struct AcmDevice *acm) +{ + if (g_syncRequest != NULL) { + UsbFreeRequest(g_syncRequest); + g_syncRequest = NULL; + } + AcmFreeReadRequests(acm); + AcmFreeNotifyReqeust(acm); + AcmFreeWriteRequests(acm); + AcmWriteBufFree(acm); +} + +static int32_t AcmAllocRequests(struct AcmDevice *acm) +{ + int32_t ret; + + if (AcmWriteBufAlloc(acm) < 0) { + HDF_LOGE("%s: AcmWriteBufAlloc failed", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + for (int i = 0; i < ACM_NW; i++) { + struct AcmWb *snd = &(acm->wb[i]); + snd->request = UsbAllocRequest(InterfaceIdToHandle(acm, acm->dataOutPipe->interfaceId), 0, acm->writeSize); //分配待发送的IO Request对象 + snd->instance = acm; + if (snd->request == NULL) { + HDF_LOGE("%s:%d snd request failed", __func__, __LINE__); + goto error_alloc_write_req; + } + } + + ret = AcmAllocNotifyRequest(acm); //分配并填充中断IO Request对象 + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s:%d AcmAllocNotifyRequest failed", __func__, __LINE__); + goto error_alloc_int_req; + } + + ret = AcmAllocReadRequests(acm); //分配并填充readReq IO Request对象 + if (ret) { + HDF_LOGE("%s:%d AcmAllocReadRequests failed", __func__, __LINE__); + goto error_alloc_read_req; + } + + return HDF_SUCCESS; + +error_alloc_read_req: + AcmFreeNotifyReqeust(acm); +error_alloc_int_req: + AcmFreeWriteRequests(acm); +error_alloc_write_req: + AcmWriteBufFree(acm); + return HDF_FAILURE; +} + +static int32_t AcmInit(struct AcmDevice *acm) +{ + int32_t ret; + struct UsbSession *session = NULL; + + if (acm->initFlag == true) { + HDF_LOGE("%s:%d: initFlag is true", __func__, __LINE__); + return HDF_SUCCESS; + } + + ret = UsbInitHostSdk(NULL); //初始化Host DDK + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: UsbInitHostSdk failed", __func__); + return HDF_ERR_IO; + } + acm->session = session; + + ret = AcmClaimInterfaces(acm); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AcmClaimInterfaces failed", __func__); + goto error_claim_interfaces; + } + + ret = AcmOpenInterfaces(acm); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AcmOpenInterfaces failed", __func__); + goto error_open_interfaces; + } + + ret = AcmGetPipes(acm); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AcmGetPipes failed", __func__); + goto error_get_pipes; + } + + ret = AcmAllocRequests(acm); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AcmAllocRequests failed", __func__); + goto error_alloc_reqs; + } + + acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); + acm->lineCoding.bCharFormat = CHARFORMAT; + acm->lineCoding.bParityType = USB_CDC_NO_PARITY; + acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + acm->initFlag = true; + + HDF_LOGD("%s:%d========OK", __func__, __LINE__); + return HDF_SUCCESS; + +error_alloc_reqs: + AcmFreePipes(acm); +error_get_pipes: + AcmCloseInterfaces(acm); +error_open_interfaces: + AcmReleaseInterfaces(acm); +error_claim_interfaces: + UsbExitHostSdk(acm->session); + acm->session = NULL; + return ret; +} + +static void AcmRelease(struct AcmDevice *acm) +{ + if (acm->initFlag == false) { + HDF_LOGE("%s:%d: initFlag is false", __func__, __LINE__); + return; + } + + AcmFreeRequests(acm); + AcmFreePipes(acm); + AcmCloseInterfaces(acm); + AcmReleaseInterfaces(acm); + UsbExitHostSdk(acm->session); + acm->session = NULL; + + acm->initFlag = false; +} + +static int32_t UsbSerialDriverInit(struct HdfDeviceObject *device) +{ + int32_t ret; + struct AcmDevice *acm = NULL; + + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + acm = (struct AcmDevice *)device->service; + OsalMutexInit(&acm->readLock); + OsalMutexInit(&acm->writeLock); + HDF_LOGD("%s:%d busNum=%d,devAddr=%d", + __func__, __LINE__, acm->busNum, acm->devAddr); + + ret = UsbSerialDeviceAlloc(acm); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Serial Device alloc failed", __func__); + } + + acm->initFlag = false; + g_acmReleaseFlag = false; + + HDF_LOGD("%s:%d init ok!", __func__, __LINE__); + + return ret; +} + +static void UsbSerialDriverRelease(struct HdfDeviceObject *device) +{ + struct AcmDevice *acm = NULL; + + if (device == NULL) { + HDF_LOGE("%s: device is NULL", __func__); + return; + } + acm = (struct AcmDevice *)device->service; + if (acm == NULL) { + HDF_LOGE("%s: acm is null", __func__); + return; + } + + g_acmReleaseFlag = true; + + if (acm->initFlag == true) { + HDF_LOGE("%s:%d AcmRelease", __func__, __LINE__); + AcmRelease(acm); + } + UsbSeriaDevicelFree(acm); + OsalMutexDestroy(&acm->writeLock); + OsalMutexDestroy(&acm->readLock); + OsalMutexDestroy(&acm->lock); + OsalMemFree(acm); + acm = NULL; + HDF_LOGD("%s:%d exit", __func__, __LINE__); +} + +struct HdfDriverEntry g_usbSerialDriverEntry = { + .moduleVersion = 1, + .moduleName = "usbhost_acm", //驱动模块名称,必须与hcs文件中配置的名称一致 + .Bind = UsbSerialDriverBind, + .Init = UsbSerialDriverInit, + .Release = UsbSerialDriverRelease, +}; +HDF_INIT(g_usbSerialDriverEntry); +``` + +### Host RAW API驱动开发 + +``` +root { + module = "usb_pnp_device"; + usb_pnp_config { + match_attr = "usb_pnp_match"; + usb_pnp_device_id = "UsbPnpDeviceId"; + UsbPnpDeviceId { + idTableList = [ + "host_acm_rawapi_table" + ]; + host_acm_rawapi_table { //驱动配置匹配表信息 + //驱动模块名,该字段的值必须和驱动入口结构的moduleName一致 + moduleName = "usbhost_acm_rawapi"; + //驱动对外发布服务的名称,必须唯一 + serviceName = "usbhost_acm_rawapi_service"; + //驱动私有数据匹配关键字 + deviceMatchAttr = "usbhost_acm_rawapi_matchAttr"; + //从该字段开始(包含该字段)之后数据长度,以byte为单位 + length = 21; + //USB驱动匹配规则vendorId+productId+interfaceSubClass+interfaceProtocol+interfaceNumber + matchFlag = 0x0303; + //厂商编号 + vendorId = 0x12D1; + //产品编号 + productId = 0x5000; + //设备出厂编号,低16位 + bcdDeviceLow = 0x0000; + //设备出厂编号,高16位 + bcdDeviceHigh = 0x0000; + //USB分配的设备类代码 + deviceClass = 0; + //USB分配的子类代码 + deviceSubClass = 0; + //USB分配的设备协议代码 + deviceProtocol = 0; + //接口类型,根据实际需要可填写多个 + interfaceClass = [0]; + //接口子类型,根据实际需要可填写多个 + interfaceSubClass = [2, 0]; + //接口所遵循的协议,根据实际需要可填写多个 + interfaceProtocol = [1, 2]; + //接口的编号,根据实际需要可填写多个 + interfaceNumber = [2, 3]; + } + } + } +} + +#include "usb_serial_rawapi.h" +#include +#include "osal_mem.h" +#include "osal_time.h" +#include "securec.h" +#include "hdf_base.h" +#include "hdf_log.h" +#include "hdf_usb_pnp_manage.h" + +#define HDF_LOG_TAG USB_HOST_ACM_RAW_API +#define USB_CTRL_REQ_SIZE 64 +#define USB_IO_THREAD_STACK_SIZE 8192 +#define USB_RAW_IO_SLEEP_MS_TIME 100 +#define USB_RAW_IO_STOP_WAIT_MAX_TIME 3 + +static struct UsbRawRequest *g_syncRequest = NULL; +static UsbRawIoProcessStatusType g_stopIoStatus = USB_RAW_IO_PROCESS_RUNNING; +struct OsalMutex g_stopIoLock; +static bool g_rawAcmReleaseFlag = false; +...... + +static int UsbGetConfigDescriptor(UsbRawHandle *devHandle, struct UsbRawConfigDescriptor **config) +{ + UsbRawDevice *dev = NULL; + int activeConfig; + int ret; + + if (devHandle == NULL) { + HDF_LOGE("%s:%d devHandle is NULL", + __func__, __LINE__); + return HDF_ERR_INVALID_PARAM; + } + + ret = UsbRawGetConfiguration(devHandle, &activeConfig); + if (ret) { + HDF_LOGE("%s:%d UsbRawGetConfiguration failed, ret=%d", + __func__, __LINE__, ret); + return HDF_FAILURE; + } + HDF_LOGE("%s:%d activeConfig=%d", __func__, __LINE__, activeConfig); + dev = UsbRawGetDevice(devHandle); + if (dev == NULL) { + HDF_LOGE("%s:%d UsbRawGetDevice failed", + __func__, __LINE__); + return HDF_FAILURE; + } + + ret = UsbRawGetConfigDescriptor(dev, activeConfig, config); + if (ret) { + HDF_LOGE("UsbRawGetConfigDescriptor failed, ret=%dn", ret); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} +... +static int UsbAllocWriteRequests(struct AcmDevice *acm) +{ + int i; + + for (i = 0; i < ACM_NW; i++) { + struct AcmWb *snd = &acm->wb[i]; + snd->request = UsbRawAllocRequest(acm->devHandle, 0, acm->dataOutEp->maxPacketSize); + snd->instance = acm; + if (snd->request == NULL) { + HDF_LOGE("%s: UsbRawAllocRequest failed", __func__); + return HDF_ERR_MALLOC_FAIL; + } + } + + return HDF_SUCCESS; +} +... +/* HdfDriverEntry implementations */ +static int32_t UsbSerialDriverBind(struct HdfDeviceObject *device) +{ + struct AcmDevice *acm = NULL; + struct UsbPnpNotifyServiceInfo *info = NULL; + errno_t err; + + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + acm = (struct AcmDevice *)OsalMemCalloc(sizeof(*acm)); + if (acm == NULL) { + HDF_LOGE("%s: Alloc usb serial device failed", __func__); + return HDF_FAILURE; + } + if (OsalMutexInit(&acm->lock) != HDF_SUCCESS) { + HDF_LOGE("%s:%d OsalMutexInit failed", __func__, __LINE__); + goto error; + } + + info = (struct UsbPnpNotifyServiceInfo *)device->priv; + if (info != NULL) { + acm->busNum = info->busNum; + acm->devAddr = info->devNum; + acm->interfaceCnt = info->interfaceLength; + err = memcpy_s((void *)(acm->interfaceIndex), USB_MAX_INTERFACES, + (const void*)info->interfaceNumber, info->interfaceLength); + if (err != EOK) { + HDF_LOGE("%s:%d memcpy_s failed err=%d", + __func__, __LINE__, err); + goto lock_error; + } + } else { + HDF_LOGE("%s:%d info is NULL!", __func__, __LINE__); + goto lock_error; + } + + device->service = &(acm->service); + device->service->Dispatch = UsbSerialDeviceDispatch; + acm->device = device; + HDF_LOGD("UsbSerialDriverBind=========================OK"); + return HDF_SUCCESS; + +lock_error: + if (OsalMutexDestroy(&acm->lock)) { + HDF_LOGE("%s:%d OsalMutexDestroy failed", __func__, __LINE__); + } +error: + OsalMemFree(acm); + acm = NULL; + return HDF_FAILURE; +} +... +static int UsbAllocReadRequests(struct AcmDevice *acm) +{ + struct UsbRawFillRequestData reqData; + int size = acm->dataInEp->maxPacketSize; + int ret; + + for (int i = 0; i < ACM_NR; i++) { + acm->readReq[i] = UsbRawAllocRequest(acm->devHandle, 0, size); + if (!acm->readReq[i]) { + HDF_LOGE("readReq request failed"); + return HDF_ERR_MALLOC_FAIL; + } + + reqData.endPoint = acm->dataInEp->addr; + reqData.numIsoPackets = 0; + reqData.callback = AcmReadBulkCallback; + reqData.userData = (void *)acm; + reqData.timeout = USB_CTRL_SET_TIMEOUT; + reqData.length = size; + + ret = UsbRawFillBulkRequest(acm->readReq[i], acm->devHandle, &reqData); + if (ret) { + HDF_LOGE("%s: FillBulkRequest failed, ret=%d n", + __func__, ret); + return HDF_FAILURE; + } + } + + return HDF_SUCCESS; +} +... +static int UsbAllocNotifyRequest(struct AcmDevice *acm) +{ + struct UsbRawFillRequestData fillRequestData; + int size = acm->notifyEp->maxPacketSize; + int ret; + + acm->notifyReq = UsbRawAllocRequest(acm->devHandle, 0, size); + if (!acm->notifyReq) { + HDF_LOGE("notifyReq request failed"); + return HDF_ERR_MALLOC_FAIL; + } + + fillRequestData.endPoint = acm->notifyEp->addr; + fillRequestData.length = size; + fillRequestData.numIsoPackets = 0; + fillRequestData.callback = AcmNotifyReqCallback; + fillRequestData.userData = (void *)acm; + fillRequestData.timeout = USB_CTRL_SET_TIMEOUT; + + ret = UsbRawFillInterruptRequest(acm->notifyReq, acm->devHandle, &fillRequestData); + if (ret) { + HDF_LOGE("%s: FillInterruptRequest failed, ret=%d", __func__, ret); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} +... +static int32_t UsbSerialInit(struct AcmDevice *acm) +{ + struct UsbSession *session = NULL; + UsbRawHandle *devHandle = NULL; + int32_t ret; + + if (acm->initFlag == true) { + HDF_LOGE("%s:%d: initFlag is true", __func__, __LINE__); + return HDF_SUCCESS; + } + + ret = UsbRawInit(NULL); + if (ret) { + HDF_LOGE("%s:%d UsbRawInit failed", __func__, __LINE__); + return HDF_ERR_IO; + } + acm->session = session; + + devHandle = UsbRawOpenDevice(session, acm->busNum, acm->devAddr); + if (devHandle == NULL) { + HDF_LOGE("%s:%d UsbRawOpenDevice failed", __func__, __LINE__); + ret = HDF_FAILURE; + goto err_open_device; + } + acm->devHandle = devHandle; + ret = UsbGetConfigDescriptor(devHandle, &acm->config); + if (ret) { + HDF_LOGE("%s:%d UsbGetConfigDescriptor failed", __func__, __LINE__); + ret = HDF_FAILURE; + goto err_get_desc; + } + ret = UsbParseConfigDescriptor(acm, acm->config); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s:%d UsbParseConfigDescriptor failed", __func__, __LINE__); + ret = HDF_FAILURE; + goto err_parse_desc; + } + + ret = AcmWriteBufAlloc(acm); + if (ret < 0) { + HDF_LOGE("%s:%d AcmWriteBufAlloc failed", __func__, __LINE__); + ret = HDF_FAILURE; + goto err_alloc_write_buf; + } + ret = UsbAllocWriteRequests(acm); + if (ret < 0) { + HDF_LOGE("%s:%d UsbAllocWriteRequests failed", __func__, __LINE__); + ret = HDF_FAILURE; + goto err_alloc_write_reqs; + } + ret = UsbAllocNotifyRequest(acm); + if (ret) { + HDF_LOGE("%s:%d UsbAllocNotifyRequests failed", __func__, __LINE__); + goto err_alloc_notify_req; + } + ret = UsbAllocReadRequests(acm); + if (ret) { + HDF_LOGE("%s:%d UsbAllocReadRequests failed", __func__, __LINE__); + goto err_alloc_read_reqs; + } + ret = UsbStartIo(acm); + if (ret) { + HDF_LOGE("%s:%d UsbAllocReadRequests failed", __func__, __LINE__); + goto err_start_io; + } + + acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); + acm->lineCoding.bCharFormat = CHARFORMAT; + acm->lineCoding.bParityType = USB_CDC_NO_PARITY; + acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + + ret = UsbRawSubmitRequest(acm->notifyReq); + if (ret) { + HDF_LOGE("%s:%d UsbRawSubmitRequest failed", __func__, __LINE__); + goto err_submit_req; + } + + acm->initFlag = true; + + HDF_LOGD("%s:%d=========================OK", __func__, __LINE__); + + return HDF_SUCCESS; + +err_submit_req: + UsbStopIo(acm); +err_start_io: + UsbFreeReadRequests(acm); +err_alloc_read_reqs: + UsbFreeNotifyReqeust(acm); + err_alloc_notify_req: + UsbFreeWriteRequests(acm); +err_alloc_write_reqs: + AcmWriteBufFree(acm); +err_alloc_write_buf: + UsbReleaseInterfaces(acm); +err_parse_desc: + UsbRawFreeConfigDescriptor(acm->config); + acm->config = NULL; +err_get_desc: + (void)UsbRawCloseDevice(devHandle); +err_open_device: + UsbRawExit(acm->session); + + return ret; +} + +static void UsbSerialRelease(struct AcmDevice *acm) +{ + if (acm->initFlag == false) { + HDF_LOGE("%s:%d: initFlag is false", __func__, __LINE__); + return; + } + + /* stop io thread and release all resources */ + UsbStopIo(acm); + if (g_syncRequest != NULL) { + UsbRawFreeRequest(g_syncRequest); + g_syncRequest = NULL; + } + UsbFreeReadRequests(acm); + UsbFreeNotifyReqeust(acm); + UsbFreeWriteRequests(acm); + AcmWriteBufFree(acm); + (void)UsbRawCloseDevice(acm->devHandle); + UsbReleaseInterfaces(acm); + UsbRawFreeConfigDescriptor(acm->config); + acm->config = NULL; + UsbRawExit(acm->session); + + acm->initFlag = false; +} + +static int32_t UsbSerialDriverInit(struct HdfDeviceObject *device) +{ + struct AcmDevice *acm = NULL; + int32_t ret; + + if (device == NULL) { + HDF_LOGE("%s:%d device is null", __func__, __LINE__); + return HDF_ERR_INVALID_OBJECT; + } + acm = (struct AcmDevice *)device->service; + OsalMutexInit(&acm->readLock); + OsalMutexInit(&acm->writeLock); + + ret = UsbSerialDeviceAlloc(acm); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s:%d UsbSerialDeviceAlloc failed", __func__, __LINE__); + } + + acm->initFlag = false; + g_rawAcmReleaseFlag = false; + + HDF_LOGD("%s:%d init ok!", __func__, __LINE__); + + return ret; +} + +static void UsbSerialDriverRelease(struct HdfDeviceObject *device) +{ + struct AcmDevice *acm = NULL; + if (device == NULL) { + HDF_LOGE("%s: device is NULL", __func__); + return; + } + + acm = (struct AcmDevice *)device->service; + if (acm == NULL) { + HDF_LOGE("%s: acm is null", __func__); + return; + } + + g_rawAcmReleaseFlag = true; + + if (acm->initFlag == true) { + HDF_LOGE("%s:%d UsbSerialRelease", __func__, __LINE__); + UsbSerialRelease(acm); + } + UsbSeriaDevicelFree(acm); + OsalMutexDestroy(&acm->writeLock); + OsalMutexDestroy(&acm->readLock); + OsalMutexDestroy(&acm->lock); + OsalMemFree(acm); + acm = NULL; + HDF_LOGD("%s:%d exit", __func__, __LINE__); +} + +struct HdfDriverEntry g_usbSerialRawDriverEntry = { + .moduleVersion = 1, + .moduleName = "usbhost_acm_rawapi", //驱动模块名称,必须与hcs文件中配置的名称一致 + .Bind = UsbSerialDriverBind, + .Init = UsbSerialDriverInit, + .Release = UsbSerialDriverRelease, +}; +HDF_INIT(g_usbSerialRawDriverEntry); +``` + +### Device DDK API驱动开发 + +USB ACM设备核心代码路径为drivers/peripheral/usb/gadget/function/acmcdcacm.c,其使用示例如下所示,首先根据描述符创建设备,然后获取接口,打开接口,获取Pipe信息,接收Event事件,接着进行USB通信(读写等),设备卸载时候,关闭接口,停止Event接收,删除设备。 + +``` +1、创建设备 +static int32_t AcmCreateFuncDevice(struct UsbAcmDevice *acm, + struct DeviceResourceIface *iface) +{ + struct UsbFnDevice *fnDev = NULL; +struct UsbFnDescriptorData descData; +uint8_t useHcs; + ... +if (useHcs == 0) { + descData.type = USBFN_DESC_DATA_TYPE_DESC; + descData.descriptor = &g_masterFuncDevice; +} else { + descData.type = USBFN_DESC_DATA_TYPE_PROP; + descData.property = device->property; +} +/* 创建设备 */ + fnDev = (struct UsbFnDevice *)UsbFnDeviceCreate(acm->udcName, &descData); + if (fnDev == NULL) { + HDF_LOGE("%s: create usb function device failed", __func__); + return HDF_FAILURE; + } + ... +} +2、获取接口,打开接口,获取Pipe信息 +static int32_t AcmParseEachPipe(struct UsbAcmDevice *acm, struct UsbAcmInterface *iface) +{ + ... + for (i = 0; i < fnIface->info.numPipes; i++) { + struct UsbFnPipeInfo pipeInfo; +/* 获取pipe信息 */ + ret = UsbFnInterfaceGetPipeInfo(fnIface, i, &pipeInfo); + ... + } + return HDF_SUCCESS; +} +/* 获取接口,打开接口获取handle */ +static int32_t AcmParseEachIface(struct UsbAcmDevice *acm, struct UsbFnDevice *fnDev) +{ + ... + for (i = 0; i < fnDev->numInterfaces; i++) { + /* 获取接口 */ + fnIface = (struct UsbFnInterface *)UsbFnDeviceGetInterface(fnDev, i); + ... + /* 打开接口 */ + handle = UsbFnInterfaceOpen(fnIface); + ... + } + return HDF_SUCCESS; +} +3、接收Event事件 +static int32_t AcmAllocCtrlRequests(struct UsbAcmDevice *acm, int num) +{ + ... + req = UsbFnCtrlRequestAlloc(acm->ctrlIface.handle, + sizeof(struct UsbCdcLineCoding) + sizeof(struct UsbCdcLineCoding)); + ... +} +static int32_t AcmDriverInit(struct HdfDeviceObject *device) +{ +... +/* 开始接收Event */ + ret = UsbFnInterfaceStartRecvEvent(acm->ctrlIface.fn, 0xff, UsbAcmEventCallback, acm); + ... +} +4、进行USB通信(读写等) +static int32_t AcmSendNotifyRequest(struct UsbAcmDevice *acm, uint8_t type, + uint16_t value, void *data, uint32_t length) +{ +... +/* 异步发送 */ + ret = UsbFnRequestSubmitAsync(req); + ... +} +5、关闭接口,停止Event接收,删除设备 +static int32_t AcmReleaseFuncDevice(struct UsbAcmDevice *acm) +{ +int32_t ret; +/* 关闭接口 */ + (void)UsbFnInterfaceClose(acm->ctrlIface.handle); +(void)UsbFnInterfaceClose(acm->dataIface.handle); +/* 停止接收Event */ +(void)UsbFnInterfaceStopRecvEvent(acm->ctrlIface.fn); +/* 删除设备 */ + ret = UsbFnDeviceRemove(acm->fnDev); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: remove usb function device failed", __func__); + } + return ret; +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/01.\347\274\226\350\257\221\346\236\204\345\273\272/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/03.\347\274\226\350\257\221\346\236\204\345\273\272/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" similarity index 91% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/01.\347\274\226\350\257\221\346\236\204\345\273\272/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/03.\347\274\226\350\257\221\346\236\204\345\273\272/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" index ec287f8cae85f01e2e28f5545a2cc4d7d6c03784..5bc5529cb5b71c43aa96f3bbe559e360d52fb6b5 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/01.\347\274\226\350\257\221\346\236\204\345\273\272/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/03.\347\274\226\350\257\221\346\236\204\345\273\272/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 轻量和小型系统编译构建指导 -permalink: /pages/00040000 +permalink: /pages/00040200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 轻量和小型系统编译构建指导 @@ -31,12 +31,12 @@ date: 2021-12-30 12:57:44 - [新增产品解决方案](#section1097623294220) - [常见问题](#section19909721104319) - - [ninja版本问题导致编译失败](#section138233464318) - - [ncurses库缺失导致编译失败](#section151033911442) - - [未安装mcopy导致编译失败](#section19811838104418) - - [权限问题导致编译失败](#section03111118451) - - [未安装Crypto导致编译失败](#section69981127125013) - - [编译环境为shell导致编译失败](#section967617530505) + - [编译构建过程中,提示“usr/sbin/ninja: invalid option -- w”](#section138233464318) + - [编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses”](#section151033911442) + - [编译构建过程中,提示“line 77: mcopy: command not found”](#section19811838104418) + - [编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”](#section03111118451) + - [编译构建过程中,提示“No module named 'Crypto'”](#section69981127125013) + - [编译构建过程中,提示“xx.sh : xx unexpected operator”](#section967617530505) ## 概述 @@ -50,7 +50,7 @@ date: 2021-12-30 12:57:44 ### 基本概念 -在使用编译构建子系统前,应了解如下基本概念: +在使用编译构建子系统前,应了解如下基本概念:s - 子系统 @@ -79,7 +79,7 @@ date: 2021-12-30 12:57:44 ``` build/lite ├── components # 组件描述文件 -├── figures # readme中的图片 +├── figure # readme中的图片 ├── hb # hb pip安装包源码 ├── make_rootfs # 文件系统镜像制作脚本 ├── config # 编译配置项 @@ -96,7 +96,7 @@ build/lite 编译构建流程如[图1 ](#fig9744112715161)所示,主要分设置和编译两步: **图 1** 编译构建流程 -![](/images/zh-cn/device-dev/subsystems/figure/编译构建流程.jpg "编译构建流程") +![](/images/device-dev/subsystems/figure/编译构建流程.jpg "编译构建流程") 1. hb set: 设置OpenHarmony源码目录和要编译的产品。 2. hb build: 编译产品、开发板或者组件。编译主要过程如下: @@ -110,11 +110,11 @@ build/lite 为了实现芯片解决方案、产品解决方案与OpenHarmony是解耦的、可插拔的,组件、芯片解决方案和产品解决方案的路径、目录树和配置需遵循一定的规则,具体如下: -### **组件** +### 组件 组件源码路径命名规则为:**\{领域\}/\{子系统\}/\{组件\}**,组件目录树规则如下: ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >组件的名称、源码路径、功能简介、是否必选、编译目标、RAM、ROM、编译输出、已适配的内核、可配置的特性和依赖等属性定义在build/lite/components目录下对应子系统的json文件中,新增组件时需要在对应子系统json文件中添加相应的组件定义。产品所配置的组件必须在某个子系统中被定义过,否则会校验失败。 ``` @@ -168,8 +168,8 @@ component - 组件对外可配置的特性变量需声明在该组件BUILD.gn中,特性变量命名规则:ohos\_\{subsystem\}\_\{component\}\_\{feature\}。特性在组件描述中也需要同步定义,在产品配置文件config.json中按需配置。 - 宏定义规则:OHOS\_\{SUBSYSTEM\}\_\{COMPONENT\}\_\{FEATURE\} - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >组件的编译脚本语言为gn,gn的基本用法请见[gn快速入门](https://gn.googlesource.com/gn/+/master/docs/quick_start.md)。组件即为gn定义的编译目标,可以为静态库、动态库、可执行文件或group。 + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >组件的编译脚本语言为gn,gn的基本用法请见https://gn.googlesource.com/gn/+/master/docs/quick_start.md。 组件即为gn定义的编译目标,可以为静态库、动态库、可执行文件或group。 以图形的UI组件为例,foundation/graphic/ui/BUILD.gn文件如下: @@ -219,7 +219,7 @@ component } ``` -### **芯片解决方案** +### 芯片解决方案 - 芯片解决方案是指基于某款开发板的完整解决方案,包含驱动、设备侧接口适配、开发板sdk等。 - 芯片解决方案是一个特殊的组件,源码路径规则为:**device/\{芯片解决方案厂商\}/\{开发板\}**。 @@ -239,7 +239,7 @@ device └── config.gni # liteos_a版本编译配置 ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >config.gni为开发板编译相关的配置,编译时会采用该配置文件中的参数编译所有OS组件,编译阶段系统全局可见。 config.gni的关键字段介绍如下: @@ -257,7 +257,7 @@ board_cxx_flags: 开发板配置的cpp文件编译选项。 board_ld_flags: 开发板配置的链接选项。 ``` -### **产品解决方案** +### 产品解决方案 产品解决方案为基于开发板的完整产品,主要包含产品对OS的适配、组件拼装配置、启动配置和文件系统配置等。产品解决方案的源码路径规则为:**vendor/\{产品解决方案厂商\}/\{产品名称\}**_。_产品解决方案也是一个特殊的组件。 @@ -277,7 +277,7 @@ vendor └── ...... ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >**新增产品须按如上的规则创建目录和文件,编译构建系统将按该规则扫描已配置的产品。** 关键的目录和文件详细介绍如下: @@ -351,6 +351,8 @@ vendor ``` { "product_name": "ipcamera", # 产品名称 + "version": "3.0", # config.json的版本号, 固定"3.0" + "type": "small", # 系统类型, 可选[mini, small, standard] "ohos_version": "OpenHarmony 1.0", # 选择的OS版本 "device_company": "hisilicon", # 芯片厂商 "board": "hispark_taurus", # 开发板名称 @@ -409,7 +411,7 @@ vendor - $\{root\_path\} - $\{fs\_dir\_name\} - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >fs.yml是可选的,对于没有文件系统的设备可不配置。 6. **vendor/company/product/BUILD.gn** @@ -431,7 +433,7 @@ vendor ### 前提条件 -开发环境需安装gn、ninja构建工具、python 3.7.4及以上和hb。安装方法请见[搭建系统基础环境](/pages/extra/a5e1ee/)。 +开发环境需安装gn、ninja构建工具、python 3.7.4及以上和hb。安装方法请见[搭建系统基础环境](/pages/extra/ae3006/)。 ### hb工具使用说明 @@ -593,7 +595,7 @@ optional arguments: 3. 将组件配置到产品。 - 产品的配置文件config.json位于位于vendor/company/product/下,产品配置文件需包含产品名称、OpenHarmony版本号、device厂商、开发板、内核类型、内核版本号,以及配置的子系统和组件。以将hello\_world组件加入产品配置文件my\_product.json中为例,加入hello\_wolrd对象: + 产品的配置文件config.json位于vendor/company/product/下,产品配置文件需包含产品名称、OpenHarmony版本号、device厂商、开发板、内核类型、内核版本号,以及配置的子系统和组件。以将hello\_world组件加入产品配置文件my\_product.json中为例,加入hello\_wolrd对象: ``` { @@ -708,6 +710,8 @@ optional arguments: ``` { "product_name": "wifiiot", # 产品名称 + "version": "3.0", # config.json的版本号, 固定"3.0" + "type": "small", # 系统类型, 可选[mini, small, standard] "ohos_version": "OpenHarmony 1.0", # 使用的OS版本 "device_company": "realtek", # 芯片解决方案厂商名称 "board": "rtl8720", # 开发板名称 @@ -893,7 +897,7 @@ optional arguments: ## 常见问题 -### ninja版本问题导致编译失败 +### 编译构建过程中,提示“usr/sbin/ninja: invalid option -- w” - **现象描述:** @@ -905,10 +909,10 @@ optional arguments: - **解决办法:** - 卸载环境中ninja和gn,按照HarmonyOS官网[获取工具](/pages/extra/20bf1d/)。 + 卸载环境中ninja和gn,按照[获取工具](/pages/000a01)。 -### ncurses库缺失导致编译失败 +### 编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses” - **现象描述:** @@ -925,7 +929,7 @@ optional arguments: ``` -### 未安装mcopy导致编译失败 +### 编译构建过程中,提示“line 77: mcopy: command not found” - **现象描述:** @@ -942,7 +946,7 @@ optional arguments: ``` -### 权限问题导致编译失败 +### 编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory” - **现象描述:** @@ -963,7 +967,7 @@ optional arguments: 使用chmod命令修改目录权限为755。 -### 未安装Crypto导致编译失败 +### 编译构建过程中,提示“No module named 'Crypto'” - **现象描述:** @@ -988,7 +992,7 @@ optional arguments: -### 编译环境为shell导致编译失败 +### 编译构建过程中,提示“xx.sh : xx unexpected operator” - **现象描述:** diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/01.\347\274\226\350\257\221\346\236\204\345\273\272/02.\346\240\207\345\207\206\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/03.\347\274\226\350\257\221\346\236\204\345\273\272/02.\346\240\207\345\207\206\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/01.\347\274\226\350\257\221\346\236\204\345\273\272/02.\346\240\207\345\207\206\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/03.\347\274\226\350\257\221\346\236\204\345\273\272/02.\346\240\207\345\207\206\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" index 5337e3a7ef84e27c5d4ea017e23dc86c008ec07d..1eff1c638831e4384077fb622386a7ddaf0e280b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/01.\347\274\226\350\257\221\346\236\204\345\273\272/02.\346\240\207\345\207\206\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/03.\347\274\226\350\257\221\346\236\204\345\273\272/02.\346\240\207\345\207\206\347\263\273\347\273\237\347\274\226\350\257\221\346\236\204\345\273\272\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 标准系统编译构建指导 -permalink: /pages/00040001 +permalink: /pages/00040201 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 标准系统编译构建指导 @@ -67,7 +67,7 @@ OpenHarmony侧的编译构建流程主要包括编译命令行解析,调用gn ### 约束与限制 -- 需按照[源码获取](/pages/extra/dade07/)指导下载全量源码(采用方式三获取)。 +- 需按照[源码获取](/pages/000102)指导下载全量源码(采用方式三获取)。 - 编译环境需要Ubuntu18.04及以上版本。 - 安装编译所需的程序包。 @@ -111,7 +111,7 @@ OpenHarmony侧的编译构建流程主要包括编译命令行解析,调用gn \{product\_name\}为当前版本支持的平台。比如:Hi3516DV300等。 - 编译完成后,结果镜像保存在 out/ohos-arm-release/packages/phone/images/ 目录下。 + 编译完成后,结果镜像保存在 out/{device_name}/packages/phone/images/ 目录下。 - 编译命令支持选项: @@ -243,6 +243,6 @@ OpenHarmony侧的编译构建流程主要包括编译命令行解析,调用gn 4. 编译输出。 - 编译所生成的文件都归档在out/ohos-arm-release/目录下,结果镜像输出在 out/ohos-arm-release/packages/phone/images/ 目录下。 + 编译所生成的文件都归档在out/hi3516dv300/目录下,结果镜像输出在 out/hi3516dv300/packages/phone/images/ 目录下。 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/02.\345\210\206\345\270\203\345\274\217\350\277\234\347\250\213\345\220\257\345\212\250.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/04.\345\210\206\345\270\203\345\274\217\350\277\234\347\250\213\345\220\257\345\212\250.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/02.\345\210\206\345\270\203\345\274\217\350\277\234\347\250\213\345\220\257\345\212\250.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/04.\345\210\206\345\270\203\345\274\217\350\277\234\347\250\213\345\220\257\345\212\250.md" index 8c0ed2f9ba98fa45b16bc626d76a9137ef794289..b5a404797e7582f362371c25ab8277ff9f83a048 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/02.\345\210\206\345\270\203\345\274\217\350\277\234\347\250\213\345\220\257\345\212\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/04.\345\210\206\345\270\203\345\274\217\350\277\234\347\250\213\345\220\257\345\212\250.md" @@ -1,6 +1,6 @@ --- title: 分布式远程启动 -permalink: /pages/000401 +permalink: /pages/000403 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 分布式远程启动 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/01.\345\233\276\345\275\242\345\233\276\345\203\217\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/01.\345\233\276\345\275\242\345\233\276\345\203\217\346\246\202\350\277\260.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/01.\345\233\276\345\275\242\345\233\276\345\203\217\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/01.\345\233\276\345\275\242\345\233\276\345\203\217\346\246\202\350\277\260.md" index 199f3283bd1c29e0bd04d7b628e4aa071b4785f2..c4a4a24e639e230a24fd60c9738fd0c310d1c5b1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/01.\345\233\276\345\275\242\345\233\276\345\203\217\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/01.\345\233\276\345\275\242\345\233\276\345\203\217\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 图形图像概述 -permalink: /pages/00040200 +permalink: /pages/00040400 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 图形图像概述 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/02.\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/02.\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/02.\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/02.\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" index 04b119292ec99dc50e4ad3656f459f66532e58eb..5f57c0f951b726e5d0c9e3ea67b0ca77bdac4a52 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/02.\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/02.\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 容器类组件开发指导 -permalink: /pages/00040201 +permalink: /pages/00040401 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 容器类组件开发指导 @@ -25,7 +25,7 @@ date: 2021-12-30 12:57:44 容器类组件,指能包含其它UI组件的组件,容器类组件继承于UIViewGroup(带Add方法),基于实际组件的使用场景,将需要增加其他子组件的组件,放置到容器类继承结构下。如UIAnalogClock内,通常会Add需要的计步信息,时分秒图标等。 **图 1** 普通容器类组件结构 -![](/images/zh-cn/device-dev/subsystems/figure/普通容器类组件结构.png "普通容器类组件结构") +![](/images/device-dev/subsystems/figure/普通容器类组件结构.png "普通容器类组件结构") RootView、UIAbstractScroll、UIPicker组件从UIViewGroup继承,UIList、UIScrollView、UISwipeView组件从UIAbstractScroll继承。 @@ -36,7 +36,7 @@ RootView、UIAbstractScroll、UIPicker组件从UIViewGroup继承,UIList、UISc UIViewGroup是容器类组件基类,实现增加、删除、插入等操作,通过增加方法可以添加子组件。普通容器类组件子组件需要设置位置信息,位置信息为相对父组件的相对坐标。组件树结构如下图: **图 2** 组件树结构示意图 -![](/images/zh-cn/device-dev/subsystems/figure/组件树结构示意图.png "组件树结构示意图") +![](/images/device-dev/subsystems/figure/组件树结构示意图.png "组件树结构示意图") 往根节点rootView里添加ViewGroup1容器组件和View1组件,往ViewGroup1容器组件里再添加View2组件和ViewGroup2容器组件,在View1之后添加View3组件。 @@ -139,7 +139,7 @@ UIViewGroup是容器类组件基类,实现增加、删除、插入等操作, 4. 检查ViewGroup效果如下图所示。 **图 3** ViewGroup添加view实例效果图 - ![](/images/zh-cn/device-dev/subsystems/figure/ViewGroup添加view实例效果图.png "ViewGroup添加view实例效果图") + ![](/images/device-dev/subsystems/figure/ViewGroup添加view实例效果图.png "ViewGroup添加view实例效果图") ## UIScrollView @@ -253,5 +253,5 @@ scroll->Add(button2); ``` **图 4** 水平、垂直方向可滑动效果图 -![](/images/zh-cn/device-dev/subsystems/figure/水平-垂直方向可滑动效果图.gif "水平-垂直方向可滑动效果图") +![](/images/device-dev/subsystems/figure/水平-垂直方向可滑动效果图.gif "水平-垂直方向可滑动效果图") diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/03.\345\270\203\345\261\200\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/03.\345\270\203\345\261\200\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/03.\345\270\203\345\261\200\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/03.\345\270\203\345\261\200\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" index ccedf488f4dd8140522a19485f6f640d1729d2c2..c24c86b88f66951c7764f9b350bdcdb2cab2760c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/03.\345\270\203\345\261\200\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/03.\345\270\203\345\261\200\345\256\271\345\231\250\347\261\273\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 布局容器类组件开发指导 -permalink: /pages/00040202 +permalink: /pages/00040402 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 布局容器类组件开发指导 @@ -110,7 +110,7 @@ UISwipeView继承UIViewGroup,除提供容器类组件Add、Remove、Insert等 **图 1** UISwipeView水平滑动效果图 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001053247975.gif) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001053247975.gif) ## 开发步骤(水平滑动,可循环) @@ -144,7 +144,7 @@ UISwipeView继承UIViewGroup,除提供容器类组件Add、Remove、Insert等 **图 2** UISwipeView水平滑动循环效果图 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001053207924.gif) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001053207924.gif) ## GridLayout @@ -224,6 +224,6 @@ UISwipeView继承UIViewGroup,除提供容器类组件Add、Remove、Insert等 4. 检查button组件布局效果如下图所示。 **图 3** 设置2\*2网格并添加4个button组件进行布局 - ![](/images/zh-cn/device-dev/subsystems/figure/设置2-2网格并添加4个button组件进行布局.png "设置2-2网格并添加4个button组件进行布局") + ![](/images/device-dev/subsystems/figure/设置2-2网格并添加4个button组件进行布局.png "设置2-2网格并添加4个button组件进行布局") diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/04.\346\231\256\351\200\232\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/04.\346\231\256\351\200\232\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/04.\346\231\256\351\200\232\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/04.\346\231\256\351\200\232\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" index 07afdae5a40e2ed3f66ef1c50c8d52c37c11eeee..03cb374e2ae9905905c7d15f68a0755a0624e9f1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/04.\346\231\256\351\200\232\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/04.\346\231\256\351\200\232\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 普通组件开发指导 -permalink: /pages/00040203 +permalink: /pages/00040403 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 普通组件开发指导 @@ -35,7 +35,7 @@ date: 2021-12-30 12:57:44 普通组件均继承于基类UIView,不可以添加子组件,常用的普通组件有button、image、label等。 **图 1** 普通组件树结构 -![](/images/zh-cn/device-dev/subsystems/figure/普通组件树结构.png "普通组件树结构") +![](/images/device-dev/subsystems/figure/普通组件树结构.png "普通组件树结构") UIView为基础类,UIAbstractProgress、UIArcLabel(旋转字体)、UIButton(按键)、UICanvas(画布)、UILabel(字体)、UIImageView(图片)从UIView继承。UIBoxProgress、UICircleProgress从UIAbstractProgress继承,UILabelButton和UIRepeatButton从UIButton继承,UIImageAnimatorView和UITextureMapper从UIImageView继承。 @@ -139,7 +139,7 @@ UIButton组件,提供可点击功能,同时可设置不同状态下样式。 4. 检查Button点击效果如下图所示,Button逐渐变大。 **图 2** UIButton点击效果 - ![](/images/zh-cn/device-dev/subsystems/figure/UIButton点击效果.gif "UIButton点击效果") + ![](/images/device-dev/subsystems/figure/UIButton点击效果.gif "UIButton点击效果") ## UIImageView @@ -225,7 +225,7 @@ UIButton组件,提供可点击功能,同时可设置不同状态下样式。 3. 检查UIImageView控件大小与图片相同。 **图 3** 自适应模式图片效果图 - ![](/images/zh-cn/device-dev/subsystems/figure/自适应模式图片效果图.png "自适应模式图片效果图") + ![](/images/device-dev/subsystems/figure/自适应模式图片效果图.png "自适应模式图片效果图") ## 开发步骤(平铺模式) @@ -253,7 +253,7 @@ UIButton组件,提供可点击功能,同时可设置不同状态下样式。 4. 检查UIImageView控件显示为平铺效果。 **图 4** 平铺模式图片效果图 - ![](/images/zh-cn/device-dev/subsystems/figure/平铺模式图片效果图.png "平铺模式图片效果图") + ![](/images/device-dev/subsystems/figure/平铺模式图片效果图.png "平铺模式图片效果图") ## UILabel @@ -411,7 +411,7 @@ UIButton组件,提供可点击功能,同时可设置不同状态下样式。 4. 检查label大小和显示效果正常,如下图所示。 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001051782526.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001051782526.png) ## 开发步骤(背景色和透明度) @@ -440,7 +440,7 @@ UIButton组件,提供可点击功能,同时可设置不同状态下样式。 4. 检查label背景色为Gray,如下图所示。 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001052582522.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001052582522.png) ## 开发步骤(字符间距) @@ -469,7 +469,7 @@ UIButton组件,提供可点击功能,同时可设置不同状态下样式。 4. 检查label字符间距为5,如下图所示。 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001052942531.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001052942531.png) ## 开发步骤(大小自适应) @@ -500,7 +500,7 @@ UIButton组件,提供可点击功能,同时可设置不同状态下样式。 4. 检查label大小自适应文本内容,如下图所示。 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001052782555.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001052782555.png) ## 开发步骤(省略号模式) @@ -531,7 +531,7 @@ UIButton组件,提供可点击功能,同时可设置不同状态下样式。 4. 检查label DOT模式效果,如下图所示,末尾显示省略号。 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001052662559.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001052662559.png) ## 开发步骤(滚动模式) @@ -563,6 +563,6 @@ UIButton组件,提供可点击功能,同时可设置不同状态下样式。 4. 检查label滚动模式效果,如下图所示。 - ![](/images/zh-cn/device-dev/subsystems/figure/20200721-223604(eSpace).gif) + ![](/images/device-dev/subsystems/figure/20200721-223604(eSpace).gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/05.\345\212\250\347\224\273\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/05.\345\212\250\347\224\273\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/05.\345\212\250\347\224\273\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/05.\345\212\250\347\224\273\345\274\200\345\217\221\346\214\207\345\257\274.md" index d6638161f573d46127979934c4c1e5c54961c4e6..842812279fc6329bffdab77c4b3da454cd26d4fb 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/03.\345\233\276\345\275\242\345\233\276\345\203\217/05.\345\212\250\347\224\273\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/05.\345\233\276\345\275\242\345\233\276\345\203\217/05.\345\212\250\347\224\273\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 动画开发指导 -permalink: /pages/00040204 +permalink: /pages/00040404 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 动画开发指导 @@ -198,6 +198,6 @@ UI动画通过task处理机制每个tick调用一下用户设置的callback函 4. 点击下图下方的按钮,检查对应的动画运行效果。 **图 1** 动画实现效果图 - ![](/images/zh-cn/device-dev/subsystems/figure/动画实现效果图.gif "动画实现效果图") + ![](/images/device-dev/subsystems/figure/动画实现效果图.gif "动画实现效果图") diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/01.\347\233\270\346\234\272\345\274\200\345\217\221\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/01.\347\233\270\346\234\272\345\274\200\345\217\221\346\246\202\350\277\260.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/01.\347\233\270\346\234\272\345\274\200\345\217\221\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/01.\347\233\270\346\234\272\345\274\200\345\217\221\346\246\202\350\277\260.md" index 1f1e4da1639e5b42bdd644e1beb0bc53dbd553d5..2975c5ffe1adaee228bda06a27153cdc4abc203e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/01.\347\233\270\346\234\272\345\274\200\345\217\221\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/01.\347\233\270\346\234\272\345\274\200\345\217\221\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 相机开发概述 -permalink: /pages/00040300 +permalink: /pages/0004050000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 相机开发概述 @@ -103,7 +103,7 @@ date: 2021-12-30 12:57:44 类似的,用户也可以自行创建Surface传递给Camera实例,并实现消费者逻辑(例如通过网络传输视频流,或是将拍照的帧数据保存成图片文件)。 - 图形图像模块也通过Surface从Camera获取流资源,具体步骤详见[图形图像开发指导](/pages/00040200)。 + 图形图像模块也通过Surface从Camera获取流资源,具体步骤详见[图形图像开发指导](/pages/00040400)。 - 相机运行流程 1. Camera创建流程 @@ -113,7 +113,7 @@ date: 2021-12-30 12:57:44 **图 1** Camera创建时序图 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001054101094.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001054101094.png) 1. Camera录像/预览流程 @@ -122,7 +122,7 @@ date: 2021-12-30 12:57:44 **图 2** Camera录像/预览时序图 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001054421113.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001054421113.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 85% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" index baeadc5a015f7ceaa77bea9d619d251b7b676c85..18fd756f0dd0b4565b397188301da83908c64ac2 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 拍照开发指导 -permalink: /pages/00040301 +permalink: /pages/0004050001 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 拍照开发指导 @@ -70,6 +70,13 @@ date: 2021-12-30 12:57:44

创建camera实例

+

CameraKit

+ +

const CameraInfo *GetCameraInfo(std::string cameraId);

+ +

创建cameraInfo实例

+ +

Camera

string GetCameraId()

@@ -154,6 +161,20 @@ date: 2021-12-30 12:57:44

获取支持的参数范围

+

CameraAbility

+ +

std::list<int32_t> GetSupportedAfModes() const;

+ +

获取支持的自动对焦模式列表

+ + +

CameraAbility

+ +

std::list<int32_t> GetSupportedAeModes() const;

+ +

获取支持的自动曝光模式列表

+ +

CameraDevice

CameraDeviceCallback()

@@ -259,6 +280,34 @@ date: 2021-12-30 12:57:44

删除surface

+

FrameConfig

+ +

void GetVendorParameter(uint8_t *value, uint32_t len);

+ +

获取自定义参数

+ + +

FrameConfig

+ +

void SetVendorParameter(uint8_t *value, uint32_t len);

+ +

设置自定义参数

+ + +

CameraInfo

+ +

int32_t GetCameraType() const;

+ +

获取相机类型

+ + +

CameraInfo

+ +

int32_t GetCameraFacingType() const;

+ +

获取相机朝向

+ + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" index e6fdf5be38d9a4bed81055d4d25c33895e78c2a1..c8c83eb23aa922a8635db15940335a37a2f2cfc2 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 录像开发指导 -permalink: /pages/00040302 +permalink: /pages/0004050002 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 录像开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/04.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/04.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/04.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/04.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" index 55f24783c099c4511f2f25d0a83b800aacebf22d..aa6c7325db8efc677b15f592580fce3aaf9892db 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/04.\347\233\270\346\234\272/04.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/01.\347\233\270\346\234\272/04.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 预览开发指导 -permalink: /pages/00040303 +permalink: /pages/0004050003 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 预览开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/05.\351\237\263\350\247\206\351\242\221/01.\351\237\263\350\247\206\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/02.\351\237\263\350\247\206\351\242\221/01.\351\237\263\350\247\206\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" similarity index 91% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/05.\351\237\263\350\247\206\351\242\221/01.\351\237\263\350\247\206\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/02.\351\237\263\350\247\206\351\242\221/01.\351\237\263\350\247\206\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" index f8c61563e6ef34eb9813074ab171cd11cce21414..6c8388533ba575de14cf5316f50e5b4d7961411b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/05.\351\237\263\350\247\206\351\242\221/01.\351\237\263\350\247\206\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/02.\351\237\263\350\247\206\351\242\221/01.\351\237\263\350\247\206\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 音视频开发概述 -permalink: /pages/00040400 +permalink: /pages/0004050100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 音视频开发概述 @@ -64,7 +64,7 @@ OpenHarmony音视频编解码能力取决于具体设备类型,以当前已支

Hi3516

-
  • 音频解码:支持MPEG-4 AAC Profile (AAC LC)格式解码,支持单/双声道,支持MPEG-4(.mp4,.m4a)容器格式。
  • 视频解码:支持H.265 HEVC/H.264 AVC格式解码(限自身编码码流),支持MPEG-4(.mp4)容器格式。
+
  • 音频解码:支持MPEG-4 AAC Profile (AAC LC)、MPEG Audio Layer 3 (MP3)格式解码,支持单/双声道,支持MPEG-4(.mp4,.m4a)、MP3(.mp3)容器格式。
  • 视频解码:支持H.265 HEVC/H.264 AVC格式解码(限自身编码码流),支持MPEG-4(.mp4)容器格式。
  • 音频编码:支持音频AAC_LC编码,支持单/双声道,支持MPEG-4(.mp4)容器格式。
  • 视频编码:支持视频H.264/H.265编码,支持MPEG-4(.mp4)容器格式。
@@ -73,7 +73,7 @@ OpenHarmony音视频编解码能力取决于具体设备类型,以当前已支

Hi3518

-
  • 音频解码:支持MPEG-4 AAC Profile (AAC LC)格式解码,支持单/双声道,支持MPEG-4(.mp4,.m4a)容器格式。
  • 视频解码:-
+
  • 音频解码:支持MPEG-4 AAC Profile (AAC LC)、MPEG Audio Layer 3 (MP3)格式解码,支持单/双声道,支持MPEG-4(.mp4,.m4a)、MP3(.mp3)容器格式。
  • 视频解码:-
  • 音频编码:支持音频AAC_LC编码,支持单/双声道,支持MPEG-4(.mp4)容器格式。
  • 视频编码:支持视频H.264/H.265编码,支持MPEG-4(.mp4)容器格式。
diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/05.\351\237\263\350\247\206\351\242\221/02.\351\237\263\350\247\206\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/02.\351\237\263\350\247\206\351\242\221/02.\351\237\263\350\247\206\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/05.\351\237\263\350\247\206\351\242\221/02.\351\237\263\350\247\206\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/02.\351\237\263\350\247\206\351\242\221/02.\351\237\263\350\247\206\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" index 0d807cd7dd03b953a43027d30c099aef8a12dd47..4633242fa952211d0189df14101509c1628b7e55 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/05.\351\237\263\350\247\206\351\242\221/02.\351\237\263\350\247\206\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/02.\351\237\263\350\247\206\351\242\221/02.\351\237\263\350\247\206\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 音视频播放开发指导 -permalink: /pages/00040401 +permalink: /pages/0004050101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 音视频播放开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/05.\351\237\263\350\247\206\351\242\221/03.\351\237\263\350\247\206\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/02.\351\237\263\350\247\206\351\242\221/03.\351\237\263\350\247\206\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/05.\351\237\263\350\247\206\351\242\221/03.\351\237\263\350\247\206\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/02.\351\237\263\350\247\206\351\242\221/03.\351\237\263\350\247\206\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" index 1fd680bbf7957c8660226c64b9d68cc9001fc43d..ae1807add9a4639d96a98aeec4a4d9461af2054e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/05.\351\237\263\350\247\206\351\242\221/03.\351\237\263\350\247\206\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/06.\345\252\222\344\275\223/02.\351\237\263\350\247\206\351\242\221/03.\351\237\263\350\247\206\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 音视频录制开发指导 -permalink: /pages/00040402 +permalink: /pages/0004050102 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 音视频录制开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/06.\345\205\254\345\205\261\345\237\272\347\241\200/01.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/07.\345\205\254\345\205\261\345\237\272\347\241\200/01.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\346\246\202\350\277\260.md" similarity index 91% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/06.\345\205\254\345\205\261\345\237\272\347\241\200/01.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/07.\345\205\254\345\205\261\345\237\272\347\241\200/01.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\346\246\202\350\277\260.md" index 1ec597b303b5863b84333ca5984e1661732801aa..bdb1435c3882333006335fb276f5654cd3b92e71 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/06.\345\205\254\345\205\261\345\237\272\347\241\200/01.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/07.\345\205\254\345\205\261\345\237\272\347\241\200/01.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 公共基础库概述 -permalink: /pages/00040500 +permalink: /pages/00040600 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 公共基础库概述 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/06.\345\205\254\345\205\261\345\237\272\347\241\200/02.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/07.\345\205\254\345\205\261\345\237\272\347\241\200/02.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/06.\345\205\254\345\205\261\345\237\272\347\241\200/02.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/07.\345\205\254\345\205\261\345\237\272\347\241\200/02.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\274\200\345\217\221\346\214\207\345\257\274.md" index b3858fe3703206528e3639f39ed70c28c4dd1a15..1b0195245ce5f23b5431a017ef7b84d5e7d59b06 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/06.\345\205\254\345\205\261\345\237\272\347\241\200/02.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/07.\345\205\254\345\205\261\345\237\272\347\241\200/02.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 公共基础库开发指导 -permalink: /pages/00040501 +permalink: /pages/00040601 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 公共基础库开发指导 @@ -254,7 +254,7 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); - 按照如下目录结构存放文件,res/drawable下面放置资源文件: - ![](/images/zh-cn/device-dev/subsystems/figure/unnaming.png) + ![](/images/device-dev/subsystems/figure/unnaming.png) - 将上述文件打包生成zip包,修改后缀为.hap,例如Launcher.hap @@ -280,7 +280,7 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); ``` **图 1** LiteOS-M平台dump系统属性输出 - ![](/images/zh-cn/device-dev/subsystems/figure/LiteOS-M平台dump系统属性输出.png "LiteOS-M平台dump系统属性输出") + ![](/images/device-dev/subsystems/figure/LiteOS-M平台dump系统属性输出.png "LiteOS-M平台dump系统属性输出") ### Dump系统属性在LiteOS-A内核平台使用指南: @@ -304,6 +304,6 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); ``` **图 2** LiteOS-A平台dump系统属性输出 - ![](/images/zh-cn/device-dev/subsystems/figure/LiteOS-A平台dump系统属性输出.png "LiteOS-A平台dump系统属性输出") + ![](/images/device-dev/subsystems/figure/LiteOS-A平台dump系统属性输出.png "LiteOS-A平台dump系统属性输出") diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/06.\345\205\254\345\205\261\345\237\272\347\241\200/03.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/07.\345\205\254\345\205\261\345\237\272\347\241\200/03.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\270\270\350\247\201\351\227\256\351\242\230.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/06.\345\205\254\345\205\261\345\237\272\347\241\200/03.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\270\270\350\247\201\351\227\256\351\242\230.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/07.\345\205\254\345\205\261\345\237\272\347\241\200/03.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\270\270\350\247\201\351\227\256\351\242\230.md" index 3b919cac0505e1f8ddb725b9557ba66e227703b3..5dc891aab6cd84be6c140d66f0d86ca439a403e7 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/06.\345\205\254\345\205\261\345\237\272\347\241\200/03.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\270\270\350\247\201\351\227\256\351\242\230.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/07.\345\205\254\345\205\261\345\237\272\347\241\200/03.\345\205\254\345\205\261\345\237\272\347\241\200\345\272\223\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -1,6 +1,6 @@ --- title: 公共基础库常见问题 -permalink: /pages/00040502 +permalink: /pages/00040602 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 公共基础库常见问题 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/01.AI\345\274\225\346\223\216\346\241\206\346\236\266\345\274\200\345\217\221\346\214\207\345\215\227.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/01.\346\246\202\350\277\260.md" similarity index 86% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/01.AI\345\274\225\346\223\216\346\241\206\346\236\266\345\274\200\345\217\221\346\214\207\345\215\227.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/01.\346\246\202\350\277\260.md" index 24fe07e6d3a0958bd0255e3412567b900dce4205..8c19ee61dd5a89282c6f39e51c3b419011ec0744 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/01.AI\345\274\225\346\223\216\346\241\206\346\236\266\345\274\200\345\217\221\346\214\207\345\215\227.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/01.\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- -title: AI引擎框架开发指南 -permalink: /pages/00040600 +title: 概述 +permalink: /pages/00040700 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # AI引擎框架开发指南 @@ -18,5 +18,5 @@ AI业务子系统是OpenHarmony提供原生的分布式AI能力的子系统。AI **图 1** AI引擎框架 -![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001077727032.png) +![](/images/device-dev/subsystems/figure/zh-cn_image_0000001077727032.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" similarity index 71% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" index 06ef0013ac26438091d5932f5fd9e4480d141682..ab19bd830c515f4fe9be88f213b44d742344eca4 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" @@ -1,6 +1,6 @@ --- title: 搭建环境 -permalink: /pages/00040601 +permalink: /pages/00040701 navbar: true sidebar: true prev: true @@ -9,10 +9,10 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 搭建环境 1. 准备开发板:Hi3516DV300,Hi3518EV300 -2. [下载源码](/pages/extra/dade07/) +2. [下载源码](/pages/000102) diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/01.\344\273\243\347\240\201\347\256\241\347\220\206\350\247\204\350\214\203.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/01.\344\273\243\347\240\201\347\256\241\347\220\206\350\247\204\350\214\203.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/01.\344\273\243\347\240\201\347\256\241\347\220\206\350\247\204\350\214\203.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/01.\344\273\243\347\240\201\347\256\241\347\220\206\350\247\204\350\214\203.md" index 37b4dc622a4db0eeb406a31fb889bd2282f7b64d..28e4899f6b3cb5e5b319d82219239c0126214ef3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/01.\344\273\243\347\240\201\347\256\241\347\220\206\350\247\204\350\214\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/01.\344\273\243\347\240\201\347\256\241\347\220\206\350\247\204\350\214\203.md" @@ -1,6 +1,6 @@ --- title: 代码管理规范 -permalink: /pages/0004060200 +permalink: /pages/0004070200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 代码管理规范 @@ -24,7 +24,7 @@ AI引擎框架各模块之间的代码依赖关系如下[图1](#fig171811112818) **图 1** ****AI引擎代码依赖关系 -![](/images/zh-cn/device-dev/subsystems/figure/插件依赖-(2).jpg) +![](/images/device-dev/subsystems/figure/插件依赖-(2).jpg) ## 建议:插件与北向SDK在AI引擎指定的路径下进行代码开发 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/02.\345\221\275\345\220\215\350\247\204\350\214\203.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/02.\345\221\275\345\220\215\350\247\204\350\214\203.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/02.\345\221\275\345\220\215\350\247\204\350\214\203.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/02.\345\221\275\345\220\215\350\247\204\350\214\203.md" index 1344c2792a946fabfc5384b0ad6dfd692ff7496d..2b0a1ec005fe0dd3d1b750e6199de1418ff49e13 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/02.\345\221\275\345\220\215\350\247\204\350\214\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/02.\345\221\275\345\220\215\350\247\204\350\214\203.md" @@ -1,6 +1,6 @@ --- title: 命名规范 -permalink: /pages/0004060201 +permalink: /pages/0004070201 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 命名规范 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/03.\346\216\245\345\217\243\345\274\200\345\217\221\350\247\204\350\214\203.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/03.\346\216\245\345\217\243\345\274\200\345\217\221\350\247\204\350\214\203.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/03.\346\216\245\345\217\243\345\274\200\345\217\221\350\247\204\350\214\203.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/03.\346\216\245\345\217\243\345\274\200\345\217\221\350\247\204\350\214\203.md" index c25992fbd85acd818ebcd4e857b4e45410d417f1..775289a2ee930539083f3b9b4b14c2a8dcca7284 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/03.\346\216\245\345\217\243\345\274\200\345\217\221\350\247\204\350\214\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/03.\346\212\200\346\234\257\350\247\204\350\214\203/03.\346\216\245\345\217\243\345\274\200\345\217\221\350\247\204\350\214\203.md" @@ -1,6 +1,6 @@ --- title: 接口开发规范 -permalink: /pages/0004060202 +permalink: /pages/0004070202 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 接口开发规范 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/01.SDK\345\274\200\345\217\221\350\277\207\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/01.SDK\345\274\200\345\217\221\350\277\207\347\250\213.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/01.SDK\345\274\200\345\217\221\350\277\207\347\250\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/01.SDK\345\274\200\345\217\221\350\277\207\347\250\213.md" index 2fe4d9b6c0d5d1130ddd7a45da0b2f4a49a7f52f..34cb21db76f64c535f4b62d810fa91ef93b4a0bd 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/01.SDK\345\274\200\345\217\221\350\277\207\347\250\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/01.SDK\345\274\200\345\217\221\350\277\207\347\250\213.md" @@ -1,6 +1,6 @@ --- title: SDK开发过程 -permalink: /pages/0004060300 +permalink: /pages/0004070300 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # SDK开发过程 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/02.\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/02.\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/02.\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/02.\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" index f30e34c92c5c7038d39ade5037332c70405d4ed1..3da61d04d001e0742fceefa8520d7a2601ec8d72 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/02.\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/02.\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" @@ -1,6 +1,6 @@ --- title: 插件的开发过程 -permalink: /pages/0004060301 +permalink: /pages/0004070301 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 插件的开发过程 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/03.\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/03.\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/03.\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/03.\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" index 8b60f7b8429354b265a6d90c50c0d083e8cef01e..a76f8c5013ee3f9a679e18458292524535360bf2 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/03.\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/04.\345\274\200\345\217\221\346\214\207\345\257\274/03.\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\350\277\207\347\250\213.md" @@ -1,6 +1,6 @@ --- title: 配置文件的开发过程 -permalink: /pages/0004060302 +permalink: /pages/0004070302 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 配置文件的开发过程 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/01.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253SDK\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/01.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253SDK\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/01.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253SDK\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/01.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253SDK\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" index 6bbe8758ca51244c99427ffaf31e98d4b4960777..2586c761f8ca09c0ed6c54fcb57e9deea4d011d5 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/01.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253SDK\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/01.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253SDK\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" @@ -1,6 +1,6 @@ --- title: 唤醒词识别SDK的开发示例 -permalink: /pages/0004060400 +permalink: /pages/0004070400 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 唤醒词识别SDK的开发示例 @@ -88,7 +88,7 @@ date: 2021-12-30 12:57:44 上述代码为API接口的具体实现,从上述示例的代码中,SDK中create接口的具体实现即为下述示例代码中create方法,该方法调用了AI引擎框架client端开放接口AieClientInit,AieClientPrepare,从而实现与server端建立连接及加载算法模型的能力。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >SDK调用AI引擎client端接口顺序应遵循AieClientInit-\>AieClientPrepare-\>AieClientSyncProcess/AieClientAsyncProcess-\>AieClientRelease-\>AieClientDestroy,否则调用接口会返回错误码。 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/02.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/02.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/02.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/02.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" index 7eeac0b5cfffafce210d6e74c433cbb9d09a3dc9..382578248fa0790fe614a7450d4c59c2e61135c0 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/02.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/02.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\346\217\222\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" @@ -1,6 +1,6 @@ --- title: 唤醒词识别插件的开发示例 -permalink: /pages/0004060401 +permalink: /pages/0004070401 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 唤醒词识别插件的开发示例 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/03.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/03.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/03.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/03.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" index 2b8b69ba8e7a893f2bc725d797aa28ebaaf7fcac..791ffcf0c26263aa2e83c3f70095741322f764f3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/07.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/03.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/08.AI\346\241\206\346\236\266/05.\345\274\200\345\217\221\347\244\272\344\276\213/03.\345\224\244\351\206\222\350\257\215\350\257\206\345\210\253\351\205\215\347\275\256\346\226\207\344\273\266\347\232\204\345\274\200\345\217\221\347\244\272\344\276\213.md" @@ -1,6 +1,6 @@ --- title: 唤醒词识别配置文件的开发示例 -permalink: /pages/0004060402 +permalink: /pages/0004070402 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 唤醒词识别配置文件的开发示例 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/08.Sensor\346\234\215\345\212\241/01.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/09.Sensor\346\234\215\345\212\241/01.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\346\246\202\350\277\260.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/08.Sensor\346\234\215\345\212\241/01.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/09.Sensor\346\234\215\345\212\241/01.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\346\246\202\350\277\260.md" index 1d54d78548320eefa464c467eb6d837d18b4ee7e..a054904b367a39aac8e20a1b2cc9d406886d17f5 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/08.Sensor\346\234\215\345\212\241/01.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/09.Sensor\346\234\215\345\212\241/01.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: Sensor服务子系概述 -permalink: /pages/00040700 +permalink: /pages/00040800 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # Sensor服务子系概述 @@ -22,7 +22,7 @@ Sensor服务子系统提供了轻量级传感器服务基础框架,您可以 **图1** Sensor服务框架图 -![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001077724150.png) +![](/images/device-dev/subsystems/figure/zh-cn_image_0000001077724150.png) - Sensor API:提供传感器的基础API,主要包含查询传感器的列表、订阅/取消传感器数据、执行控制命令等,简化应用开发。 - Sensor Framework:主要实现传感器的订阅管理、数据通道的创建、销毁等,实现与传感器服务层的通信。 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/08.Sensor\346\234\215\345\212\241/02.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/09.Sensor\346\234\215\345\212\241/02.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\346\214\207\345\257\274.md" similarity index 87% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/08.Sensor\346\234\215\345\212\241/02.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/09.Sensor\346\234\215\345\212\241/02.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\346\214\207\345\257\274.md" index 605ad07343826cd0f29449f21463779a973b4147..c0724984548ee4eaf331353b13b58107895c4617 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/08.Sensor\346\234\215\345\212\241/02.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/09.Sensor\346\234\215\345\212\241/02.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: Sensor服务子系使用指导 -permalink: /pages/00040701 +permalink: /pages/00040801 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # Sensor服务子系使用指导 @@ -38,7 +38,7 @@ void SensorDataCallbackImpl(SensorEvent *event) } ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >回调函数的格式为RecordSensorCallback类型。 1. 获取设备支持sensor列表 @@ -68,7 +68,7 @@ int32_t ret = ActivateSensor(0, &sensorUser); int32_t ret = SubscribeSensor(0, &sensorUser); ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >到这步就可以在实现的回调方法中获取到传感器数据。 1. 取消传感器数据订阅 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/08.Sensor\346\234\215\345\212\241/03.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\345\256\236\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/09.Sensor\346\234\215\345\212\241/03.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\345\256\236\344\276\213.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/08.Sensor\346\234\215\345\212\241/03.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\345\256\236\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/09.Sensor\346\234\215\345\212\241/03.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\345\256\236\344\276\213.md" index 05786a87c29f4eb21cf11f4598d0d9197a20cb44..252b3fe23855bbb495bb17a61eaeef9b9b2cc78a 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/08.Sensor\346\234\215\345\212\241/03.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\345\256\236\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/09.Sensor\346\234\215\345\212\241/03.Sensor\346\234\215\345\212\241\345\255\220\347\263\273\344\275\277\347\224\250\345\256\236\344\276\213.md" @@ -1,6 +1,6 @@ --- title: Sensor服务子系使用实例 -permalink: /pages/00040702 +permalink: /pages/00040802 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # Sensor服务子系使用实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/01.\346\246\202\350\277\260.md" similarity index 92% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/01.\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/01.\346\246\202\350\277\260.md" index 282cae56170681fbeec0fd6a38a5a89144586a88..b8bfcd6d594ed1f6715472e2f5e6a66c0bc87ea9 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/01.\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/01.\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 概述 -permalink: /pages/00040800 +permalink: /pages/00040900 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 概述 @@ -30,7 +30,7 @@ date: 2021-12-30 12:57:44 Ability子系统是管理OpenHarmony应用运行状态的开发框架。 **图 1** Ability子系统框架图 -![](/images/zh-cn/device-dev/subsystems/figure/Ability子系统框架图.png "Ability子系统框架图") +![](/images/device-dev/subsystems/figure/Ability子系统框架图.png "Ability子系统框架图") - **Ability**:系统调度应用的最小单元,是能够完成一个独立功能的组件,一个应用可以包含一个或多个Ability。Ability分为两种类型:Page类型的Ability和Service类型的Ability。 - **Page类型的Ability**:带有界面,为用户提供人机交互的能力。 @@ -42,14 +42,14 @@ Ability子系统是管理OpenHarmony应用运行状态的开发框架。 - **AbilitySlice**:单个页面及其控制逻辑的总和,是Page类型Ability特有的组件,一个Page类型的Ability可以包含多个AbilitySlice,此时,这些页面提供的业务能力应当是高度相关的。 **图 2** Ability与AbilitySlice的关系图 - ![](/images/zh-cn/device-dev/subsystems/figure/Ability与AbilitySlice的关系图.png "Ability与AbilitySlice的关系图") + ![](/images/device-dev/subsystems/figure/Ability与AbilitySlice的关系图.png "Ability与AbilitySlice的关系图") - **生命周期**:Ability被调度到启动、激活、隐藏和退出等各个状态的统称。 **图 3** Ability生命周期流转 - ![](/images/zh-cn/device-dev/subsystems/figure/图片1.png) + ![](/images/device-dev/subsystems/figure/图片1.png) - **OnStart\(\)** @@ -100,7 +100,7 @@ Ability子系统是管理OpenHarmony应用运行状态的开发框架。 包管理子系统是OpenHarmony为开发者提供的安装包管理框架。 **图 4** 包管理子系统框架图 -![](/images/zh-cn/device-dev/subsystems/figure/包管理子系统框架图.png "包管理子系统框架图") +![](/images/device-dev/subsystems/figure/包管理子系统框架图.png "包管理子系统框架图") - **BundleKit**:是包管理服务对外提供的接口,有安装/卸载接口、包信息查询接口、包状态变化listen接口。 - **包扫描器**:用来解析本地预制或者安装的安装包,提取里面的各种信息,供管理子模块进行管理,持久化。 @@ -116,12 +116,12 @@ Ability子系统是管理OpenHarmony应用运行状态的开发框架。 Ability子系统的核心模块是Ability管理服务、包管理子系统的核心模块是包管理服务,这两个服务是系统级服务,借助系统服务框架Samgr实现服务的注册与发现,并对其他进程提供Ability管理服务和包管理服务。Ability管理服务和包管理服务通过AbilityKit和BundleKit以接口的形式向外提供服务。 **图 5** Ability管理服务和包管理服务启动 -![](/images/zh-cn/device-dev/subsystems/figure/Ability管理服务和包管理服务启动.png "Ability管理服务和包管理服务启动") +![](/images/device-dev/subsystems/figure/Ability管理服务和包管理服务启动.png "Ability管理服务和包管理服务启动") Ability管理服务和包管理服务启动后,就可以安装OpenHarmony应用和启动运行OpenHarmony应用。 **图 6** 应用启动流程 -![](/images/zh-cn/device-dev/subsystems/figure/应用启动流程.png "应用启动流程") +![](/images/device-dev/subsystems/figure/应用启动流程.png "应用启动流程") 桌面为Ability管理服务启动的第一个OpenHarmony应用。桌面启动后,用户可以在桌面上点击安装的OpenHarmony应用并启动该应用。上图6为从桌面启动一个已安装应用的交互流程。 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" similarity index 45% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" index 55e8a1e6fb81f67527e331cff5e09659fdfce56a..d4f01416899602773d4ee860473a8c784fe461b1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/02.\346\220\255\345\273\272\347\216\257\345\242\203.md" @@ -1,6 +1,6 @@ --- title: 搭建环境 -permalink: /pages/00040801 +permalink: /pages/00040901 navbar: true sidebar: true prev: true @@ -9,12 +9,12 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 搭建环境 - 开发板:Hi3516DV300 -- [下载源码](/pages/extra/dade07/) -- [编译用户程序框架](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E7%94%A8%E6%88%B7%E7%A8%8B%E5%BA%8F%E6%A1%86%E6%9E%B6%E5%AD%90%E7%B3%BB%E7%BB%9F.md) +- [下载源码](/pages/000102) +- [编译用户程序框架](/pages/00000118) diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/03.\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/03.\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/03.\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/03.\345\274\200\345\217\221\346\214\207\345\257\274.md" index 1735237c827f580d0f4eadcf94d59f774d78280c..d531d91f89fa1cc2248d2989d6b9439c40b3b439 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/03.\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/03.\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 开发指导 -permalink: /pages/00040802 +permalink: /pages/00040902 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 开发指导 @@ -704,15 +704,15 @@ date: 2021-12-30 12:57:44 - 打包示例 - 开发视图 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001062942690.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001062942690.png) - 编译视图 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001062334618.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001062334618.png) - 使用打包工具执行以下命令打包: - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001062476933.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001062476933.png) ``` $ java -jar hmos_app_packing_tool.jar --mode hap --json-path ./config.json --assets-path ./assets/ --ability-so-path ./libentry.so --index-path ./resources.index --out-path out/entry.hap --force true diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/04.\345\274\200\345\217\221\345\256\236\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/04.\345\274\200\345\217\221\345\256\236\344\276\213.md" similarity index 86% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/04.\345\274\200\345\217\221\345\256\236\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/04.\345\274\200\345\217\221\345\256\236\344\276\213.md" index db8d830624c268322e9fcdad44dc4a82613d0102..a653f7d726e11fd203db3e14c332e31c9e8fe8bf 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/09.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/04.\345\274\200\345\217\221\345\256\236\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/10.\347\224\250\346\210\267\347\250\213\345\272\217\346\241\206\346\236\266/04.\345\274\200\345\217\221\345\256\236\344\276\213.md" @@ -1,6 +1,6 @@ --- title: 开发实例 -permalink: /pages/00040803 +permalink: /pages/00040903 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 开发实例 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/10.OTA\345\215\207\347\272\247.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/11.OTA\345\215\207\347\272\247.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/10.OTA\345\215\207\347\272\247.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/11.OTA\345\215\207\347\272\247.md" index 3f8d928177bfcff6163770ae989cf3cbf14240c6..7ef05c4084ba4654c6d01aeebd6b95c9f0458f17 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/10.OTA\345\215\207\347\272\247.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/11.OTA\345\215\207\347\272\247.md" @@ -1,6 +1,6 @@ --- title: OTA升级 -permalink: /pages/000409 +permalink: /pages/00040a navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # OTA升级 @@ -48,7 +48,7 @@ OTA(Over the Air)提供对设备远程升级的能力,可以让您的设 **图 1** 生成公私钥对 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001060200050.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001060200050.png) 4. 用public\_arr.txt里面的全部内容替换OTA模块base\\update\\ota\_lite\\frameworks\\source\\verify\\hota\_verify.c中的g\_pubKeyBuf 。 @@ -100,7 +100,7 @@ OTA(Over the Air)提供对设备远程升级的能力,可以让您的设 **图 2** 原始镜像归放位置 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001061889268.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001061889268.png) **表 1** 升级包内的文件 @@ -179,7 +179,7 @@ OTA(Over the Air)提供对设备远程升级的能力,可以让您的设 **图 3** 升级包制作工具 - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001059334449.png) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001059334449.png) ## 上传升级包 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/12.\347\224\265\350\257\235\346\234\215\345\212\241/01.\347\224\265\350\257\235\346\234\215\345\212\241\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/12.\347\224\265\350\257\235\346\234\215\345\212\241/01.\347\224\265\350\257\235\346\234\215\345\212\241\346\246\202\350\277\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..83b5071bc5ffdb77174d60364357b439f02afc1a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/12.\347\224\265\350\257\235\346\234\215\345\212\241/01.\347\224\265\350\257\235\346\234\215\345\212\241\346\246\202\350\277\260.md" @@ -0,0 +1,55 @@ +--- +title: 电话服务概述 +permalink: /pages/00040b00 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:32 +--- +# 电话服务概述 + +- [概述](#section184mcpsimp) +- [基本概念](#section187mcpsimp) +- [运作机制](#section194mcpsimp) +- [约束与限制](#section205mcpsimp) + +## 概述 + +本指南简要介绍了Modem厂商库的集成、初始化、业务请求响应和事件上报的方法,并通过通话业务的具体开发实例呈现厂商库的适配开发过程,供不同Modem芯片的开发者参考,从而帮助其高效地实现电话相关业务功能的开发。 + +## 基本概念 + +- Telephony Service:电话服务子系统核心服务层。主要功能是初始化RIL管理类、SIM卡和搜网模块;获取RIL Adapter服务,通过注册回调服务,实现与RIL Adapter的通信功能;通过发布订阅,来实现与通话、短信等功能模块之间的通信。 +- RIL Adapter:电话服务子系统RIL适配层。该层主要包括厂商库加载,业务接口实现。用于屏蔽不同Modem厂商的硬件差异,为上层提供统一的接口,通过注册HDF服务与上层接口通信。 +- HDF:硬件驱动框架(Hardware Driver Foundation)。用于提供统一外设访问能力和驱动开发、管理框架。 +- hdc\_std:OpenHarmony设备连接器(OpenHarmony Device Connector)。是OpenHarmony为开发人员提供的用于设备连接调试的命令行工具。 + +## 运作机制 + +**图 1** RIL Adapter模块架构图 + + +![](/images/device-dev/subsystems/figure/ril-adapter模块架构图.png) + +RIL Adapter模块架构如图1所示,内部主要分为hril\_hdf、hril和vendorlib三层。 + +- hril\_hdf:RIL Adapter的唯一入口,主要负责Modem厂商库的加载。其中,modem\_adapter实现了单一固件对不同Modem的适配。 + + 其实现机制为:在加载Modem厂商库之前,从kernel获取Modem的设备型号,根据此型号加载对应的Modem厂商库。 + +- hril:OpenHarmony无线接口层(OpenHarmony Radio Interface Layer)。与Telephony Service交互的接口实现部分,实现了Telephony Service和vendorlib通信的功能,包括SIM卡、搜网、蜂窝数据、蜂窝通话和短彩信等。 +- vendorlib:Modem厂商库文件。不同的Modem厂商根据RIL Adapter提供的标准化接口或ID,进行Modem厂商库的开发(vendorlib由Modem厂商提供)。 + +hril\_hdf执行后,将动态加载vendorlib,vendorlib可以从hril\_hdf中获取处理响应和上报的函数指针,该过程结束后,hril\_hdf才可通过vendorlib与Modem通信。 + +## 约束与限制 + +**规格限制:** + +需要设备厂商至少支持一个Modem,如果不支持任何Modem,无需实现厂商库接口。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/12.\347\224\265\350\257\235\346\234\215\345\212\241/02.\347\224\265\350\257\235\346\234\215\345\212\241\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/12.\347\224\265\350\257\235\346\234\215\345\212\241/02.\347\224\265\350\257\235\346\234\215\345\212\241\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..e2213aeef906c5091998978e5122160ac7f6137b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/12.\347\224\265\350\257\235\346\234\215\345\212\241/02.\347\224\265\350\257\235\346\234\215\345\212\241\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,623 @@ +--- +title: 电话服务开发指导 +permalink: /pages/00040b01 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:32 +--- +# 电话服务开发指导 + +- [Modem厂商库初始化开发指导](#section211mcpsimp) + - [场景介绍](#section213mcpsimp) + - [接口说明](#section811343241215) + - [开发步骤](#section51031144122) + - [调测验证](#section5351151517132) + +- [Modem业务请求及响应开发指导](#section295mcpsimp) + - [场景介绍](#section297mcpsimp) + - [接口说明](#section9503155219134) + - [开发步骤](#section17190412101414) + - [调测验证](#section10207938171413) + +- [Modem事件上报开发指导](#section390mcpsimp) + - [场景介绍](#section401mcpsimp) + - [接口说明](#section191193791518) + - [开发步骤](#section16394112401512) + - [调测验证](#section16999174401516) + - [开发实例](#section33444350167) + +- [Modem厂商库集成指导](#section590mcpsimp) + - [编译设置](#section592mcpsimp) + - [调测验证](#section620mcpsimp) + + +## Modem厂商库初始化开发指导 + +### 场景介绍 + +Modem厂商库初始化是指在厂商库里实现const HRilOps \*RilInitOps\(const struct HRilReport \*reportOps\)函数,在该函数里处理三个重要的功能: + +- 接收RIL Adapter事件回调的函数指针,当Modem有业务事件上报时,调用对应的函数指针,把事件上报给RIL Adapter。 +- 创建读取Modem设备节点的线程,在该线程里会循环地读取Modem上报的事件,并把接收的Modem信息解析为具体业务相关的事件进行上报。 +- 返回业务请求接口的函数指针给RIL Adapter。 + +### 接口说明 + +Modem厂商库初始化接口。 + +**表 1** Modem厂商库初始化接口功能介绍 + + + + + + + + + + +

接口名

+

描述

+

const HRilOps *RilInitOps(const struct HRilReport * reportOps)

+

接口功能:Modem厂商库运行的入口。

+

参数reportOps:RIL Adapter传入的事件回调函数指针。

+

返回值:业务请求接口的函数指针。

+
+ +### 开发步骤 + +1. RilInitOps接口中设置RIL Adapter传入的事件回调函数指针。 + + ``` + // 定义Modem厂商库回调函数指针 + static struct HRilReport g_reportOps = { + OnCallReport, // 通话相关业务回调函数 + OnDataReport, // 蜂窝数据相关业务回调函数 + OnModemReport, // Modem相关业务回调函数 + OnNetworkReport, // 搜网相关业务回调函数 + OnSimReport, // SIM卡相关业务回调函数 + OnSmsReport // 短信相关业务回调函数 + }; + ``` + + +1. 创建主线程g\_reader,开启消息循环。 + + ``` + pthread_attr_t t; + pthread_attr_init(&t); + pthread_attr_setdetachstate(&t, PTHREAD_CREATE_DETACHED); + ret = pthread_create(&g_reader, &t, ReaderLoop, &t); // 创建线程 + ``` + + +1. 在g\_eventListeners线程用open\(\)打开Modem设备节点,并创建g\_reader线程循环读取处理Modem上报的消息。 + + ``` + g_fd = open(g_devicePath, O_RDWR); // 打开设备节点,入参g_devicePath是Modem设备节点 + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + ret = pthread_create(&g_eventListeners, &attr, EventListeners, NULL); + ``` + + +1. 返回业务请求接口的函数指针。 + + ``` + // call模块业务请求接口结构体 + typedef struct { + // 获取呼叫列表 + void (*GetCallList)(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + // 拨打电话 + void (*Dial)(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + // 挂断电话 + void (*Hangup)(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + // 拒接来电 + void (*Reject)(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + // 接听来电 + void (*Answer)(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + } HRilCallReq; + + // call模块回调函数指针 + static const HRilCallReq g_callReqOps = { + .GetCallList = ReqGetCallList, // 获取呼叫列表接口 + .Dial = ReqDial, // 拨打电话接口 + .Hangup = ReqHangup, // 挂断电话接口 + .Reject = ReqReject, // 拒接来电接口 + .Answer = ReqAnswer, // 接听来电接口 + }; + + // 业务请求结构体 + typedef struct { + const HRilCallReq *callOps; // 通话相关业务请求结构体指针 + const HRilSimReq *simOps; // SIM卡相关业务请求结构体指针 + const HRilSmsReq *smsOps; // 短彩信相关业务请求结构体指针 + const HRilDataReq *dataOps; // 蜂窝数据相关业务请求结构体指针 + const HRilNetworkReq *networkOps; // 搜网相关业务请求结构体指针 + const HRilModemReq *modemOps; // Modem相关业务请求结构体指针 + } HRilOps; + + // 业务请求接口定义 + HRilOps g_hrilOps = { + .callOps = &g_callReqOps, // 定义通话业务请求接口 + .simOps = &g_simReqOps, // 定义SIM卡业务请求接口 + .smsOps = &g_smsReqOps, // 定义短彩信业务请求接口 + .networkOps = &g_networkReqOps, // 定义蜂窝数据业务请求接口 + .dataOps = &g_dataReqOps, // 定义搜网业务请求接口 + .modemOps = &g_modemReqOps, // 定义Modem业务请求接口 + }; + ``` + + +### 调测验证 + +1. 用[hdc\_std工具](/pages/00080101#section05992022154916)连接调试设备,把编译生成的libril\_vendor.z.so库文件(参见[Modem厂商库集成指导](#section590mcpsimp))通过以下命令推到/system/lib/目录下。 + + ``` + hdc_std file send libril_vendor.z.so /system/lib/ + ``` + +2. 执行hdc\_std shell sync,hdc\_std shell reboot重启设备。 + + ``` + hdc_std shell sync + hdc_std shell reboot + ``` + +3. 执行hdc\_std shell hilog,根据日志查看函数RilInitOps\(\)是否正确执行完成。如下调测验证日志供参考: + + ``` + 01-01 05:13:23.071 136 2319 D 00000/RilAdapterInit: [RilAdapterDispatch-(hril_hdf.c:55)] sbuf IPC obtain test success! + 01-01 05:13:23.071 136 2319 D 00000/RilAdapterInit: [LoadVendor-(hril_hdf.c:33)] RilInit rilInit start + 01-01 05:13:23.071 136 2319 D 00000/RilAdapterInit: [LoadVendor -(hril_hdf.c:45)] RilInit rilInit completed + ``` + + +## Modem业务请求及响应开发指导 + +### 场景介绍 + +Modem业务请求及响应是指RIL Adapter收到电话服务具体业务请求后,调用Modem厂商库初始化获得的函数指针,把具体业务请求发送给厂商库,厂商库根据业务请求ID做相应的业务处理。 + +### 接口说明 + +Modem业务请求及响应接口。 + +**表 2** Modem业务请求及响应接口功能介绍(以拨号功能模块为例) + + + + + + + + + + + + + +

接口名

+

描述

+

void ReqDial(ReqDataInfo *requestInfo, const void *data, size_t dataLen);

+

接口功能:对拨号请求进行处理。

+

参数requestInfo:请求类型信息。

+

参数data:被叫号码信息。

+

参数dataLen:数据长度。

+

返回值:无。

+

void (*OnCallReport)(struct ReportInfo reportInfo, const void *data, size_t dataLen);

+

接口功能:对通话业务执行结果进行响应,即当请求业务执行完成后,Modem将该请求执行的结果上报给RIL Adapter。

+

参数reportInfo:返回类型信息。

+

参数data:返回数据。

+

参数dataLen:数据长度。

+

返回值:无。

+
+ +### 开发步骤 + +1. 在ReqDial\(\)接口中对拨号请求进行处理。 + + ``` + // 拨号请求接口实现 + void ReqDial(ReqDataInfo *requestInfo, const void *data, size_t dataLen) + { + HRilDial *pDial = NULL; + char cmd[MAX_BUFF_SIZE] = {0}; + const char *clir = NULL; + int ret; + int err = HRIL_ERR_SUCCESS; + struct ReportInfo reportInfo = {}; + ResponseInfo *pResponse = NULL; + if (data == NULL) { + TELEPHONY_LOGE("data is null!!!"); + err = HRIL_ERR_INVALID_PARAMETER; + reportInfo = CreateReportInfo(requestInfo, err, HRIL_RESPONSE, 0); + OnCallReport(reportInfo, NULL, 0); + return; + } + pDial = (HRilDial *)data; + switch (pDial->clir) { + case CALL_CLIR_INVOCATION: + clir = "I"; + break; /* invocation */ + case CALL_CLIR_SUPPRESSION: + clir = "i"; + break; /* suppression */ + case CALL_CLIR_SUBSCRIPTION_DEFUALT: + default: + clir = ""; + break; /* subscription default */ + } + (void)sprintf_s(cmd, MAX_BUFF_SIZE, "ATD%s%s;", pDial->address, clir); + ret = SendCommandLock(cmd, NULL, 0, &pResponse); // 发送AT指令 + ...... + } + ``` + +2. 在Modem执行完拨号命令后,调用OnCallReport\(\)回调函数,把该请求执行的结果上报给RIL Adapter。 + + ``` + ret = SendCommandLock(cmd, NULL, 0, &pResponse); + if (ret != 0 || (pResponse != NULL && pResponse->success == 0)) { + TELEPHONY_LOGE("ATD send failed"); + err = HRIL_ERR_GENERIC_FAILURE; + } + reportInfo = CreateReportInfo(requestInfo, err, HRIL_RESPONSE, 0); + OnCallReport(reportInfo, NULL, 0); // 调用通话相关回调函数 + ``` + + +### 调测验证 + +1. 用[hdc\_std工具](/pages/00080101#section05992022154916)工具连接调试设备,把编译生成的libril\_vendor.z.so库文件通过以下命令推到/system/lib/目录下。 + + ``` + hdc_std file send libril_vendor.z.so /system/lib/ + ``` + +2. 执行hdc\_std shell sync,hdc\_std shell reboot重启设备。 + + ``` + hdc_std shell sync + hdc_std shell reboot + ``` + +3. hdc\_std shell后执行./system/bin/ril\_adapter\_test,输入编号1,根据提示输入电话号码,测试拨打电话功能。 + + ``` + hdc_std shell + # ./system/bin/ril_adapter_test + ----> Test Enter --------->Call--------------------- + + 1----> RilUnitTest::OnRequestCallDialTest + 2----> RilUnitTest:: OnRequestCallHangupTest + 3----> RilUnitTest:: OnRequestCallAnswerTest + 4----> RilUnitTest::OnRequestCallGetCurrentCallsStatusTest + 5----> RilUnitTest::OnRequestRefusedCallTest + + 1 + ``` + +4. 另开一个终端窗口,执行hdc\_std shell hilog,通过日志查看函数ReqDial\(\)是否正确执行完成。如下调测验证日志供参考: + + ``` + 01-01 05:27:27.419 136 408 D 02b01/Rilvendor: [SendCommandLock-(at_support.c:210)] SendCommandLock enter, cmd: ATD17620373527 + 01-01 05:27:27.419 136 408 D 02b01/Rilvendor: [SendCommandLock-(at_support.c:231)] SendCommandLock() command ATD17620373527 + 01-01 05:27:27.419 136 408 D 02b01/Rilvendor: [WriteATCommand-(channel.c:115)] WriteATCommand enter, cmd:ATD17620373527 + 01-01 05:27:27.421 136 187 D 02b01/Rilvendor: [ReadResponse-(channel.c:94)] g_bufferCur : + 01-01 05:27:27.421 136 187 D 02b01/Rilvendor: OK + 01-01 05:27:27.422 136 187 D 02b01/Rilvendor: [ProcessResponse-(at_support.c:144)] processLine line = OK + 01-01 05:27:27.422 136 187 D 02b01/Rilvendor: [ReadResponse-(channel.c:81)] ReadResponse enter + 01-01 05:27:27.422 136 187 D 02b01/Rilvendor: [ProcessLastResponse-(channel.c:37)] last data more than one line , FindEndOfLine g_bufferCur: + 01-01 05:27:27.422 136 187 E 02b01/Rilvendor: [ProcessLastResponse-(channel.c:39)] g_bufferCur endLine is null + 01-01 05:27:27.422 136 187 E 02b01/Rilvendor:^ORIG:1,0 + 01-01 05:27:27.422 136 408 E 02b01/Rilvendor: [SendCommandLock-(at_support.c:234)] processLine line = ^ORIG:1,0 + 01-01 05:27:27.422 136 408 E 02b01/Rilvendor: [SendCommandLock-(vendor_report.c:234)] enter to [^ORIG:1,0]:(null) + 01-01 05:27:27.422 136 408 E 02b01/Rilvendor: [SendCommandLock-(at_support.c:264)] err = 0, cmd:ADT17620373527 + ``` + + +## Modem事件上报开发指导 + +### 场景介绍 + +Modem事件上报是指在厂商库的Modem设备节点读取线程,循环读取到Modem主动上报的消息后,对Modem上报事件进行解析,然后上报给RIL Adapter。 + +### 接口说明 + +Modem事件上报接口。 + +**表 3** Modem事件上报接口功能介绍 + + + + + + + + + + +

接口名

+

描述

+

void OnNotifyOps(const char *s, const char *smsPdu)

+

接口功能:对Modem上报的事件进行分发处理。

+

参数s:AT指令前缀。

+

参数smsPdu:短信PDU信息。

+

返回值:无。

+
+ +### 开发步骤 + +1. 在Modem设备节点读取线程g\_reader里调用OnNotifyOps\(\)解析具体的Modem上报事件,判断命令类型,并调用OnXxxReport\(\)把解析得到的各模块事件上报给hril业务层。 + + ``` + // 将Modem上报数据解析为对应模块的主动上报事件 + void OnNotifyOps(const char *s, const char *smsPdu) + { + int ret = 0; + struct ReportInfo reportInfo = {0}; + reportInfo.error = HRIL_ERR_SUCCESS; + reportInfo.type = HRIL_NOTIFICATION; + if (GetRadioState() == HRIL_RADIO_POWER_STATE_UNAVAILABLE) { + return; + } + TELEPHONY_LOGD("enter to [%{public}s]:%{public}s", s, smsPdu); + // 通过AT指令判断主动上报命令类型 + if (ReportStrWith(s, "+CRING:") || ReportStrWith(s, "RING") || ReportStrWith(s, "IRING") || + ReportStrWith(s, "NO CARRIER") || ReportStrWith(s, "+CCWA") || ReportStrWith(s, "^CCALLSTATE") || + ReportStrWith(s, "^CEND") || ReportStrWith(s, "^CCWA")) { + reportInfo.notifyId = HNOTI_CALL_STATE_UPDATED; + OnCallReport(reportInfo, NULL, 0); + } else if (ReportStrWith(s, "+CMT:")) { + reportInfo.notifyId = HNOTI_SMS_NEW_SMS; + OnSmsReport(reportInfo, (void *)smsPdu, strlen(smsPdu)); + } + // 将各模块事件上报给hril业务层 + ...... + } + ``` + + +1. hril业务层将上报事件分发给Telephony Service。 + + ``` + // 呼叫状态主动上报 + int32_t HRilCall::CallStateUpdated( + int32_t slotId, int32_t notifyType, const HRilErrno e, const void *response, size_t responseLen) + { + struct HdfSBuf *dataSbuf = HdfSBufTypedObtain(SBUF_IPC); + if (serviceCallbackNotify_ == nullptr) { + TELEPHONY_LOGE("RilAdapter serviceCallbackNotify_ is null"); + HdfSBufRecycle(dataSbuf); + return HDF_FAILURE; + } + // 分发处理 + int32_t ret = serviceCallbackNotify_->dispatcher->Dispatch( + serviceCallbackNotify_, HNOTI_CALL_STATE_UPDATED, dataSbuf, nullptr); + if (ret != HDF_SUCCESS) { + HdfSBufRecycle(dataSbuf); + return HDF_FAILURE; + } + HdfSBufRecycle(dataSbuf); + return HDF_SUCCESS; + } + ``` + + +### 调测验证 + +1. 用[hdc\_std工具](/pages/00080101#section05992022154916)工具连接调试设备,把编译生成的libril\_vendor.z.so库文件通过以下命令推到/system/lib/目录下。 + + ``` + hdc_std file send libril_vendor.z.so /system/lib/ + ``` + +2. 执行hdc\_std shell sync,hdc\_std shell reboot重启设备。 + + ``` + hdc_std shell sync + hdc_std shell reboot + ``` + +3. hdc\_std shell后执行./system/bin/ril\_adapter\_test,输入编号1,根据提示输入电话号码,测试拨打电话功能。 + + ``` + hdc_std shell + # ./system/bin/ril_adapter_test + ----> Test Enter --------->Call--------------------- + + 1----> RilUnitTest::OnRequestCallDialTest + 2----> RilUnitTest:: OnRequestCallHangupTest + 3----> RilUnitTest:: OnRequestCallAnswerTest + 4----> RilUnitTest::OnRequestCallGetCurrentCallsStatusTest + 5----> RilUnitTest::OnRequestRefusedCallTest + + 1 + ``` + +4. 另开一个终端窗口,执行hdc\_std shell hilog,通过日志查看函数OnNotifyOps\(\)是否正确执行完成。如下调测验证日志供参考: + + ``` + 01-01 00:08:01.334 546 551 D 02b01/TelRilTest: [DialResponse-(tel_ril_call.cpp:280)] DialResponse --> radioResponseInfo->serial:2, radioResponseInfo->error:0 + 01-01 00:08:01.334 546 557 D 02b01/TelRilTest: [ProcessEvent-(tel_ril_test.cpp:1262)] TelRilTest::DemoHandler::ProcessEvent --> eventId:101 + 01-01 00:08:01.334 143 512 D 02b01/Rilvendor: [ReadResponse-(channel.c:93)] g_bufferCur : + 01-01 00:08:01.334 143 512 D 02b01/Rilvendor: ^ORIG:1,0 + 01-01 00:08:01.334 143 512 D 02b01/Rilvendor: [ReadResponse-(channel.c:108)] AT< ^ORIG:1,0 + 01-01 00:08:01.334 143 512 D 02b01/Rilvendor: [ProcessResponse-(at_support.c:137)] processLine line = ^ORIG:1,0 + 01-01 00:08:01.334 143 512 D 02b01/Rilvendor: [OnNotifyOps-(vendor_report.c:126)] enter to [^ORIG:1,0]:(null) + 01-01 00:08:01.335 143 512 W 02b01/Rilvendor: [OnNotifyOps-(vendor_report.c:167)] enter to is unrecognized command: ^ORIG:1,0 + 01-01 00:08:01.335 143 512 D 02b01/Rilvendor: [ProcessLastResponse-(channel.c:37)] last data more than one line , FindEndOfLine g_bufferCur: + 01-01 00:08:01.335 143 512 E 02b01/Rilvendor: [ProcessLastResponse-(channel.c:39)] g_bufferCur endLine is null + 01-01 00:08:01.336 143 512 D 02b01/Rilvendor: [ReadResponse-(channel.c:93)] g_bufferCur : + 01-01 00:08:01.336 143 512 D 02b01/Rilvendor: ^CCALLSTATE: 1,0,1 + 01-01 00:08:01.336 143 512 D 02b01/Rilvendor: [ReadResponse-(channel.c:108)] AT< ^CCALLSTATE: 1,0,1 + 01-01 00:08:01.336 143 512 D 02b01/Rilvendor: [ProcessResponse-(at_support.c:137)] processLine line = ^CCALLSTATE: 1,0,1 + 01-01 00:08:01.336 143 512 D 02b01/Rilvendor: [OnNotifyOps-(vendor_report.c:126)] enter to [^CCALLSTATE: 1,0,1]:(null) + 01-01 00:08:01.336 546 551 D 02b01/CoreService: [OnRemoteRequest-(tel_ril_manager.cpp:80)] RilManager OnRemoteRequest code:1001 + 01-01 00:08:01.336 546 551 D 02b01/CoreService: [NotifyObserver-(observer_handler.cpp:76)] handler->SendEvent:8 + ``` + + +### 开发实例 + +- **去电开发实例** + + 去电的调用流程示例如下图所示: + + **图 1** 去电调用时序图 + ![](/images/device-dev/subsystems/figure/去电调用时序图.png "去电调用时序图") + + 当应用触发去电动作时,RIL Adapter会接收到拨打电话的请求,hril调用对应的拨打电话的接口ReqDial\(\)。在该接口里会把电话服务传过来的数据封装为对应的AT指令发送到Modem,Modem执行完拨号命令后通过OnCallReport\(\)接口把响应结果上报给RIL Adapter。 + + ``` + // call模块回调函数指针 + static const HRilCallReq g_callReqOps = { + .GetCallList = ReqGetCallList, // 获取呼叫列表接口 + .Dial = ReqDial, // 拨打电话接口 + .Hangup = ReqHangup, // 挂断电话接口 + .Reject = ReqReject, // 拒接来电接口 + .Answer = ReqAnswer, // 接听来电接口 + }; + + // 系统业务请求接口定义 + HRilOps g_hrilOps = { + .callOps = &g_callReqOps, // 定义通话业务请求接口 + .simOps = &g_simReqOps, // 定义SIM卡业务请求接口 + .smsOps = &g_smsReqOps, // 定义短彩信业务请求接口 + .networkOps = &g_networkReqOps, // 定义蜂窝数据业务请求接口 + .dataOps = &g_dataReqOps, // 定义搜网业务请求接口 + .modemOps = &g_modemReqOps, // 定义Modem业务请求接口 + }; + + // 拨号请求接口实现 + void ReqDial(ReqDataInfo *requestInfo, const void *data, size_t dataLen) + { + HRilDial *pDial = NULL; + char cmd[MAX_BUFF_SIZE] = {0}; + const char *clir = NULL; + int ret; + int err = HRIL_ERR_SUCCESS; + struct ReportInfo reportInfo = {}; + ResponseInfo *pResponse = NULL; + if (data == NULL) { + TELEPHONY_LOGE("data is null!!!"); + err = HRIL_ERR_INVALID_PARAMETER; + reportInfo = CreateReportInfo(requestInfo, err, HRIL_RESPONSE, 0); + OnCallReport(reportInfo, NULL, 0); + return; + } + pDial = (HRilDial *)data; + switch (pDial->clir) { + case CALL_CLIR_INVOCATION: + clir = "I"; + break; /* invocation */ + case CALL_CLIR_SUPPRESSION: + clir = "i"; + break; /* suppression */ + case CALL_CLIR_SUBSCRIPTION_DEFUALT: + default: + clir = ""; + break; /* subscription default */ + } + (void)sprintf_s(cmd, MAX_BUFF_SIZE, "ATD%s%s;", pDial->address, clir); + ret = SendCommandLock(cmd, NULL, 0, &pResponse); // 发送AT命令 + if (ret != 0) { + err = HRIL_ERR_CMD_SEND_FAILURE; + TELEPHONY_LOGE("ATD send failed"); + } else { + if (pResponse != NULL && pResponse->success == 0) { + TELEPHONY_LOGE("ReqDial return ERROR"); + err = HRIL_ERR_CMD_NO_CARRIER; + } + } + reportInfo = CreateReportInfo(requestInfo, err, HRIL_RESPONSE, 0); + OnCallReport(reportInfo, NULL, 0); // 调用通话相关业务回调函数 + FreeResponseInfo(pResponse); + } + ``` + + +- **来电开发实例** + + 来电的调用流程示例如下图所示: + + **图 2** 来电调用时序图 + + + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001214727595.png) + + Modem设备节点读取线程g\_reader会循环读取Modem上报的消息,当Modem接收到来电时会主动上报来电相关的信息; + + 当该线程通过调用OnNotifyOps\(\)解析到Modem上报的数据是以"+CRING"、"RING"等字符开头时,表示有来电事件,然后通过OnCallReport\(reportInfo, NULL, 0\)上报给RIL Adapter完成来电事件上报。 + + ``` + // 将Modem上报数据解析为对应模块的主动上报事件 + void OnNotifyOps(const char *s, const char *smsPdu) + { + int ret = 0; + struct ReportInfo reportInfo = {0}; + reportInfo.error = HRIL_ERR_SUCCESS; + reportInfo.type = HRIL_NOTIFICATION; + if (GetRadioState() == HRIL_RADIO_POWER_STATE_UNAVAILABLE) { + return; + } + TELEPHONY_LOGD("enter to [%{public}s]:%{public}s", s, smsPdu); + // 通过AT指令判断主动上报命令类型 + if (ReportStrWith(s, "+CRING:") || ReportStrWith(s, "RING") || ReportStrWith(s, "IRING") || + ReportStrWith(s, "NO CARRIER") || ReportStrWith(s, "+CCWA") || ReportStrWith(s, "^CCALLSTATE") || + ReportStrWith(s, "^CEND") || ReportStrWith(s, "^CCWA")) { + reportInfo.notifyId = HNOTI_CALL_STATE_UPDATED; + OnCallReport(reportInfo, NULL, 0); // 调用通话相关业务回调函数 + } else if (ReportStrWith(s, "+CMT:")) { + reportInfo.notifyId = HNOTI_SMS_NEW_SMS; + OnSmsReport(reportInfo, (void *)smsPdu, strlen(smsPdu)); + } + // add your codes + ...... + } + ``` + + +## Modem厂商库集成指导 + +### 编译设置 + +Modem厂商库可通过BUILD.gn编译为一个动态库,在RIL Adapter启动时用dlopen方式加载到系统中,然后执行厂商库的初始化操作(参见[Modem厂商库初始化开发指导](#section211mcpsimp)),BUILD.gn编写示例如下: + +``` +import("//build/ohos.gni") +RIL_ADAPTER = "//base/telephony" +ohos_shared_library("ril_vendor") { // Modem厂商库名称 + sources = [ // 编译源文件 + "at_call.c", + "at_data.c", + "xxx.c", + ] + include_dirs = [ // 包含的头文件目录 + "$RIL_ADAPTER/ril_adapter/vendor/include", + "$RIL_ADAPTER/ril_adapter/interfaces/innerkits", + "include", + ] + deps = [ // 内部依赖 + "//drivers/adapter/uhdf2/osal:libhdf_utils", + "//base/telephony/core_service/utils:libtelephony_common", + ] + external_deps = [ "hilog:libhilog" ] // 外部依赖 + + part_name = "ril_adapter" // 部件名称 + subsystem_name = "telephony" // 子系统名称 +} +``` + +### 调测验证 + +1. 编译代码。 +2. 查看/out/{device_name}/telephony/ril\_adapter目录是否存在libril\_vendor.z.so,存在证明集成成功。否则检查代码,重新编译验证。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/01.\346\246\202\350\277\260.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/01.\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/01.\346\246\202\350\277\260.md" index 8a02fe521e623af8000778cef544c16a46e2c8ff..0a87b2936a82f1326f98f593e970e52e6edbbe74 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/01.\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/01.\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 概述 -permalink: /pages/00040a00 +permalink: /pages/00040c00 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 概述 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/02.\345\272\224\347\224\250\351\252\214\347\255\276\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/02.\345\272\224\347\224\250\351\252\214\347\255\276\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/02.\345\272\224\347\224\250\351\252\214\347\255\276\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/02.\345\272\224\347\224\250\351\252\214\347\255\276\345\274\200\345\217\221\346\214\207\345\257\274.md" index 176acbc413a48d821dcd28d072608738a87cd5d9..75e9457764a747d035e7cd681fc55ed8882d1cc7 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/02.\345\272\224\347\224\250\351\252\214\347\255\276\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/02.\345\272\224\347\224\250\351\252\214\347\255\276\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 应用验签开发指导 -permalink: /pages/00040a01 +permalink: /pages/00040c01 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 应用验签开发指导 @@ -36,7 +36,7 @@ date: 2021-12-30 12:57:44 **图 1** 经过签名的Hap包结构 -![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001181934155.png) +![](/images/device-dev/subsystems/figure/zh-cn_image_0000001181934155.png) 整个验签流程,主要分为三部分:整包验签、授权文件验签,以及授权文件内容校验。 @@ -105,5 +105,5 @@ date: 2021-12-30 12:57:44 ### 生成OpenHarmony签名应用 -参考文档:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/%E9%85%8D%E7%BD%AEOpenHarmony%E5%BA%94%E7%94%A8%E7%AD%BE%E5%90%8D%E4%BF%A1%E6%81%AF.md +参考文档:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/configuring-openharmony-app-signature.md diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/03.\345\272\224\347\224\250\346\235\203\351\231\220\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/03.\345\272\224\347\224\250\346\235\203\351\231\220\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/03.\345\272\224\347\224\250\346\235\203\351\231\220\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/03.\345\272\224\347\224\250\346\235\203\351\231\220\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" index 8a25806f85dc98edb8fc949f1964fb2ad7c506d4..2905b3ae80be1d2374296e64198ff63d561908af 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/03.\345\272\224\347\224\250\346\235\203\351\231\220\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/03.\345\272\224\347\224\250\346\235\203\351\231\220\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 应用权限管理开发指导 -permalink: /pages/00040a02 +permalink: /pages/00040c02 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 应用权限管理开发指导 @@ -106,7 +106,7 @@ date: 2021-12-30 12:57:44 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >静态权限:应用安装时由系统授予的权限,对应于权限敏感级别的system\_grant >动态权限:应用在运行过程中需要用户授权的权限,对应于权限敏感级别的user\_grant diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/04.IPC\351\200\232\344\277\241\351\211\264\346\235\203\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/04.IPC\351\200\232\344\277\241\351\211\264\346\235\203\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 93% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/04.IPC\351\200\232\344\277\241\351\211\264\346\235\203\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/04.IPC\351\200\232\344\277\241\351\211\264\346\235\203\345\274\200\345\217\221\346\214\207\345\257\274.md" index c93e31e9932e919ba25b25ce52d4003c6ebe6c7d..5634a153fc07f8f1fd3827dd59c51d49d538d8e8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/11.\345\256\211\345\205\250/04.IPC\351\200\232\344\277\241\351\211\264\346\235\203\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/13.\345\256\211\345\205\250/04.IPC\351\200\232\344\277\241\351\211\264\346\235\203\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: IPC通信鉴权开发指导 -permalink: /pages/00040a03 +permalink: /pages/00040c03 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # IPC通信鉴权开发指导 @@ -54,7 +54,7 @@ IPC通信鉴权提供的API,仅供Samgr调用,开发者在开发服务时需 本部分以BMS服务通过IPC通信方式对外开放接口为例,讲解如何通过IPC通信鉴权组件配置对应接口的访问策略。这里BMS在Samgr中注册的service为bundlems,为开放的接口注册的Feature为BmsFeature。 -1. 鸿蒙侧在源码路径下的头文件base/security/permission/services/permission\_lite/ipc\_auth/include/policy\_preset.h中配置相应的访问策略,产品侧独有的在vendor/hisilicon/产品名称/hals/security/permission\_lite/ipc\_auth/include/policy\_preset\_product.h中配置相应的访问策略,配置策略后将头文件中的宏POLICY\_PRODUCT 配置为1;访问策略主要有三种类型: +1. OpenHarmony侧在源码路径下的头文件base/security/permission/services/permission\_lite/ipc\_auth/include/policy\_preset.h中配置相应的访问策略,产品侧独有的在vendor/hisilicon/产品名称/hals/security/permission\_lite/ipc\_auth/include/policy\_preset\_product.h中配置相应的访问策略,配置策略后将头文件中的宏POLICY\_PRODUCT 配置为1;访问策略主要有三种类型: (1)type为RANGE类型:允许某个特定范围UID的进程访问,需要指定uidMin和uidMax; diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/01.\345\220\257\345\212\250\346\201\242\345\244\215\345\255\220\347\263\273\347\273\237\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/01.\345\220\257\345\212\250\346\201\242\345\244\215\345\255\220\347\263\273\347\273\237\346\246\202\350\277\260.md" similarity index 64% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/01.\345\220\257\345\212\250\346\201\242\345\244\215\345\255\220\347\263\273\347\273\237\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/01.\345\220\257\345\212\250\346\201\242\345\244\215\345\255\220\347\263\273\347\273\237\346\246\202\350\277\260.md" index 68e6e2c494d859dbe6734c2b18cf236c279faa7c..d3ad2fc2daf26885094e1377373cfb9b25e4d801 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/01.\345\220\257\345\212\250\346\201\242\345\244\215\345\255\220\347\263\273\347\273\237\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/01.\345\220\257\345\212\250\346\201\242\345\244\215\345\255\220\347\263\273\347\273\237\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: 启动恢复子系统概述 -permalink: /pages/00040b00 +permalink: /pages/00040d00 navbar: true sidebar: true prev: true @@ -9,17 +9,38 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 启动恢复子系统概述 +- [启动恢复子系统上下文](#section167378304212) - [约束与限制](#section2029921310472) -启动恢复子系统负责从内核启动之后到应用启动之前的系统关键服务进程的启动过程以及设备恢复出厂设置的功能。涉及以下组件: +## 启动恢复子系统上下文 + +下图是启动子系统上下文结构图: + +![](/images/device-dev/subsystems/figure/启动子系统上下文.png) + +系统上电加载内核后,按照以下流程完成系统各个服务和应用的启动: + +1. 内核加载init进程,一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。 +2. init进程启动后,会挂载tmpfs,procfs,创建基本的dev设备节点,提供最基本的根文件系统。 +3. init也会启动ueventd监听内核热插拔设备事件,为这些设备创建dev设备节点;包括block设备各个分区设备都是通过此事件创建。 +4. init进程挂载block设备各个分区(system,vendor)后,开始扫描各个系统服务的init启动脚本,并拉起各个SA服务。 +5. samgr是各个SA的服务注册中心,每个SA启动时,都需要向samgr注册,每个SA会分配一个ID,应用可以通过该ID访问SA。 +6. foundation是一个特殊的SA服务进程,提供了用户程序管理框架及基础服务;由该进程负责应用的生命周期管理。 +7. 由于应用都需要加载JS的运行环境,涉及大量准备工作,因此appspawn作为应用的孵化器,在接收到foundation里的应用启动请求时,可以直接孵化出应用进程,减少应用启动时间。 + +启动子系统内部涉及以下组件: - init启动引导组件 - init启动引导组件对应的进程为init进程,是内核完成初始化后启动的第一个用户态进程。init进程启动之后,读取init.cfg配置文件,根据解析结果,执行相应命令(见[第2章表2](/pages/00040b01#table122681439144112)描述)并依次启动各关键系统服务进程,在启动系统服务进程的同时设置其对应权限。 + init启动引导组件对应的进程为init进程,是内核完成初始化后启动的第一个用户态进程。init进程启动之后,读取init.cfg配置文件,根据解析结果,执行相应命令(见[第2章表2](/pages/00040d01#table122681439144112)描述)并依次启动各关键系统服务进程,在启动系统服务进程的同时设置其对应权限。 + +- ueventd启动引导组件 + + ueventd负责监听内核设备驱动插拔的netlink事件,根据事件类型动态管理相应设备的dev节点。 - appspawn应用孵化组件 @@ -71,9 +92,11 @@ date: 2021-12-30 12:57:44 - init启动引导组件: - - 配置文件init.cfg烧写到单板之后变成只读模式,修改时必须重新打包和烧写rootfs镜像。 + - 每个系统服务启动时都需要编写各自的启动脚本文件init.cfg,定义各自的服务名、可执行文件路径、权限和其他信息。 + - 每个系统服务各自安装其启动脚本到/system/etc/init目录下,init进程统一扫码执行。 + +- 新芯片平台移植时,平台相关的初始化配置需要增加平台相关的初始化配置文件/vendor/etc/init/init.\{hardware\}.cfg;该文件完成平台相关的初始化设置,如安装ko驱动,设置平台相关的/proc节点信息。 - 配置文件init.cfg仅支持json格式。 - bootstrap服务启动组件:需要在链接脚本中配置zInit代码段。 -- syspara系统属性组件:SetParameter/GetParameter仅支持uid大于1000的应用调用。 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/02.init\345\220\257\345\212\250\345\274\225\345\257\274\347\273\204\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/02.init\345\220\257\345\212\250\345\274\225\345\257\274\347\273\204\344\273\266.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/02.init\345\220\257\345\212\250\345\274\225\345\257\274\347\273\204\344\273\266.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/02.init\345\220\257\345\212\250\345\274\225\345\257\274\347\273\204\344\273\266.md" index 7b61723bbfe4c81ba8224ecfafbab7a5a778fc2d..f684198962476147ed3360cf64fdef8e2375e9b6 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/02.init\345\220\257\345\212\250\345\274\225\345\257\274\347\273\204\344\273\266.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/02.init\345\220\257\345\212\250\345\274\225\345\257\274\347\273\204\344\273\266.md" @@ -1,6 +1,6 @@ --- title: init启动引导组件 -permalink: /pages/00040b01 +permalink: /pages/00040d01 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # init启动引导组件 @@ -17,7 +17,7 @@ date: 2021-12-30 12:57:44 - [开发指导](#section15371931131117) - [开发实例](#section173413113565) -init启动引导组件负责在系统启动阶段启动关键服务进程,若用户需要新增随开机自启动的系统服务,可将新增服务加入配置文件init.cfg中。 +init启动引导组件负责在系统启动阶段启动关键服务进程。 若用户需要新增随开机自启动的系统服务,可将新增服务加入配置文件init.cfg中。 ## init启动引导的配置文件 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/03.appspawn\345\272\224\347\224\250\345\255\265\345\214\226\347\273\204\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/03.appspawn\345\272\224\347\224\250\345\255\265\345\214\226\347\273\204\344\273\266.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/03.appspawn\345\272\224\347\224\250\345\255\265\345\214\226\347\273\204\344\273\266.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/03.appspawn\345\272\224\347\224\250\345\255\265\345\214\226\347\273\204\344\273\266.md" index d4f982c93b6e680239c67f67448f1037b8b43871..b74550cc0939d8123e2fa500704683de35125c48 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/03.appspawn\345\272\224\347\224\250\345\255\265\345\214\226\347\273\204\344\273\266.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/03.appspawn\345\272\224\347\224\250\345\255\265\345\214\226\347\273\204\344\273\266.md" @@ -1,6 +1,6 @@ --- title: appspawn应用孵化组件 -permalink: /pages/00040b02 +permalink: /pages/00040d02 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # appspawn应用孵化组件 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/04.bootstrap\346\234\215\345\212\241\345\220\257\345\212\250\347\273\204\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/04.bootstrap\346\234\215\345\212\241\345\220\257\345\212\250\347\273\204\344\273\266.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/04.bootstrap\346\234\215\345\212\241\345\220\257\345\212\250\347\273\204\344\273\266.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/04.bootstrap\346\234\215\345\212\241\345\220\257\345\212\250\347\273\204\344\273\266.md" index 5d15117cd38026eb9ce42dab548d32449701c25d..bc211987028f0c666c4ec06a4f1b77a8b72ff32e 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/04.bootstrap\346\234\215\345\212\241\345\220\257\345\212\250\347\273\204\344\273\266.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/04.bootstrap\346\234\215\345\212\241\345\220\257\345\212\250\347\273\204\344\273\266.md" @@ -1,6 +1,6 @@ --- title: bootstrap服务启动组件 -permalink: /pages/00040b03 +permalink: /pages/00040d03 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # bootstrap服务启动组件 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/05.syspara\347\263\273\347\273\237\345\261\236\346\200\247\347\273\204\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/05.syspara\347\263\273\347\273\237\345\261\236\346\200\247\347\273\204\344\273\266.md" similarity index 31% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/05.syspara\347\263\273\347\273\237\345\261\236\346\200\247\347\273\204\344\273\266.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/05.syspara\347\263\273\347\273\237\345\261\236\346\200\247\347\273\204\344\273\266.md" index 4c23aeb8e4d9dfe1aadbb0f7f48760ca719ff2f7..25af37fd90658f128efa0592075133aca71d56bf 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/05.syspara\347\263\273\347\273\237\345\261\236\346\200\247\347\273\204\344\273\266.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/05.syspara\347\263\273\347\273\237\345\261\236\346\200\247\347\273\204\344\273\266.md" @@ -1,6 +1,6 @@ --- title: syspara系统属性组件 -permalink: /pages/00040b04 +permalink: /pages/00040d04 navbar: true sidebar: true prev: true @@ -9,20 +9,322 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # syspara系统属性组件 -- [syspara系统接口说明](#section775916468231) +- [系统参数简介](#section381564832813) +- [系统参数定义规则](#section431671411293) + - [系统参数值定义文件](#section885018321291) + - [系统参数DAC访问控制定义文件](#section1333155762915) + - [系统参数定义文件安装方法](#section43801513193014) + - [系统参数值定义文件的加载顺序](#section89971332173017) + +- [shell命令使用说明](#section2039119283111) +- [syspara系统接口说明](#section0137175692616) - [开发实例](#section118404913233) -负责提供获取与设置操作系统相关的系统属性。 +## 系统参数简介 + +syspara系统为各系统服务提供简单易用的键值对访问接口,使得各个系统服务可以通过各自的系统参数来进行业务功能的配置。系统参数的访问和操作有以下几个基本原语 + +**图 1** 系统参数操作原语 +![](/images/device-dev/subsystems/figure/系统参数操作原语.png "系统参数操作原语") + +**表 1** 系统参数操作原语说明 + + + + + + + + + + + + + + + + + + + +

功能

+

说明

+

get

+

获取系统参数的值

+

set

+

设置系统参数的值

+

wait

+

同步等待系统参数的值变更

+

watch

+

异步观察系统参数的值变更

+
+ +系统参数名称采用点分格式由多段组成,每一段由字母、数字、下划线组成,总长度不超过96字节;系统参数名称分为两类: + +**表 2** 系统参数名称 + + + + + + + + + + + + + + + + + + + +

类别

+

名称

+

示例

+

说明

+

参数名称

+

Parameter Name

+

const.product.name

+

完整的系统参数名称,末尾不是"."。

+

参数目录

+

Parameter Directory

+

const.product.

+

以"."结尾,标识相同前缀的所有系统参数集合。

+
+ +系统参数一共分为三大类: + +**表 3** 系统参数分类 -LiteOS-M内核和LiteOS-A内核的平台,包括:Hi3861平台,Hi3516DV300平台,Hi3518EV300平台。支持的系统属性包括:默认系统属性、OEM厂商系统属性和自定义系统属性。OEM厂商部分仅提供默认值,具体值需OEM产品方按需进行调整。 + + + + + + + + + + + + + + + + + + + +

类别

+

前缀

+

说明

+

常量

+

const.

+

常量参数,一旦赋值后续不会再变更;值最大长度为4096字节(包括结束符)。

+

可写

+

其它

+

可写参数,重启后丢失,值最大长度96字节(包括结束符)。

+

可持久化

+

persist.

+

可写并可持久化保存参数,重启后不会丢失,值最大长度96字节(包括结束符)。

+
-## syspara系统接口说明 +每个系统参数名称总体格式如下:\[**const**|**persist**\].**$sub\_system**.**$desc**。 -**表 1** 系统属性接口说明 +$sub\_system为子系统或模块的名称。 + +$desc为子系统或模块下参数的描述字符,可以为点分格式进行分级描述。 + +## 系统参数定义规则 + +每个子系统定义各自模块的系统参数,包括系统参数名称、默认值以及系统参数的权限访问信息。 + +### 系统参数值定义文件 + +系统参数值定义文件后缀名为**".para"**,其格式示例如下: + +``` +# This is comment +const.product.name=OHOS-PRODUCT +const.os.version.api=26 +const.telephony.enable=false|true + +const.test.withblank=My Value +``` + +注意:系统参数值不支持注释及换行。 + +``` +# 不支持 +const.test.withcomment=MyValue # This should be ommitted +# 不支持 +const.test.multiline="This is a multiline parameter. +Line2 value. +Last line." +``` + +系统参数必须通过完整的系统参数命令来赋值,赋值方式分为三大类: + +**表 4** 系统参数赋值方式 + + + + + + + + + + + + + + + + + + + + +

类别

+

示例

+

说明

+

字符串

+

const.product.name=OHOS-PRODUCT

+

不支持多行字符串,不支持注释。

+

数字

+

const.os.version.api=26

+

数字不需要引号。

+

布尔

+

const.telephony.enable=false

+

布尔型的可以为0,1,false,true。

+
+ +### 系统参数DAC访问控制定义文件 + +当前系统参数的访问权限控制通过自主访问控制(**Discretionary Access Control**)方式管理,访问权限定义文件后缀名为**".para.dac"**,示例如下: + +``` +const.product.="root:root:660" +``` + +如上所示,可以通过**参数路径**为相同前缀的所有系统参数定义一类访问权限信息;DAC信息通过":"分三段来描述,分别为参数的user,group以及UGO规则信息。 + +UGO规则信息每一位的定义如下: + +**图 2** UGO规则信息 +![](/images/device-dev/subsystems/figure/UGO规则信息.png "UGO规则信息") + +### 系统参数定义文件安装方法 + +.para和.para.dac文件都安装到/etc/param/目录下,GN脚本示例如下: + +``` +ohos_prebuilt_etc("ohos.para") { + source = "//base/startup/init_lite/services/etc/ohos.para" + part_name = "init" + module_install_dir = "etc/param" +} + +ohos_prebuilt_etc("ohos.para.dac") { + source = "//base/startup/init_lite/services/etc/ohos.para.dac" + part_name = "init" + module_install_dir = "etc/param" +} +``` + +### 系统参数值定义文件的加载顺序 + +系统参数值的加载顺序如下: + +**表 5** 系统参数加载顺序 + + + + + + + + + + + + + + + + + + + + + + + + +

类别

+

路径

+

说明

+

内核参数

+

/proc/cmdline

+

内核参数中ohospara.xxx=valXXX类型的参数都转换成ohos.boot.xxx=valXXX系统参数

+

OS固定值

+

/system/etc/param/ohos_const/*.para

+

OS固定系统参数值参数优先加载。

+

vendor参数值

+

/vendor/etc/param/*.para

+

厂商参数值定义文件次优先级加载,可以覆盖system参数值定义。

+

system参数值

+

/system/etc/param/*.para

+

最后加载system参数值定义文件,文件中的系统参数值如果已经存在,则忽略掉。

+
+ +## shell命令使用说明 + +通过shell命令中可直接操作系统参数: + +**表 6** 系统参数shell命令说明 + + + + + + + + + + + + + + + + + + + +

功能

+

说明

+

param get [key]

+

获取指定key名称的系统参数值;如果不指定任何name,则返回所有系统参数值。

+

param set key value

+

设置指定key名称的参数值为value

+

param wait key value

+

同步等待指定key名称的系统参数值与value匹配。value可支持模糊匹配,如"*"表示任何值,"val*"表示只匹配前三个val字符。

+

param dump

+

显示系统参数的统计信息。

+
+ +## syspara系统接口说明 + +**表 7** 系统属性接口说明 - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

接口名

@@ -41,126 +343,136 @@ LiteOS-M内核和LiteOS-A内核的平台,包括:Hi3861平台,Hi3516DV300

设置/更新系统参数。

char* GetProductType(void)

+

const char* GetDeviceType(void)

返回当前设备类型。

char* GetManufacture(void)

+

const char* GetManufacture(void)

返回当前设备生产厂家信息。

char* GetBrand(void)

+

const char* GetBrand(void)

返回当前设备品牌信息。

char* GetMarketName(void)

+

const char* GetMarketName(void)

返回当前设备传播名。

char* GetProductSeries(void)

+

const char* GetProductSeries(void)

返回当前设备产品系列名。

char* GetProductModel(void)

+

const char* GetProductModel(void)

返回当前设备认证型号。

char* GetSoftwareModel(void)

+

const char* GetSoftwareModel(void)

返回当前设备内部软件子型号。

char* GetHardwareModel(void)

+

const char* GetHardwareModel(void)

返回当前设备硬件版本号。

char* GetHardwareProfile(void)

+

const char* GetHardwareProfile(void)

返回当前设备硬件profile。

char* GetSerial(void)

+

const char* GetSerial(void)

返回当前设备序列号(SN号)。

char* GetOsName(void)

+

const char* GetOSFullName(void)

返回操作系统名。

char* GetDisplayVersion(void)

+

const char* GetDisplayVersion(void)

返回当前设备用户可见的软件版本号。

char* GetBootloaderVersion(void)

+

const char* GetBootloaderVersion(void)

返回当前设备Bootloader版本号。

char* GetSecurityPatchTag(void)

+

const char* GetSecurityPatchTag(void)

返回安全补丁标签。

char* GetAbiList(void)

+

const char* GetAbiList(void)

返回当前设备支持的指令集(Abi)列表。

char* GetSdkApiLevel(void)

+

int GetSdkApiVersion(void)

返回与当前系统软件匹配的SDK API level。

+

返回与当前系统软件匹配的SDK API 版本号。

char* GetFirstApiLevel(void)

+

int GetFirstApiVersion(void)

返回系统软件首版本SDK API level。

+

返回系统软件首版本SDK API 版本号。

char* GetIncrementalVersion(void)

+

const char* GetIncrementalVersion(void)

返回差异版本号。

char* GetVersionId(void)

+

const char* GetVersionId(void)

返回版本id。

char* GetBuildType(void)

+

const char* GetBuildType(void)

返回构建类型。

char* GetBuildUser(void)

+

const char* GetBuildUser(void)

返回构建账户用户名。

char* GetBuildHost(void)

+

const char* GetBuildHost(void)

返回构建主机名。

char* GetBuildTime(void)

+

const char* GetBuildTime(void)

返回构建时间。

char* GetBuildRootHash(void)

+

const char* GetBuildRootHash(void)

返回当前版本hash。

const char* GetOsReleaseType(void)

+

返回系统发布类型

+

int GetDevUdid(char *udid, int size)

+

获取设备udid

+
@@ -177,7 +489,7 @@ char valueGet1[128] = {0}; ret = GetParameter(key1, "version=10.1.0", valueGet1, 128); // get sysparm -char* value1 = GetProductType(); +char* value1 = GetDeviceType(); printf("Product type =%s\n", value1); free(value1); char* value2 = GetManufacture(); @@ -207,7 +519,7 @@ free(value9); char* value10 = GetSerial(); printf("Serial =%s\n", value10); free(value10); -char* value11 = GetOsName(); +char* value11 = GetOSFullName(); printf("OS name =%s\n", value11); free(value11); char* value12 = GetDisplayVersion(); @@ -222,29 +534,39 @@ free(value14); char* value15 = GetAbiList(); printf("abi list =%s\n", value15); free(value15); -char* value16 = GetFirstApiLevel(); -printf("first api level =%s\n", value16); +int value16 = GetFirstApiVersion(); +printf("first api level =%d\n", value16); free(value16); char* value17 = GetIncrementalVersion(); printf("Incremental version = %s\n", value17); free(value17); -char* value187 = GetVersionId(); -printf("formal id =%s\n", value187); -free(value187); -char* value18 = GetBuildType(); -printf("build type =%s\n", value18); +char* value18 = GetVersionId(); +printf("formal id =%s\n", value18); free(value18); -char* value19 = GetBuildUser(); -printf("build user =%s\n", value19); +char* value19 = GetBuildType(); +printf("build type =%s\n", value19); free(value19); -char* value20 = GetBuildHost(); -printf("Build host = %s\n", value20); +char* value20 = GetBuildUser(); +printf("build user =%s\n", value20); free(value20); -char* value21 = GetBuildTime(); -printf("build time =%s\n", value21); +char* value21 = GetBuildHost(); +printf("Build host = %s\n", value21); free(value21); -char* value22 = GetBuildRootHash(); -printf("build root later..., %s\n", value22); +char* value22 = GetBuildTime(); +printf("build time =%s\n", value22); free(value22); +char* value23 = GetBuildRootHash(); +printf("build root later..., %s\n", value23); +free(value23); +char* value24 = GetOsReleaseType(); +printf("OS release type =%s\n", value24); +free(value24); +char* value25 = GetOsReleaseType(); +printf("OS release type =%s\n", value25); +free(value25); +char value26[65] = {0}; +GetDevUdid(value26, 65); +printf("device udid =%s\n", value26); +free(value26); ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/06.\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/06.\345\270\270\350\247\201\351\227\256\351\242\230.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/06.\345\270\270\350\247\201\351\227\256\351\242\230.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/06.\345\270\270\350\247\201\351\227\256\351\242\230.md" index f0af3ea6ab7df2d9f3429da189d3f54950f79c07..3e08dcb45a7b9580835843141f2a43a8bfe07189 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/06.\345\270\270\350\247\201\351\227\256\351\242\230.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/06.\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -1,6 +1,6 @@ --- title: 常见问题 -permalink: /pages/00040b05 +permalink: /pages/00040d05 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 常见问题 @@ -23,7 +23,8 @@ date: 2021-12-30 12:57:44 系统启动过程中,打印“\[Init\] InitReadCfg, parse failed! please check file /etc/init.cfg format.”错误,启动过程停止,如下图所示: -![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001063839940.png) +**图 1** 运行报错图 +![](/images/device-dev/subsystems/figure/运行报错图.png "运行报错图") **可能原因** @@ -41,7 +42,7 @@ date: 2021-12-30 12:57:44 **可能原因** -被init启动的服务都有一个叫做“importance”的属性(详见[第2章表3](/pages/00040b01#table14737791471)描述)。 +被init启动的服务都有一个叫做“importance”的属性(详见[第2章表3](/pages/00040d01#table14737791471)描述)。 - 当该属性为0时,表示若当前服务进程退出,init不需要重启单板。 - 当该属性为1时,表示若当前服务进程退出,init需要重启单板。 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/07.\345\217\202\350\200\203.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/07.\345\217\202\350\200\203.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/07.\345\217\202\350\200\203.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/07.\345\217\202\350\200\203.md" index bda7ae4ba0a94c414567156da807570fd1c8db5a..50885429cb82cf18773f1d2934ac96a7df0d1235 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/12.\345\220\257\345\212\250\346\201\242\345\244\215/07.\345\217\202\350\200\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/14.\345\220\257\345\212\250\346\201\242\345\244\215/07.\345\217\202\350\200\203.md" @@ -1,6 +1,6 @@ --- title: 参考 -permalink: /pages/00040b06 +permalink: /pages/00040d06 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # 参考 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/01.DFX\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/01.DFX\346\246\202\350\277\260.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/01.DFX\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/01.DFX\346\246\202\350\277\260.md" index 0608560ea31512598182230d345d53d6c5810b74..0e325b4756b0a159f40dc57ddab4c4d5d31b117b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/01.DFX\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/01.DFX\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: DFX概述 -permalink: /pages/00040d00 +permalink: /pages/00040e00 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # DFX概述 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/02.HiLog\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/02.HiLog\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/02.HiLog\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/02.HiLog\345\274\200\345\217\221\346\214\207\345\257\274.md" index c497c2e460bb702a66e69f41f954492d81d6ea7f..a3b7a29c19e0b49431033aeb62a72ca69bdb3e0c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/02.HiLog\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/02.HiLog\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: HiLog开发指导 -permalink: /pages/00040d01 +permalink: /pages/00040e01 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # HiLog开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/03.HiLog_Lite\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/03.HiLog\\_Lite\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/03.HiLog_Lite\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/03.HiLog\\_Lite\345\274\200\345\217\221\346\214\207\345\257\274.md" index 73496fab60ab666739e2e357f1d05345d998b822..d69bde23e4c7575add5cdf83ffba84d97b61bdbb 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/03.HiLog_Lite\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/03.HiLog\\_Lite\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- -title: HiLog_Lite开发指导 -permalink: /pages/00040d02 +title: HiLog\\_Lite开发指导 +permalink: /pages/00040e02 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # HiLog\_Lite开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/04.HiSysEvent\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/04.HiSysEvent\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/04.HiSysEvent\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/04.HiSysEvent\345\274\200\345\217\221\346\214\207\345\257\274.md" index c4da862e3160b406a14d70f6ebf8fe5085b58b39..df11243289db8d95b235aab5296c0c85dbd35ac3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/14.DFX/04.HiSysEvent\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/15.DFX/04.HiSysEvent\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: HiSysEvent开发指导 -permalink: /pages/00040d03 +permalink: /pages/00040e03 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:32 --- # HiSysEvent开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/13.\346\265\213\350\257\225\347\224\250\344\276\213\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/13.\346\265\213\350\257\225\347\224\250\344\276\213\345\274\200\345\217\221\346\214\207\345\257\274.md" deleted file mode 100644 index e0b5a5c8304fbeb8c00c56a15d53b2f8dcc4c73d..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/13.\346\265\213\350\257\225\347\224\250\344\276\213\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ /dev/null @@ -1,995 +0,0 @@ ---- -title: 测试用例开发指导 -permalink: /pages/00040c -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:44 ---- -# 测试用例开发指导 - -- [概述](#section12403172115920) - - [基本概念](#section53632272090) - - [运作机制](#section2394431106) - -- [约束与限制](#section2029921310472) -- [搭建环境](#section175012297491) - - [环境要求](#section935055691014) - - [安装环境](#section6511193210111) - - [检验环境是否搭建成功](#section1899144517117) - -- [开发指导](#section16741101301210) - - [场景介绍](#section93782214124) - - [接口说明](#section54131732101218) - - [开发步骤](#section53541946111218) - -- [开发实例](#section7477121918136) -- [测试平台使用](#section76401945124810) -- [包结构说明](#section1875515364133) - -## 概述 - -### 基本概念 - -测试子系统提供基于python开发的一键式的开发者自测试平台,支持跨平台使用以及三方测试框架拓展,主要包括测试用例编译、测试用例管理、测试用例调度分发、测试用例执行、测试结果收集、测试报告生成、测试用例模板、测试环境管理等模块。 - -在测试子系统开发前,开发者应先了解以下概念: - -- 测试用例编译 - - 支持将测试用例源代码编译成可在被测设备侧执行的二进制文件。 - -- 测试用例调度分发 - - 支持将测试用例通过网口通道或者串口通道分发到不同的被测设备上,并且为每一个测试用例分配特定的测试用例执行器。 - -- 测试用例执行器 - - 负责测试用例的预处理,用例执行,结果记录等执行逻辑。 - -- 测试用例模板 - - 定义了测试用例以及用例编译配置GN文件的统一格式。 - -- 测试平台kit - - 测试平台运行过程中公共方法,如提供测试用例目录向被测设备挂载文件系统,测试用例推送到被测设备,或者从被测设备获取测试结果等操作。 - -- 测试报告生成 - - 定义开发者自测试报告模板,生成web测试报告。 - -- 测试环境管理 - - 支持通过USB、串口等方式管理被测设备,功能包括设备发现,设备状态查询等。 - - -### 运作机制 - -- 测试平台架构图如下: - -**图 1** 测试平台架构 -![](/images/zh-cn/device-dev/subsystems/figure/测试平台架构.png "测试平台架构") - -- 测试平台运行时序图如下: - -**图 2** 测试平台运行时序 -![](/images/zh-cn/device-dev/subsystems/figure/测试平台运行时序.png "测试平台运行时序") - -- 测试平台运行原理 - -测试平台通过shell脚本启动,以命令行方式支持一系列的测试指令执行,通过命令行输出测试结果。 - -## 约束与限制 - -- 功能使用范围:开发自测试平台仅支持代码级的测试用例开发和验证,如单元测试,模块测试。 -- 规格限制:当前测试框架的适用范围仅支持白盒测试。 -- 操作限制:一台测试设备上仅支持启动单个测试平台。 - -## 搭建环境 - -### 环境要求 - -**表 1** **环境要求** - - - - - - - - - - - - - - - - -

项目

-

测试设备

-

被测设备

-

硬件

-
  • 内存:8G及以上
  • 硬盘:100G及以上
  • 硬件架构:X86或ARM64
-
  • Hi3516 DV300开发板
  • Hi3518 EV300开发板
-

软件

-
  • 操作系统:Windows 10 64位 或 Ubuntu 18.04

    系统组件(Linux): libreadline-dev

    -
  • Python:3.7.5及以上
  • Python插件:pyserial3.3及以上、paramiko2.7.1及以上、setuptools40.8.0及以上,rsa4.0及以上
  • NFS Server:haneWIN NFS Server1.2.50及以上或者 NFSv4及以上
-
  • 系统软件:版本不低于OpenHarmony 1.0
  • 内核类型:LiteOS-A或者Linux
-
- -### 安装环境 - -1. 如测试环境为Linux,需要安装系统组件readline,命令如下: - - ``` - sudo apt-get install libreadline-dev - ``` - - 安装成功提示如下: - - ``` - Reading package lists... Done - Building dependency tree - Reading state information... Done - libreadline-dev is already the newest version (7.0-3). - 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. - ``` - -2. 安装Python扩展组件setuptools、(rsa、paramiko、以及pyserial,设备仅支持串口时安装),命令如下: - - 1、安装setuptools,安装命令如下: - - ``` - pip install setuptools - ``` - - 安装成功提示如下: - - ``` - Requirement already satisfied: setuptools in d:\programs\python37\lib\site-packages (41.2.0) - ``` - - 2、安装rsa,安装命令如下: - - ``` - pip install rsa - ``` - - 安装成功提示如下: - - ``` - Installing collected packages: pyasn1, rsa - Successfully installed pyasn1-0.4.8 rsa-4.7 - ``` - - 3、安装Paramiko,安装命令如下: - - ``` - pip install paramiko - ``` - - 安装成功提示如下: - - ``` - Installing collected packages: pycparser, cffi, pynacl, bcrypt, cryptography, paramiko - Successfully installed bcrypt-3.2.0 cffi-1.14.4 cryptography-3.3.1 paramiko-2.7.2 pycparser-2.20 pynacl-1.4.0 - ``` - - 4、安装pyserial(被测设备仅支持串口时安装),安装命令如下: - - ``` - pip install pyserial - ``` - - 安装成功提示如下: - - ``` - Requirement already satisfied: pyserial in d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg (3.4) - ``` - -3. 安装NFS server(被测设备仅支持串口时安装)。 - - **Windows环境安装** - - 下载并安装haneWIN NFS Server1.2.50,地址:https://www.hanewin.net/nfs-e.htm - - **Linux环境下安装** - - ``` - sudo apt install nfs-kernel-server - ``` - - 所有环境配置安装完成,即可在IDE中进行测试平台代码开发调试,推荐的IDE为 DevEco Studio。 - - -### 检验环境是否搭建成功 - -**表 2** **检验环境** - - - - - - - - - - - - - - - - - - - - -

检查项

-

操作

-

满足条件

-

检查python安装与否,版本是否满足要求。

-

命令行窗口执行命令:python --version。

-

版本不小于3.7.5即可。

-

检查python扩展插件安装与否。

-

打开test/xdevice目录,执行run.bat或run.sh。

-

可进入提示符“>>>”界面即可。

-

检查NFS Server启动状态(被测设备仅支持串口时检测)。

-

通过串口登录开发板,执行mount命令挂载NFS。

-

可正常挂载文件目录即可。

-
- -## 开发指导 - -### 场景介绍 - -针对开发的业务代码进行白盒测试验证。 - -### 接口说明 - -测试框架集成了开源的单元测试框架,并对测试用例的宏定义做了扩展,具体框架说明详见开源官方文档。 - -**表 3** 测试框架扩展宏定义说明 - - - - - - - - - - - - - - - - -

宏定义

-

描述

-

HWTEST

-

测试用例执行不依赖Setup&Teardown。HWTEST对TEST增加了“用例级别”参数“TestSize.Level1”,例如HWTEST(CalculatorAddTest, TestPoint_001, TestSize.Level1)。

-

HWTEST_F

-

测试用例(不带参数)执行依赖Setup&Teardown。HWTEST_F对TEST_F增加了“用例级别”参数“ TestSize.Level1”,例如HWTEST_F(CalculatorAddTest, TestPoint_001, TestSize.Level1)。

-

HWTEST_P

-

测试用例(带参数)执行依赖Setup&Teardown。HWTEST_P对TEST_P增加了“用例级别”参数“ TestSize.Level1”,例如HWTEST_P(CalculatorAddTest, TestPoint_001, TestSize.Level1)。

-
- -### 开发步骤 - -1. 按照开发者测试用例目录规划定义测试套文件,需要继承testing::Test类,命名以被测特性+Test命名,示例代码路径:test/developertest/examples/lite/cxx\_demo/test/unittest/common/calc\_subtraction\_test.cpp - - ``` - /* - * Copyright (c) 2020 OpenHarmony. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - #include - - using namespace std; - using namespace testing::ext; - - class CalcSubtractionTest : public testing::Test { - public: - static void SetUpTestCase(void); - static void TearDownTestCase(void); - void SetUp(); - void TearDown(); - }; - ``` - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >测试用例规范 - >- 命名规范 - > 测试用例源文件名称和测试套内容保持一致,测试套与用例之间关系1:N,测试套与测试源文件之间关系1:1,每个源文件全局唯一,格式:\[特性\]\_\[功能\]\_\[子功能1\]\_\[子功能1.1\],子功能支持向下细分。 - > 文件命名采用全小写+下划线方式命名,以test结尾,如demo用例:developertest/examples/lite/cxx\_demo - >- 测试用例编码规范 - > 开发者测试用例原则上与特性代码编码规范保持一致,另外需要添加必要的用例描述信息,详见[•自测试用例模板](#li2069415903917)。 - >- 测试用例编译配置规范 - > 测试用例采用GN方式编译,配置遵循本开源项目的[编译指导](/pages/00040000)。 - >- 测试用例模板 - > 详见测试demo用例:developertest/examples/lite/cxx\_demo/test/unittest/common/calc\_subtraction\_test.cpp - -2. 实现测试套执行过程需要的预处理操作和后处理操作,即实现SetUp和TearDown方法。 - - ``` - void CalcSubtractionTest::SetUpTestCase(void) - { - // step 1: input testsuite setup step - } - - void CalcSubtractionTest::TearDownTestCase(void) - { - // step 2: input testsuite teardown step - } - - void CalcSubtractionTest::SetUp(void) - { - // step 3: input testcase setup step - } - - void CalcSubtractionTest::TearDown(void) - { - // step 4: input testcase teardown step - } - ``` - -3. 针对被测对象的特性编写测试用例,以使用HWTEST\_F为例说明。 - - ``` - /** - * @tc.name: integer_sub_001 - * @tc.desc: Test Calculator - * @tc.type: FUNC - * @tc.require: AR00000000 SR00000000 - */ - HWTEST_F(CalcSubtractionTest, integer_sub_001, TestSize.Level1) - { - EXPECT_EQ(0, Subtraction(1, 0)); - } - ``` - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >- @tc.name:用例名称,对测试目的简要描述。 - >- @tc.desc:描述用例详细描述,包括测试目的、测试步骤、期望结果等。 - >- @tc.type:测试属性分类(FUNC、PERF、SECU、RELI)。 - >- @tc.require:需求编号或者issue编号,用来将修改与用例关联。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

序号

-

测试类型名称

-

缩写

-

测试类型描述

-

1

-

功能测试(functionality)

-

FUNC

-

验证软件各个功能满足功能设计与规格。

-

2

-

性能测试(performance)

-

PERF

-

验证软件是否满足性能设计指标。包含负载测试容量测试,压力测试等。

-

3

-

安全性测试(security)

-

SECU

-

验证软件在生命周期内符合安全需求定义和相关法规。

-

4

-

可靠性测试(reliability)

-

RELI

-

在规定的条件下,在规定的时间内,软件不引起系统失效的概率,这里也包含稳定性。

-
- -4. 编写用例编译GN文件,其中包括定义用例编译目标,添加编译配置依赖,源文件等,举例说明: - - 示例文件路径:test/developertest/examples/lite/cxx\_demo/test/unittest/common/BUILD.gn)。 - - ``` - import("//build/lite/config/test.gni") - - unittest("CalcSubTest") { - output_extension = "bin" - sources = [ - "calc_subtraction_test.cpp" - ] - include_dirs = [] - deps = [] - } - ``` - -5. 将用例编译目标添加到子系统编译配置中,保证用例随版本一起编译,举例说明: - 1. 支持hdc连接的设备,编译配置示例路径:test/developertest/examples/ohos.build。 - - ``` - { - "subsystem": "subsystem_examples", - "parts": { - "subsystem_examples": { - "module_list": [ - "//test/developertest/examples/detector:detector", - ... ... - ], - "test_list": [ - "//test/developertest/examples/detector/test:unittest", - ... ... - ] - }, - ... ... - } - ``` - - 2. 仅支持串口的设备,编译配置示例路径:test/developertest/examples/lite/BUILD.gn。 - - ``` - import("//build/lite/config/test.gni") - - subsystem_test("test") { - test_components = [] - if(ohos_kernel_type == "liteos_riscv") { - features += [ - ] - }else if(ohos_kernel_type == "liteos_a") { - test_components += [ - "//test/developertest/examples/lite/cxx_demo/test/unittest/common:CalcSubTest" - ] - } - } - ``` - -6. 编写测试用例资源配置,当测试用例需要使用静态测试资源文件时使用该配置。 - 1. 在部件或者模块的test目录下创建resource目录。 - 2. 在resource目录下创建形态目录,如phone。 - 3. 在设备形态目录下创建一个以模块名命名的文件夹,如testmodule。 - 4. 在模块目录下创建一个ohos\_test.xml文件,文件内容格式如下: - - ``` - - - - - - - - ``` - - 5. 在测试用例的编译配置文件中定义resource\_config\_file,用来指定对应的资源文件ohos\_test.xml。 - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >如上资源文件功能:将resource目录下的test.txt文件通过hdc push命令推送到被测设备的/data/test/resource目录下。 - - -7. 以上步骤完成即完成测试用例编写,即可执行测试用例。 - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >- 支持hdc连接的设备,测试用例支持单独编译。 - >- 仅支持串口连接的设备,在代码根路径下执行编译debug版本的命令,即可编译测试用例。 - > 测试用例用例的执行详见[测试平台使用](#section76401945124810)。 - - -## 开发实例 - -测试子系统代码仓提供了完整demo用例,demo用例路径:test/developertest/examples/。以一个减法运算方法编写测试用例举例说明: - -- 被测代码如下: - - ``` - static int Subtraction(int a, int b) - { - return a - b; - } - ``` - -- 测试用例代码如下: - - ``` - /** - * @tc.name: integer_sub_002 - * @tc.desc: Verify the Subtraction function. - * @tc.type: FUNC - * @tc.require: AR00000000 SR00000000 - */ - HWTEST_F(CalcSubtractionTest, integer_sub_002, TestSize.Level1) - { - EXPECT_EQ(1, Subtraction(2, 1)); - } - ``` - - -## 测试平台使用 - -1. (可选)安装xdevice组件。安装xdevice后,xdevice组件可以作为python的扩展包使用。 - - 打开xdevice安装目录:test/xdevice,执行如下命令: - - ``` - python setup.py install - ``` - - 安装成功提示如下: - - ``` - ... ... - Installed d:\programs\python37\lib\site-packages\xdevice-0.0.0-py3.7.egg - Processing dependencies for xdevice==0.0.0 - Searching for pyserial==3.4 - Best match: pyserial 3.4 - Processing pyserial-3.4-py3.7.egg - pyserial 3.4 is already the active version in easy-install.pth - Installing miniterm.py script to D:\Programs\Python37\Scripts - - Using d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg - Finished processing dependencies for xdevice==0.0.0 - ``` - -2. 修改developertest/config/user\_config.xml 文件配置developertest组件。 - 1. 测试框架通用配置。 - - \[build\] \# 配置测试用例的编译参数,例如: - - ``` - - false - false - true - ... ... - - ``` - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >测试用例的编译参数说明如下: - >example:是否编译测试用例示例,默认false。 - >version:是否编译测试版本,默认false。 - >testcase:是否编译测试用例,默认true。 - - 2. 支持hdc连接的被测设备。 - - \[device\] \# 配置标签为usb-hdc的环境信息,测试设备的IP地址和hdc映射的端口号,例如: - - ``` - - 192.168.1.1 - 9111 - - - ``` - - 3. 仅支持串口的被测设备。 - - \[board\_info\] \# 开发板配置信息,例如: - - ``` - - hispark - taurus - ipcamera - hb build - - ``` - - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >开发板配置信息如下: - >board\_series:开发板系列,默认hispark。 - >board\_type:开发板类型,默认taurus。 - >board\_product:目标产品,默认ipcamera。 - >build\_command:测试版本和用例的编译命令,默认hb build。 - - \[device\] \# 配置标签为ipcamera的串口信息,COM口和波特率,例如: - - ``` - - - COM1 - cmd - 115200 - 8 - 1 - 1 - - - ``` - -3. (可选)修改developertest组件配置。如果测试用例已完成编译,可以直接指定测试用例的编译输出路径,测试平台执行用例时即不会重新编译测试用例。 - - 配置文件:config/user\_config.xml - - 1. \[test\_cases\] \# 指定测试用例的输出路径,编译输出目录,例如: - - ``` - - /home/opencode/out/release/tests - - ``` - - 2. \[NFS\] \# 被测设备仅支持串口时配置,指定NFS的映射路径,host\_dir为PC侧的NFS目录,board\_dir为板侧创建的目录,例如: - - ``` - - D:\nfs - user - - ``` - -4. (可选)测试环境准备。当被测设备仅支持串口时,需要检查。 - - 系统镜像与文件系统已烧录进开发板,开发板上系统正常运行,在系统模式下,如使用shell登录时,设备提示符是“OHOS\#”。 - - 开发主机和开发板串口连接正常,网口连接正常。 - - 开发主机IP与开发板IP处在同一小网网段,相互可以ping通。 - - 开发主机侧创建空目录用于开发板通过NFS挂载测试用例,并且NFS服务启动正常。 - -5. (必选)启动测试平台,执行测试用例。 - - 启动测试框架,打开test/developertest目录,执行启动脚本。 - 1. Windows环境启动测试框架,执行如下脚本: - - ``` - start.bat - ``` - - 2. Linux环境启动测试框架。 - - ``` - ./start.sh - ``` - - - 设备形态选择。 - - 根据实际的开发板选择,设备形态配置:developertest/config/framework\_config.xml。 - - - 执行测试指令。 - 1. 查询测试用例支持的子系统,模块,产品形态以及测试类型,使用show命令,示例如下: - - ``` - usage: - show productlist Querying Supported Product Forms - show typelist Querying the Supported Test Type - show subsystemlist Querying Supported Subsystems - show modulelist Querying Supported Modules - ``` - - 2. 执行测试指令,其中-t为必选,-ss和-tm为可选字段,示例如下: - - ``` - run -t ut -ss subsystem_examples -tm calculator - ``` - - 3. 参数说明:指定参数可以执行特定特性、模块对应的测试套。 - - ``` - usage: run [-h] [-p PRODUCTFORM] [-t [TESTTYPE [TESTTYPE ...]]] - [-ss SUBSYSTEM] [-tm TESTMODULE] [-ts TESTSUIT] - [-tc TESTCASE] [-tl TESTLEVEL] - - optional arguments: - -h, --help show this help message and exit - -p PRODUCTFORM, --productform PRODUCTFORM Specified product form - -t [TESTTYPE [TESTTYPE ...]], --testtype [TESTTYPE [TESTTYPE ...]] - Specify test type(UT,MST,ST,PERF,ALL) - -ss SUBSYSTEM, --subsystem SUBSYSTEM Specify test subsystem - -tm TESTMODULE, --testmodule TESTMODULE Specified test module - -ts TESTSUIT, --testsuite TESTSUIT Specify test suite - -tc TESTCASE, --testcase TESTCASE Specify test case - -tl TESTLEVEL, --testlevel TESTLEVEL Specify test level - ``` - - - 测试框架帮助。 - - 帮助指令,用于查询测试平台支持哪些测试指令,如下: - - ``` - help - ``` - - - 退出自测试平台。 - - 退出自测试平台,使用如下命令退出测试平台,如下: - - ``` - quit - ``` - -6. (必选)查看测试结果与日志,通过在测试平台中执行测试指令,即可在developertest/reports目录下生成测试日志和测试报告。 - - 测试用例的结果会直接显示在控制台上,执行一次的测试结果根路径如下: - - ``` - reports/xxxx-xx-xx-xx-xx-xx - ``` - - - 测试用例格式化结果目录如下: - - ``` - result/ - ``` - - - 测试用例日志目录如下: - - ``` - log/plan_log_xxxx-xx-xx-xx-xx-xx.log - ``` - - - 测试报告汇总: - - ``` - summary_report.html - ``` - - - 测试报告详情: - - ``` - details_report.html - ``` - - - 测试平台日志目录如下: - - ``` - reports/platform_log_xxxx-xx-xx-xx-xx-xx.log - ``` - - - -## 包结构说明 - -开发者测试平台xdevice组件包结构说明,代码目录test/xdevice,详见下表所示: - -**表 4** xdevice组件包结构说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

功能描述

-

xdevice

-

测试平台基础组件。

-

xdevice/src/xdevice

-

基础测试框架源码。

-

xdevice/config

-

基础测试框架配置文件定义。

-

xdevice/src/xdevice/__main__.py

-

基础测试框架内部入口。

-

xdevice/src/xdevice/__init__.py

-

包依赖定义,插件依赖。

-

xdevice/src/xdevice/variables.py

-

全局变量定义。

-

xdevice/src/xdevice/_core/command

-

用例输入的命令行处理。

-

xdevice/src/xdevice/_core/config

-

基础测试框架的配置管理。

-

xdevice/src/xdevice/_core/environment

-

基础测试框架的环境管理,包括设备管理。

-

xdevice/src/xdevice/_core/executor

-

基础测试框架用例调度和分发。

-

xdevice/src/xdevice/_core/driver

-

基础测试框架测试执行器。

-

xdevice/src/xdevice/_core/resource

-

基础测试框架资源文件以及测试报告模板。

-

xdevice/src/xdevice/_core/testkit

-

基础测试框架公共操作,包括NFS文件系统挂载等。

-

xdevice/src/xdevice/_core/logger.py

-

基础测试框架日志管理。

-

xdevice/src/xdevice/_core/plugin.py

-

基础测试框架插件管理。

-

xdevice/src/xdevice/_core/interface.py

-

基础测试框架插件接口定义。

-

xdevice/setup.py

-

基础测试框架的安装脚本。

-

xdevice/run.bat

-

基础测试框架启动脚本(Windows)。

-

xdevice/run.sh

-

基础测试框架启动脚本(Linux)。

-
- -开发者测试平台developertest组件包结构说明,代码目录test/developertest,详见下表所示: - -**表 5** developertest组件包结构说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

描述

-

developertest

-

开发测试框架。

-

developertest/src

-

测试框架源码。

-

developertest/src/core

-

测试执行器。

-

developertest/src/core/build

-

测试用例编译。

-

developertest/src/core/command

-

对用户输入的命令行处理。

-

developertest/src/core/config

-

测试框架配置管理。

-

developertest/src/core/driver

-

测试框架驱动执行器。

-

developertest/src/core/resource

-

测试框架配置文件。

-

developertest/src/core/testcase

-

测试用例管理。

-

developertest/src/core/common.py

-

测试框架公共操作。

-

developertest/src/core/constants.py

-

测试框架全局常量。

-

developertest/src/core/exception.py

-

测试框架异常定义。

-

developertest/src/core/utils.py

-

测试框架工具方法。

-

developertest/src/main

-

测试框架平台。

-

developertest/src/main/__main__.py

-

测试框架内部入口。

-

developertest/examples

-

测试框架demo用例。

-

developertest/third_party

-

测试框架依赖第三方组件适配。

-

developertest/BUILD.gn

-

测试子系统编译配置。

-

developertest/start.bat

-

开发者测试入口(Windows)。

-

developertest/start.sh

-

开发者测试入口(Linux)。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/01.\345\274\200\345\217\221\350\247\204\350\214\203.md" "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/01.HPMBundle\345\274\200\345\217\221\350\247\204\350\214\203.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/01.\345\274\200\345\217\221\350\247\204\350\214\203.md" rename to "website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/01.HPMBundle\345\274\200\345\217\221\350\247\204\350\214\203.md" index a9a5991cbbb4f2bf66144c793f591c12bd901efd..ffc8d724cce94f85d374562d35fe4034ef3ca530 100644 --- "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/01.\345\274\200\345\217\221\350\247\204\350\214\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/01.HPMBundle\345\274\200\345\217\221\350\247\204\350\214\203.md" @@ -1,6 +1,6 @@ --- -title: 开发规范 -permalink: /pages/000800 +title: HPMBundle开发规范 +permalink: /pages/00050000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:32 --- # 开发规范 @@ -218,7 +218,7 @@ hpm ui **图 1** Bundle包依赖关系图 -![](/images/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001188040429.png) +![](/images/device-dev/bundles/figure/zh-cn_image_0000001188040429.png) ### hpm操作命令参考 diff --git "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/02.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/02.\345\274\200\345\217\221\346\214\207\345\215\227/01.HPMBundle\346\246\202\350\277\260.md" similarity index 87% rename from "website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/02.\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/02.\345\274\200\345\217\221\346\214\207\345\215\227/01.HPMBundle\346\246\202\350\277\260.md" index 88c51f20a902fdc02394fe034d9ac944d444ef3a..7903b7631d12fb96d63a00ea03fd96a7289885f7 100644 --- "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/02.\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/02.\345\274\200\345\217\221\346\214\207\345\215\227/01.HPMBundle\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- -title: 概述 -permalink: /pages/000801 +title: HPMBundle概述 +permalink: /pages/0005000100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:32 --- # 概述 @@ -32,7 +32,7 @@ Bundle是OpenHarmony中一个用来表示分发单元的术语,等同于包, - CHANGELOG.md:变更日志(可选) ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >Bundle的类型可以分为二进制,源代码,代码片段,模板,插件,发行版等。一个Bundle可以依赖其他的Bundles,依赖关系为有向无环图 一个Bundle被发布到HPM服务器(https://hpm.harmonyos.com)后,另外一些开发者就可以通过hpm包管理器下载安装使用 。 @@ -43,12 +43,12 @@ Bundle是OpenHarmony中一个用来表示分发单元的术语,等同于包, Distribution是OpenHarmony的发行版,是一个完整的操作系统版本,集合了各种Bundle(驱动,内核,框架,应用等),也通过Bundle在HPM平台分发。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >发行版的元数据中仅描述了依赖的Bundles以及如何编译该发行版的编译脚本,并不包含发行版的二进制镜像。下载发行版后,需要在本地将依赖的Bundles下载下来,安装编译后才能得到可用于烧录的系统镜像文件。 >发行版可以继承,即在一个既有的发行版的基础上,通过增加/删除Bundle形成新的发行版,以实现发行版的定制。 **图 1** 组Bundle和Distribution的关系 -![](/images/zh-cn/device-dev/bundles/figure/组件和发行版的构成-英文.png) +![](/images/device-dev/bundles/figure/组件和发行版的构成-英文.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/03.\345\256\211\350\243\205hpm\345\221\275\344\273\244\350\241\214\345\267\245\345\205\267.md" "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/02.\345\274\200\345\217\221\346\214\207\345\215\227/02.\345\256\211\350\243\205hpm\345\221\275\344\273\244\350\241\214\345\267\245\345\205\267.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/03.\345\256\211\350\243\205hpm\345\221\275\344\273\244\350\241\214\345\267\245\345\205\267.md" rename to "website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/02.\345\274\200\345\217\221\346\214\207\345\215\227/02.\345\256\211\350\243\205hpm\345\221\275\344\273\244\350\241\214\345\267\245\345\205\267.md" index 9cbfde8e0e6b1074aed4ba3f9cb7b08cf0c188c0..bd45591e2f3c47ea7c686fee1cfd72dd80bda745 100644 --- "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/03.\345\256\211\350\243\205hpm\345\221\275\344\273\244\350\241\214\345\267\245\345\205\267.md" +++ "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/02.\345\274\200\345\217\221\346\214\207\345\215\227/02.\345\256\211\350\243\205hpm\345\221\275\344\273\244\350\241\214\345\267\245\345\205\267.md" @@ -1,6 +1,6 @@ --- title: 安装hpm命令行工具 -permalink: /pages/000802 +permalink: /pages/0005000101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:32 --- # 安装hpm命令行工具 @@ -78,9 +78,9 @@ shellPath = C:\WINDOWS\System32\cmd.exe # OSPlatform = Auto|linux|darwin|win32 ``` -hpm-cli的命令介绍可以参考:[hpm操作命令](/pages/000801) +hpm-cli的命令介绍可以参考:[hpm操作命令](/pages/0005000100) ## 下载OpenHarmony代码 -参考[《源码获取》](/pages/extra/dade07/)。 +参考[《源码获取》](/pages/000102)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/04.\345\274\200\345\217\221Bundle.md" "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/02.\345\274\200\345\217\221\346\214\207\345\215\227/03.\345\274\200\345\217\221Bundle.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/04.\345\274\200\345\217\221Bundle.md" rename to "website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/02.\345\274\200\345\217\221\346\214\207\345\215\227/03.\345\274\200\345\217\221Bundle.md" index ffa92b15ff6524c9746854ed5077aa236d53dd21..df9222495822a74c8a0d0222832e4c8a55cf81e6 100644 --- "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/04.\345\274\200\345\217\221Bundle.md" +++ "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/02.\345\274\200\345\217\221\346\214\207\345\215\227/03.\345\274\200\345\217\221Bundle.md" @@ -1,6 +1,6 @@ --- title: 开发Bundle -permalink: /pages/000803 +permalink: /pages/0005000102 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # 开发Bundle @@ -60,7 +60,7 @@ demo 接下来根据您的业务需要,实现Bundle内部的功能代码,以及编译脚本,完成代码开发后,通过git将代码(包括bundle.json文件)提交到组件代码托管仓库中(如gitee)。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >``` >hpm init -t {templatename} -d {dir} {name} >``` @@ -70,7 +70,7 @@ demo hpm 除了提供了少量默认模板之外,其他模板均存储在服务器端,可以使用命令hpm search -t template 从服务器端搜索模板。 -![](/images/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001141641532.png) +![](/images/device-dev/bundles/figure/zh-cn_image_0000001141641532.png) ## 将现有工程定义为Bundle @@ -139,7 +139,7 @@ hpm gen-keys hpm publish ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 为避免Bundle名称冲突,发布的Bundle的名称需限定在组织范围内,即命名为@org\_name/bundle\_name的格式。 >- 你的账号也必须是org\_name内的成员,才可以发布或更新组织内的Bundle。 >- 发布的组件,需要通过安全及内容审核,才能正式生效。 @@ -214,7 +214,7 @@ $ hpm install -g @scope/the_tool │ └─ the_tool # <---引用的组件将会出现在这 ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 在项目安装的Bundle,在执行hpm编译命令时可以通过引用环境变量 DEP\_SCOPE\_bundle\_name,例如: >通过 hpm i @opensource/gn 安装后,可以编辑bundle.json中的编译脚本,如下: >``` @@ -276,7 +276,7 @@ executable("hello_world") { } ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- “executable”是gn内置模板,可以用“gn help executable ”查看使用方法。 >- “sources ”是源码路径,“include\_dirs ”是头文件路径。 @@ -290,7 +290,7 @@ hpm build 在完成一系列的编译动作后,显示build succeed。检查编译的输出结果: -![](/images/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001188041297.png) +![](/images/device-dev/bundles/figure/zh-cn_image_0000001188041297.png) ## 定义发行版 @@ -370,6 +370,6 @@ hpm config set DEP_HIBURN {hiburn_path} hpm run flash ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >上述仅描述如何定义bundle.json的样例,烧录工具取决于实际开发板所需的工具。 diff --git "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/05.HPM\344\273\213\347\273\215.md" "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/03.\345\274\200\345\217\221\347\244\272\344\276\213/01.HPM\344\273\213\347\273\215.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/05.HPM\344\273\213\347\273\215.md" rename to "website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/03.\345\274\200\345\217\221\347\244\272\344\276\213/01.HPM\344\273\213\347\273\215.md" index 018c60fdcc135f8870bb53920141c3b375b3b879..143ecf646349eec0e0c1b8e3851910e064bb4e98 100644 --- "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/05.HPM\344\273\213\347\273\215.md" +++ "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/03.\345\274\200\345\217\221\347\244\272\344\276\213/01.HPM\344\273\213\347\273\215.md" @@ -1,6 +1,6 @@ --- title: HPM介绍 -permalink: /pages/000804 +permalink: /pages/0005000200 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # HPM介绍 diff --git "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/06.\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/03.\345\274\200\345\217\221\347\244\272\344\276\213/02.\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" similarity index 88% rename from "website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/06.\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" rename to "website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/03.\345\274\200\345\217\221\347\244\272\344\276\213/02.\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" index cb030ff6c3ed9c55801e5338bbe47986c680e94f..d1fbdbe48c2339340c8a5877b9a0bd9473deeafb 100644 --- "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/06.\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" +++ "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/03.\345\274\200\345\217\221\347\244\272\344\276\213/02.\347\274\226\350\257\221\347\216\257\345\242\203\345\207\206\345\244\207.md" @@ -1,6 +1,6 @@ --- title: 编译环境准备 -permalink: /pages/000805 +permalink: /pages/0005000201 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # 编译环境准备 @@ -20,7 +20,7 @@ date: 2021-12-30 12:57:45 - [安装文件打包工具](#section77617165913) - [安装SCons](#section873135716233) -![](/images/zh-cn/device-dev/bundles/figure/3516dv300.png) +![](/images/device-dev/bundles/figure/3516dv300.png) ## linux服务器 @@ -77,7 +77,7 @@ http_proxy = http://your-proxy-server:port # 配置HTTP代理 https_proxy = http://your-proxy-server:port # 配置HTTPS代理 ``` -hpm-cli的命令介绍可以参考:[hpm操作命令](/pages/000800) +hpm-cli的命令介绍可以参考:[hpm操作命令](/pages/00050000) ## 安装python环境 @@ -90,7 +90,7 @@ sudo pip3 install setuptools sudo pip3 install kconfiglib # 建议安装kconfiglib 13.2.0+版本 ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >上述方式适用Hi3518和Hi3516两种平台,针对Hi3861平台采用以下方式安装python环境: >``` >sudo apt-get install python3.8 @@ -121,7 +121,7 @@ which mcopy # 如果没找到,执行以下命令安装 sudo apt-get install mtools ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >Hi3518和Hi3516两种平台需要安装打包工具,Hi3861平台不需要。 ## 安装SCons @@ -140,9 +140,9 @@ sudo apt-get install mtools ``` **图 1** SCons安装成功界面,版本要求3.0.4以上 - ![](/images/zh-cn/device-dev/bundles/figure/SCons安装成功界面-版本要求3-0-4以上-27.png "SCons安装成功界面-版本要求3-0-4以上-27") + ![](/images/device-dev/bundles/figure/SCons安装成功界面-版本要求3-0-4以上-27.png "SCons安装成功界面-版本要求3-0-4以上-27") ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >Hi3861平台需要安装SCons,Hi3518和Hi3516两种平台不需要。 diff --git "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/07.\346\223\215\344\275\234\345\256\236\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/03.\345\274\200\345\217\221\347\244\272\344\276\213/03.\346\223\215\344\275\234\345\256\236\344\276\213.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/07.\346\223\215\344\275\234\345\256\236\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/03.\345\274\200\345\217\221\347\244\272\344\276\213/03.\346\223\215\344\275\234\345\256\236\344\276\213.md" index 7406003d90a32d4d3661c1232dcfa7b2ce50fa9b..a50cc02cd4288cef7b735f2030e3d59c526090e4 100644 --- "a/website/docs/01.\346\226\207\346\241\243/09.\350\256\276\345\244\207\345\274\200\345\217\221-\347\273\204\344\273\266\345\274\200\345\217\221/07.\346\223\215\344\275\234\345\256\236\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/06.\344\270\223\351\242\230/01.HPMbundle/03.\345\274\200\345\217\221\347\244\272\344\276\213/03.\346\223\215\344\275\234\345\256\236\344\276\213.md" @@ -1,6 +1,6 @@ --- title: 操作实例 -permalink: /pages/000806 +permalink: /pages/0005000202 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # 操作实例 @@ -41,7 +41,7 @@ date: 2021-12-30 12:57:45 Installed. ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >Hi3516平台采用下述命令: >``` >hpm install @ohos/hispark_taurus diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/08.\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/08.\345\270\270\350\247\201\351\227\256\351\242\230.md" deleted file mode 100644 index a4d0c6f2b1f9f47067970e181a8df37c7906d926..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/08.\345\270\270\350\247\201\351\227\256\351\242\230.md" +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: 常见问题 -permalink: /pages/000600020107 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 常见问题 - -1. 是否存在一个全局变量,所有的页面都可以访问? - - 当前框架中不存在所有Page都可以访问的全局变量。 - -2. 如何获取dom中的元素? - - 通过ref属性获取dom中的元素,详细示例如下图所示;获取的元素只能使用它的方法,不能改变属性。 - - ``` - -
- - -
- - /* index.js */ - export default { - data: { - images:[ - {src:"common/frame1.png"}, - {src:"common/frame2.png"}, - {src:"common/frame3.png"} - ] - }, - handleClick(){ - //通过$refs属性获取对应的组件,在hml中,组件的ref属性要设置为animator - const animator = this.$refs.animator; - const state = animator.getState(); - if(state == "paused"){ - animator.resume(); - }else if(state == "stopped"){ - animator.start(); - }else{ - animator.pause(); - } - } - } - ``` - -3. 如何在页面间传值? - - 通过router.replace方法中的params参数来传递,参考代码如下: - - 第一个页面传递数据: - - ``` - router.replace({ - uri:'pages/detail/detail', //要跳转的页面uri - params:{transferData:this.data} //传递的数据,数据个数和名称开发者自己定义, - }); - ``` - - 第二个界面接受数据: - - ``` - onInit(){ - const data = this.transferData; //在onInit函数中接受传递的数据 - } - ``` - -4. list如何滚动到某个item? - - 通过list的scrollTo方法滚动到指定的item,参数是目标item的index。Index参数可以通过scrollend事件获取或者开发者指定。 - -5. text支持多行吗? - - text支持多行。通过回车键换行或者是不设置text的高度属性,由控件自动根据内容换行。 - -6. 为什么控件不显示? - - **现象描述** - - 开发者在hml文件中添加的控件无法显示 - - **可能原因** - - - 未设置width和height值; - - 样式设置错误。 - - **处理步骤** - - \(1\)检查是否设置width和height值,组件必须显式设置width和height值; - - \(2\)检查组件的样式设置是否正确。 - -7. 如何实现页面滑动? - - 实现页面滑动目前有三种方式:scroll(根组件大小超过屏幕的大小即自动实现scroll效果)、list、swiper。开发者可以参考开发文档查看三者的区别,并加以使用。 - -8. Left、Top为什么不生效? - - 除根节点外,Left、Top配合Stack组件使用才有效果。 - -9. 动态绑定为什么不生效? - - 在进行绑定时,必须先将要绑定的对象或者对象的属性进行定义,不能先绑定后定义。 - -10. 如何实现相对定位和绝对定位? - - 使用div、stack(top left属性)来实现相对和绝对定位。 - -11. 如何控制控件的显示与隐藏? - - 通过display、show和if来控制控件的显示与隐藏。区别在于:if为false时,组件会从VDOM中移除,而show仅是渲染时不可见,组件依然存在于VDOM中。 - -12. 使用Margin时,有什么注意事项? - - Stack组件不支持其子组件设置margin属性。 - -13. 使用事件订阅时,有什么注意事项? - - 在应用运行期间只存在一个page,所以router.replace跳转是先销毁前一个页面,然后在新创建一个界面。因此,如果涉及到事件订阅的页面,每次页面创建时要进行事件订阅,跳转离开界面前取消事件订阅。 - -14. 使用动态绑定时,有什么注意事项? - - 过多的动态绑定会消耗较多的内存,若非业务需要,尽量不要使用太多的动态绑定。 - -15. swiper loop属性如何生效? - - 去掉第一个组件或者去掉最后一个组件,剩余的长度大于swiper长度,loop生效。 - -16. 使用数组时,有什么注意事项? - - 数组元素不宜过多,尽量避免对大数组进行频繁操作。 - - diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/01.LED\345\244\226\350\256\276\346\216\247\345\210\266.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/01.LED\345\244\226\350\256\276\346\216\247\345\210\266.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/01.LED\345\244\226\350\256\276\346\216\247\345\210\266.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/01.LED\345\244\226\350\256\276\346\216\247\345\210\266.md" index ad21eb571c950374ee40a0b70e47a5f2afd103d7..696dfbf0fea3a6d1c4e9cb6ffa1571e62b9a592b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/01.LED\345\244\226\350\256\276\346\216\247\345\210\266.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/01.LED\345\244\226\350\256\276\346\216\247\345\210\266.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # LED外设控制 @@ -23,7 +23,7 @@ OpenHarmony WLAN模组基于Hi3861平台提供了丰富的外设操作能力, ## 开发 -1. 请先完成[《Hi3861快速入门》](/pages/0001000100#section19352114194115)。 +1. 请先完成[《Hi3861快速入门》](/pages/0001000300#section19352114194115)。 LED控制参考示例存放于applications/sample/wifi-iot/app/iothardware/led\_example.c文件中。 @@ -33,7 +33,7 @@ OpenHarmony WLAN模组基于Hi3861平台提供了丰富的外设操作能力, #define LED_TEST_GPIO 9 ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >开发板原理图,请开发者联系Hi3861购买渠道客服获取。 3. 使用GPIO前,需要完成GPIO管脚初始化,明确管脚用途,并创建任务,使LED周期性亮灭,达到闪烁的效果。 @@ -114,10 +114,10 @@ OpenHarmony WLAN模组基于Hi3861平台提供了丰富的外设操作能力, ## 验证 -编译过程请参考《[Hi3861快速入门-源码编译](/pages/0001000301#section191121332125319)》,烧录过程请参考《[Hi3861快速入门-镜像烧录](/pages/0001000301#section19458165166)》。 +编译过程请参考《[Hi3861快速入门-源码编译](/pages/extra/ecf53e/#section191121332125319)》,烧录过程请参考《[Hi3861快速入门-镜像烧录](/pages/extra/ecf53e/#section3288165814218)》。 完成以上两步后,按下RST键复位模组,可发现LED在周期性闪烁,与预期相符,验证完毕。 **图 1** LED闪烁图 -![](/images/zh-cn/device-dev/guide/figure/LED闪烁图.gif "LED闪烁图") +![](/images/device-dev/guide/figures/LED闪烁图.gif "LED闪烁图") diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/02.\351\233\206\346\210\220\344\270\211\346\226\271SDK.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/02.\351\233\206\346\210\220\344\270\211\346\226\271SDK.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/02.\351\233\206\346\210\220\344\270\211\346\226\271SDK.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/02.\351\233\206\346\210\220\344\270\211\346\226\271SDK.md" index 413cc5eefea3c8eecf06425fe2ff0368fe3ec133..ebe7032a53f99e13c94d20917a66e3a66a550c2c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/02.\351\233\206\346\210\220\344\270\211\346\226\271SDK.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/01.WLAN\350\277\236\346\216\245\347\261\273\344\272\247\345\223\201/02.\351\233\206\346\210\220\344\270\211\346\226\271SDK.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 集成三方SDK @@ -134,7 +134,7 @@ OpenHarmony已规划用于编译业务libs的目录domains/iot/link/libbuild/ 完成以上3点后,需在代码根目录下执行命令“hb build -T //domains/iot/link:iot”,等待执行完成,检查out/hispark\_pegasus/wifiiot\_hispark\_pegasus/libs/目录下是否生成了目标库文件。 -![](/images/zh-cn/device-dev/guide/figure/zh-cn_image_0000001078563230.png) +![](/images/device-dev/guide/figures/device-wlan-sdk-files.png) 将库文件拷贝到device/hisilicon/hispark\_pegasus/sdk\_liteos/3rd\_sdk/demolink/libs/ 目录下,并将domains/iot/link/libbuild/ 目录中的.c和.h文件清除。 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/01.\346\246\202\350\277\260.md" similarity index 72% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/01.\346\246\202\350\277\260.md" index 4be641606c11e04cdf5840bcad0971e97be851ec..7e542d031c51b94846755f06c9515c0d4438683b 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/01.\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- -title: 摄像头控制概述 -permalink: /pages/0006000100 +title: 概述 +permalink: /pages/000600010000 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 概述 @@ -17,7 +17,7 @@ date: 2021-12-30 12:57:44 开发者可通过执行示例应用,对开发板的外设控制有了更深入了解后,可使用开发板完成摄像头等设备。 -若开发者想先查看示例效果,请进入[应用实例](/pages/0006000103)。如需自定义应用行为,可参考下节“示例开发”对示例代码进行修改。 +若开发者想先查看示例效果,请进入[应用实例](/pages/000600010002)。如需自定义应用行为,可参考下节“示例开发”对示例代码进行修改。 -相机开发基本概念可参考:[相机开发概述](/pages/00040300)。 +相机开发基本概念可参考:[相机开发概述](/pages/0004050000)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/01.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/01.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" index aa0c657c5a255e57bcabb4eaf6cb0a3cab823fe1..0bc5690f8a2fdbcd383baa0906c3026c474a646c 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/01.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 拍照开发指导 -permalink: /pages/0006000101 +permalink: /pages/00060001000100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 拍照开发指导 @@ -323,7 +323,7 @@ date: 2021-12-30 12:57:44 }; ``` -3. 实现相机状态回调的派生类,当相机状态发生变化(配置成功/失败,创建成功/失败\)时,自定义操作。 +3. 实现相机状态回调的派生类,自定义相机状态发生变化(配置成功/失败,创建成功/失败\)时的操作。 ``` class SampleCameraStateMng : public CameraStateCallback { @@ -376,7 +376,7 @@ date: 2021-12-30 12:57:44 camKit->CreateCamera(camId, CamStateMng, eventHdlr); ``` -6. 根据[步骤1](#zh-cn_topic_0000001052170554_li378084192111)、[步骤2](#zh-cn_topic_0000001052170554_li8716104682913)、[步骤3](#zh-cn_topic_0000001052170554_li6671035102514)中的回调设计,camera实例创建成功后会进行配置操作,主流程中app需要设计同步机制。 +6. 根据[步骤1](#zh-cn_topic_0000001052170554_li378084192111)、[步骤2](#zh-cn_topic_0000001052170554_li8716104682913)、[步骤3](#zh-cn_topic_0000001052170554_li6671035102514)中的回调设计,同步等待 OnCreated 回调拿到 cam\_ 之后,进行相关操作。 ``` void OnCreated(Camera &c) override diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/02.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/02.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" index 95c61dfb3ef9d4435330ba0796b5da173b036262..78e5062b57abbfb3f9d8cff4dcaa596115f1dcf8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/02.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 录像开发指导 -permalink: /pages/0006000102 +permalink: /pages/00060001000101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 录像开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/04.\345\272\224\347\224\250\345\256\236\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/03.\345\272\224\347\224\250\345\256\236\344\276\213.md" similarity index 74% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/04.\345\272\224\347\224\250\345\256\236\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/03.\345\272\224\347\224\250\345\256\236\344\276\213.md" index 1215a7013d5759102d638041fb779b5c6ebcae49..db27629469cee31a8d2410f70d95c2e58020e105 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/04.\345\272\224\347\224\250\345\256\236\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/02.\346\227\240\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/03.\345\272\224\347\224\250\345\256\236\344\276\213.md" @@ -1,6 +1,6 @@ --- title: 应用实例 -permalink: /pages/0006000103 +permalink: /pages/000600010002 navbar: true sidebar: true prev: true @@ -9,11 +9,11 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 应用实例 -- 开发板介绍、编译烧录、运行镜像等操作请参考[Hi3518快速入门](/pages/0001000102#section14815247616),编译结果包含示例,结果文件为out/ipcamera\_hi3518ev300/dev\_tools/bin/camera\_sample,可将文件通过读卡器复制至TF卡中,或者修改camera\_sample的编译脚本将结果文件复制至rootfs.img中。 +- 开发板介绍、编译烧录、运行镜像等操作请参考[Hi3518快速入门](/pages/0001000302#section14815247616),编译结果包含示例,结果文件为out/ipcamera\_hi3518ev300/dev\_tools/bin/camera\_sample,可将文件通过读卡器复制至TF卡中,或者修改camera\_sample的编译脚本将结果文件复制至rootfs.img中。 修改applications/sample/camera/media/BUILD.gn中的output\_dir。 @@ -24,35 +24,35 @@ date: 2021-12-30 12:57:44 - 相机示例代码为applications/sample/camera/media/camera\_sample.cpp。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** + >![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >实例运行拍照和录像功能需要插入TF卡\(最大容量支持128GB\),系统启动后时自动将TF卡挂载至/sdcard目录,如果在启动后插入则需要手动挂载。查看拍照和录像内容可将TF卡中内容复制到电脑中进行查看,预览功能无需TF卡。 1. 通过cd命令进入可执行程序的末端路径,启动camera\_sample,执行命令如下图。 **图 1** 启动示例 - ![](/images/zh-cn/device-dev/guide/figure/启动示例.png "启动示例") + ![](/images/device-dev/guide/figures/启动示例.png "启动示例") 运行后的控制命令如串口打印所示,按s键停止当前操作(包括录像和预览),按q键退出示例程序。 2. 按1进行拍照,拍照的文件格式为jpg,存储在/sdcard,文件名Capture\* **图 2** 输入拍照指令后串口打印日志 - ![](/images/zh-cn/device-dev/guide/figure/输入拍照指令后串口打印日志.png "输入拍照指令后串口打印日志") + ![](/images/device-dev/guide/figures/输入拍照指令后串口打印日志.png "输入拍照指令后串口打印日志") 若想查看保存文件,可在退出程序后进入文件系统查看,退出后重新进入请回到步骤1。 **图 3** 查看文件图 - ![](/images/zh-cn/device-dev/guide/figure/查看文件图.png "查看文件图") + ![](/images/device-dev/guide/figures/查看文件图.png "查看文件图") 3. 按2进行录像,录像的文件格式为mp4,存储在/sdcard,文件名Record\*,按s键停止 **图 4** 输入录像指令后串口打印日志 - ![](/images/zh-cn/device-dev/guide/figure/输入录像指令后串口打印日志.png "输入录像指令后串口打印日志") + ![](/images/device-dev/guide/figures/输入录像指令后串口打印日志.png "输入录像指令后串口打印日志") 4. 按q键退出 **图 5** 输出退出指令后串口打印日志 - ![](/images/zh-cn/device-dev/guide/figure/输出退出指令后串口打印日志.png "输出退出指令后串口打印日志") + ![](/images/device-dev/guide/figures/输出退出指令后串口打印日志.png "输出退出指令后串口打印日志") diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/01.\346\246\202\350\277\260.md" similarity index 86% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/01.\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/01.\346\246\202\350\277\260.md" index 4b7d388cf914ab4f03902bda633830cf63e5e764..479b5a2868c83d10017cba32483d14246ab5a4a1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/01.\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/01.\346\246\202\350\277\260.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 概述 @@ -17,7 +17,7 @@ date: 2021-12-30 12:57:44 通过本文档,开发者能够对OpenHarmony的摄像控制有更深入的了解,可参照本例尝试完成“智能猫眼”、“智能后视镜”、“智能带屏音箱”等设备的开发。 -若开发者想先查看示例效果,请进入[应用实例](/pages/000600020004)。如需自定义应用行为,可参考下节“示例开发”对示例代码进行修改。 +若开发者想先查看示例效果,请进入[应用实例](/pages/000600020002)。如需自定义应用行为,可参考下节“示例开发”对示例代码进行修改。 -相机应用开发的基本概念请参考:[相机开发概述](/pages/00040300)。 +相机应用开发的基本概念请参考:[相机开发概述](/pages/0004050000)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/01.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/01.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" index 4a5199524048f5bde62a98909d9bbcc5553a1ac2..9085d03a3dcc94eee96f01a5ac13789b8742d36d 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/02.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/01.\346\213\215\347\205\247\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 拍照开发指导 -permalink: /pages/000600020001 +permalink: /pages/00060002000100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 拍照开发指导 @@ -323,7 +323,7 @@ date: 2021-12-30 12:57:44 }; ``` -3. 实现相机状态回调的派生类,当相机状态发生变化(配置成功/失败,创建成功/失败\)时,自定义操作。 +3. 实现相机状态回调的派生类,自定义相机状态发生变化(配置成功/失败,创建成功/失败\)时的操作。 ``` class SampleCameraStateMng : public CameraStateCallback { @@ -376,7 +376,7 @@ date: 2021-12-30 12:57:44 camKit->CreateCamera(camId, CamStateMng, eventHdlr); ``` -6. 根据[步骤1](#zh-cn_topic_0000001052170554_li378084192111)、[步骤2](#zh-cn_topic_0000001052170554_li8716104682913)、[步骤3](#zh-cn_topic_0000001052170554_li6671035102514)中的回调设计,camera实例创建成功后会进行配置操作,主流程中app需要设计同步机制。 +6. 根据[步骤1](#zh-cn_topic_0000001052170554_li378084192111)、[步骤2](#zh-cn_topic_0000001052170554_li8716104682913)、[步骤3](#zh-cn_topic_0000001052170554_li6671035102514)中的回调设计,同步等待 OnCreated 回调拿到 cam\_ 之后,进行相关操作。 ``` void OnCreated(Camera &c) override diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/02.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/02.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" index 6cdde24d8fd44e9561d7df1417381310cb78c87c..e4464e99face17f95500ef41082b6bea2a8afb13 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/03.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/02.\345\275\225\345\203\217\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 录像开发指导 -permalink: /pages/000600020002 +permalink: /pages/00060002000101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 录像开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/04.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/03.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/04.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/03.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" index 58fd190c7b4d260bf0c556ce351cc19f4709a565..dc5b35e844e9fbd132148beab7ed083c77092fab 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/04.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/02.\347\244\272\344\276\213\345\274\200\345\217\221/03.\351\242\204\350\247\210\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: 预览开发指导 -permalink: /pages/000600020003 +permalink: /pages/00060002000102 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 预览开发指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/05.\345\272\224\347\224\250\345\256\236\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/03.\345\272\224\347\224\250\345\256\236\344\276\213.md" similarity index 73% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/05.\345\272\224\347\224\250\345\256\236\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/03.\345\272\224\347\224\250\345\256\236\344\276\213.md" index f25ad494ca87cf15622f6cb274393b764664c8bb..30b6579c7e19f4b8351a09c3d2254d735a56abe3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266\346\246\202\350\277\260/05.\345\272\224\347\224\250\345\256\236\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/01.\345\261\217\345\271\225\345\222\214\346\221\204\345\203\217\345\244\264\346\216\247\345\210\266/03.\345\272\224\347\224\250\345\256\236\344\276\213.md" @@ -1,6 +1,6 @@ --- title: 应用实例 -permalink: /pages/000600020004 +permalink: /pages/000600020002 navbar: true sidebar: true prev: true @@ -9,16 +9,16 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 应用实例 -本示例将运行源码中的camera示例代码,通过本示例可以实现对开发板拍照、录像及预览功能的控制。 +本示例将运行源码中的camera示例代码,通过本示例可以实现使用开发板进行拍照、录像及预览等功能。 - 本示例源码路径为“applications/sample/camera/media/camera\_sample.cpp”。 -- 在运行本示例前需先完成编译烧录、运行镜像等步骤,相关操作请参考[Hi3516快速入门](/pages/0001000101#section26131214194212)。 +- 在运行本示例前需先完成编译烧录、运行镜像等步骤,相关操作请参考[Hi3516快速入门](/pages/0001000301#section26131214194212)。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >开发板启动后默认会加载launcher应用,应用的图形界面默认显示在媒体图层上方,会影响camera\_sample的演示结果,因此需要在编译或是打包时去掉launcher应用。 >**修改方法:**将“build/lite/components/applications.json”中camera\_sample\_app组件的targets中"//applications/sample/camera/launcher:launcher\_hap"整行注释或删除。 @@ -31,7 +31,7 @@ date: 2021-12-30 12:57:44 重新执行源码仓编译并烧写入单板后,可在单板bin目录下找到camera\_sample文件。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** + >![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >实例运行拍照和录像功能需要插入TF卡\(最大容量支持128GB\),系统启动后自动将TF卡挂载至/sdcard目录,如果在启动后插入则需要手动挂载。查看拍照和录像内容可将TF卡中内容复制到电脑中进行查看,预览功能无需TF卡。 - 接下来可通过以下步骤运行示例: @@ -39,38 +39,38 @@ date: 2021-12-30 12:57:44 1. 通过cd命令进入可执行程序的末端路径,启动camera\_sample,执行命令如下图。 **图 1** 启动示例 - ![](/images/zh-cn/device-dev/guide/figure/启动示例.png "启动示例") + ![](/images/device-dev/guide/figures/启动示例.png "启动示例") 运行后的控制命令如串口打印所示,按s键停止当前操作(包括录像和预览),按q键退出示例程序。 2. 按1进行拍照,拍照的文件格式为jpg,存储在/sdcard,文件名Capture\* **图 2** 输入拍照指令后串口打印日志 - ![](/images/zh-cn/device-dev/guide/figure/输入拍照指令后串口打印日志.png "输入拍照指令后串口打印日志") + ![](/images/device-dev/guide/figures/输入拍照指令后串口打印日志.png "输入拍照指令后串口打印日志") 若想查看保存文件,可在退出程序后进入文件系统查看,退出后重新进入请回到步骤1。 **图 3** 查看文件图 - ![](/images/zh-cn/device-dev/guide/figure/查看文件图.png "查看文件图") + ![](/images/device-dev/guide/figures/查看文件图.png "查看文件图") 3. 按2进行录像,录像的文件格式为mp4,存储在/sdcard,文件名Record\*,按s键停止 **图 4** 输入录像指令后串口打印日志 - ![](/images/zh-cn/device-dev/guide/figure/输入录像指令后串口打印日志.png "输入录像指令后串口打印日志") + ![](/images/device-dev/guide/figures/输入录像指令后串口打印日志.png "输入录像指令后串口打印日志") 4. 按3进行预览,预览图像直接送至显示屏,按s键停止。 **图 5** 输入预览指令后串口打印日志 - ![](/images/zh-cn/device-dev/guide/figure/输入预览指令后串口打印日志.png "输入预览指令后串口打印日志") + ![](/images/device-dev/guide/figures/输入预览指令后串口打印日志.png "输入预览指令后串口打印日志") 预览效果如下 **图 6** 预览效果 - ![](/images/zh-cn/device-dev/guide/figure/预览效果.jpg "预览效果") + ![](/images/device-dev/guide/figures/预览效果.jpg "预览效果") 5. 按q键退出 **图 7** 输出退出指令后串口打印日志 - ![](/images/zh-cn/device-dev/guide/figure/输出退出指令后串口打印日志.png "输出退出指令后串口打印日志") + ![](/images/device-dev/guide/figures/输出退出指令后串口打印日志.png "输出退出指令后串口打印日志") diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/01.\346\246\202\350\277\260.md" similarity index 77% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/01.\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/01.\346\246\202\350\277\260.md" index a8b4f95803df2adb948c83d2d64b3f344cd17a42..7043ad1cf0528d5b9d1f7324c71be4ecb7fe6dc1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/01.\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/01.\346\246\202\350\277\260.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 概述 @@ -21,8 +21,6 @@ date: 2021-12-30 12:57:44 空气质量监测App是一款展示城市空气质量信息的应用,有两个页面组成:首页和详情页,在DevEco Studio模拟器中的显示效果如下图所示: -**图 1** 空气质量监测 App显示效果图 - - -![](/images/zh-cn/device-dev/guide/figure/Video_2020-07-25_173141.gif) +**图 1** 空气质量监测 App显示效果图 +![](/images/device-dev/guide/figures/空气质量监测-App显示效果图.gif "空气质量监测-App显示效果图") diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/02.\345\274\200\345\217\221\345\207\206\345\244\207.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/02.\345\274\200\345\217\221\345\207\206\345\244\207.md" similarity index 93% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/02.\345\274\200\345\217\221\345\207\206\345\244\207.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/02.\345\274\200\345\217\221\345\207\206\345\244\207.md" index 8f160b619caff89cf596cad5880f265e1409bc81..a78da43601e50b67290192f3a53bdaf192abeae5 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/02.\345\274\200\345\217\221\345\207\206\345\244\207.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/02.\345\274\200\345\217\221\345\207\206\345\244\207.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 开发准备 @@ -28,7 +28,7 @@ date: 2021-12-30 12:57:44 2. 选择“Smart Vision”下的“Empty Feature Ability”模板。 - ![](/images/zh-cn/device-dev/guide/figure/zh-cn_image_0000001082434703.png) + ![](/images/device-dev/guide/figures/empty-feature-ability.png) 3. 点击**Next**,进入到工程配置阶段,需要根据向导配置工程的基本信息。 - **Project Name**:工程的名称,可以自定义。 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/03.\346\267\273\345\212\240\351\241\265\351\235\242.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/03.\346\267\273\345\212\240\351\241\265\351\235\242.md" similarity index 76% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/03.\346\267\273\345\212\240\351\241\265\351\235\242.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/03.\346\267\273\345\212\240\351\241\265\351\235\242.md" index 44abf7daf1d5b09cfb48310856cb5dcdf410c260..12f695ae74f558b4da1ccd4e5af27b17e83d3525 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/03.\346\267\273\345\212\240\351\241\265\351\235\242.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/03.\346\267\273\345\212\240\351\241\265\351\235\242.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:33 --- # 添加页面 @@ -21,7 +21,7 @@ date: 2021-12-30 12:57:44 空气质量监测App包含两个界面(Page),工程创建完成后会生成一个名为index的Page,可以作为首页。工程目录如下图所示: **图 1** 工程目录 -![](/images/zh-cn/device-dev/guide/figure/工程目录.png "工程目录") +![](/images/device-dev/guide/figures/工程目录.png "工程目录") ## 创建详情页 @@ -30,18 +30,18 @@ date: 2021-12-30 12:57:44 1. pages目录右键 ,弹出的菜单中选择New、JS Page。 **图 2** 添加页面 - ![](/images/zh-cn/device-dev/guide/figure/添加页面.png "添加页面") + ![](/images/device-dev/guide/figures/添加页面.png "添加页面") 2. 输入Page名称。 **图 3** 输入页面名称 - ![](/images/zh-cn/device-dev/guide/figure/输入页面名称.png "输入页面名称") + ![](/images/device-dev/guide/figures/输入页面名称.png "输入页面名称") 3. 确认创建结果。 详情页创建完成后应用工程目录如下图所示,每个Page包括三个文件:布局文件hml、样式文件css、业务逻辑代码js。 **图 4** 完整工程目录 - ![](/images/zh-cn/device-dev/guide/figure/完整工程目录.png "完整工程目录") + ![](/images/device-dev/guide/figures/完整工程目录.png "完整工程目录") diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/04.\345\274\200\345\217\221\351\246\226\351\241\265.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/04.\345\274\200\345\217\221\351\246\226\351\241\265.md" similarity index 97% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/04.\345\274\200\345\217\221\351\246\226\351\241\265.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/04.\345\274\200\345\217\221\351\246\226\351\241\265.md" index e2be434d0757703cf49830a23cdd05055beac514..48ed7eed87056f149b3a251f4da3689956235876 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/04.\345\274\200\345\217\221\351\246\226\351\241\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/04.\345\274\200\345\217\221\351\246\226\351\241\265.md" @@ -9,13 +9,13 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # 开发首页 应用首页主要展示城市的空气质量概况。首页总共有两屏(可以根据需求设置多屏),每屏显示一个城市的空气质量信息:主要包括AQI指数、城市名称、污染物指数、更新时间和信息来源等数据。 -从第一章节中的[显示效果图](/pages/000600020100#fig18250512195914)分析可知,首页由三部分组成: +从第一章节中的[显示效果图](/pages/000600020100)分析可知,首页由三部分组成: - 标题栏:位于页面正上方,位置固定,包括应用退出按钮和页面标题。 - 信息栏:主要展示城市的空气信息指标等内容;该页面根据用户需求可设置多屏,且能循环滑动。 @@ -96,7 +96,7 @@ date: 2021-12-30 12:57:45 代码编写完成后,在模拟器中运行项目,显示效果如下图所示: **图 1** 标题栏效果 - ![](/images/zh-cn/device-dev/guide/figure/标题栏效果.png "标题栏效果") + ![](/images/device-dev/guide/figures/标题栏效果.png "标题栏效果") 3. 实现城市空气质量信息的多屏左右滑动,需要使用“swiper”组件。 @@ -188,7 +188,7 @@ date: 2021-12-30 12:57:45 代码编写完成后,模拟器运行效果如下: **图 2** 标题栏和信息栏效果 - ![](/images/zh-cn/device-dev/guide/figure/标题栏和信息栏效果.png "标题栏和信息栏效果") + ![](/images/device-dev/guide/figures/标题栏和信息栏效果.png "标题栏和信息栏效果") 5. 添加页面位置指示器:由于当前swiper不支持设置indicator,需要开发者自己来实现该效果。在根节点中添加一个子组件div,并设置相应样式;然后在该div中添加两个子组件div,设置两个div的border-radius,并在swiper滑动事件中动态改变对应div的背景色来实现该效果。 @@ -200,7 +200,7 @@ date: 2021-12-30 12:57:45 ``` **图 3** 页面位置指示器效果图 - ![](/images/zh-cn/device-dev/guide/figure/页面位置指示器效果图.png "页面位置指示器效果图") + ![](/images/device-dev/guide/figures/页面位置指示器效果图.png "页面位置指示器效果图") 6. 所有组件设置样式、动画效果和数据动态绑定,完整代码如下所示: diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\274\200\345\217\221\350\257\246\346\203\205\351\241\265.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\274\200\345\217\221\350\257\246\346\203\205\351\241\265.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\274\200\345\217\221\350\257\246\346\203\205\351\241\265.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\274\200\345\217\221\350\257\246\346\203\205\351\241\265.md" index 1adab64ce2a0dfd69f4dccc427b6a41b6d69f6bd..b9581c559d4383f536ef360de649a1cd72b0e5d1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\274\200\345\217\221\350\257\246\346\203\205\351\241\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\274\200\345\217\221\350\257\246\346\203\205\351\241\265.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # 开发详情页 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/06.\350\260\203\350\257\225\346\211\223\345\214\205.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/06.\350\260\203\350\257\225\346\211\223\345\214\205.md" similarity index 96% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/06.\350\260\203\350\257\225\346\211\223\345\214\205.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/06.\350\260\203\350\257\225\346\211\223\345\214\205.md" index 9b62f7d6d41d4bb2fcdd6860829c4cf7ac24a3ef..87bcb4e393800aea9535af991b6aa5de4c2e1948 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/06.\350\260\203\350\257\225\346\211\223\345\214\205.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/06.\350\260\203\350\257\225\346\211\223\345\214\205.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # 调试打包 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/07.\347\234\237\346\234\272\350\277\220\350\241\214.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/07.\347\234\237\346\234\272\350\277\220\350\241\214.md" similarity index 90% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/07.\347\234\237\346\234\272\350\277\220\350\241\214.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/07.\347\234\237\346\234\272\350\277\220\350\241\214.md" index d74b538281d988fa66f78b06fb0fd80fb9965840..904987b175e82c857f29e0cad7c5672bec2ffbe1 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/07.\347\234\237\346\234\272\350\277\220\350\241\214.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/07.\347\234\237\346\234\272\350\277\220\350\241\214.md" @@ -9,11 +9,11 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # 真机运行 -应用编译打包后即可安装到开发板。安装应用前需要先完成[DevEco Device Tool的安装配置](https://device.harmonyos.com/cn/docs/ide/user-guides/service_introduction-0000001050166905),然后将OpenHarmony烧录到开发板并运行。编译烧录、运行镜像的基本操作请参考快速入门手册:[Hi3516快速入门](/pages/0001000101#section26131214194212)。完成镜像运行,系统正常启动后,执行如下步骤安装或卸载三方应用。 +应用编译打包后即可安装到开发板。安装应用前需要先完成[DevEco Device Tool的安装配置](https://device.harmonyos.com/cn/docs/ide/user-guides/service_introduction-0000001050166905),然后将OpenHarmony烧录到开发板并运行。编译烧录、运行镜像的基本操作请参考快速入门手册:[Hi3516快速入门](/pages/0001000301#section26131214194212)。完成镜像运行,系统正常启动后,执行如下步骤安装或卸载三方应用。 1. 将IDE编译的未签名应用安装包和安装工具(镜像文件生成目录中的dev\_tools)放在sdcard中,将sdcard插入开发板卡槽。 2. 应用安装默认要校验签名,需要执行以下命令,关闭签名校验。 @@ -33,7 +33,7 @@ date: 2021-12-30 12:57:45 4. 应用安装完成后,可点击桌面应用图标启动应用,进行操作。 **图 1** 桌面 - ![](/images/zh-cn/device-dev/guide/figure/桌面.png "桌面") + ![](/images/device-dev/guide/figures/桌面.png "桌面") 5. 卸载应用(可选)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/08.\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/08.\345\270\270\350\247\201\351\227\256\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..ebe9771c67cb7b694fc93ca7b3b04ba2dcec7560 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\270\246\345\261\217\346\221\204\345\203\217\345\244\264\347\261\273\344\272\247\345\223\201/02.\350\247\206\350\247\211\345\272\224\347\224\250\345\274\200\345\217\221/08.\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -0,0 +1,161 @@ +--- +title: 常见问题 +permalink: /pages/000600020107 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:33 +--- +# 常见问题 + +- [视觉应用常见问题](#section147421736145813) + - [是否存在一个全局变量,所有的页面都可以访问?](#section294382614018) + - [如何获取dom中的元素](#section1423713435019) + - [如何在页面间传值?](#section119822143117) + - [list如何滚动到某个item?](#section188663819111) + - [text支持多行吗?](#section205741157418) + - [为什么控件不显示?](#section1345810151025) + - [如何实现页面滑动?](#section1724052813218) + - [Left、Top为什么不生效?](#section34659571520) + - [动态绑定为什么不生效?](#section1758881511313) + - [如何实现相对定位和绝对定位?](#section1378730235) + - [如何控制控件的显示与隐藏?](#section1243424718312) + - [使用Margin时,有什么注意事项?](#section7923357414) + - [使用事件订阅时,有什么注意事项?](#section91641925548) + - [使用动态绑定时,有什么注意事项?](#section1292412431744) + - [swiper loop属性如何生效?](#section1136434952) + - [使用数组时,有什么注意事项?](#section1979819133510) + + +## 视觉应用常见问题 + +### 是否存在一个全局变量,所有的页面都可以访问? + +当前框架中不存在所有Page都可以访问的全局变量。 + +### 如何获取dom中的元素 + +通过ref属性获取dom中的元素,详细示例如下图所示;获取的元素只能使用它的方法,不能改变属性。 + +``` + +
+ + +
+ +/* index.js */ +export default { + data: { + images:[ + {src:"common/frame1.png"}, + {src:"common/frame2.png"}, + {src:"common/frame3.png"} + ] + }, + handleClick(){ + //通过$refs属性获取对应的组件,在hml中,组件的ref属性要设置为animator + const animator = this.$refs.animator; + const state = animator.getState(); + if(state == "paused"){ + animator.resume(); + }else if(state == "stopped"){ + animator.start(); + }else{ + animator.pause(); + } + } +} +``` + +### 如何在页面间传值? + +通过router.replace方法中的params参数来传递,参考代码如下: + +第一个页面传递数据: + +``` +router.replace({ + uri:'pages/detail/detail', //要跳转的页面uri + params:{transferData:this.data} //传递的数据,数据个数和名称开发者自己定义, +}); +``` + +第二个界面接受数据: + +``` +onInit(){ + const data = this.transferData; //在onInit函数中接受传递的数据 +} +``` + +### list如何滚动到某个item? + +通过list的scrollTo方法滚动到指定的item,参数是目标item的index。Index参数可以通过scrollend事件获取或者开发者指定。 + +### text支持多行吗? + +text支持多行。通过回车键换行或者是不设置text的高度属性,由控件自动根据内容换行。 + +### 为什么控件不显示? + +**现象描述** + +开发者在hml文件中添加的控件无法显示 + +**可能原因** + +- 未设置width和height值; +- 样式设置错误。 + +**处理步骤** + +\(1\)检查是否设置width和height值,组件必须显式设置width和height值; + +\(2\)检查组件的样式设置是否正确。 + +### 如何实现页面滑动? + +实现页面滑动目前有三种方式:scroll(根组件大小超过屏幕的大小即自动实现scroll效果)、list、swiper。开发者可以参考开发文档查看三者的区别,并加以使用。 + +### Left、Top为什么不生效? + +除根节点外,Left、Top配合Stack组件使用才有效果。 + +### 动态绑定为什么不生效? + +在进行绑定时,必须先将要绑定的对象或者对象的属性进行定义,不能先绑定后定义 + +### 如何实现相对定位和绝对定位? + +使用div、stack(top left属性)来实现相对和绝对定位。 + +### 如何控制控件的显示与隐藏? + +通过display、show和if来控制控件的显示与隐藏。区别在于:if为false时,组件会从VDOM中移除,而show仅是渲染时不可见,组件依然存在于VDOM中。 + +### 使用Margin时,有什么注意事项? + +Stack组件不支持其子组件设置margin属性。 + +### 使用事件订阅时,有什么注意事项? + +在应用运行期间只存在一个page,所以router.replace跳转是先销毁前一个页面,然后在新创建一个界面。因此,如果涉及到事件订阅的页面,每次页面创建时要进行事件订阅,跳转离开界面前取消事件订阅。 + +### 使用动态绑定时,有什么注意事项? + +过多的动态绑定会消耗较多的内存,若非业务需要,尽量不要使用太多的动态绑定。 + +### swiper loop属性如何生效? + +去掉第一个组件或者去掉最后一个组件,剩余的长度大于swiper长度,loop生效。 + +### 使用数组时,有什么注意事项? + +数组元素不宜过多,尽量避免对大数组进行频繁操作。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/01.\346\227\266\351\222\237\345\272\224\347\224\250\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/01.\346\227\266\351\222\237\345\272\224\347\224\250\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/01.\346\227\266\351\222\237\345\272\224\347\224\250\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/01.\346\227\266\351\222\237\345\272\224\347\224\250\345\274\200\345\217\221\346\214\207\345\257\274.md" index 8d0c53e19ab9bd474722b1c394585bd761d371a9..f9a1055c72975f31c37ae509d55b83618ff15284 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/01.\346\227\266\351\222\237\345\272\224\347\224\250\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/01.\346\227\266\351\222\237\345\272\224\347\224\250\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # 时钟应用开发指导 @@ -29,20 +29,18 @@ date: 2021-12-30 12:57:45 时钟App是一款显示实时时间的应用,显示效果如下图所示: -**图 1** 时钟应用显示效果图 - - -![](/images/zh-cn/device-dev/guide/figure/Clock.png) +**图 1** 时钟应用显示效果图 +![](/images/device-dev/guide/figures/时钟应用显示效果图.png "时钟应用显示效果图") ## 开发准备 -首先需要下载和配置DevEco Studio,具体操作请参考[DevEco Studio 使用指南](/pages/extra/5aac88/)。 +首先需要下载和配置DevEco Studio,具体操作请参考[DevEco Studio 使用指南](/pages/extra/0c0b90/)。 ## 开发步骤 应用的功能是通过表盘和数字显示实时时间。 -从[显示效果图](/pages/00060100#fig7763172132019)分析可知,页面由两个部分组成: +从[显示效果图](#fig176772511186)分析可知,页面由两个部分组成: - 表盘栏:主要展示一个动态的钟表,且钟表指针能准确转动。 - 数字时间栏:主要以数字形式显示当前时间。 @@ -270,7 +268,7 @@ date: 2021-12-30 12:57:45 ## 签名打包 -代码编写完成后,在真机设备上运行应用,需要先对应用进行签名,然后再进行打包,具体操作请参考[签名打包指导](/pages/00090003)。 +代码编写完成后,在真机设备上运行应用,需要先对应用进行签名,然后再进行打包,具体操作请参考[签名打包指导](/pages/00070504)。 ## 真机运行 @@ -287,11 +285,7 @@ date: 2021-12-30 12:57:45 2. 启动cmd命令窗口,执行以下命令,推送hap应用包到设备目录下并安装。 ``` - hdc smode - hdc target mount - hdc file send clock.hap /data/clock.hap - hdc shell chmod 666 /data/clock.hap - hdc shell bm install -p /data/clock.hap + hdc install clock.hap ``` 3. 启动应用。执行以下命令,其中ohos.samples.clock为应用包名,MainAbility为应用启动的Ability。 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" index fc07f1cf679bfe15d89a8ab56c9191184ce53c6a..4a5604d52e478aff1c98bd08ebb6c591e8f267e8 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # 平台驱动开发示例 @@ -27,29 +27,21 @@ date: 2021-12-30 12:57:45 本文档将以I2C驱动为例,介绍如何基于HDF驱动框架完成平台驱动开发。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >本例仅作为平台驱动开发示例参考,开发者不可直接用于商用集成。 HDF驱动框架为常用外围设备提供了标准的驱动框架,驱动开发者只需将驱动适配至HDF驱动框架,即可通过HDF驱动框架提供的接口操作外围设备。 -本文以I2C为例。其时序流程如[图1](#fig148041484161)所示。 +本文以I2C为例。其时序流程如[图1](#fig9596628607)所示。 -**图 1** I2C时序流程图 - - -![](/images/zh-cn/device-dev/guide/figure/zh-cn_image_0000001169991055.png) - -- User Business:用户业务驱动。 -- i2cManagerEntry:I2C管理器入口,注册I2cManager到HDF驱动框架。 -- I2cManager:I2C管理器,管理I2C控制器。 -- I2cCntlr:I2C控制器。 -- i2cDriverEntry:I2C控制器入口,注册I2cCntlr到HDF驱动框架。 +**图 1** I2C时序流程图 +![](/images/device-dev/guide/figures/I2C时序流程图.png "I2C时序流程图") ## 环境准备 环境准备具体操作请参考[标准系统基础环境搭建](/pages/00010100)。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >本示例针对OpenHarmony轻量系统、小型系统、标准系统都适用,本文以标准系统为例。其他系统的开发者可参考对应系统的指导文档进行环境搭建。 ## 开发 @@ -118,7 +110,7 @@ HDF驱动框架为常用外围设备提供了标准的驱动框架,驱动开 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/device-dev/public_sys-resources/icon-caution.gif) **注意:** >本例程涉及的文件路径均作为演示,驱动开发者应根据实际情况确定具体的源文件存放位置。 ### 实例化驱动入口 @@ -169,12 +161,12 @@ HDF_INIT(g_sampleI2cDriverEntry); ``` - >![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** + >![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >配置文件中的priority(取值范围为整数0到200)是用来表示host和驱动的优先级,不同的host内的驱动,host的priority值越小,驱动加载优先级越高;同一个host内驱动的priority值越小,加载优先级越高,驱动的priority值相同则不保证加载顺序。 2. 添加配置参数(可选)。 - 有时驱动可能会需要私有配置信息,以确保寄存器的配置可以满足不同产品的需求。如需要私有配置信息,则可以添加一个驱动的配置文件,用来存放一些驱动的默认配置信息,HDF框架在加载驱动的时候,会将对应的配置信息获取并保存在HdfDeviceObject 中的property里面,通过Bind和Init(参考[驱动开发](/pages/00030001))传递给驱动。驱动开发者可新建配置文件,并在板级驱动hdf.hcs中引用新建的配置文件,本例中直接在原有的配置文件i2c\_config.hcs内添加配置参数。 + 有时驱动可能会需要私有配置信息,以确保寄存器的配置可以满足不同产品的需求。如需要私有配置信息,则可以添加一个驱动的配置文件,用来存放一些驱动的默认配置信息,HDF框架在加载驱动的时候,会将对应的配置信息获取并保存在HdfDeviceObject 中的property里面,通过Bind和Init(参考[驱动开发](/pages/0004010001))传递给驱动。驱动开发者可新建配置文件,并在板级驱动hdf.hcs中引用新建的配置文件,本例中直接在原有的配置文件i2c\_config.hcs内添加配置参数。 本例中编辑i2c\_config.hcs,添加配置参数: @@ -461,6 +453,6 @@ HDF_INIT(g_sampleI2cDriverEntry); 2. 编译及烧录。 - 具体操作请参考[标准系统快速入门编译及烧录章节](/pages/extra/4b9ca0/)。 + 具体操作请参考[标准系统快速入门编译及烧录章节](/pages/extra/36eb5c/)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" similarity index 95% rename from "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" index 53263dca78d1f955edda4539e61ff02babc7c65a..f4451fdee550e0cfe457a8a2e02ebdf720085146 100644 --- "a/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221-\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/07.\350\256\276\345\244\207\345\274\200\345\217\221\347\244\272\344\276\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\350\256\276\345\244\207/03.\345\244\226\350\256\276\351\251\261\345\212\250\345\274\200\345\217\221\347\244\272\344\276\213.md" @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:33 --- # 外设驱动开发示例 @@ -41,7 +41,7 @@ date: 2021-12-30 12:57:45 Hi3516DV300开发板套件所提供的触摸屏器件IC为GT911,该器件采用标准I2C与主机通信,通过6pin软排线与主板连接。6pin分布以及实物连接图如下图所示: -![](/images/zh-cn/device-dev/guide/figure/绘图1.png) +![](/images/device-dev/guide/figures/6-pin-distribution-and-physical-connection.png) ### Input模型简介 @@ -53,13 +53,13 @@ Input驱动模型核心部分由设备管理层、公共驱动层、器件驱动 此外,Input模型预先实现了数据通道以及设备配置信息解析等函数。 -关于Input模型的详细介绍请参考《[Touchscreen开发概述](/pages/00030301#section175431838101617)》。 +关于Input模型的详细介绍请参考《[Touchscreen开发概述](/pages/0004010301#section175431838101617)》。 ## 环境搭建 环境准备具体操作请参考[标准系统基础环境搭建](/pages/00010100)。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >本示例针对OpenHarmony轻量系统、小型系统、标准系统都适用,本文以标准系统为例。其他系统的开发者可参考对应系统的指导文档进行环境搭建。 ## TouchScreen器件驱动开发 @@ -74,7 +74,7 @@ Input驱动模型核心部分由设备管理层、公共驱动层、器件驱动 device\_info.hcs中的信息主要提供给HDF框架使用,包含了Input模型各层驱动注册到HDF框架所必需的信息,开发者无特殊场景需求无需改动。各驱动层私有配置信息通过“deviceMatchAttr”字段与input\_config.hcs中的“match\_attr”相关内容进行匹配。 -配置文件中与input模块相关的内容如下所示,相关字段的详细含义可以参考《[驱动配置](/pages/00030001)》: +配置文件中与input模块相关的内容如下所示,相关字段的详细含义可以参考《[驱动配置](/pages/0004010001)》: ``` input :: host { @@ -348,32 +348,32 @@ Input模型由三层驱动组成,开发者适配一款全新触摸屏驱动只 其中touch\_gt911.o为本示例中追加的内容。 -2. 具体编译及烧录操作请参考[标准系统快速入门编译及烧录章节](/pages/00010104)。 +2. 具体编译及烧录操作请参考[标准系统快速入门编译及烧录章节](/pages/00010101)。 ## 调试验证 如下所示为开机启动日志部分截取 ``` -[I/HDF_INPUT_DRV] HdfInputManagerInit: enter // 管理驱动层初始化 -[I/HDF_INPUT_DRV] HdfInputManagerInit: exit succ // 初始化成功 -[I/osal_cdev] add cdev hdf_input_host success -[I/HDF_LOG_TAG] HdfTouchDriverProbe: enter // 公共驱动层初始化 -[I/HDF_LOG_TAG] HdfTouchDriverProbe: main_touch exit succ // 初始化成功 -[I/osal_cdev] add cdev hdf_input_event1 success -[I/HDF_INPUT_DRV] HdfGoodixChipInit: enter // 器件驱动层初始化 -[I/HDF_INPUT_DRV] ChipDetect: IC FW version is 0x1060 -[I/HDF_INPUT_DRV] Product_ID: 911_1060, x_sol = 960, y_sol = 480 -[I/HDF_LOG_TAG] ChipDriverInit: chipDetect succ, ret = 0 -[I/HDF_LOG_TAG] InputDeviceInstance: inputDev->devName = main_touch -[I/HDF_INPUT_DRV] HdfGoodixChipInit: exit succ, chipName = gt911 // 初始化成功 +[I/HDF_INPUT_DRV] HdfInputManagerInit: enter // 管理驱动层初始化 +[I/HDF_INPUT_DRV] HdfInputManagerInit: exit succ // 初始化成功 +[I/osal_cdev] add cdev hdf_input_host success +[I/HDF_LOG_TAG] HdfTouchDriverProbe: enter // 公共驱动层初始化 +[I/HDF_LOG_TAG] HdfTouchDriverProbe: main_touch exit succ // 初始化成功 +[I/osal_cdev] add cdev hdf_input_event1 success +[I/HDF_INPUT_DRV] HdfGoodixChipInit: enter // 器件驱动层初始化 +[I/HDF_INPUT_DRV] ChipDetect: IC FW version is 0x1060 +[I/HDF_INPUT_DRV] Product_ID: 911_1060, x_sol = 960, y_sol = 480 +[I/HDF_LOG_TAG] ChipDriverInit: chipDetect succ, ret = 0 +[I/HDF_LOG_TAG] InputDeviceInstance: inputDev->devName = main_touch +[I/HDF_INPUT_DRV] HdfGoodixChipInit: exit succ, chipName = gt911 // 初始化成功 ``` ## Input模型工作流程解析 为了让开发者更清晰的了解Input模型工作流程,本节将对input模型加载的关键流程代码进行说明。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** >本章节为Input模型工作流程说明,开发者无需进行开发。 ### 私有配置信息解析 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/01.\345\272\224\347\224\250\345\274\200\345\217\221\345\277\253\351\200\237\345\205\245\351\227\250/01.\345\274\200\345\217\221\345\207\206\345\244\207.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/01.\345\272\224\347\224\250\345\274\200\345\217\221\345\277\253\351\200\237\345\205\245\351\227\250/01.\345\274\200\345\217\221\345\207\206\345\244\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..3ede18408f0bfaa658a8a791c2cad97818eb7527 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/01.\345\272\224\347\224\250\345\274\200\345\217\221\345\277\253\351\200\237\345\205\245\351\227\250/01.\345\274\200\345\217\221\345\207\206\345\244\207.md" @@ -0,0 +1,46 @@ +--- +title: 开发准备 +permalink: /pages/00070000 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:33 +--- +# 开发准备 + +## 任务说明 + +本文档适用于OpenHarmony应用开发的初学者。通过构建一个简单的具有页面跳转功能的应用(如下图[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行效果所示),熟悉OpenHarmony应用开发流程。 + +为确保运行效果,本文以使用**DevEco Studio 3.0.0.601 Beta1**版本为例,点击[此处](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta)获取下载链接。 + +![zh-cn_image_0000001172442490](/images/application-dev/quick-start/figures/zh-cn_image_0000001172442490.png) + +**表1** 方舟开发框架的对比 + +| 比较项 | 基于JS扩展的类Web开发范式 | 基于TS扩展的声明式开发范式 | +| -------- | -------- | -------- | +| 语言生态 | JS | eTS | +| 接口方式 | 类Web范式 | 声明式 | +| 执行方式 | 框架层处理,基于数据驱动的UI自动变更 | 框架层处理,基于数据驱动的UI自动变更 | +| 相对优势 | 轻量化,开发更简便 | 极简开发,内存占用更少、运行性能更高 | + +接下来,分别使用JS语言、eTS语言实现上述两个页面跳转的功能。 + + +## 开发准备 + +1. 开始前请参考[配置OpenHarmony SDK](/pages/00070502),完成**DevEco Studio**的安装和开发环境配置。 + +2. 开发环境配置完成后,请参考[创建OpenHarmony工程](/pages/0007050300)创建工程。 + - 使用JS语言开发,模板选择Empty Ability,Language选择JS。 + - 使用eTS语言开发,模板选择Empty Ability,Language选择eTS。 + +3. 工程创建完成后,使用[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行该工程。 + +完成上述操作后,请参考[使用JS语言开发](/pages/00070001)、[使用eTS语言开发](/pages/00070002)继续下一步的学习。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/01.\345\272\224\347\224\250\345\274\200\345\217\221\345\277\253\351\200\237\345\205\245\351\227\250/02.\344\275\277\347\224\250JS\350\257\255\350\250\200\345\274\200\345\217\221.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/01.\345\272\224\347\224\250\345\274\200\345\217\221\345\277\253\351\200\237\345\205\245\351\227\250/02.\344\275\277\347\224\250JS\350\257\255\350\250\200\345\274\200\345\217\221.md" new file mode 100644 index 0000000000000000000000000000000000000000..1c49a4627bad3c37fe3b456e28c7bc258f11a797 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/01.\345\272\224\347\224\250\345\274\200\345\217\221\345\277\253\351\200\237\345\205\245\351\227\250/02.\344\275\277\347\224\250JS\350\257\255\350\250\200\345\274\200\345\217\221.md" @@ -0,0 +1,119 @@ +--- +title: 使用JS语言开发 +permalink: /pages/00070001 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# 使用JS语言开发 + +为确保运行效果,本文以使用**DevEco Studio 3.0.0.601 Beta1**版本为例,点击[此处](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta)获取下载链接。 + +## 编写第一个页面 + +1. 第一个页面内有一个文本和一个按钮,通过text和button组件来实现。 + 在“Project“窗口,选择entry > src > main > js > default > pages > index,打开index.hml文件,添加一个文本和一个按钮,示例代码如下: + + ``` + +
+ + + Hello World + + + +
+ ``` + +2. 打开index.css文件,设置文本和按钮的样式,示例代码如下: + ``` + /* index.css */ + .container { + flex-direction: column; /* 设置容器内的项目纵向排列 */ + justify-content: center; /* 设置项目位于容器主轴的中心 */ + align-items: center; /* 项目在交叉轴居中 */ + width:100%; + height:100%; + } + /* 对class="text"的组件设置样式 */ + .text{ + font-size: 42px; + } + /* 对class="button"的组件设置样式 */ + .button { + width: 240px; + height: 60px; + background-color: #007dff; + font-size: 30px; + text-color: white; + margin-top: 20px; + } + ``` + +3. 使用[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行项目,效果如下图所示: + + ![zh-cn_image_0000001217683803](/images/application-dev/quick-start/figures/zh-cn_image_0000001217683803.png) + + +## 创建另一个页面 + +1. 在“Project“窗口,打开entry > src > main > js > default,右键点击pages文件夹,选择New > JS Page,命名为details,单击回车键。 + 创建完成后,可以看到pages文件夹下的文件目录结构如下: + + ![zh-cn_image_0000001217523751](/images/application-dev/quick-start/figures/zh-cn_image_0000001217523751.png) + +2. 打开details.hml文件,添加一个文本,示例代码如下: + ``` + +
+ + Hi there + +
+ ``` + +3. 打开details.css文件,设置文本的样式,示例代码如下: + ``` + /* details.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width:100%; + height:100%; + } + .text { + font-size: 42px; + text-align: center; + } + ``` + + +## 实现页面跳转 + +1. 打开第一个页面的index.js文件,导入router模块,页面路由router根据页面的uri来找到目标页面,从而实现跳转。示例代码如下: + ``` + // index.js + import router from '@system.router'; + + export default { + launch() { + router.push ({ + uri:'pages/details/details', // 指定要跳转的页面 + }) + } + } + ``` + +2. 再次使用[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行项目,效果如下图所示: + +![zh-cn_image_0000001217402315](/images/application-dev/quick-start/figures/zh-cn_image_0000001217402315.png) + +恭喜你,至此已成功完成OpenHarmony快速入门-使用JS语言开发。 \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/01.\345\272\224\347\224\250\345\274\200\345\217\221\345\277\253\351\200\237\345\205\245\351\227\250/03.\344\275\277\347\224\250eTS\350\257\255\350\250\200\345\274\200\345\217\221.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/01.\345\272\224\347\224\250\345\274\200\345\217\221\345\277\253\351\200\237\345\205\245\351\227\250/03.\344\275\277\347\224\250eTS\350\257\255\350\250\200\345\274\200\345\217\221.md" new file mode 100644 index 0000000000000000000000000000000000000000..c1a904ab411876d5e87394d49739be5b75695945 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/01.\345\272\224\347\224\250\345\274\200\345\217\221\345\277\253\351\200\237\345\205\245\351\227\250/03.\344\275\277\347\224\250eTS\350\257\255\350\250\200\345\274\200\345\217\221.md" @@ -0,0 +1,129 @@ +--- +title: 使用eTS语言开发 +permalink: /pages/00070002 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# 使用eTS语言开发 + +> ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:** +> 请使用DevEco Studio V3.0.0.601 Beta1及更高版本。本文以使用**DevEco Studio 3.0.0.601 Beta1**版本为例,点击[此处](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta)获取下载链接。 +> + + +## 创建eTS工程 + +1. 打开DevEco Studio,创建一个新工程,选择模板,如Empty Ability: + ![zh-cn_image_0000001172602436](/images/application-dev/quick-start/figures/zh-cn_image_0000001172602436.png) + +2. 进入配置工程界面,Project Type选择Application,Language选择eTS,其他参数根据实际需要设置即可。 + ![zh-cn_image_0000001172283938](/images/application-dev/quick-start/figures/zh-cn_image_0000001172283938.png) + + +## 编写第一个页面 + +1. 工程创建完成后,在“Project“窗口,点击entry > src > main > ets > default > pages,打开index.ets文件。 + ![zh-cn_image_0000001217602267](/images/application-dev/quick-start/figures/zh-cn_image_0000001217602267.png) + +2. 第一个页面由Flex容器组件、Text组件和Button组件构成。在index.ets中编写并设置页面组件的属性和样式,示例代码如下所示: + ``` + @Entry + @Component + struct Index { + build() { + //Flex容器组件 + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + //Text组件 + Text('Hello World') + .fontSize(60) + .fontWeight(500) + //Button组件 + Button('Next') + .fontSize(40) + .fontWeight(500) + .width(280) + .height(60) + } + //容器整体宽高 + .width('100%') + .height('100%') + } + } + ``` + +3. 使用[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行项目,效果如下图所示: + +![zh-cn_image_0000001172123966](/images/application-dev/quick-start/figures/zh-cn_image_0000001172123966.png) + + +## 创建第二个页面 + +1. 在“Project“窗口,打开entry > src > main > etsdefault,右键点击pages文件夹,选择New > eTS Page,命名为details,单击回车键。创建完成后,可以看到pages文件夹下的文件目录结构如下: + + ![zh-cn_image_0000001172442492](/images/application-dev/quick-start/figures/zh-cn_image_0000001172442492.png) + +2. 第二个页面由Flex容器组件、Text组件构成。在details.ets中编写并设置页面组件的属性和样式,示例代码如下所示: + ``` + @Entry + @Component + struct Details { + build() { + //Flex容器组件 + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + //Text组件 + Text('Hi there') + .fontSize(60) + .fontWeight(500) + } + //容器整体宽高 + .width('100%') + .height('100%') + } + } + ``` + + +## 实现页面跳转 + +1. 打开第一个页面的index.ets文件,导入router模块,页面路由router根据页面的uri来找到目标页面,从而实现跳转。示例代码如下: + ``` + //导入router模块 + import router from '@system.router'; + @Entry + @Component + struct Index { + build() { + //Flex容器组件 + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + //Text组件 + Text('Hello World') + .fontSize(60) + .fontWeight(500) + //Button组件 + Button('Next') + .fontSize(40) + .fontWeight(500) + .width(280) + .height(60) + //点击Button实现页面跳转 + .onClick(() => { router.push({ uri: 'pages/details' }) }) + } + //容器整体宽高 + .width('100%') + .height('100%') + } + } + ``` + +2. 再次使用[预览器](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/previewer-0000001054328973#ZH-CN_TOPIC_0000001056725592__section16523172216252)运行项目,效果如下图所示: + +![zh-cn_image_0000001217683805](/images/application-dev/quick-start/figures/zh-cn_image_0000001217683805.png) + +恭喜你,至此已成功完成OpenHarmony快速入门-使用eTS语言开发。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\246\202\350\277\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..8e562526f9da3a76692497a96e8b3ddfd4df063f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\246\202\350\277\260.md" @@ -0,0 +1,45 @@ +--- +title: 概述 +permalink: /pages/0007010000 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# 概述 + +方舟开发框架是OpenHarmony UI开发框架,提供基础类、容器类、画布类等UI组件和标准CSS动画能力,支持类Web范式编程。 + + +## 基础能力 + +- **类Web范式编程** + 采用类HTML和CSS Web编程语言作为页面布局和页面样式的开发语言,页面业务逻辑则支持ECMAScript规范的JavaScript语言。方舟开发框架提供的类Web编程范式,可以让开发者避免编写UI状态切换的代码,视图配置信息更加直观。 + + +## 整体架构 + +方舟开发框架提供两种开发范式:基于JS扩展的类Web开发范式、基于TS扩展的声明式开发范式。 + +使用基于JS扩展的类Web开发范式的方舟开发框架,包括应用层(Application)、前端框架层(Framework)、引擎层(Engine)和平台适配层(Porting Layer)。 + + + +![zh-cn_image_0000001117452952](/images/application-dev/ui/figures/zh-cn_image_0000001117452952.png) + +- **Application** + 应用层表示开发者开发的FA应用,这里的FA应用特指JS FA应用。 + +- **Framework** + 前端框架层主要完成前端页面解析,以及提供MVVM(Model-View-ViewModel)开发模式、页面路由机制和自定义组件等能力。 + +- **Engine** + 引擎层主要提供动画解析、DOM(Document Object Model)树构建、布局计算、渲染命令构建与绘制、事件管理等能力。 + +- **Porting Layer** + 适配层主要完成对平台层进行抽象,提供抽象接口,可以对接到系统平台。比如:事件对接、渲染管线对接和系统生命周期对接等。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/01.\347\273\204\344\273\266\344\273\213\347\273\215.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/01.\347\273\204\344\273\266\344\273\213\347\273\215.md" new file mode 100644 index 0000000000000000000000000000000000000000..b477301a17312c8c7ba1d63f9762e114272ffe9b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/01.\347\273\204\344\273\266\344\273\213\347\273\215.md" @@ -0,0 +1,33 @@ +--- +title: 组件介绍 +permalink: /pages/000701000100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# 组件介绍 + +组件(Component)是构建页面的核心,每个组件通过对数据和方法的简单封装,实现独立的可视、可交互功能单元。组件之间相互独立,随取随用,也可以在需求相同的地方重复使用。关于组件的详细参考文档请参见[组件](/pages/000b0100010000)。 + + +开发者还可以通过组件间合理的搭配定义满足业务需求的新组件,减少开发量,自定义组件的开发方法请参见[自定义组件](/pages/0007010004)。 + + +## 组件分类 + +根据组件的功能,可以分为以下六大类: + +| 组件类型 | 主要组件 | +| -------- | -------- | +| 容器组件 | badge、dialog、div、form、list、list-item、list-item-group、panel、popup、refresh、stack、stepper、stepper-item、swiper、tabs、tab-bar、tab-content | +| 基础组件 | button、chart、divider、image、image-animator、input、label、marquee、menu、option、picker、picker-view、piece、progress、qrcode、rating、richtext、search、select、slider、span、switch、text、textarea、toolbar、toolbar-item、toggle | +| 媒体组件 | video | +| 画布组件 | canvas | +| 栅格组件 | grid-container、grid-row、grid-col | +| svg组件 | svg、rect、circle、ellipse、path、line、polyline、polygon、text、tspan、textPath、animate、animateMotion、animateTransform | diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/01.\345\270\203\345\261\200\350\257\264\346\230\216.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/01.\345\270\203\345\261\200\350\257\264\346\230\216.md" similarity index 43% rename from "website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/01.\345\270\203\345\261\200\350\257\264\346\230\216.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/01.\345\270\203\345\261\200\350\257\264\346\230\216.md" index a29bad9d161e5cd2ade92753308a080c9264b1c3..2cb523e781591a62e35ca1ec7a5bb120a279c83a 100644 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/01.\345\270\203\345\261\200\350\257\264\346\230\216.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/01.\345\270\203\345\261\200\350\257\264\346\230\216.md" @@ -1,6 +1,6 @@ --- title: 布局说明 -permalink: /pages/000a010100 +permalink: /pages/00070100010100 navbar: true sidebar: true prev: true @@ -9,27 +9,36 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:34 --- -# 布局说明 +# 布局说明 -JS UI框架中设备以720px(px指逻辑像素,非物理像素)为基准宽度,根据实际屏幕宽度进行缩放,例如当width设为100px时,在宽度为1440物理像素的屏幕上,实际显示的宽度为200物理像素。 +设备的基准宽度为720px(px为逻辑像素,非物理像素),实际显示效果会根据实际屏幕宽度进行缩放。 + + +其换算关系如下: + + +组件的width设为100px时,在宽度为720物理像素的屏幕上,实际显示为100物理像素;在宽度为1440物理像素的屏幕上,实际显示为200物理像素。 一个页面的基本元素包含标题区域、文本区域、图片区域等,每个基本元素内还可以包含多个子元素,开发者根据需求还可以添加按钮、开关、进度条等组件。在构建页面布局时,需要对每个基本元素思考以下几个问题: -- 该元素的尺寸和排列位置 -- 是否有重叠的元素 -- 是否需要设置对齐、内间距或者边界 -- 是否包含子元素及其排列位置 -- 是否需要容器组件及其类型 -将页面中的元素分解之后再对每个基本元素按顺序实现,可以减少多层嵌套造成的视觉混乱和逻辑混乱,提高代码的可读性,方便对页面做后续的调整。以下图为例进行分解: +- 该元素的尺寸和排列位置 -**图 1** 页面布局分解 -![](/images/zh-cn/application-dev/ui/figures/页面布局分解.png "页面布局分解") +- 是否有重叠的元素 -**图 2** 留言区布局分解 +- 是否需要设置对齐、内间距或者边界 +- 是否包含子元素及其排列位置 + +- 是否需要容器组件及其类型 + + +将页面中的元素分解之后再对每个基本元素按顺序实现,可以减少多层嵌套造成的视觉混乱和逻辑混乱,提高代码的可读性,方便对页面做后续的调整。以下图为例进行分解: +**图1** 页面布局分解 +![zh-cn_image_0000001070558189](/images/application-dev/ui/figures/zh-cn_image_0000001070558189.png) -![](/images/zh-cn/application-dev/ui/figures/图片3.png) +**图2** 留言区布局分解 +![zh-cn_image_0000001063442797](/images/application-dev/ui/figures/zh-cn_image_0000001063442797.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/02.\346\267\273\345\212\240\346\240\207\351\242\230\350\241\214\345\222\214\346\226\207\346\234\254\345\214\272\345\237\237.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/02.\346\267\273\345\212\240\346\240\207\351\242\230\350\241\214\345\222\214\346\226\207\346\234\254\345\214\272\345\237\237.md" similarity index 83% rename from "website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/02.\346\267\273\345\212\240\346\240\207\351\242\230\350\241\214\345\222\214\346\226\207\346\234\254\345\214\272\345\237\237.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/02.\346\267\273\345\212\240\346\240\207\351\242\230\350\241\214\345\222\214\346\226\207\346\234\254\345\214\272\345\237\237.md" index fb3c2c1036182acb535699e65b5a8910ee247779..e1415381c05196a3d7f6f010e1dfd44ee7bbc5df 100644 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/02.\346\267\273\345\212\240\346\240\207\351\242\230\350\241\214\345\222\214\346\226\207\346\234\254\345\214\272\345\237\237.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/02.\346\267\273\345\212\240\346\240\207\351\242\230\350\241\214\345\222\214\346\226\207\346\234\254\345\214\272\345\237\237.md" @@ -1,6 +1,6 @@ --- title: 添加标题行和文本区域 -permalink: /pages/000a010101 +permalink: /pages/00070100010101 navbar: true sidebar: true prev: true @@ -9,11 +9,12 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:34 --- -# 添加标题行和文本区域 +# 添加标题行和文本区域 + +实现标题和文本区域最常用的是基础组件text。text组件用于展示文本,可以设置不同的属性和样式,文本内容需要写在标签内容区,完整属性和样式信息请参考[text](/pages/000b0100010216)。在页面中插入标题和文本区域的示例如下: -实现标题和文本区域最常用的是基础组件text。text组件用于展示文本,可以设置不同的属性和样式,文本内容需要写在标签内容区。在页面中插入标题和文本区域的示例如下: ``` @@ -24,6 +25,7 @@ date: 2021-12-30 12:57:45 ``` + ``` /* xxx.css */ .container { @@ -44,6 +46,7 @@ date: 2021-12-30 12:57:45 } ``` + ``` // xxx.js export default { @@ -54,4 +57,3 @@ export default { }, } ``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/03.\346\267\273\345\212\240\345\233\276\347\211\207\345\214\272\345\237\237.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/03.\346\267\273\345\212\240\345\233\276\347\211\207\345\214\272\345\237\237.md" similarity index 51% rename from "website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/03.\346\267\273\345\212\240\345\233\276\347\211\207\345\214\272\345\237\237.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/03.\346\267\273\345\212\240\345\233\276\347\211\207\345\214\272\345\237\237.md" index c66ad997bea064ef1357f356a2ebb60a6f78f68f..e7efce556595b6531845254ab85eeab77fdd87cf 100644 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/03.\346\267\273\345\212\240\345\233\276\347\211\207\345\214\272\345\237\237.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/03.\346\267\273\345\212\240\345\233\276\347\211\207\345\214\272\345\237\237.md" @@ -1,6 +1,6 @@ --- title: 添加图片区域 -permalink: /pages/000a010102 +permalink: /pages/00070100010102 navbar: true sidebar: true prev: true @@ -9,19 +9,22 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:34 --- -# 添加图片区域 +# 添加图片区域 -添加图片区域通常用image组件来实现,使用的方法和text组件类似。 +添加图片区域通常用[image](/pages/000b0100010203)组件来实现,使用的方法和text组件类似。 + + +图片资源建议放在jsdefaultcommon目录下,common目录需自行创建,详细的目录结构见[目录结构](/pages/000b01000000#目录结构)。代码示例如下: -图片资源建议放在“js \> default \> common“目录下,common目录需自行创建。代码示例如下: ``` ``` + ``` /* xxx.css */ .img { @@ -31,6 +34,7 @@ date: 2021-12-30 12:57:45 } ``` + ``` // xxx.js export default { @@ -39,4 +43,3 @@ export default { }, } ``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/04.\346\267\273\345\212\240\347\225\231\350\250\200\345\214\272\345\237\237.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/04.\346\267\273\345\212\240\347\225\231\350\250\200\345\214\272\345\237\237.md" similarity index 86% rename from "website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/04.\346\267\273\345\212\240\347\225\231\350\250\200\345\214\272\345\237\237.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/04.\346\267\273\345\212\240\347\225\231\350\250\200\345\214\272\345\237\237.md" index 13833fc4698625204f80c067799bd19578250407..5319a49bbfa57f5cc4de6f994a57cbb5de237495 100644 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/04.\346\267\273\345\212\240\347\225\231\350\250\200\345\214\272\345\237\237.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/04.\346\267\273\345\212\240\347\225\231\350\250\200\345\214\272\345\237\237.md" @@ -1,6 +1,6 @@ --- title: 添加留言区域 -permalink: /pages/000a010103 +permalink: /pages/00070100010103 navbar: true sidebar: true prev: true @@ -9,13 +9,15 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:34 --- -# 添加留言区域 +# 添加留言区域 留言框的功能为:用户输入留言后点击完成,留言区域即显示留言内容;用户点击右侧的删除按钮可删除当前留言内容并重新输入。 -留言区域由div、text、input关联click事件实现。开发者可以使用input组件实现输入留言的部分,使用text组件实现留言完成部分,使用commentText的状态标记此时显示的组件(通过if属性控制)。在包含文本“完成“和“删除“的text组件中关联click事件,更新commentText状态和inputValue的内容。具体的实现示例如下: + +留言区域由div、text、input关联click事件实现。开发者可以使用input组件实现输入留言的部分,使用text组件实现留言完成部分,使用commentText的状态标记此时显示的组件(通过if属性控制)。在包含文本完成和删除的text组件中关联click事件,更新commentText状态和inputValue的内容。具体的实现示例如下: + ``` @@ -32,6 +34,7 @@ date: 2021-12-30 12:57:45 ``` + ``` /* xxx.css */ .container { @@ -43,7 +46,7 @@ date: 2021-12-30 12:57:45 color: #1a1a1a; font-weight: bold; margin-top: 40px; - margin-bottom: 10px; +margin-bottom: 10px; } .comment { width: 550px; @@ -73,6 +76,7 @@ date: 2021-12-30 12:57:45 } ``` + ``` // xxx.js export default { @@ -88,4 +92,3 @@ export default { }, } ``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/05.\346\267\273\345\212\240\345\256\271\345\231\250.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/05.\346\267\273\345\212\240\345\256\271\345\231\250.md" similarity index 87% rename from "website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/05.\346\267\273\345\212\240\345\256\271\345\231\250.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/05.\346\267\273\345\212\240\345\256\271\345\231\250.md" index cf296d80d41720cab8a6fb7f2bae059f166e11b5..754fcd5b67426269889fcc80e51afb8b07e4d312 100644 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/05.\346\267\273\345\212\240\345\256\271\345\231\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/02.\346\236\204\345\273\272\345\270\203\345\261\200/05.\346\267\273\345\212\240\345\256\271\345\231\250.md" @@ -1,6 +1,6 @@ --- title: 添加容器 -permalink: /pages/000a010104 +permalink: /pages/00070100010104 navbar: true sidebar: true prev: true @@ -9,16 +9,14 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:34 --- -# 添加容器 - -- [List组件](#section1875054932714) -- [Tabs组件](#section91861363535) +# 添加容器 要将页面的基本元素组装在一起,需要使用容器组件。在页面布局中常用到三种容器组件,分别是div、list和tabs。在页面结构相对简单时,可以直接用div作为容器,因为div作为单纯的布局容器,可以支持多种子组件,使用起来更为方便。 -## List组件 + +## List组件 当页面结构较为复杂时,如果使用div循环渲染,容易出现卡顿,因此推荐使用list组件代替div组件实现长列表布局,从而实现更加流畅的列表滚动体验。需要注意的是,list仅支持list-item作为子组件,具体的使用示例如下: @@ -50,7 +48,8 @@ export default { 为避免示例代码过长,以上示例的list中只包含一个list-item,list-item中只有一个text组件。在实际应用中可以在list中加入多个list-item,同时list-item下可以包含多个其他子组件。 -## Tabs组件 + +## Tabs组件 当页面经常需要动态加载时,推荐使用tabs组件。tabs组件支持change事件,在页签切换后触发。tabs组件仅支持一个tab-bar和一个tab-content。具体的使用示例如下: @@ -82,4 +81,3 @@ export default { ``` tab-content组件用来展示页签的内容区,高度默认充满tabs剩余空间。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/03.\346\267\273\345\212\240\344\272\244\344\272\222.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/03.\346\267\273\345\212\240\344\272\244\344\272\222.md" similarity index 73% rename from "website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/03.\346\267\273\345\212\240\344\272\244\344\272\222.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/03.\346\267\273\345\212\240\344\272\244\344\272\222.md" index f606cff24510d4fc2c60156f5f9fc4991e403c2f..33cf2cba7024089f6006ace31eba9973adbf7eeb 100644 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/03.\346\267\273\345\212\240\344\272\244\344\272\222.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/03.\346\267\273\345\212\240\344\272\244\344\272\222.md" @@ -1,6 +1,6 @@ --- title: 添加交互 -permalink: /pages/000a0102 +permalink: /pages/000701000102 navbar: true sidebar: true prev: true @@ -9,24 +9,27 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:34 --- -# 添加交互 +# 添加交互 添加交互可以通过在组件上关联事件实现。本节将介绍如何用div、text、image组件关联click事件,构建一个如下图所示的点赞按钮。 +**图1** 点赞按钮效果 -**图 1** 点赞按钮效果 +![zh-cn_image_0000001064068638](/images/application-dev/ui/figures/zh-cn_image_0000001064068638.gif) -![](/images/zh-cn/application-dev/ui/figures/zan.gif) - 点赞按钮通过一个div组件关联click事件实现。div组件包含一个image组件和一个text组件: -- image组件用于显示未点赞和点赞的效果。click事件函数会交替更新点赞和未点赞图片的路径。 -- text组件用于显示点赞数,点赞数会在click事件的函数中同步更新。 + +- image组件用于显示未点赞和点赞的效果。click事件函数会交替更新点赞和未点赞图片的路径。 + +- text组件用于显示点赞数,点赞数会在click事件的函数中同步更新。 + click事件作为一个函数定义在js文件中,可以更改isPressed的状态,从而更新显示的image组件。如果isPressed为真,则点赞数加1。该函数在hml文件中对应的div组件上生效,点赞按钮各子组件的样式设置在css文件当中。具体的实现示例如下: + ``` @@ -38,6 +41,7 @@ click事件作为一个函数定义在js文件中,可以更改isPressed的状 ``` + ``` /* xxx.css */ .like { @@ -61,6 +65,7 @@ click事件作为一个函数定义在js文件中,可以更改isPressed的状 } ``` + ``` // xxx.js export default { @@ -84,5 +89,5 @@ export default { } ``` -JS UI框架还提供了很多表单组件,例如开关、标签、滑动选择器等,以便于开发者在页面布局时灵活使用和提高交互性。 +除此之外,还提供了很多表单组件,例如开关、标签、滑动选择器等,以便于开发者在页面布局时灵活使用和提高交互性,详见[容器组件](/pages/000b0100010100)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/04.\345\212\250\347\224\273.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/04.\345\212\250\347\224\273.md" similarity index 65% rename from "website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/04.\345\212\250\347\224\273.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/04.\345\212\250\347\224\273.md" index 3102806a856dffbf35817101187e851ea1e11622..238118e93cf7eb61c5f2c4c8de8827a32282e7c7 100644 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/04.\345\212\250\347\224\273.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/04.\345\212\250\347\224\273.md" @@ -1,6 +1,6 @@ --- title: 动画 -permalink: /pages/000a0103 +permalink: /pages/000701000103 navbar: true sidebar: true prev: true @@ -9,24 +9,24 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:34 --- -# 动画 +# 动画 -- [静态动画](#section456613911492) -- [连续动画](#section17836125204914) +动画分为[静态动画](#静态动画)和[连续动画](#连续动画)。 -动画分为[静态动画](#section456613911492)和[连续动画](#section17836125204914)。 -## 静态动画 +## 静态动画 静态动画的核心是transform样式,主要可以实现以下三种变换类型,一次样式设置只能实现一种类型变换。 -- **translate**:沿水平或垂直方向将指定组件移动所需距离。 -- **scale**:横向或纵向将指定组件缩小或放大到所需比例。 -- **rotate**:将指定组件沿横轴或纵轴或中心点旋转指定的角度。 +- **translate**:沿水平或垂直方向将指定组件移动所需距离。 -具体的使用示例如下。 +- **scale**:横向或纵向将指定组件缩小或放大到所需比例。 + +- **rotate**:将指定组件沿横轴或纵轴或中心点旋转指定的角度。 + +具体的使用示例如下,更多信息请参考[组件方法](/pages/000b0100010003)。 ``` @@ -67,20 +67,26 @@ date: 2021-12-30 12:57:45 } ``` -**图 1** 静态动画效果图 -![](/images/zh-cn/application-dev/ui/figures/静态动画效果图.png "静态动画效果图") -## 连续动画 +**图1** 静态动画效果图 +![zh-cn_image_0000001071134933](/images/application-dev/ui/figures/zh-cn_image_0000001071134933.png) + + +## 连续动画 静态动画只有开始状态和结束状态,没有中间状态,如果需要设置中间的过渡状态和转换效果,需要使用连续动画实现。 连续动画的核心是animation样式,它定义了动画的开始状态、结束状态以及时间和速度的变化曲线。通过animation样式可以实现的效果有: -- **animation-name**:设置动画执行后应用到组件上的背景颜色、透明度、宽高和变换类型。 -- **animation-delay**和**animation-duration**:分别设置动画执行后元素延迟和持续的时间。 -- **animation-timing-function**:描述动画执行的速度曲线,使动画更加平滑。 -- **animation-iteration-count**:定义动画播放的次数。 -- **animation-fill-mode**:指定动画执行结束后是否恢复初始状态。 +- **animation-name**:设置动画执行后应用到组件上的背景颜色、透明度、宽高和变换类型。 + +- **animation-delay**和**animation-duration**:分别设置动画执行后元素延迟和持续的时间。 + +- **animation-timing-function**:描述动画执行的速度曲线,使动画更加平滑。 + +- **animation-iteration-count**:定义动画播放的次数。 + +- **animation-fill-mode**:指定动画执行结束后是否恢复初始状态。 animation样式需要在css文件中先定义keyframe,在keyframe中设置动画的过渡效果,并通过一个样式类型在hml文件中调用。animation-name的使用示例如下: @@ -163,6 +169,5 @@ export default { } ``` -**图 2** 连续动画效果图 -![](/images/zh-cn/application-dev/ui/figures/连续动画效果图.gif "连续动画效果图") - +**图2** 连续动画效果图 +![zh-cn_image_0000001063148757](/images/application-dev/ui/figures/zh-cn_image_0000001063148757.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/05.\344\272\213\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/05.\344\272\213\344\273\266.md" similarity index 81% rename from "website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/05.\344\272\213\344\273\266.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/05.\344\272\213\344\273\266.md" index 31a78a8776ba23c5f13af3bae7ad99221fbe225d..e255558a5d72f3c65416f7308a4c524bb5c628cb 100644 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/05.\344\272\213\344\273\266.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/05.\344\272\213\344\273\266.md" @@ -1,6 +1,6 @@ --- title: 事件 -permalink: /pages/000a0104 +permalink: /pages/000701000104 navbar: true sidebar: true prev: true @@ -9,24 +9,25 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:34 --- -# 事件 - -- [手势事件](#section21104561094) +# 事件 事件主要为手势事件。手势事件主要用于具有触摸屏的设备。 -## 手势事件 -手势表示由单个或多个事件识别的语义动作(例如:点击、拖动和长按)。一个完整的手势也可能由多个事件组成,对应手势的生命周期。JS UI框架支持的手势事件有: +## 手势事件 + +手势表示由单个或多个事件识别的语义动作(例如:点击、拖动和长按)。一个完整的手势也可能由多个事件组成,对应手势的生命周期。支持的事件有: **触摸** +- touchstart:手指触摸动作开始。 + +- touchmove:手指触摸后移动。 -- touchstart:手指触摸动作开始。 -- touchmove:手指触摸后移动。 -- touchcancel:手指触摸动作被打断,如来电提醒、弹窗。 -- touchend:手指触摸动作结束。 +- touchcancel:手指触摸动作被打断,如来电提醒、弹窗。 + +- touchend:手指触摸动作结束。 **点击** @@ -116,4 +117,3 @@ export default { }, } ``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/06.\351\241\265\351\235\242\350\267\257\347\224\261.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/06.\351\241\265\351\235\242\350\267\257\347\224\261.md" similarity index 58% rename from "website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/06.\351\241\265\351\235\242\350\267\257\347\224\261.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/06.\351\241\265\351\235\242\350\267\257\347\224\261.md" index bc97cd7f558a942a7a657d742278c7a59850508f..de8a444dc7d66d09de5b07a8f77692fb2312a231 100644 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/06.\351\241\265\351\235\242\350\267\257\347\224\261.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/06.\351\241\265\351\235\242\350\267\257\347\224\261.md" @@ -1,6 +1,6 @@ --- title: 页面路由 -permalink: /pages/000a0105 +permalink: /pages/000701000105 navbar: true sidebar: true prev: true @@ -9,23 +9,24 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:34 --- -# 页面路由 - -- [构建页面布局](#section135242911291) -- [构建页面样式](#section174441114183216) -- [实现跳转](#section1276711211359) +# 页面路由 很多应用由多个页面组成,比如用户可以从音乐列表页面点击歌曲,跳转到该歌曲的播放界面。开发者需要通过页面路由将这些页面串联起来,按需实现跳转。 -页面路由router根据页面的uri来找到目标页面,从而实现跳转。以最基础的两个页面之间的跳转为例,具体实现步骤如下: -1. 在“Project“窗口,打开“entry \> src \> main \> js \> default“,右键点击“pages“文件夹,选择“New \> JS Page“,创建一个详情页。 -2. 调用router.push\(\)路由到详情页。 -3. 调用router.back\(\)回到首页。 +页面路由router根据页面的uri找到目标页面,从而实现跳转。以最基础的两个页面之间的跳转为例,具体实现步骤如下: + + +1. 在“Project“窗口,打开entry > src > mainjsdefault,右键点击pages文件夹,选择NewJS Page,创建一个详情页。 + +2. 调用router.push()路由到详情页。 + +3. 调用router.back()回到首页。 -## 构建页面布局 + +## 构建页面布局 index和detail这两个页面均包含一个text组件和button组件:text组件用来指明当前页面,button组件用来实现两个页面之间的相互跳转。hml文件代码示例如下: @@ -45,7 +46,8 @@ index和detail这两个页面均包含一个text组件和button组件:text组 ``` -## 构建页面样式 + +## 构建页面样式 构建index和detail页面的页面样式,text组件和button组件居中显示,两个组件之间间距为50px。css代码如下(两个页面样式代码一致): @@ -64,9 +66,10 @@ index和detail这两个页面均包含一个text组件和button组件:text组 } ``` -## 实现跳转 -为了使button组件的launch方法生效,需要在页面的js文件中实现跳转逻辑。调用router.push\(\)接口将uri指定的页面添加到路由栈中,即跳转到uri指定的页面。在调用router方法之前,需要导入router模块。代码示例如下: +## 实现跳转 + +为了使button组件的launch方法生效,需要在页面的js文件中实现跳转逻辑。调用router.push()接口将uri指定的页面添加到路由栈中,即跳转到uri指定的页面。在调用router方法之前,需要导入router模块。代码示例如下: ``` // index.js @@ -92,6 +95,5 @@ export default { 运行效果如下图所示: -**图 1** 页面路由效果 -![](/images/zh-cn/application-dev/ui/figures/页面路由效果.png "页面路由效果") - +**图1** 页面路由效果 +![zh-cn_image_0000001070707559](/images/application-dev/ui/figures/zh-cn_image_0000001070707559.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/01.Text.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/01.Text.md" new file mode 100644 index 0000000000000000000000000000000000000000..b38c24b33d327ce24554490cd483b059f420cabd --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/01.Text.md" @@ -0,0 +1,281 @@ +--- +title: Text +permalink: /pages/000701000200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# Text + +Text是文本组件,用于呈现一段文本信息。具体用法请参考[Text API](/pages/000b0100010216)。 + + +## 创建Text组件 + +在pages/index目录下的hml文件中创建一个Text组件。 + +``` + +
+ Hello World +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + justify-content: center; + background-color: #F1F3F5; +} +``` + +![zh-cn_image_0000001211383427](/images/application-dev/ui/figures/zh-cn_image_0000001211383427.png) + + +## 设置Text组件样式和属性 + +- 添加文本样式 + + +设置color、font-size、allow-scale、word-spacing、text-valign属性分别为文本添加颜色、大小、和缩放、文本之间的间距和文本在垂直方向的对齐方式。 + + +``` + +
+ + This is a passage + + This is a passage +
+``` + + +![zh-cn_image_0000001163489068](/images/application-dev/ui/figures/zh-cn_image_0000001163489068.png) + + +![zh-cn_image_0000001173950938](/images/application-dev/ui/figures/zh-cn_image_0000001173950938.png) + + +- 添加划线 + + +设置text-decoration和text-decoration-colo属性为文本添加划线和划线颜色,text-decoration枚举值请参考Text自有样式。 + + +``` + +
+ + This is a passage + + + This is a passage + +
+``` + + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + justify-content: center; +} +text{ +font-size: 50px; +} +``` + + +![zh-cn_image_0000001208975737](/images/application-dev/ui/figures/zh-cn_image_0000001208975737.png) + + +![zh-cn_image_0000001219237131](/images/application-dev/ui/figures/zh-cn_image_0000001219237131.png) + + +- 隐藏文本内容 + + +当文本内容过多而显示不全时,添加text-overflow属性将隐藏内容以省略号的形式展现。 + + +``` + +
+ + This is a passage + +
+``` + + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + background-color: #F1F3F5; + justify-content: center; +} +.text{ + width: 200px; + max-lines: 1; + text-overflow:ellipsis; +} +``` + + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - text-overflow样式需要与max-lines样式配套使用,设置了最大行数的情况下生效。 +> +> - max-lines属性设置文本最多可以展示的行数。 + + +![zh-cn_image_0000001163656706](/images/application-dev/ui/figures/zh-cn_image_0000001163656706.png) + + +- 设置文本折行 + + +设置word-break属性对文本内容做断行处理,word-break枚举值请参考Text自有样式。 + + +``` + +
+
+ + Welcome to the world + + + Welcome to the world + +
+
+``` + + +``` +/* xxx.css */ +.container { + background-color: #F1F3F5; + flex-direction: column; + align-items: center; + justify-content: center; +} +.content{ + width: 50%; + flex-direction: column; + align-items: center; + justify-content: center; +} +.text1{ + height: 200px; + border:1px solid #1a1919; + margin-bottom: 50px; + text-align: center; + word-break: break-word; + font-size: 40px; +} +.text2{ + height: 200px; + border:1px solid #0931e8; + text-align: center; + word-break: break-all; + font-size: 40px; +} +``` + + +![zh-cn_image_0000001209033195](/images/application-dev/ui/figures/zh-cn_image_0000001209033195.png) + + +- Text组件支持[Span](/pages/000b0100010214)子组件 + + +``` + +
+ + This is a passage + + + This 1 is a 1 passage + +
+``` + + +![zh-cn_image_0000001163372568](/images/application-dev/ui/figures/zh-cn_image_0000001163372568.png) + + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - 当使用Span子组件组成文本段落时,如果Span属性样式异常(例如:font-weight设置为1000),将导致文本段落显示异常。 +> +> - 在使用Span子组件时,注意Text组件内不能存在文本内容,如果存在文本内容也只会显示子组件Span里的内容。 + + +## 场景示例 + +Text组件通过数据绑定展示文本内容,Span组件通过设置show属性来实现文本内容的隐藏和显示。 + +``` + +
+
+ + {{ content }} + + +
+ + {{ content }} + + 1 + + Hide clip + +
+``` + +``` +/* xxx.css */ +.container { + align-items: center; + flex-direction: column; + justify-content: center; + background-color: #F1F3F5; +} +.title { + font-size: 26px; + text-align:center; + width: 200px; + height: 200px; +} +``` + +``` +// xxx.js +export default { + data: { + isShow:true, + content: 'Hello World' + }, + onInit(){ }, + test(e) { + this.isShow = e.checked + } +} +``` + +![zh-cn_image_0000001208636379](/images/application-dev/ui/figures/zh-cn_image_0000001208636379.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/02.Input.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/02.Input.md" new file mode 100644 index 0000000000000000000000000000000000000000..6e0d4e7fb657c861f74f588da2d1fd069fab97f1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/02.Input.md" @@ -0,0 +1,322 @@ +--- +title: Input +permalink: /pages/000701000201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# Input + +Input是交互式组件,用于接收用户数据。其类型可设置为日期、多选框和按钮等。具体用法请参考[Input API](/pages/000b0100010205)。 + + +## 创建Input组件 + +在pages/index目录下的hml文件中创建一个Input组件。 + +``` + +
+ Please enter the content +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #F1F3F5; +} +``` + +![zh-cn_image_0000001165344988](/images/application-dev/ui/figures/zh-cn_image_0000001165344988.png) + + +## 设置Input类型 + +通过设置type属性来定义Input类型,如将Input设置为button、date等。 + +``` + +
+
+ +
+ this is a dialog +
+
+ +
+
+ +
+
+ +
+
+``` + +``` +/* xxx.css */ +.container { + align-items: center; + flex-direction: column; + justify-content: center; + background-color: #F1F3F5 ; +} +.div-button { + flex-direction: column; + align-items: center; +} +.dialogClass{ + width:80%; + height: 200px; +} +.button { + margin-top: 30px; + width: 50%; +} +.content{ + width: 90%; + height: 150px; + align-items: center; + justify-content: center; +} +.flex { + width: 80%; + margin-bottom:40px; +} +``` + +``` +// xxx.js +export default { + btnclick(){ + this.$element('dialogId').show() + }, +} +``` + + +![zh-cn_image_0000001163375178](/images/application-dev/ui/figures/zh-cn_image_0000001163375178.gif) + + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - 智能穿戴仅支Input类型设置为button、radio、checkbox。 +> +> - 仅当Input类型为checkbox和radio时,当前组件是否选中的属性checked才生效,默认值为false。 + + +## 事件绑定 + +向Input组件添加search和translate事件。 +``` + +
+ + Enter text and then touch and hold what you've entered + + + +
+``` + +``` +/* xxx.css */ +.content { + width: 100%; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: #F1F3F5; +} +.input { + margin-top: 50px; + width: 60%; + placeholder-color: gray; +} +text{ + width:100%; + font-size:25px; + text-align:center; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt' +export default { + search(e){ + prompt.showToast({ + message: e.value, + duration: 3000, + }); + }, + translate(e){ + prompt.showToast({ + message: e.value, + duration: 3000, + }); + } +} +``` + +![zh-cn_image_0000001208787965](/images/application-dev/ui/figures/zh-cn_image_0000001208787965.gif) + + +## 设置输入提示 + +通过对Input组件添加showError方法来提示输入的错误原因。 + +``` + +
+ + + +
+``` + +``` +/* xxx.css */ +.content { + width: 100%; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: #F1F3F5; +} +.input { + width: 80%; + placeholder-color: gray; +} +.button { + width: 30%; + margin-top: 50px; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt' + export default { + data:{ + value:'', + }, + change(e){ + this.value = e.value; + prompt.showToast({ + message: "value: " + this.value, + duration: 3000, + }); + }, + buttonClick(e){ + if(this.value.length > 6){ + this.$element("input").showError({ error: 'Up to 6 characters are allowed.' }); + }else if(this.value.length == 0){ + this.$element("input").showError({ error:this.value + 'This field cannot be left empty.' }); + }else{ + prompt.showToast({ + message: "success " + }); + } + }, + } +``` + +![zh-cn_image_0000001208691071](/images/application-dev/ui/figures/zh-cn_image_0000001208691071.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - 该方法在Input类型为text、email、date、time、number和password时生效。 + + +## 场景示例 + + +根据场景选择不同类型的Input输入框,完成信息录入。 + + +``` + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+``` + + +``` +/* xxx.css */ +.container { + flex-direction: column; + background-color: #F1F3F5; +} +.label-item { + align-items: center; + border-bottom-width: 1px;border-color: #dddddd; +} +.lab { + width: 400px;} +label { + padding: 30px; + font-size: 30px; + width: 320px; + font-family: serif; + color: #9370d8; + font-weight: bold; +} +.flex { + flex: 1; +} +.textareaPadding { + padding-left: 100px; +} +``` + + +``` +// xxx.js +import prompt from '@system.prompt'; +export default { + data: { + }, + onInit() { + }, + btnclick(e) { + prompt.showToast({ + message:'Saved successfully!' + }) + } +} +``` + + +![zh-cn_image_0000001162586456](/images/application-dev/ui/figures/zh-cn_image_0000001162586456.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/03.Button.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/03.Button.md" new file mode 100644 index 0000000000000000000000000000000000000000..acbed3926e436c014015e1d34c6eb7225c56a12f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/03.Button.md" @@ -0,0 +1,294 @@ +--- +title: Button +permalink: /pages/000701000202 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# Button + +Button是按钮组件,其类型包括胶囊按钮、圆形按钮、文本按钮、弧形按钮、下载按钮。具体用法请参考[Button API](/pages/000b0100010200)。 + + +## 创建Button组件 + +在pages/index目录下的hml文件中创建一个Button组件。 + +``` + +
+ +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #F1F3F5; +} +``` + +![zh-cn_image_0000001211225091](/images/application-dev/ui/figures/zh-cn_image_0000001211225091.png) + + +## 设置Button类型 + +通过设置Button的type属性来选择按钮类型,如定义Button为圆形按钮、文本按钮等。 + + +``` + +
+ + +
+``` + + +``` +/* xxx.css */ +.container { + background-color: #F1F3F5; + flex-direction: column; + align-items: center; + justify-content: center; +} +.circle { + font-size: 120px; + background-color: blue; + radius: 72px; +} +.text { + margin-top: 30px; + text-color: white; + font-size: 30px; + font-style: normal; + background-color: blue; + width: 50%; + height: 100px; +} +``` + + +![zh-cn_image_0000001208771093](/images/application-dev/ui/figures/zh-cn_image_0000001208771093.png) + + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - 胶囊按钮(type=capsule)不支持border相关样式。 +> +> - 圆形按钮(type=circle)不支持文本相关样式。 +> +> - 文本按钮(type=text),自适应文本大小,不支持尺寸样式设置(radius,width,height),背景透明不支持background-color样式。 +> +> - Button组件使用的icon图标如果来自云端路径,需要添加网络访问权限 ohos.permission.INTERNET。 + + +如果需要添加ohos.permission.INTERNET权限,则在resources文件夹下的config.json文件里进行权限配置。 + + +``` + +"module": { + "reqPermissions": [{ + "name": "ohos.permission.INTERNET" + }], +} +``` + + +## 显示下载进度 + +为Button组件添加progress方法,来实时显示下载进度条的进度。 + +``` + +
+ +
+``` + +``` +/* xxx.css */ +.container { + background-color: #F1F3F5; + flex-direction: column; + align-items: center; + justify-content: center; +} +.download { + width: 280px; + text-color: white; + background-color: #007dff; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt'; +export default { + data: { + percent: 0, + downloadText: "Download", + isPaused: true, + intervalId : null, + }, + star(){ + this.intervalId = setInterval(()=>{ + if(this.percent <100){ + this.percent += 1; + this.downloadText = this.percent+ "%"; + } else{ + prompt.showToast({ + message: "Download succeeded." + }) + this.paused() + this.downloadText = "Download"; + this.percent = 0; + this.isPaused = true; + } + },100) + }, + paused(){ + clearInterval(this.intervalId); + this.intervalId = null; + }, + setProgress(e) { + if(this.isPaused){ + prompt.showToast({ + message: "Download started" + }) + this.star(); + this.isPaused = false; + }else{ + prompt.showToast({ + message: "Paused." + }) + this.paused(); + this.isPaused = true; + } + } +} +``` + +![zh-cn_image_0000001208393581](/images/application-dev/ui/figures/zh-cn_image_0000001208393581.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - setProgress方法只支持button的类型为download。 + + +## 场景示例 + +在本场景中,开发者可根据输入的文本内容进行Button类型切换。 + + +``` + +
+
+ +
+
+
+ + +
+
+
+``` + + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + background-color: #F1F3F5; +} +.input-item { + margin-bottom: 80px; + flex-direction: column; +} +.doc-row { + justify-content: center; + margin-left: 30px; + margin-right: 30px; + justify-content: space-around; +} +.input-text { + height: 80px; + line-height: 80px; + padding-left: 30px; + padding-right: 30px; + margin-left: 30px; + margin-right: 30px; + margin-top:100px; + border: 3px solid; + border-color: #999999; + font-size: 30px; + background-color: #ffffff; + font-weight: 400; +} +.select-button { + width: 35%; + text-align: center; + height: 70px; + padding-top: 10px; + padding-bottom: 10px; + margin-top: 30px; + font-size: 30px; + color: #ffffff; +} +.color-3 { + background-color: #0598db;; +} +``` + + +``` +// xxx.js +export default { + data: { + myflex: '', + myholder: 'Enter text.', + myname: '', + mystyle1: "#ffffff", + mystyle2: "#ff0000", + mytype: 'text', + myvalue: '', + }, + onInit() { + }, + changetype3() { + this.myflex = ''; + this.myholder = 'Enter text.'; + this.myname = ''; + this.mystyle1 = "#ffffff"; + this.mystyle2 = "#FF0000"; + this.mytype = 'text'; + this.myvalue = ''; + }, + changetype4() { + this.myflex = ''; + this.myholder = 'Enter a date.'; + this.myname = ''; + this.mystyle1 = "#ffffff"; + this.mystyle2 = "#FF0000"; + this.mytype = 'date'; + this.myvalue = ''; + }, +} +``` + + +![zh-cn_image_0000001163212628](/images/application-dev/ui/figures/zh-cn_image_0000001163212628.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/04.List.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/04.List.md" new file mode 100644 index 0000000000000000000000000000000000000000..d0acc9152ee95c755ce0560ff30ee4c38c1bddaa --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/04.List.md" @@ -0,0 +1,292 @@ +--- +title: List +permalink: /pages/000701000203 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# List + +List是用来显示列表的组件,包含一系列相同宽度的列表项,适合连续、多行地呈现同类数据。具体用法请参考[List API](/pages/000b0100010104)。 + + +## 创建List组件 + +在pages/index目录下的hml文件中创建一个List组件。 + +``` +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + background-color: #F1F3F5; +} +.listItem{ + height: 20%; + background-color:#d2e0e0; + margin-top: 20px; +} +``` + +![zh-cn_image_0000001211071477](/images/application-dev/ui/figures/zh-cn_image_0000001211071477.png) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - <list-item-group>是<list>的子组件,实现列表分组功能,不能再嵌套<list>,可以嵌套<list-item>。 +> +> - <list-item>是<list>的子组件,展示列表的具体项。 + + +## 添加滚动条 + +设置scrollbar属性为on即可在屏幕右侧生成滚动条,实现长列表或者屏幕滚动等效果。 + +``` +
+``` + +``` +/* index.css */ +.container { + flex-direction: column; + background-color: #F1F3F5; +} +.listItem{ + height: 20%; + background-color:#d2e0e0; + margin-top: 20px; +} +.listCss{ + height: 100%; + scrollbar-color: #8e8b8b; + scrollbar-width: 50px; +} +``` + +![zh-cn_image_0000001163212980](/images/application-dev/ui/figures/zh-cn_image_0000001163212980.gif) + + +## 添加侧边索引栏 + +设置indexer属性为自定义索引时,索引栏会显示在列表右边界处,indexer属性设置为true,默认为字母索引表。 + +``` +
+``` + +``` +/* index.css */.container{ flex-direction: column; + background-color: #F1F3F5; + } .listCss{ height: 100%; flex-direction: column; columns: 1} +``` + +![zh-cn_image_0000001166432552](/images/application-dev/ui/figures/zh-cn_image_0000001166432552.png) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - indexer属性生效需要flex-direction属性配合设置为column,且columns属性设置为1。 +> +> - indexer可以自定义索引表,自定义时"\#"必须要存在。 + + +## 实现列表折叠和展开 + +为List组件添加groupcollapse和groupexpand事件实现列表的折叠和展开。 + +``` + +
+ + + +
+ One---{{listgroup.value}} +
+
+ +
+ Primary---{{listgroup.value}} +
+
+
+
+
+``` + +``` +/* index.css */ +.doc-page { + flex-direction: column; + background-color: #F1F3F5; +} +list-item{ +margin-top:30px; +} +.top-list-item { + width:100%; + background-color:#D4F2E7; +} +.item-group-child { + justify-content: center; + align-items: center; + width:100%; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt'; +export default { + data: { + direction: 'column', + list: [] + }, + onInit() { + this.list = [] + this.listAdd = [] + for (var i = 1; i <= 2; i++) { + var dataItem = { + value: 'GROUP' + i, + }; + this.list.push(dataItem); + } + }, + collapse(e) { + prompt.showToast({ + message: 'Close ' + e.groupid + }) + }, + expand(e) { + prompt.showToast({ + message: 'Open ' + e.groupid + }) + } +} +``` + +![zh-cn_image_0000001162911958](/images/application-dev/ui/figures/zh-cn_image_0000001162911958.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - groupcollapse和groupexpand事件仅支持list-item-group组件使用。 + + +## 场景示例 + + +在本场景中,开发者可以根据字母索引表查找对应联系人。 + + +``` + +``` + + +``` +
+ + Contacts + + + +
+
+ {{$item.name}} + 18888888888 +
+
+
+ +
+ Total: 10 +
+
+
+
+``` + + +``` +/* index.css */ +.doc-page { + flex-direction: column; + background-color: #F1F3F5; +} +.list { + width: 100%; + height: 100%; +} +.item { + height: 120px; + padding-left: 10%; + border-top: 1px solid #dcdcdc; +} +.name { + color: #000000; + font-size: 39px; +} +.phone { + color: black; + font-size: 25px; +} +.container { + flex-direction: row; + align-items: center; +} +.in-container { + flex-direction: column; + justify-content: space-around; +} +``` + + +``` +// xxx.js +export default { + data: { + namelist:[{ + name: 'Zoey', + section:'Z' + },{ + name: 'Quin', + section:'Q' + },{ + name:'Sam', + section:'S' + },{ + name:'Leo', + section:'L' + },{ + name:'Zach', + section:'Z' + },{ + name:'Wade', + section:'W' + },{ + name:'Zoe', + section:'Z' + },{ + name:'Warren', + section:'W' + },{ + name:'Kyle', + section:'K' + },{ + name:'Zaneta', + section:'Z' + }] + }, + onInit() { + } + } +``` + + +![zh-cn_image_0000001208693047](/images/application-dev/ui/figures/zh-cn_image_0000001208693047.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/05.Picker.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/05.Picker.md" new file mode 100644 index 0000000000000000000000000000000000000000..d6685aa8b704714b45b0e256759cd8edbf867321 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/05.Picker.md" @@ -0,0 +1,305 @@ +--- +title: Picker +permalink: /pages/000701000204 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# Picker + +Picker是滑动选择器组件,类型支持普通选择器、日期选择器、时间选择器、时间日期选择器和多列文本选择器。具体用法请参考[Picker API](/pages/000b010001020a)。 + + +## 创建Picker组件 + +在pages/index目录下的hml文件中创建一个Picker组件。 + +``` + +
+ picker +
+``` + +``` +/* index.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #F1F3F5; +} +``` + +![zh-cn_image_0000001210951541](/images/application-dev/ui/figures/zh-cn_image_0000001210951541.gif) + + +## 设置Picker类型 + +通过设置Picker的type属性来选择滑动选择器类型,如定义Picker为日期选择器。 + +``` + +
+ + +
+``` + +``` +/* index.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #F1F3F5; +} +.pickertext{ + margin-bottom: 30px; +} +``` + +``` +// xxx.js +export default { + data: { + rangetext:['15', "20", "25"], + textvalue:'Select text', + datevalue:'Select date', + } +} +``` + +![zh-cn_image_0000001163515416](/images/application-dev/ui/figures/zh-cn_image_0000001163515416.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - 普通选择器设置取值范围时,需要使用数据绑定的方式。 +> +> - 日期选择器的lunarswitch属性只支持手机和平板设备。 + + +## 设置时间展现格式 + +Picker的hours属性定义时间的展现格式,可选类型有12小时制和24小时制。 + +``` + +
+ + +
+``` + +``` +/* index.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #F1F3F5; +} +.pickertime { + margin-bottom:50px; + width: 300px; + height: 50px; +} +``` + +![zh-cn_image_0000001163212630](/images/application-dev/ui/figures/zh-cn_image_0000001163212630.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - hours属性为12:按照12小时制显示,用上午和下午进行区分; +> +> - hours属性为24:按照24小时制显示。 + + +## 添加响应事件 + +对Picker添加change和cancel事件,来对选择的内容进行确定和取消。 + +``` + +
+ +
+``` + +``` +/* index.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #F1F3F5; +} +.pickermuitl { + margin-bottom:20px; + width: 600px; + height: 50px; + font-size: 25px; + letter-spacing:15px; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt'; +export default { + data: { + multitext:[["a", "b", "c"], ["e", "f", "g"], ["h", "i"]], + multitextvalue:'Select multi-line text', + multitextselect:[0,0,0], + }, + multitextonchange(e) { + this.multitextvalue=e.newValue; + prompt.showToast({ message:"Multi-column text changed to:" + e.newValue }) + }, + multitextoncancel() { + prompt.showToast({ message:"multitextoncancel" }) + }, +} +``` + +![zh-cn_image_0000001163372620](/images/application-dev/ui/figures/zh-cn_image_0000001163372620.gif) + + +## 场景示例 + + +在本场景中,开发者可以自定义填写当前的健康情况来进行打卡。 + + +``` + +
+ Health check-in +
+ Office: + +
+ +
+ Office hours: + +
+ +
+ Having fever or cold symptoms + +
+ +
+ Close contact with someone with COVID-19 + +
+
+ +
+
+``` + + +``` +/* index.css */ +.doc-page { + flex-direction: column; + background-color: #F1F3F5; +} +.title { + margin-top: 30px; + margin-bottom: 30px; + margin-left: 50px; + font-weight: bold; + color: #0000ff; + font-size: 38px; +} +.out-container { + flex-direction: column; + align-items: center; +} +.pick { + width: 80%; + height: 76px; + border: 1px solid #0000ff; + border-radius: 20px; + padding-left: 12px; +} +.txt { + width: 80%; + font-size: 18px; + text-align: left; + margin-bottom: 12px; + margin-left: 12px; +} +.dvd { + margin-top: 30px; + margin-bottom: 30px; + margin-left: 80px; + margin-right: 80px; + color: #6495ED; + stroke-width: 6px; +} +``` + + +``` +// xxx.js +import pmt from '@system.prompt' +export default { + data: { + yorn1:'No', + yorn2:'No', + pos:'Home', + yesno:['Yes', 'No'], + posarr:['Home', 'Company'], + datevalue:'Select time', + datetimeselect:'2012-5-6-11-25', + dateselect:'2021-9-17', + showbuild:true + }, + onInit() { + }, + isFever(e) { + this.yorn1 = e.newValue + }, + isTouch(e) { + this.yorn2 = e.newValue + }, + setPos(e) { + this.pos = e.newValue + if (e.newValue === 'Non-research center') { + this.showbuild = false + } else { + this.showbuild = true + } + }, + setbuild(e) { + this.build = e.newValue + }, + dateonchange(e) { + this.datevalue = e.year + "-" + e.month + "-" + e.day; + pmt.showToast({ message:"date:"+e.year+"-"+e.month+"-"+e.day }) }, + datetimeonchange(e) { + this.datetimevalue=e.year+"-"+e.month+"-"+e.day+" "+e.hour+":"+e.minute; + pmt.showToast({ message:"Time:"+e.month+"-"+e.day+" "+e.hour+":"+e.minute }) + }, + showtoast() { + pmt.showToast({ + message: 'Submitted.', + duration: 2000, + gravity: 'center' + }) + } +} +``` + + +![zh-cn_image_0000001208703849](/images/application-dev/ui/figures/zh-cn_image_0000001208703849.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/06.Dialog.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/06.Dialog.md" new file mode 100644 index 0000000000000000000000000000000000000000..f6b19ee4894ac95e53c40f3ba46f06debc7e92df --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/06.Dialog.md" @@ -0,0 +1,317 @@ +--- +title: Dialog +permalink: /pages/000701000205 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# Dialog + +Dialog组件用于创建自定义弹窗,通常用来展示用户当前需要或用户必须关注的信息或操作。具体用法请参考[Dialog API](/pages/000b0100010101)。 + + +## 创建Dialog组件 + +在pages/index目录下的hml文件中创建一个Dialog组件,并添加Button组件来触发Dialog,当dragable为true时Dialog组件可进行拖拽。。Dialog组件仅支持width、height、margin、margin-[left|top|right|bottom]、margin-[start|end]样式。。 +``` + +
+
+ this is a dialog +
+
+ +
+``` + +``` +/* xxx.css */ +.doc-page { + flex-direction: column; + align-items: center; + justify-content: center; + background-color: #F1F3F5; +} +.dialogClass{ + width: 80%; + height: 250px; + margin-start: 1%; +} +.content{ + width: 100%; + height: 250px; + justify-content: center; + background-color: #e8ebec; + border-radius: 20px; +} +text{ + width: 100%; + height: 100%; + text-align: center; +} +button{ + width: 70%; + height: 60px; +} +``` + +``` +/* xxx.js */ +export default { + //Touch to open the dialog box. + openDialog(){ + this.$element('dialogId').show() + }, +} +``` + +![zh-cn_image_0000001211246571](/images/application-dev/ui/figures/zh-cn_image_0000001211246571.gif)![zh-cn_image_0000001211246571](/images/application-dev/ui/figures/zh-cn_image_0000001211246571.gif) + + +## 设置弹窗响应 + +开发者点击页面上非Dialog的区域时,将触发cancel事件而关闭弹窗,。同时也可以通过对Dialog添加show和close方法来显示和关闭弹窗,当弹窗显示时触发show事件,关闭则触发close事件。。 + + +``` + +
+ +
+ dialog + +
+
+ +
+``` + + +``` +/* xxx.css */ +.doc-page { + flex-direction: column; + align-items: center; + justify-content: center; + background-color: #F1F3F5; +} +.dialogClass{ + width: 80%; + height: 300px; + margin-start: 1%; +} +.dialogDiv{ + width: 100%; + flex-direction: column; + justify-content: center; + align-self: center; +} +text{ + height: 100px; + align-self: center; +} +button{ + align-self: center; + margin-top: 20px; + width: 60%; + height: 80px; +} +``` + + +``` +/* xxx.js */ +import prompt from '@system.prompt'; +export default { + openDialog(){ + this.$element('dialogId').show() + }, + confirmClick(e) { + this.$element('dialogId').close() prompt.showToast({ message: 'Confirmed.' })}, }, show(){ prompt.showToast({duration:2000,message:'dialogShow'}) }, close(){ prompt.showToast({duration:2000,message:'dialogClose'}) }, cancel(){ prompt.showToast({duration:2000,message:'dialogCancel'}) }, +} +``` + + +![zh-cn_image_0000001163229150](/images/application-dev/ui/figures/zh-cn_image_0000001163229150.gif)![zh-cn_image_0000001163229150](/images/application-dev/ui/figures/zh-cn_image_0000001163229150.gif) + + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - 仅支持单个子组件。 +> +> - Dialog属性、样式均不支持动态更新。 +> +> - Dialog组件不支持focusable、click-effect属性。 + + +## 场景示例 + + +在本场景中,开发者可以通过Dialog组件实现一个日程表。弹窗在打开状态下,利用[Textarea组件](/pages/000b0100010217)输入当前日程,点击确认按钮后获取当前时间并保存输入文本。最后以列表形式将各日程进行展示。 + + +``` + +
+ + {{date}} events + +
+ +
+ + + +
+ {{date}} event + {{$item.schedule}} +
+
+
+ +
+
+ {{date}} + New event +
+ +
+ + +
+
+
+
+``` + + +``` +/* xxx.css */ +.doc-page { + flex-direction: column; + background-color: #F1F3F5; +} +.btndiv { + width: 100%; + height: 200px; + flex-direction: column; + align-items: center; + justify-content: center; +} +.btn { + radius:60px; + font-size: 100px; + background-color: #1E90FF; +} +.schedulediv { + width: 100%; + height: 200px; + flex-direction: column; + justify-content: space-around; + padding-left: 55px; +} +.text1 { + color: #000000; + font-weight: bold; + font-size: 39px; +} +.text2 { + color: #a9a9a9; + font-size: 30px; +} +.dialogdiv { + flex-direction: column; + align-items: center; +} +.innertxt { + width: 320px; + height: 160px; + flex-direction: column; + align-items: center; + justify-content: space-around; +} +.text3 { + font-family: serif; + color: #1E90FF; + font-size: 38px; +} +.text4 { + color: #a9a9a9; + font-size: 33px; +} +.area { + width: 320px; + border-bottom: 1px solid #1E90FF; +} +.innerbtn { + width: 320px; + height: 120px; + justify-content: space-around; +} +.btntxt { + text-color: #1E90FF; +} +``` + + +``` +/* xxx.js */ +var info = null; +import prompt from '@system.prompt'; +import router from '@system.router'; +export default { + data: { + curYear:'', + curMonth:'', + curDay:'', + date:'', + schedule:'', + schedulelist:[] + }, + onInit() { + // Obtain the current date. + var date = new Date(); + this.curYear = date.getFullYear(); + this.curMonth = date.getMonth() + 1; + this.curDay = date.getDate(); + this.date = this.curYear + '-' + this.curMonth + '-' + this.curDay; + this.schedulelist = [] + }, + addschedule(e) { + this.$element('datedialog').show() + }, + canceldialog(e) { + prompt.showToast({ + message: 'Event setting canceled.' + }) + }, + getschedule(e) { + info = e.value + }, + cancelschedule(e) { + this.$element('datedialog').close() + prompt.showToast({ + message: 'Event setting canceled.' + }) + }, +// Touch OK to save the data. + setschedule(e) { + if (e.text === '') { + this.schedule = info + } else { + this.schedule = info + var addItem = {schedule: this.schedule,} + this.schedulelist.push(addItem) + } + this.$element('datedialog').close() + } +} +``` + + +![zh-cn_image_0000001163531184](/images/application-dev/ui/figures/zh-cn_image_0000001163531184.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/07.Form.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/07.Form.md" new file mode 100644 index 0000000000000000000000000000000000000000..12b430f5f0f9f9647d60589b021160a91de8050a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/07.Form.md" @@ -0,0 +1,204 @@ +--- +title: Form +permalink: /pages/000701000206 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# Form + +Form是一个表单容器,支持容器内[Input](/pages/000b0100010205)组件内容的提交和重置。具体用法请参考[Form API](/pages/000b0100010103)。 + + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> 从 API Version 6 开始支持。 + + +## 创建Form组件 + +在pages/index目录下的hml文件中创建一个Form组件。 +``` + +
+
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #F1F3F5; +} +``` + +![zh-cn_image_0000001211069339](/images/application-dev/ui/figures/zh-cn_image_0000001211069339.png) + + +## 实现表单缩放 + +为Form组件添加click-effect属性,实现点击表单后的缩放效果,click-effect枚举值请参考[通用属性](/pages/000b0100010000)。 +``` + +
+
+ +
+
+``` + + +## 设置Form样式 + + +通过为Form添加background-color和border属性,来设置表单的背景颜色和边框。 + + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + justify-content: center; + background-color: #F1F3F5; +} +.formClass{ + width: 80%; + padding: 10px; + border: 1px solid #c3d3e7; +} +``` + + +![zh-cn_image_0000001208771113](/images/application-dev/ui/figures/zh-cn_image_0000001208771113.gif) + + +## 添加响应事件 + +为Form组件添加submit和reset事件,来提交表单内容或重置表单选项。 +``` + +
+
+
+
+ + + + +
+
+ + +
+
+
+
+``` + +``` +/* xxx.js */ +import prompt from '@system.prompt'; +export default{ + onSubmit(result) { + prompt.showToast({ + message: result.value.radioGroup + }) + }, + onReset() { + prompt.showToast({ + message: 'Reset All' + }) + } +} +``` + + +![zh-cn_image_0000001163691126](/images/application-dev/ui/figures/zh-cn_image_0000001163691126.gif) + + +## 场景示例 + +在本场景中,开发者可以选择相应选项并提交或重置数据。 + +创建[Input](/pages/000b0100010205)组件,分别设置type属性为checkbox(多选框)和radio(单选框),再使用Form组件的onsubmit和onreset事件实现表单数据的提交与重置。 + +``` + +
+
+ + Form + +
+ Select 1 or more options +
+ + + + +
+ + Select 1 option +
+ + + + +
+ + Text box + +
+ Submit + Reset +
+
+
+
+``` + +``` +/* index.css */ +.container { + flex-direction:column; + align-items:center; + background-color:#F1F3F5; +} +.txt { + font-size:33px; + font-weight:bold; + color:darkgray; +} +label{ + font-size: 20px; +} +``` + +``` +/* xxx.js */ +import prompt from '@system.prompt'; +export default { + formSubmit() { + prompt.showToast({ + message: 'Submited.' + }) + }, + formReset() { + prompt.showToast({ + message: 'Reset.' + }) + } +} +``` + +![zh-cn_image_0000001163372646](/images/application-dev/ui/figures/zh-cn_image_0000001163372646.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/08.Stepper.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/08.Stepper.md" new file mode 100644 index 0000000000000000000000000000000000000000..cd3cc1c851c61d357529b1be8e8cbb6386a3a963 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/08.Stepper.md" @@ -0,0 +1,356 @@ +--- +title: Stepper +permalink: /pages/000701000207 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# Stepper + +当一个任务需要多个步骤时,可以使用stepper组件展示当前进展。具体用法请参考[Stepper API](/pages/000b010001010b)。 + + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> 从API Version 5 开始支持。 + + +## 创建Stepper组件 + +在pages/index目录下的hml文件中创建一个Stepper组件。 + +``` +
Step 1 Step 2
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #F1F3F5; +} +text{ + width: 100%; + height: 100%; + text-align: center; +} +``` + +![zh-cn_image_0000001210951235](/images/application-dev/ui/figures/zh-cn_image_0000001210951235.gif) + + +## 设置index属性 + +页面默认显示索引值为index的步骤。 + +``` +
stepper-item1 stepper-item2 stepper-item3
+``` + +``` +/* index.css */ +.container { + flex-direction: column; + background-color:#F1F3F5; +} +text{ + width: 100%; + height: 100%; + text-align: center; +} +``` + +![zh-cn_image_0000001208892613](/images/application-dev/ui/figures/zh-cn_image_0000001208892613.gif) + +通过设置label属性,自定义stepper-item的提示按钮。 + +``` +
stepper-item1 stepper-item2 stepper-item3 stepper-item4
+``` + +``` +/* index.css */ +.container { + flex-direction: column; + background-color:#F1F3F5; +} +text{ + width: 100%; + height: 100%; + text-align: center; +} +``` + +``` +/* index.js */ +export default { + data: { + label_1:{ nextLabel: 'NEXT', status: 'normal' }, + label_2:{ + prevLabel: 'BACK', + nextLabel: 'NEXT', + status: 'normal' + }, + label_3:{ + prevLabel: 'BACK', + nextLabel: 'END', + status: 'disabled' + }, + }, +} +``` + +![zh-cn_image_0000001163531210](/images/application-dev/ui/figures/zh-cn_image_0000001163531210.gif) + + +## 设置样式 + +Stepper组件默认填充父容器,通过border和background-color设置边框、背景色。 +``` +
+
+ stepper-item1 +
+
+``` + +``` +/* index.css */ +.container { + flex-direction: column; + align-items: center; + justify-content: center; + background-color:#F1F3F5; +} +.stepperContent{ + width: 300px; + height: 300px; +} +.stepperClass{ + border:1px solid silver ; background-color: white; +} +text{ + width: 100%; + height: 100%; + text-align: center; +} +``` + +![zh-cn_image_0000001163691154](/images/application-dev/ui/figures/zh-cn_image_0000001163691154.png) + + +## 添加事件 + +Stepper分别添加finish,change,next,back,skip事件。 + +- 当change与next或back同时存在时,会先执行next或back事件再去执行change事件。 + +- 重新设置index属性值时要先清除index的值再重新设置,否则检测不到值的改变。 + +``` + +
+
+ + + stepper-item1 + + + + stepper-item2 + + + + stepper-item3 + + +
+
+``` + +``` +/* xxx.css */ +.doc-page { + flex-direction: column; + align-items: center; + justify-content: center; +} +stepper-item{ + width: 100%; + flex-direction: column; + align-self: center; + justify-content: center; +} +text{ + margin-top: 45%; + justify-content: center; + align-self: center; + margin-bottom: 50px; +} +button{ + width: 80%; + height: 60px; + margin-top: 20px; +} +``` + +``` +/* index.js */ +import prompt from '@system.prompt'; +export default { + data: { + index:0, + }, + stepperSkip(){ + this.index = null; + this.index=2; + }, + skipClick(){ + this.$element('stepperId').setNextButtonStatus({status: 'skip', label: 'SKIP'}); + }, + stepperFinish(){ + prompt.showToast({ + message: 'All Finished' + }) + }, + stepperChange(e){ + console.log("stepperChange"+e.index) + prompt.showToast({ + message: 'Previous step: '+e.prevIndex+"-------Current step:"+e.index + }) + }, + stepperNext(e){ + console.log("stepperNext"+e.index) + prompt.showToast({ + message: 'Current step:'+e.index+"-------Next step:"+e.pendingIndex + }) + var index = {pendingIndex:e.pendingIndex } + return index; + }, + stepperBack(e){ + console.log("stepperBack"+e.index) + var index = {pendingIndex: e.pendingIndex } + return index; + } +} +``` + +![zh-cn_image_0000001163547244](/images/application-dev/ui/figures/zh-cn_image_0000001163547244.gif) + + +## 场景示例 + +在本场景中,开发者可以在界面上点击选择并实时显示选择结果,点击下一步按钮后可动态修改页面的字体颜色和字体大小。 + +用Stepper组件实现分步,再创建[Toggle](/pages/000b010001021a)组件实现选择显示功能,再使用[Select](/pages/000b0100010212)组件实现改变选中值动态修改字体颜色或大小。 + +``` +
+ + +
+ Select error types: + + {{error}} + +
+ +
+
+
+ +
+ Toggle +
+ + +
+
+
+ text-color + +
+
+ font-size + +
+
+
+
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + justify-content: center; + background-color:#F1F3F5; +} +.dvd { + stroke-width: 8px; + color: orangered; + margin: 65px; +} +.tog{ + margin-right: 20px; + margin-top: 30px; +} +``` + +``` +/* index.js */ +import prompt from '@system.prompt'; +import router from '@system.router'; +let myset = new Set(); +export default { + data: { + error: '', + tcolor:'#FF4500', + color_list:['#FF4500','#5F9EA0','#0000FF'], + tsize: '12px', + size_list: ['12px', '30px', '8px', '50px'], + label1: { + prevLabel: 'The text on the left of the starting step is invalid.', + nextLabel: 'Toggle' + }, + label2: { + prevLabel: 'toggle', + nextLabel: 'END' + }, + togglelist1:['Program error', 'Software', 'System', 'Application'], + }, + multiTog(arg, e) { + this.error = ' ' + if (e.checked) { + myset.add(arg) + } else { + myset.delete(arg) + } + for (let item of myset) { + this.error += item + ' ' + } + }, + settcolor(e) { + this.tcolor = e.newValue + }, + settsize(e) { + this.tsize = e.newValue + } +} +``` + +![zh-cn_image_0000001163214740](/images/application-dev/ui/figures/zh-cn_image_0000001163214740.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/09.Tabs.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/09.Tabs.md" new file mode 100644 index 0000000000000000000000000000000000000000..5bc018d73a4053505dba3c760ecfa82aad09d0e1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/09.Tabs.md" @@ -0,0 +1,317 @@ +--- +title: Tabs +permalink: /pages/000701000208 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# Tabs + +Tabs是一种常见的界面导航结构。通过页签容器,用户可以快捷地访问应用的不同模块。具体用法请参考[Tabs API](/pages/000b010001010e)。 + + +## 创建Tabs + +在pages/index目录下的hml文件中创建一个Tabs组件。 + +``` + +
+ + item1 + item2 + + +
+ content1 +
+
+ content2 +
+
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #F1F3F5; +} +.text{ + width: 100%; + height: 100%; + justify-content: center; + align-items: center; +} +``` + +![zh-cn_image_0000001165191390](/images/application-dev/ui/figures/zh-cn_image_0000001165191390.gif) + + +## 设置Tabs方向 + +Tabs默认展示索引为index的标签及内容。通过设置vertical属性使组件纵向展示。 + +``` + +
+ + + item1 + item2 + + +
+ +
+
+ +
+
+
+
+``` + +![zh-cn_image_0000001208908643](/images/application-dev/ui/figures/zh-cn_image_0000001208908643.gif) + +设置mode属性使tab-bar的子组件均分,设置scrollable属性使tab-content不可进行左右滑动切换内容。 + +``` + +
+ + + item1 + item2 + + +
+ +
+
+ +
+
+
+
+``` + +![zh-cn_image_0000001209028575](/images/application-dev/ui/figures/zh-cn_image_0000001209028575.gif) + + +## 设置样式 + +设置Tabs背景色及边框和tab-content布局。 +``` + +
+ + + item1 + item2 + + +
+ content1 +
+
+ content2 +
+
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: flex-start; + align-items: center; + background-color:#F1F3F5; +} +.tabs{ + margin-top: 20px; + border: 1px solid #2262ef; + width: 99%; + padding: 10px; +} +.tabBar{ + width: 100%; + border: 1px solid #78abec; +} +.tabContent{ + width: 100%; + margin-top: 10px; + height: 300px; + color: blue; + justify-content: center; align-items: center; +} +``` + +![zh-cn_image_0000001163388642](/images/application-dev/ui/figures/zh-cn_image_0000001163388642.gif) + + +## 显示页签索引 + +开发者可以为Tabs添加change事件,实现页签切换后显示当前页签索引的功能。 + +``` + +
+ + + item1 + item2 + + +
+ +
+
+ +
+
+
+
+``` + +``` +/* index.js */ +import prompt from '@system.prompt'; +export default { + tabChange(e){ + prompt.showToast({ + message: "Tab index: " + e.index + }) + } +} +``` + +![zh-cn_image_0000001163228638](/images/application-dev/ui/figures/zh-cn_image_0000001163228638.gif) + + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +> - tabs子组件仅支持一个[](/pages/000b010001010f)和一个[](/pages/000b0100010110)。 + + +## 场景示例 + +在本场景中,开发者可以点击标签切换内容,选中后标签文字颜色变红,并显示下划线。 + +用tabs、tab-bar和tab-content实现点击切换功能,再定义数组,设置属性。使用change事件改变数组内的属性值实现变色及下划线的显示。 + +``` + +
+ + +
+
+ +
+
+ +
+
+ +
+
+
+ +
+ {{$item.title}} +
+
+
+
+
+
+``` + +``` +/* xxx.css */ +.container{ +background-color:#F1F3F5; +} +.tab_bar { + width: 100%; +} +.tab_item { + flex-direction: column; + align-items: center; +} +.tab_item text { + font-size: 32px; +} +.item-container { + justify-content: center; + flex-direction: column; +} +.underline-show { + height: 2px; + width: 160px; + background-color: #FF4500; + margin-top: 7.5px; +} +.underline-hide { + height: 2px; + margin-top: 7.5px; + width: 160px; +} +``` + +``` +/* index.js */ +import prompt from '@system.prompt'; +export default { + data() { + return { + datas: { + color_normal: '#878787', + color_active: '#ff4500', + show: true, + list: [{ + i: 0, + color: '#ff4500', + show: true, + title: 'List1' + }, { + i: 1, + color: '#878787', + show: false, + title: 'List2' + }, { + i: 2, + color: '#878787', + show: false, + title: 'List3' + }] + } + } + }, + changeTabactive (e) { + for (let i = 0; i < this.datas.list.length; i++) { + let element = this.datas.list[i]; + element.show = false; + element.color = this.datas.color_normal; + if (i === e.index) { + element.show = true; + element.color = this.datas.color_active; + } + } + } +} +``` + +![zh-cn_image_0000001163228602](/images/application-dev/ui/figures/zh-cn_image_0000001163228602.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/10.Image.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/10.Image.md" new file mode 100644 index 0000000000000000000000000000000000000000..4e9a8ad4c34f1adc32be099b09857c1b8daa8a50 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\345\270\270\350\247\201\347\273\204\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274/10.Image.md" @@ -0,0 +1,280 @@ +--- +title: Image +permalink: /pages/000701000209 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# Image + +Image是图片组件,用来渲染展示图片。具体用法请参考[Image API](/pages/000b0100010203)。 + + +## 创建Image组件 + +在pages/index目录下的hml文件中创建一个Image组件。 +``` + +
+ +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #F1F3F5; +} +``` + +![zh-cn_image_0000001211227617](/images/application-dev/ui/figures/zh-cn_image_0000001211227617.png) + + +## 设置Image样式 + +通过设置width、height和object-fit属性定义图片的宽、高和缩放样式。 + + +``` + +
+ +
+``` + + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + justify-content: center; +background-color:#F1F3F5; +} +image{ + width: 80%; height: 500px; + border: 5px solid saddlebrown; + border-radius: 20px; + object-fit: contain; + match-text-direction:true; + object-position: center center; +} +``` + + +![zh-cn_image_0000001163532072](/images/application-dev/ui/figures/zh-cn_image_0000001163532072.png) + + +## 显示多张图 + +定义for循环展示多张图片,同时定义option选择图片的展示方式,选择方式请参考object-fit类型说明。 +``` + +
+ + + +
+ image{{$idx}} + content +
+
+
+
+ +
+
+``` + +``` +/* xxx.css */ +.page-container { + flex-direction:column; + background-color:#F1F3F5; +} +.text-container { + width: 300px; + flex-direction: column; + justify-content: center; +} +.item-container { + flex-direction: row; + align-items: center; + justify-content:center; + margin-top:200px; +} +.testimage { + width: 175px; + height: 220px; + border: 5px solid #add8e6; + padding: 5px 5px 5px 5px; + margin: 5px 5px 5px 5px; +} +.testicon { + width: 50px; + height: 50px; + margin-left: 150px; + border-radius: 25px; + background-color: orange; +} +``` + +``` +/* index.js */ +export default { + data: { + url:['common/images/bg-tv.jpg','common/images/img2.jpg'], + list:[0,1], + fit:'cover', + fit_list:['cover','contain','fill','none','scale-down'] + }, + setfit(e) { + this.fit = e.newValue + } +} +``` + + +![zh-cn_image_0000001208787005](/images/application-dev/ui/figures/zh-cn_image_0000001208787005.gif) + + +## 加载图片 + +图片成功加载时触发complete事件,返回加载的图源尺寸。加载失败则触发error事件,打印图片加载失败。 + +``` + +
+
+ +
+
+ +
+
+``` + +``` +/* xxx.css */ +.container{ + flex-direction: column; + justify-content: center; + align-self: center; + background-color: #F1F3F5; +} +.container div{ + margin-left: 10%; + width: 80%; + height: 300px; + margin-bottom: 40px; +} +``` + +``` +/* index.js */ +import prompt from '@system.prompt'; +export default { + imageComplete(i,e){ + prompt.showToast({ + message: "Image "+i+"'s width"+ e.width+"----Image "+i+"'s height"+e.height, + duration: 3000, + }) + }, + imageError(i,e){ + setTimeout(()=>{ + prompt.showToast({ + message: "Failed to load image "+i+".", + duration: 3000, + }) + },3000) + } +} +``` + +![zh-cn_image_0000001210358571](/images/application-dev/ui/figures/zh-cn_image_0000001210358571.gif) + + +## 场景示例 + +在本场景中,开发者长按图片后将慢慢隐藏图片,当完全隐藏后再重新显示原始图片。定时器setInterval每隔一段时间改变图片透明度,实现慢慢隐藏的效果,当透明度为0时清除定时器,设置透明度为1。 +``` + +
+
+
+ +
+
+ Touch and hold the image +
+
+
+``` + +``` +/* xxx.css */ +.page-container { + flex-direction:column; + align-self: center; + justify-content: center; + background-color:#F1F3F5; +} +.content{ + flex-direction:column; +} +.image-container { + width: 100%; + height: 300px; + align-items: center; + justify-content: center; +} +.text-container { + margin-top:50px; + width: 100%; + height: 60px; + flex-direction: row; + justify-content: space-between; +} +.testimage { + width: 100%; height: 400px; object-fit: scale-down; border-radius: 20px;} +``` + +``` +/* index.js */ +import prompt from '@system.prompt'; +export default { + data: { + testuri: 'common/images/bg-tv.jpg', + imageopacity:1, + timer: null + }, + changeopacity: function () { + prompt.showToast({ + message: 'Touch and hold the image.' + }) + var opval = this.imageopacity * 20 + clearInterval(this.timer); + this.timer = setInterval(()=>{ + opval--; + this.imageopacity = opval / 20 + if (opval===0) { + clearInterval(this.timer) + this.imageopacity = 1 + } + },100); + } +} +``` + +![zh-cn_image_0000001208892929](/images/application-dev/ui/figures/zh-cn_image_0000001208892929.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/01.CSS\345\212\250\347\224\273/01.\345\261\236\346\200\247\346\240\267\345\274\217\345\212\250\347\224\273.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/01.CSS\345\212\250\347\224\273/01.\345\261\236\346\200\247\346\240\267\345\274\217\345\212\250\347\224\273.md" new file mode 100644 index 0000000000000000000000000000000000000000..9592008a0007f2a460c4379951df9f3c5f669ace --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/01.CSS\345\212\250\347\224\273/01.\345\261\236\346\200\247\346\240\267\345\274\217\345\212\250\347\224\273.md" @@ -0,0 +1,99 @@ +--- +title: 属性样式动画 +permalink: /pages/00070100030000 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# 属性样式动画 + +在关键帧(Keyframes)中动态设置父组件的width和height,实现组件变大缩小。子组件设置scale属性使父子组件同时缩放,再设置opacity实现父子组件的显示与隐藏。 + +``` + +
+
+ fading away +
+
+ getting bigger +
+
+``` + +``` +/* xxx.css */ +.container { + background-color:#F1F3F5; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} +.fade{ + width: 30%; + height: 200px; + left: 35%; + top: 25%; + position: absolute; + animation: 2s change infinite friction; +} +.bigger{ + width: 20%; + height: 100px; + background-color: blue; + animation: 2s change1 infinite linear-out-slow-in; +} +text{ + width: 100%; + height: 100%; + text-align: center; + color: white; + font-size: 35px; + animation: 2s change2 infinite linear-out-slow-in; +} +/* 颜色变化 */ +@keyframes change{ + from { + background-color: #f76160; + opacity: 1; + } + to { + background-color: #09ba07; + opacity: 0; + } +} +/* 父组件大小变化 */ +@keyframes change1{ + 0% { + width: 20%; + height: 100px; + } + 100% { + width: 80%; + height: 200px; + } +} +/* 子组件文字缩放 */ +@keyframes change2{ + 0%{ + transform: scale(0); + } + 100% { + transform: scale(1.5); + } +} +``` + +![](/images/application-dev/ui/figures/d1.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>1. animation取值不区分先后,duration (动画执行时间)/ delay (动画延迟执行时间)按照出现的先后顺序解析。 +>2. 必须设置animation-duration样式,否则时长为0则不会有动画效果。当设置animation-fill-mode属性为forwards时,组件直接展示最后一帧的样式。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/01.CSS\345\212\250\347\224\273/02.transform\346\240\267\345\274\217\345\212\250\347\224\273.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/01.CSS\345\212\250\347\224\273/02.transform\346\240\267\345\274\217\345\212\250\347\224\273.md" new file mode 100644 index 0000000000000000000000000000000000000000..523613a642117a463268e01f96428b1511860bc3 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/01.CSS\345\212\250\347\224\273/02.transform\346\240\267\345\274\217\345\212\250\347\224\273.md" @@ -0,0 +1,581 @@ +--- +title: transform样式动画 +permalink: /pages/00070100030001 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:34 +--- +# transform样式动画 + +设置transform属性对组件进行旋转、缩放、移动和倾斜。 + +## 设置静态动画 + +创建一个正方形并旋转90°变成菱形,并用下方的长方形把菱形下半部分遮盖形成屋顶,设置长方形translate属性值为\(150px,-150px\)确定坐标位置形成门,再使用position属性使横纵线跟随父组件(正方形)移动到指定坐标位置,接着设置scale属性使父子组件一起变大形成窗户大小,最后使用skewX属性使组件倾斜后设置坐标translate\(200px,-830px\)得到烟囱。 + +``` + +
+
+
+
+ +
+
+
+
+
+
+``` + +``` +/* xxx.css */ +.container { + background-color:#F1F3F5; + align-items: center; + flex-direction: column; +} +.top{ + z-index: -1; + position: absolute; + width: 428px; + height: 428px; + background-color: #860303; + transform: rotate(45deg); + margin-top: 230px; + margin-left: 266px; +} +.content{ + margin-top: 500px; + width: 600px; + height: 400px; + background-color: white; + border: 1px solid black; +} +.door{ + width: 100px; + height: 150px; + background-color: #1033d9; + transform: translate(150px,-150px); +} +.window{ + z-index: 1; + position: relative; + width: 100px; + height: 100px; + background-color: white; + border: 1px solid black; + transform: translate(-150px,-400px) scale(1.5); +} +/* 窗户的横轴 */ +.horizontal{ + position: absolute; + top: 50%; + width: 100px; + height: 5px; + background-color: black; +} +/* 窗户的纵轴 */ +.vertical{ + position: absolute; + left: 50%; + width: 5px; + height: 100px; + background-color: black; +} +.chimney{ + z-index: -2; + width: 40px; + height: 100px; + border-radius: 15px; + background-color: #9a7404; + transform: translate(200px,-830px) skewX(-5deg); +} +``` + +![](/images/application-dev/ui/figures/111.png) + +## 设置平移动画 + +小球下降动画,改变小球的Y轴坐标实现小球下落,在下一段是时间内减小Y轴坐标实现小球回弹,让每次回弹的高度逐次减小直至回弹高度为0,就模拟出了小球下降的动画。 + +``` + +
+
+
+
+``` + +``` +/* xxx.css */ +.container { + background-color:#F1F3F5; + display: flex; + justify-content: center; +} +.circle{ + width: 100px; + height: 100px; + border-radius: 50px; + background-color: red; + /* forwards停在动画的最后一帧 */ + animation: down 3s fast-out-linear-in forwards; +} +.flower{ + position: fixed; + width: 80%; + margin-left: 10%; + height: 5px; + background-color: black; + top: 1000px; +} +@keyframes down { + 0%{ + transform: translate(0px,0px); + } + /* 下落 */ + 15%{ + transform: translate(10px,900px); + } + /* 开始回弹 */ + 25%{ + transform: translate(20px,500px); + } + /* 下落 */ + 35%{ + transform: translate(30px,900px); + } + /* 回弹 */ + 45%{ + transform: translate(40px,700px); + } + 55%{ + transform: translate(50px,900px); + } + 65%{ + transform: translate(60px,800px); + } + 80%{ + transform: translate(70px,900px); + } + 90%{ + transform: translate(80px,850px); + } + /* 停止 */ + 100%{ + transform: translate(90px,900px); + } +} +``` + +![](/images/application-dev/ui/figures/q2.gif) + +## 设置旋转动画 + +设置不同的原点位置(transform-origin)改变元素所围绕的旋转中心。rotate3d属性前三个参数值分别为X轴、Y轴、Z轴的旋转向量,第四个值为旋转角度,旋转向角度可为负值,负值则代表旋转方向为逆时针方向。 + +``` + +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + background-color:#F1F3F5; + display: flex; + align-items: center; + justify-content: center; +} +.rect{ + width: 100px; + height: 100px; + animation: rotate 3s infinite; + margin-left: 100px; +} +.rect1{ + background-color: #f76160; +} +.rect2{ + background-color: #60f76f; + /* 改变原点位置*/ + transform-origin: 10% 10px; +} +.rect3{ + background-color: #6081f7; + /* 改变原定点置*/ + transform-origin: right bottom; +} +@keyframes rotate { + from { + transform: rotate(0deg) + } + to { + transform: rotate(360deg); + } +} +/* 3d示例样式 */ +.rotate3d{ + margin-top: 150px; + flex-direction: column; + background-color:#F1F3F5; + display: flex; + align-items: center; + width: 80%; + height: 600px; + border-radius: 300px; + border: 1px solid #ec0808; +} +.content{ + padding-top: 150px; + display: flex; + align-items: center; + justify-content: center; +} +/* react4 react5 翻转形成眼睛 */ +.rect4{ + width: 100px; + height: 100px; + animation: rotate3d1 17ms infinite; + background: linear-gradient(#e6c4ec, #be15d9) +} +.rect5{ + width: 100px; + height: 100px; + animation: rotate3d1 17ms infinite; + margin-left: 100px; + background: linear-gradient(#e6c4ec, #be15d9) +} +.mouse{ + margin-top: 150px; + width: 200px; + height: 100px; + border-radius: 50px; + border: 1px solid #e70303; + animation: rotate3d2 17ms infinite; +} +/* 眼睛的动效 */ +@keyframes rotate3d1{ + 0% { + transform:rotate3d(0,0,0,0deg) + } + 50% { + transform:rotate3d(20,20,20,360deg); + } + 100% { + transform:rotate3d(0,0,0,0deg); + } +} +/* 嘴的动效 */ +@keyframes rotate3d2{ + 0% { + transform:rotate3d(0,0,0,0deg) + } + 33% { + transform:rotate3d(0,0,10,30deg); + } + 66% { + transform:rotate3d(0,0,10,-30deg); + } + 100% { + transform:rotate3d(0,0,0,0deg); + } +} +``` + +![](/images/application-dev/ui/figures/d2.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>transform-origin变换对象的原点位置,如果仅设置一个值,另一个值为50%,若设置两个值第一个值表示X轴的位置,第二个值表示Y轴的位置。 + +## 设置缩放动画 + +设置scale样式属性实现涟漪动画,先使用定位确定元素的位置,确定坐标后创建多个组件实现重合效果,再设置opacity属性改变组件不透明度实现组件隐藏与显示,同时设置scale值使组件可以一边放大一边隐藏,最后设置两个组件不同的动画执行时间,实现扩散的效果。 + +设置sacle3d中X轴、Y轴、Z轴的缩放参数实现动画。 + +``` + +
+
+ ripple +
+
+
+ +
+ spring +
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + background-color:#F1F3F5; + width: 100%; + position: relative; +} +.circle{ + margin-top: 400px; + margin-left: 40%; + width: 100px; + height: 100px; + border-radius: 50px; + background:linear-gradient(#dcaec1, #d3a8e3); + z-index: 1; + position: absolute; +} +.ripple{ + margin-top: 400px; + margin-left: 40%; + position: absolute; + z-index: 0; + width: 100px; + height: 100px; + border-radius: 50px; + background:linear-gradient(#dcaec1,#d3a8e3); + animation: ripple 5s infinite; +} +/* 设置不同的动画时间 */ +.ripple2{ + animation-duration: 2.5s; +} +@keyframes ripple{ + 0%{ + transform: scale(1); + opacity: 0.5; + } + 50%{ + transform: scale(3); + opacity: 0; + } + 100%{ + transform: scale(1); + opacity: 0.5; + } +} +text{ + color: white; + text-align: center; + height: 100%; + width: 100%; +} +.content { + margin-top: 700px; + margin-left: 33%; + width: 200px; + height: 100px; + animation:rubberBand 1s infinite; + /* 设置渐变色 */ + background:linear-gradient(#e276aa,#ec0d66); + position: absolute; +} +@keyframes rubberBand { + 0% { + transform: scale3d(1, 1, 1); + } + 30% { + transform: scale3d(1.25, 0.75, 1.1); + } + 40% { + transform: scale3d(0.75, 1.25, 1.2); + } + 50% { + transform: scale3d(1.15, 0.85, 1.3); + } + 65% { + transform: scale3d(.95, 1.05, 1.2); + } + 75% { + transform: scale3d(1.05, .95, 1.1); + } + 100%{ + transform: scale3d(1, 1, 1); + } +} +``` + +![](/images/application-dev/ui/figures/d3.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>设置transform属性值后,子元素会跟着父元素一起改变,若只改变父元素其他属性值时(如:height,width),子元素不会改变。 + +## 设置matrix属性 + +matrix是一个入参为六个值的矩阵,6个值分别代表:scaleX, skewY, skewX, scaleY, translateX, translateY。下面示例中设置 了matrix属性为matrix\(1,0,0,1,0,200\)使组件移动和倾斜。 + +``` + +
+
+
+``` + +``` +/* xxx.css */ +.container{ + background-color:#F1F3F5; + display: flex; + justify-content: center; +} +.rect{ + width: 100px; + height: 100px; + background-color: red; + animation: down 3s infinite forwards; +} +@keyframes down{ + 0%{ + transform: matrix(1,0,0,1,0,0); + } + 10%{ + transform: matrix(1,0,0,1,0,200); + } + 60%{ + transform: matrix(2,1.5,1.5,2,0,700); + } + 100%{ + transform: matrix(1,0,0,1,0,0); + } +} +``` + +![](/images/application-dev/ui/figures/q3.gif) + +## 整合transform属性 + +transform可以设置多个值并且多个值可同时设置,下面案例中展示同时设置缩放(scale),平移(translate),旋转(rotate)属性时的动画效果。 + +``` + +
+
+
+
+
+
+
+``` + +``` +/* xxx.css */ +.container{ + flex-direction:column; + background-color:#F1F3F5; + padding:50px; +} +.rect1{ + width: 100px; + height: 100px; + background:linear-gradient(#e77070,#ee0202); + animation: change1 3s infinite forwards; +} +.rect2{ + margin-top: 50px; + width: 100px; + height: 100px; + background:linear-gradient(#95a6e8, #2739de); + animation: change2 3s infinite forwards; +} +.rect3{ + margin-top: 50px; + width: 100px; + height: 100px; + background:linear-gradient(#142ee2, #8cb1e5); + animation: change3 3s infinite; +} +.rect4{ + align-self: center; + margin-left: 50px; + margin-top: 200px; + width: 100px; + height: 100px; + background:linear-gradient(#e2a8df, #9c67d4,#8245d9,#e251c3); + animation: change4 3s infinite; +} +.rect5{ + margin-top: 300px; + width: 100px; + height: 100px; + background:linear-gradient(#e7ded7, #486ccd, #94b4d2); + animation: change5 3s infinite; +} +/* change1 change2 对比 */ +@keyframes change1{ + 0%{ + transform: translate(0,0); + transform: rotate(0deg) + } + 100%{ + transform: translate(0,500px); + transform: rotate(360deg) + } +} +/* change2 change3 对比属性顺序不同的动画效果 */ +@keyframes change2{ + 0%{ + transform:translate(0,0) rotate(0deg) ; + } + 100%{ + transform: translate(300px,0) rotate(360deg); + } +} +@keyframes change3{ + 0%{ + transform:rotate(0deg) translate(0,0); + } + 100%{ + transform:rotate(360deg) translate(300px,0); + } +} +/* 属性值不对应的情况 */ +@keyframes change4{ + 0%{ + transform: scale(0.5); + } + 100%{ + transform:scale(2) rotate(45deg); + } +} +/* 多属性的写法 */ +@keyframes change5{ + 0%{ + transform:scale(0) translate(0,0) rotate(0); + } + 100%{ + transform: scale(1.5) rotate(360deg) translate(200px,0); + } +} +``` + +![](/images/application-dev/ui/figures/d4.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>1. 当设置多个transform时,后续的transform值会把前面的覆盖掉。若想同时使用多个动画样式可用复合写法,例:transform: scale\(1\) rotate\(0\) translate\(0,0\)。 +>2. transform进行复合写法时,变化样式内多个样式值顺序的不同会呈现不一样的动画效果。 +>3. transform属性设置的样式值要一一对应,若前后不对应,则该动画不生效。若设置多个样式值则只会呈现出已对应值的动画效果。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/01.CSS\345\212\250\347\224\273/03.background-position\346\240\267\345\274\217\345\212\250\347\224\273.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/01.CSS\345\212\250\347\224\273/03.background-position\346\240\267\345\274\217\345\212\250\347\224\273.md" new file mode 100644 index 0000000000000000000000000000000000000000..a35ada30c75f4902d7a911eca6c377ee17a50064 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/01.CSS\345\212\250\347\224\273/03.background-position\346\240\267\345\274\217\345\212\250\347\224\273.md" @@ -0,0 +1,94 @@ +--- +title: background-position样式动画 +permalink: /pages/00070100030002 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# background-position样式动画 + +通过改变background-position属性(第一个值为X轴的位置,第二个值为Y轴的位置)移动背景图片位置,若背景图位置超出组件则超出部分的背景图不显示。 + +``` + +
+
+
+
+``` + +``` +/* xxx.css */ +.container { + background-color:#F1F3F5; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; +} +.content{ + width: 400px; + height: 400px; + background-image: url('common/images/bg-tv.jpg'); + background-size: 100%; + background-repeat: no-repeat; + animation: change 3s infinite; + border: 1px solid black; +} +.content1{ + margin-top:50px; + width: 400px; + height: 400px; + background-image: url('common/images/bg-tv.jpg'); + background-size: 50%; + background-repeat: no-repeat; + animation: change1 5s infinite; + border: 1px solid black; +} +/* 背景图片移动出组件 */ +@keyframes change{ + 0%{ + background-position:0px top; + } + 25%{ + background-position:400px top; + } + 50%{ + background-position:0px top; + } + 75%{ + background-position:0px bottom; + } + 100%{ + background-position:0px top; + } +} +/* 背景图片在组件内移动 */ +@keyframes change1{ + 0%{ + background-position:left top; + } + 25%{ + background-position:50% 50%; + } + 50%{ + background-position:right bottom; + } + 100%{ + background-position:left top;; + } +} +``` + +![](/images/application-dev/ui/figures/q8.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>background-position仅支持背景图片的移动,不支持背景颜色(background-color)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/02.JS\345\212\250\347\224\273/01.\347\273\204\344\273\266\345\212\250\347\224\273.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/02.JS\345\212\250\347\224\273/01.\347\273\204\344\273\266\345\212\250\347\224\273.md" new file mode 100644 index 0000000000000000000000000000000000000000..0a264b6db7d32bd2da2e178edd6b8f62c4859107 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/02.JS\345\212\250\347\224\273/01.\347\273\204\344\273\266\345\212\250\347\224\273.md" @@ -0,0 +1,480 @@ +--- +title: 组件动画 +permalink: /pages/00070100030100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 组件动画 + +在组件上创建和运行动画的快捷方式。具体用法请参考[通用方法](/pages/000b0100010003)。 + +## 获取动画对象 + +通过调用animate方法获得animation对象,animation对象支持动画属性、动画方法和动画事件。 + +``` + +
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; +} +.box{ + width: 200px; + height: 200px; + background-color: #ff0000; + margin-top: 30px; +} +``` + +``` +/* xxx.js */ +export default { + data: { + animation: '', + }, + onInit() { + }, + onShow() { + var options = { + duration: 1500, + }; + var frames = [ + { + width:200,height:200, + }, + { + width:300,height:300, + } + ]; + this.animation = this.$element('content').animate(frames, options); //获取动画对象 + }, + Show() { + this.animation.play(); + } +} +``` + +![](/images/application-dev/ui/figures/1.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>- 使用animate方法时必须传入Keyframes和Options参数。 +>- 多次调用animate方法时,采用replace策略,即最后一次调用时传入的参数生效。 + +## 设置动画参数 + +在获取动画对象后,通过设置参数Keyframes设置动画在组件上的样式。 + +``` + +
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; +} +.box{ + width: 200px; + height: 200px; + background-color: #ff0000; + margin-top: 30px; +} +``` + +``` +/* xxx.js */ +export default { + data: { + animation: '', + keyframes:{}, + options:{} + }, + onInit() { + this.options = { + duration: 4000, + }; + this.keyframes = [ + { + transform: { + translate: '-120px -0px', + scale: 1, + rotate: 0 + }, + transformOrigin: '100px 100px', + offset: 0.0, + width: 200, + height: 200 + }, + { + transform: { + translate: '120px 0px', + scale: 1.5, + rotate: 90 + }, + transformOrigin: '100px 100px', + offset: 1.0, + width: 300, + height: 300 + } + ]; + }, + Show() { + this.animation = this.$element('content').animate(this.keyframes, this.options); + this.animation.play(); + } +} +``` + +![](/images/application-dev/ui/figures/1-0.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>- translate、scale和totate的先后顺序会影响动画效果。 +>- transformOrigin只对scale和totate起作用。 + +在获取动画对象后,通过设置参数Options来设置动画的属性。 + +``` + +
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; +} +.box{ + width: 200px; + height: 200px; + background-color: #ff0000; + margin-top: 30px; +} +``` + +``` +/* xxx.js */ +export default { + data: { + animation: '', + }, + onInit() { + }, + onShow() { + var options = { + duration: 1500, + easing: 'ease-in', + delay: 5, + iterations: 2, + direction: 'normal', + }; + var frames = [ + { + transform: { + translate: '-150px -0px' + } + }, + { + transform: { + translate: '150px 0px' + } + } + ]; + this.animation = this.$element('content').animate(frames, options); + }, + Show() { + this.animation.play(); + } +} +``` + +![](/images/application-dev/ui/figures/3.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>direction:指定动画的播放模式。 +>normal: 动画正向循环播放。 +>reverse: 动画反向循环播放。 +>alternate:动画交替循环播放,奇数次正向播放,偶数次反向播放。 +>alternate-reverse:动画反向交替循环播放,奇数次反向播放,偶数次正向播放。 + +## 添加事件和调用方法 + +animation对象支持动画事件和动画方法。可以通过添加开始和取消事件,调用播放、暂停、倒放和结束方法实现预期动画。 + +``` + +
+
+
+
+ + +
+
+ + +
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + justify-content: center; +} +button{ + width: 200px; +} +.row{ + width: 65%; + height: 100px; + align-items: center; + justify-content: space-between; + margin-top: 40px; + position: fixed; + top: 65%; + left: 120px; +} +.row1{ + width: 65%; + height: 100px; + align-items: center; + justify-content: space-between; + margin-top: 30px; + position: fixed; + top: 75%; + left: 120px; +} +``` + +``` +/* xxx.js */ +import prompt from '@system.prompt'; +export default { + data: { + animation: '', + }, + onInit() { + }, + onShow() { + var options = { + duration: 1500, + easing:'ease-in', + elay:5, + direction:'normal', + iterations:2 + }; + var frames = [ + { + transform: { + translate: '-150px -0px' + }, + opacity: 0.1, + offset: 0.0, + width: 200, + height: 200, + }, + { + transform: { + translate: '150px 0px' + }, + opacity: 1.0, + offset: 1.0, + width: 300, + height: 300, + } + ]; + this.animation = this.$element('content').animate(frames, options); + this.animation.onstart = function(){ + prompt.showToast({ + message: "start" + }); + }; //添加开始事件 + this.animation.onrepeat = function(){ + prompt.showToast({ + message: " repeated" + }); + };//添加重播事件 + this.animation.oncancel = function(){ + prompt.showToast({ + message: "canceled" + }); + };//添加取消事件 + this.animation.onfinish = function(){ + prompt.showToast({ + message: "finish" + }); + };//添加完成事件 + }, + playAnimation() { + this.animation.play();//调用播放开始的方法 + }, + pauseAnimation() { + this.animation.pause();//调用播放暂停的方法 + }, + reverseAnimation() { + this.animation.reverse();//调用播放倒放的方法 + }, + cancelAnimation() { + this.animation.cancel();//调用播放取消的方法 + } +} +``` + +![](/images/application-dev/ui/figures/111-1.gif) + +通过改变playStat的属性实现动画状态的改变。 + +``` + +
+
+
+
+ +
+
+ +
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + justify-content: center; +} +button{ + width: 200px; +} +.row{ + width: 65%; + height: 100px; + align-items: center; + justify-content: space-between; + margin-top: 50px; + margin-left: 260px; + position: fixed; + top: 65%; +} +.row1{ + width: 65%; + height: 100px; + align-items: center; + justify-content: space-between; + margin-top: 50px; + margin-left: 260px; + position: fixed; + top: 75%; +} +``` + +``` +/* xxx.js */ +import prompt from '@system.prompt'; +export default { + data: { + animation: '', + state:'play', + state1:'play' + }, + onInit() { + }, + onShow() { + var options = { + duration: 1500, + easing:'ease-in', + elay:5, + direction:'normal', + iterations:2, + }; + var frames = [ + { + transform: { + translate: '-150px -0px' + }, + opacity: 0.1, + offset: 0.0, + width: 200, + height: 200, + }, + { + transform: { + translate: '150px 0px' + }, + opacity: 1.0, + offset: 1.0, + width: 300, + height: 300, + } + ]; + this.animation = this.$element('content').animate(frames, options); + this.animation.onstart = function(){ + prompt.showToast({ + message: "start" + }); + }; + this.animation.onrepeat = function(){ + prompt.showToast({ + message: " repeated" + }); + }; + this.animation.onfinish = function(){ + prompt.showToast({ + message: " finished" + }); + }; + }, + playStateClick(){ + if(this.animation.playState != 'running'){ + this.animation.playState = 'running';//设置playState为running,动画运行。 + this.state = 'pause' + }else{ + this.animation.playState = 'paused';//设置playState为paused,动画暂停。 + this.state = 'play' + } + }, + playStateClick1(){ + if(this.animation.playState != 'running'){ + this.animation.playState = 'running'; + this.state1 = 'finish' + }else{ + this.animation.playState = 'finished';//设置playState为finished,动画结束。 + this.state1 = 'play' + } + } +} +``` + +![](/images/application-dev/ui/figures/1111.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/02.JS\345\212\250\347\224\273/02.\346\217\222\345\200\274\345\231\250\345\212\250\347\224\273/01.\345\212\250\347\224\273\345\212\250\346\225\210.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/02.JS\345\212\250\347\224\273/02.\346\217\222\345\200\274\345\231\250\345\212\250\347\224\273/01.\345\212\250\347\224\273\345\212\250\346\225\210.md" new file mode 100644 index 0000000000000000000000000000000000000000..0664fef87e8ae951a181a1147275510f1d7de79d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/02.JS\345\212\250\347\224\273/02.\346\217\222\345\200\274\345\231\250\345\212\250\347\224\273/01.\345\212\250\347\224\273\345\212\250\346\225\210.md" @@ -0,0 +1,250 @@ +--- +title: 动画动效 +permalink: /pages/0007010003010100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 动画动效 + +通过设置插值器来实现动画效果。具体用法请参考[动画](/pages/000b000807)。 + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>从API Version 6 开始支持。 + +## 创建动画对象 + +通过createAnimator创建一个动画对象,通过设置参数options来设置动画的属性。 + +``` + +
+
+
+
+ +
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + justify-content: center; +} +button{ + width: 200px; +} +.row{ + width: 65%; + height: 100px; + align-items: center; + justify-content: space-between; + margin-top: 50px; + margin-left: 260px; +} +``` + +``` +/* xxx.js */ +import animator from '@ohos.animator'; +export default { + data: { + translateVal: 0, + animation: null + }, + onInit() {}, + onShow(){ + var options = { + duration: 3000, + easing:"friction", + delay:"1000", + fill: 'forwards', + direction:'alternate', + iterations: 2, + begin: 0, + end: 180 + };//设置参数 + this.animation = animator.createAnimator(options)//创建动画 + }, + playAnimation() { + var _this = this; + this.animation.onframe = function(value) { + _this.translateVal= value + }; + this.animation.play(); + } +} +``` + +![](/images/application-dev/ui/figures/22.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>- 使用createAnimator创建动画对象时必须传入options参数。 +>- begin插值起点,不设置时默认为0。 +>- end插值终点,不设置时默认为1。 + +## 添加动画事件和调用接口 + +animator支持事件和接口,可以通过添加frame、cancel、repeat、finish事件和调用update、play、pause、cancel、reverse、finish接口自定义动画效果。animator支持的事件和接口具体见animator支持的事件和animator支持的接口。 + +``` + +
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + justify-content: center; +} +button{ + width: 200px; +} +.row{ + width: 65%; + height: 100px; + align-items: center; + justify-content: space-between; + margin-top: 150px; + position: fixed; + top: 55%; + left: 120px; +} +.row1{ + width: 65%; + height: 100px; + align-items: center; + justify-content: space-between; + margin-top: 120px; + position: fixed; + top: 65%; + left: 120px; +} +.row2{ + width: 65%; + height: 100px; + align-items: center; + justify-content: space-between; + margin-top: 100px; + position: fixed; + top: 75%; + left: 120px; +} +``` + +``` +/* xxx.js */ +import animator from '@ohos.animator'; +import prompt from '@system.prompt'; +export default { + data: { + scaleVal:1, + DivWidth:200, + DivHeight:200, + translateVal:0, + animation: null + }, + onInit() { + var options = { + duration: 3000, + fill: 'forwards', + begin: 200, + end: 270 + }; + this.animation = animator.createAnimator(options); + }, + onShow() { + var _this= this; + //添加动画重放事件 + this.animation.onrepeat = function() { + prompt.showToast({ + message: 'repeat' + }); + var repeatoptions = { + duration: 2000, + iterations: 1, + direction: 'alternate', + begin: 180, + end: 240 + }; + _this.animation.update(repeatoptions); + _this.animation.play(); + }; + }, + playAnimation() { + var _this= this; + //添加动画逐帧插值回调事件 + this.animation.onframe = function(value) { + _this. scaleVal= value/150, + _this.DivWidth = value, + _this.DivHeight = value, + _this.translateVal = value-180 + }; + this.animation.play(); + }, + updateAnimation() { + var newoptions = { + duration: 5000, + iterations: 2, + begin: 120, + end: 180 + }; + this.animation.update(newoptions); + this.animation.play();//调用动画播放接口 + }, + pauseAnimation() { + this.animation.pause();//调用动画暂停接口 + }, + finishAnimation() { + var _this= this; + //添加动画完成事件 + this.animation.onfinish = function() { + prompt.showToast({ + message: 'finish' + }) + }; + this.animation.finish(); //调用动画完成接口 + }, + cancelAnimation() { + this.animation.cancel(); //调用动画取消接口 + }, + reverseAnimation() { + this.animation.reverse(); //调用动画倒放接口 + } +} +``` + +![](/images/application-dev/ui/figures/1-2.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>在调用update接口的过程中可以使用这个接口更新动画参数,入参与createAnimator一致。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/02.JS\345\212\250\347\224\273/02.\346\217\222\345\200\274\345\231\250\345\212\250\347\224\273/02.\345\212\250\347\224\273\345\270\247.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/02.JS\345\212\250\347\224\273/02.\346\217\222\345\200\274\345\231\250\345\212\250\347\224\273/02.\345\212\250\347\224\273\345\270\247.md" new file mode 100644 index 0000000000000000000000000000000000000000..81ba324b68e260e1a4e53e014b399e81129be644 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\346\225\210\345\274\200\345\217\221\346\214\207\345\257\274/02.JS\345\212\250\347\224\273/02.\346\217\222\345\200\274\345\231\250\345\212\250\347\224\273/02.\345\212\250\347\224\273\345\270\247.md" @@ -0,0 +1,201 @@ +--- +title: 动画帧 +permalink: /pages/0007010003010101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 动画帧 + +## 请求动画帧 + +请求动画帧时通过requestAnimationFrame函数逐帧回调,在调用该函数时传入一个回调函数。 + +runframe在调用requestAnimationFrame时传入带有timestamp参数的回调函数step,将step中的timestamp赋予起始的startTime。当timestamp与startTime的差值小于规定的时间时将再次调用requestAnimationFrame,最终动画将会停止。 + +``` + +
+ + +
+ + + +
+
+
+ +
+
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; +} +button{ + width: 300px; +} +``` + +``` +/* xxx.js */ +export default { + data: { + timer: null, + left: 0, + top: 0, + flag: true, + animation: null, + startTime: 0, + }, + onShow() { + var test = this.$element("mycanvas"); + var ctx = test.getContext("2d"); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(300, 300); + ctx.lineWidth = 5; + ctx.strokeStyle = "red"; + ctx.stroke(); + }, + runframe() { + this.left = 0; + this.top = 0; + this.flag = true; + this.animation = requestAnimationFrame(this.step); + }, + step(timestamp) { + if (this.flag) { + this.left += 5; + this.top += 5; + if (this.startTime == 0) { + this.startTime = timestamp; + } + var elapsed = timestamp - this.startTime; + if (elapsed < 500) { + console.log('callback step timestamp: ' + timestamp); + this.animation = requestAnimationFrame(this.step); + } + } else { + this.left -= 5; + this.top -= 5; + this.animation = requestAnimationFrame(this.step); + } + if (this.left == 250 || this.left == 0) { + this.flag = !this.flag + } + }, + onDestroy() { + cancelAnimationFrame(this.animation); + } +} +``` + +![](/images/application-dev/ui/figures/3333.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>requestAnimationFrame函数在调用回调函数时在第一个参数位置传入timestamp时间戳,表示requestAnimationFrame开始去执行回调函数的时刻。 + +## 取消动画帧 + +通过cancelAnimationFrame函数取消逐帧回调,在调用cancelAnimationFrame函数时取消requestAnimationFrame函数的请求。 + +``` + +
+ + +
+ + + +
+
+
+ +
+
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; +} +button{ + width: 300px; +} +``` + +``` +/* xxx.js */ +export default { + data: { + timer: null, + left: 0, + top: 0, + flag: true, + animation: null + }, + onShow() { + var test = this.$element("mycanvas"); + var ctx = test.getContext("2d"); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(300, 300); + ctx.lineWidth = 5; + ctx.strokeStyle = "red"; + ctx.stroke(); + }, + runframe() { + this.left = 0; + this.top = 0; + this.flag = true; + this.animation = requestAnimationFrame(this.step); + }, + step(timestamp) { + if (this.flag) { + this.left += 5; + this.top += 5; + this.animation = requestAnimationFrame(this.step); + } else { + this.left -= 5; + this.top -= 5; + this.animation = requestAnimationFrame(this.step); + } + if (this.left == 250 || this.left == 0) { + this.flag = !this.flag + } + }, + onDestroy() { + cancelAnimationFrame(this.animation); + } +} +``` + +![](/images/application-dev/ui/figures/4444.gif) + +> ![icon-note.gif](/images/application-dev/ui/public_sys-resources/icon-note.gif) **说明:** +>在调用该函数时需传入一个具有标识id的参数。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/05.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/05.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..659c4fddbe3fb05734b6448552aaa00f65997c7c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/05.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md" @@ -0,0 +1,112 @@ +--- +title: 自定义组件 +permalink: /pages/0007010004 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 自定义组件 + +使用基于JS扩展的类Web开发范式的方舟开发框架支持自定义组件,用户可根据业务需求将已有的组件进行扩展,增加自定义的私有属性和事件,封装成新的组件,方便在工程中多次调用,提高页面布局代码的可读性。具体的封装方法示例如下: + + +- **构建自定义组件** + ``` + +
+ {{title}} + 点击这里查看隐藏文本 + hello world +
+ ``` + + ``` + /* comp.css */ + .item { + width: 700px; + flex-direction: column; + height: 300px; + align-items: center; + margin-top: 100px; + } + .text-style { + width: 100%; + text-align: center; + font-weight: 500; + font-family: Courier; + font-size: 36px; + } + .title-style { + font-weight: 500; + font-family: Courier; + font-size: 50px; + color: #483d8b; + } + ``` + + ``` + // comp.js + export default { + props: { + title: { + default: 'title', + }, + showObject: {}, + }, + data() { + return { + showObj: this.showObject, + }; + }, + childClicked () { + this.$emit('eventType1', {text: '收到子组件参数'}); + this.showObj = !this.showObj; + }, + } + ``` + +- **引入自定义组件** + ``` + + +
+ 父组件:{{text}} + +
+ ``` + + ``` + /* xxx.css */ + .container { + background-color: #f8f8ff; + flex: 1; + flex-direction: column; + align-content: center; + } + ``` + + ``` + // xxx.js + export default { + data: { + text: '开始', + isShow: false, + }, + textClicked (e) { + this.text = e.detail.text; + }, + } + ``` + + +本示例中父组件通过添加自定义属性向子组件传递了名称为title的参数,子组件在props中接收。同时子组件也通过事件绑定向上传递了参数text,接收时通过e.detail获取。要绑定子组件事件,父组件事件命名必须遵循事件绑定规则,详见[自定义组件开发规范](/pages/000b01000200)。自定义组件效果如下图所示: + + +**图1** 自定义组件的效果 +![zh-cn_image_0000001070693737](/images/application-dev/ui/figures/zh-cn_image_0000001070693737.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\246\202\350\277\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..ec8de2b2c587eb3f2e3744cd274a3634d70b40d7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\246\202\350\277\260.md" @@ -0,0 +1,59 @@ +--- +title: 概述 +permalink: /pages/0007010100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 概述 + +基于TS扩展的声明式开发范式的方舟开发框架是为OpenHarmony平台开发极简、高性能、跨设备应用设计研发的UI开发框架,支持开发者高效的构建跨设备应用UI界面。 + + +## 基础能力 + +使用基于TS扩展的声明式开发范式的方舟开发框架,采用更接近自然语义的编程方式,让开发者可以直观地描述UI界面,不必关心框架如何实现UI绘制和渲染,实现极简高效开发。从组件、动效和状态管理三个维度来提供UI能力,还提供了系统能力接口,实现系统能力的极简调用。 + + +- **开箱即用的组件** + 框架提供丰富的系统预置组件,可以通过链式调用的方式设置系统组件的渲染效果。开发者可以组合系统组件为自定义组件,通过这种方式将页面组件化为一个个独立的UI单元,实现页面不同单元的独立创建、开发和复用,使页面具有更强的工程性。 + + +- **丰富的动效接口** + 提供svg标准的绘制图形能力,同时开放了丰富的动效接口,开发者可以通过封装的物理模型或者调用动画能力接口来实现自定义动画轨迹。 + + +- **状态与数据管理** + 状态数据管理作为基于TS扩展的声明式开发范式的特色,通过功能不同的装饰器给开发者提供了清晰的页面更新渲染流程和管道。状态管理包括UI组件状态和应用程序状态,两者协作可以使开发者完整地构建整个应用的数据更新和UI渲染。 + + +- **系统能力接口** + 使用基于TS扩展的声明式开发范式的方舟开发框架,还封装了丰富的系统能力接口,开发者可以通过简单的接口调用,实现从UI设计到系统能力调用的极简开发。 + + +## 整体架构 + + + +![zh-cn_image_0000001169532276](/images/application-dev/ui/figures/zh-cn_image_0000001169532276.png) + +- **声明式UI前端** + 提供了UI开发范式的基础语言规范,并提供内置的UI组件、布局和动画,提供了多种状态管理机制,为应用开发者提供一系列接口支持。 + +- **语言运行时** + 选用方舟语言运行时,提供了针对UI范式语法的解析能力,提供了跨语言调用支持,提供了TS语言高性能运行环境。 + +- **声明式UI后端引擎** + 后端引擎提供了兼容不同开发范式的UI渲染管线,提供多种基础组件、布局计算、动效、交互事件,提供了状态管理和绘制能力。 + +- **渲染引擎** + 提供了高效的绘制能力,将渲染管线收集的渲染指令,绘制到屏幕能力。 + +- **平台适配层** + 提供了对系统平台的抽象接口,具备接入不同系统的能力,如系统渲染管线、生命周期调度等。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\274\200\345\217\221\350\257\264\346\230\216.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\274\200\345\217\221\350\257\264\346\230\216.md" new file mode 100644 index 0000000000000000000000000000000000000000..bcbe094e80952e41f41f769c74cb80aede8a0ab7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\274\200\345\217\221\350\257\264\346\230\216.md" @@ -0,0 +1,28 @@ +--- +title: 开发说明 +permalink: /pages/0007010101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 开发说明 + +本指导将从以下三个部分介绍构建健康饮食应用,其主要功能为查看食物的营养信息。具体信息如下: + + +1. Food Detail:[构建食物基本信息页面](/pages/000701010202)。 + +2. Food Category/List:[构建食物列表和分类展示页面](/pages/000701010300)。 + + + +从工程创建,构建普通视图开始,逐步学习学习组件、布局、动效和数据状态管理,在了解到这些知识后,开发者将有能力自主设计和开发应用。简单的学习成本,功能完备的UI开发,我们现在就开始吧。 + + +![zh-cn_image_0000001169852428](/images/application-dev/ui/figures/zh-cn_image_0000001169852428.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\344\275\223\351\252\214\345\243\260\346\230\216\345\274\217UI/01.\345\210\233\345\273\272\345\243\260\346\230\216\345\274\217UI\345\267\245\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\344\275\223\351\252\214\345\243\260\346\230\216\345\274\217UI/01.\345\210\233\345\273\272\345\243\260\346\230\216\345\274\217UI\345\267\245\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..4e66a4ad948f93016603a7d6d596cdf14d39d211 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\344\275\223\351\252\214\345\243\260\346\230\216\345\274\217UI/01.\345\210\233\345\273\272\345\243\260\346\230\216\345\274\217UI\345\267\245\347\250\213.md" @@ -0,0 +1,77 @@ +--- +title: 创建声明式UI工程 +permalink: /pages/000701010200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 创建声明式UI工程 + +创建工程之前,首先需要安装DevEco Studio,[下载安装教程](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/deveco-studio-overview.md)。 + + +1. 打开DevEco Studio,点击Create Project。如果已有一个工程,则点击File>New>New project。 + ![zh-cn_image_0000001168956332](/images/application-dev/ui/figures/zh-cn_image_0000001168956332.png) + +2. + 进入选择ability template界面,选择[Standard]Empty Ability。 + + ![zh-cn_image_0000001168059158](/images/application-dev/ui/figures/zh-cn_image_0000001168059158.png) + +3. + 安装OpenHarmony sdk + + ![zh-cn_image_0000001213462329](/images/application-dev/ui/figures/zh-cn_image_0000001213462329.png) + +4. 进入配置工程界面,将工程名字改为HealthyDiet,Project Type选择Application,Device Type选择Phone,Language选择eTS,选择兼容API Version 7。DevEco Studio会默认将工程保存在C盘,如果要更改工程保存位置,点击Save Location的文件夹图标,自行指定工程创建位置。配置完成后点击Finish。 + + + ![zh-cn_image_0000001167746622](/images/application-dev/ui/figures/zh-cn_image_0000001167746622.png) + +5. 工程创建完成后,打开app.ets。 + app.ets提供了应用生命周期的接口:onCreate和onDestroy,分别在应用创建之初和应用被销毁时调用。在app.ets里可以声明全局变量,并且声明的数据和方法是整个应用共享的。 + ``` + export default { + onCreate() { + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, + } + ``` + +6. 在工程导航栏里,打开index.ets。该页面展示了当前的UI描述,声明式UI框架会自动生成一个组件化的struct,这个struct遵循Builder接口声明,在build方法里面声明当前的布局和组件。 + ``` + @Entry + @Component + struct MyComponent { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text('Hello World') + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + .height('100%') + } + } + ``` + +7. 点击右侧的Previewer按钮,打开预览窗口。可以看到在手机设备类型的预览窗口中“Hello World”居中加粗显示。 + 如果没有Previewer按钮,点击settings > SDK Manager > OpenHarmony SDK> Tools 查看是否安装了Previewer。 + + ![zh-cn_image_0000001214595111](/images/application-dev/ui/figures/zh-cn_image_0000001214595111.png) + +8. 应用安装到手机上运行应用。将手机连接电脑,等IDE识别到物理设备后,点击Run 'entry'按钮。 + ![zh-cn_image_0000001148858818](/images/application-dev/ui/figures/zh-cn_image_0000001148858818.png) + + 在安装之前,需要[配置应用签名](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/configuring-openharmony-app-signature.md),安装成功后,点击屏幕上的Run图标打开应用,可以看到居中加粗显示的“Hello World”。 + + ![zh-cn_image_0000001158896538](/images/application-dev/ui/figures/zh-cn_image_0000001158896538.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\344\275\223\351\252\214\345\243\260\346\230\216\345\274\217UI/02.\345\210\235\350\257\206Component.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\344\275\223\351\252\214\345\243\260\346\230\216\345\274\217UI/02.\345\210\235\350\257\206Component.md" new file mode 100644 index 0000000000000000000000000000000000000000..04952e6010c47e278b8165c2bcb90483583594eb --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\344\275\223\351\252\214\345\243\260\346\230\216\345\274\217UI/02.\345\210\235\350\257\206Component.md" @@ -0,0 +1,90 @@ +--- +title: 初识Component +permalink: /pages/000701010201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 初识Component + +在自定义组件之前,需要先了解什么是[组件和装饰器](#组件和装饰器),并进行初始化组件。然后通过[修改组件属性和构造参数](#修改组件属性和构造参数),实现一个自定义组件。 + + +## 组件和装饰器 + +在声明式UI中,所有的页面都是由组件构成。组件的数据结构为struct,装饰器[@Component](/pages/000b010101010200)是组件化的标志。用@Component修饰的struct表示这个结构体有了组件化的能力。 + +自定义组件的声明方式为: + +``` +@Component +struct MyComponent {} +``` + +在IDE创建工程模板中,MyComponent就是一个可以居中显示文字的自定义组件。开发者可以在Component的build方法里描述自己的UI结构,但需要遵循Builder的接口约束。 + +``` +interface Builder { + build: () => void +} +``` + +[@Entry](/pages/000b010101010201)修饰的Component表示该Component是页面的总入口,也可以理解为页面的根节点。值得注意的是,一个页面有且仅能有一个@Entry,只有被@Entry修饰的组件或者其子组件,才会在页面上显示。 + +@Component和@Entry都是基础且十分重要的装饰器。简单地理解,装饰器就是某一种修饰,给被装饰的对象赋予某一种能力,比如@Entry就是页面入口的能力,@Component就是组件化能力。 + +在了解了组件和装饰器这两个重要概念后,接下来可以开始开发健康饮食应用。 + + +## 修改组件属性和构造参数 + +开发者创建系统组件时,会显示其默认样式。开发者可以通过更改组件的属性样式来改变组件的视图显示。 + +1. 修改Text组件的fontSize属性来更改组件的字体大小,将字体大小设置为26,fontWeight字体的粗细为500。fontWeight支持两种设置方式: + 1. number类型的取值范围为100到900,默认为400,取值越大,字体越粗。 + 2. fontWeight为内置枚举类型,取值支持Lighter、Normal、Bold、Bolder。 + + 属性方法要紧随组件,通过“.”运算符连接,也可以通过链式调用的方式配置组件的多个属性。 + + ``` + @Entry + @Component + struct MyComponent { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text('Hello World') + .fontSize(26) + .fontWeight(500) + } + .width('100%') + .height('100%') + } + } + ``` + + ![zh-cn_image_0000001168728272](/images/application-dev/ui/figures/zh-cn_image_0000001168728272.png) + +2. 修改Text组件的显示内容“Hello World”为“Tomato”,通过修改Text组件的构造参数来实现。 + ``` + @Entry + @Component + struct MyComponent { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text('Tomato') + .fontSize(26) + .fontWeight(500) + } + .width('100%') + .height('100%') + } + } + ``` + + ![zh-cn_image_0000001168888224](/images/application-dev/ui/figures/zh-cn_image_0000001168888224.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\344\275\223\351\252\214\345\243\260\346\230\216\345\274\217UI/03.\345\210\233\345\273\272\347\256\200\345\215\225\350\247\206\345\233\276.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\344\275\223\351\252\214\345\243\260\346\230\216\345\274\217UI/03.\345\210\233\345\273\272\347\256\200\345\215\225\350\247\206\345\233\276.md" new file mode 100644 index 0000000000000000000000000000000000000000..d21b880064a1f1a3c30e05722e2126b75d8a3ff5 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\344\275\223\351\252\214\345\243\260\346\230\216\345\274\217UI/03.\345\210\233\345\273\272\347\256\200\345\215\225\350\247\206\345\233\276.md" @@ -0,0 +1,554 @@ +--- +title: 创建简单视图 +permalink: /pages/000701010202 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 创建简单视图 + +在这一小节中,我们将开始食物详情页的开发,学习如何通过容器组件Stack、Flex和基本组件Image、Text,构建用户自定义组件,完成图文并茂的食物介绍。 + + +## 构建Stack布局 + +1. 创建食物名称。 + 删掉工程模板的build方法的代码,创建Stack组件,将Text组件放进Stack组件的花括号中,使其成为Stack组件的子组件。Stack组件为堆叠组件,可以包含一个或多个子组件,其特点是后一个子组件覆盖前一个子组件。 + ``` + @Entry + @Component + struct MyComponent { + build() { + Stack() { + Text('Tomato') + .fontSize(26) + .fontWeight(500) + } + } + } + ``` + + ![zh-cn_image_0000001214128687](/images/application-dev/ui/figures/zh-cn_image_0000001214128687.png) + +2. 食物图片展示。 + 创建Image组件,指定Image组件的url,Image组件和Text组件都是必选构造参数组件。为了让Text组件在Image组件上方显示,所以要先声明Image组件。图片资源放在resources下的rawfile文件夹内,引用rawfile下资源时使用“$rawfile('filename')”的形式**,**filename为rawfile目录下的文件相对路径。当前$rawfile仅支持Image控件引用图片资源。 + ``` + @Entry + @Component + struct MyComponent { + build() { + Stack() { + Image($rawfile('Tomato.png')) + Text('Tomato') + .fontSize(26) + .fontWeight(500) + } + } + } + ``` + + ![zh-cn_image_0000001168410342](/images/application-dev/ui/figures/zh-cn_image_0000001168410342.png) + +3. 通过资源访问图片。 + 除指定图片路径外,也可以使用引用媒体资源符$r引用资源,需要遵循resources文件夹的资源限定词的规则。右键resources文件夹,点击New>Resource Directory,选择Resource Type为Media(图片资源),选择资源限定词为Device-Phone(目前开发设备为手机)。 + + ![zh-cn_image_0000001168570318](/images/application-dev/ui/figures/zh-cn_image_0000001168570318.png) + + 点击OK后,resources文件夹下生成phone.media文件夹。将Tomato.png放入该文件夹内。 + + ![zh-cn_image_0000001214330169](/images/application-dev/ui/figures/zh-cn_image_0000001214330169.png) + + 就可以通过“$r('app.type.name')”的形式引用应用资源,即$r('app.media.Tomato')。 + + ``` + @Entry + @Component + struct MyComponent { + build() { + Stack() { + Image($r('app.media.Tomato')) + .objectFit(ImageFit.Contain) + .height(357) + Text('Tomato') + .fontSize(26) + .fontWeight(500) + } + } + } + ``` + +4. 设置Image宽高,并且将image的objectFit属性设置为ImageFit.Contain,即保持图片长宽比的情况下,使得图片完整地显示在边界内。 + 如果Image填满了整个屏幕,原因如下: + 1. Image没有设置宽高。 + + 2. Image的objectFit默认属性是ImageFit.Cover,即在保持长宽比的情况下放大或缩小,使其填满整个显示边界。 + + ``` + @Entry + @Component + struct MyComponent { + build() { + Stack() { + Image($r('app.media.Tomato')) + .objectFit(ImageFit.Contain) + .height(357) + Text('Tomato') + .fontSize(26) + .fontWeight(500) + } + } + } + ``` + + ![zh-cn_image_0000001214210217](/images/application-dev/ui/figures/zh-cn_image_0000001214210217.png) + +5. 设置食物图片和名称布局。设置Stack的对齐方式为底部起始端对齐,Stack默认为居中对齐。设置Stack构造参数alignContent为Alignment.BottomStart。其中Alignment和FontWeight一样,都是框架提供的内置枚举类型。 + ``` + @Entry + @Component + struct MyComponent { + build() { + Stack({ alignContent: Alignment.BottomStart }) { + Image($r('app.media.Tomato')) + .objectFit(ImageFit.Contain) + .height(357) + Text('Tomato') + .fontSize(26) + .fontWeight(500) + } + } + } + ``` + + ![zh-cn_image_0000001168728872](/images/application-dev/ui/figures/zh-cn_image_0000001168728872.png) + +6. 通过设置Stack的背景颜色来改变食物图片的背景颜色,设置颜色有两种方式: + 1. 通过框架提供的Color内置枚举值来设置,比如backgroundColor(Color.Red),即设置背景颜色为红色。 + 2. string类型参数,支持的颜色格式有:rgb、rgba和HEX颜色码。比如backgroundColor('\#0000FF'),即设置背景颜色为蓝色,backgroundColor('rgb(255, 255, 255)'),即设置背景颜色为白色。 + + ``` + @Entry + @Component + struct MyComponent { + build() { + Stack({ alignContent: Alignment.BottomStart }) { + Image($r('app.media.Tomato')) + .objectFit(ImageFit.Contain) + .height(357) + Text('Tomato') + .fontSize(26) + .fontWeight(500) + } + .backgroundColor('#FFedf2f5') + } + } + ``` + + ![zh-cn_image_0000001168888822](/images/application-dev/ui/figures/zh-cn_image_0000001168888822.png) + +7. 调整Text组件的外边距margin,使其距离左侧和底部有一定的距离。margin是简写属性,可以统一指定四个边的外边距,也可以分别指定。具体设置方式如下: + 1. 参数为Length时,即统一指定四个边的外边距,比如margin(20),即上、右、下、左四个边的外边距都是20。 + 2. 参数为{top?: Length, right?: Length, bottom?: Length, left?:Length},即分别指定四个边的边距,比如margin({ left: 26, bottom: 17.4 }),即左边距为26,下边距为17.4。 + + ``` + @Entry + @Component + struct MyComponent { + build() { + Stack({ alignContent: Alignment.BottomStart }) { + Image($r('app.media.Tomato')) + .objectFit(ImageFit.Contain) + .height(357) + Text('Tomato') + .fontSize(26) + .fontWeight(500) + .margin({left: 26, bottom: 17.4}) + } + .backgroundColor('#FFedf2f5') + } + } + ``` + + ![zh-cn_image_0000001213968747](/images/application-dev/ui/figures/zh-cn_image_0000001213968747.png) + +8. 调整组件间的结构,语义化组件名称。创建页面入口组件为FoodDetail,在FoodDetail中创建Column,设置水平方向上居中对齐 alignItems(HorizontalAlign.Center)。MyComponent组件名改为FoodImageDisplay,为FoodDetail的子组件。 + Column是子组件竖直排列的容器组件,本质为线性布局,所以只能设置交叉轴方向的对齐。 + + ``` + @Component + struct FoodImageDisplay { + build() { + Stack({ alignContent: Alignment.BottomStart }) { + Image($r('app.media.Tomato')) + .objectFit(ImageFit.Contain) + Text('Tomato') + .fontSize(26) + .fontWeight(500) + .margin({ left: 26, bottom: 17.4 }) + } + .height(357) + .backgroundColor('#FFedf2f5') + } + } + + @Entry + @Component + struct FoodDetail { + build() { + Column() { + FoodImageDisplay() + } + .alignItems(HorizontalAlign.Center) + } + } + ``` + + +## 构建Flex布局 + +开发者可以使用Flex弹性布局来构建食物的食物成分表,弹性布局在本场景的优势在于可以免去多余的宽高计算,通过比例来设置不同单元格的大小,更加灵活。 + +1. 创建ContentTable组件,使其成为页面入口组件FoodDetail的子组件。 + ``` + @Component + struct FoodImageDisplay { + build() { + Stack({ alignContent: Alignment.BottomStart }) { + Image($r('app.media.Tomato')) + .objectFit(ImageFit.Contain) + .height(357) + Text('Tomato') + .fontSize(26) + .fontWeight(500) + .margin({ left: 26, bottom: 17.4 }) + } + .backgroundColor('#FFedf2f5') + } + } + + @Component + struct ContentTable { + build() {} + } + + @Entry + @Component + struct FoodDetail { + build() { + Column() { + FoodImageDisplay() + ContentTable() + } + .alignItems(HorizontalAlign.Center) + } + } + ``` + +2. 创建Flex组件展示Tomato两类成分。 + 一类是热量Calories,包含卡路里(Calories);一类是营养成分Nutrition,包含蛋白质(Protein)、脂肪(Fat)、碳水化合物(Carbohydrates)和维生素C(VitaminC)。 + + 先创建热量这一类。创建Flex组件,高度为280,上、右、左内边距为30,包含三个Text子组件分别代表类别名(Calories),含量名称(Calories)和含量数值(17kcal)。Flex组件默认为水平排列方式。 + + 已省略FoodImageDisplay代码,只针对ContentTable进行扩展。 + + ``` + @Component + struct ContentTable { + build() { + Flex() { + Text('Calories') + .fontSize(17.4) + .fontWeight(FontWeight.Bold) + Text('Calories') + .fontSize(17.4) + Text('17kcal') + .fontSize(17.4) + } + .height(280) + .padding({ top: 30, right: 30, left: 30 }) + } + } + + @Entry + @Component + struct FoodDetail { + build() { + Column() { + FoodImageDisplay() + ContentTable() + } + .alignItems(HorizontalAlign.Center) + } + } + ``` + + ![zh-cn_image_0000001169759552](/images/application-dev/ui/figures/zh-cn_image_0000001169759552.png) + +3. 调整布局,设置各部分占比。分类名占比(layoutWeight)为1,成分名和成分含量一共占比(layoutWeight)2。成分名和成分含量位于同一个Flex中,成分名占据所有剩余空间flexGrow(1)。 + ``` + @Component + struct FoodImageDisplay { + build() { + Stack({ alignContent: Alignment.BottomStart }) { + Image($m('Tomato.png')) + .objectFit(ImageFit.Contain) + .height(357) + Text('Tomato') + .fontSize(26) + .fontWeight(500) + .margin({ left: 26, bottom: 17.4 }) + } + .backgroundColor('#FFedf2f5') + } + } + + @Component + struct ContentTable { + build() { + Flex() { + Text('Calories') + .fontSize(17.4) + .fontWeight(FontWeight.Bold) + .layoutWeight(1) + Flex() { + Text('Calories') + .fontSize(17.4) + .flexGrow(1) + Text('17kcal') + .fontSize(17.4) + } + .layoutWeight(2) + } + .height(280) + .padding({ top: 30, right: 30, left: 30 }) + } + } + + @Entry + @Component + struct FoodDetail { + build() { + Column() { + FoodImageDisplay() + ContentTable() + } + .alignItems(HorizontalAlign.Center) + } + } + ``` + + ![zh-cn_image_0000001215079443](/images/application-dev/ui/figures/zh-cn_image_0000001215079443.png) + +4. 仿照热量分类创建营养成分分类。营养成分部分(Nutrition)包含:蛋白质(Protein)、脂肪(Fat)、碳水化合物(Carbohydrates)和维生素C(VitaminC)四个成分,后三个成分在表格中省略分类名,用空格代替。 + 设置外层Flex为竖直排列FlexDirection.Column, 在主轴方向(竖直方向)上等距排列FlexAlign.SpaceBetween,在交叉轴方向(水平轴方向)上首部对齐排列ItemAlign.Start。 + + ``` + @Component + struct ContentTable { + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Start }) { + Flex() { + Text('Calories') + .fontSize(17.4) + .fontWeight(FontWeight.Bold) + .layoutWeight(1) + Flex() { + Text('Calories') + .fontSize(17.4) + .flexGrow(1) + Text('17kcal') + .fontSize(17.4) + } + .layoutWeight(2) + } + Flex() { + Text('Nutrition') + .fontSize(17.4) + .fontWeight(FontWeight.Bold) + .layoutWeight(1) + Flex() { + Text('Protein') + .fontSize(17.4) + .flexGrow(1) + Text('0.9g') + .fontSize(17.4) + } + .layoutWeight(2) + } + Flex() { + Text(' ') + .fontSize(17.4) + .fontWeight(FontWeight.Bold) + .layoutWeight(1) + Flex() { + Text('Fat') + .fontSize(17.4) + .flexGrow(1) + Text('0.2g') + .fontSize(17.4) + } + .layoutWeight(2) + } + Flex() { + Text(' ') + .fontSize(17.4) + .fontWeight(FontWeight.Bold) + .layoutWeight(1) + Flex() { + Text('Carbohydrates') + .fontSize(17.4) + .flexGrow(1) + Text('3.9g') + .fontSize(17.4) + } + .layoutWeight(2) + } + Flex() { + Text(' ') + .fontSize(17.4) + .fontWeight(FontWeight.Bold) + .layoutWeight(1) + Flex() { + Text('vitaminC') + .fontSize(17.4) + .flexGrow(1) + Text('17.8mg') + .fontSize(17.4) + } + .layoutWeight(2) + } + } + .height(280) + .padding({ top: 30, right: 30, left: 30 }) + } + } + + @Entry + @Component + struct FoodDetail { + build() { + Column() { + FoodImageDisplay() + ContentTable() + } + .alignItems(HorizontalAlign.Center) + } + } + ``` + +5. 使用自定义构造函数\@Builder简化代码。可以发现,每个成分表中的成分单元其实都是一样的UI结构。 + ![zh-cn_image_0000001169599582](/images/application-dev/ui/figures/zh-cn_image_0000001169599582.png) + + 当前对每个成分单元都进行了声明,造成了代码的重复和冗余。可以使用\@Builder来构建自定义方法,抽象出相同的UI结构声明。\@Builder修饰的方法和Component的build方法都是为了声明一些UI渲染结构,遵循一样的eTS语法。开发者可以定义一个或者多个\@Builder修饰的方法,但Component的build方法必须只有一个。 + + 在ContentTable内声明\@Builder修饰的IngredientItem方法,用于声明分类名、成分名称和成分含量UI描述。 + + ``` + @Component + struct ContentTable { + @Builder IngredientItem(title:string, colorValue: string, name: string, value: string) { + Flex() { + Text(title) + .fontSize(17.4) + .fontWeight(FontWeight.Bold) + .layoutWeight(1) + Flex({ alignItems: ItemAlign.Center }) { + Circle({width: 6, height: 6}) + .margin({right: 12}) + .fill(colorValue) + Text(name) + .fontSize(17.4) + .flexGrow(1) + Text(value) + .fontSize(17.4) + } + .layoutWeight(2) + } + } + } + ``` + + 在ContentTable的build方法内调用IngredientItem接口,需要用this去调用该Component作用域内的方法,以此来区分全局的方法调用。 + + ``` + @Component + struct ContentTable { + ...... + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Start }) { + this.IngredientItem('Calories', 'Calories', '17kcal') + this.IngredientItem('Nutrition', 'Protein', '0.9g') + this.IngredientItem('', 'Fat', '0.2g') + this.IngredientItem('', 'Carbohydrates', '3.9g') + this.IngredientItem('', 'VitaminC', '17.8mg') + } + .height(280) + .padding({ top: 30, right: 30, left: 30 }) + } + } + ``` + + ContentTable组件整体代码如下。 + + ``` + @Component + struct ContentTable { + @Builder IngredientItem(title:string, name: string, value: string) { + Flex() { + Text(title) + .fontSize(17.4) + .fontWeight(FontWeight.Bold) + .layoutWeight(1) + Flex() { + Text(name) + .fontSize(17.4) + .flexGrow(1) + Text(value) + .fontSize(17.4) + } + .layoutWeight(2) + } + } + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Start }) { + this.IngredientItem('Calories', 'Calories', '17kcal') + this.IngredientItem('Nutrition', 'Protein', '0.9g') + this.IngredientItem('', 'Fat', '0.2g') + this.IngredientItem('', 'Carbohydrates', '3.9g') + this.IngredientItem('', 'VitaminC', '17.8mg') + } + .height(280) + .padding({ top: 30, right: 30, left: 30 }) + } + } + + @Entry + @Component + struct FoodDetail { + build() { + Column() { + FoodImageDisplay() + ContentTable() + } + .alignItems(HorizontalAlign.Center) + } + } + ``` + + ![zh-cn_image_0000001215199399](/images/application-dev/ui/figures/zh-cn_image_0000001215199399.png) + +通过学习Stack布局和Flex布局已完成食物的图文展示和营养成分表,构建出第一个普通视图的食物详情页。在下一个章节中,将开发食物分类列表页,并完成食物分类列表页面和食物详情页面的跳转和数据传递,现在我们就进入下一个章节的学习吧。 + +## 相关实例 + +针对创建简单视图,有以下示例工程可供参考: + +- [eTSBuildCommonView](https://gitee.com/openharmony/app_samples/tree/master/ETSUI/eTSBuildCommonView) + 本示例为构建了简单页面展示食物番茄的图片和营养信息,主要为了展示简单页面的Stack布局和Flex布局。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/01.\346\236\204\345\273\272\351\243\237\347\211\251\346\225\260\346\215\256\346\250\241\345\236\213.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/01.\346\236\204\345\273\272\351\243\237\347\211\251\346\225\260\346\215\256\346\250\241\345\236\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..6f53fbaf2a88e99075856cff22abc90429e8e094 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/01.\346\236\204\345\273\272\351\243\237\347\211\251\346\225\260\346\215\256\346\250\241\345\236\213.md" @@ -0,0 +1,108 @@ +--- +title: 构建食物数据模型 +permalink: /pages/000701010300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 构建食物数据模型 + +在创建视图中,我们逐一去表述食物的各个信息,如食物名称、卡路里、蛋白质、脂肪、碳水和维生素C。这样的编码形式在实际的开发中肯定是不切实际的,所以要创建食物数据模型来统一存储和管理数据。 + + +![zh-cn_image_0000001215433095](/images/application-dev/ui/figures/zh-cn_image_0000001215433095.png) + + +1. 新建model文件夹,在model目录下创建FoodData.ets。 + ![zh-cn_image_0000001195119619](/images/application-dev/ui/figures/zh-cn_image_0000001195119619.png) + +2. 定义食物数据的存储模型FoodData和枚举变量Category,FoodData类包含食物id、名称(name)、分类(category)、图片(image)、热量(calories)、蛋白质(protein)、脂肪(fat)、碳水(carbohydrates)和维生素C(vitaminC)属性。 + eTS语言是在ts语言的基础上的扩展,同样支持ts语法。 + + ``` + enum Category { + Fruit, + Vegetable, + Nut, + Seafood, + Dessert + } + + let NextId = 0; + class FoodData { + id: string; + name: string; + image: Resource; + category: Category; + calories: number; + protein: number; + fat: number; + carbohydrates: number; + vitaminC: number; + + constructor(name: string, image: Resource, category: Category, calories: number, protein: number, fat: number, carbohydrates: number, vitaminC: number) { + this.id = `${ NextId++ }`; + this.name = name; + this.image = image; + this.category = category; + this.calories = calories; + this.protein = protein; + this.fat = fat; + this.carbohydrates = carbohydrates; + this.vitaminC = vitaminC; + } + } + ``` + +3. 存入食物图片资源。在resources > phone > media目录下存入食物图片资源,图片名称为食物名称。 + ![zh-cn_image_0000001195117633](/images/application-dev/ui/figures/zh-cn_image_0000001195117633.png) + +4. 创建食物资源数据。在model文件夹下创建FoodDataModels.ets,在该页面中声明食物成分数组FoodComposition。 + 以12个食物数据为例,实际开发中,开发者可以自定义更多的数据资源,当食物资源很多时,建议使用数据懒加载LazyForEach。以下营养数据均来自网络。 + + ``` + const FoodComposition: any[] = [ + { 'name': 'Tomato', 'image': $r('app.media.Tomato'), 'category': Category.Vegetable, 'calories': 17, 'protein': 0.9, 'fat': 0.2, 'carbohydrates': 3.9, 'vitaminC': 17.8 }, + { 'name': 'Walnut', 'image': $r('app.media.Walnut'), 'category': Category.Nut, 'calories': 654 , 'protein': 15, 'fat': 65, 'carbohydrates': 14, 'vitaminC': 1.3 }, + { 'name': 'Cucumber', 'image': $r('app.media.Cucumber'), 'category': Category.Vegetable, 'calories': 30, 'protein': 3, 'fat': 0, 'carbohydrates': 1.9, 'vitaminC': 2.1 }, + { 'name': 'Blueberry', 'image': $r('app.media.Blueberry'), 'category': Category.Fruit, 'calories': 57, 'protein': 0.7, 'fat': 0.3, 'carbohydrates': 14, 'vitaminC': 9.7 }, + { 'name': 'Crab', 'image': $r('app.media.Crab'), 'category': Category.Seafood, 'calories': 97, 'protein': 19, 'fat': 1.5, 'carbohydrates': 0, 'vitaminC': 7.6 }, + { 'name': 'IceCream', 'image': $r('app.media.IceCream'), 'category': Category.Dessert, 'calories': 207, 'protein': 3.5, 'fat': 11, 'carbohydrates': 24, 'vitaminC': 0.6 }, + { 'name': 'Onion', 'image': $r('app.media.Onion'), 'category': Category.Vegetable, 'calories': 39, 'protein': 1.1, 'fat': 0.1, 'carbohydrates': 9, 'vitaminC': 7.4 }, + { 'name': 'Mushroom', 'image': $r('app.media.Mushroom'), 'category': Category.Vegetable, 'calories': 22, 'protein': 3.1, 'fat': 0.3, 'carbohydrates': 3.3, 'vitaminC': 2.1 }, + { 'name': 'Kiwi', 'image': $r('app.media.Kiwi'), 'category': Category.Fruit, 'calories': 60 , 'protein': 1.1, 'fat': 0.5, 'carbohydrates': 15, 'vitaminC': 20.5 }, + { 'name': 'Pitaya', 'image': $r('app.media.Pitaya'), 'category': Category.Fruit, 'calories': 60, 'protein': 1.2, 'fat': 0, 'carbohydrates': 10, 'vitaminC': 60.9 }, + { 'name': 'Avocado', 'image': $r('app.media.Avocado'), 'category': Category.Fruit, 'calories': 160, 'protein': 2, 'fat': 15, 'carbohydrates': 9, 'vitaminC': 10 }, + { 'name': 'Strawberry', 'image': $r('app.media.Strawberry'), 'category': Category.Fruit, 'calories': 32, 'protein': 0.7, 'fat': 0.3, 'carbohydrates': 8, 'vitaminC': 58.8 } + ] + ``` + +5. 创建initializeOnStartUp方法来初始化FoodData的数组。在FoodDataModels.ets中使用了定义在FoodData.ets的FoodData和Category,所以要将FoodData.ets的FoodData类export,在FoodDataModels.ets内import FoodData和Category。 + ``` + // FoodData.ets + export enum Category { + ...... + } + export class FoodData { + ...... + } + // FoodDataModels.ets + import { Category, FoodData } from './FoodData' + + export function initializeOnStartup(): Array { + let FoodDataArray: Array = [] + FoodComposition.forEach(item => { + FoodDataArray.push(new FoodData(item.name, item.image, item.category, item.calories, item.protein, item.fat, item.carbohydrates, item.vitaminC )); + }) + return FoodDataArray; + } + ``` + + +已完成好健康饮食应用的数据资源准备,接下来将通过加载这些数据来创建食物列表页面。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/02.\346\236\204\345\273\272\351\243\237\347\211\251\345\210\227\350\241\250List\345\270\203\345\261\200.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/02.\346\236\204\345\273\272\351\243\237\347\211\251\345\210\227\350\241\250List\345\270\203\345\261\200.md" new file mode 100644 index 0000000000000000000000000000000000000000..c8c7b5d0db13c27f49fe5b0b616b5c35c1489f2b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/02.\346\236\204\345\273\272\351\243\237\347\211\251\345\210\227\350\241\250List\345\270\203\345\261\200.md" @@ -0,0 +1,263 @@ +--- +title: 构建食物列表List布局 +permalink: /pages/000701010301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 构建食物列表List布局 + +使用List组件和ForEach循环渲染,构建食物列表布局。 + + +1. 在pages目录新建页面FoodCategoryList.ets,将index.ets改名为FoodDetail.ets,并将其添加到config.json文件下的pages标签,位于第一序位的页面为首页。 + ``` + "js": [ + { + "pages": [ + "pages/FoodCategoryList", + "pages/FoodDetail" + ], + ] + ``` + +2. 新建FoodList组件作为页面入口组件,FoodListItem为其子组件。List组件是列表组件,适用于重复同类数据的展示,其子组件为ListItem,适用于展示列表中的单元。 + ``` + @Component + struct FoodListItem { + build() {} + } + + @Entry + @Component + struct FoodList { + build() { + List() { + ListItem() { + FoodListItem() + } + } + } + } + ``` + +3. 引入FoodData类和initializeOnStartup方法。 + ``` + import { FoodData } from '../model/FoodData' + import { initializeOnStartup } from '../model/FoodDataModels' + ``` + +4. FoodList和FoodListItem组件数值传递。在FoodList组件内创建类型为FoodData[]成员变量foodItems,调用initializeOnStartup方法为其赋值。在FoodListItem组件内创建类型为FoodData的成员变量foodItem。将父组件foodItems数组的第一个元素的foodItems[0]作为参数传递给FoodListItem。 + ``` + import { FoodData } from '../model/FoodData' + import { initializeOnStartup } from '../model/FoodDataModels' + + @Component + struct FoodListItem { + private foodItem: FoodData + build() {} + } + + @Entry + @Component + struct FoodList { + private foodItems: FoodData[] = initializeOnStartup() + build() { + List() { + ListItem() { + FoodListItem({ foodItem: this.foodItems[0] }) + } + } + } + } + ``` + +5. 声明子组件FoodListItem 的UI布局。创建Flex组件,包含食物图片缩略图,食物名称,和食物对应的卡路里。 + ``` + import { FoodData } from '../model/FoodData' + import { initializeOnStartup } from '../model/FoodDataModels' + + @Component + struct FoodListItem { + private foodItem: FoodData + build() { + Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + Image(this.foodItem.image) + .objectFit(ImageFit.Contain) + .height(40) + .width(40) + .backgroundColor('#FFf1f3f5') + .margin({ right: 16 }) + Text(this.foodItem.name) + .fontSize(14) + .flexGrow(1) + Text(this.foodItem.calories + ' kcal') + .fontSize(14) + } + .height(64) + .margin({ right: 24, left:32 }) + } + } + + @Entry + @Component + struct FoodList { + private foodItems: FoodData[] = initializeOnStartup() + build() { + List() { + ListItem() { + FoodListItem({ foodItem: this.foodItems[0] }) + } + } + } + } + ``` + + ![zh-cn_image_0000001204776353](/images/application-dev/ui/figures/zh-cn_image_0000001204776353.png) + +6. 创建两个FoodListItem。在List组件创建两个FoodListItem,分别给FoodListItem传递foodItems数组的第一个元素this.foodItems[0]和第二个元素foodItem: this.foodItems[1]。 + ``` + import { FoodData } from '../model/FoodData' + import { initializeOnStartup } from '../model/FoodDataModels' + + @Component + struct FoodListItem { + private foodItem: FoodData + build() { + Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + Image(this.foodItem.image) + .objectFit(ImageFit.Contain) + .height(40) + .width(40) + .backgroundColor('#FFf1f3f5') + .margin({ right: 16 }) + Text(this.foodItem.name) + .fontSize(14) + .flexGrow(1) + Text(this.foodItem.calories + ' kcal') + .fontSize(14) + } + .height(64) + .margin({ right: 24, left:32 }) + } + } + + @Entry + @Component + struct FoodList { + private foodItems: FoodData[] = initializeOnStartup() + build() { + List() { + ListItem() { + FoodListItem({ foodItem: this.foodItems[0] }) + } + ListItem() { + FoodListItem({ foodItem: this.foodItems[1] }) + } + } + } + } + ``` + + ![zh-cn_image_0000001204537865](/images/application-dev/ui/figures/zh-cn_image_0000001204537865.png) + +7. 单独创建每一个FoodListItem肯定是不合理的。这就需要引入ForEach循环渲染,ForEach语法如下。 + ``` + ForEach( + arr: any[], // Array to be iterated + itemGenerator: (item: any) => void, // child component generator + keyGenerator?: (item: any) => string // (optional) Unique key generator, which is recommended. + ) + ``` + + ForEach组有三个参数,第一个参数是需要被遍历的数组,第二个参数为生成子组件的lambda函数,第三个参数是键值生成器。出于性能原因,即使第三个参数是可选的,强烈建议开发者提供。keyGenerator使开发框架能够更好地识别数组更改,而不必因为item的更改重建全部节点。 + + 遍历foodItems数组循环创建ListItem组件,foodItems中每一个item都作为参数传递给FoodListItem组件。 + + ``` + ForEach(this.foodItems, item => { + ListItem() { + FoodListItem({ foodItem: item }) + } + }, item => item.id.toString()) + ``` + + 整体的代码如下。 + + ``` + import { FoodData } from '../model/FoodData' + import { initializeOnStartup } from '../model/FoodDataModels' + + @Component + struct FoodListItem { + private foodItem: FoodData + build() { + Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + Image(this.foodItem.image) + .objectFit(ImageFit.Contain) + .height(40) + .width(40) + .backgroundColor('#FFf1f3f5') + .margin({ right: 16 }) + Text(this.foodItem.name) + .fontSize(14) + .flexGrow(1) + Text(this.foodItem.calories + ' kcal') + .fontSize(14) + } + .height(64) + .margin({ right: 24, left:32 }) + } + } + + @Entry + @Component + struct FoodList { + private foodItems: FoodData[] = initializeOnStartup() + build() { + List() { + ForEach(this.foodItems, item => { + ListItem() { + FoodListItem({ foodItem: item }) + } + }, item => item.id.toString()) + } + } + } + ``` + +8. 添加FoodList标题。 + ``` + @Entry + @Component + struct FoodList { + private foodItems: FoodData[] = initializeOnStartup() + build() { + Column() { + Flex({justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center}) { + Text('Food List') + .fontSize(20) + .margin({ left:20 }) + } + .height('7%') + .backgroundColor('#FFf1f3f5') + List() { + ForEach(this.foodItems, item => { + ListItem() { + FoodListItem({ foodItem: item }) + } + }, item => item.id.toString()) + } + .height('93%') + } + } + } + ``` + + ![zh-cn_image_0000001169678922](/images/application-dev/ui/figures/zh-cn_image_0000001169678922.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/03.\346\236\204\345\273\272\351\243\237\347\211\251\345\210\206\347\261\273Grid\345\270\203\345\261\200.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/03.\346\236\204\345\273\272\351\243\237\347\211\251\345\210\206\347\261\273Grid\345\270\203\345\261\200.md" new file mode 100644 index 0000000000000000000000000000000000000000..c0918498b85afabbe08bda548bf284b0e39f212e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/03.\346\236\204\345\273\272\351\243\237\347\211\251\345\210\206\347\261\273Grid\345\270\203\345\261\200.md" @@ -0,0 +1,372 @@ +--- +title: 构建食物分类Grid布局 +permalink: /pages/000701010302 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 构建食物分类Grid布局 + +健康饮食应用在主页提供给用户两种食物显示方式:列表显示和网格显示。开发者将实现通过页签切换不同食物分类的网格布局。 + + +1. 将Category枚举类型引入FoodCategoryList页面。 + ``` + import { Category, FoodData } from '../model/FoodData' + ``` + +2. 创建FoodCategoryList和FoodCategory组件,其中FoodCategoryList作为新的页面入口组件,在入口组件调用initializeOnStartup方法。 + ``` + @Component + struct FoodList { + private foodItems: FoodData[] + build() { + ...... + } + } + + @Component + struct FoodCategory { + private foodItems: FoodData[] + build() { + ...... + } + } + + @Entry + @Component + struct FoodCategoryList { + private foodItems: FoodData[] = initializeOnStartup() + build() { + ...... + } + } + ``` + +3. 在FoodCategoryList组件内创建showList成员变量,用于控制List布局和Grid布局的渲染切换。需要用到条件渲染语句if...else...。 + ``` + @Entry + @Component + struct FoodCategoryList { + private foodItems: FoodData[] = initializeOnStartup() + private showList: boolean = false + + build() { + Stack() { + if (this.showList) { + FoodList({ foodItems: this.foodItems }) + } else { + FoodCategory({ foodItems: this.foodItems }) + } + } + } + } + ``` + +4. 在页面右上角创建切换List/Grid布局的图标。设置Stack对齐方式为顶部尾部对齐TopEnd,创建Image组件,设置其点击事件,即showList取反。 + ``` + @Entry + @Component + struct FoodCategoryList { + private foodItems: FoodData[] = initializeOnStartup() + private showList: boolean = false + + build() { + Stack({ alignContent: Alignment.TopEnd }) { + if (this.showList) { + FoodList({ foodItems: this.foodItems }) + } else { + FoodCategory({ foodItems: this.foodItems }) + } + Image($r('app.media.Switch')) + .height(24) + .width(24) + .margin({ top: 15, right: 10 }) + .onClick(() => { + this.showList = !this.showList + }) + }.height('100%') + } + } + ``` + +5. 添加\@State装饰器。点击右上角的switch标签后,页面没有任何变化,这是因为showList不是有状态数据,它的改变不会触发页面的刷新。需要为其添加\@State装饰器,使其成为状态数据,它的改变会引起其所在组件的重新渲染。 + ``` + @Entry + @Component + struct FoodCategoryList { + private foodItems: FoodData[] = initializeOnStartup() + @State private showList: boolean = false + + build() { + Stack({ alignContent: Alignment.TopEnd }) { + if (this.showList) { + FoodList({ foodItems: this.foodItems }) + } else { + FoodCategory({ foodItems: this.foodItems }) + } + Image($r('app.media.Switch')) + .height(24) + .width(24) + .margin({ top: 15, right: 10 }) + .onClick(() => { + this.showList = !this.showList + }) + }.height('100%') + } + } + + ``` + + 点击切换图标,FoodList组件出现,再次点击,FoodList组件消失。 + + ![zh-cn_image_0000001170411978](/images/application-dev/ui/figures/zh-cn_image_0000001170411978.gif) + +6. 创建显示所有食物的页签(All)。在FoodCategory组件内创建Tabs组件和其子组件TabContent,设置tabBar为All。设置TabBars的宽度为280,布局模式为Scrollable,即超过总长度后可以滑动。Tabs是一种可以通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图TabContent。 + ``` + @Component + struct FoodCategory { + private foodItems: FoodData[] + build() { + Stack() { + Tabs() { + TabContent() {}.tabBar('All') + } + .barWidth(280) + .barMode(BarMode.Scrollable) + } + } + } + ``` + + ![zh-cn_image_0000001204538065](/images/application-dev/ui/figures/zh-cn_image_0000001204538065.png) + +7. 创建FoodGrid组件,作为TabContent的子组件。 + ``` + @Component + struct FoodGrid { + private foodItems: FoodData[] + build() {} + } + + @Component + struct FoodCategory { + private foodItems: FoodData[] + build() { + Stack() { + Tabs() { + TabContent() { + FoodGrid({ foodItems: this.foodItems }) + }.tabBar('All') + } + .barWidth(280) + .barMode(BarMode.Scrollable) + } + } + } + ``` + +8. 实现2 \* 6的网格布局(一共12个食物数据资源)。创建Grid组件,设置列数columnsTemplate('1fr 1fr'),行数rowsTemplate('1fr 1fr 1fr 1fr 1fr 1fr'),行间距和列间距rowsGap和columnsGap为8。创建Scroll组件,使其可以滑动。 + ``` + @Component + struct FoodGrid { + private foodItems: FoodData[] + build() { + Scroll() { + Grid() { + ForEach(this.foodItems, (item: FoodData) => { + GridItem() {} + }, (item: FoodData) => item.id.toString()) + } + .rowsTemplate('1fr 1fr 1fr 1fr 1fr 1fr') + .columnsTemplate('1fr 1fr') + .columnsGap(8) + .rowsGap(8) + } + .scrollBar(BarState.Off) + .padding({left: 16, right: 16}) + } + } + ``` + +9. 创建FoodGridItem组件,展示食物图片、名称和卡路里,实现其UI布局,为GridItem的子组件。每个FoodGridItem高度为184,行间距为8,设置Grid总高度为(184 + 8) \* 6 - 8 = 1144。 + ``` + @Component + struct FoodGridItem { + private foodItem: FoodData + build() { + Column() { + Row() { + Image(this.foodItem.image) + .objectFit(ImageFit.Contain) + .height(152) + .width('100%') + }.backgroundColor('#FFf1f3f5') + Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + Text(this.foodItem.name) + .fontSize(14) + .flexGrow(1) + .padding({ left: 8 }) + Text(this.foodItem.calories + 'kcal') + .fontSize(14) + .margin({ right: 6 }) + } + .height(32) + .width('100%') + .backgroundColor('#FFe5e5e5') + } + .height(184) + .width('100%') + } + } + + @Component + struct FoodGrid { + private foodItems: FoodData[] + build() { + Scroll() { + Grid() { + ForEach(this.foodItems, (item: FoodData) => { + GridItem() { + FoodGridItem({foodItem: item}) + } + }, (item: FoodData) => item.id.toString()) + } + .rowsTemplate('1fr 1fr 1fr 1fr 1fr 1fr') + .columnsTemplate('1fr 1fr') + .columnsGap(8) + .rowsGap(8) + .height(1144) + } + .scrollBar(BarState.Off) + .padding({ left: 16, right: 16 }) + } + } + ``` + + ![zh-cn_image_0000001170167520](/images/application-dev/ui/figures/zh-cn_image_0000001170167520.gif) + +10. 创建展示蔬菜(Category.Vegetable)、水果(Category.Fruit)、坚果(Category.Nut)、海鲜(Category.SeaFood)和甜品(Category.Dessert)分类的页签。 + ``` + @Component + struct FoodCategory { + private foodItems: FoodData[] + build() { + Stack() { + Tabs() { + TabContent() { + FoodGrid({ foodItems: this.foodItems }) + }.tabBar('All') + + TabContent() { + FoodGrid({ foodItems: this.foodItems.filter(item => (item.category === Category.Vegetable)) }) + }.tabBar('Vegetable') + + TabContent() { + FoodGrid({ foodItems: this.foodItems.filter(item => (item.category === Category.Fruit)) }) + }.tabBar('Fruit') + + TabContent() { + FoodGrid({ foodItems: this.foodItems.filter(item => (item.category === Category.Nut)) }) + }.tabBar('Nut') + + TabContent() { + FoodGrid({ foodItems: this.foodItems.filter(item => (item.category === Category.Seafood)) }) + }.tabBar('Seafood') + + TabContent() { + FoodGrid({ foodItems: this.foodItems.filter(item => (item.category === Category.Dessert)) }) + }.tabBar('Dessert') + } + .barWidth(280) + .barMode(BarMode.Scrollable) + } + } + } + ``` + +11. 设置不同食物分类的Grid的行数和高度。因为不同分类的食物数量不同,所以不能用'1fr 1fr 1fr 1fr 1fr 1fr '常量来统一设置成6行。 + 创建gridRowTemplate和HeightValue成员变量,通过成员变量设置Grid行数和高度。 + + ``` + @Component + struct FoodGrid { + private foodItems: FoodData[] + private gridRowTemplate : string = '' + private heightValue: number + build() { + Scroll() { + Grid() { + ForEach(this.foodItems, (item: FoodData) => { + GridItem() { + FoodGridItem({foodItem: item}) + } + }, (item: FoodData) => item.id.toString()) + } + .rowsTemplate(this.gridRowTemplate) + .columnsTemplate('1fr 1fr') + .columnsGap(8) + .rowsGap(8) + .height(this.heightValue) + } + .scrollBar(BarState.Off) + .padding({left: 16, right: 16}) + } + } + ``` + + 调用aboutToAppear接口计算行数(gridRowTemplate )和高度(heightValue)。 + + ``` + aboutToAppear() { + var rows = Math.round(this.foodItems.length / 2); + this.gridRowTemplate = '1fr '.repeat(rows); + this.heightValue = rows * 192 - 8; + } + ``` + + 自定义组件提供了两个生命周期的回调接口aboutToAppear和aboutToDisappear。aboutToAppear的执行时机在创建自定义组件后,执行自定义组件build方法之前。aboutToDisappear在自定义组件的去初始化的时机执行。 + + ![zh-cn_image_0000001215113569](/images/application-dev/ui/figures/zh-cn_image_0000001215113569.png) + + ``` + @Component + struct FoodGrid { + private foodItems: FoodData[] + private gridRowTemplate : string = '' + private heightValue: number + + aboutToAppear() { + var rows = Math.round(this.foodItems.length / 2); + this.gridRowTemplate = '1fr '.repeat(rows); + this.heightValue = rows * 192 - 8; + } + + build() { + Scroll() { + Grid() { + ForEach(this.foodItems, (item: FoodData) => { + GridItem() { + FoodGridItem({foodItem: item}) + } + }, (item: FoodData) => item.id.toString()) + } + .rowsTemplate(this.gridRowTemplate) + .columnsTemplate('1fr 1fr') + .columnsGap(8) + .rowsGap(8) + .height(this.heightValue) + } + .scrollBar(BarState.Off) + .padding({left: 16, right: 16}) + } + } + ``` + + ![zh-cn_image_0000001170008198](/images/application-dev/ui/figures/zh-cn_image_0000001170008198.gif) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/04.\351\241\265\351\235\242\350\267\263\350\275\254\344\270\216\346\225\260\346\215\256\344\274\240\351\200\222.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/04.\351\241\265\351\235\242\350\267\263\350\275\254\344\270\216\346\225\260\346\215\256\344\274\240\351\200\222.md" new file mode 100644 index 0000000000000000000000000000000000000000..2c0fba3f67c1af7c10a21e6cc77dc38c68e9e6ef --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/02.\346\226\271\350\210\237\345\274\200\345\217\221\346\241\206\346\236\266\357\274\210ArkUI\357\274\211/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\241\265\351\235\242\345\270\203\345\261\200\344\270\216\350\277\236\346\216\245/04.\351\241\265\351\235\242\350\267\263\350\275\254\344\270\216\346\225\260\346\215\256\344\274\240\351\200\222.md" @@ -0,0 +1,284 @@ +--- +title: 页面跳转与数据传递 +permalink: /pages/000701010303 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 页面跳转与数据传递 + +本节将学习页面跳转和数据传递,实现: + + +1. 页面跳转:点击食物分类列表页面的食物条目后,跳转到食物详情页;点击食物详情页的返回按钮,返回到食物列表页。 + +2. 页面间数据传递:点击不同的食物条目后,FoodDetail接受前一个页面的数据,渲染对应的食物详情页。 + + +## 页面跳转 + +声明式UI范式提供了两种机制来实现页面间的跳转: + +1. 路由容器组件Navigator,包装了页面路由的能力,指定页面target后,使其包裹的子组件都具有路由能力。 + +2. 路由RouterAPI接口,通过在页面上引入router,可以调用router的各种接口,从而实现页面路由的各种操作。 + +下面我们就分别学习这两种跳转机制来实现食物分类列表页面和食物详情页的链接。 + +1. 点击FoodListItem后跳转到FoodDetail页面。在FoodListItem内创建Navigator组件,使其子组件都具有路由功能,目标页面target为'pages/FoodDetail'。 + ``` + @Component + struct FoodListItem { + private foodItem: FoodData + build() { + Navigator({ target: 'pages/FoodDetail' }) { + Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + Image(this.foodItem.image) + .objectFit(ImageFit.Contain) + .height(40) + .width(40) + .backgroundColor('#FFf1f3f5') + .margin({ right: 16 }) + Text(this.foodItem.name) + .fontSize(14) + .flexGrow(1) + Text(this.foodItem.calories + ' kcal') + .fontSize(14) + } + .height(64) + } + .margin({ right: 24, left:32 }) + } + } + ``` + + ![zh-cn_image_0000001215318403](/images/application-dev/ui/figures/zh-cn_image_0000001215318403.gif) + +2. 点击FoodGridItem后跳转到FoodDetail页面。调用页面路由router模块的push接口,将FoodDetail页面推到路由栈中,实现页面跳转。使用router路由API接口,需要先引入router。 + ``` + import router from '@system.router' + + @Component + struct FoodGridItem { + private foodItem: FoodData + build() { + Column() { + ...... + } + .height(184) + .width('100%') + .onClick(() => { + router.push({ uri: 'pages/FoodDetail' }) + }) + } + } + ``` + + ![zh-cn_image_0000001169918548](/images/application-dev/ui/figures/zh-cn_image_0000001169918548.gif) + +3. 在FoodDetail页面增加回到食物列表页面的图标。在resources > phone > media文件夹下存入回退图标Back.png。新建自定义组件PageTitle,包含后退的图标和Food Detail的文本,调用路由的router.back()接口,弹出路由栈最上面的页面,即返回上一级页面。 + ``` + // FoodDetail.ets + import router from '@system.router' + + @Component + struct PageTitle { + build() { + Flex({ alignItems: ItemAlign.Start }) { + Image($r('app.media.Back')) + .width(21.8) + .height(19.6) + Text('Food Detail') + .fontSize(21.8) + .margin({left: 17.4}) + } + .height(61) + .backgroundColor('#FFedf2f5') + .padding({ top: 13, bottom: 15, left: 28.3 }) + .onClick(() => { + router.back() + }) + } + } + ``` + +4. 在FoodDetail组件内创建Stack组件,包含子组件FoodImageDisplay和PageTitle子组件,设置其对齐方式为左上对齐TopStart。 + ``` + @Entry + @Component + struct FoodDetail { + build() { + Column() { + Stack( { alignContent: Alignment.TopStart }) { + FoodImageDisplay() + PageTitle() + } + ContentTable() + } + .alignItems(HorizontalAlign.Center) + } + } + ``` + + ![zh-cn_image_0000001214998349](/images/application-dev/ui/figures/zh-cn_image_0000001214998349.png) + + +## 页面间数据传递 + +我们已经完成了FoodCategoryList页面和FoodDetail页面的跳转和回退,但是点击不同的FoodListItem/FoodGridItem,跳转的FoodDetail页面都是西红柿Tomato的详细介绍,这是因为没有构建起两个页面的数据传递,需要用到携带参数(parameter)路由。 + +1. 在FoodListItem组件的Navigator设置其params属性,params属性接受key-value的Object。 + ``` + // FoodList.ets + @Component + struct FoodListItem { + private foodItem: FoodData + build() { + Navigator({ target: 'pages/FoodDetail' }) { + ...... + } + .params({ foodData: this.foodItem }) + } + } + ``` + + FoodGridItem调用的routerAPI同样有携带参数跳转的能力,使用方法和Navigator类似。 + + ``` + router.push({ + uri: 'pages/FoodDetail', + params: { foodData: this.foodItem } + }) + ``` + +2. FoodDetail页面引入FoodData类,在FoodDetail组件内添加foodItem成员变量。 + ``` + // FoodDetail.ets + import { FoodData } from '../model/FoodData' + + @Entry + @Component + struct FoodDetail { + private foodItem: FoodData + build() { + ...... + } + } + ``` + +3. 获取foodData对应的value。调用router.getParams().foodData来获取到FoodCategoryList页面跳转来时携带的foodDate对应的数据。 + ``` + @Entry + @Component + struct FoodDetail { + private foodItem: FoodData = router.getParams().foodData + + build() { + ...... + } + } + ``` + +4. 重构FoodDetail页面的组件。在构建视图时,FoodDetail页面的食物信息都是直接声明的常量,现在要用传递来的FoodData数据来对其进行重新赋值。整体的FoodDetail.ets代码如下。 + ``` + @Component + struct PageTitle { + build() { + Flex({ alignItems: ItemAlign.Start }) { + Image($r('app.media.Back')) + .width(21.8) + .height(19.6) + Text('Food Detail') + .fontSize(21.8) + .margin({left: 17.4}) + } + .height(61) + .backgroundColor('#FFedf2f5') + .padding({ top: 13, bottom: 15, left: 28.3 }) + .onClick(() => { + router.back() + }) + } + } + + @Component + struct FoodImageDisplay { + private foodItem: FoodData + build() { + Stack({ alignContent: Alignment.BottomStart }) { + Image(this.foodItem.image) + .objectFit(ImageFit.Contain) + Text(this.foodItem.name) + .fontSize(26) + .fontWeight(500) + .margin({ left: 26, bottom: 17.4 }) + } + .height(357) + .backgroundColor('#FFedf2f5') + } + } + + @Component + struct ContentTable { + private foodItem: FoodData + + @Builder IngredientItem(title:string, name: string, value: string) { + Flex() { + Text(title) + .fontSize(17.4) + .fontWeight(FontWeight.Bold) + .layoutWeight(1) + Flex() { + Text(name) + .fontSize(17.4) + .flexGrow(1) + Text(value) + .fontSize(17.4) + } + .layoutWeight(2) + } + } + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Start }) { + this.IngredientItem('Calories', 'Calories', this.foodItem.calories + 'kcal') + this.IngredientItem('Nutrition', 'Protein', this.foodItem.protein + 'g') + this.IngredientItem('', 'Fat', this.foodItem.fat + 'g') + this.IngredientItem('', 'Carbohydrates', this.foodItem.carbohydrates + 'g') + this.IngredientItem('', 'VitaminC', this.foodItem.vitaminC + 'mg') + } + .height(280) + .padding({ top: 30, right: 30, left: 30 }) + } + } + + @Entry + @Component + struct FoodDetail { + private foodItem: FoodData = router.getParams().foodData + + build() { + Column() { + Stack( { alignContent: Alignment.TopStart }) { + FoodImageDisplay({ foodItem: this.foodItem }) + PageTitle() + } + ContentTable({ foodItem: this.foodItem }) + } + .alignItems(HorizontalAlign.Center) + } + } + ``` + +## 相关实例 + +针对页面布局与连接,有以下示例工程可供参考: + +- [eTSDefiningPageLayoutAndConnection](https://gitee.com/openharmony/app_samples/tree/master/ETSUI/eTSDefiningPageLayoutAndConnection) + 本示例构建了食物分类列表页面和食物详情页,向开发者展示了List布局、Grid布局以及页面路由的基本用法。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/01.\351\237\263\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/01.\351\237\263\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..a28fb56aea68991a3e5c6a18a0b7202ac1ad3e73 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/01.\351\237\263\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" @@ -0,0 +1,36 @@ +--- +title: 音频开发概述 +permalink: /pages/00070200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 音频开发概述 + +- [基本概念](#基本概念) + +OpenHarmony音频模块支持音频业务的开发,提供音频相关的功能,主要包括音频播放、音量管理等。 + + +## 基本概念 + +- **采样**
+ 采样是指将连续时域上的模拟信号按照一定的时间间隔采样,获取到离散时域上离散信号的过程。 + +- **采样率**
+ 采样率为每秒从连续信号中提取并组成离散信号的采样次数,单位用赫兹(Hz)来表示。通常人耳能听到频率范围大约在20Hz~20kHz之间的声音。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。 + +- **声道**
+ 声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。 + +- **音频帧**
+ 音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。 + +- **PCM**
+ PCM(Pulse Code Modulation),即脉冲编码调制,是一种将模拟信号数字化的方法,是将时间连续、取值连续的模拟信号转换成时间离散、抽样值离散的数字信号的过程。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/02.\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/02.\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..31585b30daee58ba9eb7f5e00cb39015d2bf5f6f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/02.\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,144 @@ +--- +title: 音频播放开发指导 +permalink: /pages/00070201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 音频播放开发指导 + +- [场景介绍](#场景介绍) +- [接口说明](#接口说明) + +## 场景介绍 + +音频播放的主要工作是将音频数据转码为可听见的音频模拟信号并通过输出设备进行播放,同时对播放任务进行管理。 + +**图1** 音频播放状态机 +![zh-cn_image_0000001182608857](/images/application-dev/media/figures/zh-cn_image_0000001182608857.png) + + +## 接口说明 + +**表1** media + +| 接口名 | 描述 | +| -------- | -------- | +| media.createAudioPlayer() | 创建AudioPlayer实例。 | +| AudioPlayer | 提供音频播放相关功能,具体见表 音频播放相关的interface AudioPlayer。 | + +**表2** 音频播放相关的interface **AudioPlayer** + +| 接口名 | 描述 | +| -------- | -------- | +| release() | 释放音频资源。 | +| play() | 开始播放音频源。 | +| pause() | 暂停播放。 | +| stop() | 停止播放。 | +| reset()7+ | 重置播放音频源。 | +| setVolume(vol: number) | 改变音频播放音量 | +| seek(timeMs: number) | 改变播放位置。 | +| src:string | 音频播放的媒体URI。 | +| state:AudioState | 播放的状态属性。 | +| currentTime:number | 音频的当前播放位置。 | +| duration:number | 音频播放的时长(当数据源不支持改变播放位置时返回-1, 比如实时流媒体场景)。 | +| loop:boolean | 音频的循环播放属性。 | +| on('play', function callback) | 订阅音频播放开始事件。 | +| on('pause', function callback) | 订阅音频播放暂停事件。 | +| on('stop', function callback) | 订阅音频播放停止事件。 | +| on('reset', function callback) | 订阅音频播放重置事件。 | +| on('finish',function callback) | 订阅音频播放结束事件。 | +| on('error', function callback) | 订阅音频播放错误事件。 | +| on('dataload', function callback) | 订阅音频播放加载数据事件。 | +| on('volumeChange', function callback) | 订阅音频播放音量变化事件。 | +| on('timeUpdate', function callback) | 订阅音频播放进度改变事件。 | + + +1. 创建音频播放器。 + ``` + import media from '@ohos.multimedia.media'; + var player = media.createAudioPlayer(); + ``` + +2. 设置消息订阅事件。 + ``` + player.on('play', (err, action) => { + if (err) { + console.error('Error returned in the play() callback.'); + return; + } + console.info('Current player duration: '+ player.duration); + console.info('Current player time: ' + player.currentTime); + console.info('Current player status: '+player.state); + console.info('Pause MP3'); + player.pause(); + }); + player.on('pause', (err, action) => { + if (err) { + console.error('Error returned in the pause() callback.'); + return; + } + console.info('Current player status: ' + player.state); + console.info('Current player time: ' + player.currentTime); + player.seek(30000); // Seek for 30 seconds. + }); + player.on('stop', (err, action) => { + if (err) { + console.error('Error returned in the stop() callback.'); + return; + } + console.info('stop callback invoked. State:' + player.state); + player.reset(); + }); + player.on('dataLoad', (err, action) => { + if (err) { + console.error('Error returned in the dataLoad() callback.'); + return; + } + console.info('dataLoad callback invoked. Current time: ' + player.currentTime); + console.info('Duration of the source:' + player.duration); + player.play(); + }); + player.on('reset', (err, action) => { + if (err) { + console.error('Error returned in the reset() callback.'); + return; + } + console.info('reset callback invoked.'); + player.release(); + }); + player.on('finish', (err, action) => { + if (err) { + console.error('Error returned in the finish() callback.'); + return; + } + console.info('finish callback invoked.'); + }); + player.on('timeUpdate', (seekTime, action) => { + console.info('Seek time: ' + seekTime); + console.info('Current player time: ' + player.currentTime); + var newTime = player.currentTime; + if(newTime == 30000) { + console.info('Seek succeeded. New time: ' + newTime); + } else { + console.error('Seek failed: ', + newTime); + } + player.stop(); + }); + player.on('error', (err) => { + console.error('Player error: ${err.message}'); + }); + ``` + +3. 启动播放。 + ``` + var audioSourceMp3 = 'file://test.mp3'; + player.src = audioSourceMp3; + player.loop = true; + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/03.\351\237\263\351\242\221\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/03.\351\237\263\351\242\221\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..9d61101b504e4b29bcd70a86e09a39013a55cf7f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/03.\351\237\263\351\242\221\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,111 @@ +--- +title: 音频管理开发指导 +permalink: /pages/00070202 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 音频管理开发指导 + +- [场景介绍](#场景介绍) +- [接口说明](#接口说明) +- [开发步骤](#开发步骤) + +## 场景介绍 + +音频管理的主要工作是音量调节与音量查询,以及输入/输出设备查询。 + + +## 接口说明 + +**表1** audio的相关接口 + +| 接口名 | 描述 | +| -------- | -------- | +| getAudioManager(): AudioManager | 获得音频管理器。 | +| AudioManager | 音频管理器。具体参考表 音频管理相关的interface AudioManager。 | +| AudioDeviceDescriptor | 描述音频设备。 | +| AudioVolumeType | 表示音频流类型的枚举。 | +| DeviceFlag | 表示可获取的设备种类的枚举。 | +| DeviceRole | 表示设备角色的枚举。 | +| DeviceType | 表示设备类型的枚举。 | + +**表2** 音频管理相关的interface **AudioManager** + +| 接口名 | 描述 | +| -------- | -------- | +| setVolume(audioType: AudioVolumeType,volume: number,callback: AsyncCallback<void>): void | 改变某个流的音量。 | +| setVolume(audioType: AudioVolumeType,volume: number): Promise<void> | 改变某个流的音量。 | +| getVolume(audioType: AudioVolumeType, callback: AsyncCallback<number>): void | 获得某个流的音量。 | +| getVolume(audioType: AudioVolumeType): Promise<number> | 获得某个流的音量。 | +| getMinVolume(audioType: AudioVolumeType, callback: AsyncCallback<number>): void | 获得某个流的最小音量。 | +| getMinVolume(audioType: AudioVolumeType): Promise<number> | 获得某个流的最小音量。 | +| getMaxVolume(audioType: AudioVolumeType, callback: AsyncCallback<number>): void | 获得某个流的最大音量。 | +| getMaxVolume(audioType: AudioVolumeType): Promise<number> | 获得某个流的最大音量。 | +| getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback<AudioDeviceDescriptors>): void | 获得设备列表。 | +| getDevices(deviceFlag: DeviceFlag): Promise<AudioDeviceDescriptors> | 获得设备列表。 | + +**表3** 表示音频设备的interface **AudioDeviceDescriptor** + +| 属性 | 描述 | +| -------- | -------- | +| deviceRole: DeviceRole | 设备角色。 | +| deviceType: DeviceType | 设备类型。 | + +**表4** 表示音频流类型的枚举**AudioVolumeType** + +| 枚举值 | 描述 | +| -------- | -------- | +| MEDIA = 1 | 媒体声音。 | +| RINGTONE = 2 | 铃声。 | + +**表5** 表示可获取的设备种类的枚举**DeviceFlag** + +| 枚举值 | 描述 | +| -------- | -------- | +| OUTPUT_DEVICES_FLAG = 1 | 输出设备。 | +| INPUT_DEVICES_FLAG = 2 | 输入设备。 | +| ALL_DEVICES_FLAG = 3 | 所有设备。 | + +**表6** 表示设备角色的枚举**DeviceRole** + +| 枚举值 | 描述 | +| -------- | -------- | +| INPUT_DEVICE = 1 | 输入设备。 | +| OUTPUT_DEVICE = 2 | 输出设备。 | + +**表7** 表示设备类型的枚举**DeviceType** + +| 枚举值 | 描述 | +| -------- | -------- | +| INVALID = 0 | 无效。 | +| SPEAKER = 1 | 扬声器。 | +| WIRED_HEADSET = 2 | 有线耳机。 | +| BLUETOOTH_SCO = 3 | 蓝牙设备。 | +| BLUETOOTH_A2DP = 4 | 支持A2DP的蓝牙设备。 | +| MIC = 5 | 麦克风。 | + + +## 开发步骤 + +1. 获取音频控制器。 + ``` + const audioManager = audio.getAudioManager(); + ``` + +2. 改变媒体流的声音。 + ``` + audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error(`failed to get volume ${err.message}`); + return; + } + console.log(`Media getVolume ${value}`); + }); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/04.\351\237\263\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/04.\351\237\263\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..8b0ef27d050c10eae86e26f299b741fee9bc8e2d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/03.\351\237\263\351\242\221/04.\351\237\263\351\242\221\345\275\225\345\210\266\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,133 @@ +--- +title: 音频录制开发指导 +permalink: /pages/00070203 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 音频录制开发指导 + +- [场景介绍](#场景介绍) +- [接口说明](#接口说明) + +## 场景介绍 + +音频录制的主要工作是将音频信号记录并保存下来,同时提供包括采样率、声道数、码率、编码格式、封装格式、文件路径等设置功能。 + + +## 接口说明 + +**表1** media + +| 接口名 | 描述 | +| -------- | -------- | +| media.createAudioRecorder() | 创建AudioRecorder实例。 | +| AudioRecorder | 提供音频录制相关功能。 | +| AudioRecorderConfig | 提供音频录制相关参数设置。 | + +**表2** 音频录制相关的interface **AudioRecorder** + +| 接口名 | 描述 | +| -------- | -------- | +| prepare(config: AudioRecorderConfig): void | 准备音频录制并设置参数。 | +| start(): void | 开始音频录制。 | +| pause(): void | 暂停音频录制。(暂不支持) | +| resume(): void | 恢复音频录制。(暂不支持) | +| stop(): void | 停止音频录制。 | +| release(): void | 释放音频录制资源。 | +| reset(): void | 重置音频录制。 | +| on('prepare', function callback) | 订阅音频录制准备事件。 | +| on('start', function callback) | 订阅音频录制开始事件。 | +| on('pause', function callback) | 订阅音频录制暂停事件。 | +| on('resume', function callback) | 订阅音频录制恢复事件。 | +| on('stop',function callback) | 订阅音频录制结束事件。 | +| on('release', function callback) | 订阅音频录制释放资源事件。 | +| on('reset', function callback) | 订阅音频录制重置事件。 | +| on('error', function callback) | 订阅音频录制错误事件。 | + +**表3** 音频录制的相关参数的interface **AudioRecorderConfig** + +| 接口名 | 描述 | +| -------- | -------- | +| audioEncoder?: AudioEncoder | 音频编码格式,默认值是AAC_LC。 | +| audioEncodeBitRate?: number | 音频编码的比特率,默认值为48000。 | +| audioSampleRate?: number | 音频编码的采样率,默认值为48000。 | +| numberOfChannels?:number | 音频的声道数,默认值为2。 | +| format?: AudioOutputFormat | 音频的输出格式,默认值是MPEG_4。 | +| uri: string | 音频的输出路径。(file://path 或者 file://fd) | + +**表4** AudioEncoder的相关参数的interface **AudioEncoder** + +| 接口名 | 描述 | +| -------- | -------- | +| AAC_LC = 3 | 表示AAC_LC编码格式。 | + +**表5** 音频输出格式的相关参数的interface **AudioOutputFormat** + +| 接口名 | 描述 | +| -------- | -------- | +| MPEG_4 = 2 | 表示MPEG_4编码格式。 | +| AAC_ADTS= 6 | 表示AAC_ADTS编码格式。 | + +1. 创建音频录制器。 + ``` + import media from '@ohos.multimedia.media'; + var recorder = media.createAudioRecorder(); + ``` + +2. 准备音频录制参数。 + ``` + let audioRecorderConfig = { + audioEncoder : AAC_LC , + audioEncodeBitRate : 22050, + audioSampleRate : 22050, + numberOfChannels : 2, + format : AAC_ADTS, + uri : 'file:///data/accounts/account_0/appdata/appdata/recorder/test.m4a', + } + recorder.prepare(audioRecorderConfig); + ``` + +3. 设置消息订阅事件。 + ``` + recorder.on('prepare', () => { + console.info('setCallback prepare() case callback is called'); + recorder.start(); + }); + recorder.on('start', () => { + console.info('setCallback start() case callback is called'); + setTimeout(function(){ + recorder.pause(); + }, 10000); // 开始录音10秒后,暂停录音。 + }); + recorder.on('pause', () => { + console.info('setCallback pause() case callback is called'); + setTimeout(function(){ + recorder.resume(); + }, 10000); // 暂停录音10秒后,恢复录音。 + }); + recorder.on('resume', () => { + console.info('setCallback resume() case callback is called'); + setTimeout(function(){ + recorder.stop(); + }, 10000); // 恢复录音10秒后,停止录音。 + }); + recorder.on('stop', () => { + console.info('setCallback stop() case callback is called'); + recorder.release(); + }); + recorder.on('release', () => { + console.info('setCallback release() case callback is called'); + }); + recorder.on('error', (err) => { + console.info(`case error called,errCode is ${err.code}`); + console.info(`case error called,errMessage is ${err.message}`); + recorder.reset(); + }); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" similarity index 72% rename from "website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" index c13280f611d82506b8d5cc148e9a2a492a06d8e4..3397c55b8f146753220ac8dbd96247f5410581e7 100644 --- "a/website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/01.IPC\344\270\216RPC\351\200\232\344\277\241\346\246\202\350\277\260.md" @@ -1,6 +1,6 @@ --- title: IPC与RPC通信概述 -permalink: /pages/000c00 +permalink: /pages/00070300 navbar: true sidebar: true prev: true @@ -9,25 +9,26 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:35 --- -# IPC与RPC通信概述 +# IPC与RPC通信概述 -- [基本概念](#section175012297491) -- [约束与限制](#section2029921310472) -- [相关模块](#section1189019299446) +- [基本概念](#基本概念) +- [约束与限制](#约束与限制) +- [相关模块](#相关模块) -## 基本概念 +## 基本概念 IPC(Inter-Process Communication)与RPC(Remote Procedure Call)机制用于实现跨进程通信,不同的是前者使用Binder驱动,用于设备内的跨进程通信,而后者使用软总线驱动,用于跨设备跨进程通信。IPC和RPC通常采用客户端-服务器(Client-Server)模型,服务请求方(Client)可获取提供服务提供方(Server)的代理 (Proxy),并通过此代理读写数据来实现进程间的数据通信。通常,Server会先注册系统能力(System Ability)到系统能力管理者(System Ability Manager,缩写SAMgr)中,SAMgr负责管理这些SA并向Client提供相关的接口。Client要和某个具体的SA通信,必须先从SAMgr中获取该SA的代理,然后使用代理和SA通信。下文使用Proxy表示服务请求方,Stub表示服务提供方。 -## 约束与限制 + +## 约束与限制 目前暂不支持的场景: 跨设备RPC -## 相关模块 -分布式任务调度子系统 +## 相关模块 +分布式任务调度子系统 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/02.IPC\344\270\216RPC\351\200\232\344\277\241\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/02.IPC\344\270\216RPC\351\200\232\344\277\241\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..963026eeff3870bd1e6f211443b37efbb3cde1d0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/02.IPC\344\270\216RPC\351\200\232\344\277\241\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,146 @@ +--- +title: IPC与RPC通信开发指导 +permalink: /pages/00070301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# IPC与RPC通信开发指导 + +- [场景介绍](#场景介绍) +- [接口说明](#接口说明) +- [开发步骤](#开发步骤) + +## 场景介绍 + +IPC/RPC的主要工作是让运行在不同进程的Proxy和Stub互相通信,包括Proxy和Stub运行在不同设备的情况。 + + +## 接口说明 + +**表1** Native侧IPC接口 + +| 类/接口 | 方法 | 功能说明 | +| -------- | -------- | -------- | +| IRemoteBroker | sptr<IRemoteObject> AsObject() | 返回通信对象。派生类需要实现,Stub端返回RemoteObject对象本身,Proxy端返回代理对象。 | +| IRemoteStub | virtual int OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) | 请求处理方法,派生类需要重写,处理Proxy的请求并返回结果。 | +| IRemoteProxy | | 业务Proxy类派生自IRemoteProxy类。 | + + +## 开发步骤 + +**Native侧开发步骤** + +1. 定义IPC接口ITestAbility + SA接口继承IPC基类接口IRemoteBroker,接口里定义描述符、业务函数和消息码,其中业务函数在Proxy端和Stub端都需要实现。 + + ``` + class ITestAbility : public IRemoteBroker { + public: + // DECLARE_INTERFACE_DESCRIPTOR是必须的,入参需使用std::u16string; + DECLARE_INTERFACE_DESCRIPTOR(u"test.ITestAbility"); + int TRANS_ID_PING_ABILITY = 1; // 定义消息码 + virtual int TestPingAbility(const std::u16string &dummy) = 0; // 定义业务函数 + }; + ``` + +2. 定义和实现服务端TestAbilityStub + 该类是和IPC框架相关的实现,需要继承 IRemoteStub<ITestAbility>。Stub端作为接收请求的一端,需重写OnRemoteRequest方法用于接收客户端调用。 + + ``` + class TestAbilityStub : public IRemoteStub { + public: + virtual int OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override; + int TestPingAbility(const std::u16string &dummy) override; + }; + + int TestServiceStub::OnRemoteRequest(uint32_t code, + MessageParcel &data, MessageParcel &reply, MessageOption &option) + { + switch (code) { + case TRANS_ID_PING_ABILITY: { + std::u16string dummy = data.ReadString16(); + int result = TestPingAbility(dummy); + reply.WriteInt32(result); + return 0; + } + default: + return IPCObjectStub::OnRemoteRequest(code, data, reply, option); + } + } + ``` + +3. 定义服务端业务函数具体实现类TestAbility + ``` + class TestAbility : public TestAbilityStub { + public: + int TestPingAbility(const std::u16string &dummy); + } + + int TestAbility::TestPingAbility(const std::u16string &dummy) { + return 0; + } + ``` + +4. 定义和实现客户端 TestAbilityProxy + 该类是Proxy端实现,继承IRemoteProxy<ITestAbility>,调用SendRequest接口向Stub端发送请求,对外暴露服务端提供的能力。 + + ``` + class TestAbilityProxy : public IRemoteProxy { + public: + explicit TestAbilityProxy(const sptr &impl); + int TestPingService(const std::u16string &dummy) override; + private: + static inline BrokerDelegator delegator_; // 方便后续使用iface_cast宏 + } + + TestAbilityProxy::TestAbilityProxy(const sptr &impl) + : IRemoteProxy(impl) + { + } + + int TestAbilityProxy::TestPingService(const std::u16string &dummy){ + MessageOption option; + MessageParcel dataParcel, replyParcel; + dataParcel.WriteString16(dummy); + int error = Remote()->SendRequest(TRANS_ID_PING_ABILITY, dataParcel, replyParcel, option); + int result = (error == ERR_NONE) ? replyParcel.ReadInt32() : -1; + return result; + } + ``` + +5. SA 注册与启动 + SA 需要将自己的 TestAbilityStub实例通过 AddSystemAbility接口注册到 SystemAbilityManager,设备内与分布式的注册参数不同。 + + ``` + // 注册到本设备内 + auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + samgr->AddSystemAbility(said, new TestAbility()); + + // 在组网场景下,会被同步到其他设备上 + auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + ISystemAbilityManager::SAExtraProp saExtra; + saExtra.isDistributed = true; // 设置为分布式SA + int result = samgr->AddSystemAbility(said, new TestAbility(), saExtra); + ``` + +6. SA 获取与调用 + 通过SystemAbilityManager的GetSystemAbility方法可获取到对应SA的代理IRemoteObject,然后构造TestAbilityProxy即可。 + + ``` + // 获取本设备内注册的SA的proxy + sptr samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + sptr remoteObject = samgr->GetSystemAbility(said); + sptr testAbility = iface_cast(remoteObject); // 使用iface_cast宏转换成具体类型 + + // 获取其他设备注册的SA的Proxy + sptr samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + sptr remoteObject = samgr->GetSystemAbility(sdid, deviceId); // deviceId是指定设备的标识符 + sptr proxy(new TestAbilityProxy(remoteObject)); // 直接构造具体Proxy + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/03.\350\277\234\347\253\257\347\212\266\346\200\201\350\256\242\351\230\205\345\274\200\345\217\221\345\256\236\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/03.\350\277\234\347\253\257\347\212\266\346\200\201\350\256\242\351\230\205\345\274\200\345\217\221\345\256\236\344\276\213.md" similarity index 43% rename from "website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/03.\350\277\234\347\253\257\347\212\266\346\200\201\350\256\242\351\230\205\345\274\200\345\217\221\345\256\236\344\276\213.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/03.\350\277\234\347\253\257\347\212\266\346\200\201\350\256\242\351\230\205\345\274\200\345\217\221\345\256\236\344\276\213.md" index 2fcc3039c4f533462e652b03fa5c760fec443678..85503db624aac44a0479da6a13e50d12b89e0990 100644 --- "a/website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/03.\350\277\234\347\253\257\347\212\266\346\200\201\350\256\242\351\230\205\345\274\200\345\217\221\345\256\236\344\276\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/04.IPC\344\270\216RPC\351\200\232\344\277\241/03.\350\277\234\347\253\257\347\212\266\346\200\201\350\256\242\351\230\205\345\274\200\345\217\221\345\256\236\344\276\213.md" @@ -1,6 +1,6 @@ --- title: 远端状态订阅开发实例 -permalink: /pages/000c02 +permalink: /pages/00070302 navbar: true sidebar: true prev: true @@ -9,33 +9,39 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:35 --- -# 远端状态订阅开发实例 +# 远端状态订阅开发实例 + +IPC/RPC 提供对远端 Stub对象状态的订阅机制, 在远端 Stub对象死亡时,可触发死亡通知告诉本地 Proxy对象。这种状态通知订阅并不会自动附加在每个本地 Proxy对象上,需要调用特定接口完成,当不再需要订阅时也需要调用特定接口取消。使用这种订阅机制的用户,需要实现死亡通知接口DeathRecipient并实现onRemoteDied方法,清理资源,该方法会在 远端 Stub对象所在进程死亡,或所在设备离开组网时被回调。值得注意的是,调用这些接口有一定的顺序。首先,必然需要 Proxy订阅 Stub死亡通知,若在订阅期间未发生 Stub死亡,则可在不再需要时取消订阅;若在订阅期间发生 Stub死亡,则会自动触发 Proxy自定义的后续操作,也无需再手动取消订阅。 + + +RPC目前不提供匿名 Stub对象的死亡通知,即只有向 SAMgr注册过的服务才能被订阅死亡通知。 IPC则支持匿名对象的死亡通知。 -IPC/RPC提供对远端Stub对象状态的订阅机制, 在远端Stub对象死亡时,可触发死亡通知告诉本地Proxy对象。这种状态通知订阅并不会自动附加在每个本地Proxy对象上,需要调用特定接口完成,当不再需要订阅时也需要调用特定接口取消。使用这种订阅机制的用户,需要实现死亡通知接口DeathRecipient并实现onRemoteDied方法,清理资源,该方法会在远端Stub对象所在进程死亡,或所在设备离开组网时被回调。值得注意的是,调用这些接口有一定的顺序。首先,必然需要Proxy订阅Stub死亡通知,若在订阅期间未发生Stub死亡,则可在不再需要时取消订阅;若在订阅期间发生Stub死亡,则会自动触发Proxy自定义的后续操作,也无需再手动取消订阅。 -RPC目前不提供匿名Stub对象的死亡通知,即只有向SAMgr注册过的服务才能被订阅死亡通知。IPC则支持匿名对象的死亡通知。 **Native侧接口** + 依次为添加对远端Stub对象状态订阅的接口,取消订阅的接口,及感知到远端Stub对象死亡而进行本地操作的接口: + ``` bool AddDeathRecipient(const sptr &recipient); bool RemoveDeathRecipient(const sptr &recipient); void OnRemoteDied(const wptr &object); ``` + 参考代码 + ``` class TestDeathRecipient : public IRemoteObject::DeathRecipient { public: virtual void OnRemoteDied(const wptr& remoteObject); } -sptr deathRecipient (new TestDeathRecipient()); // 构造一个死亡通知对象 +sptr deathRecipient (new TestDeathRecipient());// 构造一个死亡通知对象 bool result = proxy->AddDeathRecipient(deathRecipient); // 注册死亡通知 result = proxy->RemoveDeathRecipient(deathRecipient); // 移除死亡通知 ``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271/01.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271/01.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271\346\246\202\350\277\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..557f09a78f4eb4cb129af79742567d037e1a3a3d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271/01.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271\346\246\202\350\277\260.md" @@ -0,0 +1,41 @@ +--- +title: 应用事件打点概述 +permalink: /pages/00070400 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 应用事件打点概述 + +HiAppEvent提供了应用事件打点接口,为应用提供事件打点的功能,用于帮助应用记录在运行过程中发生的故障信息、统计信息、安全信息、用户行为信息,以支撑开发者分析应用的运行情况。 + +## 基本概念 + +OpenHarmony系统HiAppEvent模块支持应用事件业务的开发,提供应用事件相关的功能,主要包括应用事件落盘、查询历史应用事件数据等功能。 + +- **打点** + + 记录由用户操作引起的变化,提供业务数据信息,以供开发、产品、运维分析。 + +## 事件校验结果码 + +| 错误码 | 原因 | 校验规则 | 处理结果 | +| ------ | --------------------------- | ------------------------------------------------------------ | ----------------------------------------------------- | +| 0 | 无 | 事件校验成功 | 事件正常打点。 | +| -1 | 无效的事件名称 | 非空且长度在48个字符以内(含)。
只由以下字符组成:0-9、a-z、_。
非数字以及下划线开头。 | 忽略该事件,不执行打点。 | +| -2 | 无效的事件基本参数类型 | 事件名称参数必须为string。
事件类型参数必须为number类型。
keyValues参数必须为object类型。 | 忽略该事件,不执行打点。 | +| -99 | 应用打点功能被关闭 | 应用打点功能被关闭。 | 忽略该事件,不执行打点。 | +| -100 | 未知错误 | 无。 | 忽略该事件,不执行打点。 | +| 1 | 无效的key参数名称 | 非空且长度在16个字符以内(含)。
只由以下字符组成:0-9、a-z、_。
非数字以及下划线开头。
非下划线结尾。 | 忽略该键值对参数后,继续执行打点。 | +| 2 | 无效的key参数类型 | Key参数必须为字符串类型。 | 忽略该键值对参数后,继续执行打点。 | +| 3 | 无效的value参数类型 | value参数只支持以下类型:
boolean、number、string、Array[基本类型]。
| 忽略该键值对参数后,继续执行打点。 | +| 4 | value参数值过长 | 参数值长度必须在8*1024个字符以内(含)。 | 忽略该键值对参数后,继续执行打点。 | +| 5 | key-value参数对数过多 | key-value参数对数必须在32对以内(含)。 | 忽略后面多余的键值对参数后,继续执行打点。 | +| 6 | List类型的value参数容量过大 | List类型的value参数容量必须在100个以内(含)。 | 对List进行截断(只保留前100个元素)后,继续执行打点。 | +| 7 | 无效的List类型value参数 | List的泛型类型只能为基本类型。
List内的参数必须为同一类型。 | 忽略该键值对参数后,继续执行打点。 | \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271/02.\345\272\224\347\224\250\344\272\213\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271/02.\345\272\224\347\224\250\344\272\213\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..e5df03f45fa11a88a1aed14eb63927c43f53a4bf --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/05.\345\272\224\347\224\250\344\272\213\344\273\266\346\211\223\347\202\271/02.\345\272\224\347\224\250\344\272\213\344\273\266\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -0,0 +1,130 @@ +--- +title: 应用事件开发指导 +permalink: /pages/00070401 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 应用事件开发指导 + +## 场景介绍 + +应用事件打点的主要工作是在应用运行过程中,帮助应用记录在运行过程中发生的各种信息。 + +## 接口说明 + +应用事件JS打点接口由hiAppEvent模块提供。 + +**打点接口功能介绍:** + +| 接口名 | 返回值 | 描述 | +| ------------------------------------------------------------ | -------------- | ---------------------------------------------------- | +| write(string eventName, EventType type, object keyValues, AsyncCallback\ callback): void | void | 应用事件异步打点方法,使用callback方式作为异步回调。 | +| write(string eventName, EventType type, object keyValues): Promise\ | Promise\ | 应用事件异步打点方法,使用promise方式作为异步回调。 | + +- 参数eventName:开发者自定义事件名称。事件名称在48个字符以内,有效的字符是0-9、a-z、下划线,只能以字母开头。 + +- 参数type:事件所属的类型,取值为枚举EventType,具体值如下表。 + + | 类型 | 描述 | + | --------- | -------------- | + | FAULT | 故障类型事件。 | + | STATISTIC | 统计类型事件。 | + | SECURITY | 安全类型事件。 | + | BEHAVIOR | 行为类型事件。 | + +- 参数keyValues:事件参数键值对,如果是变长参数类型,则依次输入事件的参数名与参数值。如果是Json对象类型,则Json对象的key是事件的参数名,value是事件的参数值。 + - 参数名只支持string类型,参数值只支持boolean、number、string、Array(数组参数值为基本类型)。 + - 事件的参数个数必须小于等于32。 + - 参数名在16个字符以内,有效的字符是0-9、a-z、下划线,只能以字母开头,不能以下划线结尾。 + - string类型参数值在8*1024个字符内。 + - Array类型参数值的元素个数必须在100个以内,超出时会进行截断处理。 +- 参数callback:回调函数,可以在回调函数中处理接口返回值。返回值为0表示事件参数校验成功,事件正常异步写入事件文件;大于0表示事件存在异常参数,事件在忽略异常参数后再异步写入事件文件;小于0表示事件校验失败,不执行事件异步打点操作。 + +当采用callback作为异步回调时,可以在callback中进行下一步处理。当采用Promise对象返回时,可以在Promise对象中类似地处理接口返回值。具体结果码说明见[事件校验结果码](/pages/00070400#事件校验结果码)。 + +**打点配置接口功能介绍:** + +| 接口名 | 返回值 | 描述 | +| ------------------------------ | ------- | ------------------------------------------------------------ | +| configure(ConfigOption config) | boolean | 应用事件打点配置方法,可以对打点功能进行自定义配置。返回true表示配置成功,false表示配置失败。 | + +- 参数config:应用事件打点配置项对象。应用打点配置选项ConfigOption如下表。 + + | 参数名 | 类型 | 必填 | 说明 | + | ---------- | ------- | ---- | ------------------------------------------------------------ | + | disable | boolean | 否 | 应用打点功能开关,例如配置值为true表示关闭打点功能。 | + | maxStorage | string | 否 | 打点落盘文件存放目录的配额大小,默认限额为“10M”,超出限额后会对存放目录进行清理。 | + + +**预定义事件名称常量接口Event:** +| 常量名 | 类型 | 描述 | +| ------------------------- | ------ | ------------------------ | +| USER_LOGIN | string | 用户登录事件名称。 | +| USER_LOGOUT | string | 用户登出事件名称。 | +| DISTRIBUTED_SERVICE_START | string | 分布式服务启动事件名称。 | + + +**预定义参数名称常量接口Param:** +| 常量名 | 类型 | 描述 | +| ------------------------------- | ------ | ------------------ | +| USER_ID | string | 用户自定义ID。 | +| DISTRIBUTED_SERVICE_NAME | string | 分布式服务名称。 | +| DISTRIBUTED_SERVICE_INSTANCE_ID | string | 分布式服务示例ID。 | + +## 开发步骤 + +在应用启动执行页面加载后,执行一个应用事件打点,用于记录应用的初始页面加载事件。 + +1. 新建一个JS应用工程,在“Project”窗口点击“entry > src > main > js > default > pages > index”,打开工程中的“index.js”文件,在页面执行加载后,执行一个应用事件打点,用于记录应用的初始页面加载事件,示例代码如下: + + ```js + import hiAppEvent from '@ohos.hiAppEvent' + + export default { + data: { + title: "" + }, + onInit() { + this.title = this.$t('strings.world'); + + // 1.callback方式 + hiAppEvent.write("start_event", hiAppEvent.EventType.BEHAVIOR, {"int_data":100, "str_data":"strValue"}, (err, value) => { + if (err) { + console.error(`failed to write event because ${err.code}`); + return; + } + console.log(`success to write event: ${value}`); + }); + + // 2.Promise方式 + hiAppEvent.write("start_event", hiAppEvent.EventType.BEHAVIOR, {"int_data":100, "str_data":"strValue"}) + .then((value) => { + console.log(`success to write event: ${value}`); + }).catch((err) => { + console.error(`failed to write event because ${err.code}`); + }); + }); + + // 3.配置应用打点开关 + hiAppEvent.configure({ + disable: true + }); + + // 4.配置事件文件目录限额(默认为10M) + hiAppEvent.configure({ + maxStorage: '100M' + }); + } + } + ``` + +2. 运行项目,点击应用界面上的运行按钮。 + + diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/01.\346\246\202\350\277\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..1129a86fc725dfdb3f853fbd3481b9aa01e2c4bd --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/01.\346\246\202\350\277\260.md" @@ -0,0 +1,61 @@ +--- +title: 概述 +permalink: /pages/00070500 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 概述 + +- [总体说明](#总体说明) +- [使用约束](#使用约束) +- [DevEco Studio演进路标](#deveco-studio演进路标) + +## 总体说明 + +DevEco Studio 是 HarmonyOS 的配套的开发 IDE ,因为HarmonyOS 是基于OpenHarmony 开发的,因此,使用 DevEco Studio (配套 HarmonyOS )也可以进行 OpenHarmony 的应用开发。 + +使用DevEco Studio开发OpenHarmony应用的流程与开发HarmonyOS的流程完全一样,本文档仅描述OpenHarmony应用开发与HarmonyOS应用开发的差异点。 + +- **搭建开发环境差异**:OpenHarmony应用开发环境需要先安装OpenHarmony SDK,具体可参考[配置OpenHarmony SDK](/pages/00070502)章节。 + +- **导入OpenHarmony工程**:OpenHarmony应用开发,只能通过导入Sample工程的方式来创建一个新工程,具体可参考[通过导入Sample方式创建新工程](/pages/0007050301)。 + +- **调试签名配置**:OpenHarmony应用运行在真机设备上,需要对应用进行签名,关于OpenHarmony应用的签名指导请参考[配置OpenHarmony应用签名信息](/pages/00070504)。 + +- **在真机设备上运行应用**:需要使用hdc工具将OpenHarmony的hap包推送到真机设备上进行安装,具体可参考[安装运行OpenHarmony应用](/pages/00070505)。 + +关于DevEco Studio的详细操作指导,请访问[HUAWEI DevEco Studio使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/tools_overview-0000001053582387)。 + + +## 使用约束 + +- OpenHarmony只支持使用JS语言开发应用,不支持Java、C/C++语言。 + +- OpenHarmony开发环境DevEco Studio暂只支持Windows系统。 + +OpenHarmony与HarmonyOS的开发工具都是DevEco Studio,下表为OpenHarmony相比HarmonyOS不支持的功能说明: + +| 特性名称 | HarmonyOS版本 | OpenHarmony版本 | +| -------- | -------- | -------- | +| 创建Module | **√** | **X** | +| 服务卡片 | **√** | **X** | +| 自动化签名 | **√** | **X** | +| 远程模拟器 | **√** | **X** | +| 本地模拟器 | **√** | **X** | +| 使用DevEco Studio运行调试、日志查看、调优 | **√** | **X** | +| 云测试 | **√** | **X** | +| 安全测试 | **√** | **X** | + + +## DevEco Studio演进路标 + +Huawei DevEco Studio分阶段支持OpenHarmony应用开发的演进路标如下: + +![zh-cn_image_0000001210018359](/images/application-dev/quick-start/figures/zh-cn_image_0000001210018359.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/02.\347\211\210\346\234\254\345\217\230\346\233\264\350\257\264\346\230\216.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/02.\347\211\210\346\234\254\345\217\230\346\233\264\350\257\264\346\230\216.md" new file mode 100644 index 0000000000000000000000000000000000000000..3308e1fb6e3f9f18b9ee683e21136ba0b4da20a1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/02.\347\211\210\346\234\254\345\217\230\346\233\264\350\257\264\346\230\216.md" @@ -0,0 +1,22 @@ +--- +title: 版本变更说明 +permalink: /pages/00070501 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 版本变更说明 + +- [V3.0 Beta1(2021-09-29)](#v3-0-beta1-2021-09-29-) + +## V3.0 Beta1(2021-09-29) + +| | +| -------- | +|  **新增特性:**
- 新增支持OpenHarmony SDK的管理,开发者可通过DevEco Studio的SDK Manager功能来下载和管理OpenHarmony SDK。
- 在编译构建HAP包时,新增支持对单个Module进行编译,对于多Module工程中只需要编译其中一个Module的场景,可以提升编译构建速度;同时还新增支持一键重构建HAP包,即在编译构建HAP前,会自动执行Clean Project操作。
 **增强特性:**
- 编译构建插件更新至3.0.3.2版本。
- Json编辑器增强,资源索引错误支持快速修复,并支持快速查看资源的取值。
- 工程视图支持Ohos视图,默认视图为Project视图,开发者可手动切换。
- OpenHarmony工程支持ark方舟编译。
- OpenHarmony工程类型标识字段supportSystem "standard",由模块级build.gradle调整至工程级build.gradle。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/03.\351\205\215\347\275\256OpenHarmonySDK.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/03.\351\205\215\347\275\256OpenHarmonySDK.md" new file mode 100644 index 0000000000000000000000000000000000000000..4db81efdd0163c7608bdf6143e6d79c26b042023 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/03.\351\205\215\347\275\256OpenHarmonySDK.md" @@ -0,0 +1,188 @@ +--- +title: 配置OpenHarmonySDK +permalink: /pages/00070502 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 配置OpenHarmony SDK + +- [前提条件](#前提条件) +- [配置SDK信息](#配置sdk信息) +- [参考信息](#参考信息) + - [配置DevEco Studio代理](#配置deveco-studio代理) + - [配置NPM代理](#配置npm代理) + - [设置Gradle代理](#设置gradle代理) + +在设置OpenHarmony应用开发环境时,需要开发者在DevEco Studio中配置对应的SDK信息。 + + +>![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:**
+>请注意,OpenHarmony SDK版本精简了部分工具链,因此不适用于HarmonyOS应用开发。 + + +## 前提条件 + +已下载并安装好DevEco Studio 3.0 Beta1及以上版本,点击[链接下载](https://developer.harmonyos.com/cn/develop/deveco-studio#download)。 + + +## 配置SDK信息 + +DevEco Studio通过SDK Manager统一管理SDK及工具链,OpenHarmony包含如下SDK包: + +| 类别 | 包名 | 说明 | +| -------- | -------- | -------- | +| SDK | JS | JS语言SDK包。 | +| SDK Tool | Toolchains | SDK工具链,OpenHarmony应用开发必备工具集,包括编译、打包、签名、数据库管理等工具的集合。 | +| | Previewer | OpenHarmony应用预览器,可以在应用开发过程中查看界面UI布局效果。 | + +1. 运行已安装的DevEco Studio,首次使用,请选择 **Do not import settings**,点击OK。 + +2. 进入配置向导页面,设置 **npm registry**,DevEco Studio已预置对应的仓,直接点击 **Start using DevEco Studio**进入下一步。 + > ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:**
+ > 如果配置向导界面出现的是设置 **Set up HTTP Proxy**界面,说明网络受限,请根据[参考信息](#参考信息)配置DevEco Studio代理、NPM代理和Gradle代理后,再下载OpenHarmony SDK。 + + + ![zh-cn_image_0000001163314102](/images/application-dev/quick-start/figures/zh-cn_image_0000001163314102.png) + +3. DevEco Studio向导指引开发者下载SDK,默认下载OpenHarmony SDK。SDK下载到user目录下,也可以指定对应的存储路径,SDK存储路径不支持中文字符,然后点击 **Next**。 + ![zh-cn_image_0000001208394019](/images/application-dev/quick-start/figures/zh-cn_image_0000001208394019.png) + + > ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:**
+ > 如果不是首次安装DevEco Studio,可能无法查看进入该界面,可通过欢迎页的 **Configure (** **或**![zh-cn_image_0000001208274069](/images/application-dev/quick-start/figures/zh-cn_image_0000001208274069.png) **图标** **)> Settings > SDK Manager > OpenHarmony SDK**界面,点击 **OpenHarmony SDK Location**加载SDK。 + +4. 在弹出的SDK下载信息页面,点击 **Next**,并在弹出的 **License Agreement**窗口,点击 **Accept**开始下载SDK。 + + + > ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:**
+ > 下载SDK过程中,如果出现下载JS SDK失败,提示“Install js dependencies failed”,请根据[JS SDK安装失败处理指导](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/faq-development-environment-0000001168829643#section1311117111474)进行处理。 + + + ![zh-cn_image_0000001163472654](/images/application-dev/quick-start/figures/zh-cn_image_0000001163472654.png) + +5. 等待OpenHarmony SDK及工具下载完成,点击 **Finish**,界面会进入到DevEco Studio欢迎页。 + ![zh-cn_image_0000001163632602](/images/application-dev/quick-start/figures/zh-cn_image_0000001163632602.png) + + +## 参考信息 + +DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用。 + +一般来说,如果使用的是个人或家庭网络,是不需要设置代理信息的;只有部分企业网络受限的情况下,才需要设置代理信息。 + +如果是第一次打开DevEco Studio,配置向导界面出现设置 **Set up HTTP Proxy**界面,说明网络受限,可以通过配置代理的方式来解决,需要配置DevEco Studio代理、NPM代理和Gradle代理。 + +![zh-cn_image_0000001166582138](/images/application-dev/quick-start/figures/zh-cn_image_0000001166582138.png) + + +### 配置DevEco Studio代理 + +1. 启动DevEco Studio,配置向导进入 **Set up HTTP Proxy**界面,勾选 **Manual proxy configuration**,设置DevEco Studio的HTTP Proxy。 + > ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:**
+ > 如果非首次设置向导进入HTTP Proxy,可以通过如下方式进入HTTP Proxy配置界面: + > + > - 在欢迎页点击 **Configure(或**![zh-cn_image_0000001212142015](/images/application-dev/quick-start/figures/zh-cn_image_0000001212142015.png) **图标) > Settings > Appearance & Behavior > System Settings > HTTP Proxy**进入HTTP Proxy设置界面(Mac系统为 **Configure > Preferences > Appearance & Behavior > System Settings > HTTP Proxy**)。 + > + > - 在打开了工程的情况下,可以点击 **File > Settings > Appearance & Behavior > System Settings > HTTP Proxy**进入HTTP Proxy设置界面(Mac系统为 **DevEco Studio > Preferences > Appearance & Behavior > System Settings > HTTP Proxy**) + + - **HTTP**配置项,设置代理服务器信息。 **如果不清楚代理服务器信息,可以咨询你们的网络管理人员**。 + - **Host name**:代理服务器主机名或IP地址。 + - **Port number**:代理服务器对应的端口号。 + - **No proxy for**:不需要通过代理服务器访问的URL或者IP地址(地址之间用英文逗号分隔)。 + - **Proxy authentication**配置项,如果代理服务器需要通过认证鉴权才能访问,则需要设置。否则,请跳过该配置项。 + - **Login**:访问代理服务器的用户名。 + - **Password**:访问代理服务器的密码。 + - **Remember**:勾选,记住密码。 + ![zh-cn_image_0000001212062065](/images/application-dev/quick-start/figures/zh-cn_image_0000001212062065.png) + +2. 配置完成后,点击 **Check connection**,输入网络地址(如:https://developer.harmonyos.com),检查网络连通性。提示Connection successful表示代理设置成功。 + +3. 点击 **Next: Configure npm**继续设置NPM代理信息,请参考[配置NPM代理](#配置npm代理)。 + + +### 配置NPM代理 + +通过DevEco Studio的设置向导设置NPM代理信息,代理信息将写入用户“users/用户名/”目录下的 **.npmrc**文件。 +> ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:**
+> 该向导只有第一次安装DevEco Studio才会出现。如果未出现该向导,可以直接在“users/用户名/”目录下的 **.npmrc**文件中,添加代理配置信息。 + +- npm registry:设置npm仓的地址信息,建议勾选。 + +- HTTP proxy:代理服务器信息,默认会与DevEco Studio的HTTP proxy设置项保持一致。 + +- Enable Https Proxy:同步设置HTTPS Proxy配置信息,建议勾选。 + +![zh-cn_image_0000001164577336](/images/application-dev/quick-start/figures/zh-cn_image_0000001164577336.png) + +然后点击 **Start using DevEco Studio**继续下一步操作。 + +如果代理服务器需要认证(需要用户名和密码),请先根据如下指导配置代理服务器的用户名和密码信息,然后再下载OpenHarmony SDK;否则,请跳过该操作,参考[配置SDK信息](#配置sdk信息)进行操作即可。 + +![zh-cn_image_0000001209817299](/images/application-dev/quick-start/figures/zh-cn_image_0000001209817299.png) + +1. 进入用户的users目录,打开 **.npmrc**文件。 + +2. 修改npm代理信息,在proxy和https-proxy中,增加user和password字段,具体取值请以实际代理信息为准。示例如下所示: + ``` + proxy=http://user:password@proxy.server.com:80 + https-proxy=http://user:password@proxy.server.com:80 + ``` + + > ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:**
+ > 如果password中存在特殊字符,如\@、\#、\*等符号,可能导致配置不生效,建议将特殊字符替换为ASCII码,并在ASCII码前加百分号%。常用符号替换为ASCII码对照表如下: + > + > - !:%21 + > + > - \@:%40 + > + > - \#:%23 + > + > - ¥:%24 + > + > - &:%26 + > + > - \*:%2A + +3. 代理设置完成后,打开命令行工具,执行如下命令进行验证网络是否正常。 + ``` + npm info express + ``` + + 执行结果如下图所示,则说明代理设置成功。 + + ![zh-cn_image_0000001164417356](/images/application-dev/quick-start/figures/zh-cn_image_0000001164417356.png) + +4. 网络设置完成后,然后再[配置SDK信息](#配置sdk信息)。 + + +### 设置Gradle代理 + +1. 打开“此电脑”,在文件夹地址栏中输入 **%userprofile%**(Mac系统请点击 **前往 > 个人**),进入个人用户文件夹。 + ![zh-cn_image_0000001166740700](/images/application-dev/quick-start/figures/zh-cn_image_0000001166740700.png) + +2. 创建一个文件夹,命名为 **.gradle**。如果已有.gradle文件夹,请跳过此操作。 + > ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:**
+ > macOS系统创建.gradle文件夹前,请将系统设置为“显示隐藏文件”。 + +3. 进入.gradle文件夹,新建一个文本文档,命名为 **gradle**,并修改后缀为 **.properties**。 + +4. 打开 **gradle.properties**文件中,添加如下脚本,然后保存。 + 其中代理服务器、端口、用户名、密码和不使用代理的域名,请根据实际代理情况进行修改。其中不使用代理的nonProxyHosts的配置间隔符是 “|”。 + ``` + systemProp.http.proxyHost=proxy.server.com + systemProp.http.proxyPort=8080 + systemProp.http.nonProxyHosts=*.company.com|10.*|100.* + systemProp.http.proxyUser=userId + systemProp.http.proxyPassword=password + systemProp.https.proxyHost=proxy.server.com + systemProp.https.proxyPort=8080 + systemProp.https.nonProxyHosts=*.company.com|10.*|100.* + systemProp.https.proxyUser=userId + systemProp.https.proxyPassword=password + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/01.\344\275\277\347\224\250\345\267\245\347\250\213\345\220\221\345\257\274\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/01.\344\275\277\347\224\250\345\267\245\347\250\213\345\220\221\345\257\274\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..d77fc09c00145d94b14c6b3506bb9feedd056de6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/01.\344\275\277\347\224\250\345\267\245\347\250\213\345\220\221\345\257\274\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" @@ -0,0 +1,58 @@ +--- +title: 使用工程向导创建新工程 +permalink: /pages/0007050300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 使用工程向导创建新工程 + +- [前提条件](#前提条件) +- [操作步骤](#操作步骤) + +通过工程向导创建一个OpenHarmony工程,该功能只有DevEco Studio 2.2 Beta1及以上版本支持。如果是DevEco Studio 2.1 Release版本,请根据[通过导入Sample方式创建新工程](/pages/0007050301)进行操作。 + + +## 前提条件 + +已安装OpenHarmony SDK,具体请参考[配置OpenHarmony SDK](/pages/00070502)。 + + +## 操作步骤 + +1. 通过如下两种方式,打开工程创建向导界面。 + - 如果当前未打开任何工程,可以在DevEco Studio的欢迎页,选择 **Create Project**开始创建一个新工程。 + - 如果已经打开了工程,可以在菜单栏选择 **File > New > New Project**来创建一个新工程。 + +2. 根据工程创建向导,选择 **[Standard]Empty Ability**模板,点击 **Next**。 + ![zh-cn_image_0000001162463400](/images/application-dev/quick-start/figures/zh-cn_image_0000001162463400.png) + +3. 点击 **Next**,进入到工程配置阶段,需要根据向导配置工程的基本信息。 + - **Project Name**:工程的名称,可以自定义。 + - **Project Type**:工程的类型,标识该工程是一个[原子化服务](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/atomic-service-definition-0000001090840664)(Service)或传统方式的需要安装的应用(Application)。 + > ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:**
+ > 如果是创建的原子化服务,则: + > + > - 原子化服务调试、运行时,在设备桌面上没有应用图标,请使用DevEco Studio的调试和运行功能,来启动原子化服务。 + > + > - 原子化服务是免安装的,config.json中自动添加 **installationFree**字段,取值为“true”。 + > + > - 如果entry模块的 **installationFree**字段为true,则其相关的所有hap模块的 **installationFree**字段都默认为true;如果entry模块的 **installationFree**字段为false,则其相关的所有hap模块可以配置为true或false。 + > + > - 编译构建App时,每个hap包大小不能超过10MB。 + - **Package Name**:软件包名称,默认情况下,应用ID也会使用该名称,应用发布时,应用ID需要唯一。 + - **Save Location**:工程文件本地存储路径。 + - **Compatible API Version**:兼容的SDK最低版本。 + > ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:**
+ > OpenHarmony工程如果配置了compileSdkVersion 7以上,对应模块默认使用方舟编译器进行编译,如果要修改编译方式为非方舟编译,在模块级build.gradle的 **ohos**闭包中添加 **arkEnable false**字段。 + - **Language**:支持的开发语言。 + - **Device Type**:该工程模板支持的设备类型。
+ ![zh-cn_image_0000001208210505](/images/application-dev/quick-start/figures/zh-cn_image_0000001208210505.png) + +4. 点击 **Finish**,工具会自动生成示例代码和相关资源,等待工程创建完成。 diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/02.\351\200\232\350\277\207\345\257\274\345\205\245Sample\346\226\271\345\274\217\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/02.\351\200\232\350\277\207\345\257\274\345\205\245Sample\346\226\271\345\274\217\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..71bc12a9cd543332f5e71a2ec062b4ebe6ea03ff --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/04.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213/02.\351\200\232\350\277\207\345\257\274\345\205\245Sample\346\226\271\345\274\217\345\210\233\345\273\272\346\226\260\345\267\245\347\250\213.md" @@ -0,0 +1,39 @@ +--- +title: 通过导入Sample方式创建新工程 +permalink: /pages/0007050301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:35 +--- +# 通过导入Sample方式创建新工程 + +> ![icon-note.gif](/images/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:** +> 该功能适用于通过DevEco Studio 2.1 Release及以上版本,创建OpenHarmony工程。 + + +OpenHarmony SDK配置完成后,便可以启动应用开发。针对OpenHarmony应用开发, **可以通过导入Sample工程的方式来创建一个新工程**。 + + +1. 在DevEco Studio的欢迎页,进入 **Configure (** **或**![zh-cn_image_0000001118018452](/images/application-dev/quick-start/figures/zh-cn_image_0000001118018452.png) **图标** **) > Settings > Version Control > Git**界面,点击Test按钮检测是否安装Git工具。 + - 已安装,请根据**步骤2**开始导入Sample。 + ![zh-cn_image_0000001118018088](/images/application-dev/quick-start/figures/zh-cn_image_0000001118018088.png) + - 未安装,请点击 **Download and Install**,DevEco Studio会自动下载并安装。安装完成后,请根据**步骤2**开始导入Sample。 + ![zh-cn_image_0000001164498191](/images/application-dev/quick-start/figures/zh-cn_image_0000001164498191.png) + +2. 在DevEco Studio的欢迎页,点击 **Import Sample**按钮,导入Sample工程。 + ![zh-cn_image_0000001208006117](/images/application-dev/quick-start/figures/zh-cn_image_0000001208006117.png) + +3. 选择OpenHarmony Samples > common下的 **JsHelloWorld**工程,然后点击 **Next**。 + ![zh-cn_image_0000001152459178](/images/application-dev/quick-start/figures/zh-cn_image_0000001152459178.png) + +4. 设置 **App Name**和 **Project Location**,然后点击 **Finish**,等待Sample工程导入完成。 + ![zh-cn_image_0000001207744539](/images/application-dev/quick-start/figures/zh-cn_image_0000001207744539.png) + +5. 等待工程同步完成,同步成功后,便可以进行OpenHarmony应用开发了。 + ![zh-cn_image_0000001163915523](/images/application-dev/quick-start/figures/zh-cn_image_0000001163915523.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/05.\351\205\215\347\275\256OpenHarmony\345\272\224\347\224\250\347\255\276\345\220\215\344\277\241\346\201\257.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/05.\351\205\215\347\275\256OpenHarmony\345\272\224\347\224\250\347\255\276\345\220\215\344\277\241\346\201\257.md" new file mode 100644 index 0000000000000000000000000000000000000000..9353c97be318086ec99b1337fc64a996ca605ac7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/05.\351\205\215\347\275\256OpenHarmony\345\272\224\347\224\250\347\255\276\345\220\215\344\277\241\346\201\257.md" @@ -0,0 +1,219 @@ +--- +title: 配置OpenHarmony应用签名信息 +permalink: /pages/00070504 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 配置OpenHarmony应用签名信息 + +- [生成密钥和证书请求文件](#生成密钥和证书请求文件) +- [生成应用证书文件](#生成应用证书文件) +- [生成应用Profile文件](#生成应用profile文件) +- [配置应用签名信息](#配置应用签名信息) + +使用真机设备运行和调试OpenHarmony应用前,需要对应用进行签名才能正常运行。该指导用于OpenHarmony应用的签名配置。除此章节以外,DevEco Studio的其余操作指导无差别,具体请访问[HUAWEI DevEco Studio使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/tools_overview-0000001053582387)。配置应用签名信息的流程如下图所示。 + + +![zh-cn_image_0000001113808114](/images/application-dev/quick-start/figures/zh-cn_image_0000001113808114.png) + + +## 生成密钥和证书请求文件 + +OpenHarmony应用通过数字证书(.cer文件)和Profile文件(.p7b文件)来保证应用的完整性,需要通过DevEco Studio来生成密钥文件(.p12文件)和证书请求文件(.csr文件)。同时,也可以使用命令行工具的方式来生成密钥文件和证书请求文件。 + +### 使用DevEco Studio生成密钥和证书请求文件 + +1. 在主菜单栏点击**Build > Generate Key** **and CSR**。 + + > ![](/images/application-dev/quick-start/public_sys-resources/icon-note.gif)**说明** + > + > 如果本地已有对应的密钥,无需新生成密钥,可以在**Generate Key**界面中点击下方的Skip跳过密钥生成过程,直接使用已有密钥生成证书请求文件。 + +2. 在**Key Store File**中,可以点击**Choose Existing**选择已有的密钥库文件(存储有密钥的.p12文件);如果没有密钥库文件,点击**New**进行创建。下面以新创建密钥库文件为例进行说明。 + + ![img](/images/application-dev/quick-start/figures/zh-cn_image_0000002021121901.png) + +3. 在**Create Key Store**窗口中,填写密钥库信息后,点击**OK**。 + + - **Key Store File**:选择密钥库文件存储路径。 + - **Password**:设置密钥库密码,必须由大写字母、小写字母、数字和特殊符号中的两种以上字符的组合,长度至少为8位。请记住该密码,后续签名配置需要使用。 + - **Confirm Password**:再次输入密钥库密码。 + + ![img](/images/application-dev/quick-start/figures/zh-cn_image_0000002021121902.png) + +4. 在**Generate Key**界面中,继续填写密钥信息后,点击**Next**。 + + - **Alias**:密钥的别名信息,用于标识密钥名称。请记住该别名,后续签名配置需要使用。 + - **Password**:密钥对应的密码,与密钥库密码保持一致,无需手动输入。 + - **Validity**:证书有效期,建议设置为25年及以上,覆盖应用的完整生命周期。 + - **Certificate**:输入证书基本信息,如组织、城市或地区、国家码等。 + + ![img](/images/application-dev/quick-start/figures/zh-cn_image_0000002021121903.png) + +5. 在**Generate CSR**界面,选择密钥和设置CSR文件存储路径。 + + ![img](/images/application-dev/quick-start/figures/zh-cn_image_0000002021121904.png) + +6. 点击**OK**按钮,创建CSR文件成功,可以在存储路径下获取生成的密钥库文件(.p12)和证书请求文件(.csr)。 + + ![img](/images/application-dev/quick-start/figures/zh-cn_image_0000002021121905.png) + +### 使用命令行工具生成证书请求文件 + +使用Open JDK携带的Keytool工具生成证书请求文件。 + +1. 使用管理员身份运行命令行工具。 + + ![img](/images/application-dev/quick-start/figures/zh-cn_image_0000002021121906.png) + +2. 切换到keytool工具所在路径,实际路径请根据DevEco Studio安装目录进行修改。 + + ![img](/images/application-dev/quick-start/figures/zh-cn_image_0000002021121907.png) + + +3. 执行如下命令,生成公私钥文件。例如,生成的密钥库名称为ide_demo_app.p12,以存储到D盘根目录下为例 + + ``` + keytool -genkeypair -alias "ide_demo_app" -keyalg EC -sigalg SHA256withECDSA -dname "C=CN,O=HUAWEI,OU=HUAWEI IDE,CN=ide_demo_app" -keystore d:\\idedemokey.p12 -storetype pkcs12 -validity 9125 -storepass 123456Abc -keypass 123456Abc + ``` + + 生成公私钥文件的参数说明如下: + + > ![](/images/application-dev/quick-start/public_sys-resources/icon-note.gif)说明 + > + > 请记录下**alias、storepass和keypass**的值,在后续[配置签名信息](#配置应用签名信息)操作会使用到。 + + - **alias**:密钥的别名信息,用于标识密钥名称。 + + - **sigalg**:签名算法,固定为**SHA256withECDSA**。 + - **dname**:按照操作界面提示进行输入。 + - C:国家/地区代码,如CN。 + - O:组织名称,如HUAWEI。 + - OU:组织单位名称,如HUAWEI IDE。 + - CN:名字与姓氏,建议与别名一致。 + - **validity**:证书有效期,建议设置为9125(25年)。 + - **storepass**:设置密钥库密码,必须由大写字母、小写字母、数字和特殊符号中的两种以上字符的组合,长度至少为8位。请记住该密码,后续签名配置需要使用。 + - **keypass**:设置密钥的密码,请与**storepass**保持一致。 + +4. 执行如下命令,执行后需要输入**storepass**密码,生成证书请求文件,后缀格式为.csr。 + + ``` + keytool -certreq -alias "ide_demo_app" -keystore d:\\idedemokey.p12 -storetype pkcs12 -file d:\\idedemokey.csr + ``` + + 生成证书请求文件的参数说明如下: + + - **alias**:与[3](#label001)中输入的alias保持一致。 + - **file**:生成的证书请求文件名称,后缀为.csr。 + + +## 生成应用证书文件 + +使用[生成密钥和证书请求文件](#生成密钥和证书请求文件)中生成的证书请求文件,来生成应用签名所需的数字证书文件。生成方法如下: + +进入DevEco Studio安装目录的 **Sdk\toolchains\lib**文件夹下(该SDK目录只能是OpenHarmony SDK,配置方法可参考[配置OpenHarmony SDK](/pages/00070502)),打开命令行工具,执行如下命令(如果keytool命令不能执行,请在系统环境变量中添加JDK的环境变量)。其中,只需要修改输入和输出即可快速生成证书文件,即修改 **-infile**指定证书请求文件csr文件路径, **-outfile**指定输出证书文件名及路径。 + +``` +keytool -gencert -alias "OpenHarmony Application CA" -infile myApplication_ohos.csr -outfile myApplication_ohos.cer -keystore OpenHarmony.p12 -sigalg SHA384withECDSA -storepass 123456 -ext KeyUsage:"critical=digitalSignature" -validity 3650 -rfc +``` + +关于该命令的参数说明如下: + +- **alias**:用于签发证书的CA私钥别名,OpenHarmony社区CA私钥存于OpenHarmony.p12密钥库文件中,该参数不能修改。 + +- **infile**:证书请求(CSR)文件的路径。 + +- **outfile**:输出证书链文件名及路径。 + +- **keystore**:签发证书的CA密钥库路径,OpenHarmony密钥库文件名为OpenHarmony.p12,文件在OpenHarmony SDK中 **Sdk\toolchains\lib**路径下,该参数不能修改。请注意,该OpenHarmony.p12文件并不是[生成密钥和证书请求文件](#生成密钥和证书请求文件)中生成的.p12文件。 + +- **sigalg**:证书签名算法,该参数不能修改。 + +- **storepass**:密钥库密码,密码为123456,该参数不能修改。 + +- **ext**:证书扩展项,该参数不能修改。 + +- **validity**:证书有效期,自定义天数。 + +- **rfc**:输出文件格式指定,该参数不能修改。 + + +## 生成应用Profile文件 + +Profile文件包含OpenHarmony应用的包名、数字证书信息、描述应用允许申请的证书权限列表,以及允许应用调试的设备列表(如果应用类型为Release类型,则设备列表为空)等内容,每个应用包中均必须包含一个Profile文件。 + +进入 **Sdk\toolchains\lib**目录下,打开命令行工具,执行如下命令。 + +``` +java -jar provisionsigtool.jar sign --in UnsgnedReleasedProfileTemplate.json --out myApplication_ohos_Provision.p7b --keystore OpenHarmony.p12 --storepass 123456 --alias "OpenHarmony Application Profile Release" --sigAlg SHA256withECDSA --cert OpenHarmonyProfileRelease.pem --validity 365 --developer-id ohosdeveloper --bundle-name 包名 --permission 受限权限名(可选) --permission 受限权限名(可选) --distribution-certificate myApplication_ohos.cer +``` + +关于该命令的参数说明如下: + +- **provisionsigtool**:Profile文件生成工具,文件在OpenHarmony SDK的 **Sdk\toolchains\lib**路径下。 + +- **in**:Profile模板文件所在路径,文件在OpenHarmony SDK中 **Sdk\toolchains\lib**路径下,该参数不能修改。 + +- **out**:输出的Profile文件名和路径。 + +- **keystore**:签发证书的密钥库路径,OpenHarmony密钥库文件名为OpenHarmony.p12,文件在OpenHarmony SDK中 **Sdk\toolchains\lib**路径下,该参数不能修改。 + +- **storepass**:密钥库密码,密码为123456,该参数不能修改。 + +- **alias**:用于签名Profile私钥别名,OpenHarmony社区CA私钥存于OpenHarmony.p12密钥库文件中,该参数不能修改。 + +- **sigalg**:证书签名算法,该参数不能修改。 + +- **cert**:签名Profile的证书文件路径,文件在OpenHarmony SDK中 **Sdk\toolchains\lib**路径下,该参数不能修改。 + +- **validity**:证书有效期,自定义天数。 + +- **developer-id**:开发者标识符,自定义一个字符串。 + +- **bundle-name**:填写应用包名。 + +- **permission**:可选字段,如果不需要,则可以不用填写此字段;如果需要添加多个受限权限,则如示例所示重复输入。受限权限列表如下:ohos.permission.READ_CONTACTS、ohos.permission.WRITE_CONTACTS。 + +- **distribution-certificate**:[生成应用证书文件](#生成应用证书文件)中生成的证书文件。 + + +## 配置应用签名信息 + +在真机设备上调试前,需要使用到制作的私钥(.p12)文件、证书(.cer)文件和Profile(.p7b)文件对调试的模块进行签名。 + +打开 **File > Project Structure**,点击 **Project > Signing Configs > debug**窗口中,去除勾选“Automatically generate signing”,然后配置指定模块的调试签名信息。 + +- **Store File**:选择密钥库文件,文件后缀为.p12,该文件为[生成密钥和证书请求文件](#生成密钥和证书请求文件)中生成的.p12文件。 + +- **Store Password**:输入密钥库密码,该密码为[生成密钥和证书请求文件](#生成密钥和证书请求文件)中填写的密钥库密码保持一致。 + +- **Key Alias**:输入密钥的别名信息,与[生成密钥和证书请求文件](#生成密钥和证书请求文件)中填写的别名保持一致。 + +- **Key Password**:输入密钥的密码,与 **Store Password**保持一致。 + +- **Sign Alg**:签名算法,固定为SHA256withECDSA。 + +- **Profile File**:选择[生成应用Profile文件](#生成应用profile文件)中生成的Profile文件,文件后缀为.p7b。 + +- **Certpath File**:选择[生成应用证书文件](#生成应用证书文件)中生成的数字证书文件,文件后缀为.cer。 + +![zh-cn_image_0000001155643492](/images/application-dev/quick-start/figures/zh-cn_image_0000001155643492.png) + +设置完签名信息后,点击 **OK**进行保存,然后可以在工程下的build.gradle中查看签名的配置信息。 + +![zh-cn_image_0000001202722349](/images/application-dev/quick-start/figures/zh-cn_image_0000001202722349.png) + +默认情况下,DevEco Studio编译hap包的类型为debug类型,如果需要编译release类型的hap包,请打开工程左下角的OhosBuild Variants,设置模块的编译构建类型为release。关于编译构建hap的详细说明请参考[HUAWEI DevEco Studio使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/build_hap-0000001053342418)。 + +![zh-cn_image_0000001115066116](/images/application-dev/quick-start/figures/zh-cn_image_0000001115066116.png) + +编译完成后,OpenHarmony应用的Hap包可以从工程的bulid目录下获取。 + +![zh-cn_image_0000001163918627](/images/application-dev/quick-start/figures/zh-cn_image_0000001163918627.png) \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/05.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/06.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" similarity index 48% rename from "website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/05.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" rename to "website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/06.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" index b56c4ab39efbd723621f67bbec7534188c66e539..6e0608394ad5ba8b50800f5d31e38d5e609dd932 100644 --- "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/05.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" +++ "b/website/docs/01.\346\226\207\346\241\243/08.\345\272\224\347\224\250\345\274\200\345\217\221/06.DevEcoStudio\357\274\210OpenHarmony\357\274\211\344\275\277\347\224\250\346\214\207\345\215\227/06.\345\256\211\350\243\205\350\277\220\350\241\214OpenHarmony\345\272\224\347\224\250.md" @@ -1,6 +1,6 @@ --- title: 安装运行OpenHarmony应用 -permalink: /pages/00090004 +permalink: /pages/00070505 navbar: true sidebar: true prev: true @@ -9,46 +9,46 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:36 --- -# 安装运行OpenHarmony应用 +# 安装运行OpenHarmony应用 安装OpenHarmony应用需要使用hdc工具,通过手动执行命令行完成应用的安装。 -hdc工具本身需要手动从开源仓中获取。然后使用工具将编译后的hap包发送至设备侧,然后通过hdc命令完成app的安装。 -相关命令如下: +hdc工具本身需要手动从开源仓中获取。然后使用工具将编译后的hap包发送至设备侧,然后通过hdc命令完成app的安装。 -- 文件发送命令 - **file send _localpath remotepath_** +相关命令如下: - 命令示例: - ``` - hdc_std file send E:\hwadmin.hap /data/local/tmp/hwadmin.hap - ``` +- 文件发送命令 + **file send *localpath remotepath*** -- 安装命令 + 命令示例: - **install \[-r/-d/-g\] _package_** + ``` + hdc_std file send E:\hwadmin.hap /data/local/tmp/hwadmin.hap + ``` - 命令示例: +- 安装命令 + **install [-r/-d/-g] *package*** - ``` - hdc_std install hwadmin.hap - ``` + 命令示例: -- 日志抓取命令 + ``` + hdc_std install hwadmin.hap + ``` - **hilog** +- 日志抓取命令 + **hilog** - 命令示例: + 命令示例: - ``` - hdc_std hilog - ``` + ``` + hdc_std hilog + ``` -完整的hdc工具使用指导及命令格式请参见[hdc_std使用指导.md](/pages/00040e01)。 +完整的hdc工具使用指导及命令格式请参见[hdc_std使用指导](/pages/00080101)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/01.\346\265\213\350\257\225\347\224\250\344\276\213\345\274\200\345\217\221.md" "b/website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/01.\346\265\213\350\257\225\347\224\250\344\276\213\345\274\200\345\217\221.md" new file mode 100644 index 0000000000000000000000000000000000000000..bf05afe94a82d31604c8449f467e74ce59babbba --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/01.\346\265\213\350\257\225\347\224\250\344\276\213\345\274\200\345\217\221.md" @@ -0,0 +1,881 @@ +--- +title: 测试用例开发 +permalink: /pages/000800 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 测试子系统 +OpenHarmony为开发者提供了一套全面的自测试框架,开发者可根据测试需求开发相关测试用例,开发阶段提前发现缺陷,大幅提高代码质量。 + +本文从基础环境构建,用例开发,编译以及执行等方面介绍OpenHarmony测试框架如何运行和使用。 +## 基础环境构建 +测试框架依赖于python运行环境,在使用测试框架之前可参阅以下方式进行配置。 + - [环境配置](/pages/extra/bab7f0/) + - [源码获取](/pages/000102) + + +## 测试框架目录简介 +以下是测试框架的目录层级架构,在使用测试框架过程中可在相应目录查找对应组件。 +``` +test # 测试子系统 +├── developertest # 开发者测试组件 +│ ├── aw # 测试框架的静态库 +│ ├── config # 测试框架配置 +│ │ │ ... +│ │ └── user_config.xml # 用户使用配置 +│ ├── examples # 测试用例示例 +│ ├── src # 测试框架源码 +│ ├── third_party # 测试框架依赖第三方组件适配 +│ ├── reports # 测试结果报告 +│ ├── BUILD.gn # 测试框架编译入口 +│ ├── start.bat # 开发者测试入口(Windows) +│ └── start.sh # 开发者测试入口(Linux) +└── xdevice # 测试框架依赖组件 +``` +## 测试用例编写 +### 测试用例目录规划 +使用测试框架过程中,可根据以下层级关系规划测试用例目录。 +``` +subsystem # 子系统 +├── partA # 部件A +│ ├── moduleA # 模块A +│ │ ├── include +│ │ ├── src # 业务代码 +│ │ └── test # 测试目录 +│ │ ├── unittest # 单元测试 +│ │ │ ├── common # 公共用例 +│ │ │ │ ├── BUILD.gn # 测试用例编译配置 +│ │ │ │ └── testA_test.cpp # 单元测试用例源码 +│ │ │ ├── phone # 手机形态用例 +│ │ │ ├── ivi # 车机形态用例 +│ │ │ └── liteos-a # ipcamera使用liteos内核的用例 +│ │ ├── moduletest # 模块测试 +│ │ ... +│ │ +│ ├── moduleB # 模块B +│ ├── test +│ │ └── resource # 依赖资源 +│ │ ├── moduleA # 模块A +│ │ │ ├── ohos_test.xml # 资源配置文件 +│ │ ... └── 1.txt # 资源 +│ │ +│ ├── ohos_build # 编译入口配置 +│ ... +│ +... +``` +> **注意:** 测试用例根据不同设备形态差异分为通用用例和非通用用例,建议将通用用例存放在common目录下,非通用用例存放在相应设备形态目录下。 + +### 测试用例编写 +本测试框架支持多种语言用例编写,针对不同语言提供了不同的模板以供编写参考。 + +**C++参考示例** + +- 用例源文件命名规范 + + 测试用例源文件名称和测试套内容保持一致,文件命名采用全小写+下划线方式命名,以test结尾,具体格式为:[功能]_[子功能]_test,子功能支持向下细分。 +示例: + ``` + calculator_sub_test.cpp + ``` + +- 用例示例 + ``` + /* + * Copyright (c) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #include "calculator.h" + #include + + using namespace testing::ext; + + class CalculatorSubTest : public testing::Test { + public: + static void SetUpTestCase(void); + static void TearDownTestCase(void); + void SetUp(); + void TearDown(); + }; + + void CalculatorSubTest::SetUpTestCase(void) + { + // input testsuit setup step,setup invoked before all testcases + } + + void CalculatorSubTest::TearDownTestCase(void) + { + // input testsuit teardown step,teardown invoked after all testcases + } + + void CalculatorSubTest::SetUp(void) + { + // input testcase setup step,setup invoked before each testcases + } + + void CalculatorSubTest::TearDown(void) + { + // input testcase teardown step,teardown invoked after each testcases + } + + /** + * @tc.name: integer_sub_001 + * @tc.desc: Verify the sub function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ + HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1) + { + // step 1:调用函数获取结果 + int actual = Sub(4,0); + + // Step 2:使用断言比较预期与实际结果 + EXPECT_EQ(4, actual); + } + ``` + 详细内容介绍: + 1. 添加测试用例文件头注释信息 + ``` + /* + * Copyright (c) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + ``` + 2. 引用测试框架头文件和命名空间 + ``` + #include + + using namespace testing::ext; + ``` + 3. 添加被测试类的头文件 + ``` + #include "calculator.h" + ``` + 4. 定义测试套(测试类) + ``` + class CalculatorSubTest : public testing::Test { + public: + static void SetUpTestCase(void); + static void TearDownTestCase(void); + void SetUp(); + void TearDown(); + }; + + void CalculatorSubTest::SetUpTestCase(void) + { + // input testsuit setup step,setup invoked before all testcases + } + + void CalculatorSubTest::TearDownTestCase(void) + { + // input testsuit teardown step,teardown invoked after all testcases + } + + void CalculatorSubTest::SetUp(void) + { + // input testcase setup step,setup invoked before each testcases + } + + void CalculatorSubTest::TearDown(void) + { + // input testcase teardown step,teardown invoked after each testcases + } + ``` + > **注意:** 在定义测试套时,测试套名称应与编译目标保持一致,采用大驼峰风格。 + + 5. 测试用例实现,包含用例注释和逻辑实现 + ``` + /** + * @tc.name: integer_sub_001 + * @tc.desc: Verify the sub function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ + HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1) + { + //step 1:调用函数获取结果 + int actual = Sub(4,0); + + //Step 2:使用断言比较预期与实际结果 + EXPECT_EQ(4, actual); + } + ``` + 在编写用例时,我们提供了三种用例模板供您选择。 + + | 类型 | 描述 | + | ------------| ------------| + | HWTEST(A,B,C)| 用例执行不依赖Setup&Teardown时,可选取| + | HWTEST_F(A,B,C)| 用例执行(不含参数)依赖于Setup&Teardown时,可选取| + | HWTEST_P(A,B,C)| 用例执行(含参数)依赖于Set&Teardown时,可选取| + + 其中,参数A,B,C的含义如下: + - 参数A为测试套名。 + - 参数B为测试用例名,其命名必须遵循[功能点]_[编号]的格式,编号为3位数字,从001开始。 + - 参数C为测试用例等级,具体分为门禁level0 以及非门禁level1-level4共五个等级,其中非门禁level1-level4等级的具体选取规则为:测试用例功能越重要,level等级越低。 + + **注意:** + - 测试用例的预期结果必须有对应的断言。 + - 测试用例必须填写用例等级。 + - 测试体建议按照模板分步实现。 + - 用例描述信息按照标准格式@tc.xxx value书写,注释信息必须包含用例名称,用例描述,用例类型,需求编号四项。其中用例测试类型@tc.type参数的选取,可参考下表。 + + | 测试类型名称|类型编码| + | ------------|------------| + |功能测试 |FUNC| + |性能测试 |PERF| + |可靠性测试 |RELI| + |安全测试 |SECU| + |模糊测试 |FUZZ| + + +**JavaScript参考示例** + +- 用例源文件命名规范 + + 测试用例原文件名称采用大驼峰风格,以TEST结尾,具体格式为:[功能][子功能]TEST,子功能支持向下细分。 +示例: + ``` + AppInfoTest.js + ``` + +- 用例示例 + ``` + /* + * Copyright (C) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import app from '@system.app' + + import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + + describe("AppInfoTest", function () { + beforeAll(function() { + // input testsuit setup step,setup invoked before all testcases + console.info('beforeAll caled') + }) + + afterAll(function() { + // input testsuit teardown step,teardown invoked after all testcases + console.info('afterAll caled') + }) + + beforeEach(function() { + // input testcase setup step,setup invoked before each testcases + console.info('beforeEach caled') + }) + + afterEach(function() { + // input testcase teardown step,teardown invoked after each testcases + console.info('afterEach caled') + }) + + /* + * @tc.name:appInfoTest001 + * @tc.desc:verify app info is not null + * @tc.type: FUNC + * @tc.require: Issue Number + */ + it("appInfoTest001", 0, function () { + //step 1:调用函数获取结果 + var info = app.getInfo() + + //Step 2:使用断言比较预期与实际结果 + expect(info != null).assertEqual(true) + }) + }) + ``` + 详细内容介绍: + 1. 添加测试用例文件头注释信息 + ``` + /* + * Copyright (C) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + ``` + 2. 导入被测api和jsunit测试库 + ``` + import app from '@system.app' + + import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + ``` + 3. 定义测试套(测试类) + ``` + describe("AppInfoTest", function () { + beforeAll(function() { + // input testsuit setup step,setup invoked before all testcases + console.info('beforeAll caled') + }) + + afterAll(function() { + // input testsuit teardown step,teardown invoked after all testcases + console.info('afterAll caled') + }) + + beforeEach(function() { + // input testcase setup step,setup invoked before each testcases + console.info('beforeEach caled') + }) + + afterEach(function() { + // input testcase teardown step,teardown invoked after each testcases + console.info('afterEach caled') + }) + ``` + 4. 测试用例实现 + ``` + /* + * @tc.name:appInfoTest001 + * @tc.desc:verify app info is not null + * @tc.type: FUNC + * @tc.require: Issue Number + */ + it("appInfoTest001", 0, function () { + //step 1:调用函数获取结果 + var info = app.getInfo() + + //Step 2:使用断言比较预期与实际结果 + expect(info != null).assertEqual(true) + }) + ``` + +### 测试用例编译文件编写 +根据测试用例目录规划,当执行某一用例时,测试框架会根据编译文件逐层查找,最终找到所需用例进行编译。下面通过不同示例来讲解gn文件如何编写。 + +#### 测试用例编译配置文件 +针对不同语言,下面提供不同的编译模板以供参考。 + +- **C++用例编译配置示例** + ``` + # Copyright (c) 2021 XXXX Device Co., Ltd. + + import("//build/test.gni") + + module_output_path = "subsystem_examples/calculator" + + config("module_private_config") { + visibility = [ ":*" ] + + include_dirs = [ "../../../include" ] + } + + ohos_unittest("CalculatorSubTest") { + module_out_path = module_output_path + + sources = [ + "../../../include/calculator.h", + "../../../src/calculator.cpp", + ] + + sources += [ "calculator_sub_test.cpp" ] + + configs = [ ":module_private_config" ] + + deps = [ "//third_party/googletest:gtest_main" ] + } + + group("unittest") { + testonly = true + deps = [":CalculatorSubTest"] + } + ``` + 详细内容如下: + + 1. 添加文件头注释信息 + ``` + # Copyright (c) 2021 XXXX Device Co., Ltd. + ``` + 2. 导入编译模板文件 + ``` + import("//build/test.gni") + ``` + 3. 指定文件输出路径 + ``` + module_output_path = "subsystem_examples/calculator" + ``` + > **说明:** 此处输出路径为部件/模块名。 + + 4. 配置依赖包含目录 + + ``` + config("module_private_config") { + visibility = [ ":*" ] + + include_dirs = [ "../../../include" ] + } + ``` + > **说明:** 一般在此处对相关配置进行设置,在测试用例编译脚本中可直接引用。 + + 5. 指定测试用例编译目标输出的文件名称 + + ``` + ohos_unittest("CalculatorSubTest") { + } + ``` + 6. 编写具体的测试用例编译脚本(添加需要参与编译的源文件、配置和依赖) + ``` + ohos_unittest("CalculatorSubTest") { + module_out_path = module_output_path + sources = [ + "../../../include/calculator.h", + "../../../src/calculator.cpp", + "../../../test/calculator_sub_test.cpp" + ] + sources += [ "calculator_sub_test.cpp" ] + configs = [ ":module_private_config" ] + deps = [ "//third_party/googletest:gtest_main" ] + } + ``` + + > **说明:根据测试类型的不同,在具体编写过程中可选择不同的测试类型:** + > - ohos_unittest:单元测试 + > - ohos_moduletest:模块测试 + > - ohos_systemtest:系统测试 + > - ohos_performancetest:性能测试 + > - ohos_securitytest:安全测试 + > - ohos_reliabilitytest:可靠性测试 + > - ohos_distributedtest:分布式测试 + + 7. 对目标测试用例文件进行条件分组 + + ``` + group("unittest") { + testonly = true + deps = [":CalculatorSubTest"] + } + ``` + > **说明:** 进行条件分组的目的在于执行用例时可以选择性的执行某一种特定类型的用例。 + +- **JavaScript用例编译配置示例** + + ``` + # Copyright (C) 2021 XXXX Device Co., Ltd. + + import("//build/test.gni") + + module_output_path = "subsystem_examples/app_info" + + ohos_js_unittest("GetAppInfoJsTest") { + module_out_path = module_output_path + + hap_profile = "./config.json" + certificate_profile = "//test/developertest/signature/openharmony_sx.p7b" + } + + group("unittest") { + testonly = true + deps = [ ":GetAppInfoJsTest" ] + } + ``` + + 详细内容如下: + + 1. 添加文件头注释信息 + + ``` + # Copyright (C) 2021 XXXX Device Co., Ltd. + ``` + 2. 导入编译模板文件 + + ``` + import("//build/test.gni") + ``` + 3. 指定文件输出路径 + + ``` + module_output_path = "subsystem_examples/app_info" + ``` + > **说明:** 此处输出路径为部件/模块名。 + + 4. 指定测试用例编译目标输出的文件名称 + + ``` + ohos_js_unittest("GetAppInfoJsTest") { + } + ``` + > **说明:** + >- 使用模板ohos_js_unittest定义js测试套,注意与C++用例区分。 + >- js测试套编译输出文件为hap类型,hap名为此处定义的测试套名,测试套名称必须以JsTest结尾。 + + 5. 指定hap包配置文件config.json和签名文件,两个配置为必选项 + + ``` + ohos_js_unittest("GetAppInfoJsTest") { + module_out_path = module_output_path + + hap_profile = "./config.json" + certificate_profile = "//test/developertest/signature/openharmony_sx.p7b" + } + ``` + config.json为hap编译所需配置文件,需要开发者根据被测sdk版本配置“target”项,其余项可默认,具体如下所示: + + ``` + { + "app": { + "bundleName": "com.example.myapplication", + "vendor": "example", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 4, + "target": 5 // 根据被测sdk版本进行修改,此例为sdk5 + } + }, + "deviceConfig": {}, + "module": { + "package": "com.example.myapplication", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry" + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "name": "com.example.myapplication.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "MyApplication", + "type": "page", + "launchType": "standard" + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } + } + ``` + 6. 对目标测试用例文件进行条件分组 + ``` + group("unittest") { + testonly = true + deps = [ ":GetAppInfoJsTest" ] + } + ``` + > **说明:** 进行条件分组的目的在于执行用例时可以选择性的执行某一种特定类型的用例。 + +#### 编译入口配置文件ohos.build + +当完成用例编译配置文件编写后,需要进一步编写部件编译配置文件,以关联到具体的测试用例。 +``` +"partA": { + "module_list": [ + + ], + "inner_list": [ + + ], + "system_kits": [ + + ], + "test_list": [ + "//system/subsystem/partA/calculator/test:unittest" //配置模块calculator下的test + ] + } +``` +> **说明:** test_list中配置的是对应模块的测试用例。 + +### 测试用例资源配置 +测试依赖资源主要包括测试用例在执行过程中需要的图片文件,视频文件、第三方库等对外的文件资源。 + +依赖资源文件配置步骤如下: +1. 在部件的test目录下创建resource目录,在resource目录下创建对应的模块,在模块目录中存放该模块所需要的资源文件。 + +2. 在resource目录下对应的模块目录中创建一个ohos_test.xml文件,文件内容格式如下: + ``` + + + + + + + + ``` +3. 在测试用例的编译配置文件中定义resource_config_file进行指引,用来指定对应的资源文件ohos_test.xml。 + ``` + ohos_unittest("CalculatorSubTest") { + resource_config_file = "//system/subsystem/partA/test/resource/calculator/ohos_test.xml" + } + ``` + >**说明:** + >- target_name: 测试套的名称,定义在测试目录的BUILD.gn中。preparer: 表示该测试套执行前执行的动作。 + >- src="res": 表示测试资源位于test目录下的resource目录下,src="out":表示位于out/release/$(部件)目录下。 + +## 测试用例执行 +在执行测试用例之前,针对用例使用设备的不同,需要对相应配置进行修改,修改完成即可执行测试用例。 + +### user_config.xml配置 +``` + + + + false + + false + + true + + + + + + + + + + + + + cmd + 115200 + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + +``` +>**说明:** 在执行测试用例之前,若使用HDC连接设备,用例仅需配置设备IP和端口号即可,其余信息均默认不修改。 + +### Windows环境执行 +#### 测试用例编译 + +由于Windows环境下无法实现用例编译,因此执行用例前需要在Linux环境下进行用例编译,用例编译命令: +``` +./build.sh --product-name Hi3516DV300 --build-target make_test +``` +>说明: +>- product-name:指定编译产品名称,例如Hi3516DV300。 +>- build-target:指定所需要编译的用例,make_test表示指定全部用例,实际开发中可指定特定用例。 + +编译完成后,测试用例将自动保存在out/hi3516dv300/packages/phone/tests目录下。 + +#### 搭建执行环境 +1. 在Windows环境创建测试框架目录Test,并在此目录下创建testcase目录 + +2. 从Linux环境拷贝测试框架developertest和xdevice到创建的Test目录下,拷贝编译好的测试用例到testcase目录下 + >**说明:** 将测试框架及测试用例从Linux环境移植到Windows环境,以便后续执行。 + +3. 修改user_config.xml + ``` + + + false + + + + D:\Test\testcase\tests + + ``` + >**说明:** ``标签表示是否需要编译用例;``标签表示测试用例查找路径。 + +#### 执行用例 +1. 启动测试框架 + ``` + start.bat + ``` +2. 选择产品形态 + + 进入测试框架,系统会自动提示您选择产品形态,请根据实际的开发板进行选择。例如:Hi3516DV300。 + +3. 执行测试用例 + + 当选择完产品形态,可参考如下指令执行测试用例。 + ``` + run -t UT -ts CalculatorSubTest -tc interger_sub_00l + ``` + 执行命令参数说明: + ``` + -t [TESTTYPE]: 指定测试用例类型,有UT,MST,ST,PERF等。(必选参数) + -tp [TESTPART]: 指定部件,可独立使用。 + -tm [TESTMODULE]: 指定模块,不可独立使用,需结合-tp指定上级部件使用。 + -ts [TESTSUITE]: 指定测试套,可独立使用。 + -tc [TESTCASE]: 指定测试用例,不可独立使用,需结合-ts指定上级测试套使用。 + -h : 帮助命令。 + ``` +### Linux环境执行 +#### 远程端口映射 +为了在Linux远程服务器以及Linux虚拟机两种环境下执行测试用例,需要对端口进行远程映射,以实现与设备的数据通路连接。具体操作如下: +1. HDC Server指令: + ``` + hdc_std kill + hdc_std -m -s 0.0.0.0:8710 + ``` + >**说明:** IP和端口号为默认值。 + +2. HDC Client指令: + ``` + hdc_std -s xx.xx.xx.xx:8710 list targets + ``` + >**说明:** 此处IP填写设备侧IP地址。 + +#### 执行用例 +1. 启动测试框架 + ``` + ./start.sh + ``` +2. 选择产品形态 + + 进入测试框架,系统会自动提示您选择产品形态,请根据实际的开发板进行选择。例如:Hi3516DV300。 + +3. 执行测试用例 + + 测试框架在执行用例时会根据指令找到所需用例,自动实现用例编译,执行过程,完成自动化测试。 + ``` + run -t UT -ts CalculatorSubTest -tc interger_sub_00l + ``` + 执行命令参数说明: + ``` + -t [TESTTYPE]: 指定测试用例类型,有UT,MST,ST,PERF等。(必选参数) + -tp [TESTPART]: 指定部件,可独立使用。 + -tm [TESTMODULE]: 指定模块,不可独立使用,需结合-tp指定上级部件使用。 + -ts [TESTSUITE]: 指定测试套,可独立使用。 + -tc [TESTCASE]: 指定测试用例,不可独立使用,需结合-ts指定上级测试套使用。 + -h : 帮助命令。 + ``` + +## 测试报告日志 +当执行完测试指令,控制台会自动生成测试结果,若需要详细测试报告您可在相应的数据文档中进行查找。 + +### 测试结果 +测试结果输出根路径如下: +``` +test/developertest/reports/xxxx_xx_xx_xx_xx_xx +``` +>**说明:** 测试报告文件目录将自动生成。 + +该目录中包含以下几类结果: +| 类型 | 描述| +| ------------ | ------------ | +| result/ |测试用例格式化结果| +| log/plan_log_xxxx_xx_xx_xx_xx_xx.log | 测试用例日志 | +| summary_report.html | 测试报告汇总 | +| details_report.html | 测试报告详情 | + +### 测试框架日志 +``` +reports/platform_log_xxxx_xx_xx_xx_xx_xx.log +``` + +### 最新测试报告 +``` +reports/latest +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/15.\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276/01.bytrace\344\275\277\347\224\250\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/02.\350\260\203\346\265\213\345\267\245\345\205\267/01.bytrace\344\275\277\347\224\250\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/15.\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276/01.bytrace\344\275\277\347\224\250\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/02.\350\260\203\346\265\213\345\267\245\345\205\267/01.bytrace\344\275\277\347\224\250\346\214\207\345\257\274.md" index 0b9e4f086d3959a09d057fb600c61cb02b75ff6e..334cc14e8a86e0f66627e3bf3b180d42c5c32e62 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/15.\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276/01.bytrace\344\275\277\347\224\250\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/02.\350\260\203\346\265\213\345\267\245\345\205\267/01.bytrace\344\275\277\347\224\250\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: bytrace使用指导 -permalink: /pages/00040e00 +permalink: /pages/00080100 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:36 --- # bytrace使用指导 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/15.\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276/02.hdc_std\344\275\277\347\224\250\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/02.\350\260\203\346\265\213\345\267\245\345\205\267/02.hdc\\_std\344\275\277\347\224\250\346\214\207\345\257\274.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/15.\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276/02.hdc_std\344\275\277\347\224\250\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/02.\350\260\203\346\265\213\345\267\245\345\205\267/02.hdc\\_std\344\275\277\347\224\250\346\214\207\345\257\274.md" index e65d87b1af95bcdefaf24a00bcf6f484ca0140e8..d95de0a8cac14f5e1aa2433b79ea7f45610f1fa3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/15.\347\240\224\345\217\221\345\267\245\345\205\267\351\223\276/02.hdc_std\344\275\277\347\224\250\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/09.\350\260\203\346\265\213/02.\350\260\203\346\265\213\345\267\245\345\205\267/02.hdc\\_std\344\275\277\347\224\250\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- -title: hdc_std使用指导 -permalink: /pages/00040e01 +title: hdc\\_std使用指导 +permalink: /pages/00080101 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:36 --- # hdc\_std 使用指导 @@ -35,13 +35,13 @@ hdc\_std(OpenHarmony Device Connector)是OpenHarmony为开发人员提供的 **hdc\_std 工具获取方式:** -从开源仓developtools\_hdc\_standard中获取,具体位置在该开源仓的prebuilt目录,开源仓链接如下:https://gitee.com/openharmony/developtools\_hdc\_standard +通过OpenHarmony sdk获取,hdc_std在sdk的toolchains目录下。 **使用举例:** 下面以windows侧使用方式举例: -从prebuilt/windows侧获取可执行文件hdc\_std.exe,放到磁盘某个位置即可使用。 +获取windows的sdk,将hdc_std.exe放到磁盘某个位置即可使用。 ## 注意事项 @@ -118,7 +118,7 @@ hdc\_std list targets (获取设备信息) hdc\_std -t _key_ shell (-t后面添加的_key_ 需要替换为上面查询的设备信息) ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >一台开发机可支持多个设备连接,每个设备有其唯一的设备标识,如果通过网络与设备连接,其标识为tcp:port格式,如果通过usb连接则标识为设备sn号。该命令需要跟随具体操作命令。 ## 查询设备列表的命令 @@ -400,7 +400,7 @@ hdc\_std tmode usb hdc\_std tmode port 8710 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >执行完毕后,远端daemon将会退出并重启,默认启用TCP连接,如果不加上listen端口则listen随机端口。 ## 文件相关的命令 @@ -624,10 +624,17 @@ hdc\_std uninstall _package_ -使用方法: +抓取hilog日志: hdc\_std hilog +清理hilog缓存日志: + +hdc_std shell "hilog -r" + +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>更多hilog操作命令请参考[hilog组件使用说明](https://gitee.com/openharmony/hiviewdfx_hilog/blob/master/README_zh.md#%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)。 + **shell \[_command_\]** 远程执行命令或进入交互命令环境。 diff --git "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/16.XTS\350\256\244\350\257\201\347\224\250\344\276\213\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/10.XTS\350\256\244\350\257\201/01.XTS\350\256\244\350\257\201\347\224\250\344\276\213\345\274\200\345\217\221\346\214\207\345\257\274.md" similarity index 99% rename from "website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/16.XTS\350\256\244\350\257\201\347\224\250\344\276\213\345\274\200\345\217\221\346\214\207\345\257\274.md" rename to "website/docs/01.\346\226\207\346\241\243/10.XTS\350\256\244\350\257\201/01.XTS\350\256\244\350\257\201\347\224\250\344\276\213\345\274\200\345\217\221\346\214\207\345\257\274.md" index 61e64558b25d4d2fb5dc122c844fd48ef23fc261..d35848ca7528094af6ec5fa56f265d1e15e9eb5d 100644 --- "a/website/docs/01.\346\226\207\346\241\243/05.\350\256\276\345\244\207\345\274\200\345\217\221-\345\255\220\347\263\273\347\273\237/16.XTS\350\256\244\350\257\201\347\224\250\344\276\213\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/website/docs/01.\346\226\207\346\241\243/10.XTS\350\256\244\350\257\201/01.XTS\350\256\244\350\257\201\347\224\250\344\276\213\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -1,6 +1,6 @@ --- title: XTS认证用例开发指导 -permalink: /pages/00040f +permalink: /pages/000900 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:44 +date: 2021-12-30 18:31:36 --- # XTS认证用例开发指导 @@ -361,7 +361,7 @@ OpenHarmony支持如下几种系统类型: 随版本编译,debug版本编译时会同步编译acts测试套件 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >acts测试套件编译中间件为静态库,最终链接到版本镜像中 。 @@ -494,7 +494,7 @@ OpenHarmony支持如下几种系统类型: 随版本编译,debug版本编译时会同步编译acts测试套件 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >小型系统acts独立编译成可执行文件(bin格式), 在编译产物的suites\\acts目录下归档。 @@ -705,7 +705,7 @@ Windows工作台下安装python3.7及以上版本,确保工作台和测试设 run acts ``` - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001119924146.gif) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001119924146.gif) - 模块执行\(具体模块可以查看\\acts\\testcases\\\) @@ -713,7 +713,7 @@ Windows工作台下安装python3.7及以上版本,确保工作台和测试设 run –l ActsSamgrTest ``` - ![](/images/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001166643927.jpg) + ![](/images/device-dev/subsystems/figure/zh-cn_image_0000001166643927.jpg) 等待执行完成。 diff --git "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/01.\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/01.\346\246\202\350\277\260.md" deleted file mode 100644 index 53643efbd0c2365e5e4dab834e7ddb87d672e96e..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/01.\346\246\202\350\277\260.md" +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: 概述 -permalink: /pages/00090000 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 概述 - -- [总体说明](#section189422248491) -- [使用约束](#section65191625782) -- [DevEco Studio演进路标](#section187875207166) - -## 总体说明 - -DevEco Studio是HarmonyOS的配套的开发IDE,因为HarmonyOS是基于OpenHarmony开发的,因此,使用DevEco Studio(配套HarmonyOS)也可以进行OpenHarmony的应用开发。 - -使用DevEco Studio开发OpenHarmony应用的流程与开发HarmonyOS的流程完全一样,本文档仅描述OpenHarmony应用开发与HarmonyOS应用开发的差异点。 - -- **搭建开发环境差异**:OpenHarmony应用开发环境需要开发者手动配置SDK,具体可参考[配置OpenHarmony SDK](/pages/00090001)章节。 -- **导入OpenHarmony工程**:OpenHarmony应用开发,只能通过导入Sample工程的方式来创建一个新工程,具体可参考[导入OpenHarmony工程](/pages/extra/55a502/)。 -- **调试签名配置**:OpenHarmony应用运行在真机设备上,需要对应用进行签名,关于OpenHarmony应用的签名指导请参考[配置OpenHarmony应用签名信息](/pages/00090003)。 -- **在真机设备上运行应用**:需要使用hdc工具将OpenHarmony的hap包推送到真机设备上进行安装,具体可参考[安装运行OpenHarmony应用](/pages/00090004)。 - -关于DevEco Studio的详细操作指导,请访问[HUAWEI DevEco Studio使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/tools_overview-0000001053582387)。 - -## 使用约束 - -- OpenHarmony只支持使用JS语言开发应用,不支持Java、C/C++语言。 -- OpenHarmony开发环境DevEco Studio暂只支持Windows系统。 - -OpenHarmony与HarmonyOS的开发工具都是DevEco Studio,下表为OpenHarmony相比HarmonyOS不支持的功能说明: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

特性名称

-

HarmonyOS版本

-

OpenHarmony版本

-

创建Module

-

-

X

-

服务卡片

-

-

X

-

自动化签名

-

-

X

-

远程模拟器

-

-

X

-

本地模拟器

-

-

X

-

使用DevEco Studio运行调试、日志查看、调优

-

-

X

-

云测试

-

-

X

-

安全测试

-

-

X

-
- -## DevEco Studio演进路标 - -Huawei DevEco Studio分阶段支持OpenHarmony应用开发的演进路标如下: - -![](/images/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001163571565.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/02.\351\205\215\347\275\256OpenHarmony-SDK.md" "b/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/02.\351\205\215\347\275\256OpenHarmony-SDK.md" deleted file mode 100644 index 1bf6c6a527a46da63aae58a97779dc1af894563f..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/02.\351\205\215\347\275\256OpenHarmony-SDK.md" +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: 配置OpenHarmony-SDK -permalink: /pages/00090001 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 配置OpenHarmony SDK - -- [前提条件](#section164161442154812) -- [配置SDK信息](#section1265592425017) - -在设置OpenHarmony应用开发环境时,需要开发者在DevEco Studio中配置对应的SDK信息。 - ->![](/images/zh-cn/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:** ->请注意,OpenHarmony SDK版本是API Version 6 Canary1,并精简了部分工具链,因此不适用于HarmonyOS应用开发。 - -## 前提条件 - -- 已下载并安装好DevEco Studio 2.1 Release及以上版本,点击[链接下载](https://developer.harmonyos.com/cn/develop/deveco-studio#download)。 -- 已获取OpenHarmony SDK包并解压,点击[链接下载](https://mirror.iscas.ac.cn/OpenHarmony/sdk/OpenHarmony-SDK-2.0-Canary.7z)。 - -## 配置SDK信息 - -DevEco Studio通过SDK Manager统一管理SDK及工具链,OpenHarmony包含如下SDK包: - - - - - - - - - - - - - - - - - - - - - - -

类别

-

包名

-

说明

-

SDK

-

Java

-

Java语言SDK包。

-

JS

-

JS语言SDK包。

-

SDK Tool

-

Toolchains

-

SDK工具链,OpenHarmony应用开发必备工具集,包括编译、打包、签名、数据库管理等工具的集合。

-

Previewer

-

OpenHarmony应用预览器,可以在应用开发过程中查看界面UI布局效果。

-
- -1. 运行已安装的DevEco Studio,首次使用,请选择**Do not import settings**,点击OK。 -2. 接下来DevEco Studio会根据向导指示,进入到SDK下载界面,**HarmonyOS SDK Location**选择本地解压的SDK包路径,然后点击**Next**。 - - >![](/images/zh-cn/application-dev/quick-start/public_sys-resources/icon-note.gif) **说明:** - >如果不是首次安装DevEco Studio,可能无法查看进入该界面,可通过欢迎页的**Configure (或**![](/images/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001117475774.png)**图标)\> Settings \> Appearance & Behavior \> System Settings \> HarmonyOS SDK**界面,点击**HarmonyOS SDK Location**加载SDK。 - - ![](/images/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001117288684.png) - -3. SDK安装完成后,点击**Finish**,界面会进入到DevEco Studio欢迎页。 - - ![](/images/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001162781359.png) - -4. 进入**Sdk\\js\\2.2.0.0\\build-tools\\ace-loader**目录,然后在该目录下运行命令行工具,分别执行如下命令,直至安装完成。 - - ``` - npm cache clean -f - npm install - ``` - - ![](/images/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001163170097.png) - - diff --git "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/03.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/03.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213.md" deleted file mode 100644 index 4b7b0892d9196f73d7dec191a14c665afb05c6e0..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/03.\345\210\233\345\273\272OpenHarmony\345\267\245\347\250\213.md" +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: 创建OpenHarmony工程 -permalink: /pages/00090002 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 创建OpenHarmony工程 - -- **[创建新工程](/pages/extra/d4221e/)** - -- **[导入OpenHarmony工程](/pages/extra/55a502/)** - - diff --git "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/04.\351\205\215\347\275\256OpenHarmony\345\272\224\347\224\250\347\255\276\345\220\215\344\277\241\346\201\257.md" "b/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/04.\351\205\215\347\275\256OpenHarmony\345\272\224\347\224\250\347\255\276\345\220\215\344\277\241\346\201\257.md" deleted file mode 100644 index cffa9bc7d4665fcf401b9b1855b143697e066b19..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/01.DevEco\344\275\277\347\224\250\346\214\207\345\215\227/04.\351\205\215\347\275\256OpenHarmony\345\272\224\347\224\250\347\255\276\345\220\215\344\277\241\346\201\257.md" +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: 配置OpenHarmony应用签名信息 -permalink: /pages/00090003 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 配置OpenHarmony应用签名信息 - -- [生成密钥和证书请求文件](#section153146467405) -- [生成应用证书文件](#section136609429562) -- [生成应用Profile文件](#section2048641015325) -- [配置应用签名信息](#section10152423193310) - -使用真机设备运行和调试OpenHarmony应用前,需要对应用进行签名才能正常运行。该指导用于OpenHarmony应用的签名配置。除此章节以外,DevEco Studio的其余操作指导无差别,具体请访问[HUAWEI DevEco Studio使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/tools_overview-0000001053582387)。配置应用签名信息的流程如下图所示。 - -![](/images/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001113808114.png) - -## 生成密钥和证书请求文件 - -OpenHarmony应用通过数字证书(.cer文件)和Profile文件(.p7b文件)来保证应用的完整性,需要通过DevEco Studio来生成密钥文件(.p12文件)和证书请求文件(.csr文件)。同时,也可以使用命令行工具的方式来生成密钥文件和证书请求文件。具体操作请参考[生成密钥和证书请求文件](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/publish_app-0000001053223745#section9752152162813)。 - -## 生成应用证书文件 - -使用[生成密钥和证书请求文件](#section153146467405)中生成的证书请求文件,来生成应用签名所需的数字证书文件。生成方法如下: - -进入DevEco Studio安装目录的**Sdk\\toolchains\\lib**文件夹下(该SDK目录只能是OpenHarmony SDK,配置方法可参考[配置OpenHarmony SDK](/pages/00090001)),打开命令行工具,执行如下命令(如果keytool命令不能执行,请在系统环境变量中添加JDK的环境变量)。其中,只需要修改输入和输出即可快速生成证书文件,即修改**-infile**指定证书请求文件csr文件路径,**-outfile**指定输出证书文件名及路径。 - -``` -keytool -gencert -alias "OpenHarmony Application CA" -infile myApplication_debug.csr -outfile myApplication_debug.cer -keystore OpenHarmony.p12 -sigalg SHA384withECDSA -storepass 123456 -ext KeyUsage:"critical=digitalSignature" -validity 3650 -rfc -``` - -关于该命令的参数说明如下: - -- **alias**:用于签发证书的CA私钥别名,OpenHarmony社区CA私钥存于OpenHarmony.p12密钥库文件中,该参数不能修改。 -- **infile**:证书请求(CSR)文件的路径。 -- **outfile**:输出证书链文件名及路径。 -- **keystore**:签发证书的CA密钥库路径,OpenHarmony密钥库文件名为OpenHarmony.p12,文件在OpenHarmony SDK中**Sdk\\toolchains\\lib**路径下,该参数不能修改。请注意,该OpenHarmony.p12文件并不是[生成密钥和证书请求文件](#section153146467405)中生成的.p12文件。 -- **sigalg**:证书签名算法,该参数不能修改。 -- **storepass**:密钥库密码,密码为123456,该参数不能修改。 -- **ext**:证书扩展项,该参数不能修改。 -- **validity**:证书有效期,自定义天数。 -- **rfc**:输出文件格式指定,该参数不能修改。 - -## 生成应用Profile文件 - -Profile文件包含OpenHarmony应用的包名、数字证书信息、描述应用允许申请的证书权限列表,以及允许应用调试的设备列表(如果应用类型为Release类型,则设备列表为空)等内容,每个应用包中均必须包含一个Profile文件。 - -进入**Sdk\\toolchains\\lib**目录下,打开命令行工具,执行如下命令。 - -``` -java -jar provisionsigtool.jar sign --in UnsgnedReleasedProfileTemplate.json --out myApplication_debug_Provision.p7b --keystore OpenHarmony.p12 --storepass 123456 --alias "OpenHarmony Application Profile Release" --sigAlg SHA256withECDSA --cert OpenHarmonyProfileRelease.pem --validity 365 --developer-id ohosdeveloper --bundle-name 包名 --permission 受限权限名(可选) --permission 受限权限名(可选) --distribution-certificate IDE.cer -``` - -关于该命令的参数说明如下: - -- **provisionsigtool**:Profile文件生成工具,文件在OpenHarmony SDK的**Sdk\\toolchains\\lib**路径下。 -- **in**:Profile模板文件所在路径,文件在OpenHarmony SDK中**Sdk\\toolchains\\lib**路径下,该参数不能修改。 -- **out**:输出的Profile文件名和路径。 -- **keystore**:签发证书的密钥库路径,OpenHarmony密钥库文件名为OpenHarmony.p12,文件在OpenHarmony SDK中**Sdk\\toolchains\\lib**路径下,该参数不能修改。 -- **storepass**:密钥库密码,密码为123456,该参数不能修改。 -- **alias**:用于签名Profile私钥别名,OpenHarmony社区CA私钥存于OpenHarmony.p12密钥库文件中,该参数不能修改。 -- **sigalg**:证书签名算法,该参数不能修改。 -- **cert**:签名Profile的证书文件路径,文件在OpenHarmony SDK中**Sdk\\toolchains\\lib**路径下,该参数不能修改。 -- **validity**:证书有效期,自定义天数。 -- **developer-id**:开发者标识符,自定义一个字符串。 -- **bundle-name**:填写应用包名。 -- **permission**:可选字段,如果不需要,则可以省去此字段;如果需要添加多个受限权限,则如示例所示重复输入。受限权限列表如下:ohos.permission.READ\_CONTACTS、ohos.permission.WRITE\_CONTACTS。 -- **distribution-certificate**:[生成应用证书文件](#section136609429562)中生成的证书文件。 - -## 配置应用签名信息 - -在真机设备上调试前,需要使用到制作的私钥(.p12)文件、证书(.cer)文件和Profile(.p7b)文件对调试的模块进行签名。 - -打开**File \> Project Structure**,点击**Project \> Signing Configs \> debug**窗口中,去除勾选“Automatically generate signing”,然后配置指定模块的调试签名信息。 - -- **Store File**:选择密钥库文件,文件后缀为.p12,该文件为[生成密钥和证书请求文件](#section153146467405)中生成的.p12文件。 -- **Store Password**:输入密钥库密码,该密码为[生成密钥和证书请求文件](#section153146467405)中填写的密钥库密码保持一致。 -- **Key Alias**:输入密钥的别名信息,与[生成密钥和证书请求文件](#section153146467405)中填写的别名保持一致。 -- **Key Password**:输入密钥的密码,与**Store Password**保持一致。 -- **Sign Alg**:签名算法,固定为SHA256withECDSA。 -- **Profile File**:选择[生成应用Profile文件](#section2048641015325)中生产的Profile文件,文件后缀为.p7b。 -- **Certpath File**:选择[生成应用证书文件](#section136609429562)中生成的数字证书文件,文件后缀为.cer。 - -![](/images/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001117638220.png) - -设置完签名信息后,点击**OK**进行保存,然后可以在工程下的build.gradle中查看签名的配置信息。 - -![](/images/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001117638526.png) - -默认情况下,DevEco Studio编译hap包的类型为debug类型,如果需要编译release类型的hap包,请打开工程左下角的OhosBuild Variants,设置模块的编译构建类型为release。关于编译构建hap的详细说明请参考[HUAWEI DevEco Studio使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/build_hap-0000001053342418)。 - -![](/images/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001115066116.png) - -编译完成后,OpenHarmony应用的Hap包可以从工程的bulid目录下获取。 - -![](/images/zh-cn/application-dev/quick-start/figures/zh-cn_image_0000001163918627.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/03.\345\274\200\345\217\221\345\207\206\345\244\207.md" "b/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/03.\345\274\200\345\217\221\345\207\206\345\244\207.md" deleted file mode 100644 index e2aed254ab327e756526ee98459e6078527ccdc5..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/03.\345\274\200\345\217\221\345\207\206\345\244\207.md" +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: 开发准备 -permalink: /pages/000902 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 开发准备 - -- [任务说明](#section2073881513322) -- [开发准备](#section11843205017326) - -## 任务说明 - -本文档适用于OpenHarmony应用开发的初学者。通过构建一个简单的具有页面跳转功能的应用,熟悉OpenHarmony应用开发流程。 - -![](/images/zh-cn/application-dev/quick-start/figures/3.png) - -## 开发准备 - -1. 开始前请参考[配置OpenHarmony SDK](/pages/00090001),完成**DevEco Studio**的安装和开发环境配置。 -2. 开发环境配置完成后,请参考[创建和运行Hello World](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/hello_world-0000001054516888)创建工程,设备类型以“Phone“为例: - - 使用JS语言开发,模板选择“Empty Feature Ability\(JS\)“ - -3. 创建完成后在Phone模拟器中运行该工程。 - -完成上述操作后,请参考[使用JS语言开发](/pages/000903)继续下一步的学习。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/04.\344\275\277\347\224\250JS\350\257\255\350\250\200\345\274\200\345\217\221.md" "b/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/04.\344\275\277\347\224\250JS\350\257\255\350\250\200\345\274\200\345\217\221.md" deleted file mode 100644 index cd5c02fb887d985c1bfb4aded8e7c8f3371896b5..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/04.\344\275\277\347\224\250JS\350\257\255\350\250\200\345\274\200\345\217\221.md" +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: 使用JS语言开发 -permalink: /pages/000903 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 使用JS语言开发 - -- [编写第一个页面](#section17436202895811) -- [创建另一个页面](#section944219415598) -- [实现页面跳转](#section126857614017) - -## 编写第一个页面 - -1. 第一个页面内有一个文本和一个按钮,通过text和button组件来实现。 - - 在“Project“窗口,选择“entry \> src \> main \> js \> default \> pages.index“,打开“index.hml“文件,添加一个文本和一个按钮,示例代码如下: - - ``` - -
- - - Hello World - - - -
- ``` - -2. 打开“index.css“文件,设置文本和按钮的样式,示例代码如下: - - ``` - /* index.css */ - .container { - flex-direction: column; /* 设置容器内的项目纵向排列 */ - justify-content: center; /* 设置项目位于容器主轴的中心 */ - align-items: center; /* 项目在交叉轴居中 */ - } - /* 对class="text"的组件设置样式 */ - .text{ - font-size: 72px; - } - /* 对class="button"的组件设置样式 */ - .button { - width: 362px; - height: 80px; - background-color: #007dff; - font-size: 39px; - text-color: white; - margin-top: 20px; - } - ``` - -3. 使用真机或模拟器运行项目,效果如图所示: - - ![](/images/zh-cn/application-dev/quick-start/figures/1.png) - - -## 创建另一个页面 - -1. 在“Project“窗口,打开“entry \> src \> main \> js \> default“,右键点击“pages.index“文件夹,选择“New \> JS Page“,命名为“details“。 - - 创建完成后,可以看到变成了“pages“文件夹下的“index“和“details“文件夹。 - - ![](/images/zh-cn/application-dev/quick-start/figures/项目列表.png) - -2. 打开“details.hml“文件,添加一个文本,示例代码如下: - - ``` - -
- - Hi there - -
- ``` - -3. 打开“details.css“文件,设置文本的样式,示例代码如下: - - ``` - /* details.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - } - .text { - font-size: 70px; - text-align: center; - } - ``` - - -## 实现页面跳转 - -1. 打开第一个页面的“index.js“文件,导入router模块,页面路由router根据页面的uri来找到目标页面,从而实现跳转。示例代码如下: - - ``` - // index.js - import router from '@system.router'; - - export default { - launch() { - router.push ({ - uri:'pages/details/details', // 指定要跳转的页面 - }) - } - } - ``` - -2. 再次运行项目,效果如图所示: - - ![](/images/zh-cn/application-dev/quick-start/figures/2.png) - - diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\267\245\345\205\267/01.Docker\347\274\226\350\257\221\347\216\257\345\242\203.md" "b/website/docs/01.\346\226\207\346\241\243/11.\345\267\245\345\205\267/01.Docker\347\274\226\350\257\221\347\216\257\345\242\203.md" new file mode 100644 index 0000000000000000000000000000000000000000..c018b1b3f1d4a19210ec09a642cca7ee2aac5cc7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/11.\345\267\245\345\205\267/01.Docker\347\274\226\350\257\221\347\216\257\345\242\203.md" @@ -0,0 +1,318 @@ +--- +title: Docker编译环境 +permalink: /pages/000a00 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# Docker编译环境 + +- [Docker环境介绍](#section107932281315) +- [环境准备](#section7337134183512) +- [独立Docker环境](#section2858536103611) + - [搭建Docker环境-轻量系统类设备(参考内存≥128KB)和小型系统类设备(参考内存≥1MB)](#section319412277287) + - [编译源码-轻量系统类设备(参考内存≥128KB)和小型系统类设备(参考内存≥1MB)](#section631485163615) + - [搭建Docker环境-标准系统类设备(参考内存≥128MB)](#section13585262391) + - [编译源码-标准系统类设备(参考内存≥128MB)](#section193711513406) + +- [基于HPM的Docker环境](#section485713518337) + - [搭建Docker环境](#section3295842510) + - [获取及编译源码](#section69141039143518) + + +## Docker环境介绍 + +OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下: + +- 独立Docker环境:适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。 +- 基于HPM的Docker环境:适用于使用HPM工具进行发行版编译的场景。 + +**表 1** Docker镜像介绍 + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Docker环境

+

系统类型

+

运行平台

+

Docker镜像仓库

+

标签

+

独立 Docker环境

+

轻量和小型系统

+

Ubuntu/Windows

+

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

+

0.0.5

+

标准系统

+

Ubuntu

+

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

+

0.0.5

+

HPM Docker环境

+

轻量和小型系统

+

Ubuntu/Windows

+

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

+

0.0.3

+
+ + + +## 环境准备 + +在使用docker环境前需要先完成以下操作: + +1. 安装Docker,Docker安装请参考[官方指导](https://docs.docker.com/engine/install/)。 +2. 获取OpenHarmony源码,请参考[获取源码](/pages/000102)。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >HPM Docker环境无需单独获取源码。 + + +## 独立Docker环境 + +OpenHarmony的Docker镜像托管在[HuaweiCloud SWR](https://console.huaweicloud.com/swr/?region=cn-south-1#/app/warehouse/warehouseMangeDetail/goldensir/openharmony-docker/openharmony-docker?type=ownImage)上。开发者可以通过该镜像在很大程度上简化编译前的环境配置。下文将介绍具体使用步骤。 + +### 搭建Docker环境-轻量系统类设备(参考内存≥128KB)和小型系统类设备(参考内存≥1MB) + +**方式一:从HuaweiCloud SWR上直接获取Docker镜像进行构建:** + +1. 获取Docker镜像。 + + ``` + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5 + ``` + +2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 + + ubuntu下执行: + + ``` + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5 + ``` + + windows下执行(假设源码目录为D:\\OpenHarmony): + + ``` + docker run -it -v D:\OpenHarmony:/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5 + ``` + + +**方式二:通过Dockerfile 构建本地Docker镜像进行构建** + +1. 获取Dockerfile脚本文件,用来构建本地Docker镜像。 + + ``` + git clone https://gitee.com/openharmony/docs.git + ``` + +2. 进入Dockerfile代码目录路径执行Docker镜像构建命令。 + + ``` + cd docs/docker + ./build.sh + ``` + +3. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 + + ubuntu下执行: + + ``` + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5 + ``` + + windows下执行(假设源码目录为D:\\OpenHarmony): + + ``` + docker run -it -v D:\OpenHarmony:/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5 + ``` + + +### 编译源码-轻量系统类设备(参考内存≥128KB)和小型系统类设备(参考内存≥1MB) + +通过如下编译脚本启动轻量系统类设备(参考内存≥128KB)和小型系统类设备(参考内存≥1MB)的编译。下文以Hi3516平台为例说明具体编译步骤。 + +设置编译路径,选择当前路径。 + +``` +hb set + . +``` + +**图 1** 设置编译界面 +![](/images/device-dev/get-code/figure/设置编译界面.png "设置编译界面") + +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>当前开发板平台和编译界面的对应关系如下: +>- Hi3861:wifiiot\_hispark\_pegasus@hisilicon +>- Hi3516:ipcamera\_hispark\_taurus@hisilicon +>- Hi3518:ipcamera\_hispark\_aries@hisilicon + +1. 选择ipcamera\_hispark\_taurus@hisilicon并回车。 +2. 执行编译。 + + ``` + hb build -f + ``` + +3. 查看编译结果。 + + 编译结果文件生成在out/hispark\_taurus/ipcamera\_hispark\_taurus目录下。 + + +### 搭建Docker环境-标准系统类设备(参考内存≥128MB) + +**方式一:从HuaweiCloud SWR上直接获取Docker镜像进行构建:** + +1. 获取Docker镜像。 + + ``` + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.5 + ``` + +2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 + + ``` + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.5 + ``` + + +**方式二:通过Dockerfile 构建本地Docker镜像进行构建** + +1. 获取Dockerfile脚本文件,用来构建本地Docker镜像。 + + ``` + git clone https://gitee.com/openharmony/docs.git + ``` + +2. 进入Dockerfile代码目录路径执行Docker镜像构建命令。 + + ``` + cd docs/docker/standard + ./build.sh + ``` + +3. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 + + ``` + docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.5 + ``` + + +### 编译源码-标准系统类设备(参考内存≥128MB) + +通过如下编译脚本启动标准系统类设备(参考内存≥128MB)的编译。 + +``` +./build.sh --product-name {product_name} +``` + +\{product\_name\}为当前版本支持的平台。比如:Hi3516DV300等。 + +编译所生成的文件都归档在out/{device_name}/目录下,结果镜像输出在 out/{device_name}/packages/phone/images/ 目录下。 + + +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>退出Docker执行exit命令即可。 + +## 基于HPM的Docker环境 + +docker\_dist是一个[HPM](https://hpm.harmonyos.com/)系统中的模板组件,能够帮助用户快速初始化HPM工程,利用docker镜像来快速编译OpenHarmony发行版,在很大程度上简化了编译前的环境配置。开发者在配置好Ubuntu和[hpm-cli](/pages/0005000101)开发环境后,可以通过以下步骤来使用我们提供的Docker环境。 + +### 搭建Docker环境 + +1. 初始化安装模板。在任意工作目录中执行以下命令。 + + ``` + hpm init -t @ohos/docker_dist + ``` + +2. 修改publishAs。 + + 因为获取到的是模板类型的包,要把包的类型改为需要的类型。 在当前目录下打开bundle.json文件,把"publishAs"字段的值由"template"改为"distribution"。 + + +### 获取及编译源码 + +执行编译。自动安装docker只能在Ubuntu环境下执行,如果其他环境,需要用户自行安装docker,然后拉取镜像,执行编译。 + +- **自动安装docker(Ubuntu环境)** + + 以下命令可以帮助用户自动安装docker, 拉取镜像,并且在容器中开始运行对应解决方案的拉取和编译。 + + **方式一:** + + 命令后接参数指定解决方案,格式如下: + + ``` + hpm run docker solution={product} + ``` + + \{product\}为需编译的解决方案,如:@ohos/hispark\_taurus、@ohos/hispark\_aries、@ohos/hispark\_pegasus。 + + **方式二:** + + 设置环境变量来选择解决方案,再执行编译命令。 + + 1. 选择解决方案。 + + ``` + export solution={product} + ``` + + \{product\}为需编译的解决方案,如:@ohos/hispark\_taurus、@ohos/hispark\_aries、@ohos/hispark\_pegasus。 + + 2. 获取源码及执行编译。 + + ``` + hpm run docker + ``` + + 以上两种方式以@ohos/hispark\_taurus为例,执行成功结果如下: + + ``` + ...... + ohos ipcamera_hispark_taurus build success! + @ohos/hispark_taurus: distribution building completed. + ``` + + +- **自行安装docker(非Ubuntu环境)** + + 自行安装docker相关操作如下: + + ``` + # 拉取镜像 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.3# linux环境下的编译 + hpm run distWithDocker solution={product} + # windows下的编译,需要配置gitbash + hpm config set shellPath "gitbash路径" + hpm run distWithDocker solution={product} + ``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\267\245\345\205\267/02.IDE\351\233\206\346\210\220\345\274\200\345\217\221\347\216\257\345\242\203.md" "b/website/docs/01.\346\226\207\346\241\243/11.\345\267\245\345\205\267/02.IDE\351\233\206\346\210\220\345\274\200\345\217\221\347\216\257\345\242\203.md" new file mode 100644 index 0000000000000000000000000000000000000000..1c3caffb9b0aba6ff5189d8fe45090d3e3d204b0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/11.\345\267\245\345\205\267/02.IDE\351\233\206\346\210\220\345\274\200\345\217\221\347\216\257\345\242\203.md" @@ -0,0 +1,30 @@ +--- +title: IDE集成开发环境 +permalink: /pages/000a01 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# IDE + +- [获取设备开发工具(HUAWEI DevEco Device Tool)](#section2452141120244) +- [获取应用开发工具(HUAWEI DevEco Studio)](#section0904101019258) + +## 获取设备开发工具(HUAWEI DevEco Device Tool) + +HUAWEI DevEco Device Tool是OpenHarmony面向智能设备开发者提供的一站式集成开发环境,支持OpenHarmony的组件按需定制,支持代码编辑、编译、烧录、调试等功能,支持C/C++语言,以插件的形式部署在Visual Studio Code上。具体可参见[获取工具](https://device.harmonyos.com/cn/ide)和[工具使用指南](https://device.harmonyos.com/cn/docs/ide/user-guides/service_introduction-0000001050166905)**。** + +Huawei DevEco Device Tool支持 OpenHarmony设备开发的演进路标如下: + +![](/images/device-dev/get-code/figure/evolution-roadmap.png) + +## 获取应用开发工具(HUAWEI DevEco Studio) + +HUAWEI DevEco Studio(以下简称DevEco Studio)是面向华为终端全场景多设备的一站式集成开发环境(IDE),为开发者提供工程模板创建、开发、编译、调试、发布等E2E的OpenHarmony应用开发服务。通过使用DevEco Studio,开发者可以更高效的开发具备OpenHarmony分布式能力的应用,进而提升创新效率。具体可参见[获取工具](https://developer.harmonyos.com/cn/develop/deveco-studio)和[工具使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/tools_overview-0000001053582387)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/01.\347\273\204\344\273\266\344\273\213\347\273\215.md" "b/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/01.\347\273\204\344\273\266\344\273\213\347\273\215.md" deleted file mode 100644 index fd2c15cc20b1461847885c1c750724765370e508..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/02.\346\236\204\345\273\272\347\224\250\346\210\267\347\225\214\351\235\242/01.\347\273\204\344\273\266\344\273\213\347\273\215.md" +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: 组件介绍 -permalink: /pages/000a0100 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 组件介绍 - -- [组件分类](#section154381954142018) - -组件(Component)是构建页面的核心,每个组件通过对数据和方法的简单封装,实现独立的可视、可交互功能单元。组件之间相互独立,随取随用,也可以在需求相同的地方重复使用。 - -## 组件分类 - -根据组件的功能,可以分为以下四大类: - - - - - - - - - - - - - - - - -

组件类型

-

主要组件

-

基础组件

-

text、image、progress、rating、span、marquee、image-animator、divider、search、menu、chart

-

容器组件

-

div、list、list-item、stack、swiper、tabs、tab-bar、tab-content、list-item-group、refresh、dialog

-

画布组件

-

canvas

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md" deleted file mode 100644 index 948ddf6a00c08886f3ff078187039e6376d9c0c5..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/11.\345\272\224\347\224\250\345\274\200\345\217\221-UI/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md" +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: 自定义组件 -permalink: /pages/000a02 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 自定义组件 - -JS UI框架支持自定义组件,用户可根据业务需求将已有的组件进行扩展,增加自定义的私有属性和事件,封装成新的组件,方便在工程中多次调用,提高页面布局代码的可读性。具体的封装方法示例如下: - -- **构建自定义组件** - - ``` - -
- {{title}} - 点击这里查看隐藏文本 - hello world -
- ``` - - ``` - /* comp.css */ - .item { - width: 700px; - flex-direction: column; - height: 300px; - align-items: center; - margin-top: 100px; - } - .text-style { - width: 100%; - text-align: center; - font-weight: 500; - font-family: Courier; - font-size: 36px; - } - .title-style { - font-weight: 500; - font-family: Courier; - font-size: 50px; - color: #483d8b; - } - ``` - - ``` - // comp.js - export default { - props: { - title: { - default: 'title', - }, - showObject: {}, - }, - data() { - return { - showObj: this.showObject, - }; - }, - childClicked () { - this.$emit('eventType1', {text: '收到子组件参数'}); - this.showObj = !this.showObj; - }, - } - ``` - -- **引入自定义组件** - - ``` - - -
- 父组件:{{text}} - -
- ``` - - ``` - /* xxx.css */ - .container { - background-color: #f8f8ff; - flex: 1; - flex-direction: column; - align-content: center; - } - ``` - - ``` - // xxx.js - export default { - data: { - text: '开始', - isShow: false, - }, - textClicked (e) { - this.text = e.detail.text; - }, - } - ``` - - -本示例中父组件通过添加自定义属性向子组件传递了名称为title的参数,子组件在props中接收。同时子组件也通过事件绑定向上传递了参数text,接收时通过e.detail获取。要绑定子组件事件,父组件事件命名必须遵循事件绑定规则。自定义组件效果如下图所示: - -**图 1** 自定义组件的效果 -![](/images/zh-cn/application-dev/ui/figures/自定义组件的效果.png "自定义组件的效果") - diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/01.FeatureAbility\346\250\241\345\235\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/01.FeatureAbility\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..0d793d84acd822c9782f6e227d12648c343406e0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/01.FeatureAbility\346\250\241\345\235\227.md" @@ -0,0 +1,976 @@ +--- +title: FeatureAbility模块 +permalink: /pages/000b000000 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# FeatureAbility模块(JS端SDK接口) + +#### 支持设备 + +| API | 手机 | 平板 | 智慧屏 | 智能穿戴 | 轻量级智能穿戴 | 智慧视觉设备 | +| ------------------------------------------------------------ | ---- | ---- | ------ | -------- | -------------- | ------------ | +| FeatureAbility.startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.startAbility(parameter: StartAbilityParameter) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.acquireDataAbilityHelper(uri: string) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.startAbilityForResult(parameter: StartAbilityParameter, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.startAbilityForResult(parameter: StartAbilityParameter) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.terminateSelfWithResult(parameter: AbilityResult, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.terminateSelfWithResult(parameter: AbilityResult) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.hasWindowFocus(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.hasWindowFocus() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.getWant(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.getWant() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.getContext() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.terminateSelf(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.terminateSelf() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| FeatureAbility.continueAbility(options: ContinueAbilityOptions, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | + +#### 权限列表 + +ohos.permission.RUNNING_LOCK permission + +#### 使用限制 + +FeatureAbility模块的接口只能在Page类型的Ability调用 + +#### 导入模块 + +``` +import featureAbility from '@ohos.ability.featureAbility' +``` + +#### FeatureAbility.startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\) + +* 接口说明 + + 启动新的ability(callback形式) + +* startAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | --------------------- | ---- | ------------------- | +| parameter | 只读 | StartAbilityParameter | 是 | 表示被启动的Ability | +| callback | 只读 | AsyncCallback | 是 | 被指定的回调方法 | + +- StartAbilityParameter类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------------- | -------- | ------ | ---- | ---------------------------------- | +| want | 只读 | want | 是 | 表示需要包含有关目标启动能力的信息 | +| abilityStartSetting | 只读 | string | 否 | 指示启动能力中使用的特殊启动设置 | + +- want类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | ------ | ---- | -------------------------- | +| deviceId | 只读 | string | 否 | 设备id | +| bundleName | 只读 | string | 否 | 捆绑包名称 | +| abilityName | 只读 | string | 否 | ability 名字 | +| uri | 只读 | string | 否 | 请求中URI的描述 | +| type | 只读 | string | 否 | 此文件中类型的说明 | +| flags | 只读 | number | 否 | 此文件中标志的选项是必需的 | +| action | 只读 | string | 否 | 需求中对操作的描述 | +| parameters | 只读 | string | 否 | Want中WantParams对象的描述 | +| entities | 只读 | string | 否 | 对象中实体的描述 | + +* flags类型说明 + + | 名称 | 参数 | 描述 | + | ------------------------------------ | ---------- | ------------------------------------------------------------ | + | FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | + | FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | + | FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给源异能 | + | FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | + | FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否不属于OHOS | + | FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | + | FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | + | FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 将结果返回到源能力片 | + | FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | + | FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | + | FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示延续是可逆的。 | + | FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | + | FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,请使用后台模式安装指定的DI功能。 | + | FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Intent}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用 | + | FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | + | FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | + +* 返回值 + + void + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureAbility' +featureAbility.startAbility( + { + want: + { + action: "", + entities: [""], + type: "", + flags: FLAG_AUTH_READ_URI_PERMISSION, + deviceId: "", + bundleName: "com.example.startability", + abilityName: "com.example.startability.MainAbility", + uri: "" + }, + }, + ); +) +``` + + + +#### FeatureAbility.startAbility(parameter: StartAbilityParameter) + +* 接口说明 + + 启动新的ability(Promise形式) + +* startAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | --------------------- | ---- | ------------------- | +| parameter | 只读 | StartAbilityParameter | 是 | 表示被启动的Ability | + +- StartAbilityParameter类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------------- | -------- | ------ | ---- | ---------------------------------- | +| want | 只读 | want | 是 | 表示需要包含有关目标启动能力的信息 | +| abilityStartSetting | 只读 | string | 否 | 指示启动能力中使用的特殊启动设置 | + +- want类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | ------ | ---- | -------------------------- | +| deviceId | 只读 | string | 否 | 设备id | +| bundleName | 只读 | string | 否 | 捆绑包名称 | +| abilityName | 只读 | string | 否 | ability 名字 | +| uri | 只读 | string | 否 | 请求中URI的描述 | +| type | 只读 | string | 否 | 此文件中类型的说明 | +| flags | 只读 | number | 否 | 此文件中标志的选项是必需的 | +| action | 只读 | string | 否 | 需求中对操作的描述 | +| parameters | 只读 | string | 否 | Want中WantParams对象的描述 | +| entities | 只读 | string | 否 | 对象中实体的描述 | + +* flags类型说明 + + | 名称 | 参数 | 描述 | + | ------------------------------------ | ---------- | ------------------------------------------------------------ | + | FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | + | FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | + | FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给源异能 | + | FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | + | FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否不属于OHOS | + | FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | + | FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | + | FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 将结果返回到源能力片 | + | FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | + | FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | + | FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示延续是可逆的。 | + | FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | + | FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,请使用后台模式安装指定的DI功能。 | + | FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Intent}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用 | + | FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | + | FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | + +* 返回值 + + void + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureAbility' +featureAbility.startAbility( + { + want: + { + action: "action.system.home", + entities: ["entity.system.home"], + type: "MIMETYPE", + flags: FLAG_AUTH_READ_URI_PERMISSION, + deviceId: "", + bundleName: "com.example.startability", + abilityName: "com.example.startability.MainAbility", + uri: "" + }, + } + ).then((void) => { + console.info("==========================>startAbility=======================>"); +}); +``` + + + +#### FeatureAbility.acquireDataAbilityHelper(uri: string) + +* 接口说明 + + 获取dataAbilityHelper + +* 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---- | -------- | ------ | ---- | ---------------------- | + | uri | 只读 | string | 是 | 指示要打开的文件的路径 | + +* 返回值 + + 返回dataAbilityHelper + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureAbility' +featureAbility.acquireDataAbilityHelper( + "dataability:///com.exmaple.DataAbility" +) +``` + + + +#### FeatureAbility.startAbilityForResult(parameter: StartAbilityParameter, callback: AsyncCallback\) + +* 接口说明 + + 启动一个ability,并在该ability被销毁时返回执行结果(callback形式) + +* startAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | ---------------------- | ---- | ------------------- | +| parameter | 只读 | StartAbilityParameter | 是 | 表示被启动的Ability | +| callback | 只读 | AsyncCallback\ | 是 | 被指定的回调方法 | + +- StartAbilityParameter类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------------- | -------- | ------ | ---- | ---------------------------------- | +| want | 只读 | want | 是 | 表示需要包含有关目标启动能力的信息 | +| abilityStartSetting | 只读 | string | 否 | 指示启动能力中使用的特殊启动设置 | + +- want类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | ------ | ---- | -------------------------- | +| deviceId | 只读 | string | 否 | 设备id | +| bundleName | 只读 | string | 否 | 捆绑包名称 | +| abilityName | 只读 | string | 否 | ability 名字 | +| uri | 只读 | string | 否 | 请求中URI的描述 | +| type | 只读 | string | 否 | 此文件中类型的说明 | +| flags | 只读 | number | 否 | 此文件中标志的选项是必需的 | +| action | 只读 | string | 否 | 需求中对操作的描述 | +| parameters | 只读 | string | 否 | Want中WantParams对象的描述 | +| entities | 只读 | string | 否 | 对象中实体的描述 | + +* flags类型说明 + + | 名称 | 参数 | 描述 | + | ------------------------------------ | ---------- | ------------------------------------------------------------ | + | FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | + | FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | + | FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给源异能 | + | FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | + | FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否不属于OHOS | + | FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | + | FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | + | FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 将结果返回到源能力片 | + | FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | + | FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | + | FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示延续是可逆的。 | + | FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | + | FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,请使用后台模式安装指定的DI功能。 | + | FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Intent}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用 | + | FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | + | FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | + +* 返回值 + + 返回{@link AbilityResult} + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureability'; +featureAbility.startAbilityForResult( + { + want: + { + action: "action.system.home", + entities: ["entity.system.home"], + type: "MIMETYPE", + flags: FLAG_AUTH_READ_URI_PERMISSION, + deviceId: "", + bundleName: "com.example.featureabilitytest", + abilityName: "com.example.startabilityforresulttest1.MainAbility", + uri:"" + }, + }, +) +``` + + + +#### FeatureAbility.startAbilityForResult(parameter: StartAbilityParameter) + +* 接口说明 + + 启动一个ability,并在该ability被销毁时返回执行结果(Promise形式) + +* startAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | --------------------- | ---- | ------------------- | +| parameter | 只读 | StartAbilityParameter | 是 | 表示被启动的Ability | + +- StartAbilityParameter类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------------- | -------- | ------ | ---- | ---------------------------------- | +| want | 只读 | want | 是 | 表示需要包含有关目标启动能力的信息 | +| abilityStartSetting | 只读 | string | 否 | 指示启动能力中使用的特殊启动设置 | + +- want类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | ------ | ---- | -------------------------- | +| deviceId | 只读 | string | 否 | 设备id | +| bundleName | 只读 | string | 否 | 捆绑包名称 | +| abilityName | 只读 | string | 否 | ability 名字 | +| uri | 只读 | string | 否 | 请求中URI的描述 | +| type | 只读 | string | 否 | 此文件中类型的说明 | +| flags | 只读 | number | 否 | 此文件中标志的选项是必需的 | +| action | 只读 | string | 否 | 需求中对操作的描述 | +| parameters | 只读 | string | 否 | Want中WantParams对象的描述 | +| entities | 只读 | string | 否 | 对象中实体的描述 | + +* flags类型说明 + + | 名称 | 参数 | 描述 | + | ------------------------------------ | ---------- | ------------------------------------------------------------ | + | FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | + | FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | + | FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给源异能 | + | FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | + | FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否不属于OHOS | + | FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | + | FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | + | FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 将结果返回到源能力片 | + | FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | + | FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | + | FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示延续是可逆的。 | + | FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | + | FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,请使用后台模式安装指定的DI功能。 | + | FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Intent}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用 | + | FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | + | FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | + +* 返回值 + + 返回{@link AbilityResult} + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureability'; +featureAbility.startAbilityForResult( + { + want: + { + action: "action.system.home", + entities: ["entity.system.home"], + type: "MIMETYPE", + flags: FLAG_AUTH_READ_URI_PERMISSION, + deviceId: "", + bundleName: "com.example.featureabilitytest", + abilityName: "com.example.startabilityforresulttest2.MainAbility", + uri:"", + parameters: + { + mykey0: 1111, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "xxxxxxxxxxxxxxxxxxxxxx", + mykey4: [1, 15], + mykey5: [false, true, false], + mykey6: ["aaaaaa", "bbbbb", "ccccccccccc"], + mykey7: true, + }, + }, + requestCode: 2, + }, +).then((void) => { + console.info("==========================>startAbilityForResult=======================>"); +}); +``` + + + +#### FeatureAbility.terminateSelfWithResult(parameter: AbilityResult, callback: AsyncCallback\) + +* 接口说明 + + 设置此page ability将返回给调用者的结果代码和数据并破坏此page ability(callback形式) + + +* startAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | ------------- | ---- | ------------------- | +| parameter | 只读 | AbilityResult | 是 | 表示被启动的Ability | +| callback | 只读 | AsyncCallback | 是 | 被指定的回调方法 | + + +* AbilityResult类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ------ | ---- | ------------------------------------------------------------ | +| resultCode | 只读 | number | 是 | 指示销毁该能力后返回的结果代码。您可以定义结果代码来识别错误(暂不支持) | +| want | 只读 | Want | 否 | 指示销毁该能力后返回的数据。您可以定义返回的数据。此参数可以为null。 | + +- want类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | ------ | ---- | -------------------------- | +| deviceId | 只读 | string | 否 | 设备id | +| bundleName | 只读 | string | 否 | 捆绑包名称 | +| abilityName | 只读 | string | 否 | ability 名字 | +| uri | 只读 | string | 否 | 请求中URI的描述 | +| type | 只读 | string | 否 | 此文件中类型的说明 | +| flags | 只读 | number | 否 | 此文件中标志的选项是必需的 | +| action | 只读 | string | 否 | 需求中对操作的描述 | +| parameters | 只读 | string | 否 | Want中WantParams对象的描述 | +| entities | 只读 | string | 否 | 对象中实体的描述 | + +* flags类型说明 + + | 名称 | 参数 | 描述 | + | ------------------------------------ | ---------- | ------------------------------------------------------------ | + | FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | + | FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | + | FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给源异能 | + | FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | + | FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否不属于OHOS | + | FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | + | FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | + | FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 将结果返回到源能力片 | + | FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | + | FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | + | FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示延续是可逆的。 | + | FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | + | FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,请使用后台模式安装指定的DI功能。 | + | FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Intent}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用 | + | FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | + | FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | + +* 返回值 + + void + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureAbility' +featureAbility.terminateSelfWithResult( + { + resultCode: 1, + want: + { + action: "action.system.home", + entities: ["entity.system.home"], + type: "MIMETYPE", + flags: FLAG_AUTH_READ_URI_PERMISSION, + deviceId: "", + bundleName: "com.example.featureabilitytest", + abilityName: "com.example.finishwithresulttest1.MainAbility", + uri:"", + parameters: { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [1, 15], + mykey5: [false, true, false], + mykey6: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey7: true, + } + }, + }, +); +``` + + + +#### FeatureAbility.terminateSelfWithResult(parameter: AbilityResult) + +* 接口说明 + + 设置此page ability将返回给调用者的结果代码和数据并破坏此page ability(Promise形式) + +* startAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | ------------- | ---- | ------------------- | +| parameter | 只读 | AbilityResult | 是 | 表示被启动的Ability | + + +* AbilityResult类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ------ | ---- | ------------------------------------------------------------ | +| resultCode | 只读 | number | 是 | 指示销毁该能力后返回的结果代码。您可以定义结果代码来识别错误(暂不支持) | +| want | 只读 | Want | 否 | 指示销毁该能力后返回的数据。您可以定义返回的数据。此参数可以为null。 | + +- want类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | ------ | ---- | -------------------------- | +| deviceId | 只读 | string | 否 | 设备id | +| bundleName | 只读 | string | 否 | 捆绑包名称 | +| abilityName | 只读 | string | 否 | ability 名字 | +| uri | 只读 | string | 否 | 请求中URI的描述 | +| type | 只读 | string | 否 | 此文件中类型的说明 | +| flags | 只读 | number | 否 | 此文件中标志的选项是必需的 | +| action | 只读 | string | 否 | 需求中对操作的描述 | +| parameters | 只读 | string | 否 | Want中WantParams对象的描述 | +| entities | 只读 | string | 否 | 对象中实体的描述 | + +* flags类型说明 + + | 名称 | 参数 | 描述 | + | ------------------------------------ | ---------- | ------------------------------------------------------------ | + | FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | + | FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | + | FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给源异能 | + | FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | + | FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否不属于OHOS | + | FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | + | FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | + | FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 将结果返回到源能力片 | + | FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | + | FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | + | FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示延续是可逆的。 | + | FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | + | FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,请使用后台模式安装指定的DI功能。 | + | FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Intent}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用 | + | FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | + | FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | + +* 返回值 + + void + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureability'; +featureAbility.terminateSelfWithResult( + { + resultCode: 1, + want: + { + action: "action.system.home", + entities: ["entity.system.home"], + type: "MIMETYPE", + flags: FLAG_AUTH_READ_URI_PERMISSION, + deviceId: "", + bundleName: "com.example.featureabilitytest", + abilityName: "com.example.finishwithresulttest1.MainAbility", + uri:"", + parameters: { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [1, 15], + mykey5: [false, true, false], + mykey6: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey7: true, + } + }, + } +).then((void) => { + console.info("==========================>terminateSelfWithResult=======================>"); +}); +``` + + + +#### FeatureAbility.hasWindowFocus(callback: AsyncCallback\) + +* 接口说明 + + 检查ability的主窗口是否具有窗口焦点(callback形式) + +* 参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ----------------------- | ---- | ---------------- | +| callback | 只读 | AsyncCallback\ | 是 | 被指定的回调方法 | + +* 返回值 + + 如果此异能当前具有视窗焦点,则返回{@code true};否则返回{@code false} + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureability'; +featureAbility.hasWindowFocus() +``` + + + +#### FeatureAbility.hasWindowFocus() + +* 接口说明 + + 检查ability的主窗口是否具有窗口焦点(Promise形式) + +* 参数描述 + + Null + +* 返回值 + + 如果此异能当前具有视窗焦点,则返回{@code true};否则返回{@code false} + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureability'; +featureAbility.hasWindowFocus().then((void) => { + console.info("==========================>hasWindowFocus=======================>"); +}); +``` + + + +#### FeatureAbility.getWant(callback: AsyncCallback\) + +* 接口说明 + + 获取从ability发送的want(callback形式) + +* 参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | -------------------- | ---- | ---------------- | +| callback | 只读 | AsyncCallback\ | 是 | 被指定的回调方法 | + +* 返回值 + + void + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureability'; +featureAbility.getWant() +``` + + + +#### FeatureAbility.getWant() + +* 接口说明 + + 获取从ability发送的want(Promise形式) + +* 参数描述 + + Null + +* 返回值 + + void + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureability'; +featureAbility.getWant().then((void) => { + console.info("==========================>getWantCallBack=======================>"); +}); +``` + + + +#### FeatureAbility.getContext() + +* 接口说明 + + 获取应用程序上下文 + +* 返回值 + + 返回应用程序上下文 + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureability'; +var context = featureAbility.getContext() +context.getBundleName() +``` + + + +#### FeatureAbility.terminateSelf(callback: AsyncCallback\) + +* 接口说明 + + 设置page ability返回给被调用方的结果代码和数据,并销毁此page ability(callback形式) + +* 参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | -------------------- | ---- | ---------------- | +| callback | 只读 | AsyncCallback\ | 是 | 被指定的回调方法 | + +* 返回值 + + void + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureability'; +featureAbility.terminateSelf() +``` + + + +#### FeatureAbility.terminateSelf() + +* 接口说明 + + 设置page ability返回给被调用方的结果代码和数据,并销毁此page ability(Promise形式) + +* 参数描述 + + Null + +* 返回值 + +* void + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureability'; +featureAbility.terminateSelf().then((void) => { console.info("==========================>terminateSelfCallBack=======================>"); +}); +``` + +#### FeatureAbility.connectAbility(*request*: Want, *options*:ConnectOptions): number + +* 接口说明 + + 将当前ability连接到指定ServiceAbility(callback形式) + +* connectAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------- | -------- | -------------- | ---- | -------------------------- | +| request | 只读 | Want | 是 | 表示被连接的ServiceAbility | +| options | 只读 | ConnectOptions | 是 | 被指定的回调方法 | + +* Want参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------ | -------- | -------- | ---- | ---------------------------------- | +| deviceId | 只读 | string | 否 | 表示被连接的ServiceAbility的设备id,缺省表示连接本地的ServiceAbility | +| bundleName | 只读 | string | 是 | 表示被连接的ServiceAbility的包名 | +| abilityName | 只读 | string | 是 | 表示被连接的ServiceAbility的类名 | + +- ConnectOptions类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------ | -------- | -------- | ---- | ---------------------------------- | +| onConnect | 只读 | function | 是 | 连接成功时的回调函数 | +| onDisconnect | 只读 | function | 是 | 连接失败时的回调函数 | +| onFailed | 只读 | function | 是 | ConnectAbility调用失败时的回调函数 | + +* 返回值 + + 连接的ServiceAbilityID。 + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureAbility' +var mRemote; +var connId; +function onConnectCallback(element, remote){ + mRemote = remote; + console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); +} +function onDisconnectCallback(element){ + console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId) +} +function onFailedCallback(code){ + console.log('featureAbilityTest ConnectAbility onFailed errCode : ' + code) +} +var connId = featureAbility.connectAbility( + { + deviceId: deviceId, + bundleName: "com.ix.ServiceAbility", + abilityName: "ServiceAbilityA", + }, + { + onConnect: onConnectCallback, + onDisconnect: onDisconnectCallback, + onFailed: onFailedCallback, + }, +); +``` + +#### FeatureAbility.disconnectAbility(connection: number, callback:AsyncCallback): void + +* 接口说明 + + 断开与指定ServiceAbility的连接(callback形式) + +* disconnectAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ------------- | ---- | ------------------------------ | +| connection | 只读 | number | 是 | 指定断开连接的ServiceAbilityID | +| callback | 只读 | AsyncCallback | 是 | 被指定的回调方法 | + +* 返回值 + + 无 + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureAbility' +var mRemote; +var connId; +function onConnectCallback(element, remote){ + mRemote = remote; + console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); +} +function onDisconnectCallback(element){ + console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId) +} +function onFailedCallback(code){ + console.log('featureAbilityTest ConnectAbility onFailed errCode : ' + code) +} +var connId = featureAbility.connectAbility( + { + bundleName: "com.ix.ServiceAbility", + abilityName: "ServiceAbilityA", + }, + { + onConnect: onConnectCallback, + onDisconnect: onDisconnectCallback, + onFailed: onFailedCallback, + }, +); +var result = featureAbility.disconnectAbility(connId, + (error,data) => { + console.log('featureAbilityTest DisConnectJsSameBundleName result errCode : ' + error.code + " data: " + data) + }, +); +``` + +#### FeatureAbility.disconnectAbility(connection: number): Promise; + +* 接口说明 + + 断开与指定ServiceAbility的连接(promise形式) + +* disconnectAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ------ | ---- | ------------------------------ | +| connection | 只读 | number | 是 | 指定断开连接的ServiceAbilityID | + +* 返回值 + + 无 + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureAbility' +var mRemote; +var connId; +function onConnectCallback(element, remote){ + mRemote = remote; + console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); +} +function onDisconnectCallback(element){ + console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId) +} +function onFailedCallback(code){ + console.log('featureAbilityTest ConnectAbility onFailed errCode : ' + code) +} +var connId = featureAbility.connectAbility( + { + bundleName: "com.ix.ServiceAbility", + abilityName: "ServiceAbilityA", + }, + { + onConnect: onConnectCallback, + onDisconnect: onDisconnectCallback, + onFailed: onFailedCallback, + }, +); +var result = await featureAbility.disconnectAbility(connId); +``` + +#### FeatureAbility.continueAbility(options: ContinueAbilityOptions, callback: AsyncCallback); + +* 接口说明 + + 迁移一个ability到目标设备,并返回执行结果(callback形式) + +* startAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ---------------------- | ---- | ------------------- | +| options | 只读 | ContinueAbilityOptions | 是 | 表示被启动的Ability | +| callback | 只读 | AsyncCallback\ | 是 | 被指定的回调方法 | + +- ContinueAbilityOptions类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ------- | ---- | ----------------------------------------------------------- | +| deviceId | 只读 | string | 是 | 表示需要包含有关目标启动能力的信息 | +| reversible | 只读 | boolean | 是 | 是否支持回迁的标志,目前不支持该功能,为保留字段,可填false | + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureAbility' + +async StartContinueAbility(deviceId) { + let continueAbilityOptions = { + reversible: false, + deviceId: deviceId, + } + function ContinueAbilityCallback(err, data) { + console.info("[Demo] ContinueAbilityCallback, result err = " + JSON.stringify(err)); + console.info("[Demo] ContinueAbilityCallback, result data= " + JSON.stringify(data)); + } + await featureAbility.continueAbility(continueAbilityOptions, ContinueAbilityCallback); + console.info('[Demo] featureAbility.StartContinueAbility end'); +} +this.StartContinueAbility(remoteDeviceId); //remoteDeviceId is acquired from DeviceManager +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/02.ParticleAbility\346\250\241\345\235\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/02.ParticleAbility\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..513c8ea8b68b86cef8d1175df4e607c6c7491ade --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/02.ParticleAbility\346\250\241\345\235\227.md" @@ -0,0 +1,424 @@ +--- +title: ParticleAbility模块 +permalink: /pages/000b000001 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# ParticleAbility模块(JS端SDK接口) + +#### 支持设备 + +| API | 手机 | 平板 | 智慧屏 | 智能穿戴 | 轻量级智能穿戴 | 智慧视觉设备 | +| ------------------------------------------------------------ | ---- | ---- | ------ | -------- | -------------- | ------------ | +| ParticleAbility.startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\ | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| ParticleAbility.startAbility(parameter: StartAbilityParameter) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| ParticleAbility.terminateSelf(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| ParticleAbility.terminateSelf() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| ParticleAbility.acquireDataAbilityHelper(uri: string) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | + +#### 权限列表 + +ohos.permission.RUNNING_LOCK permission + +#### 使用限制 + +ParticleAbility模块的接口只能在Ability为Data和Service类型的时候进行调用 + +#### 导入模块 + +``` +import featureAbility from '@ohos.ability.featureAbility' +``` + +#### ParticleAbility.startAbility(parameter: StartAbilityParameter, callback: AsyncCallback\ + +- 接口说明 + + 服务ability使用此方法启动特定ability(callback形式) + +- startAbility参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | --------------------- | ---- | ----------------- | +| parameter | 只读 | StartAbilityParameter | 是 | 指示启动的ability | +| callback | 只读 | AsyncCallback\ | 是 | 被指定的回调方法 | + +- StartAbilityParameter类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------------- | -------- | ------ | ---- | ---------------------------------- | +| want | 只读 | want | 是 | 表示需要包含有关目标启动能力的信息 | +| abilityStartSetting | 只读 | string | 否 | 指示启动能力中使用的特殊启动设置 | + +- want类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | ------ | ---- | -------------------------- | +| deviceId | 只读 | string | 否 | 设备id | +| bundleName | 只读 | string | 否 | 捆绑包名称 | +| abilityName | 只读 | string | 否 | ability 名字 | +| uri | 只读 | string | 否 | 请求中URI的描述 | +| type | 只读 | string | 否 | 此文件中类型的说明 | +| flags | 只读 | number | 否 | 此文件中标志的选项是必需的 | +| action | 只读 | string | 否 | 需求中对操作的描述 | +| parameters | 只读 | string | 否 | Want中WantParams对象的描述 | +| entities | 只读 | string | 否 | 对象中实体的描述 | + +- flags类型说明 + + | 名称 | 参数 | 描述 | + | ------------------------------------ | ---------- | ------------------------------------------------------------ | + | FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | + | FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | + | FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给源异能 | + | FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | + | FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否不属于OHOS | + | FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | + | FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | + | FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 将结果返回到源能力片 | + | FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | + | FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | + | FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示延续是可逆的。 | + | FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | + | FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,请使用后台模式安装指定的DI功能。 | + | FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Intent}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用 | + | FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | + | FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | + +- 返回值 + + void + +- 示例 + +```js +import particleAbility from '@ohos.ability.particleAbility' +particleAbility.startAbility( + { + want: + { + action: "action.system.home", + entities: ["entity.system.home"], + type: "MIMETYPE", + flags: FLAG_AUTH_READ_URI_PERMISSION; + deviceId: "", + bundleName: "com.example.Data", + abilityName: "com.jstest.startabilitytest5.MainAbility", + uri:"" + }, + }, +) +``` + + + +#### ParticleAbility.startAbility(parameter: StartAbilityParameter) + +- 接口说明 +服务ability使用此方法启动特定ability((Promise形式) +- startAbility参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | --------------------- | ---- | ----------------- | +| parameter | 只读 | StartAbilityParameter | 是 | 指示启动的ability | +- StartAbilityParameter类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------------- | -------- | ------ | ---- | ---------------------------------- | +| want | 只读 | want | 是 | 表示需要包含有关目标启动能力的信息 | +| abilityStartSetting | 只读 | string | 否 | 指示启动能力中使用的特殊启动设置 | + +- want类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | ------ | ---- | -------------------------- | +| deviceId | 只读 | string | 否 | 设备id | +| bundleName | 只读 | string | 否 | 捆绑包名称 | +| abilityName | 只读 | string | 否 | ability 名字 | +| uri | 只读 | string | 否 | 请求中URI的描述 | +| type | 只读 | string | 否 | 此文件中类型的说明 | +| flags | 只读 | number | 否 | 此文件中标志的选项是必需的 | +| action | 只读 | string | 否 | 需求中对操作的描述 | +| parameters | 只读 | string | 否 | Want中WantParams对象的描述 | +| entities | 只读 | string | 否 | 对象中实体的描述 | + +- flags类型说明 + + | 名称 | 参数 | 描述 | + | ------------------------------------ | ---------- | ------------------------------------------------------------ | + | FLAG_AUTH_READ_URI_PERMISSION | 0x00000001 | 指示对URI执行读取操作的授权 | + | FLAG_AUTH_WRITE_URI_PERMISSION | 0x00000002 | 指示对URI执行写入操作的授权 | + | FLAG_ABILITY_FORWARD_RESULT | 0x00000004 | 将结果返回给源异能 | + | FLAG_ABILITY_CONTINUATION | 0x00000008 | 确定是否可以将本地设备上的功能迁移到远程设备 | + | FLAG_NOT_OHOS_COMPONENT | 0x00000010 | 指定组件是否不属于OHOS | + | FLAG_ABILITY_FORM_ENABLED | 0x00000020 | 指定是否启动某个能力 | + | FLAG_AUTH_PERSISTABLE_URI_PERMISSION | 0x00000040 | 指示URI上可能持久化的授权 | + | FLAG_AUTH_PREFIX_URI_PERMISSION | 0x00000080 | 将结果返回到源能力片 | + | FLAG_ABILITYSLICE_MULTI_DEVICE | 0x00000100 | 支持分布式调度系统中的多设备启动 | + | FLAG_START_FOREGROUND_ABILITY | 0x00000200 | 指示无论主机应用程序是否已启动,都将启动使用服务模板的功能 | + | FLAG_ABILITY_CONTINUATION_REVERSIBLE | 0x00000400 | 表示延续是可逆的。 | + | FLAG_INSTALL_ON_DEMAND | 0x00000800 | 如果未安装指定的功能,请安装该功能 | + | FLAG_INSTALL_WITH_BACKGROUND_MODE | 0x80000000 | 如果未安装,请使用后台模式安装指定的DI功能。 | + | FLAG_ABILITY_CLEAR_MISSION | 0x00008000 | 指示清除其他任务的操作。可以为传递给{@link ohos.app.Context#startAbility}的{@code Intent}设置此标志,并且必须与{@link flag_ABILITY_NEW_MISSION}一起使用 | + | FLAG_ABILITY_NEW_MISSION | 0x10000000 | 指示在历史任务堆栈上创建任务的操作。 | + | FLAG_ABILITY_MISSION_TOP | 0x20000000 | 指示如果启动能力的现有实例已位于任务堆栈的顶部,则将重用该实例。否则,将创建一个新的能力实例。 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +import particleAbility from '@ohos.ability.particleAbility' +var windowMode = featureAbility.AbilityStartSetting.WINDOW_MODE_KEY; +particleAbility.startAbility( + want: + { + bundleName: "com.jstest.featureabilitytest", + abilityName: "com.jstest.startabilitytest1.MainAbility", + }, + abilityStartSetting: + { + windowMode: featureAbility.AbilityWindowConfiguration.WINDOW_MODE_FLOATING, + }, + } + + ).then((void) => { + console.info("==========================>startAbilityCallback=======================>"); +}); +``` + + + +#### ParticleAbility.terminateSelf(callback: AsyncCallback\) + +- 接口说明 + + 摧毁服务ability(callback形式) + +- terminateSelf参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | -------------------- | ---- | -------------------- | + | callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import particleAbility from '@ohos.ability.particleAbility' +ParticleAbility.terminateSelf() +``` + + + +#### ParticleAbility.terminateSelf() + +- 接口说明 + + 摧毁服务ability(Promise形式) + +- 返回值 + + void + +- 示例 + +```js +import particleAbility from '@ohos.ability.particleAbility' +particleAbility.terminateSelf().then((void) => { + console.info("==========================>terminateSelfCallback=======================>"); +}); +``` + + + +#### ParticleAbility.acquireDataAbilityHelper(uri: string) + +- 接口说明 + + 获取dataAbilityHelper + +- acquireDataAbilityHelper参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | :--- | -------- | ------ | ---- | ---------------------- | + | uri | 只读 | string | 是 | 指示要打开的文件的路径 | + +- 返回值 + + 返回dataAbilityHelper + +- 示例 + +```js +import particleAbility from '@ohos.ability.particleAbility' +var uri = ""; +ParticleAbility.acquireDataAbilityHelper(uri) +``` + +#### ParticleAbility.connectAbility(*request*: Want, *options*:ConnectOptions): number + +* 接口说明 + + 将当前ability连接到指定ServiceAbility(callback形式) + +* connectAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------- | -------- | -------------- | ---- | -------------------------- | +| request | 只读 | Want | 是 | 表示被连接的ServiceAbility | +| options | 只读 | ConnectOptions | 是 | 被指定的回调方法 | + +- ConnectOptions类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------ | -------- | -------- | ---- | ---------------------------------- | +| onConnect | 只读 | function | 是 | 连接成功时的回调函数 | +| onDisconnect | 只读 | function | 是 | 连接失败时的回调函数 | +| onFailed | 只读 | function | 是 | ConnectAbility调用失败时的回调函数 | + +* 返回值 + + 连接的ServiceAbilityID。 + +* 示例 + +```javascript +import particleAbility from '@ohos.ability.particleAbility' +var mRemote; +var connId; +function onConnectCallback(element, remote){ + mRemote = remote; + console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); +} +function onDisconnectCallback(element){ + console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId) +} +function onFailedCallback(code){ + console.log('particleAbilityTest ConnectAbility onFailed errCode : ' + code) +} +var connId = particleAbility.connectAbility( + { + bundleName: "com.ix.ServiceAbility", + abilityName: "ServiceAbilityA", + }, + { + onConnect: onConnectCallback, + onDisconnect: onDisconnectCallback, + onFailed: onFailedCallback, + }, +); +``` + +#### ParticleAbility.disconnectAbility(connection: number, callback:AsyncCallback): void + +* 接口说明 + + 断开与指定ServiceAbility的连接(callback形式) + +* disconnectAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ------------- | ---- | ------------------------------ | +| connection | 只读 | number | 是 | 指定断开连接的ServiceAbilityID | +| callback | 只读 | AsyncCallback | 是 | 被指定的回调方法 | + +* 返回值 + + 无 + +* 示例 + +```javascript +import particleAbility from '@ohos.ability.particleAbility' +var mRemote; +var connId; +function onConnectCallback(element, remote){ + mRemote = remote; + console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); +} +function onDisconnectCallback(element){ + console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId) +} +function onFailedCallback(code){ + console.log('particleAbilityTest ConnectAbility onFailed errCode : ' + code) +} +var connId = particleAbility.connectAbility( + { + bundleName: "com.ix.ServiceAbility", + abilityName: "ServiceAbilityA", + }, + { + onConnect: onConnectCallback, + onDisconnect: onDisconnectCallback, + onFailed: onFailedCallback, + }, +); +var result = particleAbility.disconnectAbility(connId, + (error,data) => { + console.log('particleAbilityTest DisConnectJsSameBundleName result errCode : ' + error.code + " data: " + data) + }, +); +``` + +#### ParticleAbility.disconnectAbility(connection: number): Promise; + +* 接口说明 + + 断开与指定ServiceAbility的连接(promise形式) + +* disconnectAbility参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ------ | ---- | ------------------------------ | +| connection | 只读 | number | 是 | 指定断开连接的ServiceAbilityID | + +* 返回值 + + 无 + +* 示例 + +```javascript +import particleAbility from '@ohos.ability.particleAbility' +var mRemote; +var connId; +function onConnectCallback(element, remote){ + mRemote = remote; + console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy)); +} +function onDisconnectCallback(element){ + console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId) +} +function onFailedCallback(code){ + console.log('particleAbilityTest ConnectAbility onFailed errCode : ' + code) +} +var connId = particleAbility.connectAbility( + { + bundleName: "com.ix.ServiceAbility", + abilityName: "ServiceAbilityA", + }, + { + onConnect: onConnectCallback, + onDisconnect: onDisconnectCallback, + onFailed: onFailedCallback, + }, +); +var result = await particleAbility.disconnectAbility(connId); +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/03.DataAbilityHelper\346\250\241\345\235\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/03.DataAbilityHelper\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..7344ae4fc2be7b3735d700f98694e5922d51d90d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/03.DataAbilityHelper\346\250\241\345\235\227.md" @@ -0,0 +1,850 @@ +--- +title: DataAbilityHelper模块 +permalink: /pages/000b000002 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +### DataAbilityHelper模块(JS端SDK接口) + +#### 支持设备 + +| API | 手机 | 平板 | 智慧屏 | 智能穿戴 | 轻量级智能穿戴 | 智慧视觉设备 | +| ------------------------------------------------------------ | ---- | ---- | ------ | -------- | -------------- | ------------ | +| DataAbilityHelper.openFile(uri: string, mode: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.openFile(uri: string, mode: string) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.on(type: 'dataChange', uri: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.off(type: 'dataChange', uri: string, callback?: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.getFileTypes(uri: string, mimeTypeFilter: string, callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.getFileTypes(uri: string, mimeTypeFilter: string) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.getType(uri: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.getType(uri: string) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.normalizeUri(uri: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.normalizeUri(uri: string) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.denormalizeUri(uri: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.denormalizeUri(uri: string) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.notifyChange(uri: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.notifyChange(uri: string) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.insert(uri: string, valuesBucket: rdb.ValuesBucket, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.insert(uri: string, valuesBucket: rdb.ValuesBucket) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.batchInsert(uri: string, valuesBuckets: Array, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.batchInsert(uri: string, valuesBuckets: Array) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.delete(uri: string, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.delete(uri: string, predicates: dataAbility.DataAbilityPredicates) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.DataAbilityPredicates) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| DataAbilityHelper.query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityPredicates) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | + +#### 权限列表 + +ohos.permission.RUNNING_LOCK permission + +#### 导入模块 + +``` +import featureAbility from '@ohos.ability.featureAbility' +import ohos_data_ability from '@ohos.data.dataability' +import ohos_data_rdb from '@ohos.data.rdb' +``` + +#### DataAbilityHelper.openFile(uri: string, mode: string, callback: AsyncCallback\) + +- 接口说明 + + 在指定的远程路径中打开文件(callback形式) + + +* 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | -------------------- | ---- | ------------------------ | + | uri | 只读 | string | 是 | 指示要打开的文件的路径。 | + | mode | 只读 | string | 是 | 指示文件打开模式‘rwt’。 | + | callback | 只读 | AsyncCallback\ | 是 | 被指定的回调方法 | + +* 返回值 + + 返回文件描述符。 + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +var mode = "rwt"; +DAHelper.openFile( + "dataability:///com.example.DataAbility", + mode, +) +``` + +#### DataAbilityHelper.openFile(uri: string, mode: string) + +- 接口说明 + + 在指定的远程路径中打开文件(Promise形式) + +* 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---- | -------- | ------ | ---- | ------------------------ | + | uri | 只读 | string | 是 | 指示要打开的文件的路径。 | + | mode | 只读 | string | 是 | 指示文件打开模式‘rwt’。 | + +* 返回值 + + 返回文件描述符。 + +* 示例 + +```javascript +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +var mode = "rwt"; +DAHelper.openFile( + "dataability:///com.example.DataAbility", + mode).then((void) => { + console.info("==========================>openFileCallback=======================>"); +}); +``` + +#### DataAbilityHelper.on(type: 'dataChange', uri: string, callback: AsyncCallback\) + +- 接口说明 + + 注册观察者以观察给定uri指定的数据(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | -------------------- | ---- | ------------------------ | + | type | 只读 | string | 是 | 数据更改。 | + | uri | 只读 | string | 是 | 指示要操作的数据的路径。 | + | callback | 只读 | AsyncCallback\ | 是 | 指示数据更改时的回调。 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var helper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +helper.on( + "dataChange", + "dataability:///com.example.DataAbility", +) +``` + +#### DataAbilityHelper.off(type: 'dataChange', uri: string, callback?: AsyncCallback\) + +- 接口说明 + + 注册观察者以观察给定uri指定的数据(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | -------------------- | ---- | ------------------------ | + | type | 只读 | string | 是 | 数据更改。 | + | uri | 只读 | string | 是 | 指示要操作的数据的路径。 | + | callback | 只读 | AsyncCallback\ | 否 | 指示已注册的回调。 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var helper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +helper.off( + "dataChange", + "dataability:///com.example.DataAbility", +) +``` + +#### DataAbilityHelper.getType(uri: string, callback: AsyncCallback\) + +- 接口说明 + + 获取给定URI指定的日期的MIME类型(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------ | + | uri | 只读 | string | 是 | 指示要操作的数据的路径。 | + | callback | 只读 | AsyncCallback\ | 是 | 回调方法 | + +- 返回值 + + 返回与uri指定的数据匹配的MIME类型。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +DAHelper.getType( + "dataability:///com.example.DataAbility" +) +``` + +#### DataAbilityHelper.getType(uri: string) + +- 接口说明 + + 获取给定URI指定的日期的MIME类型(Promise形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---- | -------- | ------ | ---- | ------------------------ | + | uri | 只读 | string | 是 | 指示要操作的数据的路径。 | + +- 返回值 + + 返回与uri指定的数据匹配的MIME类型。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +DAHelper.getType( + "dataability:///com.example.DataAbility" + ).then((void) => { + console.info("==========================>getTypeCallback=======================>"); +}); +``` + +#### DataAbilityHelper.getFileTypes(uri: string, mimeTypeFilter: string, callback: AsyncCallback>) + +- 接口说明 + + 获取支持的文件的MIME类型(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------------- | -------- | ---------------------- | ---- | ---------------------------- | + | uri | 只读 | string | 是 | 指示要获取的文件的路径。 | + | mimeTypeFilter | 只读 | string | 是 | 指示要获取的文件的MIME类型。 | + | callback | 只读 | AsyncCallback\ | 是 | 回调方法 | + +- 返回值 + + 返回匹配的MIME类型数组。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +DAHelper.getFileTypes( + "dataability:///com.example.DataAbility", + "image/*" +) +``` + +#### DataAbilityHelper.getFileTypes(uri: string, mimeTypeFilter: string) + +- 接口说明 + + 获取支持的文件的MIME类型(Promise形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------------- | -------- | ------ | ---- | ---------------------------- | + | uri | 只读 | string | 是 | 指示要获取的文件的路径。 | + | mimeTypeFilter | 只读 | string | 是 | 指示要获取的文件的MIME类型。 | + +- 返回值 + + 返回匹配的MIME类型数组。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +DAHelper.getFileTypes( + "dataability:///com.example.DataAbility", + "image/*" + ).then((void) => { + console.info("==========================>getFileTypesCallback=======================>"); +}); +``` + +#### DataAbilityHelper.normalizeUri(uri: string, callback: AsyncCallback\) + +- 接口说明 + + 将引用数据功能的给定uri转换为规范化uri(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ----------------------- | + | uri | 只读 | string | 是 | 指示要规范化的uri对象。 | + | callback | 只读 | AsyncCallback\ | 是 | 回调方法 | + +- 返回值 + + 如果数据功能支持uri规范化或null,则返回规范化uri对象。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +DAHelper.normalizeUri( + "dataability:///com.example.DataAbility", +) +``` + +#### DataAbilityHelper.normalizeUri(uri: string) + +- 接口说明 + + 将引用数据功能的给定uri转换为规范化uri(Promise形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---- | -------- | ------ | ---- | ----------------------- | + | uri | 只读 | string | 是 | 指示要规范化的uri对象。 | + +- 返回值 + + 如果数据功能支持uri规范化或null,则返回规范化uri对象。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +DAHelper.normalizeUri( + "dataability:///com.example.DataAbility", + ).then((void) => { + console.info("==========================>normalizeUriCallback=======================>"); +}); +``` + +#### DataAbilityHelper.denormalizeUri(uri: string, callback: AsyncCallback\) + +- 接口说明 + + 将由normalizeUri(uri)生成的给定规范化uri转换为非规范化uri(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ----------------------- | + | uri | 只读 | string | 是 | 指示要规范化的uri对象。 | + | callback | 只读 | AsyncCallback\ | 是 | 回调方法 | + +- 返回值 + + 如果反规范化成功,则返回反规范化uri对象。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +DAHelper.denormalizeUri( + "dataability:///com.example.DataAbility", +) +``` + +#### DataAbilityHelper.denormalizeUri(uri: string) + +- 接口说明 + + 将由normalizeUri(uri)生成的给定规范化uri转换为非规范化uri(Promise形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---- | -------- | ------ | ---- | ----------------------- | + | uri | 只读 | string | 是 | 指示要规范化的uri对象。 | + +- 返回值 + + 如果反规范化成功,则返回反规范化uri对象。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +DAHelper.denormalizeUri( + "dataability:///com.example.DataAbility", + ).then((void) => { + console.info("==========================>denormalizeUriCallback=======================>"); +}); +``` + +#### DataAbilityHelper.notifyChange(uri: string, callback: AsyncCallback\) + +- 接口说明 + + 通知已注册的观察者uri指定的数据资源的更改(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | -------------------- | ---- | ------------------------ | + | uri | 只读 | string | 是 | 指示要操作的数据的路径。 | + | callback | 只读 | AsyncCallback\ | 是 | 回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var helper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +helper.notifyChange( + "dataability:///com.example.DataAbility", +) +``` + +#### DataAbilityHelper.notifyChange(uri: string) + +- 接口说明 + + 通知已注册的观察者uri指定的数据资源的更改(Promise形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---- | -------- | ------ | ---- | ------------------------ | + | uri | 只读 | string | 是 | 指示要操作的数据的路径。 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +DAHelper.notifyChange( + "dataability:///com.example.DataAbility", + ).then((void) => { + console.info("==========================>notifyChangeCallback=======================>"); +}); +``` + +#### DataAbilityHelper.insert(uri: string, valuesBucket: rdb.ValuesBucket, callback: AsyncCallback\) + +- 接口说明 + + 将单个数据记录插入数据库(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------ | -------- | ---------------------- | ---- | ------------------------------------------------------ | + | uri | 只读 | string | 是 | 指示要插入的数据的路径。 | + | valuesBucket | 只读 | rdb.ValuesBucket | 是 | 指示要插入的数据记录。如果此参数为空,将插入一个空行。 | + | callback | 只读 | AsyncCallback\ | 是 | 回调方法 | + +- 返回值 + + 返回插入数据记录的索引。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +const valueBucket = { + "name": "rose", + "age": 22, + "salary": 200.5, + "blobType": u8, +} +DAHelper.insert( + "dataability:///com.example.DataAbility", + valueBucket +) +``` + +#### DataAbilityHelper.insert(uri: string, valuesBucket: rdb.ValuesBucket) + +- 接口说明 + + 将单个数据记录插入数据库(Promise形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------ | -------- | ---------------- | ---- | ------------------------------------------------------ | + | uri | 只读 | string | 是 | 指示要插入的数据的路径。 | + | valuesBucket | 只读 | rdb.ValuesBucket | 是 | 指示要插入的数据记录。如果此参数为空,将插入一个空行。 | + +- 返回值 + + 返回插入数据记录的索引。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +const valueBucket = { + "name": "rose1", + "age": 221, + "salary": 20.5, + "blobType": u8, +} +DAHelper.insert( + "dataability:///com.example.DataAbility", + valueBucket + ).then((void) => { + console.info("==========================>insertCallback=======================>"); +}); +``` + +#### DataAbilityHelper.batchInsert(uri: string, valuesBuckets: Array, callback: AsyncCallback\) + +- 接口说明 + + 将多个数据记录插入数据库(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------ | -------- | ----------------------- | ---- | ------------------------ | + | uri | 只读 | string | 是 | 指示要插入的数据的路径。 | + | valuesBucket | 只读 | Array | 是 | 指示要插入的数据记录。 | + | callback | 只读 | AsyncCallback\ | 是 | 回调方法 | + +- 返回值 + + 返回插入的数据记录数。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +var cars = new Array({"name": "roe11", "age": 21, "salary": 20.5, "blobType": u8,}, + {"name": "roe12", "age": 21, "salary": 20.5, "blobType": u8,}, + {"name": "roe13", "age": 21, "salary": 20.5, "blobType": u8,}) +DAHelper.batchInsert( + "dataability:///com.example.DataAbility", + cars +) +``` + +#### DataAbilityHelper.batchInsert(uri: string, valuesBuckets: Array) + +- 接口说明 + + 将多个数据记录插入数据库(Promise形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------ | -------- | ----------------------- | ---- | ------------------------ | + | uri | 只读 | string | 是 | 指示要插入的数据的路径。 | + | valuesBucket | 只读 | Array | 是 | 指示要插入的数据记录。 | + +- 返回值 + + 返回插入的数据记录数。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +var cars = new Array({"name": "roe11", "age": 21, "salary": 20.5, "blobType": u8,}, + {"name": "roe12", "age": 21, "salary": 20.5, "blobType": u8,}, + {"name": "roe13", "age": 21, "salary": 20.5, "blobType": u8,}) +DAHelper.batchInsert( + "dataability:///com.example.DataAbility", + cars + ).then((void) => { + console.info("==========================>batchInsertCallback=======================>"); +}); +``` + +#### DataAbilityHelper.delete(uri: string, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\) + +- 接口说明 + + 从数据库中删除一个或多个数据记录(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------ | -------- | --------------------------------- | ---- | ------------------------------------------------ | + | uri | 只读 | string | 是 | 指示要删除的数据的路径。 | + | valuesBucket | 只读 | dataAbility.DataAbilityPredicates | 是 | 指示筛选条件。当此参数为null时,应定义处理逻辑。 | + | callback | 只读 | AsyncCallback\ | 是 | 回调方法 | + +- 返回值 + + 返回已删除的数据记录数。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +import ohos_data_ability from '@ohos.data.dataability' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +let da = new ohos_data_ability.DataAbilityPredicates() +DAHelper.delete( + "dataability:///com.example.DataAbility", + da +) +``` + +#### DataAbilityHelper.delete(uri: string, predicates: dataAbility.DataAbilityPredicates) + +- 接口说明 + + 从数据库中删除一个或多个数据记录(Promise形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------ | -------- | --------------------------------- | ---- | ------------------------------------------------ | + | uri | 只读 | string | 是 | 指示要删除的数据的路径。 | + | valuesBucket | 只读 | dataAbility.DataAbilityPredicates | 是 | 指示筛选条件。当此参数为null时,应定义处理逻辑。 | + +- 返回值 + + 返回已删除的数据记录数。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +let da = new ohos_data_ability.DataAbilityPredicates() +DAHelper.delete( + "dataability:///com.example.DataAbility", + da + ).then((void) => { + console.info("==========================>deleteCallback=======================>"); +}); +``` + +#### DataAbilityHelper.update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\) + +- 接口说明 + + 更新数据库中的数据记录(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------ | -------- | --------------------------------- | ---- | ------------------------------------------------ | + | uri | 只读 | string | 是 | 指示要更新的数据的路径。 | + | valuesBucket | 只读 | rdb.ValuesBucket | 是 | 指示要更新的数据。 | + | predicates | 只读 | dataAbility.DataAbilityPredicates | 是 | 指示筛选条件。当此参数为null时,应定义处理逻辑。 | + | callback | 只读 | AsyncCallback\ | 是 | 回调方法 | + +- 返回值 + + 返回更新的数据记录数。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +import ohos_data_ability from '@ohos.data.dataability' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +const va = { + "name": "roe1", + "age": 21, + "salary": 20.5, + "blobType": u8, +} +let da = new ohos_data_ability.DataAbilityPredicates() +DAHelper.update( + "dataability:///com.example.DataAbility", + va, + da +) +``` + +#### DataAbilityHelper.update(uri: string, valuesBucket: rdb.ValuesBucket, predicates: dataAbility.DataAbilityPredicates) + +- 接口说明 + + 更新数据库中的数据记录(Promise形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------ | -------- | --------------------------------- | ---- | ------------------------------------------------ | + | uri | 只读 | string | 是 | 指示要更新的数据的路径。 | + | valuesBucket | 只读 | rdb.ValuesBucket | 是 | 指示要更新的数据。 | + | predicates | 只读 | dataAbility.DataAbilityPredicates | 是 | 指示筛选条件。当此参数为null时,应定义处理逻辑。 | + +- 返回值 + + 返回更新的数据记录数。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +import ohos_data_ability from '@ohos.data.dataability' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +const va = { + "name": "roe1", + "age": 21, + "salary": 20.5, + "blobType": u8, +} +let da = new ohos_data_ability.DataAbilityPredicates() +DAHelper.update( + "dataability:///com.example.DataAbility", + va, + da + ).then((void) => { + console.info("==========================>updateCallback=======================>"); +}); +``` + +#### DataAbilityHelper.query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\) + +- 接口说明 + + 查询数据库中的数据(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | --------------------------------- | ---- | ------------------------------------------------ | + | uri | 只读 | string | 是 | 指示要查询的数据的路径。 | + | columns | 只读 | rdb.ValuesBucket | 是 | 指示要查询的列。如果此参数为空,则查询所有列。 | + | predicates | 只读 | dataAbility.DataAbilityPredicates | 是 | 指示筛选条件。当此参数为null时,应定义处理逻辑。 | + | callback | 只读 | AsyncCallback\ | 是 | 回调方法 | + +- 返回值 + + 返回查询结果 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +import ohos_data_ability from '@ohos.data.dataability' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +var cars=new Array({"value1"}, {"value2"}, {"value3"}, {"value4"}); +let da = new ohos_data_ability.DataAbilityPredicates() +DAHelper.query( + "dataability:///com.example.DataAbility", + cars, + da +) +``` + + + +#### DataAbilityHelper.query(uri: string, columns: Array\, predicates: dataAbility.DataAbilityPredicates) + +- 接口说明 + + 查询数据库中的数据(Promise形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | --------------------------------- | ---- | ------------------------------------------------ | + | uri | 读写 | string | 是 | 指示要查询的数据的路径。 | + | columns | 读写 | rdb.ValuesBucket | 是 | 指示要查询的列。如果此参数为空,则查询所有列。 | + | predicates | 读写 | dataAbility.DataAbilityPredicates | 是 | 指示筛选条件。当此参数为null时,应定义处理逻辑。 | + +- 返回值 + + 返回查询结果 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +import ohos_data_ability from '@ohos.data.dataability' +var DAHelper = await featureAbility.getDataAbilityHelper( + "dataability:///com.example.DataAbility" +); +var cars=new Array({"value1"}, {"value2"}, {"value3"}, {"value4"}); +let da = new ohos_data_ability.DataAbilityPredicates() +DAHelper.query( + "dataability:///com.example.DataAbility", + cars, + da + ).then((void) => { + console.info("==========================>queryCallback=======================>"); +}); +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/04.DataUriUtils\346\250\241\345\235\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/04.DataUriUtils\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..523a2f2bba5977437335f8e61f8ad477141cf9ee --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/04.DataUriUtils\346\250\241\345\235\227.md" @@ -0,0 +1,135 @@ +--- +title: DataUriUtils模块 +permalink: /pages/000b000003 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +### DataUriUtils模块(JS端SDK接口) + +#### 权限列表 + +ohos.permission.RUNNING_LOCK permission + +#### 导入模块 + +```js +import notify from '@ohos.ability.dataUriUtils'; +``` + +#### DataUriUtils.getId(uri: string) + +- 接口说明 + + 获取附加到给定uri的路径组件末尾的ID + +- 参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---- | -------- | ------ | ---- | ------------------------- | +| uri | 只读 | string | 是 | 指示要从中获取ID的uri对象 | + +- 返回值 + + 附加到路径组件末尾的ID + +- 示例 + +```js +import dataUriUtils from '@ohos.ability.datauriutils' +dataUriUtils.getIdSync("com.example.dataUriUtils/1221") +``` + + + +#### DataUriUtils.attachId(uri: string, id: number) + +- 接口说明 + + 将给定ID附加到给定uri的路径组件的末尾 + +- 参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---- | -------- | ------ | ---- | ------------------------- | +| uri | 只读 | string | 是 | 指示要从中获取ID的uri对象 | +| id | 只读 | number | 是 | 指示要附加的ID | + +- 返回值 + + 附加给定ID的uri对象 + +- 示例 + +```js +import dataUriUtils from '@ohos.ability.datauriutils' +var idint = 1122; +dataUriUtils.attachId( + "com.example.dataUriUtils" + idint, +) +``` + + + +#### DataUriUtils.deleteId(uri: string) + +- 接口说明 + + 从给定uri的路径组件的末尾删除ID + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---- | -------- | ------ | ---- | ------------------------- | + | uri | 只读 | string | 是 | 指示要从中删除ID的uri对象 | + +- 返回值 + + ID已删除的uri对象 + +- 示例 + +```js +import dataUriUtils from '@ohos.ability.datauriutils' +dataUriUtils.deleteId("com.example.dataUriUtils/1221") +``` + + + +#### DataUriUtils.updateId(uri: string, id: number) + +- 接口说明 + + 更新指定uri中的ID + +- updateId参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---- | -------- | ------ | ---- | ------------------- | + | uri | 只读 | string | 是 | 指示要更新的uri对象 | + | id | 只读 | number | 是 | 指示新ID | + +- 返回值 + + 更新的uri对象 + +- 示例 + +```js +import dataUriUtils from '@ohos.ability.datauriutils' +var idint = 1122; +dataUriUtils.updateId( + "com.example.dataUriUtils" + idint, +) +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/05.Bundle\346\250\241\345\235\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/05.Bundle\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..f43744be6dd2c111908f3b70f06e4c94ee7f4d4e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/05.Bundle\346\250\241\345\235\227.md" @@ -0,0 +1,1341 @@ +--- +title: Bundle模块 +permalink: /pages/000b000004 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# Bundle模块(JS端SDK接口) + +#### 支持设备 + +| API | 手机 | 平板 | 智慧屏 | 智能穿戴 | 轻量级智能穿戴 | 智慧视觉设备 | +| ------------------------------------------------------------ | ---- | ---- | ------ | -------- | -------------- | ------------ | +| Bundle.getApplicationInfo(bundleName: string, bundleFlags: number, userId: number) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getApplicationInfo(bundleName: string, bundleFlags: number, userId: number, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getAllBundleInfo(bundlelFlag: BundleFlag) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getAllBundleInfo(bundlelFlag: BundleFlag, callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getBundleInfo(bundleName: string, bundleFlags: number) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getBundleInfo(bundleName: string, bundleFlags: number, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getAllApplicationInfo(bundleFlags: number, userId: number) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getAllApplicationInfo(bundleFlags: number, userId: number, callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.queryAbilityByWant(want: Want, bundleFlags: number, userId: number) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.queryAbilityByWant(want: Want, bundleFlags: number, userId: number, callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getPermissionDef(permissionName: string) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getPermissionDef(permissionName: string, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getBundleArchiveInfo(hapFilePath: string, flags: number) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getBundleArchiveInfo(hapFilePath: string, flags: number, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getBundleInstaller().install(bundleFilePaths: Array, param: InstallParam, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getBundleInstaller().uninstall(bundleName: string, param: InstallParam, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getAllShortcutInfo(bundleName: string): Promise> | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Bundle.getAllShortcutInfo(bundleName: string, callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| getModuleUsageRecords(maxNum: number): Promise> | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| getModuleUsageRecords(maxNum: number, callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| checkPermission(bundleName: string, permission: string): Promise | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| checkPermission(bundleName: string, permission: string, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | + +#### 权限列表 + +- + +#### 导入模块 + +``` +import bundle from '@ohos.bundle'; +``` + + + +#### getApplicationInfo(bundleName: string, bundleFlags: number, userId: number) + +* 功能说明 + + 根据给定的bundle名称获取ApplicationInfo + +* getApplicationInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------ | ---- | ------------------------------------------------------- | + | bundleName | 只读 | string | 是 | 应用名 | + | bundleFlags | 只读 | number | 是 | 0:返回默认app信息<
8:返回包含permissions的app信息 | + | userId | 只读 | number | 是 | 用户ID | + +* 返回值 + + Promise:返回值为Promise对象,Promise中包含应用信息。 + +* 示例 + +``` +bundle.getApplicationInfo('com.example.myapplicationInstall', 8, 0).then((data) => { + console.info("name: for begin"); + console.info("name:" + data.name); + console.info("bundleName:" + data.bundleName); + console.info("description:" + data.description); + console.info("descriptionId:" + data.descriptionId); + console.info("iconPath:" + data.iconPath); + console.info("iconId:" + data.iconId); + console.info("label:" + data.label); + console.info("labelId:" + data.labelId); + console.info("deviceId:" + data.deviceId); + console.info("signatureKey:" + data.signatureKey); + console.info("process:" + data.process); + console.info("isSystemApp:" + data.isSystemApp); + console.info("isLauncherApp:" + data.isLauncherApp); + console.info("supportedModes:" + data.supportedModes); + + console.info('getApplicationInfo permissions length [' + data.permissions.length + ']'); + for (var j = 0; j < data.permissions.length; j++) { + console.info("permissions[" + j + "]:" + data.permissions[j]); + } + console.info('getApplicationInfo moduleSourceDirs length [' + data.moduleSourceDirs.length + ']'); + for (var j = 0; j < data.moduleSourceDirs.length; j++) { + console.info("moduleSourceDirs[" + j + "]:" + data.moduleSourceDirs[j]); + } + console.info('getApplicationInfo moduleInfos length [' + data.moduleInfos.length + ']'); + for (var j = 0; j < data.moduleInfos.length; j++) { + console.info("moduleInfos[" + j + "]moduleName:" + data.moduleInfos[j].moduleName); + console.info("moduleInfos[" + j + "]moduleSourceDir:" + data.moduleInfos[j].moduleSourceDir); + } + console.info("entryDir:" + data.entryDir); + console.info("codePath:" + data.codePath); + console.info("dataDir:" + data.dataDir); + console.info("dataBaseDir:" + data.dataBaseDir); + console.info("cacheDir:" + data.cacheDir); +}) +``` + + + +#### getApplicationInfo(bundleName: string, bundleFlags: number, userId: number, callback: AsyncCallback) + +* 功能说明 + + 根据给定的bundle名称获取ApplicationInfo + +* getApplicationInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------------------------------ | ---- | ------------------------------------------------------- | + | bundleName | 只读 | string | 是 | 应用名 | + | bundleFlags | 只读 | number | 是 | 0:返回默认app信息<
8:返回包含permissions的app信息 | + | userId | 只读 | number | 是 | 用户ID | + | callback | 只读 | AsyncCallback | 是 | 回调方法 | + +* 返回值 + + void + +* 示例 + +``` +bundle.getApplicationInfo('com.example.myapplicationInstall', 8, 0, OnReceiveEvent); + +function OnReceiveEvent(err, data) { + console.info("name: for begin"); + console.info("name:" + data.name); + console.info("bundleName:" + data.bundleName); + console.info("description:" + data.description); + console.info("descriptionId:" + data.descriptionId); + console.info("iconPath:" + data.iconPath); + console.info("iconId:" + data.iconId); + console.info("label:" + data.label); + console.info("labelId:" + data.labelId); + console.info("deviceId:" + data.deviceId); + console.info("signatureKey:" + data.signatureKey); + console.info("process:" + data.process); + console.info("isSystemApp:" + data.isSystemApp); + console.info("isLauncherApp:" + data.isLauncherApp); + console.info("supportedModes:" + data.supportedModes); + + console.info('getApplicationInfo permissions length [' + data.permissions.length + ']'); + for (var j = 0; j < data.permissions.length; j++) { + console.info("permissions[" + j + "]:" + data.permissions[j]); + } + console.info('getApplicationInfo moduleSourceDirs length [' + data.moduleSourceDirs.length + ']'); + for (var j = 0; j < data.moduleSourceDirs.length; j++) { + console.info("moduleSourceDirs[" + j + "]:" + data.moduleSourceDirs[j]); + } + console.info('getApplicationInfo moduleInfos length [' + data.moduleInfos.length + ']'); + for (var j = 0; j < data.moduleInfos.length; j++) { + console.info("moduleInfos[" + j + "]moduleName:" + data.moduleInfos[j].moduleName); + console.info("moduleInfos[" + j + "]moduleSourceDir:" + data.moduleInfos[j].moduleSourceDir); + } + console.info("entryDir:" + data.entryDir); + console.info("codePath:" + data.codePath); + console.info("dataDir:" + data.dataDir); + console.info("dataBaseDir:" + data.dataBaseDir); + console.info("cacheDir:" + data.cacheDir); +} +``` + + + +#### getAllBundleInfo(bundleFlag: BundleFlag) + +* 功能说明 + + 获取系统中所有可用的包信息 + +* getAllBundleInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | ---------- | ---- | ----------------------------------------------------------- | + | bundleFlag | 只读 | BundleFlag | 是 | 0:返回默认BundleInfo
1:返回包含abilityInfo的BundleInfo | + +* 返回值 + + Promise>:返回值为Promise对象,Promise中包含包信息列表。 + +* 示例 + +``` +bundle.getAllBundleInfo(0).then((data) => { + for (var i = 0; i < data.length; i++) { + console.info("index[" + i + "].name: for begin"); + console.info("index[" + i + "].name:" + data[i].name); + console.info("index[" + i + "].label:" + data[i].label); + console.info("index[" + i + "].description:" + data[i].description); + console.info("index[" + i + "].vendor:" + data[i].vendor); + console.info("index[" + i + "].versionCode:" + data[i].versionCode); + console.info("index[" + i + "].versionName:" + data[i].versionName); + console.info("index[" + i + "].jointUserId:" + data[i].jointUserId); + console.info("index[" + i + "].minSdkVersion:" + data[i].minSdkVersion); + console.info("index[" + i + "].maxSdkVersion:" + data[i].maxSdkVersion); + console.info("index[" + i + "].mainEntry:" + data[i].mainEntry); + console.info("index[" + i + "].cpuAbi:" + data[i].cpuAbi); + console.info("index[" + i + "].appId:" + data[i].appId); + console.info("index[" + i + "].compatibleVersion:" + data[i].compatibleVersion); + console.info("index[" + i + "].targetVersion:" + data[i].targetVersion); + console.info("index[" + i + "].releaseType:" + data[i].releaseType); + console.info("index[" + i + "].uid:" + data[i].uid); + console.info("index[" + i + "].gid:" + data[i].gid); + console.info("index[" + i + "].seInfo:" + data[i].seInfo); + console.info("index[" + i + "].entryModuleName:" + data[i].entryModuleName); + console.info("index[" + i + "].isKeepAlive:" + data[i].isKeepAlive); + console.info("index[" + i + "].isNativeApp:" + data[i].isNativeApp); + console.info("index[" + i + "].installTime:" + data[i].installTime); + console.info("index[" + i + "].updateTime:" + data[i].updateTime); + console.info("index[" + i + "].appInfo.name:" + data[i].applicationInfo.name); + console.info("index[" + i + "].appInfo.bundleName:" + data[i].applicationInfo.bundleName); + console.info('getAllBundleInfo reqPermissions length [' + data[i].reqPermissions.length + ']'); + for (var j = 0; j < data[i].reqPermissions.length; j++) { + console.info("index[" + i + "]reqPermissions[" + j + "]:" + data[i].reqPermissions[j]); + } + console.info('getAllBundleInfo defPermissions length [' + data[i].defPermissions.length + ']'); + for (var j = 0; j < data[i].defPermissions.length; j++) { + console.info("index[" + i + "]defPermissions[" + j + "]:" + data[i].defPermissions[j]); + } + + console.info('getAllBundleInfo hapModuleNames length [' + data[i].hapModuleNames.length + ']'); + for (var j = 0; j < data[i].hapModuleNames.length; j++) { + console.info("index[" + i + "]hapModuleNames[" + j + "]:" + data[i].hapModuleNames[j]); + } + console.info('getAllBundleInfo moduleNames length [' + data[i].moduleNames.length + ']'); + for (var j = 0; j < data[i].moduleNames.length; j++) { + console.info("index[" + i + "]moduleNames[" + j + "]:" + data[i].moduleNames[j]); + } + console.info('getAllBundleInfo modulePublicDirs length [' + data[i].modulePublicDirs.length + ']'); + for (var j = 0; j < data[i].modulePublicDirs.length; j++) { + console.info("index[" + i + "]modulePublicDirs[" + j + "]:" + data[i].modulePublicDirs[j]); + } + console.info('getAllBundleInfo moduleDirs length [' + data[i].moduleDirs.length + ']'); + for (var j = 0; j < data[i].moduleDirs.length; j++) { + console.info("index[" + i + "]moduleDirs[" + j + "]:" + data[i].moduleDirs[j]); + } + console.info('getAllBundleInfo moduleResPaths length [' + data[i].moduleResPaths.length + ']'); + for (var j = 0; j < data[i].moduleResPaths.length; j++) { + console.info("index[" + i + "]moduleResPaths[" + j + "]:" + data[i].moduleResPaths[j]); + } + console.info('getAllBundleInfo abilityInfo length [' + data[i].abilityInfos.length + ']'); + for (var j = 0; j < data[i].abilityInfos.length; j++) { + console.info("index[" + i + "]abilityInfos[" + j + "]name:" + data[i].abilityInfos[j].name); + console.info("index[" + i + "]abilityInfos[" + j + "]package:" + data[i].abilityInfos[j].package); + } + } +}) +``` + + + +#### getAllBundleInfo(bundleFlag: BundleFlag, callback: AsyncCallback>) + +* 功能说明 + + 获取系统中所有可用的包信息 + +* getAllBundleInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | -------------------------------- | ---- | ------------------------------------------------------------ | + | bundleFlag | 只读 | BundleFlag | 是 | 0:返回默认BundleInfo
1:返回包含abilityInfo的BundleInfo | + | callback | 只读 | AsyncCallback> | 是 | 回调方法 | + +* 返回值 + + void + +* 示例 + +``` +bundle.getAllBundleInfo(0, OnReceiveEvent); + +function OnReceiveEvent(err, data) { + console.info('xxx getAllBundleInfo data length [' + data.length + ']'); + for (var i = 0; i < data.length; i++) { + console.info("index[" + i + "].name: for begin"); + console.info("index[" + i + "].name:" + data[i].name); + console.info("index[" + i + "].label:" + data[i].label); + console.info("index[" + i + "].description:" + data[i].description); + console.info("index[" + i + "].vendor:" + data[i].vendor); + console.info("index[" + i + "].versionCode:" + data[i].versionCode); + console.info("index[" + i + "].versionName:" + data[i].versionName); + console.info("index[" + i + "].jointUserId:" + data[i].jointUserId); + console.info("index[" + i + "].minSdkVersion:" + data[i].minSdkVersion); + console.info("index[" + i + "].maxSdkVersion:" + data[i].maxSdkVersion); + console.info("index[" + i + "].mainEntry:" + data[i].mainEntry); + console.info("index[" + i + "].cpuAbi:" + data[i].cpuAbi); + console.info("index[" + i + "].appId:" + data[i].appId); + console.info("index[" + i + "].compatibleVersion:" + data[i].compatibleVersion); + console.info("index[" + i + "].targetVersion:" + data[i].targetVersion); + console.info("index[" + i + "].releaseType:" + data[i].releaseType); + console.info("index[" + i + "].uid:" + data[i].uid); + console.info("index[" + i + "].gid:" + data[i].gid); + console.info("index[" + i + "].seInfo:" + data[i].seInfo); + console.info("index[" + i + "].entryModuleName:" + data[i].entryModuleName); + console.info("index[" + i + "].isKeepAlive:" + data[i].isKeepAlive); + console.info("index[" + i + "].isNativeApp:" + data[i].isNativeApp); + console.info("index[" + i + "].installTime:" + data[i].installTime); + console.info("index[" + i + "].updateTime:" + data[i].updateTime); + console.info("index[" + i + "].appInfo.name:" + data[i].applicationInfo.name); + console.info("index[" + i + "].appInfo.bundleName:" + data[i].applicationInfo.bundleName); + console.info('getAllBundleInfo reqPermissions length [' + data[i].reqPermissions.length + ']'); + for (var j = 0; j < data[i].reqPermissions.length; j++) { + console.info("index[" + i + "]reqPermissions[" + j + "]:" + data[i].reqPermissions[j]); + } + console.info('getAllBundleInfo defPermissions length [' + data[i].defPermissions.length + ']'); + for (var j = 0; j < data[i].defPermissions.length; j++) { + console.info("index[" + i + "]defPermissions[" + j + "]:" + data[i].defPermissions[j]); + } + + console.info('getAllBundleInfo hapModuleNames length [' + data[i].hapModuleNames.length + ']'); + for (var j = 0; j < data[i].hapModuleNames.length; j++) { + console.info("index[" + i + "]hapModuleNames[" + j + "]:" + data[i].hapModuleNames[j]); + } + console.info('getAllBundleInfo moduleNames length [' + data[i].moduleNames.length + ']'); + for (var j = 0; j < data[i].moduleNames.length; j++) { + console.info("index[" + i + "]moduleNames[" + j + "]:" + data[i].moduleNames[j]); + } + console.info('getAllBundleInfo modulePublicDirs length [' + data[i].modulePublicDirs.length + ']'); + for (var j = 0; j < data[i].modulePublicDirs.length; j++) { + console.info("index[" + i + "]modulePublicDirs[" + j + "]:" + data[i].modulePublicDirs[j]); + } + console.info('getAllBundleInfo moduleDirs length [' + data[i].moduleDirs.length + ']'); + for (var j = 0; j < data[i].moduleDirs.length; j++) { + console.info("index[" + i + "]moduleDirs[" + j + "]:" + data[i].moduleDirs[j]); + } + console.info('getAllBundleInfo moduleResPaths length [' + data[i].moduleResPaths.length + ']'); + for (var j = 0; j < data[i].moduleResPaths.length; j++) { + console.info("index[" + i + "]moduleResPaths[" + j + "]:" + data[i].moduleResPaths[j]); + } + console.info('getAllBundleInfo abilityInfo length [' + data[i].abilityInfos.length + ']'); + for (var j = 0; j < data[i].abilityInfos.length; j++) { + console.info("index[" + i + "]abilityInfos[" + j + "]name:" + data[i].abilityInfos[j].name); + console.info("index[" + i + "]abilityInfos[" + j + "]package:" + data[i].abilityInfos[j].package); + } + } +} +``` + + + +#### getBundleInfo(bundleName: string, bundleFlags: number) + +* 功能说明 + + 根据bundle名称获取BundleInfo + +* getBundleInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------ | ---- | ------------------------------------------------------------ | + | bundleName | 只读 | string | 是 | 包名 | + | bundleFlags | 只读 | number | 是 | 0:返回默认BundleInfo
1:返回包含abilityInfo的BundleInfo | + +* 返回值 + + Promise:返回值为Promise对象,Promise中包含包信息。 + +* 示例 + +``` +bundle.getBundleInfo('com.example.myapplicationInstall', 1).then((data) => { + console.info("name:" + data.name); + console.info("label:" + data.label); + console.info("description:" + data.description); + console.info("vendor:" + data.vendor); + console.info("versionCode:" + data.versionCode); + console.info("versionName:" + data.versionName); + console.info("jointUserId:" + data.jointUserId); + console.info("minSdkVersion:" + data.minSdkVersion); + console.info("maxSdkVersion:" + data.maxSdkVersion); + console.info("mainEntry:" + data.mainEntry); + console.info("cpuAbi:" + data.cpuAbi); + console.info("appId:" + data.appId); + console.info("compatibleVersion:" + data.compatibleVersion); + console.info("targetVersion:" + data.targetVersion); + console.info("releaseType:" + data.releaseType); + console.info("uid:" + data.uid); + console.info("gid:" + data.gid); + console.info("seInfo:" + data.seInfo); + console.info("entryModuleName:" + data.entryModuleName); + console.info("isKeepAlive:" + data.isKeepAlive); + console.info("isNativeApp:" + data.isNativeApp); + console.info("installTime:" + data.installTime); + console.info("updateTime:" + data.updateTime); + console.info("appInfo.name:" + data.applicationInfo.name); + console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); + console.info('getBundleInfo reqPermissions length [' + data.reqPermissions.length + ']'); + for (var j = 0; j < data.reqPermissions.length; j++) { + console.info("reqPermissions[" + j + "]:" + data.reqPermissions[j]); + } + console.info('getBundleInfo defPermissions length [' + data.defPermissions.length + ']'); + for (var j = 0; j < data.defPermissions.length; j++) { + console.info("defPermissions[" + j + "]:" + data.defPermissions[j]); + } + + console.info('getBundleInfo hapModuleNames length [' + data.hapModuleNames.length + ']'); + for (var j = 0; j < data.hapModuleNames.length; j++) { + console.info("hapModuleNames[" + j + "]:" + data.hapModuleNames[j]); + } + console.info('getBundleInfo moduleNames length [' + data.moduleNames.length + ']'); + for (var j = 0; j < data.moduleNames.length; j++) { + console.info("moduleNames[" + j + "]:" + data.moduleNames[j]); + } + console.info('getBundleInfo modulePublicDirs length [' + data.modulePublicDirs.length + ']'); + for (var j = 0; j < data.modulePublicDirs.length; j++) { + console.info("modulePublicDirs[" + j + "]:" + data.modulePublicDirs[j]); + } + console.info('getBundleInfo moduleDirs length [' + data.moduleDirs.length + ']'); + for (var j = 0; j < data.moduleDirs.length; j++) { + console.info("moduleDirs[" + j + "]:" + data.moduleDirs[j]); + } + console.info('getBundleInfo moduleResPaths length [' + data.moduleResPaths.length + ']'); + for (var j = 0; j < data.moduleResPaths.length; j++) { + console.info("moduleResPaths[" + j + "]:" + data.moduleResPaths[j]); + } + console.info('getBundleInfo abilityInfo length [' + data.abilityInfos.length + ']'); + for (var j = 0; j < data.abilityInfos.length; j++) { + console.info("abilityInfos[" + j + "]name:" + data.abilityInfos[j].name); + console.info("abilityInfos[" + j + "]package:" + data.abilityInfos[j].package); + } +}) +``` + + + +#### getBundleInfo(bundleName: string, bundleFlags: number, callback: AsyncCallback) + +* 功能说明 + + 根据bundle名称获取BundleInfo + +* getBundleInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------------------------- | ---- | ------------------------------------------------------------ | + | bundleName | 只读 | string | 是 | 包名 | + | bundleFlags | 只读 | number | 是 | 0:返回默认BundleInfo
1:返回包含abilityInfo的BundleInfo | + | callback | 只读 | AsyncCallback | 是 | 回调方法 | + +* 返回值 + + void + +* 示例 + +``` +bundle.getBundleInfo('com.example.myapplicationInstall', 1, OnReceiveEvent); + +function OnReceiveEvent(err, data) { + console.info("name:" + data.name); + console.info("label:" + data.label); + console.info("description:" + data.description); + console.info("vendor:" + data.vendor); + console.info("versionCode:" + data.versionCode); + console.info("versionName:" + data.versionName); + console.info("jointUserId:" + data.jointUserId); + console.info("minSdkVersion:" + data.minSdkVersion); + console.info("maxSdkVersion:" + data.maxSdkVersion); + console.info("mainEntry:" + data.mainEntry); + console.info("cpuAbi:" + data.cpuAbi); + console.info("appId:" + data.appId); + console.info("compatibleVersion:" + data.compatibleVersion); + console.info("targetVersion:" + data.targetVersion); + console.info("releaseType:" + data.releaseType); + console.info("uid:" + data.uid); + console.info("gid:" + data.gid); + console.info("seInfo:" + data.seInfo); + console.info("entryModuleName:" + data.entryModuleName); + console.info("isKeepAlive:" + data.isKeepAlive); + console.info("isNativeApp:" + data.isNativeApp); + console.info("installTime:" + data.installTime); + console.info("updateTime:" + data.updateTime); + console.info("appInfo.name:" + data.applicationInfo.name); + console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); + console.info('getBundleInfo reqPermissions length [' + data.reqPermissions.length + ']'); + for (var j = 0; j < data.reqPermissions.length; j++) { + console.info("reqPermissions[" + j + "]:" + data.reqPermissions[j]); + } + console.info('getBundleInfo defPermissions length [' + data.defPermissions.length + ']'); + for (var j = 0; j < data.defPermissions.length; j++) { + console.info("defPermissions[" + j + "]:" + data.defPermissions[j]); + } + + console.info('getBundleInfo hapModuleNames length [' + data.hapModuleNames.length + ']'); + for (var j = 0; j < data.hapModuleNames.length; j++) { + console.info("hapModuleNames[" + j + "]:" + data.hapModuleNames[j]); + } + console.info('getBundleInfo moduleNames length [' + data.moduleNames.length + ']'); + for (var j = 0; j < data.moduleNames.length; j++) { + console.info("moduleNames[" + j + "]:" + data.moduleNames[j]); + } + console.info('getBundleInfo modulePublicDirs length [' + data.modulePublicDirs.length + ']'); + for (var j = 0; j < data.modulePublicDirs.length; j++) { + console.info("modulePublicDirs[" + j + "]:" + data.modulePublicDirs[j]); + } + console.info('getBundleInfo moduleDirs length [' + data.moduleDirs.length + ']'); + for (var j = 0; j < data.moduleDirs.length; j++) { + console.info("moduleDirs[" + j + "]:" + data.moduleDirs[j]); + } + console.info('getBundleInfo moduleResPaths length [' + data.moduleResPaths.length + ']'); + for (var j = 0; j < data.moduleResPaths.length; j++) { + console.info("moduleResPaths[" + j + "]:" + data.moduleResPaths[j]); + } + console.info('getBundleInfo abilityInfo length [' + data.abilityInfos.length + ']'); + for (var j = 0; j < data.abilityInfos.length; j++) { + console.info("abilityInfos[" + j + "]name:" + data.abilityInfos[j].name); + console.info("abilityInfos[" + j + "]package:" + data.abilityInfos[j].package); + } +} +``` + + + +#### getAllApplicationInfo(bundleFlags: number, userId: number) + +* 功能说明 + + 获取指定用户下所有已安装的应用信息 + +* getAllApplicationInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------ | ---- | ------------------------------------------------------- | + | bundleFlags | 只读 | number | 是 | 0:返回默认app信息<
8:返回包含permissions的app信息 | + | userId | 只读 | number | 是 | 用户ID | + +* 返回值 + + Promise>:返回值为Promise对象,Promise中包含应用信息列表。 + +* 示例 + +``` +bundle.getAllApplicationInfo(8, 0).then((data) => { + console.info('xxx getAllApplicationInfo data length [' + data.length + ']'); + for (var i = 0; i < data.length; i++) { + console.info("index[" + i + "].name: for begin"); + console.info("index[" + i + "].name:" + data[i].name); + console.info("index[" + i + "].bundleName:" + data[i].bundleName); + console.info("index[" + i + "].description:" + data[i].description); + console.info("index[" + i + "].descriptionId:" + data[i].descriptionId); + console.info("index[" + i + "].iconPath:" + data[i].iconPath); + console.info("index[" + i + "].iconId:" + data[i].iconId); + console.info("index[" + i + "].label:" + data[i].label); + console.info("index[" + i + "].labelId:" + data[i].labelId); + console.info("index[" + i + "].deviceId:" + data[i].deviceId); + console.info("index[" + i + "].signatureKey:" + data[i].signatureKey); + console.info("index[" + i + "].process:" + data[i].process); + console.info("index[" + i + "].isSystemApp:" + data[i].isSystemApp); + console.info("index[" + i + "].isLauncherApp:" + data[i].isLauncherApp); + console.info("index[" + i + "].supportedModes:" + data[i].supportedModes); + + console.info('getAllApplicationInfo Async permissions length [' + data[i].permissions.length + ']'); + for (var j = 0; j < data[i].permissions.length; j++) { + console.info("index[" + i + "]permissions[" + j + "]:" + data[i].permissions[j]); + } + console.info('getAllApplicationInfo Async moduleSourceDirs length [' + data[i].moduleSourceDirs.length + ']'); + for (var j = 0; j < data[i].moduleSourceDirs.length; j++) { + console.info("index[" + i + "]moduleSourceDirs[" + j + "]:" + data[i].moduleSourceDirs[j]); + } + console.info('getAllApplicationInfo Async moduleInfos length [' + data[i].moduleInfos.length + ']'); + for (var j = 0; j < data[i].moduleInfos.length; j++) { + console.info("index[" + i + "]moduleInfos[" + j + "]moduleName:" + data[i].moduleInfos[j].moduleName); + console.info("index[" + i + "]moduleInfos[" + j + "]moduleSourceDir:" + data[i].moduleInfos[j].moduleSourceDir); + } + console.info("index[" + i + "].entryDir:" + data[i].entryDir); + console.info("index[" + i + "].codePath:" + data[i].codePath); + console.info("index[" + i + "].dataDir:" + data[i].dataDir); + console.info("index[" + i + "].dataBaseDir:" + data[i].dataBaseDir); + console.info("index[" + i + "].cacheDir:" + data[i].cacheDir); + } +}) +``` + + + +#### getAllApplicationInfo(bundleFlags: number, userId: number, callback: AsyncCallback>) + +* 功能说明 + + 获取指定用户下所有已安装的应用信息 + +* getAllApplicationInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------------------------------------- | ---- | ------------------------------------------------------- | + | bundleFlags | 只读 | number | 是 | 0:返回默认app信息<
8:返回包含permissions的app信息 | + | userId | 只读 | number | 是 | 用户ID | + | callback | 只读 | AsyncCallback> | 是 | 回调方法 | + +* 返回值 + + void + +* 示例 + +``` +bundle.getAllApplicationInfo(8, 0, OnReceiveEvent); + +function OnReceiveEvent(err, data) { + console.info('xxx getAllApplicationInfo data length [' + data.length + ']'); + for (var i = 0; i < data.length; i++) { + console.info("index[" + i + "].name: for begin"); + console.info("index[" + i + "].name:" + data[i].name); + console.info("index[" + i + "].bundleName:" + data[i].bundleName); + console.info("index[" + i + "].description:" + data[i].description); + console.info("index[" + i + "].descriptionId:" + data[i].descriptionId); + console.info("index[" + i + "].iconPath:" + data[i].iconPath); + console.info("index[" + i + "].iconId:" + data[i].iconId); + console.info("index[" + i + "].label:" + data[i].label); + console.info("index[" + i + "].labelId:" + data[i].labelId); + console.info("index[" + i + "].deviceId:" + data[i].deviceId); + console.info("index[" + i + "].signatureKey:" + data[i].signatureKey); + console.info("index[" + i + "].process:" + data[i].process); + console.info("index[" + i + "].isSystemApp:" + data[i].isSystemApp); + console.info("index[" + i + "].isLauncherApp:" + data[i].isLauncherApp); + console.info("index[" + i + "].supportedModes:" + data[i].supportedModes); + + console.info('getAllApplicationInfo Async permissions length [' + data[i].permissions.length + ']'); + for (var j = 0; j < data[i].permissions.length; j++) { + console.info("index[" + i + "]permissions[" + j + "]:" + data[i].permissions[j]); + } + console.info('getAllApplicationInfo Async moduleSourceDirs length [' + data[i].moduleSourceDirs.length + ']'); + for (var j = 0; j < data[i].moduleSourceDirs.length; j++) { + console.info("index[" + i + "]moduleSourceDirs[" + j + "]:" + data[i].moduleSourceDirs[j]); + } + console.info('getAllApplicationInfo Async moduleInfos length [' + data[i].moduleInfos.length + ']'); + for (var j = 0; j < data[i].moduleInfos.length; j++) { + console.info("index[" + i + "]moduleInfos[" + j + "]moduleName:" + data[i].moduleInfos[j].moduleName); + console.info("index[" + i + "]moduleInfos[" + j + "]moduleSourceDir:" + data[i].moduleInfos[j].moduleSourceDir); + } + console.info("index[" + i + "].entryDir:" + data[i].entryDir); + console.info("index[" + i + "].codePath:" + data[i].codePath); + console.info("index[" + i + "].dataDir:" + data[i].dataDir); + console.info("index[" + i + "].dataBaseDir:" + data[i].dataBaseDir); + console.info("index[" + i + "].cacheDir:" + data[i].cacheDir); + } +} +``` + + + +#### queryAbilityByWant(want: Want, bundleFlags: number, userId: number) + +* 功能说明 + + 通过Want获取对应的Ability信息 + +* queryAbilityInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------ | ---- | ------------------------------------------------------------ | + | want | 只读 | Want | 是 | 指定Want信息 | + | bundleFlags | 只读 | number | 是 | 0:返回默认BundleInfo
1:返回包含abilityInfo的BundleInfo | + | userId | 只读 | number | 是 | 用户ID | + +* Want类型说明 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | + | elementName | 只读 | ElementName | 是 | 表示运行指定Ability的ElementName。 | + | uri | 只读 | string | 否 | 表示Uri描述。 | + | flags | 只读 | int | 否 | Ability的flag,表示处理Want的方式。 | + | type | 只读 | string | 否 | Want中的type属性是指由Want的URI所指示的资源的MIME类型。 | + | action | 只读 | string | 否 | 表示动作,通常使用系统预置Action,应用也可以自定义Action。 | + | want_param | 只读 | {[key: string]: any} | 否 | want_param是一种支持自定义的数据结构,开发者可以通过want_param传递某些请求所需的额外信息。 | + | entities | 只读 | Array | 否 | 表示类别,通常使用系统预置Entity,应用也可以自定义Entity。 | + +* ElementName类型说明 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------ | ---- | ------------------------------------------------------------ | + | deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。 | + | bundleName | 只读 | string | 是 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | + | abilityName | 只读 | string | 是 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | + +* 返回值 + + Promise>:返回值为Promise对象,Promise中包含Ability信息。 + +* 示例 + +``` +bundle.queryAbilityByWant({ + want: { + action: "action.system.home", + entities: ["entity.system.home"], + elementName: { + deviceId: "0", + bundleName: "com.example.myapplicationInstall", + abilityName: "com.example.myapplication.MainAbility", + }, + } +}, 1, 0, +}).then((data) => { + console.info("name:" + data.name); + console.info("label:" + data.label); + console.info("description:" + data.description); + console.info("iconPath:" + data.iconPath); + console.info("visible:" + data.visible); + console.info("kind:" + data.kind); + console.info("uri:" + data.uri); + console.info("process:" + data.process); + console.info("package:" + data.package); + console.info("bundleName:" + data.bundleName); + console.info("moduleName:" + data.moduleName); + console.info("applicationName:" + data.applicationName); + console.info("deviceId:" + data.deviceId); + console.info("codePath:" + data.codePath); + console.info("resourcePath:" + data.resourcePath); + console.info("libPath:" + data.libPath); + + console.info('queryAbilityInfo permissions length [' + data.permissions.length + ']'); + for (var j = 0; j < data.permissions.length; j++) { + console.info("permissions[" + j + "]:" + data.permissions[j]); + } + console.info('queryAbilityInfo deviceTypes length [' + data.deviceTypes.length + ']'); + for (var j = 0; j < data.deviceTypes.length; j++) { + console.info("deviceTypes[" + j + "]:" + data.deviceTypes[j]); + } + console.info('queryAbilityInfo deviceCapabilities length [' + data.deviceCapabilities.length + ']'); + for (var j = 0; j < data.deviceCapabilities.length; j++) { + console.info("deviceCapabilities[" + j + "]:" + data.deviceCapabilities[j]); + } + console.info("appInfo.name:" + data.applicationInfo.name); + console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); + // ability type: 0:UNKNOWN, 1:PAGE, 2:SERVICE, 3:DATA + console.info("type:" + data.type); + // orientation: 0:UNSPECIFIED, 1:LANDSCAPE, 2:PORTRAIT, 3:FOLLOWRECENT, + console.info("orientation:" + data.orientation); + // launchMode: 0:SINGLETON, 1:SINGLETOP, 2:STANDARD + console.info("launchMode:" + data.launchMode); + + // the enum of AbilityType + console.info("AbilityType:" + bundle.AbilityType.UNKNOWN); + console.info("AbilityType:" + bundle.AbilityType.PAGE); + console.info("AbilityType:" + bundle.AbilityType.SERVICE); + console.info("AbilityType:" + bundle.AbilityType.DATA); + if (data.type == bundle.AbilityType.PAGE) { + console.info("this AbilityType is PAGE"); + } + // the enum of DisplayOrientation + console.info("DisplayOrientation:" + bundle.DisplayOrientation.UNSPECIFIED); + console.info("DisplayOrientation:" + bundle.DisplayOrientation.LANDSCAPE); + console.info("DisplayOrientation:" + bundle.DisplayOrientation.PORTRAIT); + console.info("DisplayOrientation:" + bundle.DisplayOrientation.FOLLOWRECENT); + if (data.orientation == bundle.DisplayOrientation.UNSPECIFIED) { + console.info("this DisplayOrientation is UNSPECIFIED"); + } + // the enum of LaunchMode + console.info("LaunchMode:" + bundle.LaunchMode.SINGLETON); + console.info("LaunchMode:" + bundle.LaunchMode.SINGLETOP); + console.info("LaunchMode:" + bundle.LaunchMode.STANDARD); + if (data.launchMode == bundle.LaunchMode.STANDARD) { + console.info("this LaunchMode is STANDARD"); + } + +}) +``` + + + +#### queryAbilityByWant(want: Want, bundleFlags: number, userId: number, callback: AsyncCallback>) + +* 功能说明 + + 通过Want获取对应的Ability信息 + +* queryAbilityInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | --------------------------------- | ---- | ------------------------------------------------------------ | + | want | 只读 | Want | 是 | 指定Want信息 | + | bundleFlags | 只读 | number | 是 | 0:返回默认BundleInfo
1:返回包含abilityInfo的BundleInfo | + | userId | 只读 | number | 是 | 用户ID | + | callback | 只读 | AsyncCallback> | 是 | 回调方法 | + +* Want类型说明 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | -------------------- | ---- | ------------------------------------------------------------ | + | elementName | 只读 | ElementName | 是 | 表示运行指定Ability的ElementName。 | + | uri | 只读 | string | 否 | 表示Uri描述。 | + | flags | 只读 | int | 否 | Ability的flag,表示处理Want的方式。 | + | type | 只读 | string | 否 | Want中的type属性是指由Want的URI所指示的资源的MIME类型。 | + | action | 只读 | string | 否 | 表示动作,通常使用系统预置Action,应用也可以自定义Action。 | + | want_param | 只读 | {[key: string]: any} | 否 | want_param是一种支持自定义的数据结构,开发者可以通过want_param传递某些请求所需的额外信息。 | + | entities | 只读 | Array | 否 | 表示类别,通常使用系统预置Entity,应用也可以自定义Entity。 | + +* ElementName类型说明 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------ | ---- | ------------------------------------------------------------ | + | deviceId | 只读 | string | 否 | 表示运行指定Ability的设备ID。 | + | bundleName | 只读 | string | 是 | 表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | + | abilityName | 只读 | string | 是 | 表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。 | + +* 返回值 + + void + +* 示例 + +``` +bundle.queryAbilityByWant( + { + want: { + action: "action.system.home", + entities: ["entity.system.home"], + elementName: { + deviceId: "0", + bundleName: "com.example.myapplicationInstall", + abilityName: "com.example.myapplication.MainAbility", + }, + } + }, 1, 0, + }, OnReceiveEvent); + +function OnReceiveEvent(err, data) { + console.info("name:" + data.name); + console.info("label:" + data.label); + console.info("description:" + data.description); + console.info("iconPath:" + data.iconPath); + console.info("visible:" + data.visible); + console.info("kind:" + data.kind); + console.info("uri:" + data.uri); + console.info("process:" + data.process); + console.info("package:" + data.package); + console.info("bundleName:" + data.bundleName); + console.info("moduleName:" + data.moduleName); + console.info("applicationName:" + data.applicationName); + console.info("deviceId:" + data.deviceId); + console.info("codePath:" + data.codePath); + console.info("resourcePath:" + data.resourcePath); + console.info("libPath:" + data.libPath); + + console.info('queryAbilityInfo permissions length [' + data.permissions.length + ']'); + for (var j = 0; j < data.permissions.length; j++) { + console.info("permissions[" + j + "]:" + data.permissions[j]); + } + console.info('queryAbilityInfo deviceTypes length [' + data.deviceTypes.length + ']'); + for (var j = 0; j < data.deviceTypes.length; j++) { + console.info("deviceTypes[" + j + "]:" + data.deviceTypes[j]); + } + console.info('queryAbilityInfo deviceCapabilities length [' + data.deviceCapabilities.length + ']'); + for (var j = 0; j < data.deviceCapabilities.length; j++) { + console.info("deviceCapabilities[" + j + "]:" + data.deviceCapabilities[j]); + } + console.info("appInfo.name:" + data.applicationInfo.name); + console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); + // ability type: 0:UNKNOWN, 1:PAGE, 2:SERVICE, 3:DATA + console.info("type:" + data.type); + // orientation: 0:UNSPECIFIED, 1:LANDSCAPE, 2:PORTRAIT, 3:FOLLOWRECENT, + console.info("orientation:" + data.orientation); + // launchMode: 0:SINGLETON, 1:SINGLETOP, 2:STANDARD + console.info("launchMode:" + data.launchMode); + + // the enum of AbilityType + console.info("AbilityType:" + bundle.AbilityType.UNKNOWN); + console.info("AbilityType:" + bundle.AbilityType.PAGE); + console.info("AbilityType:" + bundle.AbilityType.SERVICE); + console.info("AbilityType:" + bundle.AbilityType.DATA); + if (data.type == bundle.AbilityType.PAGE) { + console.info("this AbilityType is PAGE"); + } + // the enum of DisplayOrientation + console.info("DisplayOrientation:" + bundle.DisplayOrientation.UNSPECIFIED); + console.info("DisplayOrientation:" + bundle.DisplayOrientation.LANDSCAPE); + console.info("DisplayOrientation:" + bundle.DisplayOrientation.PORTRAIT); + console.info("DisplayOrientation:" + bundle.DisplayOrientation.FOLLOWRECENT); + if (data.orientation == bundle.DisplayOrientation.UNSPECIFIED) { + console.info("this DisplayOrientation is UNSPECIFIED"); + } + // the enum of LaunchMode + console.info("LaunchMode:" + bundle.LaunchMode.SINGLETON); + console.info("LaunchMode:" + bundle.LaunchMode.SINGLETOP); + console.info("LaunchMode:" + bundle.LaunchMode.STANDARD); + if (data.launchMode == bundle.LaunchMode.STANDARD) { + console.info("this LaunchMode is STANDARD"); + } +} +``` + + + +#### getPermissionDef(permissionName: string) + +* 功能说明 + + 获取指定权限的详细信息 + +* getPermissionDef参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------------- | -------- | ------ | ---- | ------ | + | permissionName | 只读 | string | 是 | 权限名 | + +* 返回值 + + Promise:返回值为bundle信息。 + +* 示例 + +``` +bundle.getPermissionDef('com.permission.CAMERA').then((data) => { + console.info("permissionName:" + data.permissionName); + console.info("bundleName:" + data.bundleName); + console.info("grantMode:" + data.grantMode); + console.info("availableScope:" + data.availableScope); + console.info("label:" + data.label); + console.info("labelId:" + data.labelId); +}) +``` + + + +#### getPermissionDef(permissionName: string, callback: AsyncCallback) + +* 功能说明 + + 获取指定权限的详细信息 + +* getPermissionDef参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------------- | -------- | ---------------------------- | ---- | -------- | + | permissionName | 只读 | string | 是 | 权限名 | + | callback | 只读 | AsyncCallback | 是 | 回调方法 | + +* 返回值 + + void + +* 示例 + +``` +bundle.getBundleInstaller().then((data) => { + data.getPermissionDef('com.permission.CAMERA', OnReceiveEvent); + + function OnReceiveEvent(err, data) { + console.info("permissionName:" + data.permissionName); + console.info("bundleName:" + data.bundleName); + console.info("grantMode:" + data.grantMode); + console.info("availableScope:" + data.availableScope); + console.info("label:" + data.label); + console.info("labelId:" + data.labelId); + } +}) +``` + + + +#### getBundleArchiveInfo(hapFilePath: string, bundleFlags: number) + +* 功能说明 + + 获取HAP包含的应用包信息 + +* getBundleArchiveInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------ | ---- | ------------------------------------------------------------ | + | hapFilePath | 只读 | string | 是 | hap包文件路径 | + | bundleFlags | 只读 | number | 是 | 0:返回默认BundleInfo
1:返回包含abilityInfo的BundleInfo | + +* 返回值 + + Promise:返回值为bundle信息。 + +* 示例 + +``` +bundle.getBundleArchiveInfo('/data/test.hap', 1).then((data) => { + console.info("name:" + data.name); + console.info("label:" + data.label); + console.info("description:" + data.description); + console.info("vendor:" + data.vendor); + console.info("versionCode:" + data.versionCode); + console.info("versionName:" + data.versionName); + console.info("jointUserId:" + data.jointUserId); + console.info("minSdkVersion:" + data.minSdkVersion); + console.info("maxSdkVersion:" + data.maxSdkVersion); + console.info("mainEntry:" + data.mainEntry); + console.info("cpuAbi:" + data.cpuAbi); + console.info("appId:" + data.appId); + console.info("compatibleVersion:" + data.compatibleVersion); + console.info("targetVersion:" + data.targetVersion); + console.info("releaseType:" + data.releaseType); + console.info("uid:" + data.uid); + console.info("gid:" + data.gid); + console.info("seInfo:" + data.seInfo); + console.info("entryModuleName:" + data.entryModuleName); + console.info("isKeepAlive:" + data.isKeepAlive); + console.info("isNativeApp:" + data.isNativeApp); + console.info("installTime:" + data.installTime); + console.info("updateTime:" + data.updateTime); + console.info("appInfo.name:" + data.applicationInfo.name); + console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); + console.info('getBundleArchiveInfo reqPermissions length [' + data.reqPermissions.length + ']'); + for (var j = 0; j < data.reqPermissions.length; j++) { + console.info("reqPermissions[" + j + "]:" + data.reqPermissions[j]); + } + console.info('getBundleArchiveInfo defPermissions length [' + data.defPermissions.length + ']'); + for (var j = 0; j < data.defPermissions.length; j++) { + console.info("defPermissions[" + j + "]:" + data.defPermissions[j]); + } + console.info('getBundleArchiveInfo hapModuleNames length [' + data.hapModuleNames.length + ']'); + for (var j = 0; j < data.hapModuleNames.length; j++) { + console.info("hapModuleNames[" + j + "]:" + data.hapModuleNames[j]); + } + console.info('getBundleArchiveInfo moduleNames length [' + data.moduleNames.length + ']'); + for (var j = 0; j < data.moduleNames.length; j++) { + console.info("moduleNames[" + j + "]:" + data.moduleNames[j]); + } + console.info('getBundleArchiveInfo modulePublicDirs length [' + data.modulePublicDirs.length + ']'); + for (var j = 0; j < data.modulePublicDirs.length; j++) { + console.info("modulePublicDirs[" + j + "]:" + data.modulePublicDirs[j]); + } + console.info('getBundleArchiveInfo moduleDirs length [' + data.moduleDirs.length + ']'); + for (var j = 0; j < data.moduleDirs.length; j++) { + console.info("moduleDirs[" + j + "]:" + data.moduleDirs[j]); + } + console.info('getBundleArchiveInfo moduleResPaths length [' + data.moduleResPaths.length + ']'); + for (var j = 0; j < data.moduleResPaths.length; j++) { + console.info("moduleResPaths[" + j + "]:" + data.moduleResPaths[j]); + } + console.info('getBundleArchiveInfo abilityInfo length [' + data.abilityInfos.length + ']'); + for (var j = 0; j < data.abilityInfos.length; j++) { + console.info("abilityInfos[" + j + "]name:" + data.abilityInfos[j].name); + console.info("abilityInfos[" + j + "]package:" + data.abilityInfos[j].package); + } +}) +``` + + + +#### getBundleArchiveInfo(hapFilePath: string, bundleFlags: number, callback: AsyncCallback) + +* 功能说明 + + 获取HAP包含的应用包信息 + +* getBundleArchiveInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ----------- | -------- | ------------------------- | ---- | ------------------------------------------------------------ | + | hapFilePath | 只读 | string | 是 | hap包文件路径 | + | bundleFlags | 只读 | number | 是 | 0:返回默认BundleInfo
1:返回包含abilityInfo的BundleInfo | + | callback | 只读 | AsyncCallback | 是 | 回调方法 | + +* 返回值 + + void + +* 示例 + +``` +bundle.getBundleArchiveInfo('/data/test.hap', 1, OnReceiveEvent); + +function OnReceiveEvent(err, data) { + console.info("name:" + data.name); + console.info("label:" + data.label); + console.info("description:" + data.description); + console.info("vendor:" + data.vendor); + console.info("versionCode:" + data.versionCode); + console.info("versionName:" + data.versionName); + console.info("jointUserId:" + data.jointUserId); + console.info("minSdkVersion:" + data.minSdkVersion); + console.info("maxSdkVersion:" + data.maxSdkVersion); + console.info("mainEntry:" + data.mainEntry); + console.info("cpuAbi:" + data.cpuAbi); + console.info("appId:" + data.appId); + console.info("compatibleVersion:" + data.compatibleVersion); + console.info("targetVersion:" + data.targetVersion); + console.info("releaseType:" + data.releaseType); + console.info("uid:" + data.uid); + console.info("gid:" + data.gid); + console.info("seInfo:" + data.seInfo); + console.info("entryModuleName:" + data.entryModuleName); + console.info("isKeepAlive:" + data.isKeepAlive); + console.info("isNativeApp:" + data.isNativeApp); + console.info("installTime:" + data.installTime); + console.info("updateTime:" + data.updateTime); + console.info("appInfo.name:" + data.applicationInfo.name); + console.info("appInfo.bundleName:" + data.applicationInfo.bundleName); + console.info('getBundleArchiveInfo reqPermissions length [' + data.reqPermissions.length + ']'); + for (var j = 0; j < data.reqPermissions.length; j++) { + console.info("reqPermissions[" + j + "]:" + data.reqPermissions[j]); + } + console.info('getBundleArchiveInfo defPermissions length [' + data.defPermissions.length + ']'); + for (var j = 0; j < data.defPermissions.length; j++) { + console.info("defPermissions[" + j + "]:" + data.defPermissions[j]); + } + console.info('getBundleArchiveInfo hapModuleNames length [' + data.hapModuleNames.length + ']'); + for (var j = 0; j < data.hapModuleNames.length; j++) { + console.info("hapModuleNames[" + j + "]:" + data.hapModuleNames[j]); + } + console.info('getBundleArchiveInfo moduleNames length [' + data.moduleNames.length + ']'); + for (var j = 0; j < data.moduleNames.length; j++) { + console.info("moduleNames[" + j + "]:" + data.moduleNames[j]); + } + console.info('getBundleArchiveInfo modulePublicDirs length [' + data.modulePublicDirs.length + ']'); + for (var j = 0; j < data.modulePublicDirs.length; j++) { + console.info("modulePublicDirs[" + j + "]:" + data.modulePublicDirs[j]); + } + console.info('getBundleArchiveInfo moduleDirs length [' + data.moduleDirs.length + ']'); + for (var j = 0; j < data.moduleDirs.length; j++) { + console.info("moduleDirs[" + j + "]:" + data.moduleDirs[j]); + } + console.info('getBundleArchiveInfo moduleResPaths length [' + data.moduleResPaths.length + ']'); + for (var j = 0; j < data.moduleResPaths.length; j++) { + console.info("moduleResPaths[" + j + "]:" + data.moduleResPaths[j]); + } + console.info('getBundleArchiveInfo abilityInfo length [' + data.abilityInfos.length + ']'); + for (var j = 0; j < data.abilityInfos.length; j++) { + console.info("abilityInfos[" + j + "]name:" + data.abilityInfos[j].name); + console.info("abilityInfos[" + j + "]package:" + data.abilityInfos[j].package); + } +} +``` + + + +#### install(bundleFilePaths: Array, param: InstallParam, callback: AsyncCallback) + +* 功能说明 + + 安装hap包 + +* install参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | --------------- | -------- | ---------------------------- | ---- | ------------------------------------------------------------ | + | bundleFilePaths | 只读 | Array | 是 | 安装用包路径 | + | param | 只读 | InstallParam | 是 | userId:用户ID
installFlag:安装标识。
NORMAL:安装/卸载
REPLACE_EXISTING:更新
isKeepData:卸载时是否保留运行时数据 | + | callback | 只读 | AsyncCallback | 是 | 回调方法 | + +* 返回值 + + void + +* InstallStatus类型说明 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------- | -------- | ---------------- | ---- | ------------------------------------------------------------ | + | status | 只读 | InstallErrorCode | 是 | 安装结果code
SUCCESS = 0
STATUS_INSTALL_FAILURE = 1
STATUS_INSTALL_FAILURE_ABORTED = 2,
STATUS_INSTALL_FAILURE_INVALID = 3
STATUS_INSTALL_FAILURE_CONFLICT = 4
STATUS_INSTALL_FAILURE_STORAGE = 5
STATUS_INSTALL_FAILURE_INCOMPATIBLE = 6
STATUS_INSTALL_FAILURE_DOWNLOAD_TIMEOUT = 0x0B
STATUS_INSTALL_FAILURE_DOWNLOAD_FAILED = 0x0C
STATUS_ABILITY_NOT_FOUND = 0x40
STATUS_BMS_SERVICE_ERROR = 0x41 | + | statusMessage | 只读 | string | 是 | 安装结果Message | + +* 示例 + +``` +bundle.getBundleInstaller().then((data) => { + data.install(['/data/test.hap'], { + param: { + userId: 0, + isKeepData: false + } + }, OnReceiveinstallEvent); + + function OnReceiveinstallEvent(err, data) { + console.info("name: for begin"); + console.info("install result code:" + data.status); + console.info("install result msg:" + data.statusMessage); + } +}) +``` + + + +#### uninstall(bundleName: string, param: InstallParam, callback: AsyncCallback) + +* 功能说明 + + 卸载hap包 + +* uninstall参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | ---------------------------- | ---- | ------------------------------------------------------------ | + | bundleName | 只读 | string | 是 | 卸载用包名 | + | param | 只读 | InstallParam | 是 | userId:用户ID
installFlag:安装标识。
NORMAL:安装/卸载
REPLACE_EXISTING:更新
isKeepData:卸载时是否保留运行时数据 | + | callback | 只读 | AsyncCallback | 是 | 回调方法 | + +* 返回值 + + void + +* InstallStatus类型说明 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------- | -------- | ---------------- | ---- | ------------------------------------------------------------ | + | status | 只读 | InstallErrorCode | 是 | 卸载结果code
SUCCESS = 0
STATUS_UNINSTALL_FAILURE = 7
STATUS_UNINSTALL_FAILURE_BLOCKED = 8
STATUS_UNINSTALL_FAILURE_ABORTED = 9,
STATUS_UNINSTALL_FAILURE_CONFLICT = 10
STATUS_ABILITY_NOT_FOUND = 0x40
STATUS_BMS_SERVICE_ERROR = 0x41 | + | statusMessage | 只读 | string | 是 | 卸载结果Message | + +* 示例 + +``` +bundle.getBundleInstaller().then((data) => { + data.uninstall('com.example.myapplication', { + param: { + userId: 0, + isKeepData: false + } + }, OnReceiveinstallEvent); + + function OnReceiveinstallEvent(err, data) { + console.info("name: for begin"); + console.info("uninstall result code:" + data.status); + console.info("uninstall result msg:" + data.statusMessage); + } +}) +``` + + + +#### getAllShortcutInfo(bundleName: string) + +* 功能说明 + + 获取指定bundle名的shortcut信息 + +* getAllShortcutInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | ------ | ---- | -------- | + | bundleName | 只读 | string | 是 | bundle名 | + +* 返回值 + + Promise:返回值为bundle信息。 + +* 示例 + +``` +bundle.getAllShortcutInfo('com.example.third1').then((data) => { + ... +}); +``` + + + +#### getAllShortcutInfo(bundleName: string, callback: AsyncCallback>) + +* 功能说明 + + 获取指定bundle名的shortcut信息 + +* getAllShortcutInfo参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | --------------------------- | ---- | -------- | + | bundleName | 只读 | string | 是 | bundle名 | + | callback | 只读 | AsyncCallback | 是 | 回调方法 | + +* 返回值 + + void + +* 示例 + +``` +bundle.getAllShortcutInfo('com.example.third1', OnReceiveEvent); + +function OnReceiveEvent(err, data) { + ... +} +``` + + + +#### checkPermission(bundleName: string, permission: string) + +* 功能说明 + + 获取指定最大记录数的Usage信息 + +* checkPermission参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | ------ | ---- | -------- | + | bundleName | 只读 | string | 是 | bundle名 | + | permission | 只读 | string | 是 | 权限名 | + +* 返回值 + + Promise:返回值为bundle信息。 + +* 示例 + +``` +bundle.getModuleUsageRecords('com.example.actsbmscheckpermissiontest', 'com.permission.CAMERA').then((data) => { + ... +}); +``` + + + +#### checkPermission(bundleName: string, permission: string, callback: AsyncCallback) + +* 功能说明 + + 获取指定最大记录数的Usage信息 + +* checkPermission参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | -------------------------- | ---- | -------- | + | bundleName | 只读 | string | 是 | bundle名 | + | permission | 只读 | string | 是 | 权限名 | + | callback | 只读 | AsyncCallback | 是 | 回调方法 | + +* 返回值 + + void + +* 示例 + +``` +bundle.checkPermission('com.example.actsbmscheckpermissiontest', 'com.permission.CAMERA', OnReceiveEvent); + +function OnReceiveEvent(err, data) { + ... +} +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/06.CommonEvent\346\250\241\345\235\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/06.CommonEvent\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..878bcc2e171748f446f3eeadc044cc963de059d6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/06.CommonEvent\346\250\241\345\235\227.md" @@ -0,0 +1,521 @@ +--- +title: CommonEvent模块 +permalink: /pages/000b000005 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# CommonEvent模块(JS端SDK接口) + +#### 支持设备 + +| API | 手机 | 平板 | 智慧屏 | 智能穿戴 | 轻量级智能穿戴 | +| ------------------------------------------------------------ | ---- | ---- | ------ | -------- | -------------- | +| CommonEvent.publish(event: string, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | +| CommonEvent.publish(event: string, options: CommonEventPublishData, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | +| CommonEvent.createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | +| CommonEvent.createSubscriber(subscribeInfo: CommonEventSubscribeInfo) | 支持 | 支持 | 支持 | 支持 | 不支持 | +| CommonEvent.subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | +| CommonEvent.unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | + +#### 权限列表 + +| 系统公共事件宏 | 系统公共事件名称 | 订阅者所需权限 | +| ------------------------------------------------------------ | ----------------------------------------------------------- | ------------------------------------------------------------ | +| COMMON_EVENT_BOOT_COMPLETED | usual.event.BOOT_COMPLETED | ohos.permission.RECEIVER_STARTUP_COMPLETED | +| COMMON_EVENT_LOCKED_BOOT_COMPLETED | usual.event.LOCKED_BOOT_COMPLETED | ohos.permission.RECEIVER_STARTUP_COMPLETED | +| COMMON_EVENT_SHUTDOWN | usual.event.SHUTDOWN | 无 | +| COMMON_EVENT_BATTERY_CHANGED | usual.event.BATTERY_CHANGED | 无 | +| COMMON_EVENT_BATTERY_LOW | usual.event.BATTERY_LOW | 无 | +| COMMON_EVENT_BATTERY_OKAY | usual.event.BATTERY_OKAY | 无 | +| COMMON_EVENT_POWER_CONNECTED | usual.event.POWER_CONNECTED | 无 | +| COMMON_EVENT_POWER_DISCONNECTED | usual.event.POWER_DISCONNECTED | 无 | +| COMMON_EVENT_SCREEN_OFF | usual.event.SCREEN_OFF | 无 | +| COMMON_EVENT_SCREEN_ON | usual.event.SCREEN_ON | 无 | +| COMMON_EVENT_USER_PRESENT | usual.event.USER_PRESENT | 无 | +| COMMON_EVENT_TIME_TICK | usual.event.TIME_TICK | 无 | +| COMMON_EVENT_TIME_CHANGED | usual.event.TIME_CHANGED | 无 | +| COMMON_EVENT_DATE_CHANGED | usual.event.DATE_CHANGED | 无 | +| COMMON_EVENT_TIMEZONE_CHANGED | usual.event.TIMEZONE_CHANGED | 无 | +| COMMON_EVENT_CLOSE_SYSTEM_DIALOGS | usual.event.CLOSE_SYSTEM_DIALOGS | 无 | +| COMMON_EVENT_PACKAGE_ADDED | usual.event.PACKAGE_ADDED | 无 | +| COMMON_EVENT_PACKAGE_REPLACED | usual.event.PACKAGE_REPLACED | 无 | +| COMMON_EVENT_MY_PACKAGE_REPLACED | usual.event.MY_PACKAGE_REPLACED | 无 | +| COMMON_EVENT_PACKAGE_REMOVED | usual.event.PACKAGE_REMOVED | 无 | +| COMMON_EVENT_PACKAGE_FULLY_REMOVED | usual.event.PACKAGE_FULLY_REMOVED | 无 | +| COMMON_EVENT_PACKAGE_CHANGED | usual.event.PACKAGE_CHANGED | 无 | +| COMMON_EVENT_PACKAGE_RESTARTED | usual.event.PACKAGE_RESTARTED | 无 | +| COMMON_EVENT_PACKAGE_DATA_CLEARED | usual.event.PACKAGE_DATA_CLEARED | 无 | +| COMMON_EVENT_PACKAGES_SUSPENDED | usual.event.PACKAGES_SUSPENDED | 无 | +| COMMON_EVENT_PACKAGES_UNSUSPENDED | usual.event.PACKAGES_UNSUSPENDED | 无 | +| COMMON_EVENT_MY_PACKAGE_SUSPENDED | usual.event.MY_PACKAGE_SUSPENDED | 无 | +| COMMON_EVENT_MY_PACKAGE_UNSUSPENDED | usual.event.MY_PACKAGE_UNSUSPENDED | 无 | +| COMMON_EVENT_UID_REMOVED | usual.event.UID_REMOVED | 无 | +| COMMON_EVENT_PACKAGE_FIRST_LAUNCH | usual.event.PACKAGE_FIRST_LAUNCH | 无 | +| COMMON_EVENT_PACKAGE_NEEDS_VERIFICATION | usual.event.PACKAGE_NEEDS_VERIFICATION | 无 | +| COMMON_EVENT_PACKAGE_VERIFIED | usual.event.PACKAGE_VERIFIED | 无 | +| COMMON_EVENT_EXTERNAL_APPLICATIONS_AVAILABLE | usual.event.EXTERNAL_APPLICATIONS_AVAILABLE | 无 | +| COMMON_EVENT_EXTERNAL_APPLICATIONS_UNAVAILABLE | usual.event.EXTERNAL_APPLICATIONS_UNAVAILABLE | 无 | +| COMMON_EVENT_CONFIGURATION_CHANGED | usual.event.CONFIGURATION_CHANGED | 无 | +| COMMON_EVENT_LOCALE_CHANGED | usual.event.LOCALE_CHANGED | 无 | +| COMMON_EVENT_MANAGE_PACKAGE_STORAGE | usual.event.MANAGE_PACKAGE_STORAGE | 无 | +| COMMON_EVENT_DRIVE_MODE | common.event.DRIVE_MODE | 无 | +| COMMON_EVENT_HOME_MODE | common.event.HOME_MODE | 无 | +| COMMON_EVENT_OFFICE_MODE | common.event.OFFICE_MODE | 无 | +| COMMON_EVENT_USER_STARTED | usual.event.USER_STARTED | 无 | +| COMMON_EVENT_USER_BACKGROUND | usual.event.USER_BACKGROUND | 无 | +| COMMON_EVENT_USER_FOREGROUND | usual.event.USER_FOREGROUND | 无 | +| COMMON_EVENT_USER_SWITCHED | usual.event.USER_SWITCHED | ohos.permission.MANAGE_USERS | +| COMMON_EVENT_USER_STARTING | usual.event.USER_STARTING | ohos.permission.INTERACT_ACROSS_USERS | +| COMMON_EVENT_USER_UNLOCKED | usual.event.USER_UNLOCKED | 无 | +| COMMON_EVENT_USER_STOPPING | usual.event.USER_STOPPING | ohos.permission.INTERACT_ACROSS_USERS | +| COMMON_EVENT_USER_STOPPED | usual.event.USER_STOPPED | 无 | +| COMMON_EVENT_HWID_LOGIN | common.event.HWID_LOGIN | 无 | +| COMMON_EVENT_HWID_LOGOUT | common.event.HWID_LOGOUT | 无 | +| COMMON_EVENT_HWID_TOKEN_INVALID | common.event.HWID_TOKEN_INVALID | 无 | +| COMMON_EVENT_HWID_LOGOFF | common.event.HWID_LOGOFF | 无 | +| COMMON_EVENT_WIFI_POWER_STATE | usual.event.wifi.POWER_STATE | 无 | +| COMMON_EVENT_WIFI_SCAN_FINISHED | usual.event.wifi.SCAN_FINISHED | ohos.permission.LOCATION | +| COMMON_EVENT_WIFI_RSSI_VALUE | usual.event.wifi.RSSI_VALUE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_CONN_STATE | usual.event.wifi.CONN_STATE | 无 | +| COMMON_EVENT_WIFI_HOTSPOT_STATE | usual.event.wifi.HOTSPOT_STATE | 无 | +| COMMON_EVENT_WIFI_AP_STA_JOIN | usual.event.wifi.WIFI_HS_STA_JOIN | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_AP_STA_LEAVE | usual.event.wifi.WIFI_HS_STA_LEAVE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_MPLINK_STATE_CHANGE | usual.event.wifi.mplink.STATE_CHANGE | ohos.permission.MPLINK_CHANGE_STATE | +| COMMON_EVENT_WIFI_P2P_CONN_STATE | usual.event.wifi.p2p.CONN_STATE_CHANGE | ohos.permission.GET_WIFI_INFO and ohos.permission.LOCATION | +| COMMON_EVENT_WIFI_P2P_STATE_CHANGED | usual.event.wifi.p2p.STATE_CHANGE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_P2P_PEERS_STATE_CHANGED | usual.event.wifi.p2p.DEVICES_CHANGE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_P2P_PEERS_DISCOVERY_STATE_CHANGED | usual.event.wifi.p2p.PEER_DISCOVERY_STATE_CHANGE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_P2P_CURRENT_DEVICE_STATE_CHANGED | usual.event.wifi.p2p.CURRENT_DEVICE_CHANGE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_P2P_GROUP_STATE_CHANGED | usual.event.wifi.p2p.GROUP_STATE_CHANGED | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_BLUETOOTH_HANDSFREE_AG_CONNECT_STATE_UPDATE | usual.event.bluetooth.handsfree.ag.CONNECT_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HANDSFREE_AG_CURRENT_DEVICE_UPDATE | usual.event.bluetooth.handsfree.ag.CURRENT_DEVICE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HANDSFREE_AG_AUDIO_STATE_UPDATE | usual.event.bluetooth.handsfree.ag.AUDIO_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSOURCE_CONNECT_STATE_UPDATE | usual.event.bluetooth.a2dpsource.CONNECT_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSOURCE_CURRENT_DEVICE_UPDATE | usual.event.bluetooth.a2dpsource.CURRENT_DEVICE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSOURCE_PLAYING_STATE_UPDATE | usual.event.bluetooth.a2dpsource.PLAYING_STATE_UPDATE" | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSOURCE_AVRCP_CONNECT_STATE_UPDATE | usual.event.bluetooth.a2dpsource.AVRCP_CONNECT_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSOURCE_CODEC_VALUE_UPDATE | usual.event.bluetooth.a2dpsource.CODEC_VALUE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_DISCOVERED | usual.event.bluetooth.remotedevice.DISCOVERED | ohos.permission.USE_BLUETOOTH and ohos.permission.LOCATION | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CLASS_VALUE_UPDATE | usual.event.bluetooth.remotedevice.CLASS_VALUE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_ACL_CONNECTED | usual.event.bluetooth.remotedevice.ACL_CONNECTED | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_ACL_DISCONNECTED | usual.event.bluetooth.remotedevice.ACL_DISCONNECTED | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_NAME_UPDATE | usual.event.bluetooth.remotedevice.NAME_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_PAIR_STATE | usual.event.bluetooth.remotedevice.PAIR_STATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_BATTERY_VALUE_UPDATE | usual.event.bluetooth.remotedevice.BATTERY_VALUE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_SDP_RESULT | usual.event.bluetooth.remotedevice.SDP_RESULT | 无 | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_UUID_VALUE | usual.event.bluetooth.remotedevice.UUID_VALUE | ohos.permission.DISCOVER_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_PAIRING_REQ | usual.event.bluetooth.remotedevice.PAIRING_REQ | ohos.permission.DISCOVER_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_PAIRING_CANCEL | usual.event.bluetooth.remotedevice.PAIRING_CANCEL | 无 | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CONNECT_REQ | usual.event.bluetooth.remotedevice.CONNECT_REQ | 无 | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CONNECT_REPLY | usual.event.bluetooth.remotedevice.CONNECT_REPLY | 无 | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CONNECT_CANCEL | usual.event.bluetooth.remotedevice.CONNECT_CANCEL | 无 | +| COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_CONNECT_STATE_UPDATE | usual.event.bluetooth.handsfreeunit.CONNECT_STATE_UPDATE | 无 | +| COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_AUDIO_STATE_UPDATE | usual.event.bluetooth.handsfreeunit.AUDIO_STATE_UPDATE | 无 | +| COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_AG_COMMON_EVENT | usual.event.bluetooth.handsfreeunit.AG_COMMON_EVENT | 无 | +| COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_AG_CALL_STATE_UPDATE | usual.event.bluetooth.handsfreeunit.AG_CALL_STATE_UPDATE | 无 | +| COMMON_EVENT_BLUETOOTH_HOST_STATE_UPDATE | usual.event.bluetooth.host.STATE_UPDATE | 无 | +| COMMON_EVENT_BLUETOOTH_HOST_REQ_DISCOVERABLE | usual.event.bluetooth.host.REQ_DISCOVERABLE | 无 | +| COMMON_EVENT_BLUETOOTH_HOST_REQ_ENABLE | usual.event.bluetooth.host.REQ_ENABLE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HOST_REQ_DISABLE | usual.event.bluetooth.host.REQ_DISABLE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HOST_SCAN_MODE_UPDATE | usual.event.bluetooth.host.SCAN_MODE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HOST_DISCOVERY_STARTED | usual.event.bluetooth.host.DISCOVERY_STARTED | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HOST_DISCOVERY_FINISHED | usual.event.bluetooth.host.DISCOVERY_FINISHED | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HOST_NAME_UPDATE | usual.event.bluetooth.host.NAME_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSINK_CONNECT_STATE_UPDATE | usual.event.bluetooth.a2dpsink.CONNECT_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSINK_PLAYING_STATE_UPDATE | usual.event.bluetooth.a2dpsink.PLAYING_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSINK_AUDIO_STATE_UPDATE | usual.event.bluetooth.a2dpsink.AUDIO_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_NFC_ACTION_ADAPTER_STATE_CHANGED | usual.event.nfc.action.ADAPTER_STATE_CHANGED | 无 | +| COMMON_EVENT_NFC_ACTION_RF_FIELD_ON_DETECTED | usual.event.nfc.action.RF_FIELD_ON_DETECTED | ohos.permission.MANAGE_SECURE_SETTINGS | +| COMMON_EVENT_NFC_ACTION_RF_FIELD_OFF_DETECTED | usual.event.nfc.action.RF_FIELD_OFF_DETECTED | ohos.permission.MANAGE_SECURE_SETTINGS | +| COMMON_EVENT_DISCHARGING | usual.event.DISCHARGING | 无 | +| COMMON_EVENT_CHARGING | usual.event.CHARGING | 无 | +| COMMON_EVENT_DEVICE_IDLE_MODE_CHANGED | usual.event.DEVICE_IDLE_MODE_CHANGED | 无 | +| COMMON_EVENT_POWER_SAVE_MODE_CHANGED | usual.event.POWER_SAVE_MODE_CHANGED | 无 | +| COMMON_EVENT_USER_ADDED | usual.event.USER_ADDED | ohos.permission.MANAGE_USERS | +| COMMON_EVENT_USER_REMOVED | usual.event.USER_REMOVED | ohos.permission.MANAGE_USERS | +| COMMON_EVENT_ABILITY_ADDED | common.event.ABILITY_ADDED | ohos.permission.LISTEN_BUNDLE_CHANGE | +| COMMON_EVENT_ABILITY_REMOVED | common.event.ABILITY_REMOVED | ohos.permission.LISTEN_BUNDLE_CHANGE | +| COMMON_EVENT_ABILITY_UPDATED | common.event.ABILITY_UPDATED | ohos.permission.LISTEN_BUNDLE_CHANGE | +| COMMON_EVENT_LOCATION_MODE_STATE_CHANGED | usual.event.location.MODE_STATE_CHANGED | 无 | +| COMMON_EVENT_IVI_SLEEP | common.event.IVI_SLEEP | 无 | +| COMMON_EVENT_IVI_PAUSE | common.event.IVI_PAUSE | 无 | +| COMMON_EVENT_IVI_STANDBY | common.event.IVI_STANDBY | 无 | +| COMMON_EVENT_IVI_LASTMODE_SAVE | common.event.IVI_LASTMODE_SAVE | 无 | +| COMMON_EVENT_IVI_VOLTAGE_ABNORMAL | common.event.IVI_VOLTAGE_ABNORMAL | 无 | +| COMMON_EVENT_IVI_HIGH_TEMPERATURE | common.event.IVI_HIGH_TEMPERATURE | 无 | +| COMMON_EVENT_IVI_EXTREME_TEMPERATURE | common.event.IVI_EXTREME_TEMPERATURE | 无 | +| COMMON_EVENT_IVI_TEMPERATURE_ABNORMAL | common.event.IVI_TEMPERATURE_ABNORMAL | 无 | +| COMMON_EVENT_IVI_VOLTAGE_RECOVERY | common.event.IVI_VOLTAGE_RECOVERY | 无 | +| COMMON_EVENT_IVI_TEMPERATURE_RECOVERY | common.event.IVI_TEMPERATURE_RECOVERY | 无 | +| COMMON_EVENT_IVI_ACTIVE | common.event.IVI_ACTIVE | 无 | +| COMMON_EVENT_USB_DEVICE_ATTACHED | usual.event.hardware.usb.action.USB_DEVICE_ATTACHED | 无 | +| COMMON_EVENT_USB_DEVICE_DETACHED | usual.event.hardware.usb.action.USB_DEVICE_DETACHED | 无 | +| COMMON_EVENT_USB_ACCESSORY_ATTACHED | usual.event.hardware.usb.action.USB_ACCESSORY_ATTACHED | 无 | +| COMMON_EVENT_USB_ACCESSORY_DETACHED | usual.event.hardware.usb.action.USB_ACCESSORY_DETACHED | 无 | +| COMMON_EVENT_DISK_REMOVED | usual.event.data.DISK_REMOVED | ohos.permission.WRITE_USER_STORAGE or ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_DISK_UNMOUNTED | usual.event.data.DISK_UNMOUNTED | ohos.permission.WRITE_USER_STORAGEor ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_DISK_MOUNTED | usual.event.data.DISK_MOUNTED | ohos.permission.WRITE_USER_STORAGEor ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_DISK_BAD_REMOVAL | usual.event.data.DISK_BAD_REMOVAL | ohos.permission.WRITE_USER_STORAGEor ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_DISK_UNMOUNTABLE | usual.event.data.DISK_UNMOUNTABLE | ohos.permission.WRITE_USER_STORAGEor ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_DISK_EJECT | usual.event.data.DISK_EJECT | ohos.permission.WRITE_USER_STORAGEor ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_VISIBLE_ACCOUNTS_UPDATED | usual.event.data.VISIBLE_ACCOUNTS_UPDATED | ohos.permission.GET_APP_ACCOUNTS | +| COMMON_EVENT_ACCOUNT_DELETED | usual.event.data.ACCOUNT_DELETED | ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS | +| COMMON_EVENT_FOUNDATION_READY | common.event.FOUNDATION_READY | ohos.permission.RECEIVER_STARTUP_COMPLETED | +| COMMON_EVENT_AIRPLANE_MODE_CHANGED | usual.event.AIRPLANE_MODE | 无 | + +#### 导入模块 + +```js +import CommonEvent from '@ohos.commonevent'; +``` + + + +#### CommonEvent.publish(event: string, callback: AsyncCallback) + +- 接口说明 + + 发布公共事件(callback形式) + +* publish参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ------------------- | ---- | -------------------- | + | event | 只读 | string | 是 | 表示要发送的公共事件 | + | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | + +* 返回值 + + void + +* 示例 + +```js +//发布公共事件回调 +function PublishCallBack(err) { + console.info("==========================>PublishCallBack=======================>"); + console.info("==========================>err:=======================>", err.code); +} +//发布公共事件 +CommonEvent.publish("publish_event", PublishCallBack); +``` + + + +#### CommonEvent.publish(event: string, options: CommonEventPublishData, callback: AsyncCallback) + +- 接口说明 + + 发布公共事件指定发布信息(callback形式) + +- publish参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ---------------------- | + | event | 只读 | string | 是 | 表示要发布的公共事件 | + | options | 只读 | CommonEventPublishData | 是 | 表示发布公共事件的属性 | + | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | + +- CommonEventPublishData类型说明 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | --------------------- | -------- | -------------------- | ---- | ---------------------------- | + | bundleName | 只读 | string | 否 | 表示包名称 | + | code | 只读 | int | 否 | 表示公共事件的结果代码 | + | data | 只读 | string | 否 | 表示公共事件的自定义结果数据 | + | subscriberPermissions | 只读 | Array | 否 | 表示订阅者的权限 | + | isOrdered | 只读 | bool | 否 | 表示是否是有序事件 | + | parameters | 只读 | {[key: string]: any} | 否 | 表示公共事件的附加信息 | + +- 返回值 + + void + +- 示例 + +```js +//公共事件相关信息 +var options = { + code: 0; //公共事件的初始代码 + data: "initial data";//公共事件的初始数据 + isOrdered: true; //有序公共事件 +} +//发布公共事件回调 +function PublishCallBack(err) { + console.info("==========================>PublishCallBack=======================>"); +} +//发布公共事件 +CommonEvent.publish("publish_event", options, PublishCallBack); +``` + + + +#### CommonEvent.createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback) + +- 接口说明 + + 创建订阅者(callback形式) + +- createSubscriber参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------- | -------- | ------------------------------------ | ---- | ------------------------ | + | subscribeInfo | 只读 | CommonEventSubscribeInfo | 是 | 表示订阅信息 | + | callback | 只读 | AsyncCallback | 是 | 表示创建订阅者的回调方法 | + +- CommonEventSubscriber 类说明 + + | 名称 | 参数 | 返回值 | 描述 | + | --------------------- | --------------------------------------------------------- | --------------------------------- | ------------------------------------------------------------ | + | getCode | callback: AsyncCallback | void | 获取公共事件的结果代码(callback形式) | + | getCode | void | Promise | 获取公共事件的结果代码(Promise形式) | + | setCode | code: number, callback: AsyncCallback | void | 设置公共事件的结果代码(callback形式) | + | setCode | code: number | Promise | 设置公共事件的结果代码(Promise形式) | + | getData | callback: AsyncCallback | void | 获取公共事件的结果数据(callback形式) | + | getData | void | Promise | 获取公共事件的结果数据(Promise形式) | + | setData | data: string, callback: AsyncCallback | void | 设置公共事件的结果数据(callback形式) | + | setData | data: string | Promise | 设置公共事件的结果数据(Promise形式) | + | setCodeAndData | code: number, data: string, callback: AsyncCallback | void | 设置公共事件的结果代码和结果数据(callback形式) | + | setCodeAndData | code: number, data: string | Promise | 设置公共事件的结果代码和结果数据(Promise形式) | + | isOrderedCommonEvent | callback: AsyncCallback | void | 查询当前公共事件的是否为有序公共事件,返回true代表是有序公共事件,false代表不是有序公共事件(callback形式) | + | isOrderedCommonEvent | void | Promise | 查询当前公共事件的是否为有序公共事件,返回true代表是有序公共事件,false代表不是有序公共事件(Promise形式) | + | abortCommonEvent | callback: AsyncCallback | void | 取消当前的公共事件,仅对有序公共事件有效,取消后,公共事件不再向下一个订阅者传递(callback形式) | + | abortCommonEvent | void | Promise | 取消当前的公共事件,仅对有序公共事件有效,取消后,公共事件不再向下一个订阅者传递(Promise形式) | + | clearAbortCommonEvent | callback: AsyncCallback | void | 清除当前有序公共事件abort状态(callback形式) | + | clearAbortCommonEvent | void | Promise | 清除当前有序公共事件abort状态(Promise形式) | + | getAbortCommonEvent | callback: AsyncCallback | void | 获取当前有序公共事件是否取消的状态(callback形式) | + | getAbortCommonEvent | void | Promise | 获取当前有序公共事件是否取消的状态Promise形式) | + | getSubscribeInfo | callback: AsyncCallback | void | 获取订阅者的订阅信息(callback形式) | + | getSubscribeInfo | void | Promise | 获取订阅者的订阅信息(Promise形式) | + +- CommonEventSubscribeInfo类型说明 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------------- | -------- | ------------- | ---- | ------------------------------------------------------------ | + | events | 只读 | Array | 是 | 表示要订阅的公共事件 | + | publisherPermission | 只读 | string | 否 | 表示发布者的权限 | + | publisherDeviceId | 只读 | int | 否 | 表示设备ID,该值必须是同一ohos网络上的现有设备ID | + | userId | 只读 | int | 否 | 表示用户ID。此参数是可选的,默认值当前用户的ID。如果指定了此参数,则该值必须是系统中现有的用户ID。 | + | priority | 只读 | int | 否 | 表示订阅者的优先级,范围为-100~1000。 | + +- 返回值 + + void + +- 示例 + +```js +var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +//订阅者信息 +var subscribeInfo = { + events: ["event"] +}; +//创建订阅者回调 +function CreateSubscriberCallBack(err, data) { + console.info("==========================>CreateSubscriberCallBack=======================>"); + subscriber = data; +} +//创建订阅者 +CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); +``` + + + +#### CommonEvent.createSubscriber(subscribeInfo: CommonEventSubscribeInfo) + +- 接口说明 + + 创建订阅者(Promise形式) + +- createSubscriber参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------- | -------- | ------------------------ | ---- | ------------ | + | subscribeInfo | 只读 | CommonEventSubscribeInfo | 是 | 表示订阅信息 | + +- CommonEventSubscribeInfo类型说明 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------------- | -------- | ------------- | ---- | ------------------------------------------------------------ | + | events | 只读 | Array | 是 | 表示要发送的公共事件 | + | publisherPermission | 只读 | string | 否 | 表示发布者的权限 | + | publisherDeviceId | 只读 | int | 否 | 表示设备ID,该值必须是同一ohos网络上的现有设备ID | + | userId | 只读 | int | 否 | 表示用户ID。此参数是可选的,默认值当前用户的ID。如果指定了此参数,则该值必须是系统中现有的用户ID。 | + | priority | 只读 | int | 否 | 表示订阅者的优先级。值的范围是-100到1000 | + +- 返回值 + + Promise + +- 示例 + +```js +var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +//订阅者信息 +var subscribeInfo = { + events: ["event"] +}; +//创建订阅者 +CommonEvent.createSubscriber(subscribeInfo).then((data) => { + console.info("==========================>createSubscriberPromise=======================>"); + subscriber = data; +}); +``` + + + +#### CommonEvent.subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback) + +- 接口说明 + + 订阅公共事件(callback形式) + +- subscribe参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | ------------------------------ | ---- | ------------------------------ | + | subscriber | 只读 | CommonEventSubscriber | 是 | 表示订阅者对象 | + | callback | 只读 | AsyncCallback | 是 | 表示接收公共事件数据的回调函数 | + +- CommonEventData类型说明 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | -------------------- | ---- | ------------------------------------------------------- | + | event | 只读 | string | 是 | 表示当前接收的公共事件名称 | + | bundleName | 只读 | string | 否 | 表示包名称 | + | code | 只读 | int | 否 | 表示公共事件的结果代码,用于传递int类型的数据 | + | data | 只读 | string | 否 | 表示公共事件的自定义结果数据,用于传递string 类型的数据 | + | parameters | 只读 | {[key: string]: any} | 否 | 表示公共事件的附加信息 | + +- 返回值 + + void + +- 示例 + + * 无序事件: + + ```js + var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 + //订阅者信息 + var subscribeInfo = { + events: ["event"] + }; + //订阅公共事件回调 + function SubscribeCallBack(err, data) { + console.info("==========================>SubscribeCallBack=======================>"); + } + //创建订阅者回调 + function CreateSubscriberCallBack(err, data) { + console.info("==========================>CreateSubscriberCallBack=======================>"); + subscriber = data; + //订阅公共事件 + CommonEvent.subscribe(subscriber, SubscribeCallBack); + } + //创建订阅者 + CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); + ``` + + * 有序事件 + + ```js + var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 + //订阅者信息 + var subscribeInfo = { + events: ["event"] + }; + + //设置有序公共事件的结果代码回调 + function SetCodeCallBack(err) { + console.info("==========================>SetCodeCallBack=======================>"); + } + //设置有序公共事件的结果数据回调 + function SetDataCallBack(err) { + console.info("==========================>SetDataCallBack=======================>"); + } + //完成本次有序公共事件处理回调 + function FinishCommonEventCallBack(err) { + console.info("==========================>FinishCommonEventCallBack=======================>"); + } + //订阅公共事件回调 + function SubscribeCallBack(err, data) { + console.info("==========================>SubscribeCallBack=======================>"); + //设置有序公共事件的结果代码 + subscriber.setCode(0, SetCodeCallBack); + //设置有序公共事件的结果数据 + subscriber.setData("publish_data_changed", SetDataCallBack); + //完成本次有序公共事件处理 + subscriber.finishCommonEvent(FinishCommonEventCallBack) + } + + //创建订阅者回调 + function CreateSubscriberCallBack(err, data) { + console.info("==========================>CreateSubscriberCallBack=======================>"); + subscriber = data; + //订阅公共事件 + CommonEvent.subscribe(subscriber, SubscribeCallBack); + } + + //创建订阅者 + CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); + ``` + + + +#### CommonEvent.unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback) + +- 接口说明 + + 取消订阅公共事件(callback形式) + +- unsubscribe参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | --------------------- | ---- | ---------------------- | + | subscriber | 只读 | CommonEventSubscriber | 是 | 表示订阅者对象 | + | callback | 只读 | AsyncCallback | 是 | 表示取消订阅的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 +//订阅者信息 +var subscribeInfo = { + events: ["event"] +}; +//订阅公共事件回调 +function SubscribeCallBack(err, data) { + console.info("==========================>SubscribeCallBack=======================>"); +} +//创建订阅者回调 +function CreateSubscriberCallBack(err, data) { + console.info("==========================>CreateSubscriberCallBack=======================>"); + subscriber = data; + //订阅公共事件 + CommonEvent.subscribe(subscriber, SubscribeCallBack); +} +//取消订阅公共事件回调 +function UnsubscribeCallBack(err) { + console.info("==========================>UnsubscribeCallBack=======================>"); +} +//创建订阅者 +CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); +//取消订阅公共事件 +CommonEvent.unsubscribe(subscriber, UnsubscribeCallBack); +``` + + + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/07.Notification\346\250\241\345\235\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/07.Notification\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..ce1ebc51ad00e1277219eebb5976ee5d9ecae43b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/07.Notification\346\250\241\345\235\227.md" @@ -0,0 +1,3231 @@ +--- +title: Notification模块 +permalink: /pages/000b000006 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# Notification模块(JS端SDK接口) + +#### 支持设备 + +| API | 手机 | 平板 | 智慧屏 | 智能穿戴 | +| ------------------------------------------------------------ | ---- | ---- | ------ | -------- | +| Notification.publish(request: NotificationRequest, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.publish(request: NotificationRequest) | 支持 | 支持 | 支持 | 支持 | +| Notification.cancel(id: number, label: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.cancel(id:number, label?:string) | 支持 | 支持 | 支持 | 支持 | +| Notification.cancel(id: number, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.cancelAll(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.cancelAll() | 支持 | 支持 | 支持 | 支持 | +| Notification.addSlot(slot: NotificationSlot, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.addSlot(slot: NotificationSlot) | 支持 | 支持 | 支持 | 支持 | +| Notification.addSlot(type: SlotType, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.addSlot(type: SlotType) | 支持 | 支持 | 支持 | 支持 | +| Notification.addSlots(slots: Array\, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.addSlots(slots: Array\) | 支持 | 支持 | 支持 | 支持 | +| Notification.getSlot(slotType: SlotType, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.getSlot(slotType: SlotType) | 支持 | 支持 | 支持 | 支持 | +| Notification.getSlots(callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | +| Notification.getSlots() | 支持 | 支持 | 支持 | 支持 | +| Notification.removeSlot(slotType: SlotType, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.removeSlot(slotType: SlotType) | 支持 | 支持 | 支持 | 支持 | +| Notification.removeAllSlots(callback: AsyncCallback\): void | 支持 | 支持 | 支持 | 支持 | +| Notification.removeAllSlots(): Promise\ | 支持 | 支持 | 支持 | 支持 | +| Notification.subscribe(subscriber: NotificationSubscriber, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.subscribe(subscriber: NotificationSubscriber, info: NotificationSubscribeInfo, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.subscribe(subscriber: NotificationSubscriber, info?: NotificationSubscribeInfo) | 支持 | 支持 | 支持 | 支持 | +| Notification.unsubscribe(subscriber: NotificationSubscriber, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.unsubscribe(subscriber: NotificationSubscriber) | 支持 | 支持 | 支持 | 支持 | +| Notification.enableNotification(bundle: BundleOption, enable: boolean, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.enableNotification(bundle: BundleOption, enable: boolean) | 支持 | 支持 | 支持 | 支持 | +| Notification.isNotificationEnabled(bundle: BundleOption, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.isNotificationEnabled(bundle: BundleOption) | 支持 | 支持 | 支持 | 支持 | +| Notification.isNotificationEnabled(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.isNotificationEnabled() | 支持 | 支持 | 支持 | 支持 | +| Notification.displayBadge(bundle: BundleOption, enable: boolean, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.displayBadge(bundle: BundleOption, enable: boolean) | 支持 | 支持 | 支持 | 支持 | +| Notification.isBadgeDisplayed(bundle: BundleOption, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.isBadgeDisplayed(bundle: BundleOption) | 支持 | 支持 | 支持 | 支持 | +| Notification.setSlotByBundle(bundle: BundleOption, slot: NotificationSlot, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.setSlotByBundle(bundle: BundleOption, slot: NotificationSlot) | 支持 | 支持 | 支持 | 支持 | +| Notification.getSlotsByBundle(bundle: BundleOption, callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | +| Notification.getSlotsByBundle(bundle: BundleOption) | 支持 | 支持 | 支持 | 支持 | +| Notification.getSlotNumByBundle(bundle: BundleOption, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.getSlotNumByBundle(bundle: BundleOption) | 支持 | 支持 | 支持 | 支持 | +| Notification.remove(bundle: BundleOption, notificationKey: NotificationKey, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.remove(bundle: BundleOption, notificationKey: NotificationKey) | 支持 | 支持 | 支持 | 支持 | +| Notification.remove(hashCode: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.remove(hashCode: string) | 支持 | 支持 | 支持 | 支持 | +| Notification.removeAll(bundle: BundleOption, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.removeAll(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.removeAll(bundle?: BundleOption) | 支持 | 支持 | 支持 | 支持 | +| Notification.getAllActiveNotifications(callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | +| Notification.getAllActiveNotifications() | 支持 | 支持 | 支持 | 支持 | +| Notification.getActiveNotificationCount(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.getActiveNotificationCount() | 支持 | 支持 | 支持 | 支持 | +| Notification.getActiveNotifications(callback: AsyncCallback>) | 支持 | 支持 | 支持 | 支持 | +| Notification.getActiveNotifications() | 支持 | 支持 | 支持 | 支持 | +| Notification.cancelGroup(groupName: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.cancelGroup(groupName: string) | 支持 | 支持 | 支持 | 支持 | +| Notification.removeGroupByBundle(bundle: BundleOption, groupName: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.removeGroupByBundle(bundle: BundleOption, groupName: string) | 支持 | 支持 | 支持 | 支持 | +| Notification.setDoNotDisturbDate(date: DoNotDisturbDate, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.setDoNotDisturbDate(date: DoNotDisturbDate) | 支持 | 支持 | 支持 | 支持 | +| Notification.getDoNotDisturbDate(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.getDoNotDisturbDate() | 支持 | 支持 | 支持 | 支持 | +| Notification.supportDoNotDisturbMode(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| Notification.supportDoNotDisturbMode() | 支持 | 支持 | 支持 | 支持 | +| WantAgent.getWantAgent(info: WantAgentInfo, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| WantAgent.getWantAgent(info: WantAgentInfo): Promise\ | 支持 | 支持 | 支持 | 支持 | +| WantAgent.getBundleName(agent: WantAgent, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| WantAgent.getBundleName(agent: WantAgent): Promise\ | 支持 | 支持 | 支持 | 支持 | +| WantAgent.getUid(agent: WantAgent, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| WantAgent.getUid(agent: WantAgent): Promise\ | 支持 | 支持 | 支持 | 支持 | +| WantAgent.getWant(agent: WantAgent, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| WantAgent.getWant(agent: WantAgent): Promise\ | 支持 | 支持 | 支持 | 支持 | +| WantAgent.cancel(agent: WantAgent, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| WantAgent.cancel(agent: WantAgent): Promise\ | 支持 | 支持 | 支持 | 支持 | +| WantAgent.trigger(agent: WantAgent, triggerInfo: TriggerInfo, callback?: Callback\) | 支持 | 支持 | 支持 | 支持 | +| WantAgent.equal(agent: WantAgent, otherAgent: WantAgent, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | +| WantAgent.equal(agent: WantAgent, otherAgent: WantAgent): Promise\ | 支持 | 支持 | 支持 | 支持 | + +#### 权限列表 + +无 + +#### 通知接口 + +#### 导入模块 + +```js +import notify from '@ohos.notification'; +``` + +#### Notification.publish(request: NotificationRequest, callback: AsyncCallback\) + +- 接口说明 + + 发布通知(callback形式) + +- publish参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | ------------------------------------------- | +| request | 只读 | NotificationRequest | 是 | 设置要发布通知内容的NotificationRequest对象 | +| callback | 只读 | AsyncCallback\ | 是 | 被指定的回调方法 | + +- NotificationRequest类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------------- | -------- | --------------------------------- | ---- | -------------------------- | +| content | 读、写 | NotificationContent | 是 | 通知内容 | +| id | 读、写 | number | 否 | 通知ID | +| slotType | 读、写 | SlotType | 否 | 通道类型 | +| isOngoing | 读、写 | boolean | 否 | 是否进行时通知 | +| isUnremovable | 读、写 | boolean | 否 | 是否可移除 | +| deliveryTime | 读、写 | number | 否 | 通知发送时间 | +| tapDismissed | 读、写 | boolean | 否 | 通知是否自动清除 | +| autoDeletedTime | 读、写 | number | 否 | 自动清除的时间 | +| wantAgent | 读、写 | WantAgent | 否 | 点击跳转的WantAgent | +| extraInfo | 读、写 | {[key: string]: any} | 否 | 扩展参数 | +| color | 读、写 | number | 否 | 通知背景颜色 | +| colorEnabled | 读、写 | boolean | 否 | 通知背景颜色是否使能 | +| isAlertOnce | 读、写 | boolean | 否 | 设置是否仅有一次此通知警报 | +| isStopwatch | 读、写 | boolean | 否 | 是否显示已用时间 | +| isCountDown | 读、写 | boolean | 否 | 是否显示倒计时时间 | +| isFloatingIcon | 读、写 | boolean | 否 | 是否显示状态栏图标 | +| label | 读、写 | string | 否 | 通知标签 | +| badgeIconStyle | 读、写 | number | 否 | 通知角标类型 | +| showDeliveryTime | 读、写 | boolean | 否 | 是否显示分发时间 | +| actionButtons | 读、写 | Array\ | 否 | 通知按钮,最多两个按钮 | +| smallIcon | 读、写 | PixelMap | 否 | 通知小图标 | +| largeIcon | 读、写 | PixelMap | 否 | 通知大图标 | +| creatorBundleName | 只读 | string | 否 | 创建通知的包名 | +| creatorUid | 只读 | number | 否 | 创建通知的UID | +| creatorPid | 只读 | number | 否 | 创建通知的PID | +| hashCode | 只读 | string | 否 | 通知唯一标识 | +| classification | 读、写 | string | 否 | 通知分类 | +| groupName | 读、写 | string | 否 | 组通知名称 | + +NotificationContent类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | ---------------------------- | ---- | -------------- | +| contentType | 读、写 | ContentType | 是 | 通知内容类型 | +| normal | 读、写 | NotificationBasicContent | 否 | 通知基本内容 | +| longText | 读、写 | NotificationLongTextContent | 否 | 通知长文本内容 | +| multiLine | 读、写 | NotificationMultiLineContent | 否 | 通知多行内容 | + +- ContentType类型说明 + +| 名称 | 读写属性 | 类型 | 描述 | +| --------------------------------- | -------- | ----------- | ---------------- | +| NOTIFICATION_CONTENT_BASIC_TEXT | 只读 | ContentType | 普通类型通知 | +| NOTIFICATION_CONTENT_LONG_TEXT | 只读 | ContentType | 长文本类型通知 | +| NOTIFICATION_CONTENT_PICTURE | 只读 | ContentType | 图片类型通知 | +| NOTIFICATION_CONTENT_CONVERSATION | 只读 | ContentType | 社交类型通知 | +| NOTIFICATION_CONTENT_MULTILINE | 只读 | ContentType | 多行文本类型通知 | + +- NotificationBasicContent类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------------- | -------- | ------ | ---- | -------------------------------- | +| title | 读、写 | string | 是 | 通知标题 | +| text | 读、写 | string | 是 | 通知内容 | +| additionalText | 读、写 | string | 是 | 通知次要内容,是对通知内容的补充 | + +- NotificationLongTextContent类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------------- | -------- | ------ | ---- | -------------------------------- | +| title | 读、写 | string | 是 | 通知标题 | +| text | 读、写 | string | 是 | 通知内容 | +| additionalText | 读、写 | string | 是 | 通知次要内容,是对通知内容的补充 | +| longText | 读、写 | string | 是 | 通知的长文本 | +| briefText | 读、写 | string | 是 | 通知概要内容,是对通知内容的总结 | +| expandedTitle | 读、写 | string | 是 | 通知展开时的标题 | + +- NotificationMultiLineContent类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------------- | -------- | --------------- | ---- | -------------------------------- | +| title | 读、写 | string | 是 | 通知标题 | +| text | 读、写 | string | 是 | 通知内容 | +| additionalText | 读、写 | string | 是 | 通知次要内容,是对通知内容的补充 | +| briefText | 读、写 | string | 是 | 通知概要内容,是对通知内容的总结 | +| longTitle | 读、写 | string | 是 | 通知展开时的标题 | +| lines | 读、写 | Array\ | 是 | 通知的多行文本 | + +- NotificationPictureContent类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------------- | -------- | -------------- | ---- | -------------------------------- | +| title | 读、写 | string | 是 | 通知标题 | +| text | 读、写 | string | 是 | 通知内容 | +| additionalText | 读、写 | string | 是 | 通知次要内容,是对通知内容的补充 | +| briefText | 读、写 | string | 是 | 通知概要内容,是对通知内容的总结 | +| expandedTitle | 读、写 | string | 是 | 通知展开时的标题 | +| picture | 读、写 | image.PixelMap | 是 | 通知的图片内容 | + +- NotificationActionButton类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | --------------------- | ---- | ------------------------- | +| title | 读、写 | string | 是 | 按钮标题 | +| wantAgent | 读、写 | wantAgent | 是 | 点击按钮时触发的WantAgent | +| extras | 读、写 | Array\ | 否 | 按钮扩展信息 | +| icon | 读、写 | image.PixelMap | 否 | 按钮图标 | +| userInput | 读、写 | NotificationUserInput | 否 | 用户输入对象实例 | + +- NotificationUserInput类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ------ | ---- | ----------------------------- | +| inputKey | 读、写 | string | 是 | 用户输入时用于标识此输入的key | + + +- 返回值 + + void + +- 示例 + +```js +//publish回调 +function publishCallback(err) { + console.info("==========================>publishCallback=======================>"); +} +//通知Request对象 +var notificationRequest = { + id: 1, + content: { + contentType: notify.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, + normal: { + title: "test_title", + text: "test_text", + additionalText: "test_additionalText" + } + } +} +Notification.publish(notificationRequest, publishCallback) +``` + + + +#### Notification.publish(request: NotificationRequest) + +- 接口说明 + + 发布通知(Promise形式) + +- 返回值 + + Promise\ + +- 示例 + +```js +//通知Request对象 +var notificationRequest = { + notificationId: 1, + content: { + contentType: notify.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, + normal: { + title: "test_title", + text: "test_text", + additionalText: "test_additionalText" + } + } +} +Notification.publish(notificationRequest).then((void) => { + console.info("==========================>publishCallback=======================>"); +}); + +``` + + + +#### Notification.cancel(id: number, label: string, callback: AsyncCallback\) + +- 接口说明 + + 取消与指定id和label相匹配的已发布通知(callback形式) + +- cancel参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | -------------------- | +| id | 只读 | number | 是 | 通知ID | +| lable | 只读 | string | 是 | 通知标签 | +| callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +//cancel回调 +function cancelCallback(err) { + console.info("==========================>cancelCallback=======================>"); +} +Notification.cancel(0, "label", cancelCallback) +``` + + + +#### Notification.cancel(id:number, label?:string) + +- 接口说明 + + 取消与指定id相匹配的已发布通知,label可以指定也可以不指定(Promise形式) + +- cancel参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----- | -------- | ------ | ---- | -------- | +| id | 只读 | number | 是 | 通知ID | +| lable | 只读 | string | 是 | 通知标签 | + +- 返回值 + + Promise\ + +- 示例 + +```js +Notification.cancel(0).then((void) => { + console.info("==========================>cancelCallback=======================>"); +}); +``` + + + +#### Notification.cancel(id: number, callback: AsyncCallback\) + +- 接口说明 + + 取消与指定id相匹配的已发布通知(callback形式) + +- cancel参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | -------------------- | +| id | 只读 | number | 是 | 通知ID | +| callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +//cancel回调 +function cancelCallback(err) { + console.info("==========================>cancelCallback=======================>"); +} +Notification.cancel(0, cancelCallback) +``` + + + +#### Notification.cancelAll(callback: AsyncCallback\) + +- 接口说明 + + 取消所有已发布的通知(callback形式) + +- cancelAll参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | -------------------- | +| callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +//cancel回调 +function cancelAllback(err) { + console.info("==========================>cancelAllback=======================>"); +} +Notification.cancelAll(cancelCallback) +``` + + + +#### Notification.cancelAll() + +- 接口说明 + + 取消所有已发布的通知(callback形式) + +- 参数描述 + + 无参数 + +- 返回值 + + void + +- 示例 + +```js +Notification.cancelAll().then((void) => { + console.info("==========================>cancelAllback=======================>"); +}); +``` + + + +#### Notification.addSlot(slot: NotificationSlot, callback: AsyncCallback\) + +- 接口说明 + + 创建通知通道(callback形式) + +- addSlot参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | ------------------------------------------ | +| slot | 只读 | NotificationSlot | 是 | 要创建的通知通道,由{NotificationSlot}设置 | +| callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- NotificationSlot类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------------------- | -------- | --------------- | ---- | ------------------------------------------ | +| type | 读、写 | SlotType | 是 | 通道类型 | +| level | 读、写 | number | 否 | 通知级别,不设置则根据通知渠道类型有默认值 | +| desc | 读、写 | string | 否 | 通知渠道描述信息 | +| badgeFlag | 读、写 | boolean | 否 | 是否显示角标 | +| bypassDnd | 读、写 | boolean | 否 | 置是否在系统中绕过免打扰模式 | +| lockscreenVisibility | 读、写 | boolean | 否 | 在锁定屏幕上显示通知的模式 | +| vibrationEnabled | 读、写 | boolean | 否 | 是否可振动 | +| sound | 读、写 | string | 否 | 通知提示音 | +| lightEnabled | 读、写 | boolean | 否 | 是否闪灯 | +| lightColor | 读、写 | number | 否 | 通知灯颜色 | +| vibrationValues | 读、写 | Array\ | 否 | 通知振动样式 | + +* 返回值 + + void + +* 示例 + +```js +//addslot回调 +function addSlotCallBack(err) { + console.info("==========================>addSlotCallBack=======================>"); +} +//通知slot对象 +var notificationSlot = { + type:SOCIAL_COMMUNICATION +} +Notification.addSlot(notificationSlot, addSlotCallBack) +``` + + + +#### Notification.addSlot(slot: NotificationSlot) + +- 接口说明 + + 创建通知通道(Promise形式) + +- addSlot参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---- | -------- | ---------------- | ---- | ------------------------------------------ | +| slot | 只读 | NotificationSlot | 是 | 要创建的通知通道,由{NotificationSlot}设置 | + +- 返回值 + + Promise\ + +- 示例 + +```js +//通知slot对象 + var notificationSlot = { + notificationId: 0, + type:SOCIAL_COMMUNICATION + } +Notification.addSlot(notificationSlot).then((void) => { + console.info("==========================>addSlotCallback=======================>"); +}); +``` + + + +#### Notification.addSlot(type: SlotType, callback: AsyncCallback\) + +- 接口说明 + + 创建通知通道(callback形式) + +- addSlot参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | ---------------------- | +| type | 只读 | SlotType | 是 | 要创建的通知通道的类型 | +| callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- SlotType类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------------------- | -------- | -------- | ---- | -------- | +| SOCIAL_COMMUNICATION | 只读 | SlotType | 否 | 社交类型 | +| SERVICE_INFORMATION | 只读 | SlotType | 否 | 服务类型 | +| CONTENT_INFORMATION | 只读 | SlotType | 否 | 内容类型 | +| OTHER_TYPES | 只读 | SlotType | 否 | 其他类型 | + +- 返回值 + + void + +- 示例 + +```js +//addslot回调 +function addSlotCallBack(err) { + console.info("==========================>addSlotCallBack=======================>"); +} +Notification.addSlot(SOCIAL_COMMUNICATION, addSlotCallBack) +``` + + + +#### Notification.addSlot(type: SlotType) + +- 接口说明 + + 创建通知通道(Promise形式) + +- addSlot参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---- | -------- | -------- | ---- | ---------------------- | +| type | 只读 | SlotType | 是 | 要创建的通知通道的类型 | + +- 返回值 + + Promise\ + +- 示例 + +```js +Notification.addSlot(SOCIAL_COMMUNICATION).then((void) => { + console.info("==========================>addSlotCallback=======================>"); +}); +``` + + + +#### Notification.addSlots(slots: Array\, callback: AsyncCallback\) + +- 接口说明 + + 创建多个通知通道(callback形式) + +- addSlots数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ------------------------- | ---- | ------------------------------------------ | +| slots | 只读 | Array\ | 是 | 要创建的通知通道,由{NotificationSlot}设置 | +| callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +//addSlots回调 +function addSlotsCallBack(err) { + console.info("==========================>addSlotsCallBack=======================>"); +} +//通知slot对象 +var notificationSlot = { + notificationId: 0, + type:SOCIAL_COMMUNICATION +} +//通知slot array 对象 +var notificationSlotArray = new Array(); +notificationSlotArray[0] = notificationSlot; + +Notification.addSlots(notificationSlotArray, addSlotsCallBack) +``` + + + +#### Notification.addSlots(slots: Array\) + +- 接口说明 + + 创建多个通知通道(Promise形式) + +- addSlots数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----- | -------- | ------------------------- | ---- | ------------------------------------------ | +| slots | 只读 | Array\ | 是 | 要创建的通知通道,由{NotificationSlot}设置 | + +- 返回值 + + Promise\ + +- 示例 + +```js +//通知slot对象 +var notificationSlot = { + notificationId: 0, + type:SOCIAL_COMMUNICATION +} +//通知slot array 对象 +var notificationSlotArray = new Array(); +notificationSlotArray[0] = notificationSlot; + +Notification.addSlots(notificationSlotArray).then((void) => { + console.info("==========================>addSlotCallback=======================>"); +}); +``` + + + +#### Notification.getSlot(slotType: SlotType, callback: AsyncCallback\) + +- 接口说明 + + 获取一个通知通道(callback形式) + +- getSlot参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------------------- | ---- | ----------------------------------------------------------- | +| slotType | 只读 | slotType | 是 | 通知渠道类型,目前分为社交通信、服务提醒、内容咨询和其他类型 | +| callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +//getSlot回调 +function getSlotCallback(err,data) { + console.info("==========================>getSlotCallback=======================>"); +} +var slotType = SOCIAL_COMMUNICATION; +Notification.getSlot(slotType, getSlotCallback) +``` + + + +#### Notification.getSlot(slotType) + +- 接口说明 + + 获取一个通知通道(Promise形式) + +- getSlot参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | -------- | ---- | ----------------------------------------------------------- | +| slotType | 只读 | slotType | 是 | 通知渠道类型,目前分为社交通信、服务提醒、内容咨询和其他类型 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var slotType = SOCIAL_COMMUNICATION; +Notification.getSlot(slotType).then((data) => { + console.info("==========================>getSlotCallback=======================>"); +``` + + + +#### Notification.getSlots(callback: AsyncCallback>) + +- 接口说明 + + 获取此应用程序的所有通知通道(callback形式) + +- getSlots参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------------------- | ---- | -------------------- | +| callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +//getSlots回调 +function getSlotsCallback(err,data) { + console.info("==========================>getSlotsCallback=======================>"); +} +Notification.getSlots(getSlotsCallback) +``` + + + +#### Notification.getSlots() + +- 接口说明 + + 获取此应用程序的所有通知通道(Promise形式) + +- getSlots参数描述 + + 无参数 + +- 返回值 + + Promise\\> + +- 示例 + +```js +Notification.getSlots().then((data) => { + console.info("==========================>getSlotsCallback=======================>"); +``` + + + +#### Notification.removeSlot(slotType: SlotType, callback: AsyncCallback\) + +- 接口说明 + + 根据通知通道类型删除创建的通知通道(callback形式) + +- removeSlot参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | ----------------------------------------------------------- | +| SlotType | 只读 | SlotType | 是 | 通知渠道类型,目前分为社交通信、服务提醒、内容咨询和其他类型 | +| callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +//removeSlot回调 +function removeSlotCallback(err) { + console.info("==========================>removeSlotCallback=======================>"); +} +var slotType = SOCIAL_COMMUNICATION; +Notification.removeSlot(slotType,removeSlotCallback) +``` + + + +#### Notification.removeSlot(slotType: SlotType) + +- 接口说明 + + 根据通知通道类型删除创建的通知通道(Promise形式) + +- removeSlot参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | -------- | ---- | ----------------------------------------------------------- | +| SlotType | 只读 | SlotType | 是 | 通知渠道类型,目前分为社交通信、服务提醒、内容咨询和其他类型 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var slotType = SOCIAL_COMMUNICATION; +Notification.removeSlot(slotType).then((void) => { + console.info("==========================>removeSlotCallback=======================>"); +``` + + + +#### Notification.removeAllSlots(callback: AsyncCallback\) + +- 接口说明 + + 删除所有通知通道(callback形式) + +- removeAllSlots参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | -------------------- | +| callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +function removeAllCallBack(err) { + console.info("================>removeAllCallBack=======================>"); +} +Notification.removeAllSlots(removeAllCallBack) +``` + + + +#### Notification.removeAllSlots() + +- 接口说明 + + 删除所有通知通道(Promise形式) + +- removeAllSlots参数描述 + + 参数无 + +- 返回值 + + Promise\ + +- 示例 + +```js +Notification.removeAllSlots().then((void) => { + console.info("==========================>removeAllCallBack=======================>"); +}); +``` + + + +#### Notification.subscribe(subscriber: NotificationSubscriber, info: NotificationSubscribeInfo, callback: AsyncCallback\) + +- 接口说明 + + 订阅通知并指定订阅信息(callback形式) + +- subscribe参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ------------------------- | ---- | ---------------- | +| subscriber | 只读 | NotificationSubscriber | 是 | 通知订阅对象 | +| info | 只读 | NotificationSubscribeInfo | 是 | 订阅信息 | +| callback | 只读 | AsyncCallback\ | 是 | 订阅动作回调函数 | + +- NotificationSubscriber类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------------------------------------------------------ | -------- | -------- | ---- | -------------------------- | +| onConsume?:(data: SubscribeCallbackData) | 读、写 | function | 否 | 接收通知回调函数 | +| onCancel?:(data: SubscribeCallbackData) | 读、写 | function | 否 | 删除通知回调函数 | +| onUpdate?:(data: NotificationSortingMap) | 读、写 | function | 否 | 更新通知排序回调函数 | +| onConnect?:() | 读、写 | function | 否 | 注册订阅回调函数 | +| onDisconnect?:() | 读、写 | function | 否 | 取消订阅回调函数 | +| onDestroy?:() | 读、写 | function | 否 | 服务失联回调函数 | +| onDisturbModeChange?:(mode: notification.DoNotDisturbMode) | 读、写 | function | 否 | 免打扰模式变更回调函数 | +| onDoNotDisturbDateChange?:(mode: notification.DoNotDisturbDate) | 读、写 | function | 否 | 免打扰时间选项变更回调函数 | + +- SubscribeCallbackData 类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------------- | -------- | ---------------------- | ---- | -------- | +| request | 只读 | NotificationRequest | 是 | 通知内容 | +| sortingMap | 只读 | NotificationSortingMap | 否 | 排序信息 | +| reason | 只读 | number | 否 | 删除原因 | +| sound | 只读 | string | 否 | 通知声音 | +| vibrationValues | 只读 | Array\ | 否 | 通知震动 | + +- NotificationSortingMap类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------------- | -------- | ------------------------------------ | ---- | ---------------- | +| sortings | 只读 | {[key: string]: NotificationSorting} | 是 | 通知排序信息数组 | +| sortedHashCode | 只读 | Array\ | 是 | 通知唯一标识数组 | + +- NotificationSorting 类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ---------------- | ---- | ------------ | +| slot | 只读 | NotificationSlot | 是 | 通知通道内容 | +| hashCode | 只读 | string | 是 | 通知唯一标识 | +| ranking | 只读 | number | 是 | 通知排序序号 | + +- DoNotDisturbMode类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------------- | -------- | ---------------- | ---- | ---------------------------- | +| ALLOW_ALL | 只读 | DoNotDisturbMode | 否 | 全部绕过免打扰 | +| ALLOW_PRIORITY | 只读 | DoNotDisturbMode | 否 | 指定优先级通知可以绕过免打扰 | +| ALLOW_NONE | 只读 | DoNotDisturbMode | 否 | 全部免打扰 | +| ALLOW_ALARMS | 只读 | DoNotDisturbMode | 否 | 闹钟类型通知可以绕过免打扰 | + +- DoNotDisturbType类型说明 + + +| 名称 | 读写属性 | 类型 | 描述 | +| ------------ | -------- | --------------------- | ---------------------------------------- | +| TYPE_NONE | 只读 | enum DoNotDisturbType | 非通知勿扰类型 | +| TYPE_ONCE | 只读 | enum DoNotDisturbType | 以设置时间段(只看小时和分钟)一次执行勿扰 | +| TYPE_DAILY | 只读 | enum DoNotDisturbType | 以设置时间段(只看小时和分钟)每天执行勿扰 | +| TYPE_CLEARLY | 只读 | enum DoNotDisturbType | 以设置时间段(明确年月日时分)执行勿扰 | + +- DoNotDisturbDate类型说明 + +| 名称 | 读写属性 | 类型 | 描述 | +| ----- | -------- | ---------------- | ------------------------ | +| type | 读写 | DoNotDisturbType | 指定免打扰设置的时间类型 | +| begin | 读写 | Date | 指定免打扰设置的起点时间 | +| end | 读写 | Date | 指定免打扰设置的终点时间 | + +- NotificationSubscribeInfo类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | --------------- | ---- | ------------------------------- | +| bundleNames | 读、写 | Array\ | 否 | 指定订阅哪些包名的APP发来的通知 | +| userId | 读、写 | number | 否 | 指定订阅哪个用户下发来的通知 | + +- 返回值 + + void + +- 示例 + +```js +//subscribe回调 +function subscribeCallback(err) { + console.info("==========================>subscribeCallback=======================>"); +} +function onConsumeCallback(err, data) { + console.info("==========================>onConsumeCallback=======================>"); +} +var subscriber = { + onConsume:onConsumeCallback; +} +var info = { + bundleNames:["bundleName1","bundleName2"] +} +Notification.subscribe(subscriber, info, subscribeCallback); +``` + + + +#### Notification.subscribe(subscriber: NotificationSubscriber, callback: AsyncCallback\) + +- 接口说明 + + 订阅通知并指定订阅信息(callback形式) + +- subscribe参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ---------------------- | ---- | ---------------- | +| subscriber | 只读 | NotificationSubscriber | 是 | 通知订阅对象 | +| callback | 只读 | AsyncCallback\ | 是 | 订阅动作回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function subscribeCallback(err) { + console.info("==========================>subscribeCallback=======================>"); +} +function onConsumeCallback(err, data) { + console.info("==========================>onConsumeCallback=======================>"); +} +var subscriber = { + onConsume:onConsumeCallback; +} +Notification.subscribe(subscriber, subscribeCallback); +``` + + + +#### Notification.subscribe(subscriber: NotificationSubscriber, info?: NotificationSubscribeInfo) + +- 接口说明 + + 订阅通知并指定订阅信息(Promise形式) + +- subscribe参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ------------------------- | ---- | ------------ | +| subscriber | 只读 | NotificationSubscriber | 是 | 通知订阅对象 | +| info | 只读 | NotificationSubscribeInfo | 否 | 订阅信息 | + +- 返回值 + + Promise\ + +- 示例 + +```js +function onConsumeCallback(err, data) { + console.info("==========================>onConsumeCallback=======================>"); +} +var subscriber = { + onConsume:onConsumeCallback; +}; +Notification.subscribe(subscriber).then((void) => { + console.info("==========================>subscribeCallback=======================>"); +}); +``` + + + +#### Notification.unsubscribe(subscriber: NotificationSubscriber, callback: AsyncCallback\) + +- 接口说明 + + 取消订阅(callbcak形式) + +- unsubscribe参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ---------------------- | ---- | -------------------- | +| subscriber | 只读 | NotificationSubscriber | 是 | 通知订阅对象 | +| callback | 只读 | AsyncCallback\ | 是 | 取消订阅动作回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function unsubscribeCallback(err) { + console.info("==========================>unsubscribeCallback=======================>"); +} +function onConsumeCallback(err, data) { + console.info("==========================>onConsumeCallback=======================>"); +} +var subscriber = { + onConsume:onConsumeCallback; +} +Notification.unsubscribe(subscriber, unsubscribeCallback); +``` + + + +#### Notification.unsubscribe(subscriber: NotificationSubscriber) + +- 接口说明 + + 取消订阅(Promise形式) + +- unsubscribe参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ---------------------- | ---- | ------------ | +| subscriber | 只读 | NotificationSubscriber | 是 | 通知订阅对象 | + +- 返回值 + + Promise\ + +- 示例 + +```js +function onConsumeCallback(err, data) { + console.info("==========================>onConsumeCallback=======================>"); +} +var subscriber = { + onConsume:onConsumeCallback; +}; +Notification.unsubscribe(subscriber).then((void) => { + console.info("==========================>unsubscribeCallback=======================>"); +}); +``` + + + +#### Notification.enableNotification(bundle: BundleOption, enable: boolean, callback: AsyncCallback\) + +- 接口说明 + + 设定指定包的通知使能状态(Callback形式) + +- enableNotification参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | -------------------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| enable | 只读 | boolean | 是 | 使能状态 | +| callback | 只读 | AsyncCallback\ | 是 | 设定通知使能回调函数 | + +- BundleOption类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------ | -------- | ------ | ---- | ------ | +| bundle | 读/写 | string | 是 | 包名 | +| uid | 读/写 | number | 否 | 用户id | +- 返回值 + + void + +- 示例 + +```js +function enableNotificationCallback(err) { + console.info("==========================>enableNotificationCallback=======================>"); +} +var bundle = { + bundle:"bundleName1"; +} +Notification.enableNotification(bundle, false, enableNotificationCallback); +``` + + + +#### Notification.enableNotification(bundle: BundleOption, enable: boolean) + +- 接口说明 + + 设定指定包的通知使能状态(Promise形式) + +- enableNotification参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------ | -------- | ------------ | ---- | ---------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| enable | 只读 | boolean | 是 | 使能状态 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var bundle = { + bundle:"bundleName1"; +} +Notification.enableNotification(bundle, false).then((void) => { + console.info("==========================>enableNotificationCallback=======================>"); +}); +``` + + + +#### Notification.isNotificationEnabled(bundle: BundleOption, callback: AsyncCallback\) + +- 接口说明 + + 获取指定包的通知使能状态(Callback形式) + +- isNotificationEnabled参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | ------------------------ | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| callback | 只读 | AsyncCallback\ | 是 | 获取通知使能状态回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function isNotificationEnabledCallback(err, data) { + console.info("==========================>isNotificationEnabledCallback=======================>"); +} +var bundle = { + bundle:"bundleName1"; +} +Notification.isNotificationEnabled(bundle, isNotificationEnabledCallback); +``` + + + +#### Notification.isNotificationEnabled(bundle: BundleOption) + +- 接口说明 + + 获取指定包的通知使能状态(Promise形式) + +- isNotificationEnabled参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------ | -------- | ------------ | ---- | ---------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var bundle = { + bundle:"bundleName1"; +} +Notification.isNotificationEnabled(bundle).then((data) => { + console.info("==========================>isNotificationEnabledCallback=======================>"); +}); +``` + + + +#### Notification.isNotificationEnabled(callback: AsyncCallback\) + +- 接口说明 + + 获取通知使能状态(Callback形式) + +- isNotificationEnabled参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | ------------------------ | +| callback | 只读 | AsyncCallback\ | 是 | 获取通知使能状态回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function isNotificationEnabledCallback(err, data) { + console.info("==========================>isNotificationEnabledCallback=======================>"); +} + +Notification.isNotificationEnabled(isNotificationEnabledCallback); +``` + + + +#### Notification.isNotificationEnabled() + +- 接口说明 + + 获取通知使能状态(Promise形式) + +- isNotificationEnabled参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------ | -------- | ------------ | ---- | ---------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | + +- 返回值 + + Promise\ + +- 示例 + +```js +Notification.isNotificationEnabled().then((data) => { + console.info("==========================>isNotificationEnabledCallback=======================>"); +}); +``` + + + +#### Notification.displayBadge(bundle: BundleOption, enable: boolean, callback: AsyncCallback\) + +- 接口说明 + + 设定指定包的角标使能状态(Callback形式) + +- displayBadge参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | -------------------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| enable | 只读 | boolean | 是 | 使能状态 | +| callback | 只读 | AsyncCallback\ | 是 | 设定角标使能回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function displayBadgeCallback(err) { + console.info("==========================>displayBadgeCallback=======================>"); +} +var bundle = { + bundle:"bundleName1"; +} +Notification.displayBadge(bundle, false, displayBadgeCallback); +``` + + + +#### Notification.displayBadge(bundle: BundleOption, enable: boolean) + +- 接口说明 + + 设定指定包的角标使能状态(Promise形式) + +- displayBadge参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------ | -------- | ------------ | ---- | ---------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| enable | 只读 | boolean | 是 | 使能状态 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var bundle = { + bundle:"bundleName1"; +} +Notification.displayBadge(bundle, false).then((void) => { + console.info("==========================>displayBadgeCallback=======================>"); +}); +``` + + + +#### Notification.isBadgeDisplayed(bundle: BundleOption, callback: AsyncCallback\) + +- 接口说明 + + 获取指定包的角标使能状态(Callback形式) + +- isBadgeDisplayed参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | ------------------------ | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| callback | 只读 | AsyncCallback\ | 是 | 获取角标使能状态回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function isBadgeDisplayedCallback(err, data) { + console.info("==========================>isBadgeDisplayedCallback=======================>"); +} +var bundle = { + bundle:"bundleName1"; +} +Notification.isBadgeDisplayed(bundle, isBadgeDisplayedCallback); +``` + + + +#### Notification.isBadgeDisplayed(bundle: BundleOption) + +- 接口说明 + + 获取指定包的角标使能状态(Promise形式) + +- isBadgeDisplayed参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------ | -------- | ------------ | ---- | ---------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var bundle = { + bundle:"bundleName1"; +} +Notification.isBadgeDisplayed(bundle).then((data) => { + console.info("==========================>isBadgeDisplayedCallback=======================>"); +}); +``` + + + +#### Notification.setSlotByBundle(bundle: BundleOption, slot: NotificationSlot, callback: AsyncCallback\) + +- 接口说明 + + 设定指定包的通知通道状态(Callback形式) + +- setSlotByBundle参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | -------------------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| slot | 只读 | NotificationSlot | 是 | 通知通道 | +| callback | 只读 | AsyncCallback\ | 是 | 设定通知通道回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function setSlotByBundleCallback(err) { + console.info("==========================>setSlotByBundleCallback=======================>"); +} +var bundle = { + bundle:"bundleName1"; +} +var notificationSlot = { + type:SOCIAL_COMMUNICATION +} +Notification.setSlotByBundle(bundle, notificationSlot, setSlotByBundleCallback); +``` + + + +#### Notification.setSlotByBundle(bundle: BundleOption, slot: NotificationSlot) + +- 接口说明 + + 设定指定包的角标使能状态(Promise形式) + +- setSlotByBundle参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------ | -------- | ------------ | ---- | ---------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| enable | 只读 | boolean | 是 | 使能状态 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var bundle = { + bundle:"bundleName1"; +} +var notificationSlot = { + type:SOCIAL_COMMUNICATION +} +Notification.displayBadge(bundle, notificationSlot).then((void) => { + console.info("==========================>setSlotByBundleCallback=======================>"); +}); +``` + + + +#### Notification.getSlotsByBundle(bundle: BundleOption, callback: AsyncCallback>) + +- 接口说明 + + 获取指定包的通知通道(Callback形式) + +- getSlotsByBundle参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ---------------------------------------- | ---- | -------------------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| callback | 只读 | AsyncCallback> | 是 | 获取通知通道回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function getSlotsByBundleCallback(err, data) { + console.info("==========================>getSlotsByBundleCallback=======================>"); +} +var bundle = { + bundle:"bundleName1"; +} +Notification.getSlotsByBundle(bundle, getSlotsByBundleCallback); +``` + + + +#### Notification.getSlotsByBundle(bundle: BundleOption) + +- 接口说明 + + 获取指定包的通知通道(Promise形式) + +- getSlotsByBundle参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------ | -------- | ------------ | ---- | ---------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | + +- 返回值 + + Promise> + +- 示例 + +```js +var bundle = { + bundle:"bundleName1"; +} +Notification.getSlotsByBundle(bundle).then((data) => { + console.info("==========================>getSlotsByBundleCallback=======================>"); +}); +``` + + + +#### Notification.getSlotNumByBundle(bundle: BundleOption, callback: AsyncCallback\) + +- 接口说明 + + 获取指定包的通知通道数(Callback形式) + +- getSlotNumByBundle参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ------------------------- | ---- | ---------------------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| callback | 只读 | AsyncCallback\ | 是 | 获取通知通道数回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function getSlotNumByBundle(err, data) { + console.info("==========================>getSlotNumByBundleCallback=======================>"); +} +var bundle = { + bundle:"bundleName1"; +} +Notification.getSlotNumByBundle(bundle, getSlotNumByBundleCallback); +``` + + + +#### Notification.getSlotNumByBundle(bundle: BundleOption) + +- 接口说明 + + 获取指定包的通知通道数(Promise形式) + +- getSlotNumByBundle参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------ | -------- | ------------ | ---- | ---------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var bundle = { + bundle:"bundleName1"; +} +Notification.getSlotNumByBundle(bundle).then((data) => { + console.info("==========================>getSlotNumByBundleCallback=======================>"); +}); +``` + + + +#### Notification.remove(bundle: BundleOption, notificationKey: NotificationKey, callback: AsyncCallback\) + +- 接口说明 + + 删除指定通知(Callback形式) + +- remove参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------------- | -------- | --------------------- | ---- | -------------------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| notificationKey | 只读 | NotificationKey | 是 | 通知键值 | +| callback | 只读 | AsyncCallback\ | 是 | 删除指定通知回调函数 | + +- NotificationKey类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----- | -------- | ------ | ---- | -------- | +| id | 读、写 | number | 是 | 通知ID | +| label | 读、写 | string | 否 | 通知标签 | + +- 返回值 + + void + +- 示例 + +```js +function removeCallback(err) { + console.info("==========================>removeCallback=======================>"); +} +var bundle = { + bundle:"bundleName1"; +} +var notificationKey = { + id:0; + label:"label"; +} +Notification.remove(bundle, notificationKey, removeCallback); +``` + + + +#### Notification.remove(bundle: BundleOption, notificationKey: NotificationKey) + +- 接口说明 + + 删除指定通知(Promise形式) + +- remove参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------------- | -------- | --------------- | ---- | ---------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| notificationKey | 只读 | NotificationKey | 是 | 通知键值 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var bundle = { + bundle:"bundleName1"; +} +var notificationKey = { + id:0; + label:"label"; +} +Notification.remove(bundle, notificationKey).then((void) => { + console.info("==========================>removeCallback=======================>"); +}); +``` + + + +#### Notification.remove(hashCode: string, callback: AsyncCallback\) + +- 接口说明 + + 删除指定通知(Callback形式) + +- remove参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | -------------------- | +| hashCode | 只读 | string | 是 | 通知唯一ID | +| callback | 只读 | AsyncCallback\ | 是 | 删除指定通知回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function removeCallback(err) { + console.info("==========================>removeCallback=======================>"); +} + +Notification.remove(hashCode, removeCallback); +``` + + + +#### Notification.remove(hashCode: string) + +- 接口说明 + + 删除指定通知(Promise形式) + +- remove参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ---------- | ---- | ---------- | +| hashCode | 只读 | string | 是 | 通知唯一ID | + +- 返回值 + + Promise\ + +- 示例 + +```js +Notification.remove(hashCode).then((void) => { + console.info("==========================>removeCallback=======================>"); +}); +``` + + + +#### Notification.removeAll(bundle: BundleOption, callback: AsyncCallback\) + +- 接口说明 + + 删除指定包的所有通知(Callback形式) + +- removeAll参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | ---------------------------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| callback | 只读 | AsyncCallback\ | 是 | 删除指定包的所有通知回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function removeAllCallback(err) { + console.info("==========================>removeAllCallback=======================>"); +} +var bundle = { + bundle:"bundleName1"; +} +Notification.removeAll(bundle, removeAllCallback); +``` + + + +#### Notification.removeAll(callback: AsyncCallback\) + +- 接口说明 + + 删除所有通知(Callback形式) + +- removeAll参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | -------------------- | +| callback | 只读 | AsyncCallback\ | 是 | 删除所有通知回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function removeAllCallback(err) { + console.info("==========================>removeAllCallback=======================>"); +} + +Notification.removeAll(removeAllCallback); +``` + + + +#### Notification.removeAll(bundle?: BundleOption) + +- 接口说明 + + 删除所有通知(Promise形式) + +- removeAll参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------ | -------- | ------------ | ---- | ---------- | +| bundle | 只读 | BundleOption | 否 | 指定包信息 | + +- 返回值 + + Promise\ + +- 示例 + +```js +Notification.removeAll().then((void) => { + console.info("==========================>removeAllCallback=======================>"); +}); +``` + + + +#### Notification.getAllActiveNotifications(callback: AsyncCallback>) + +- 接口说明 + + 获取活动通知(Callback形式) + +- getAllActiveNotifications参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ------------------------------------------- | ---- | -------------------- | +| callback | 只读 | AsyncCallback> | 是 | 获取活动通知回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function getAllActiveNotificationsCallback(err, data) { + console.info("==========================>getAllActiveNotificationsCallback=======================>"); +} + +Notification.getAllActiveNotifications(getAllActiveNotificationsCallback); +``` + + + +#### Notification.getAllActiveNotifications() + +- 接口说明 + + 获取活动通知(Promise形式) + +- getAllActiveNotifications参数描述 + + 无 + +- 返回值 + + Promise\\> + +- 示例 + +```js +Notification.getAllActiveNotifications().then((data) => { + console.info("==========================>getAllActiveNotificationsCallback=======================>"); +}); +``` + + + +#### Notification.getActiveNotificationCount(callback: AsyncCallback\) + +- 接口说明 + + 获取当前应用的活动通知数(Callback形式) + +- getActiveNotificationCount参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ---------------------- | ---- | ---------------------- | +| callback | 只读 | AsyncCallback\ | 是 | 获取活动通知数回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function getActiveNotificationCountCallback(err, data) { + console.info("==========================>getActiveNotificationCountCallback=======================>"); +} + +Notification.getActiveNotificationCount(getActiveNotificationCountCallback); +``` + + + +#### Notification.getActiveNotificationCount() + +- 接口说明 + + 获取当前应用的活动通知数(Promise形式) + +- getActiveNotificationCount参数描述 + + 无 + +- 返回值 + + 返回值为Promise\ + +- 示例 + +```js +Notification.getActiveNotificationCount().then((data) => { + console.info("==========================>getActiveNotificationCountCallback=======================>"); +}); +``` + + + +#### Notification.getActiveNotifications(callback: AsyncCallback>) + +- 接口说明 + + 获取当前应用的活动通知(Callback形式) + +- getActiveNotifications参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ------------------------------------------- | ---- | ------------------------------ | +| callback | 只读 | AsyncCallback> | 是 | 获取当前应用的活动通知回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function getActiveNotificationsCallback(err, data) { + console.info("==========================>getActiveNotificationsCallback=======================>"); +} + +Notification.getActiveNotifications(getActiveNotificationsCallback); +``` + + + +#### Notification.getActiveNotifications() + +- 接口说明 + + 获取当前应用的活动通知(Promise形式) + +- getActiveNotifications参数描述 + + 无 + +- 返回值 + + Promise\\> + +- 示例 + +```js +Notification.getActiveNotifications().then((data) => { + console.info("==========================>getActiveNotificationsCallback=======================>"); +}); +``` + + + +#### Notification.cancelGroup(groupName: string, callback: AsyncCallback\) + +- 接口说明 + + 取消本应用指定组通知(Callback形式) + +- cancelGroup参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | --------------------- | ---- | ---------------------------- | +| groupName | 只读 | string | 是 | 指定通知组名称 | +| callback | 只读 | AsyncCallback\ | 是 | 取消本应用指定组通知回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function cancelGroupCallback(err) { + console.info("==========================>cancelGroupCallback=======================>"); +} + +var groupName = "GroupName"; + +Notification.cancelGroup(groupName, cancelGroupCallback); +``` + + + +#### Notification.cancelGroup(groupName: string) + +- 接口说明 + + 取消本应用指定组通知(Promise形式) + +- cancelGroup参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | ------ | ---- | -------------- | +| groupName | 只读 | string | 是 | 指定通知组名称 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var groupName = "GroupName"; +Notification.cancelGroup(groupName).then(() => { + console.info("==========================>cancelGroupPromise=======================>"); +}); +``` + + + +#### Notification.removeGroupByBundle(bundle: BundleOption, groupName: string, callback: AsyncCallback\) + +- 接口说明 + + 删除指定应用指定组通知(Callback形式) + +- removeGroupByBundle参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | --------------------- | ---- | ---------------------------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| groupName | 只读 | string | 是 | 指定通知组名称 | +| callback | 只读 | AsyncCallback\ | 是 | 删除本应用指定组通知回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function removeGroupByBundleCallback(err) { + console.info("==========================>removeGroupByBundleCallback=======================>"); +} + +var bundleOption = {bundle:"Bundle"}; +var groupName = "GroupName"; + +Notification.removeGroupByBundle(bundleOption, groupName, removeGroupByBundleCallback); +``` + + + +#### Notification.removeGroupByBundle(bundle: BundleOption, groupName: string) + +- 接口说明 + + 删除指定应用指定组通知(Promise形式) + +- removeGroupByBundle参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| --------- | -------- | ------------ | ---- | -------------- | +| bundle | 只读 | BundleOption | 是 | 指定包信息 | +| groupName | 只读 | string | 是 | 指定通知组名称 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var bundleOption = {bundle:"Bundle"}; +var groupName = "GroupName"; +Notification.removeGroupByBundle(bundleOption, groupName).then(() => { + console.info("==========================>removeGroupByBundlePromise=======================>"); +}); +``` + + + +#### Notification.setDoNotDisturbDate(date: DoNotDisturbDate, callback: AsyncCallback\) + +- 接口说明 + + 设置免打扰时间(Callback形式) + +- setDoNotDisturbDate参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | ---------------------- | +| date | 只读 | DoNotDisturbDate | 是 | 免打扰时间选项 | +| callback | 只读 | AsyncCallback\ | 是 | 设置免打扰时间回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function setDoNotDisturbDateCallback(err) { + console.info("==========================>setDoNotDisturbDateCallback=======================>"); +} + +var doNotDisturbDate = { + type : notification.DoNotDisturbType.TYPE_ONCE, + begin : new Date(), + end : new Date(2021, 11, 15, 18, 0) +} + +Notification.setDoNotDisturbDate(doNotDisturbDate, setDoNotDisturbDateCallback); +``` + + + +#### Notification.setDoNotDisturbDate(date: DoNotDisturbDate) + +- 接口说明 + + 设置免打扰时间接口(Promise形式) + +- setDoNotDisturbDate参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---- | -------- | ---------------- | ---- | -------------- | +| date | 只读 | DoNotDisturbDate | 是 | 免打扰时间选项 | + +- 返回值 + + Promise\ + +- 示例 + +```js +var doNotDisturbDate = { + type : notification.DoNotDisturbType.TYPE_ONCE, + begin : new Date(), + end : new Date(2021, 11, 15, 18, 0) +} +Notification.setDoNotDisturbDate(doNotDisturbDate).then(() => { + console.info("==========================>setDoNotDisturbDatePromise=======================>"); +}); +``` + + + +#### Notification.getDoNotDisturbDate(callback: AsyncCallback\) + +- 接口说明 + + 查询免打扰时间接口(Callback形式) + +- getDoNotDisturbDate参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------------------- | ---- | ---------------------- | +| callback | 只读 | AsyncCallback\ | 是 | 查询免打扰时间回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function getDoNotDisturbDateCallback(err,data) { + console.info("==========================>getDoNotDisturbDateCallback=======================>"); +} + +Notification.getDoNotDisturbDate(getDoNotDisturbDateCallback); +``` + + + +#### Notification.getDoNotDisturbDate() + +- 接口说明 + + 查询免打扰时间接口(Promise形式) + +- getDoNotDisturbDate参数描述 + + 无 + +- 返回值 + + Promise\ + +- 示例 + +```js +Notification.getDoNotDisturbDate().then((data) => { + console.info("==========================>getDoNotDisturbDatePromise=======================>"); +}); +``` + + + +#### Notification.supportDoNotDisturbMode(callback: AsyncCallback\) + +- 接口说明 + + 查询是否支持勿扰模式功能(Callback形式) + +- supportDoNotDisturbMode参数描述 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ------------------------ | ---- | -------------------------------- | +| callback | 只读 | AsyncCallback\ | 是 | 查询是否支持勿扰模式功能回调函数 | + +- 返回值 + + void + +- 示例 + +```js +function supportDoNotDisturbModeCallback(err,data) { + console.info("==========================>supportDoNotDisturbModeCallback=======================>"); +} + +Notification.supportDoNotDisturbMode(supportDoNotDisturbModeCallback); +``` + + + +#### Notification.supportDoNotDisturbMode() + +- 接口说明 + + 查询是否支持勿扰模式功能(Promise形式) + +- supportDoNotDisturbMode参数描述 + + 无 + +- 返回值 + + Promise\ + +- 示例 + +```js +Notification.supportDoNotDisturbMode().then((data) => { + console.info("==========================>supportDoNotDisturbModePromise=======================>"); +}); +``` + + + +#### WantAgent接口 + +#### 导入模块 + +```js +import WantAgent from '@ohos.wantAgent'; +``` + +#### WantAgent.getWantAgent(info: WantAgentInfo, callback: AsyncCallback\) + +- 接口说明 + + 创建WantAgent(callback形式) + +- getWantAgent参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | -------------------------- | ---- | ----------------------- | +| info | 只读 | WantAgentInfo | 是 | WantAgent信息 | +| callback | 只读 | AsyncCallback\ | 是 | 创建WantAgent的回调方法 | + +- WantAgentInfo类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------------- | -------- | ------------------------------- | ---- | ---------------------- | +| wants | 读、写 | Array\ | 是 | 将被执行的动作列表 | +| operationType | 读、写 | wantAgent.OperationType | 是 | 动作类型 | +| requestCode | 读、写 | number | 是 | 使用者定义的一个私有值 | +| wantAgentFlags | 读、写 | Array | 否 | 动作执行属性 | +| extraInfo | 读、写 | {[key: string]: any} | 否 | 额外数据 | + +- + WantAgentFlags类型说明 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ------------------- | -------- | ---- | ---- | ------------------------------------------------------------ | +| ONE_TIME_FLAG | 只读 | enum | 否 | WantAgent仅能使用一次 | +| NO_BUILD_FLAG | 只读 | enum | 否 | 如果描述WantAgent对象不存在,则不创建它,直接返回null | +| CANCEL_PRESENT_FLAG | 只读 | enum | 否 | 在生成一个新的WantAgent对象前取消已存在的一个WantAgent对象 | +| UPDATE_PRESENT_FLAG | 只读 | enum | 否 | 使用新的WantAgent的额外数据替换已存在的WantAgent中的额外数据 | +| CONSTANT_FLAG | 只读 | enum | 否 | WantAgent是不可变的 | +| REPLACE_ELEMENT | 只读 | enum | 否 | 当前Want中的element属性可被WantAgent.trigger()中Want的element属性取代 | +| REPLACE_ACTION | 只读 | enum | 否 | 当前Want中的action属性可被WantAgent.trigger()中Want的action属性取代 | +| REPLACE_URI | 只读 | enum | 否 | 当前Want中的uri属性可被WantAgent.trigger()中Want的uri属性取代 | +| REPLACE_ENTITIES | 只读 | enum | 否 | 当前Want中的entities属性可被WantAgent.trigger()中Want的entities属性取代 | +| REPLACE_BUNDLE | 只读 | enum | 否 | 当前Want中的bundleName属性可被WantAgent.trigger()中Want的bundleName属性取代 | + +- OperationType类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------------- | -------- | ---- | ---- | ----------------------- | +| UNKNOWN_TYPE | 只读 | enum | 否 | 不识别的类型 | +| START_ABILITY | 只读 | enum | 否 | 开启一个有页面的Ability | +| START_ABILITIES | 只读 | enum | 否 | 开启多个有页面的Ability | +| START_SERVICE | 只读 | enum | 否 | 开启一个无页面的ability | +| SEND_COMMON_EVENT | 只读 | enum | 否 | 发送一个公共事件 | + +- 返回值 + + void + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//getWantAgent回调 +function getWantAgentCallback(err, data) { + console.info("==========================>getWantAgentCallback=======================>"); +} +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) +``` + + + +#### WantAgent.getWantAgent(info: WantAgentInfo): Promise\ + +- 接口说明 + + 创建WantAgent(Promise形式) + +- getWantAgent参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---- | -------- | ------------- | ---- | ------------- | +| info | 只读 | WantAgentInfo | 是 | WantAgent信息 | + +- 返回值 + + Promise\ + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo).then((data) => { + console.info("==========================>getWantAgentCallback=======================>"); +}); +``` + + + +#### WantAgent.getBundleName(agent: WantAgent, callback: AsyncCallback\) + +- 接口说明 + + 获取WantAgent实例的包名(callback形式) + +- getBundleName参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ----------------------- | ---- | --------------------------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | +| callback | 只读 | AsyncCallback\ | 是 | 获取WantAgent实例的包名的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent; + +//getWantAgent回调 +function getWantAgentCallback(err, data) { + console.info("==========================>getWantAgentCallback=======================>"); + if (err.code == 0) { + WantAgent = data; + } else { + console.info('----getWantAgent failed!----'); + } +} +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) + +//getBundleName回调 +function getBundleNameCallback(err, data) { + console.info("==========================>getBundleNameCallback=======================>"); +} +wantAgent.getBundleName(WantAgent, getBundleNameCallback) +``` + + + +#### WantAgent.getBundleName(agent: WantAgent): Promise\ + +- 接口说明 + + 获取WantAgent实例的包名(Promise形式) + +- getBundleName参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----- | -------- | --------- | ---- | ------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | + +- 返回值 + + Promise\ + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent; + +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo).then((data) => { + console.info("==========================>getWantAgentCallback=======================>"); + WantAgent = data; +}); + +wantAgent.getBundleName(WantAgent).then((data) => { + console.info("==========================>getBundleNameCallback=======================>"); +}); +``` + + + +#### WantAgent.getUid(agent: WantAgent, callback: AsyncCallback\) + +- 接口说明 + + 获取WantAgent实例的用户ID(callback形式) + +- getUid参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ----------------------- | ---- | ----------------------------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | +| callback | 只读 | AsyncCallback\ | 是 | 获取WantAgent实例的用户ID的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent; + +//getWantAgent回调 +function getWantAgentCallback(err, data) { + console.info("==========================>getWantAgentCallback=======================>"); + if (err.code == 0) { + WantAgent = data; + } else { + console.info('----getWantAgent failed!----'); + } +} +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) + +//getUid回调 +function getUidCallback(err, data) { + console.info("==========================>getUidCallback=======================>"); +} +wantAgent.getUid(WantAgent, getUidCallback) +``` + + + +#### WantAgent.getUid(agent: WantAgent): Promise\ + +- 接口说明 + + 获取WantAgent实例的用户ID(Promise形式) + +- getUid参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----- | -------- | --------- | ---- | ------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | + +- 返回值 + + Promise\ + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent; + +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo).then((data) => { + console.info("==========================>getWantAgentCallback=======================>"); + WantAgent = data; +}); + +wantAgent.getUid(WantAgent).then((data) => { + console.info("==========================>getUidCallback=======================>"); +}); +``` + + + +#### WantAgent.getWant(agent: WantAgent, callback: AsyncCallback\) + +- 接口说明 + + 获取WantAgent对象的want(callback形式) + +- getWant参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | ------------------------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | +| callback | 只读 | AsyncCallback\ | 是 | 获取WantAgent对象want的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent; + +//getWantAgent回调 +function getWantAgentCallback(err, data) { + console.info("==========================>getWantAgentCallback=======================>"); + if (err.code == 0) { + WantAgent = data; + } else { + console.info('----getWantAgent failed!----'); + } +} +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentWantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) + +//getWant回调 +function getWantCallback(err, data) { + console.info("==========================>getWantCallback=======================>"); +} +wantAgent.getWant(WantAgent, getWantCallback) +``` + + + +#### WantAgent.getWant(agent: WantAgent): Promise\ + +- 接口说明 + + 获取WantAgent对象的Uid(Promise形式) + +- getWant参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----- | -------- | --------- | ---- | ------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | + +- 返回值 + + Promise\ + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent; + +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo).then((data) => { + console.info("==========================>getWantAgentCallback=======================>"); + WantAgent = data; +}); + +wantAgent.getWant(WantAgent).then((data) => { + console.info("==========================>getWantCallback=======================>"); +}); +``` + + + +#### WantAgent.cancel(agent: WantAgent, callback: AsyncCallback\) + +- 接口说明 + + 取消WantAgent实例(callback形式) + +- cancel参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | --------------------- | ---- | --------------------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | +| callback | 只读 | AsyncCallback\ | 是 | 取消WantAgent实例的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent; + +//getWantAgent回调 +function getWantAgentCallback(err, data) { + console.info("==========================>getWantAgentCallback=======================>"); + if (err.code == 0) { + WantAgent = data; + } else { + console.info('----getWantAgent failed!----'); + } +} +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) + +//cancel回调 +function cancelCallback(err, data) { + console.info("==========================>cancelCallback=======================>"); +} +wantAgent.cancel(WantAgent, cancelCallback) +``` + + + +#### WantAgent.cancel(agent: WantAgent): Promise\ + +- 接口说明 + + 取消WantAgent实例(Promise形式) + +- cancel参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----- | -------- | --------- | ---- | ------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | + +- 返回值 + + Promise\ + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent; + +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo).then((data) => { + console.info("==========================>getWantAgentCallback=======================>"); + WantAgent = data; +}); + +wantAgent.cancel(WantAgent).then((data) => { + console.info("==========================>cancelCallback=======================>"); +}); +``` + + + +#### WantAgent.trigger(agent: WantAgent, triggerInfo: TriggerInfo, callback?: Callback\) + +- 接口说明 + + 主动激发WantAgent实例(callback形式) + +- trigger参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | ----------------------------- | ---- | ------------------------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | +| triggerInfo | 只读 | TriggerInfo | 是 | TriggerInfo对象 | +| callback | 只读 | AsyncCallback\ | 是 | 主动激发WantAgent实例的回调方法 | + +- TriggerInfo类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | -------------------- | ---- | ----------- | +| code | 读、写 | number | 是 | result code | +| want | 读、写 | Want | 否 | Want | +| permission | 读、写 | string | 否 | 权限定义 | +| extraInfo | 读、写 | {[key: string]: any} | 否 | 额外数据 | + +- 返回值 + + void + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent; + +//getWantAgent回调 +function getWantAgentCallback(err, data) { + console.info("==========================>getWantAgentCallback=======================>"); + if (err.code == 0) { + WantAgent = data; + } else { + console.info('----getWantAgent failed!----'); + } +} +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) + +//trigger回调 +function triggerCallback(err, data) { + console.info("==========================>triggerCallback=======================>"); +} + +var triggerInfo = { + code:0 +} +wantAgent.trigger(WantAgent, triggerInfo, triggerCallback) +``` + + + +#### WantAgent.equal(agent: WantAgent, otherAgent: WantAgent, callback: AsyncCallback\) + +- 接口说明 + + 判断两个WantAgent实例是否相等(callback形式) + +- equal参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ------------------------ | ---- | --------------------------------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | +| otherAgent | 只读 | WantAgent | 是 | WantAgent对象 | +| callback | 只读 | AsyncCallback\ | 是 | 判断两个WantAgent实例是否相等的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent1; +var WantAgent2; + +//getWantAgent回调 +function getWantAgentCallback(err, data) { + console.info("==========================>getWantAgentCallback=======================>"); + if (err.code == 0) { + WantAgent1 = data; + WantAgent2 = data; + } else { + console.info('----getWantAgent failed!----'); + } +} +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback) + +//equal回调 +function equalCallback(err, data) { + console.info("==========================>equalCallback=======================>"); +} +wantAgent.equal(WantAgent1, WantAgent1, equalCallback) +``` + + + +#### WantAgent.equal(agent: WantAgent, otherAgent: WantAgent): Promise\ + +- 接口说明 + + 判断两个WantAgent实例是否相等(Promise形式) + +- equal参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | --------- | ---- | ------------- | +| agent | 只读 | WantAgent | 是 | WantAgent对象 | +| otherAgent | 只读 | WantAgent | 是 | WantAgent对象 | + +- 返回值 + + Promise\ + +- 示例 + +```js +import wantAgent from '@ohos.wantAgent'; +import { OperationType, Flags } from '@ohos.wantagent'; + +//wantAgent对象 +var WantAgent1; +var WantAgent2; + +//WantAgentInfo对象 +var wantAgentInfo = { + wants: [ + { + deviceId: "deviceId", + bundleName: "com.neu.setResultOnAbilityResultTest1", + abilityName: "com.example.test.MainAbility", + action: "action1", + entities: ["entity1"], + type: "MIMETYPE", + uri: "key={true,true,false}", + parameters: + { + mykey0: 2222, + mykey1: [1, 2, 3], + mykey2: "[1, 2, 3]", + mykey3: "ssssssssssssssssssssssssss", + mykey4: [false, true, false], + mykey5: ["qqqqq", "wwwwww", "aaaaaaaaaaaaaaaaa"], + mykey6: true, + } + } + ], + operationType: OperationType.START_ABILITIES, + requestCode: 0, + wantAgentFlags:[WantAgentFlags.UPDATE_PRESENT_FLAG] +} + +wantAgent.getWantAgent(wantAgentInfo).then((data) => { + console.info("==========================>getWantAgentCallback=======================>"); + WantAgent = data; +}); + +wantAgent.equal(WantAgent1, WantAgent2).then((data) => { + console.info("==========================>equalCallback=======================>"); +}); +``` + + + +#### + + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/08.Context\346\250\241\345\235\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/08.Context\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..cfd8437b0e6f4bb99b09707a66d2d1def35d5080 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/01.Ability\346\241\206\346\236\266/08.Context\346\250\241\345\235\227.md" @@ -0,0 +1,555 @@ +--- +title: Context模块 +permalink: /pages/000b000007 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# Context模块(JS端SDK接口) + +#### 支持设备 + +| API | 手机 | 平板 | 智慧屏 | 智能穿戴 | 轻量级智能穿戴 | 智慧视觉设备 | +| ------------------------------------------------------------ | ---- | ---- | ------ | -------- | -------------- | ------------ | +| Context.getOrCreateLocalDir(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getOrCreateLocalDir() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.verifyPermission(permission: string, options: PermissionOptions, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.verifyPermission(permission: string, callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.verifyPermission(permission: string, options?: PermissionOptions) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.requestPermissionsFromUser(permissions: Array\, requestCode: number, resultCallback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getApplicationInfo(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getApplicationInfo() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getBundleName(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getBundleName() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getProcessInfo(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getProcessInfo() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getElementName(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getElementName() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getProcessName(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getProcessName() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getCallingBundle(callback: AsyncCallback\) | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | +| Context.getCallingBundle() | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 | + +#### 权限列表 + +**ohos.permission.RUNNING_LOCK permission** + +#### 导入模块 + +``` +import featureAbility from '@ohos.ability.featureAbility' +import bundle from '@ohos.bundle' +``` + +#### Context.getOrCreateLocalDir(callback: AsyncCallback\) + +- 接口说明 + + 获取应用程序的本地根目录。如果是第一次调用,将创建目录(callback形式) + +- getOrCreateLocalDir参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------- | -------- | ----------------------- | ---- | ---------------- | +| callback | 只读 | AsyncCallback\) | 是 | 被指定的回调方法 | + +- 返回值 + + 根目录 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getOrCreateLocalDir() +``` + + + +#### Context.getOrCreateLocalDir() + +- 接口说明 + + 获取应用程序的本地根目录。如果是第一次调用,将创建目录(Promise形式) + +- 返回值 + + 根目录 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getOrCreateLocalDir().then((void) => { + console.info("==========================>getOrCreateLocalDirCallback=======================>"); +}); +``` + + + +#### Context.verifyPermission(permission: string, options: PermissionOptions, callback: AsyncCallback\) + +- 接口说明 + + 验证系统中运行的特定pid和uid是否允许指定的权限(callback形式) + +- verifyPermission参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ---------------------- | ---- | ---------------- | +| permission | 只读 | string | 是 | 指定权限的名称 | +| options | 只读 | PermissionOptions | 是 | 进程id | +| callback | 只读 | AsyncCallback\ | 是 | 被指定的回调方法 | + +- PermissionOptions类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---- | -------- | ------ | ---- | ------ | +| pid | 只读 | number | 否 | 进程id | +| uid | 只读 | number | 否 | 用户id | + +- 返回值 + + 如果PID和UID具有权限,则使用{@code 0}进行异步回调;否则使用{@code-1}回调。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +import bundle from '@ohos.bundle' +var context = featureAbility.getContext(); +var datainfo = await bundle.getBundleInfo('com.context.test',1); +context.verifyPermission("com.example.permission",datainfo.uid,) + +``` + + + +#### Context.verifyPermission(permission: string, callback: AsyncCallback\) + +- 接口说明 + + 验证系统中运行的特定pid和uid是否允许指定的权限(callback形式) + +- 参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ----------------------- | ---- | ---------------- | +| permission | 只读 | string | 是 | 指定权限的名称 | +| callback | 只读 | AsyncCallback\) | 是 | 被指定的回调方法 | + +- 返回值 + + 如果PID和UID具有权限,则使用{@code 0}进行异步回调;否则使用{@code-1}回调。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.verifyPermission("com.example.permission") +``` + + + +#### Context.verifyPermission(permission: string, options?: PermissionOptions) + +- 接口说明 + + 验证系统中运行的特定pid和uid是否允许指定的权限(Promise形式) +- verifyPermission参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---------- | -------- | ----------------- | ---- | -------------- | +| permission | 只读 | string | 是 | 指定权限的名称 | +| options | 只读 | PermissionOptions | 否 | 进程id | + +- PermissionOptions类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ---- | -------- | ------ | ---- | ------ | +| pid | 只读 | number | 否 | 进程id | +| uid | 只读 | number | 否 | 用户id | + +- 返回值 + + 如果PID和UID具有权限,则使用{@code 0}进行异步回调;否则使用{@code-1}回调。 + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +var Permission = context.PermissionOptions(1,1); +context.getOrCreateLocalDir('com.context.permission',Permission).then((void) => { + console.info("==========================>verifyPermissionCallback=======================>"); +}); +``` + + + +#### Context.requestPermissionsFromUser(permissions: Array\, requestCode: number, resultCallback: AsyncCallback\) + +- 接口说明 + + 从系统请求某些权限(callback形式) + +- requestPermissionsFromUser参数描述 + + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| -------------- | -------- | ---------------------------------------- | ---- | --------------------------------------------- | +| permissions | 只读 | Array\ | 是 | 指示要请求的权限列表。此参数不能为null | +| requestCode | 只读 | number | 是 | 指示要传递给PermissionRequestResult的请求代码 | +| resultCallback | 只读 | AsyncCallback\) | 是 | 被指定的回调方法 | +- PermissionRequestResult类型说明 + +| 名称 | 读写属性 | 类型 | 必填 | 描述 | +| ----------- | -------- | -------------- | ---- | ------------------ | +| requestCode | 只读 | number | 是 | 用户传入的请求代码 | +| permissions | 只读 | Array\ | 是 | 用户传入的权限 | +| authResults | 只读 | Array\ | 是 | 求权限的结果 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getOrCreateLocalDir( + ["com.example.permission1", + "com.example.permission2", + "com.example.permission3", + "com.example.permission4", + "com.example.permission5"], + 1, +) +``` + + + +#### Context.getApplicationInfo(callback: AsyncCallback\) + +- 接口说明 + + 获取有关当前应用程序的信息(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ------------------------------- | ---- | -------------------- | + | callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getApplicationInfo() +``` + + + +#### Context.getApplicationInfo() + +- 接口说明 + + 获取有关当前应用程序的信息(Promise形式) + +- 参数描述 + + Null + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getApplicationInfo().then((void) => { + console.info("==========================>getApplicationInfoCallback=======================>"); +}); +``` + + + +#### Context.getBundleName(callback: AsyncCallback\) + +- 接口说明 + + 获取当前ability的捆绑包名称(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | -------------------- | + | callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getBundleName() +``` + + + +#### Context.getBundleName() + +- 接口说明 + + 获取当前ability的捆绑包名称(Promise形式) + +- 参数描述 + + Null + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getBundleName().then((void) => { + console.info("==========================>getBundleNameCallback=======================>"); +}); +``` + + + +#### Context.getProcessInfo(callback: AsyncCallback\) + +- 接口说明 + + 获取有关当前进程的信息,包括进程ID和名称(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | --------------------------- | ---- | -------------------- | + | callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getProcessInfo() +``` + + + +#### Context.getProcessInfo() + +- 接口说明 + + 获取有关当前进程的信息,包括进程ID和名称(Promise形式) + +- 参数描述 + + Null + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getProcessInfo().then((void) => { + console.info("==========================>getProcessInfoCallback=======================>"); +}); +``` + + + +#### Context.getElementName(callback: AsyncCallback\) + +- 接口说明 + + 获取当前能力的ohos.bundle.ElementName对象。此方法仅适用于页面功能(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | --------------------------- | ---- | -------------------- | + | callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getElementName() +``` + + + +#### Context.getElementName() + +- 接口说明 + + 获取当前能力的ohos.bundle.ElementName对象。此方法仅适用于页面功能(Promise形式) + +- 参数描述 + + Null + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getElementName().then((void) => { + console.info("==========================>getElementNameCallback=======================>"); +}); +``` + +#### + +#### Context.getProcessName(callback: AsyncCallback\) + +- 接口说明 + + 获取当前进程的名称(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | -------------------- | + | callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getProcessName() +``` + + + +#### Context.getProcessName() + +- 接口说明 + + 获取当前进程的名称(Promise形式) + +- 参数描述 + + Null + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getProcessName().then((void) => { + console.info("==========================>getProcessNameCallback=======================>"); +}); +``` + + + +#### Context.getCallingBundle(callback: AsyncCallback\) + +- 接口说明 + + 获取调用当前能力的能力的捆绑包名称(callback形式) + +- 参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | -------------------- | + | callback | 只读 | AsyncCallback\ | 是 | 表示被指定的回调方法 | + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getCallingBundle() +``` + + + +#### Context.getCallingBundle() + +- 接口说明 + + 获取调用当前能力的能力的捆绑包名称(Promise形式) + +- 参数描述 + + Null + +- 返回值 + + void + +- 示例 + +```js +import featureAbility from '@ohos.ability.featureAbility' +var context = featureAbility.getContext(); +context.getCallingBundle().then((void) => { + console.info("==========================>getCallingBundleCallback=======================>"); +}); +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/02.\350\265\204\346\272\220\347\256\241\347\220\206/01.\350\265\204\346\272\220\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/02.\350\265\204\346\272\220\347\256\241\347\220\206/01.\350\265\204\346\272\220\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..3b0070cb2540981794f39b690864d15a2cd95a7b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/02.\350\265\204\346\272\220\347\256\241\347\220\206/01.\350\265\204\346\272\220\347\256\241\347\220\206.md" @@ -0,0 +1,572 @@ +--- +title: 资源管理 +permalink: /pages/000b000100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 资源管理 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import resourceManager from '@ohos.resourceManager'; +``` + + +## 权限 + +无 + + +## resourceManager.getResourceManager + +getResourceManager(callback: AsyncCallback<ResourceManager>): void + +获取当前应用的资源管理对象,使用callback形式返回ResourceManager对象。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<[ResourceManager](#resourcemanager)> | 是 | callback方式返回ResourceManager对象 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + if (error != null) { + console.log("error occurs" + error); + return; + } + mgr.getString(0x1000000, (error, value) => { + if (error != null) { + console.log(value); + } else { + console.log(value); + } + }); + }); + ``` + + +## resourceManager.getResourceManager + +getResourceManager(bundleName: string, callback: AsyncCallback<ResourceManager>): void + +获取指定应用的资源管理对象,使用callback形式返回ResourceManager对象。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | bundleName | string | 是 | 指定应用的Bundle名称 | + | callback | AsyncCallback<[ResourceManager](#resourcemanager)> | 是 | callback方式返回ResourceManager对象 | + +- 示例: + ``` + resourceManager.getResourceManager("com.example.myapplication", (error, mgr) => { + }); + ``` + + +## resourceManager.getResourceManager + +getResourceManager(): Promise<ResourceManager> + +获取当前应用的资源管理对象,使用Promise形式返回ResourceManager对象。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<[ResourceManager](#resourcemanager)> | Promise方式返回资源管理对象 | + +- 示例: + ``` + resourceManager.getResourceManager().then(mgr => { + mgr.getString(0x1000000, (error, value) => { + if (error != null) { + console.log(value); + } else { + console.log(value); + } + }); + }).catch(error => { + console.log(error); + }); + ``` + + +## resourceManager.getResourceManager + +getResourceManager(bundleName: string): Promise<ResourceManager> + +获取指定应用的资源管理对象,使用Promise形式返回ResourceManager对象。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | bundleName | string | 是 | 指定应用的Bundle名称 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<[ResourceManager](#resourcemanager)> | Promise方式返回的资源管理对象 | + +- 示例: + ``` + resourceManager.getResourceManager("com.example.myapplication").then(mgr => { + + }).catch(error => { + + }); + ``` + + +## Direction + +用于表示设备屏幕方向。 + +| 名称 | 默认值 | 说明 | +| -------- | -------- | -------- | +| DIRECTION_VERTICAL | 0 | 竖屏 | +| DIRECTION_HORIZONTAL | 1 | 横屏 | + + +## DeviceType + +用于表示当前设备类型。 + +| 名称 | 默认值 | 说明 | +| -------- | -------- | -------- | +| DEVICE_TYPE_PHONE | 0x00 | 手机 | +| DEVICE_TYPE_TABLET | 0x01 | 平板 | +| DEVICE_TYPE_CAR | 0x02 | 汽车 | +| DEVICE_TYPE_PC | 0x03 | 电脑 | +| DEVICE_TYPE_TV | 0x04 | 电视 | +| DEVICE_TYPE_WEARABLE | 0x06 | 穿戴 | + + +## ScreenDensity + +用于表示当前设备屏幕密度。 + +| 名称 | 默认值 | 说明 | +| -------- | -------- | -------- | +| SCREEN_SDPI | 120 | 小规模的屏幕密度 | +| SCREEN_MDPI | 160 | 中规模的屏幕密度 | +| SCREEN_LDPI | 240 | 大规模的屏幕密度 | +| SCREEN_XLDPI | 320 | 特大规模的屏幕密度 | +| SCREEN_XXLDPI | 480 | 超大规模的屏幕密度 | +| SCREEN_XXXLDPI | 640 | 超特大规模的屏幕密度 | + + +## Configuration + +表示当前设备的状态。 + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| direction | [Direction](#direction) | 是 | 否 | 当前设备屏幕方向 | +| locale | string | 是 | 否 | 当前系统语言 | + + +## DeviceCapability + +表示设备支持的能力。 + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| screenDensity | [ScreenDensity](#screendensity) | 是 | 否 | 当前设备屏幕密度 | +| deviceType | [DeviceType](#devicetype) | 是 | 否 | 当前设备类型 | + + +## ResourceManager + +提供访问应用资源的能力。 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> - ResourceManager涉及到的方法,仅限基于TS扩展的声明式开发范式使用。 +> +> - 资源文件在工程的resources目录中定义,id可通过$r(资源地址).id的方式获取,例如$r('app.string.test').id。 + + +### getString + +getString(resId: number, callback: AsyncCallback<string>): void + +用户获取指定资源ID对应的字符串,使用callback形式返回字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | resId | number | 是 | 资源ID值 | + | callback | AsyncCallback<string> | 是 | 异步回调,用于返回获取的字符串 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getString($r('app.string.test').id, (error, value) => { + if (error != null) { + console.log(value); + } else { + console.log(value); + } + }); + }); + ``` + + +### getString + +getString(resId: number): Promise<string> + +用户获取指定资源ID对应的字符串,使用Promise形式返回字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | resId | number | 是 | 资源ID值 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<string> | 资源ID值对应的字符串 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getString($r('app.string.test').id).then(value => { + console.log(value); + }).catch(error => { + console.log("getstring promise " + error); + }); + }); + ``` + + +### getStringArray + +getStringArray(resId: number, callback: AsyncCallback<Array<string>>): void + +用户获取指定资源ID对应的字符串数组,使用callback形式返回字符串数组。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | resId | number | 是 | 资源ID值 | + | callback | AsyncCallback<Array<string>> | 是 | 异步回调,用于返回获取的字符串数组 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getStringArray($r('app.strarray.test').id, (error, value) => { + if (error != null) { + console.log(value); + } else { + console.log(value); + } + }); + }); + ``` + + +### getStringArray + +getStringArray(resId: number): Promise<Array<string>> + +用户获取指定资源ID对应的字符串数组,使用Promise形式返回字符串数组。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | resId | number | 是 | 资源ID值 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<Array<string>> | 资源ID值对应的字符串数组 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getStringArray($r('app.strarray.test').id).then(value => { + console.log(value); + }).catch(error => { + console.log("getstring promise " + error); + }); + }); + ``` + + +### getMedia + +getMedia(resId: number, callback: AsyncCallback<Uint8Array>): void + +用户获取指定资源ID对应的媒体文件内容,使用callback形式返回字节数组。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | resId | number | 是 | 资源ID值 | + | callback | AsyncCallback<Array<Uint8Array>> | 是 | 异步回调,用于返回获取的媒体文件内容 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getMedia($r('app.media.test').id, (error, value) => { + if (error != null) { + console.log(value); + } else { + console.log(value); + } + }); + }); + ``` + + +### getMedia + +getMedia(resId: number): Promise<Uint8Array> + +用户获取指定资源ID对应的媒体文件内容,使用Promise形式返回字节数组。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | resId | number | 是 | 资源ID值 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<Array<Uint8Array>> | 资源ID值对应的媒体文件内容 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getMedia($r('app.media.test').id).then(value => { + console.log(value); + }).catch(error => { + console.log("getstring promise " + error); + }); + }); + ``` + + +### getMediaBase64 + +getMediaBase64(resId: number, callback: AsyncCallback<string>): void + +用户获取指定资源ID对应的图片资源Base64编码,使用callback形式返回字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | resId | number | 是 | 资源ID值 | + | callback | AsyncCallback<string> | 是 | 异步回调,用于返回获取的图片资源Base64编码 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getMediaBase64($r('app.media.test').id, (error, value) => { + if (error != null) { + console.log(value); + } else { + console.log(value); + } + }); + }); + ``` + + +### getMediaBase64 + +getMediaBase64(resId: number): Promise<string> + +用户获取指定资源ID对应的图片资源Base64编码,使用Promise形式返回字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | resId | number | 是 | 资源ID值 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<string> | 资源ID值对应的图片资源Base64编码 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getMediaBase64($r('app.media.test').id).then(value => { + console.log(value); + }).catch(error => { + console.log("getstring promise " + error); + }); + }); + ``` + + +### getConfiguration + +getConfiguration(callback: AsyncCallback<Configuration>): void + +用户获取设备的Configuration,使用callback形式返回Configuration对象。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<[Configuration](#configuration)> | 是 | 异步回调,用于返回设备的Configuration | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getConfiguration((error, value) => { + if (error != null) { + console.log(value); + } else { + console.log(value); + } + }); + }); + ``` + + +### getConfiguration + +getConfiguration(): Promise<Configuration> + +用户获取设备的Configuration,使用Promise形式返回Configuration对象。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<[Configuration](#configuration)> | 设备的Configuration | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getConfiguration().then(value => { + console.log(value); + }).catch(error => { + console.log("getstring promise " + error); + }); + }); + ``` + + +### getDeviceCapability + +getDeviceCapability(callback: AsyncCallback<DeviceCapability>): void + +用户获取设备的DeviceCapability,使用callback形式返回DeviceCapability对象。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<[DeviceCapability](#devicecapability)> | 是 | 异步回调,用于返回设备的DeviceCapability | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getDeviceCapability((error, value) => { + if (error != null) { + console.log(value); + } else { + console.log(value); + } + }); + }); + ``` + + +### getDeviceCapability + +getDeviceCapability(): Promise<DeviceCapability> + +用户获取设备的DeviceCapability,使用Promise形式返回DeviceCapability对象。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<[DeviceCapability](#devicecapability)> | 设备的DeviceCapability | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getDeviceCapability().then(value => { + console.log(value); + }).catch(error => { + console.log("getstring promise " + error); + }); + }); + ``` + + +### getPluralString + +getPluralString(resId: number, num: number, callback: AsyncCallback<string>): void + +根据指定数量获取指定ID字符串表示的单复数字符串,使用callback形式返回字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | resId | number | 是 | 资源ID值 | + | num | number | 是 | 数量值 | + | callback | AsyncCallback<string> | 是 | 异步回调,返回根据指定数量获取指定ID字符串表示的单复数字符串 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getPluralString($r("app.plural.test").id, 1, (error, value) => { + if (error != null) { + console.log(value); + } else { + console.log(value); + } + }); + }); + ``` + + +### getPluralString + +getPluralString(resId: number, num: number): Promise<string> + +根据指定数量获取对指定ID字符串表示的单复数字符串,使用Promise形式返回字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | resId | number | 是 | 资源ID值 | + | num | number | 是 | 数量值 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<string> | 根据提供的数量获取对应ID字符串表示的单复数字符串 | + +- 示例: + ``` + resourceManager.getResourceManager((error, mgr) => { + mgr.getPluralString($r("app.plural.test").id, 1).then(value => { + console.log(value); + }).catch(error => { + console.log("getstring promise " + error); + }); + }); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/02.\350\265\204\346\272\220\347\256\241\347\220\206/02.\345\233\275\351\231\205\345\214\226\357\274\210I18n\357\274\211.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/02.\350\265\204\346\272\220\347\256\241\347\220\206/02.\345\233\275\351\231\205\345\214\226\357\274\210I18n\357\274\211.md" new file mode 100644 index 0000000000000000000000000000000000000000..2661fac17f956edd693b7e16f5da167648e5962c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/02.\350\265\204\346\272\220\347\256\241\347\220\206/02.\345\233\275\351\231\205\345\214\226\357\274\210I18n\357\274\211.md" @@ -0,0 +1,132 @@ +--- +title: 国际化(I18n) +permalink: /pages/000b000101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 国际化-I18n + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> - 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> +> - I18N模块包含国际化能力增强接口(未在ECMA 402中定义)。 + + +## 导入模块 + +``` +import i18n from '@ohos.i18n'; +``` + + +## 权限 + +无 + + +## i18n.getDisplayLanguage + +getDisplayLanguage(language: string, locale: string, sentenceCase?: boolean): string + +获取指定语言的本地化显示文本。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | language | string | 是 | 指定语言 | + | locale | string | 是 | 显示指定语言的区域ID | + | sentenceCase | boolean | 否 | 本地化显示文本是否要首字母大写 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 指定语言的本地化显示文本 | + +- 示例: + ``` + i18n.getDisplayLanguage("zh", "en-GB", true); + i18n.getDisplayLanguage("zh", "en-GB"); + ``` + + +## i18n.getDisplayCountry + +getDisplayCountry(country: string, locale: string, sentenceCase?: boolean): string + +获取指定国家的本地化显示文本。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | country | string | 是 | 指定国家 | + | locale | string | 是 | 显示指定国家的区域ID | + | sentenceCase | boolean | 否 | 本地化显示文本是否要首字母大写 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 指定国家的本地化显示文本 | + +- 示例: + ``` + i18n.getDisplayCountry("zh-CN", "en-GB", true); + i18n.getDisplayCountry("zh-CN", "en-GB"); + ``` + + +## i18n.getSystemLanguage + +getSystemLanguage(): string + +获取系统语言。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 系统语言ID | + +- 示例: + ``` + i18n.getSystemLanguage(); + ``` + + +## i18n.getSystemRegion + +getSystemRegion(): string + +获取系统地区。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 系统地区ID | + +- 示例: + ``` + i18n.getSystemRegion(); + ``` + + +## i18n.getSystemLocale + +getSystemLocale(): string + +获取系统区域。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 系统区域ID | + +- 示例: + ``` + i18n.getSystemLocale(); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/02.\350\265\204\346\272\220\347\256\241\347\220\206/03.\345\233\275\351\231\205\345\214\226\357\274\210Intl\357\274\211.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/02.\350\265\204\346\272\220\347\256\241\347\220\206/03.\345\233\275\351\231\205\345\214\226\357\274\210Intl\357\274\211.md" new file mode 100644 index 0000000000000000000000000000000000000000..a0f46a548f536b23ebcfeb4e426350355fdf5749 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/02.\350\265\204\346\272\220\347\256\241\347\220\206/03.\345\233\275\351\231\205\345\214\226\357\274\210Intl\357\274\211.md" @@ -0,0 +1,370 @@ +--- +title: 国际化(Intl) +permalink: /pages/000b000102 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 国际化-Intl + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> - 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> +> - Intl模块包含国际化能力基础接口(在ECMA 402中定义)。 + + +## 导入模块 + +``` +import Intl from '@ohos.intl'; +``` + + +## 权限 + +无 + + +## Locale + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| language | string | 是 | 否 | 与区域设置关联的语言 | +| script | string | 是 | 否 | 语言的书写方式 | +| region | string | 是 | 否 | 与区域设置相关的地区 | +| baseName | string | 是 | 否 | Locale的基本核心信息 | +| caseFirst | string | 是 | 否 | 区域的整理规则是否考虑大小写 | +| calendar | string | 是 | 否 | 区域的日历信息 | +| collation | string | 是 | 否 | 区域的排序规则 | +| hourCycle | string | 是 | 否 | 区域的时制信息 | +| numberingSystem | string | 是 | 否 | 区域使用的数字系统 | +| numeric | boolean | 是 | 否 | 是否对数字字符具有特殊的排序规则处理 | + + +### constructor + +constructor(locale: string, options?:options) + +创建区域对象 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | locale | string | 是 | 包含区域设置信息的字符串,包括语言以及可选的脚本和区域。 | + | options | options | 否 | 用于创建区域对象的选项。 | + +- 示例: + ``` + var locale = new Intl.Locale("zh-CN"); + ``` + + +### toString + +toString(): string + +将区域信息转换为字符串 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 字符串形式的区域信息 | + + +- 示例: + ``` + var locale = new Intl.Locale("zh-CN"); + locale.toString(); + ``` + + +### maximize + +maximize(): Locale + +最大化区域信息,若缺少脚本与地区信息,则补齐。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Locale | 最大化后的区域对象 | + + +- 示例: + ``` + var locale = new Intl.Locale("zh-CN"); + locale.maximize(); + ``` + + +### minimize + +minimize(): Locale + +最小化区域信息,若包含脚本与地区信息,则去除。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Locale | 最小化后的区域对象 | + + +- 示例: + ``` + var locale = new Intl.Locale("zh-CN"); + locale.minimize(); + ``` + + +## DateTimeFormat + + +### constructor + +constructor(locale: string, options?:DateTimeOptions) + +创建时间日期格式化对象。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | locale | string | 是 | 包含区域设置信息的字符串,包括语言以及可选的脚本和区域。 | + | options | [DateTimeOptions](#datetimeoptions) | 否 | 用于创建时间日期格式化的选项。 | + +- 示例: + ``` + var datefmt= new Intl.DateTimeFormat("zh-CN", { dateStyle: 'full', timeStyle: 'medium' }); + ``` + + +### constructor + +constructor(locales: Array<string>, options?:DateTimeOptions) + +创建时间日期格式化对象。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | locales | Array<string> | 是 | 包含区域设置信息的字符串的数组。 | + | options | [DateTimeOptions](#datetimeoptions) | 否 | 用于创建时间日期格式化的选项。 | + +- 示例: + ``` + var datefmt= new Intl.DateTimeFormat(["ban", "zh"], { dateStyle: 'full', timeStyle: 'medium' }); + ``` + + +### format + +format(date: Date): string; + +格式化时间日期字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | date | Date | 是 | 时间日期对象。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 格式化后的时间日期字符串 | + + +- 示例: + ``` + var date = new Date(2021, 11, 17, 3, 24, 0); + var datefmt = new Intl.DateTimeFormat("en-GB"); + datefmt.format(date); + ``` + + +### formatRange + +formatRange(fromDate: Date, toDate: Date): string; + +格式化时间日期段字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | startDate | Date | 是 | 起始的时间日期 | + | endDate | Date | 是 | 结束的时间日期 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 格式化后的时间日期段字符串 | + + +- 示例: + ``` + var startDate = new Date(2021, 11, 17, 3, 24, 0); + var endDate = new Date(2021, 11, 18, 3, 24, 0); + var datefmt = new Intl.DateTimeFormat("en-GB"); + datefmt.formatRange(startDate, endDate); + ``` + + +### resolvedOptions + +resolvedOptions(): DateTimeOptions + +获取DateTimeFormat 对象的格式化选项。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DateTimeOptions](#datetimeoptions) | DateTimeFormat 对象的格式化选项。 | + + +- 示例: + ``` + var datefmt = new Intl.DateTimeFormat("en-GB"); + datefmt.resolvedOptions(); + ``` + + +## NumberFormat + + +### constructor + +constructor(locale: string, options?:NumberOptions) + +创建数字格式化对象。 + +参数: +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| locale | string | 是 | 包含区域设置信息的字符串,包括语言以及可选的脚本和区域。 | +| options | [NumberOptions](#numberoptions) | 否 | 用于创建数字格式化的选项。 | + +- 示例: + ``` + var numfmt = new Intl.NumberFormat("en-GB", {style:'decimal', notation:"scientific"}); + ``` + + +### constructor + +constructor(locales: Array<string>, options?:NumberOptions) + +创建数字格式化对象。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | locales | Array<string> | 是 | 包含区域设置信息的字符串的数组。 | + | options | [NumberOptions](#numberoptions) | 否 | 用于创建数字格式化的选项。 | + +- 示例: + ``` + var numfmt = new Intl.NumberFormat(["en-GB", "zh"], {style:'decimal', notation:"scientific"}); + ``` + + +### format + +format(number: number): string; + +格式化数字字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | number | number | 是 | 数字对象 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 格式化后的数字字符串 | + + +- 示例: + ``` + var numfmt = new Intl.NumberFormat(["en-GB", "zh"], {style:'decimal', notation:"scientific"}); + numfmt.format(1223); + ``` + + +### resolvedOptions + +resolvedOptions(): NumberOptions + +获取NumberFormat 对象的格式化选项。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [NumberOptions](#numberoptions) | NumberFormat 对象的格式化选项。 | + + +- 示例: + ``` + var numfmt = new Intl.NumberFormat(["en-GB", "zh"], {style:'decimal', notation:"scientific"}); + numfmt.resolvedOptions(); + ``` + + +## DateTimeOptions + +表示时间日期格式化选项。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| locale | string | 是 | 否 | 区域参数 | +| dateStyle | string | 是 | 是 | 日期显示格式,取值范围:"long", "short", "medium", "full" | +| timeStyle | string | 是 | 是 | 时间显示格式,取值范围:"long", "short", "medium", "full" | +| hourCycle | string | 是 | 是 | 时制格式,取值范围:"h11", "h12", "h23", "h24". | +| timeZone | string | 是 | 是 | 使用的时区(合法的IANA时区ID) | +| numberingSystem | string | 是 | 是 | 数字系统 | +| hour12 | boolean | 是 | 是 | 是否使用12小时制 | +| weekday | string | 是 | 是 | 工作日的显示格式,取值范围:"long", "short", "narrow" | +| era | string | 是 | 是 | 时代的显示格式,取值范围:"long", "short", "narrow" | +| year | string | 是 | 是 | 年份的显示格式,取值范围:"numeric", "2-digit" | +| month | string | 是 | 是 | 月份的显示格式,取值范围:"numeric", "2-digit", "long", "short", "narrow" | +| day | string | 是 | 是 | 日期的显示格式,取值范围:"numeric", "2-digit" | +| hour | string | 是 | 是 | 小时的显示格式,取值范围:"numeric", "2-digit" | +| minute | string | 是 | 是 | 分钟的显示格式,取值范围:"numeric", "2-digit" | +| second | string | 是 | 是 | 秒钟的显示格式,取值范围:"numeric", "2-digit" | +| timeZoneName | string | 是 | 是 | 时区名称的本地化表示 | +| dayPeriod | string | 是 | 是 | 时段的显示格式,取值范围:"long", "short", "narrow" | +| localeMatcher | string | 是 | 是 | 要使用的区域匹配算法,取值范围:"lookup", "best fit" | +| formatMatcher | string | 是 | 是 | 要使用的格式匹配算法,取值范围:"basic", "best fit" | + + +## NumberOptions + +表示设备支持的能力。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| locale | string | 是 | 否 | 区域参数 | +| currency | string | 是 | 是 | 货币单位 | +| currencySign | string | 是 | 是 | 货币单位的符号显示 | +| currencyDisplay | string | 是 | 是 | 货币的显示方式,取值范围:"symbol", "narrowSymbol", "code", "name" | +| unit | string | 是 | 是 | 单位 | +| unitDisplay | string | 是 | 是 | 单位的显示格式,取值范围:"long", "short", "medium" | +| signDisplay | string | 是 | 是 | 数字符号的显示格式,取值范围:"auto", "never", "always", "expectZero" | +| compactDisplay | string | 是 | 是 | 紧凑型的显示格式,取值范围:"long", "short" | +| notation | string | 是 | 是 | 数字的格式化规格,取值范围:"standard", "scientific", "engineering", "compact" | +| localeMatcher | string | 是 | 是 | 要使用的区域匹配算法,取值范围:"lookup", "best fit" | +| style | string | 是 | 是 | 数字的显示格式,取值范围:"decimal", "currency", "percent", "unit" | +| numberingSystem | string | 是 | 是 | 数字系统 | +| useGrouping | boolean | 是 | 是 | 是否分组显示 | +| miniumumIntegerDigits | number | 是 | 是 | 最少整数个数 | +| miniumumFractionDigits | number | 是 | 是 | 最少小数个数 | +| maxiumumFractionDigits | number | 是 | 是 | 最多小数个数 | +| miniumumSignificantDigits | number | 是 | 是 | 最少有效位个数 | +| maxiumumSignificantDigits | number | 是 | 是 | 最多有效位个数 | diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/03.\345\252\222\344\275\223/01.\351\237\263\351\242\221\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/03.\345\252\222\344\275\223/01.\351\237\263\351\242\221\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..ffb85a376a34433de38ee691a5259849916eacd0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/03.\345\252\222\344\275\223/01.\351\237\263\351\242\221\347\256\241\347\220\206.md" @@ -0,0 +1,946 @@ +--- +title: 音频管理 +permalink: /pages/000b000200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 音频管理 + +## 导入模块 + +``` +import audio from '@ohos.multimedia.audio'; +``` + + +## 权限 + +无 + + +## getAudioManager + +getAudioManager(): AudioManager + +获取音频管理器。 + +**返回值:** +| 类型 | 说明 | +| -------- | -------- | +| [AudioManager](#audiomanager) | 音频管理类。 | + +**示例:** +``` +var audioManager = audio.getAudioManager(); +``` + + +## AudioVolumeType + +枚举,音频流类型。 + +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| RINGTONE | 2 | 表示铃声。 | +| MEDIA | 3 | 表示媒体。 | + + +## DeviceFlag + +枚举,可获取的设备种类。 + +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| OUTPUT_DEVICES_FLAG | 1 | 表示输出设备种类。 | +| INPUT_DEVICES_FLAG | 2 | 表示输入设备种类。 | +| ALL_DEVICES_FLAG | 3 | 表示所有设备种类。 | + + +## DeviceRole + +枚举,设备角色。 + +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| INPUT_DEVICE | 1 | 输入设备角色。 | +| OUTPUT_DEVICE | 2 | 输出设备角色。 | + + +## DeviceType + +枚举,设备类型。 + +| 名称 | 默认值 | 描述 | +| -------------- | ------ | ------------------------------------------------------- | +| 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+ + +枚举,活跃设备类型。 + +| 名称 | 默认值 | 描述 | +| ------------- | ------ | -------------------------------------------------- | +| SPEAKER | 2 | 扬声器。 | +| BLUETOOTH_SCO | 7 | 蓝牙设备SCO连接(Synchronous Connection Oriented)。 | + +## AudioRingMode7+ + +枚举,铃声模式。 + +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| RINGER_MODE_SILENT | 0 | 静音模式 | +| RINGER_MODE_VIBRATE | 1 | 震动模式 | +| RINGER_MODE_NORMAL | 2 | 响铃模式 | + + +## AudioManager + +管理音频音量和音频设备。 + +### setVolume + +setVolume(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback<void>): void + +设置指定流的音量,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | +| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | + +**示例:** + +``` +audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ + if (err) { + console.error('Failed to set the volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate a successful volume setting.'); +}) +``` + +### setVolume + +setVolume(volumeType: AudioVolumeType, volume: number): Promise<void> + +设置指定流的音量,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| volume | number | 是 | 音量等级,可设置范围通过getMinVolume和getMaxVolume获取。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调表示成功还是失败。 | + +**示例:** + +``` +audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> + console.log('Promise returned to indicate a successful volume setting.'); +) +``` + +### getVolume + +getVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void + +获取指定流的音量,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<number> | 是 | 回调返回音量大小。 | + +**示例:** + +``` +audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the volume is obtained.'); +}) +``` + +### getVolume + +getVolume(volumeType: AudioVolumeType): Promise<number> + +获取指定流的音量,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<number> | Promise回调返回音量大小。 | + +**示例:** + +``` +audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the volume is obtained.' + value); +) +``` + +### getMinVolume + +getMinVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void + +获取指定流的最小音量,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<number> | 是 | 回调返回最小音量。 | + +**示例:** + +``` +audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the minimum volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the minimum volume is obtained.' + value); +}) +``` + +### getMinVolume + +getMinVolume(volumeType: AudioVolumeType): Promise<number> + +获取指定流的最小音量,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<number> | Promise回调返回最小音量。 | + +**示例:** + +``` +audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promised returned to indicate that the minimum volume is obtained.' + value); +) +``` + +### getMaxVolume + +getMaxVolume(volumeType: AudioVolumeType, callback: AsyncCallback<number>): void + +获取指定流的最大音量,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<number> | 是 | 回调返回最大音量大小。 | + +**示例:** + +``` +audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the maximum volume. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the maximum volume is obtained.' + value); +}) +``` + +### getMaxVolume + +getMaxVolume(volumeType: AudioVolumeType): Promise<number> + +获取指定流的最大音量,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<number> | Promise回调返回最大音量大小。 | + +**示例:** + +``` +audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> + console.log('Promised returned to indicate that the maximum volume is obtained.'); +) +``` + +### mute7+ + +mute(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback<void>): void + +设置指定音量流静音,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | +| callback | AsyncCallback<void> | 是 | 回调表示成功还是失败。 | + +**示例:** + +``` +audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { + if (err) { + console.error('Failed to mute the stream. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the stream is muted.'); +}) +``` + +### mute7+ + +mute(volumeType: AudioVolumeType, mute: boolean): Promise<void> + +设置指定音量流静音,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| mute | boolean | 是 | 静音状态,true为静音,false为非静音。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调表示成功还是失败。 | + +**示例:** + + +``` +audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => + console.log('Promise returned to indicate that the stream is muted.'); +) +``` + + +### isMute7+ + +isMute(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void + +获取指定音量流是否被静音,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<boolean> | 是 | 回调返回流静音状态,true为静音,false为非静音。 | + +**示例:** + +``` +audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the mute status. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the mute status of the stream is obtained.' + value); +}) +``` + + +### isMute7+ + +isMute(volumeType: AudioVolumeType): Promise<boolean> + +获取指定音量流是否被静音,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<boolean> | Promise回调返回流静音状态,true为静音,false为非静音。 | + +**示例:** + +``` +audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the mute status of the stream is obtained.' + value); +) +``` + +### isActive7+ + +isActive(volumeType: AudioVolumeType, callback: AsyncCallback<boolean>): void + +获取指定音量流是否为活跃状态,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | +| callback | AsyncCallback<boolean> | 是 | 回调返回流的活跃状态,true为活跃,false为不活跃。 | + +**示例:** + +``` +audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { + if (err) { + console.error('Failed to obtain the active status of the stream. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the active status of the stream is obtained.' + value); +}) +``` + +### isActive7+ + +isActive(volumeType: AudioVolumeType): Promise<boolean> + +获取指定音量流是否为活跃状态,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| volumeType | [AudioVolumeType](#audiovolumetype) | 是 | 音量流类型。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<boolean> | Promise回调返回流的活跃状态,true为活跃,false为不活跃。 | + +**示例:** + +``` +audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => + console.log('Promise returned to indicate that the active status of the stream is obtained.' + value); +) +``` + +### setRingerMode7+ + +setRingerMode(mode: AudioRingMode, callback: AsyncCallback<void>): void + +设置铃声模式,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | + +**示例:** + +``` +audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { + if (err) { + console.error('Failed to set the ringer mode.​ ${err.message}'); + return; + } + console.log('Callback invoked to indicate a successful setting of the ringer mode.'); +}) +``` + +### setRingerMode7+ + +setRingerMode(mode: AudioRingMode): Promise<void> + +设置铃声模式,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| mode | [AudioRingMode](#audioringmode) | 是 | 音频铃声模式。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调返回设置成功或失败。 | + +**示例:** + +``` +audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => + console.log('Promise returned to indicate a successful setting of the ringer mode.'); +) +``` + + +### getRingerMode7+ + +getRingerMode(callback: AsyncCallback<AudioRingMode>): void + +获取铃声模式,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| callback | AsyncCallback<[AudioRingMode](#audioringmode)> | 是 | 回调返回系统的铃声模式。 | + +**示例:** + +``` +audioManager.getRingerMode((err, value) => { + if (err) { + console.error('Failed to obtain the ringer mode.​ ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the ringer mode is obtained.' + value); +}) +``` + + +### getRingerMode7+ + +getRingerMode(): Promise<AudioRingMode> + +获取铃声模式,使用promise方式返回异步结果。 + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<[AudioRingMode](#audioringmode7-)> | Promise回调返回系统的铃声模式。 | + +**示例:** + +``` +audioManager.getRingerMode().then((value) => + console.log('Promise returned to indicate that the ringer mode is obtained.' + value); +) +``` + +### setAudioParameter7+ + +setAudioParameter(key: string, value: string, callback: AsyncCallback<void>): void + +音频参数设置,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 被设置的音频参数的键。 | +| value | string | 是 | 被设置的音频参数的值。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | + +**示例:** + +``` +audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { + if (err) { + console.error('Failed to set the audio parameter. ${err.message}'); + return; + } + console.log('Callback invoked to indicate a successful setting of the audio parameter.'); +}) +``` + +### setAudioParameter7+ + +setAudioParameter(key: string, value: string): Promise<void> + +音频参数设置,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 被设置的音频参数的键。 | +| value | string | 是 | 被设置的音频参数的值。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调返回设置成功或失败。 | + +**示例:** + +``` +audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => + console.log('Promise returned to indicate a successful setting of the audio parameter.'); +) +``` + +### getAudioParameter7+ + +getAudioParameter(key: string, callback: AsyncCallback<string>): void + +获取指定音频参数值,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待获取的音频参数的键。 | +| callback | AsyncCallback<string> | 是 | 回调返回获取的音频参数的值。 | + +**示例:** + +``` +audioManager.getAudioParameter('PBits per sample', (err, value) => { + if (err) { + console.error('Failed to obtain the value of the audio parameter. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the value of the audio parameter is obtained.' + value); +}) +``` + +### getAudioParameter7+ + +getAudioParameter(key: string): Promise<string> + +获取指定音频参数值,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待获取的音频参数的键。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<string> | Promise回调返回获取的音频参数的值。 | + +**示例:** + +``` +audioManager.getAudioParameter('PBits per sample').then((value) => + console.log('Promise returned to indicate that the value of the audio parameter is obtained.' + value); +) +``` + +### getDevices + +getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback<AudioDeviceDescriptors>): void + +获取音频设备列表,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | +| callback | AsyncCallback<[AudioDeviceDescriptors](#audiodevicedescriptors)> | 是 | 回调,返回设备列表。 | + +**示例:** +``` +audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ + if (err) { + console.error('Failed to obtain the device list. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the device list is obtained.'); +}) +``` + +### getDevices + +(deviceFlag: DeviceFlag): Promise<AudioDeviceDescriptors> + +获取音频设备列表,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceFlag | [DeviceFlag](#deviceflag) | 是 | 设备类型的flag。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<[AudioDeviceDescriptors](#audiodevicedescriptors)> | Promise回调返回设备列表。 | + +**示例:** + +``` +audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> + console.log('Promise returned to indicate that the device list is obtained.'); +) +``` + +### setDeviceActive7+ + +setDeviceActive(deviceType: DeviceType, active: boolean, callback: AsyncCallback<void>): void + +设置设备激活状态,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +| active | boolean | 是 | 设备激活状态。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | + +**示例:** + +``` +audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { + if (err) { + console.error('Failed to set the active status of the device. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the device is set to the active status.'); +}) +``` + +### setDeviceActive7+ + +setDeviceActive(deviceType: DeviceType, active: boolean): Promise<void> + +设置设备激活状态,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +| active | boolean | 是 | 设备激活状态。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调返回设置成功或失败。 | + +**示例:** + + +``` +audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> + console.log('Promise returned to indicate that the device is set to the active status.'); +) +``` + +### isDeviceActive7+ + +isDeviceActive(deviceType: DeviceType, callback: AsyncCallback<boolean>): void + +获取指定设备激活状态,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | +| callback | AsyncCallback<boolean> | 是 | 回调返回设备的激活状态。 | + +**示例:** + +``` +audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { + if (err) { + console.error('Failed to obtain the active status of the device. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the active status of the device is obtained.'); +}) +``` + + +### isDeviceActive7+ + +isDeviceActive(deviceType: DeviceType): Promise<boolean> + +获取指定设备激活状态,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| deviceType | [DeviceType](#devicetype) | 是 | 音频设备类型。 | + +**返回值:** + +| Type | Description | +| -------- | -------- | +| Promise<boolean> | Promise回调返回设备的激活状态。 | + +**示例:** + +``` +audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => + console.log('Promise returned to indicate that the active status of the device is obtained.' + value); +) +``` + +### setMicrophoneMute7+ + +setMicrophoneMute(mute: boolean, callback: AsyncCallback<void>): void + +设置麦克风静音状态,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | +| callback | AsyncCallback<void> | 是 | 回调返回设置成功或失败。 | + +**示例:** + +``` +audioManager.setMicrophoneMute(true, (err) => { + if (err) { + console.error('Failed to mute the microphone. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the microphone is muted.'); +}) +``` + +### setMicrophoneMute7+ + +setMicrophoneMute(mute: boolean): Promise<void> + +设置麦克风静音状态,使用promise方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| mute | boolean | 是 | 待设置的静音状态,true为静音,false为非静音。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<void> | Promise回调返回设置成功或失败。 | + +**示例:** + +``` +audioManager.setMicrophoneMute(true).then(() => + console.log('Promise returned to indicate that the microphone is muted.'); +) +``` + +### isMicrophoneMute7+ + +isMicrophoneMute(callback: AsyncCallback<boolean>): void + +获取麦克风静音状态,使用callback方式返回异步结果。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| callback | AsyncCallback<boolean> | 是 | 回调返回系统麦克风静音状态,true为静音,false为非静音。 | + +**示例:** + +``` +audioManager.isMicrophoneMute((err, value) => { + if (err) { + console.error('Failed to obtain the mute status of the microphone. ${err.message}'); + return; + } + console.log('Callback invoked to indicate that the mute status of the microphone is obtained.' + value); +}) +``` + +### isMicrophoneMute7+ + +isMicrophoneMute(): Promise<boolean> + +获取麦克风静音状态,使用promise方式返回异步结果。 + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<boolean> | Promise回调返回系统麦克风静音状态,true为静音,false为非静音。 | + +**示例:** + + +``` +audioManager.isMicrophoneMute().then((value) => + console.log('Promise returned to indicate that the mute status of the microphone is obtained.', + value); +) +``` + + +## AudioDeviceDescriptor + +描述音频设备。 + +| 名称 | 参数型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| deviceRole | [DeviceRole](#devicerole) | 是 | 否 | 设备角色。 | +| deviceType | [DeviceType](#devicetype) | 是 | 否 | 设备类型。 | + + +## AudioDeviceDescriptors + +| 名称 | 描述 | +| -------- | -------- | +| 设备属性数组 | AudioDeviceDescriptor的数组,只读。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/03.\345\252\222\344\275\223/02.\351\237\263\351\242\221\346\222\255\346\224\276.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/03.\345\252\222\344\275\223/02.\351\237\263\351\242\221\346\222\255\346\224\276.md" new file mode 100644 index 0000000000000000000000000000000000000000..16e9f3113d7195cc96d285e7489498e23f459dbe --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/03.\345\252\222\344\275\223/02.\351\237\263\351\242\221\346\222\255\346\224\276.md" @@ -0,0 +1,429 @@ +--- +title: 音频播放 +permalink: /pages/000b000201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 音频播放和录制 + +## 导入模块 + +``` +import media from '@ohos.multimedia.media'; +``` + + +## 权限 + +无 + + +## media.createAudioPlayer + +createAudioPlayer(): AudioPlayer + +创建音频播放的实例。 + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| [AudioPlayer](#audioplayer) | 返回AudioPlayer类实例,失败时返回null。 | + +**示例:** + +``` +var audioplayer = media.createAudioPlayer(); +``` +## media.createAudioRecorder +createAudioRecorder(): AudioRecorder + +创建音频录制的实例来控制音频的录制。 + +**返回值:** + +| 类型 | 说明 | +| ------------------------------- | ----------------------------------------- | +| [AudioRecorder](#audiorecorder) | 返回AudioRecorder类实例,失败时返回null。 | + +**示例:** +``` +var audiorecorder = media.createAudioRecorder(); +``` + +## AudioPlayer + +音频播放管理类,用于管理和播放音频媒体。在调用AudioPlayer的方法前,需要先通过[createAudioPlayer()](#createaudioplayer-)构建一个AudioPlayer实例。 + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(mp4、aac、mp3、ogg),支持本地绝对路径(file://) | +| loop | boolean | 是 | 是 | 音频循环播放属性,设置为'true'表示循环播放。 | +| currentTime | number | 是 | 否 | 音频的当前播放阶段。 | +| duration | number | 是 | 否 | 音频时长。 | +| state | [AudioState](#audiostate) | 是 | 否 | 音频播放的状态。 | + +### play + +play(): void + +开始播放音频资源。 + +**示例:** + +``` +audioplayer.src = 'file:///data/media/sounds.mp4'; +audioplayer.on('play', () => { + console.log('Playback starts.'); +}); +audioplayer.play(); +``` + +### pause + +pause(): void + +暂停播放音频资源。 + +**示例:** + +``` +audioplayer.src = 'file:///data/media/sounds.mp4'; +audioplayer.on('pause', () => { + console.log('Playback paused.'); +}); +audioplayer.pause(); +``` + +### stop + +stop(): void + +停止播放音频资源。 + +**示例:** + +``` +audioplayer.src = 'file:///data/media/sounds.mp4'; +audioplayer.on('stop',() => { + console.log('Playback stopped.'); +}); +audioplayer.stop(); +``` + +### seek + +seek(timeMs: number): void + +跳转到指定播放位置。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| timeMs | number | 是 | 指定的跳转时间节点。 | + +**示例:** + +``` +audioplayer.src = 'file:///data/media/sounds.mp4'; +audioplayer.on('timeupdate', (action) => { + var newTime = audioplayer.currenTime; + if(newTime >= 30000) { + console.info('Seek succeeded. New time: ' + newTime); + } else { + console.info('Seek failed.'); + } +}); +audioplayer.seek(30000); +``` + +### setVolume + +setVolume(vol: number): void + +设置音量。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| vol | number | 是 | 指定的相对音量大小,取值范围为[0.00-1.00],1表示最大音量,即100%。 | + +**示例:** + +``` +audioplayer.src = 'file:///data/media/sounds.mp4'; +audioplayer.on('volumeChange', () => { + console.log('Playback volume changed.'); +}); +audioplayer.setVolume(1); +``` + +### reset7+ + +reset(): void + +切换播放音频资源。 + +**示例:** + +``` +audioplay.reset(); +``` + +### release7+ + +release(): void + +释放音频资源。 + +**示例:** + +``` +audioplay.release(); +``` + +### on('play' | 'pause' | 'stop' | 'reset' | 'dataLoad' | 'finish' | 'volumeChange') + +on(type: 'play' | 'pause' | 'stop' | 'reset' | 'dataLoad' | 'finish' | 'volumeChange', callback: () => void) + +开始监听音频播放事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| type | string | 是 | 播放事件回调类型,支持的事件包括:'play' \| 'pause' \| 'stop' \| 'reset' \| 'dataLoad' \| 'finish' \| 'volumeChange'。
- 'play' :完成play方法调用,音频开始播放,触发该事件。
- 'pause':完成pause方法调用,音频暂停播放,触发该事件。
- 'stop':完成stop方法调用,音频停止播放,触发该事件。
- 'reset':完成reset方法调用,播放器重置,触发该事件。
- 'dataLoad':完成音频数据加载后触发该事件。
- 'finish':完成音频播放后触发该事件。
- 'volumeChange':播放音量改变后触发该事件。播放事件回调方法。 | +| callback | function | 是 | 播放事件回调方法。 | + +**示例:** + +``` +audioplayer.src = 'file://xxx/sounds.mp4'; +audioplayer.on('play', () => { + console.log('Playback starts.'); +}); +audioplayer.play(); +``` + +### on('timeUpdate') + +on(type: 'timeUpdate', callback: Callback\): void + +开始监听音频播放时间戳更新事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| type | string | 是 | 播放事件回调类型,支持的事件为:'timeUpdate'。
'timeUpdate':音频播放时间戳更新,触发该事件。seek方法调用时也会触发该事件。 | +| callback | Callback<number> | 是 | 播放事件回调方法。 | + +**示例:** + +``` +audioplayer.src = 'file://xxx/sounds.mp4'; +audioplayer.on('timeupdate', (newTime ) => { + if(newTime >= 30000) { + console.info('Seek succeeded. New time: ' + newTime); + } else { + console.info('Seek failed.'); + } +}); +audioplayer.seek(30000); +``` + +### on('error') + +on(type: 'error', callback: ErrorCallback): void + +开始监听音频播放错误事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| type | string | 是 | 播放错误事件回调类型'error'。
'error':音频播放中发生错误,触发该事件。 | +| callback | ErrorCallback | 是 | 播放错误事件回调方法。 | + +**示例:** + +``` +audioplayer.src = 'file:///data/sounds.mp4'; +audioplayer.on('error', (err) => { + console.info('error callback info: ' + err); +}); +audioplayer.setVolume(30000); +``` + + +## AudioState + +音频播放的状态机。 + +| 名称 | 描述 | +| -------- | -------- | +| idle | 音频播放空闲。 | +| playing | 音频正在播放。 | +| paused | 音频暂停播放。 | +| stopped | 音频播放停止。 | + +## AudioRecorder + +音频录制管理类,用于录制音频媒体。在调用AudioRecorder的方法前,需要先通过[createAudioRecorder()](#createaudiorecorder-audiorecorder)构建一个AudioRecorder实例。 + +### prepare + +prepare(config: AudioRecorderConfig): void + +录音准备。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------------------------------------- | ---- | ------------------------------------------------------------ | +| config | [AudioRecorderConfig](#audiorecorderconfig) | 是 | 配置录音的相关参数,包括音频输出URI、编码格式、采样率、声道数等。 | + +**示例:** + +``` +let audioRecorderConfig = { + audioEncoder : AAC_LC , + audioEncodeBitRate : 22050, + audioSampleRate : 22050, + numberOfChannels : 2, + format : AAC_ADTS, + uri : 'file:///data/accounts/account_0/appdata/appdata/recorder/test.m4a', +} +audiorecorder.prepare(audioRecorderConfig) +``` + + +### start + +start(): void + +开始录音。 + +**示例:** + +``` +audiorecorder.start(); +``` + +### stop + +stop(): void + +停止录音。 + +**示例:** + +``` +audiorecorder.stop(); +``` + +### release + +release(): void + +释放录音资源。 + +**示例:** + +``` +audiorecorder.release(); +``` + +### reset + +reset(): void + +重置录音。 + +进行重置录音之前,需要先调用stop()停止录音。重置录音之后,需要调用prepare()设置录音配置项,才能再次进行录音。 + +**示例:** + +``` +audiorecorder.reset(); +``` + +### on('prepare' | 'start' | 'stop' | 'release' | 'reset') + +on(type: 'prepare' | 'start' | 'stop' | 'release' | 'reset', callback: () => void): void + +开始订阅音频录制事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 录制事件回调类型,支持的事件包括:'prepare' \| 'start' \| 'stop' \| 'release' \| 'reset'。
- 'prepare' :音频录制准备完成后,触发该事件。
- 'start' :音频录制开始后,触发该事件。
- 'stop' :音频录制停止后,触发该事件。
- 'release' :音频录制相关资源释放后,触发该事件。
- 'reset':音频录制重置后,触发该事件。 | +| callback | function | 是 | 录制事件回调方法。 | + +**示例:** + +``` +audiorecorder.on('prepare', () => { + console.log('Preparation succeeded.'); + audiorecorder.start(); +}); +``` + +### on('error') + +on(type: 'error', callback: ErrorCallback): void + +开始订阅音频录制错误事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 录制错误事件回调类型'error'。
- 'error':音频录制过程中发生错误,触发该事件。 | +| callback | ErrorCallback | 是 | 录制错误事件回调方法。 | + + +## AudioRecorderConfig + +表示音频的录音配置。 + +| 名称 | 参数类型 | 必填 | 说明 | +| ------------------ | --------------------------------------- | ---- | ------------------------------------------------------------ | +| audioEncoder | [AudioEncoder](#audioencoder) | 否 | 音频编码格式,默认设置为AAC_LC。 | +| audioEncodeBitRate | number | 否 | 音频编码比特率,默认值为48000。 | +| audioSampleRate | number | 否 | 音频采集采样率,默认值为48000。 | +| numberOfChannels | number | 否 | 音频采集声道数,默认值为2。 | +| format | [AudioOutputFormat](#audiooutputformat) | 否 | 音量输出封装格式,默认设置为MPEG_4。 | +| uri | string | 是 | 音频输出URI。支持:
1. 文件的绝对路径:file:///data/data/ohos.xxx.xxx/cache/test.mp4![zh-cn_image_0000001164217678](/images/application-dev/reference/apis/figures/zh-cn_image_0000001164217678.png)
2. 文件的fd路径:file://1 (fd number) | + + +## AudioEncoder + +表示音频编码格式的枚举。 + +| 名称 | 默认值 | 说明 | +| ------ | ------ | ------------------------------------------------------------ | +| AAC_LC | 3 | AAC-LC(Advanced Audio Coding Low Complexity)编码格式。 | + + +## AudioOutputFormat + +表示音频封装格式的枚举。 + +| 名称 | 默认值 | 说明 | +| -------- | ------ | ------------------------------------------------------------ | +| MPEG_4 | 2 | 封装为MPEG-4格式。 | +| AAC_ADTS | 6 | 封装为ADTS(Audio Data Transport Stream)格式,是AAC音频的传输流格式。 | \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/01.\346\226\207\344\273\266\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/01.\346\226\207\344\273\266\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..6024540345d1f1b6e6132bd8f12e0b96abd0e6d0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/01.\346\226\207\344\273\266\347\256\241\347\220\206.md" @@ -0,0 +1,891 @@ +--- +title: 文件管理 +permalink: /pages/000b000300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 文件管理 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import fileio from '@ohos.fileio'; +``` + + +## 权限列表 + +无 + + +## 使用说明 + +使用该功能模块对文件/目录进行操作前,需要先获取其绝对路径,获取方式及其接口用法请参考:[Context模块的接口getOrCreateLocalDir](/pages/000b000007)。 + +“文件/目录绝对路径”=“应用目录路径”+“文件/目录名” + +通过上述接口获取到应用目录路径dir,文件名为“xxx.txt”,文件所在绝对路径为: + +``` +let path = dir + "xxx.txt" +``` + + +文件描述符fd: + + +``` +let fd = fileio.openSync(path); +``` + + +## fileio.statSync + +statSync(path:string): Stat + +以同步方法获取文件的信息。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待获取文件的绝对路径。 | + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [Stat](#stat) | 表示文件的具体信息。 | + +- 示例: + ``` + let stat = fileio.statSync(path); + ``` + + +## fileio.opendirSync + +opendirSync(path: string): Dir + +以同步方法打开文件目录。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待打开文件目录的绝对路径。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [Dir](#dir) | 返回Dir对象。 | + +- 示例: + ``` + let dir = fileio.opendirSync(path); + ``` + + +## fileio.accessSync + +accessSync(path: string, mode?: number): void + +以同步方法检查当前进程是否可访问某文件。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待访问文件的绝对路径。 | + | mode | number | 否 | 访问文件时的选项,可给定如下选项,以按位或的方式使用多个选项,默认给定0。
确认当前进程是否具有对应权限:
- 0:确认文件是否存在。
- 1:确认当前进程是否具有可执行权限。
- 2:确认当前进程是否具有写权限。
- 4:确认当前进程是否具有读权限。 | + +- 示例: + ``` + fileio.accessSync(path); + ``` + + +## fileio.closeSync + +closeSync(fd: number): void + +以同步方法关闭文件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fd | number | 是 | 待关闭文件的文件描述符。 | + +- 示例: + ``` + fileio.closeSync(fd); + ``` + + +## fileio.copyFileSync + +fileio.copyFileSync(src: string, dest: string, mode?:number): void + +以同步方法复制文件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | src | string | 是 | 待复制文件的路径。 | + | dest | string | 是 | 目标文件路径。 | + | mode | number | 否 | mode提供覆盖文件的选项,当前仅支持0,且默认为0。
0:完全覆盖目标文件,未覆盖部分将被裁切掉。 | + +- 示例: + ``` + fileio.copyFileSync(src, dest); + ``` + + +## fileio.mkdirSync + +fileio.mkdirSync(path: string, mode?: number): void + +以同步方法创建目录。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待创建目录的绝对路径。 | + | mode | number | 否 | 创建目录的权限,可给定如下权限,以按位或的方式追加权限,默认给定0o775。
- 0o775:所有者具有读、写及可执行权限,其余用户具有读及可执行权限。
- 0o700:所有者具有读、写及可执行权限。
- 0o400:所有者具有读权限。
- 0o200:所有者具有写权限。
- 0o100:所有者具有可执行权限。
- 0o070:所有用户组具有读、写及可执行权限。
- 0o040:所有用户组具有读权限。
- 0o020:所有用户组具有写权限。
- 0o010:所有用户组具有可执行权限。
- 0o007:其余用户具有读、写及可执行权限。
- 0o004:其余用户具有读权限。
- 0o002:其余用户具有写权限。
- 0o001:其余用户具有可执行权限。 | + +- 示例: + ``` + fileio.mkdirSync(path); + ``` + + +## fileio.openSync + +openSync(path: string, flags?: number, mode?: number): number + +以同步方法打开文件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待打开文件的绝对路径。 | + | flags | number | 否 | 打开文件的选项,必须指定如下选项中的一个,默认以只读方式打开:
- 0o0:只读打开。
- 0o1:只写打开。
- 0o2:读写打开。
同时,也可给定如下选项,以按位或的方式追加,默认不给定任何额外选项:
- 0o100:若文件不存在,则创建文件。使用该选项时必须指定第三个参数 mode。
- 0o200:如果追加了0o100选项,且文件已经存在,则出错。
- 0o1000:如果文件存在且以只写或读写的方式打开文件,则将其长度裁剪为零。
- 0o2000:以追加方式打开,后续写将追加到文件末尾。
- 0o4000:如果path指向FIFO、块特殊文件或字符特殊文件,则本次打开及后续 IO 进行非阻塞操作。
- 0o200000:如果path指向目录,则出错。
- 0o400000:如果path指向符号链接,则出错。
- 0o4010000:以同步IO的方式打开文件。 | + | mode | number | 否 | 若创建文件,则指定文件的权限,可给定如下权限,以按位或的方式追加权限,默认给定0o666。
- 0o666:所有者具有读、写权限,所有用户组具有读、写权限,其余用户具有读、写权限。
- 0o700:所有者具有读、写及可执行权限。
- 0o400:所有者具有读权限。
- 0o200:所有者具有写权限。
- 0o100:所有者具有可执行权限。
- 0o070:所有用户组具有读、写及可执行权限。
- 0o040:所有用户组具有读权限。
- 0o020:所有用户组具有写权限。
- 0o010:所有用户组具有可执行权限。
- 0o007:其余用户具有读、写及可执行权限。
- 0o004:其余用户具有读权限。
- 0o002:其余用户具有写权限。
- 0o001:其余用户具有可执行权限。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | number | 打开文件的文件描述符。 | + +- 示例: + ``` + fileio.openSync(path); + ``` + + +## fileio.readSync + +readSync(fd: number, buffer: ArrayBuffer, options?: Object): number + +以同步方法从文件读取数据。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fd | number | 是 | 待读取文件的文件描述符。 | + | buffer | ArrayBuffer | 是 | 用于读取文件的缓冲区。 | + | options | Object | 否 | 支持如下选项:
- offset,number 类型,表示将数据读取到缓冲区的位置,即相对于缓冲区首地址的偏移。可选,默认为0。
- length,number 类型,表示期望读取数据的长度。可选,默认缓冲区长度减去偏移长度。
- position,number 类型,表示期望读取文件的位置。可选,默认从当前位置开始读。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | number | 实际读取的长度。 | + +- 示例: + ``` + let fd = fileio.openSync(path, 0o2); + let buf = new ArrayBuffer(4096); + fileio.readSync(fd, buf); + console.log(String.fromCharCode.apply(null, new Uint8Array(buf))); + ``` + + +## fileio.rmdirSync + +rmdirSync(path: string): void + +以同步方法删除目录。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待删除目录的绝对路径。 | + +- 示例: + ``` + fileio.rmdirSync(path); + ``` + + +## fileio.unlinkSync + +unlinkSync(path: string): void + +以同步方法删除文件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待删除文件的绝对路径。 | + +- 示例: + ``` + fileio.unlinkSync(path); + ``` + + +## fileio.writeSync + +writeSync(fd: number, buffer: ArrayBuffer | string, options?:Object): number + +以同步方法将数据写入文件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fd | number | 是 | 待写入文件的文件描述符。 | + | buffer | ArrayBuffer \| string | 是 | 待写入文件的数据,可来自缓冲区或字符串。 | + | options | Object | 否 | 支持如下选项:
- offset,number类型,表示期望写入数据的位置相对于数据首地址的偏移。可选,默认为0。
- length,number类型,表示期望写入数据的长度。可选,默认缓冲区长度减去偏移长度。
- position,number类型,表示期望写入文件的位置。可选,默认从当前位置开始写。
- encoding,string类型,当数据是 string 类型时有效,表示数据的编码方式,默认 'utf-8',仅支持 'utf-8'。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | number | 实际写入的长度。 | + +- 示例: + ``` + let fd = fileio.openSync(path, 0o102, 0o666); + fileio.writeSync(fd, "hello, world"); + ``` + + +## fileio.chmodSync7+ + +chmodSync(path: string, mode: number): void + +以同步方法基于文件路径改变文件权限。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待改变文件权限的绝对路径。 | + | mode | number | 是 | 改变文件权限,可给定如下权限,以按位或的方式追加权限。
- 0o700:所有者具有读、写及可执行权限。
- 0o400:所有者具有读权限。
- 0o200:所有者具有写权限。
- 0o100:所有者具有可执行权限。
- 0o070:所有用户组具有读、写及可执行权限。
- 0o040:所有用户组具有读权限。
- 0o020:所有用户组具有写权限。
- 0o010:所有用户组具有可执行权限。
- 0o007:其余用户具有读、写及可执行权限。
- 0o004:其余用户具有读权限。
- 0o002:其余用户具有写权限。
- 0o001:其余用户具有可执行权限。 | + +- 示例: + ``` + fileio.chmodSync(fpath, mode); + ``` + + +## fileio.fstatSync7+ + +fstatSync(fd: number): Stat + +以同步方法基于文件描述符获取文件状态信息。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fd | number | 是 | 待获取文件的文件描述符。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<Stat> | 表示文件的具体信息。 | + +- 示例: + ``` + let fd = fileio.openSync(path); + let stat = fileio.fstatSync(fd); + ``` + + +## fileio.ftruncateSync7+ + +ftruncateSync(fd: number, len?: number): void + +以同步方法基于文件描述符截断文件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fd | number | 是 | 待截断文件的文件描述符。 | + | len | number | 否 | 文件截断后的长度,以字节为单位。 | + +- 示例: + ``` + fileio.ftruncate(fd, len); + ``` + + +## fileio.fchmodSync7+ + +fchmodSync(existingPath: string, newPath: string): void + +以同步方法基于文件描述符改变文件权限。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fd | number | 是 | 待改变文件的文件描述符。 | + | mode | number | 是 | 若创建文件,则指定文件的权限,可给定如下权限,以按位或的方式追加权限。
- 0o700:所有者具有读、写及可执行权限。
- 0o400:所有者具有读权限。
- 0o200:所有者具有写权限。
- 0o100:所有者具有可执行权限。
- 0o070:所有用户组具有读、写及可执行权限。
- 0o040:所有用户组具有读权限。
- 0o020:所有用户组具有写权限。
- 0o010:所有用户组具有可执行权限。
- 0o007:其余用户具有读、写及可执行权限。
- 0o004:其余用户具有读权限。
- 0o002:其余用户具有写权限。
- 0o001:其余用户具有可执行权限。 | + +- 示例: + ``` + fileio.fchmodSync(fd, mode); + ``` + + +## fileio.truncateSync7+ + +truncateSync(fpath: string, len?: number): void + +以同步方法基于文件路径截断文件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待截断文件的绝对路径。 | + | len | number | 否 | 文件截断后的长度,以字节为单位。 | + +- 示例: + ``` + fileio.ftruncate(path, len); + ``` + + +## fileio.renameSync7+ + +renameSync(oldPath: string, newPath: string): void + +以同步方法重命名文件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | oldPath | string | 是 | 目标文件的当前绝对路径。 | + | Newpath | String | 是 | 目标文件的新绝对路径。 | + +- 示例: + ``` + fileio.renameSync(oldpath, newpath); + ``` + + +## fileio.fsyncSync7+ + +fsyncSync(fd: number): void + +以同步方法同步文件数据。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fd | number | 是 | 待同步文件的文件描述符。 | + +- 示例: + ``` + fileio.fyncsSync)(fd); + ``` + + +## fileio.chownSync7+ + +chownSync(path: string, uid: number, gid: number): void + +以同步的方法基于文件路径改变文件所有者。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待改变文件的绝对路径。 | + | uid | number | 是 | 新的UID。 | + | gid | number | 是 | 新的GID。 | + +- 示例: + ``` + let stat = fileio.statSync(fpath) + fileio.chownSync(path, stat.uid, stat.gid); + ``` + + +## fileio.createStreamSync7+ + +createStreamSync(path: string, mode: string): Stream + +以同步方法基于文件路径打开文件流。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 待打开文件的绝对路径。 | + | mode | string | 是 | - r:打开只读文件,该文件必须存在。
- r+:打开可读写的文件,该文件必须存在。
- w:打开只写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- w+:打开可读写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
- a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 | + +- 返回值: + | 参数名 | 说明 | + | -------- | -------- | + | [Stream](#stream7-) | 返回文件流的结果。 | + +- 示例: + ``` + let ss = fileio.createStream(path, "r+"); + ``` + + +## fileio.fdopenStreamSync7+ + +fdopenStreamSync(fd: number, mode: string): Stream + +以同步方法基于文件描述符打开文件流。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fd | number | 是 | 待打开文件的文件描述符。 | + | mode | string | 是 | - r:打开只读文件,该文件必须存在。
- r+:打开可读写的文件,该文件必须存在。
- w:打开只写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- w+:打开可读写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
- a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 | + +- 返回值: + | 参数名 | 说明 | + | -------- | -------- | + | [Stream](#stream7-) | 返回文件流的结果。 | + +- 示例: + ``` + let ss = fileio.fdopenStreamSync(fd, "r+"); + ``` + + +## fileio.fchownSync7+ + +fchownSync(fd: number, uid: number, gid: number): void + +以同步方法基于文件描述符改变文件所有者。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fd | number | 是 | 待改变文件的文件描述符。 | + | uid | number | 是 | 文件所有者的UID。 | + | gid | number | 是 | 文件所有组的GID。 | + +- 示例: + ``` + let stat = fileio.statSync(fpath); + fileio.fchownSync(fd, stat.uid, stat.gid); + ``` + + +## Stat + +文件具体信息,在调用Stat的方法前,需要先通过[fileio.statSync](#fileio.statsync)来构建一个Stat实例。 + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| dev | number | 是 | 否 | 标识包含该文件的主设备号。 | +| ino | number | 是 | 否 | 标识该文件。通常同设备上的不同文件的INO不同。 | +| mode | number | 是 | 否 | 表示文件类型及权限,其首 4 位表示文件类型,后 12 位表示权限。各特征位的含义如下:
- 0o170000:可用于获取文件类型的掩码。
- 0o140000:文件是套接字。
- 0o120000:文件是符号链接。
- 0o100000:文件是一般文件。
- 0o060000:文件属于块设备。
- 0o040000:文件是目录。
- 0o020000:文件是字符设备。
- 0o010000:文件是具名管道,即FIFO。
- 0o0700:可用于获取用户权限的掩码。
- 0o0400:用户读,对于普通文件,所有者可读取文件;对于目录,所有者可读取目录项。
- 0o0200:用户写,对于普通文件,所有者可写入文件;对于目录,所有者可创建/删除目录项。
- 0o0100:用户执行,对于普通文件,所有者可执行文件;对于目录,所有者可在目录中搜索给定路径名。
- 0o0070:可用于获取用户组权限的掩码。
- 0o0040:用户组读,对于普通文件,所有用户组可读取文件;对于目录,所有用户组可读取目录项。
- 0o0020:用户组写,对于普通文件,所有用户组可写入文件;对于目录,所有用户组可创建/删除目录项。
- 0o0010:用户组执行,对于普通文件,所有用户组可执行文件;对于目录,所有用户组是否可在目录中搜索给定路径名。
- 0o0007:可用于获取其他用户权限的掩码。
- 0o0004:其他读,对于普通文件,其余用户可读取文件;对于目录,其他用户组可读取目录项。
- 0o0002:其他写,对于普通文件,其余用户可写入文件;对于目录,其他用户组可创建/删除目录项。
- 0o0001:其他执行,对于普通文件,其余用户可执行文件;对于目录,其他用户组可在目录中搜索给定路径名。 | +| nlink | number | 是 | 否 | 文件的硬链接数。 | +| uid | number | 是 | 否 | 文件所有者的ID。 | +| gid | number | 是 | 否 | 文件所有组的ID。 | +| rdev | number | 是 | 否 | 标识包含该文件的从设备号。 | +| size | number | 是 | 否 | 文件的大小,以字节为单位。仅对普通文件有效。 | +| blocks | number | 是 | 否 | 文件占用的块数,计算时块大小按512B计算。 | +| atime | number | 是 | 否 | 上次访问该文件的时间,表示距1970年1月1日0时0分0秒的秒数。 | +| mtime | number | 是 | 否 | 上次修改该文件的时间,表示距1970年1月1日0时0分0秒的秒数。 | +| ctime | number | 是 | 否 | 最近改变文件状态的时间,表示距1970年1月1日0时0分0秒的秒数。 | + + +### isBlockDevice + +isBlockDevice(): boolean + +用于判断当前目录项是否是块特殊文件。一个块特殊文件只能以块为粒度进行访问,且访问的时候带缓存。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是块特殊设备。 | + +- 示例: + ``` + let isBLockDevice = fileio.statSync(path).isBlockDevice(); + ``` + + +### isCharacterDevice + +isCharacterDevice(): boolean + +用于判断当前目录项是否是字符特殊文件。一个字符特殊设备可进行随机访问,且访问的时候不带缓存。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是字符特殊设备。 | + +- 示例: + ``` + let isCharacterDevice = fileio.statSync(path).isCharacterDevice(); + ``` + + +### isDirectory + +isDirectory(): boolean + +用于判断当前目录项是否是目录。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是目录。 | + +- 示例: + ``` + let isDirectory= fileio.statSync(path).isDirectory(); + ``` + + +### isFIFO + +isFIFO(): boolean + +用于判断当前目录项是否是命名管道(有时也称为FIFO)。命名管道通常用于进程间通信。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是 FIFO。 | + +- 示例: + ``` + let isFIFO= fileio.statSync(path).isFIFO(); + ``` + + +### isFile + +isFile(): boolean + +用于判断当前目录项是否是普通文件。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是普通文件。 | + +- 示例: + ``` + let isFile= fileio.statSync(fpath).isFile(); + ``` + + +### isSocket + +isSocket(): boolean + +用于判断当前目录项是否是套接字。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是套接字。 | + +- 示例: + ``` + let isSocket = fileio.statSync(path).isSocket(); + ``` + + +### isSymbolicLink + +isSymbolicLink(): boolean + +用于判断当前目录项是否是符号链接。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是符号链接。 | + +- 示例: + ``` + let isSymbolicLink = fileio.statSync(path).isSymbolicLink(); + ``` + + +## Stream7+ + +文件流,在调用Stream的方法前,需要先通过[fileio.createStreamSync](#fileio.createstreamsync)方法来构建一个Stream实例。 + + +### closeSync7+ + +closeSync(): void + +同步关闭文件流。 + +- 示例: + ``` + let ss= fileio.createStreamSync(path); + ss.closeSync(); + ``` + + +### flushSync7+ + +flushSync(): void + +同步刷新文件流。 + +- 示例: + ``` + let ss= fileio.createStreamSync(path); + ss.flushSync(); + ``` + + +### writeSync7+ + +writeSync(buffer: ArrayBuffer | string, options?:Object): number + +以同步方法将数据写入流文件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | buffer | ArrayBuffer \| string | 是 | 待写入文件的数据,可来自缓冲区或字符串。 | + | options | Object | 否 | 支持如下选项:
- offset,number类型,表示期望写入数据的位置相对于数据首地址的偏移。可选,默认为0。
- length,number类型,表示期望写入数据的长度。可选,默认缓冲区长度减去偏移长度。
- position,number类型,表示期望写入文件的位置。可选,默认从当前位置开始写。
- encoding,string类型,当数据是 string 类型时有效,表示数据的编码方式,默认 'utf-8',仅支持 'utf-8'。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | number | 实际写入的长度。 | + +- 示例: + ``` + let ss= fileio.createStreamSync(fpath,"r+"); + ss.writeSync("hello, world",{offset: 1,length: 5,position: 5,encoding :'utf-8'}); + ``` + + +### readSync7+ + +readSync(buffer: ArrayBuffer, options?: Object): number + +以同步方法从流文件读取数据。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | buffer | ArrayBuffer | 是 | 用于读取文件的缓冲区。 | + | options | Object | 否 | 支持如下选项:
- offset,number 类型,表示将数据读取到缓冲区的位置,即相对于缓冲区首地址的偏移。可选,默认为0。
- length,number 类型,表示期望读取数据的长度。可选,默认缓冲区长度减去偏移长度。
- position,number 类型,表示期望读取文件的位置。可选,默认从当前位置开始读。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | number | 实际读取的长度。 | + +- 示例: + ``` + let ss = fileio.createStreamSync(fpath, "r+"); + ss.readSync(new ArrayBuffer(4096),{offset: 1,length: FILE_CONTENT.length,position: 5}); + ``` + + +## Dir + +管理目录,在调用Dir的方法前,需要先通过[fileio.opendirSync](#fileio.opendirsync)方法来构建一个Dir实例。 + + +### readSync + +readSync(): Dirent + +同步读取下一个目录项。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [Dirent](#dirent) | 表示一个目录项。 | + +- 示例: + ``` + let dir = fileio.opendirSync(dpath); + let dirent = dir.readSync(); + console.log(dirent.name); + ``` + + +### closeSync + +closeSync(): void + +用于关闭目录。目录被关闭后,Dir中持有的文件描述将被释放,后续将无法从Dir中读取目录项。 + +- 示例: + ``` + let dir = fileio.opendirSync(dpath); + dir.closeSync(); + ``` + + +## Dirent + +在调用Dirent的方法前,需要先通过[readSync](#readsync)方法来构建一个Dirent实例。 + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| name | string | 是 | 否 | 目录项的名称。 | + + +### isBlockDevice + +isBlockDevice(): boolean + +用于判断当前目录项是否是块特殊文件。一个块特殊文件只能以块为粒度进行访问,且访问的时候带缓存。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是块特殊设备。 | + +- 示例: + ``` + let dir = fileio.opendirSync(dpath); + let isBLockDevice = dir.readSync().isBlockDevice(); + ``` + + +### isCharacterDevice + +isCharacterDevice(): boolean + +用于判断当前目录项是否是字符特殊设备。一个字符特殊设备可进行随机访问,且访问的时候不带缓存。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是字符特殊设备。 | + +- 示例: + ``` + let dir = fileio.opendirSync(dpath); + let isCharacterDevice = dir.readSync().isCharacterDevice(); + ``` + + +### isDirectory + +isDirectory(): boolean + +用于判断当前目录项是否是目录。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是目录。 | + +- 示例: + ``` + let dir = fileio.opendirSync(dpath); + let isDirectory = dir.readSync().isDirectory(); + ``` + + +### isFIFO + +isFIFO(): boolean + +用于判断当前目录项是否是命名管道(有时也称为FIFO)。命名管道通常用于进程间通信。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是FIFO。 | + +- 示例: + ``` + let dir = fileio.opendirSync(dpath); + let isFIFO = dir.readSync().isFIFO(); + ``` + + +### isFile + +isFile(): boolean + +用于判断当前目录项是否是普通文件。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是普通文件。 | + +- 示例: + ``` + let dir = fileio.opendirSync(dpath); + let isFile = dir.readSync().isFile(); + ``` + + +### isSocket + +isSocket(): boolean + +用于判断当前目录项是否是套接字。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是套接字。 | + +- 示例: + ``` + let dir = fileio.opendirSync(dpath); + let isSocket = dir.readSync().isSocket(); + ``` + + +### isSymbolicLink + +isSymbolicLink(): boolean + +用于判断当前目录项是否是符号链接。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 表示当前目录项是否是符号链接。 | + +- 示例: + ``` + let dir = fileio.opendirSync(dpath); + let isSymbolicLink = dir.readSync().isSymbolicLink(); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/02.\350\275\273\351\207\217\347\272\247\345\255\230\345\202\250.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/02.\350\275\273\351\207\217\347\272\247\345\255\230\345\202\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..5df6ab3569c9623e3f06192170a42c42be4df8d6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/02.\350\275\273\351\207\217\347\272\247\345\255\230\345\202\250.md" @@ -0,0 +1,781 @@ +--- +title: 轻量级存储 +permalink: /pages/000b000301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 轻量级存储 + +轻量级存储为应用提供key-value键值型的文件数据处理能力,支持应用对数据进行轻量级存储及查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型。 + + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import dataStorage from '@ohos.data.storage' +``` + + +## 权限 + +无 + + +## 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| MAX_KEY_LENGTH | string | 是 | 否 | key的最大长度限制,大小为80字节。 | +| MAX_VALUE_LENGTH | string | 是 | 否 | string类型value的最大长度限制,大小为8192字节。 | + + +## dataStorage.getStorageSync + +getStorageSync(path: string): Storage + +读取指定文件,将数据加载到Storage实例,用于数据操作,此方法为同步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 应用程序内部数据存储路径。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [Storage](#storage) | 获取到要操作的Storage实例,用于进行数据存储操作。 | + +- 示例: + ``` + import dataStorage from '@ohos.data.storage' + import featureAbility from '@ohos.ability.featureAbility' + + var context = featureAbility.getContext() + var path = await context.getFilesDir() + let storage = dataStorage.getStorageSync(path + '/mystore') + storage.putSync('startup', 'auto') + storage.flushSync() + ``` + + +## dataStorage.getStorage + +getStorage(path: string, callback: AsyncCallback<Storage>): void + +读取指定文件,将数据加载到Storage实例,用于数据操作,使用callback形式返回结果。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 应用程序内部数据存储路径。 | + | callback | AsyncCallback<[Storage](#storage)> | 是 | 回调函数。 | + +- 示例: + ``` + import dataStorage from '@ohos.data.storage' + import featureAbility from '@ohos.ability.featureAbility' + + var context = featureAbility.getContext() + var path = await context.getFilesDir() + dataStorage.getStorage(path + '/mystore', function (err, storage) { + if (err) { + console.info("Get the storage failed, path: " + path + '/mystore') + return; + } + storage.putSync('startup', 'auto') + storage.flushSync() + }) + ``` + + +## dataStorage.getStorage + +getStorage(path: string): Promise<Storage> + +读取指定文件,将数据加载到Storage实例,用于数据操作,使用Promise方式作为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 应用程序内部数据存储路径。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<[Storage](#storage)> | Promise实例,用于异步获取结果。 | + +- 示例: + ``` + import dataStorage from '@ohos.data.storage' + import featureAbility from '@ohos.ability.featureAbility' + + var context = featureAbility.getContext() + var path = await context.getFilesDir() + let promise = dataStorage.getStorage(path + '/mystore') + promise.then((storage) => { + storage.putSync('startup', 'auto') + storage.flushSync() + }).catch((err) => { + console.info("Get the storage failed, path: " + path + '/mystore') + }) + ``` + + +## dataStorage.deleteStorageSync + +deleteStorageSync(path: string): void + +从内存中移除指定文件对应的Storage单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,此方法为同步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 应用程序内部数据存储路径。 | + +- 示例: + ``` + dataStorage.deleteStorageSync(path + '/mystore') + ``` + + +## dataStorage.deleteStorage + +deleteStorage(path: string, callback: AsyncCallback<void>) + +从内存中移除指定文件对应的Storage单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用callback方式作为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 应用程序内部数据存储路径。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例: + ``` + dataStorage.deleteStorage(path + '/mystore', function (err) { + if (err) { + console.info("Deleted failed with err: " + err) + return + } + console.info("Deleted successfully.") + }) + ``` + + +## dataStorage.deleteStorage + +deleteStorage(path: string): Promise<void> + +从内存中移除指定文件对应的Storage单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用promise方式作为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 应用程序内部数据存储路径。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | Promise实例,用于异步获取结果。 | + +- 示例: + ``` + let promise = dataStorage.deleteStorage(path + '/mystore') + promise.then(() => { + console.info("Deleted successfully.") + }).catch((err) => { + console.info("Deleted failed with err: " + err) + }) + ``` + + +## dataStorage.removeStorageFromCacheSync + +removeStorageFromCacheSync(path: string): void + +从内存中移除指定文件对应的Storage单实例。移除Storage单实例时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。 + +此方法为同步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 应用程序内部数据存储路径。 | + +- 示例: + ``` + dataStorage.removeStorageFromCacheSync(path + '/mystore') + ``` + + +## dataStorage.removeStorageFromCache + +removeStorageFromCache(path: string, callback: AsyncCallback<Storage>): void + +从内存中移除指定文件对应的Storage单实例。移除Storage单实例时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 应用程序内部数据存储路径。 | + | callback | AsyncCallback<[Storage](#storage)> | 是 | 回调函数。 | + +- 示例: + ``` + dataStorage.removeStorageFromCache(path + '/mystore', function (err) { + if (err) { + console.info("Removed storage from cache failed with err: " + err) + return + } + console.info("Removed storage from cache successfully.") + }) + ``` + + +## dataStorage.removeStorageFromCache + +removeStorageFromCache(path: string): Promise<void> + +从内存中移除指定文件对应的Storage单实例。移除Storage单实例时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | path | string | 是 | 应用程序内部数据存储路径。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | Promise实例,用于异步获取结果。 | + +- 示例: + ``` + let promise = dataStorage.removeStorageFromCache(path + '/mystore') + promise.then(() => { + console.info("Removed storage from cache successfully.") + }).catch((err) => { + console.info("Removed storage from cache failed with err: " + err) + }) + ``` + + +## Storage + +提供获取和修改存储数据的接口。 + + +### getSync + +getSync(key: string, defValue: ValueType): ValueType + +获取键对应的值,如果值为null或者非默认值类型,返回默认数据。 + +此方法为同步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要获取的存储key名称。它不能为空。 | + | defValue | ValueType | 是 | 给定key的存储不存在,则要返回的默认值。支持number、string、boolean。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | ValueType | 键对应的值,如果值为null或者非默认值类型,返回默认数据。 | + +- 示例: + ``` + let value = storage.getSync('startup', 'default') + console.info("The value of startup is " + value) + ``` + + +### get + +get(key: string, defValue: ValueType, callback: AsyncCallback<ValueType>): void + +获取键对应的值,如果值为null或者非默认值类型,返回默认数据。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要获取的存储key名称。它不能为空。 | + | defValue | ValueType | 是 | 默认返回值。支持number、string、boolean。 | + | callback | AsyncCallback<ValueType> | 是 | 回调函数。 | + +- 示例: + ``` + storage.get('startup', 'default', function(err, value) { + if (err) { + console.info("Get the value of startup failed with err: " + err) + return + } + console.info("The value of startup is " + value) + }) + ``` + + +### get + +get(key: string, defValue: ValueType): Promise<ValueType> + +获取键对应的值,如果值为null或者非默认值类型,返默认数据。 + +此方法为异步方法。 + +- **参数:** + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要获取的存储key名称。它不能为空。 | + | defValue | ValueType | 是 | 默认返回值。支持number、string、boolean。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<ValueType> | Promise实例,用于异步获取结果。 | + +- 示例: + ``` + let promise = storage.get('startup', 'default') + promise.then((value) => { + console.info("The value of startup is " + value) + }).catch((err) => { + console.info("Get the value of startup failed with err: " + err) + }) + ``` + + +### putSync + +putSync(key: string, value: ValueType): void + +首先获取指定文件对应的Storage实例,然后借助Storage API将数据写入Storage实例,通过flush或者flushSync将Storage实例持久化。 + +此方法为同步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要修改的存储的key。它不能为空。 | + | value | ValueType | 是 | 存储的新值。支持number、string、boolean。 | + +- 示例: + ``` + storage.putSync('startup', 'auto') + ``` + + +### put + +put(key: string, value: ValueType, callback: AsyncCallback<void>): void + +首先获取指定文件对应的Storage实例,然后借助Storage API将数据写入Storage实例,通过flush或者flushSync将Storage实例持久化。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要修改的存储的key。它不能为空。 | + | value | ValueType | 是 | 存储的新值。支持number、string、boolean。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例: + ``` + storage.put('startup', 'auto', function (err) { + if (err) { + console.info("Put the value of startup failed with err: " + err) + return + } + console.info("Put the value of startup successfully.") + }) + ``` + + +### put + +put(key: string, value: ValueType): Promise<void> + +首先获取指定文件对应的Storage实例,然后借助Storage API将数据写入Storage实例,通过flush或者flushSync将Storage实例持久化。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要修改的存储的key。它不能为空。 | + | value | ValueType | 是 | 存储的新值。支持number、string、boolean。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | Promise实例,用于异步处理。 | + +- 示例: + ``` + let promise = storage.put('startup', 'auto') + promise.then(() => { + console.info("Put the value of startup successfully.") + }).catch((err) => { + console.info("Put the value of startup failed with err: " + err) + }) + ``` + + +### hasSync + +hasSync(key: string): boolean + +检查存储对象是否包含名为给定key的存储。 + +此方法为同步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要获取的存储key名称。它不能为空。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | true 表示存在,false表示不存在。 | + +- 示例: + ``` + let isExist = storage.hasSync('startup') + if (isExist) { + console.info("The key of startup is contained.") + } + ``` + + +### has + +has(key: string, callback: AsyncCallback<boolean>): boolean + +检查存储对象是否包含名为给定key的存储。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要获取的存储key名称,不能为空。 | + | callback | AsyncCallback<boolean> | 是 | 回调函数。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | true表示存在,false表示不存在。 | + +- 示例: + ``` + storage.has('startup', function (err, isExist) { + if (err) { + console.info("Check the key of startup failed with err: " + err) + return + } + if (isExist) { + console.info("The key of startup is contained.") + } + }) + ``` + + +### has + +has(key: string): Promise<boolean> + +检查存储对象是否包含名为给定key的存储。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要获取的存储key名称。它不能为空。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<boolean> | Promise实例,用于异步处理。 | + +- 示例: + ``` + let promise = storage.has('startup') + promise.then((isExist) => { + if (isExist) { + console.info("The key of startup is contained.") + } + }).catch((err) => { + console.info("Check the key of startup failed with err: " + err) + }) + ``` + + +### deleteSync + +deleteSync(key: string): void + +从存储对象中删除名为给定key的存储。 + +此方法为同步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要获取的存储key名称。它不能为空。 | + +- 示例: + ``` + storage.deleteSync('startup') + ``` + + +### delete + +delete(key: string, callback: AsyncCallback<void>): void + +从存储对象中删除名为给定key的存储。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要获取的存储key名称,不能为空。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例: + ``` + storage.delete('startup', function (err) { + if (err) { + console.info("Delete startup key failed with err: " + err) + return + } + console.info("Deleted startup key successfully.") + }) + ``` + + +### delete + +delete(key: string): Promise<void> + +从存储对象删除名为给定key的存储。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | key | string | 是 | 要获取的存储key名称。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | Promise实例,用于异步处理。 | + +- 示例: + ``` + let promise = storage.delete('startup') + promise.then(() => { + console.info("Deleted startup key successfully.") + }).catch((err) => { + console.info("Delete startup key failed with err: " + err) + }) + ``` + + +### flushSync + +flushSync(): void + +将当前storage对象中的修改保存到当前的storage,并同步存储到文件中。 + +此方法为同步方法。 + +- 示例: + ``` + storage.flushSync() + ``` + + +### flush + +flush(callback: AsyncCallback<void>): void + +将当前storage对象中的修改保存到当前的storage,并异步存储到文件中。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例: + ``` + storage.flush(function (err) { + if (err) { + console.info("Flush to file failed with err: " + err) + return + } + console.info("Flushed to file successfully.") + }) + ``` + + +### flush + +flush(): Promise<void> + +将当前storage对象中的修改保存到当前的storage,并异步存储到文件中。 + +此方法为异步方法。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | Promise实例,用于异步处理。 | + +- 示例: + ``` + let promise = storage.flush() + promise.then(() => { + console.info("Flushed to file successfully.") + }).catch((err) => { + console.info("Flush to file failed with err: " + err) + }) + ``` + + +### clearSync + +clearSync(): void + +清除此存储对象中的所有存储。 + +此方法为同步方法。 + +- 示例: + ``` + storage.clearSync() + ``` + + +### clear + +clear(callback: AsyncCallback<void>): void + +清除此存储对象中的所有存储。 + +此方法为异步方法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例: + ``` + storage.clear(function (err) { + if (err) { + console.info("Clear to file failed with err: " + err) + return + } + console.info("Cleared to file successfully.") + }) + ``` + + +### clear + +clear(): Promise<void> + +清除此存储对象中的所有存储。 + +此方法为异步方法。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | Promise实例,用于异步处理。 | + +- 示例: + ``` + let promise = storage.clear() + promise.then(() => { + console.info("Cleared to file successfully.") + }).catch((err) => { + console.info("Clear to file failed with err: " + err) + }) + ``` + + +### on('change') + +on(type: 'change', callback: Callback<StorageObserver>): void + +订阅数据变更者类需要实现StorageObserver接口,订阅的key的值发生变更后,在执行flush/flushSync方法后,callback方法会被回调。 + +- 参数: + | 参数名 | 类型 | 说明 | + | -------- | -------- | -------- | + | type | string | 事件类型,固定值'change',表示数据变更。 | + | callback | Callback<[StorageObserver](#storageobserver)> | 回调对象实例。 | + +- 示例: + ``` + var observer = function (key) { + console.info("The key of " + key + " changed.") + } + storage.on('change', observer) + storage.putSync('startup', 'auto') + storage.flushSync() // observer will be called. + ``` + + +### off('change') + +off(type: 'change', callback: Callback<StorageObserver>): void + +当不再进行订阅数据变更时,使用此接口取消订阅。 + +- 参数: + | 参数名 | 类型 | 说明 | + | -------- | -------- | -------- | + | type | string | 事件类型,固定值'change',表示数据变更。 | + | callback | Callback<[StorageObserver](#storageobserver)> | 需要取消的回调对象实例。 | + +- 示例: + ``` + var observer = function (key) { + console.info("The key of " + key + " changed.") + } + storage.off('change', observer) + ``` + + +## StorageObserver + +| 名称 | 参数类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 否 | 变更的数据内容。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/03.\345\210\206\345\270\203\345\274\217\346\225\260\346\215\256\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/03.\345\210\206\345\270\203\345\274\217\346\225\260\346\215\256\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..1d59d1a2762ad5e32ce8a7e4466ff7695753863e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/03.\345\210\206\345\270\203\345\274\217\346\225\260\346\215\256\347\256\241\347\220\206.md" @@ -0,0 +1,7905 @@ +--- +title: 分布式数据管理 +permalink: /pages/000b000302 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 分布式数据管理 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + +## 导入模块 + +``` +import distributedData from '@ohos.data.distributedData'; +``` + +## 权限 + +无 + +## distributedData.createKVManager + +createKVManager\(config: KVManagerConfig, callback: AsyncCallback\): void + +创建一个KVManager对象实例,用于管理数据库对象,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

config

+

KVManagerConfig

+

+

提供KVManager实例的配置信息,包括调用方的包名和用户信息。

+

callback

+

AsyncCallback<KVManager>

+

+

KVManager实例创建时调用的回调,返回KVManager对象实例。

+
+ +- 示例: + + ``` + let kvManager; + try { + const kvManagerConfig = { + bundleName : 'com.example.datamanagertest', + userInfo : { + userId : '0', + userType : SAME_USER_ID + } + } + distributedData.createKVManager(kvManagerConfig, function (err, manager) { + if (err) { + console.log("createKVManager err: " + JSON.stringify(err)); + return; + } + console.log("createKVManager success"); + kvManager = manager; + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +## distributedData.createKVManager + +createKVManager\(config: KVManagerConfig\): Promise + +创建一个KVManager对象实例,用于管理数据库对象,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

config

+

KVManagerConfig

+

+

提供KVManager实例的配置信息,包括调用方的包名和用户信息。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<KVManager>

+

指定的Promise回调方法,返回创建的KVManager对象实例。

+
+ +- 示例: + + ``` + let kvManager; + try { + const kvManagerConfig = { + bundleName : 'com.example.datamanagertest', + userInfo : { + userId : '0', + userType : SAME_USER_ID + } + } + distributedData.createKVManager(kvManagerConfig).then((manager) => { + console.log("createKVManager success"); + kvManager = manager; + }).catch((err) => { + console.log("createKVManager err: " + JSON.stringify(err)); + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +## KVManagerConfig + +提供KVManager实例的配置信息,包括调用方的包名和用户信息。 + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

必填

+

描述

+

userInfo

+

UserInfo

+

+

调用方的用户信息。

+

bundleName

+

string

+

+

调用方的包名。

+
+ +## UserInfo + +用户信息。 + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

必填

+

描述

+

userId

+

string

+

+

指示要设置的用户ID。

+

userType

+

UserType

+

+

指示要设置的用户类型。

+
+ +## UserType + +用户类型。 + + + + + + + + + + + + +

名称

+

默认值

+

说明

+

SAME_USER_ID

+

0

+

使用同一帐户登录不同设备的用户。

+
+ +## KVManager + +数据管理实例,用于获取KVStore的相关信息。在调用KVManager的方法前,需要先通过createKVManager构建一个KVManager实例。 + +### getKVStore + +getKVStore\(storeId: string, options: Options, callback: AsyncCallback\): void + +通过指定Options和storeId,创建并获取KVStore数据库,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

storeId

+

string

+

+

数据库唯一标识符,长度不大于MAX_STORE_ID_LENGTH

+

options

+

Options

+

+

创建KVStore实例的配置信息。

+

callback

+

AsyncCallback<T>,

+

<T extends KVStore>

+

+

创建KVStore实例的回调,返回KVStore对象实例。

+
+ +- 示例: + + ``` + let kvStore; + try { + const options = { + createIfMissing : true, + encrypt : false, + backup : false, + autoSync : true, + kvStoreType : SINGLE_VERSION, + securityLevel : S2, + }; + kvManager.getKVStore('storeId', options, function (err, store) { + if (err) { + console.log("getKVStore err: " + JSON.stringify(err)); + return; + } + console.log("getKVStore success"); + kvStore = store; + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### getKVStore + +getKVStore\(storeId: string, options: Options\): Promise + +通过指定Options和storeId,创建并获取KVStore数据库,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

storeId

+

string

+

+

数据库唯一标识符,长度不大于MAX_STORE_ID_LENGTH

+

options

+

Options

+

+

创建KVStore实例的配置信息。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<T>

+

<T extends KVStore>

+

指定的Promise回调方法,返回创建的KVStore数据库实例。

+
+ +- 示例: + + ``` + let kvStore; + try { + const options = { + createIfMissing : true, + encrypt : false, + backup : false, + autoSync : true, + kvStoreType : SINGLE_VERSION, + securityLevel : S2, + }; + kvManager.getKVStore('storeId', options).then((store) => { + console.log("getKVStore success"); + kvStore = store; + }).catch((err) => { + console.log("getKVStore err: " + JSON.stringify(err)); + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + +### closeKVStore ### + +closeKVStore\(appId: string, storeId: string, kvStore: KVStore, callback: AsyncCallback\): void; + +通过storId的值关闭指定的kvStore数据库,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

appId

+

string

+

+

所调用数据库方的包名。

+

storeId

+

string

+

+

要关闭的数据库唯一标识符,长度不大于MAX_STORE_ID_LENGTH

+

kvStore

+

KVStore

+

+

要关闭的KvStore数据库。

+

callback

+

AsyncCallback<void>

+

+

回调函数,如果数据库关闭成功则返回true,否则返回false。

+
+ +- 示例: + + ``` + try { + kvManager.getKVStore('storeId', options, async function (err, store) { + console.log('getKVStore success'); + kvStore = store; + kvManager.closeKVStore('appId', 'storeId', kvStore, function (err, data) { + console.log('closeKVStore success'); + }); + }); + } catch (e) { + console.log('CloseKVStore e ' + e); + } + ``` + +### closeKVStore ### + +closeKVStore\(appId: string, storeId: string, kvStore: KVStore\): Promise; + +通过kvStore的值关闭指定的kvStore数据库,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

appId

+

string

+

+

所调用数据库方的包名。

+

storeId

+

string

+

+

要关闭的数据库唯一标识符,长度不大于MAX_STORE_ID_LENGTH

+

kvStore

+

KVStore

+

+

要关闭的数据库。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,如果数据库关闭成功则返回true,否则返回false。

+
+ +- 示例: + + ``` + let KvStore; + try { + kvManager.closeKVStore('appId', 'storId', KvStore).then(() => { + console.log('CloseKVStore success'); + }).catch((err) => { + console.log('CloseKVStore err ' + JSON.stringify(err)); + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### deleteKVStore ### + +deleteKVStore(appId: string, storeId: string, callback: AsyncCallback): void; + +通过storeId的值删除指定的kvStore数据库,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

appId

+

string

+

+

所调用数据库方的包名。

+

storeId

+

string

+

+

要删除的数据库唯一标识符,长度不大于MAX_STORE_ID_LENGTH

+

callback

+

AsyncCallback<void>

+

+

回调函数,如果成功返回true,否则返回false。

+
+ +- 示例: + + ``` + let KvStore; + try { + kvManager.deleteKVStore('appId', 'storeId', function (err, data) { + if (err){ + console.log('deleteKVStore success'); + return; + } + console.log("deleteKVStore success"); + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + +### deleteKVStore ### + +deleteKVStore\(appId: string, storeId: string\): Promise; + +通过storeId的值删除指定的kvStore数据库,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

appId

+

string

+

+

所调用数据库方的包名。

+

storeId

+

string

+

+

要删除数据库的唯一标识符,长度不大于MAX_STORE_ID_LENGTH

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,如果成功返回true,否则返回false。

+
+ +- 示例: + + ``` + let KvStore; + try { + kvManager.deleteKVStore('appId', 'storId', KvStore).then(() => { + console.log('deleteKVStore success'); + }).catch((err) => { + console.log('deleteKVStore err ' + JSON.stringify(err)); + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### getAllKVStoreId ### + +getAllKVStoreId(appId: string, callback: AsyncCallback): void; + +获取所有通过getKvStore方法创建的且没有调用deleteKvStore方法删除的KvStore数据库的storeId,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

appId

+

string

+

+

所调用数据库方的包名。

+

callback

+

AsyncCallback<void>

+

+

回调函数,返回所有创建的 KvStore 数据库的 storeId。

+
+ +- 示例: + + ``` + try { + kvManager.getAllKVStoreId('appId', function (err, data) { + console.log('GetAllKVStoreId getAllKVStoreId success'); + console.log('GetAllKVStoreId size = ' + data.length); + }); + } catch (e) { + console.log('GetAllKVStoreId e ' + e); + } + ``` + + +### getAllKVStoreId ### + +getAllKVStoreId\(appId: string\): Promise; + +获取所有通过getKvStore方法创建的且没有调用deleteKvStore方法删除的KvStore数据库的storeId,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

appId

+

string

+

+

所调用数据库方的包名。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<string[]>

+

Promise实例,返回所有创建的 KvStore 数据库的 storeId。。

+
+ +- 示例: + + ``` + let KvStore; + try { + kvManager.getKVStore('storId', options).then(async (store) => { + console.log('getKVStore success'); + kvStore = store; + kvManager.getAllKVStoreId('appId').then((data) => { + console.log('getAllKVStoreId success'); + console.log('GetAllKVStoreId size = ' + data.length); + console.log('GetAllKVStoreId data[0] = ' + data[0]); + }); + }).catch((err) => { + console.log('getKVStore err ' + JSON.stringify(err)); + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### on ### + +on\(event: 'distributedDataServiceDie', deathCallback: Callback\): void; + +订阅设备状态变更通知,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

event

+

'distributedDataServiceDie'

+

+

设备状态改变时触发的事件名。

+

deathCallback

+

Callback<void>

+

+

回调函数,在设备状态改变时获取通知。

+
+ +- 示例 + + ``` + let KvStore; + try { + it('KVManagerOn', 0, function (done) { + console.log('KVManagerOn'); + const deathCallback = function () { + console.log('death callback call'); + } + kvManager.on('distributedDataServiceDie', deathCallback); + kvManager.off('distributedDataServiceDie', deathCallback); + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### off ### + +off\(event: 'distributedDataServiceDie', deathCallback: Callback\): void; + +取消订阅设备状态变更通知,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

event

+

'distributedDataServiceDie'

+

+

设备状态改变时触发的事件名。

+

deathCallback

+

Callback<void>

+

+

回调函数,取消设备状态改变时获取通知。

+
+ +- 示例 + + ``` + let KvStore; + try { + it('KVManagerOff', 0, function (done) { + console.log('KVManagerOff'); + const deathCallback = function () { + console.log('death callback call'); + } + kvManager.off('distributedDataServiceDie', deathCallback); + }); + } catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + +## Options + +用于提供创建数据库的配置信息。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

createIfMissing

+

boolean

+

+

当数据库文件不存在时是否创建数据库,默认创建。

+

encrypt

+

boolean

+

+

设置数据库文件是否加密,默认不加密。

+

backup

+

boolean

+

+

设置数据库文件是否备份,默认备份。

+

autoSync

+

boolean

+

+

设置数据库文件是否自动同步,默认不自动同步。

+

kvStoreType

+

KVStoreType

+

+

设置要创建的数据库类型,默认为多设备协同数据库。

+

securityLevel

+

SecurityLevel

+

+

设置数据库安全级别,默认不设置安全级别。

+
+ +## KVStoreType + +用于指定创建的数据库的类型。 + + + + + + + + + + + + + + + + + + + + +

名称

+

默认值

+

说明

+

DEVICE_COLLABORATION

+

0

+

表示多设备协同数据库。

+

SINGLE_VERSION

+

1

+

表示单版本数据库。

+

MULTI_VERSION

+

2

+

表示多版本数据库。此类型当前不允许使用。

+
+ +## SecurityLevel + +用于指定创建的数据库的安全级别。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

默认值

+

说明

+

NO_LEVEL

+

0

+

表示数据库不设置安全级别。

+

S0

+

1

+

表示数据库的安全级别为公共级别安全。

+

S1

+

2

+

表示数据库的安全级别为低级别安全,当数据泄露时会产生较低影响。

+

S2

+

3

+

表示数据库的安全级别为中级别安全,当数据泄露时会产生较大影响。

+

S3

+

5

+

表示数据库的安全级别为高级别安全,当数据泄露时会产生重大影响。

+

S4

+

6

+

表示数据库的安全级别为关键级别安全,当数据泄露时会产生严重影响。

+
+ +## Constants + +KVStore常量。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

默认值

+

说明

+

MAX_KEY_LENGTH

+

1024

+

数据库中Key允许最大长度,单位字节。

+

MAX_VALUE_LENGTH

+

4194303

+

数据库中Value允许的最大长度,单位字节。

+

MAX_KEY_LENGTH_DEVICE

+

896

+

最大设备坐标密钥长度。

+

MAX_STORE_ID_LENGTH

+

128

+

数据库标识符允许的最大长度,单位字节。

+

MAX_QUERY_LENGTH

+

512000

+

最大查询长度。

+

MAX_BATCH_SIZE

+

128

+

最大批处理操作大小。

+
+ +## Schema ## + +表示数据库架构,可以创建 Schema 对象,并在创建或打开数据库时将其放置在 Option 中。 + +### constructor ### + +constructor(); + +用于创建架构实例的构造函数。 + +- 示例 + + ``` + try { + let schema = new ddm.Schema(); + schema.root = new ddm.FieldNode(); + console.log("constructor: " + str); + } catch (e) {} + ``` + +### toJsonString ### + +toJsonString():string; + +获取 json 格式的 schema 。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

string

+

以 json 格式返回Schema。

+
+ +- 示例 + + ``` + try { + let schema = new ddm.Schema(); + const str = schema.toJsonString(); + schema.root = new ddm.FieldNode(); + const node = schema.root; + console.log("schema: " + str); + } catch (e) {} + ``` + + +## FieldNode ## + +表示 Schema 实例的节点,提供定义存储在数据库中的值的方法。 + +### constructor ### + +constructor\(name: string\); + +用于创建具有指定字段的 FieldNode 实例的构造函数。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

child

+

string

+

+

指定字段。

+
+ +- 示例 + + ``` + try { + let node = new ddm.FieldNode("name"); + console.log("constructor: " + str); + } catch (e) {} + ``` + + +### appendChild ### + +appendChild\(child: FieldNode\): boolean; + +向这个 FieldNode 添加一个子节点。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

child

+

FieldNode

+

+

要附加的域节点。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果子节点成功添加到这个FieldNode,则返回 true;否则返回 false。

+
+ +- 示例 + + ``` + try { + let node = new ddm.FieldNode("root"); + let child1 = new ddm.FieldNode("child1"); + let child2 = new ddm.FieldNode("child2"); + let child3 = new ddm.FieldNode("child3"); + node.appendChild(child1); + node.appendChild(child2); + node.appendChild(child3); + console.log("appendNode " + node.toJson()); + child1 = null; + child2 = null; + child3 = null; + node = null; + } catch (e) { + console.log("AppendChild " + e); + } + ``` + + +### toJson ### + +toJson(\): string; + +获取字段名称。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

string

+

返回节点的字段名称。

+
+ +- 示例 + + ``` + try { + let node = new ddm.FieldNode("root"); + let child = new ddm.FieldNode("child"); + node.appendChild(child); + } catch (e) { + console.log("ToJson " + e); + } + ``` + + +## KvStoreResultSet ## + +提供获取KvStore数据库结果集的方法,提供查询和移动数据读取位置的方法,在调用KvStoreResultSet的方法前,需要先通过DeviceKvStore 构建一个DeviceKvStore 实例。 + +### getCount ### + +getCount(\): number; + +获取结果集中的行数。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

number

+

返回行数。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + count = resultSet.getCount(); + console.log("getCount " + count); + } catch (e) { + console.log("GetCount001 fail " + e); + } + ``` + + +### getPosition ### + +getPosition(\): number; + +获取结果集中当前的读取位置。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

number

+

返回当前读取位置。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const positon = resultSet.getPosition(); + console.log("getPosition " + positon); + } catch (e) { + console.log("GetPosition001 fail " + e); + } + ``` + + +### moveToFirst ### + +moveToFirst(\): boolean; + +将读取位置移动到第一行。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果操作成功则返回true,否则返回 false。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.moveToFirst(); + console.log("moveToFirst " + moved); + } catch (e) { + console.log("MoveToFirst fail " + e); + } + ``` + + +### moveToLast ### + +moveToLast(\): boolean; + +将读取位置移动到最后一行。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果操作成功则返回true,否则返回 false。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.moveToLast(); + console.log("moveToLast " + moved); + } catch (e) { + console.log("moveToLast fail " + e); + } + ``` + + +### moveToNext ### + +moveToNext(\): boolean; + +将读取位置移动到下一行。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果操作成功则返回true,否则返回 false。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.moveToNext(); + console.log("moveToNext " + moved); + } catch (e) { + console.log("moveToNext fail " + e); + } + ``` + + +### moveToPrevious ### + +moveToPrevious(\): boolean; + +将读取位置移动到上一行。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果操作成功则返回true,否则返回 false。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.moveToPrevious(); + console.log("moveToPrevious " + moved); + } catch (e) { + console.log("moveToPrevious fail " + e); + } + ``` + + +### move ### + +move\(offset: number\): boolean; + +将读取位置移动到当前位置的相对偏移量。 + +- 参数: + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

offset

+

number

+

+

表示与当前位置的相对偏移量,负偏移表示向后移动,正偏移表示向前移动。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果操作成功则返回true,否则返回 false。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.move(); + console.log("move " + moved); + } catch (e) { + console.log("move fail " + e); + } + ``` + + +### moveToPosition ### + +moveToPosition\(position: number\): boolean; + +将读取位置从 0 移动到绝对位置。 + +- 参数: + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

position

+

number

+

+

表示绝对位置。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果操作成功则返回true,否则返回 false。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.moveToPosition(); + console.log("moveToPosition " + moved); + } catch (e) { + console.log("moveToPosition fail " + e); + } + ``` + + +### isFirst ### + +isFirst(\): boolean; + +检查读取位置是否为第一行。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果读取位置是第一行,则返回 true;否则返回 false。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.isFirst(); + console.log("isFirst " + moved); + } catch (e) { + console.log("isFirst fail " + e); + } + ``` + + +### isLast ### + +isLast(\): boolean; + +检查读取位置是否为最后一行。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果读取位置是最后一行,则返回 true;否则返回 false。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.isLast(); + console.log("isLast " + moved); + } catch (e) { + console.log("isLast fail " + e); + } + ``` + + +### isBeforeFirst ### + +isBeforeFirst(\): boolean; + +检查读取位置是否在第一行之前。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果读取位置在第一行之前,则返回 true;否则返回 false。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.isBeforeFirst(); + console.log("isBeforeFirst " + moved); + } catch (e) { + console.log("isBeforeFirst fail " + e); + } + ``` + + +### isAfterLast ### + +isAfterLast(\): boolean; + +检查读取位置是否在最后一行之后。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

boolean

+

如果读取位置在最后一行之后,则返回 true;否则返回 false。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.isAfterLast(); + console.log("isAfterLast " + moved); + } catch (e) { + console.log("isAfterLast fail " + e); + } + ``` + + +### getEntry ### + +getEntry(\): Entry; + +获取键值对 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Entry

+

返回键值对。

+
+ +- 示例 + + ``` + let KvStoreResultSet; + try { + const moved = resultSet.moveToNext(); + const entry = resultSet.getEntry(); + console.log("getEntry " + entry); + } catch (e) { + console.log("getEntry fail " + e); + } + ``` + + +## Query ## + +使用谓词表示数据库查询,提供创建Query实例、查询数据库中的数据和添加谓词的方法。 + +### constructor ### + +constructor(); + +用于创建查询实例的构造函数。 + +- 示例 + + ``` + try { + let query= new ddm.Query() + console.log("constructor: " + str); + } catch (e) {} + ``` + +### reset ### + +reset(\): Query; + +公共查询重置。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回重置的 Query 对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.equalTo("key", "value"); + console.log("query is " + query.getSqlLike()); + query.reset(); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("simply calls should be ok :" + e); + } + ``` + + +### equalTo ### + +equalTo\(field: string, value: number|string|boolean\): Query; + +构造一个Query对象来查询具有指定字段的条目,其值等于指定的值。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

value

+

number | string | boolean

+

+

表示指定的值。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.equalTo("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### notEqualTo ### + +notEqualTo\(field: string, value: number|string|boolean\): Query; + +构造一个Query对象以查询具有指定字段且值不等于指定值的条目。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

value

+

number|string|boolean

+

+

表示指定的值。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.notEqualTo("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### greaterThan ### + +greaterThan\(field: string, value: number|string|boolean\): Query; + +构造一个Query对象以查询具有大于指定值的指定字段的条目。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

value

+

number|string|boolean

+

+

表示指定的值。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.greaterThan("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### lessThan ### + +lessThan\(field: string, value: number|string\): Query; + +构造一个Query对象以查询具有小于指定值的指定字段的条目。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

value

+

number|string

+

+

表示指定的值。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.lessThan("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### greaterThanOrEqualTo ### + +greaterThanOrEqualTo\(field: string, value: number|string\): Query; + +构造一个Query对象以查询具有指定字段且值大于或等于指定值的条目。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

value

+

number|string

+

+

表示指定的值。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.greaterThanOrEqualTo("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### lessThanOrEqualTo ### + +lessThanOrEqualTo\(field: string, value: number|string\): Query; + +构造一个Query对象以查询具有指定字段且值小于或等于指定值的条目。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

value

+

number|string

+

+

表示指定的值。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.lessThanOrEqualTo("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### isNull ### + +isNull\(field: string\): Query; + +构造一个Query对象以查询具有值为null的指定字段的条目。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.isNull("field"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### inNumber ### + +inNumber\(field: string, valueList: number[\]\): Query; + +构造一个Query对象以查询具有指定字段的条目,其值在指定的值列表中。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

valueList

+

number[]

+

+

表示指定的值列表。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.inNumber("field", "valueList"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### inString ### + +inString\(field: string, valueList: string[\]\): Query; + +构造一个Query对象以查询具有指定字段的条目,其值在指定的字符串值列表中。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

valueList

+

string[]

+

+

表示指定的字符串值列表。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.inString("field", "valueList"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### notInNumber ### + +notInNumber\(field: string, valueList: number[\]\): Query; + +构造一个Query对象以查询具有指定字段的条目,该字段的值不在指定的值列表中。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

valueList

+

number[]

+

+

表示指定的值列表。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.notInNumber("field", "valueList"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### notInString ### + +notInString\(field: string, valueList: string[\]\): Query; + +构造一个Query对象以查询具有指定字段且值不在指定字符串值列表中的条目。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

valueList

+

string[]

+

+

表示指定的字符串值列表。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.notInString("field", "valueList"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### like ### + +like\(field: string, value: string\): Query; + +构造一个Query对象以查询具有与指定字符串值相似的指定字段的条目。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

value

+

string

+

+

表示指定的字符串值。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.like("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### unlike ### + +unlike\(field: string, value: string\): Query; + +构造一个Query对象以查询具有与指定字符串值不相似的指定字段的条目。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+

value

+

string

+

+

表示指定的字符串值。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.unlike("field", "value"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### and ### + +and(\): Query; + +构造一个带有与条件的查询对象。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.notEqualTo("field", "value1"); + query.and(); + query.notEqualTo("field", "value2"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### or ### + +or(\): Query; + +构造一个带有或条件的Query对象。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.notEqualTo("field", "value1"); + query.or(); + query.notEqualTo("field", "value2"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### orderByAsc ### + +orderByAsc\(field: string\): Query; + +构造一个Query对象,将查询结果按升序排序。 + +- 参数: + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.notEqualTo("field", "value"); + query.orderByAsc("field"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### orderByDesc ### + +orderByDesc\(field: string\): Query; + +构造一个Query对象,将查询结果按降序排序。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段,必须以$开头, 并且不能包含' ^ '。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.notEqualTo("field", "value"); + query.orderByDesc("field"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### limit ### + +limit\(total: number, offset: number\): Query; + +构造一个Query对象来指定结果的数量和开始位置。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

total

+

number

+

+

表示指定的结果数。

+

offset

+

number

+

+

表示起始位置。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.notEqualTo("field", "value"); + query.limit("total", "offset"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### isNotNull ### + +isNotNull\(field: string\): Query; + +使用不为空的指定字段创建查询条件。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

fieId

+

string

+

+

表示指定字段。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.isNotNull("field"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### beginGroup ### + +beginGroup\(\): Query; + +创建一个带有左括号的查询条件组。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.beginGroup(); + query.isNotNull("field"); + query.endGroup(); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### endGroup ### + +endGroup\(\): Query; + +创建一个带有右括号的查询条件组。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + let Query; + try { + let query = new ddm.Query(); + query.beginGroup(); + query.isNotNull("field"); + query.endGroup(); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### prefixKey ### + +prefixKey\(prefix: string\): Query; + +创建具有指定键前缀的查询条件。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

prefix

+

string

+

+

表示指定的键前缀。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + try { + let query = new ddm.Query(); + query.prefixKey("$.name"); + query.prefixKey("0"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +### setSuggestIndex ### + +setSuggestIndex\(index: string\): Query; + +设置一个指定的索引,将优先用于查询。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

index

+

string

+

+

指示要设置的索引。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Query

+

返回查询对象。

+
+ +- 示例 + + ``` + try { + let query = new ddm.Query(); + query.setSuggestIndex("$.name"); + query.setSuggestIndex("0"); + console.log("query is " + query.getSqlLike()); + query = null; + } catch (e) { + console.log("dumplicated calls should be ok :" + e); + } + ``` + + +## KVStore + +KVStore数据库实例,提供增加数据、删除数据和订阅数据变更、订阅同步完成的方法。在调用KVStore的方法前,需要先通过getKVStore构建一个KVStore实例。 + +### put + +put\(key: string, value: Uint8Array | string | number | boolean, callback: AsyncCallback\): void + +添加指定类型键值对到数据库,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

key

+

string

+

+

要添加数据的key,不能为空且长度不大于MAX_KEY_LENGTH

+

value

+

Uint8Array | string | number | boolean

+

+

要添加数据的value,支持Uint8Array、number 、 string 、boolean,

+

Uint8Array、string 的长度不大于MAX_VALUE_LENGTH

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) { + if (err != undefined) { + console.log("put err: " + JSON.stringify(err)); + return; + } + console.log("put success"); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### put + +put\(key: string, value: Uint8Array | string | number | boolean\): Promise + +添加指定类型键值对到数据库,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

key

+

string

+

+

要添加数据的key,不能为空且长度不大于MAX_KEY_LENGTH

+

value

+

Uint8Array | string | number | boolean

+

+

要添加数据的value,支持Uint8Array、number 、 string 、boolean,

+

Uint8Array、string 的长度不大于MAX_VALUE_LENGTH

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于异步处理。

+
+ + +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((data) => { + console.log("put success: " + JSON.stringify(data)); + }).catch((err) => { + console.log("put err: " + JSON.stringify(err)); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### delete + +delete\(key: string, callback: AsyncCallback\): void + +从数据库中删除指定键值的数据,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

key

+

string

+

+

要删除数据的key,不能为空且长度不大于MAX_KEY_LENGTH

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) { + if (err != undefined) { + console.log("put err: " + JSON.stringify(err)); + return; + } + console.log("put success"); + kvStore.delete(KEY_TEST_STRING_ELEMENT, function (err,data) { + if (err != undefined) { + console.log("delete err: " + JSON.stringify(err)); + return; + } + console.log("delete success"); + }); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### delete + +delete\(key: string\): Promise + +从数据库中删除指定键值的数据,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

key

+

string

+

+

要删除数据的key,不能为空且长度不大于MAX_KEY_LENGTH

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于异步处理。

+
+ +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((data) => { + console.log("put success: " + JSON.stringify(data)); + kvStore.delete(KEY_TEST_STRING_ELEMENT).then((data) => { + console.log("delete success"); + }).catch((err) => { + console.log("delete err: " + JSON.stringify(err)); + }); + }).catch((err) => { + console.log("put err: " + JSON.stringify(err)); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### on + +on\(event: 'dataChange', type: SubscribeType, observer: Callback\): void + +订阅指定类型的数据变更通知,此方法为同步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

说明

+

event

+

'dataChange'

+

回调函数名称。

+

type

+

SubscribeType

+

表示订阅的类型。

+

observer

+

Callback<ChangeNotification>

+

回调函数。

+
+ +- 示例 + + ``` + kvStore.on('dataChange', 2, function (data) { + console.log("dataChange callback call data: " + JSON.stringify(data)); + }); + ``` + + +### on + +on\(event: 'syncComplete', syncCallback: Callback\>\): void + +订阅数据同步完成通知,此方法为同步方法。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

说明

+

event

+

'syncComplete'

+

回调函数名称。

+

syncCallback

+

Callback<Array<[string, number]>>

+

回调函数。

+
+ +- 示例 + + ``` + kvStore.on('syncComplete', function (data) { + console.log("syncComplete callback call data: " + data); + }); + ``` + +### off ### + +off\(event:'dataChange', observer: Callback\): void; + +取消订阅数据同步完成通知,此方法为同步方法。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

说明

+

event

+

'datachange'

+

回调函数名称。

+

observer

+

Callback<ChangeNotification>

+

回调函数。

+
+ +### putBatch ### + +putBatch\(entries: Entry[], callback: AsyncCallback\): void; + +批量插入键值对到KvStore数据库中,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

entries

+

Entry[]

+

+

表示要批量插入的键值对。

+

callback

+

Asyncallback<void>

+

+

回调函数。

+
+ +### putBatch ### + +putBatch\(entries: Entry[\]\): Promise; + +批量插入键值对到KvStore数据库中,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

entries

+

Entry[]

+

+

表示要批量插入的键值对。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于异步处理。

+
+ +### deleteBatch ### + +deleteBatch(keys: string[], callback: AsyncCallback): void; + +批量删除KvStore数据库中的键值对,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

keys

+

string[]

+

+

表示要批量删除的键值对。

+

callback

+

Asyncallback<void>

+

+

回调函数。

+
+ +### deleteBatch ### + +deleteBatch\(keys: string[\]\): Promise; + +批量删除键值对到KvStore数据库中,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

keys

+

string[]

+

+

表示要批量删除的键值对。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于异步处理。

+
+ +### startTransaction ### + +startTransaction\(callback: AsyncCallback\): void; + +启动KvStore数据库中的事务,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +### startTransaction ### + +startTransaction\(\): Promise; + +启动KvStore数据库中的事务,并通过Promise方式返回,此方法为异步方法。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于异步处理。

+
+ +### commit ### + +commit\(callback: AsyncCallback\): void; + +提交KvStore数据库中的事务,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +### commit ### + +commit(\): Promise; + +提交KvStore数据库中的事务,并通过Promise方式返回,此方法为异步方法。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于异步处理。

+
+ +### rollback ### + +rollback\(callback: AsyncCallback\): void; + +在KvStore数据库中回滚事务,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +### rollback ### + +rollback(\): Promise; + +在KvStore数据库中回滚事务,并通过Promise方式返回,此方法为异步方法。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于异步处理。

+
+ +### enableSync ### + +enableSync\(enabled: boolean, callback: AsyncCallback\): void; + +设定是否开启同步,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

enabled

+

boolean

+

+

指定是否开启同步,ture表示开启同步,false表示不启用同步。

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +### enableSync ### + +enableSync\(enabled: boolean\): Promise; + +设定是否开启同步,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

enabled

+

boolean

+

+

指定是否开启同步,ture表示开启同步,false表示不启用同步。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于异步处理。

+
+ +### setSyncRange ### + +setSyncRange\(localLabels: string[], remoteSupportLabels: string[], callback: AsyncCallback\): void; + +设置同步范围标签,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

localLabels

+

string[]

+

+

表示本地设备的同步标签。

+

remoteSupportLabels

+

string[]

+

+

表示要同步数据的设备的同步标签。

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +### setSyncRange ### + +setSyncRange\(localLabels: string[], remoteSupportLabels: string[\]\): Promise; + +设置同步范围标签,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

localLabels

+

string[]

+

+

表示本地设备的同步标签。

+

remoteSupportLabels

+

string[]

+

+

表示要同步数据的设备的同步标签。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于异步处理。

+
+ +## SubscribeType + +描述订阅类型。 + + + + + + + + + + + + + + + + + + + + +

名称

+

默认值

+

说明

+

SUBSCRIBE_TYPE_LOCAL

+

0

+

表示订阅本地数据变更。

+

SUBSCRIBE_TYPE_REMOTE

+

1

+

表示订阅远端数据变更。

+

SUBSCRIBE_TYPE_ALL

+

2

+

表示订阅远端和本地数据变更。

+
+ +## ChangeNotification + +数据变更时通知的对象,包括数据插入的数据、更新的数据、删除的数据和设备ID。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

可读

+

可写

+

说明

+

insertEntries

+

Entry[]

+

+

+

数据添加记录。

+

updateEntries

+

Entry[]

+

+

+

数据更新记录。

+

deleteEntries

+

Entry[]

+

+

+

数据删除记录。

+

deviceId

+

string

+

+

+

设备ID,此处为设备UUID。

+
+ +## Entry + +存储在数据库中的键值对。 + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

可读

+

可写

+

说明

+

key

+

string

+

+

+

键值。

+

value

+

Value

+

+

+

值对象。

+
+ +## Value + +存储在数据库中的对象。 + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

可读

+

可写

+

说明

+

type

+

ValueType

+

+

+

值类型。

+

value

+

Uint8Array | string | number | boolean

+

+

+

值,Uint8Array、string 的长度不大于MAX_VALUE_LENGTH

+
+ +## ValueType + +用于表示数据类型。 + +只能被内部应用使用。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

默认值

+

说明

+

STRING

+

0

+

表示值类型为字符串。

+

INTEGER

+

1

+

表示值类型为整数。

+

FLOAT

+

2

+

表示值类型为浮点数。

+

BYTE_ARRAY

+

3

+

表示值类型为字节数组。

+

BOOLEAN

+

4

+

表示值类型为布尔值。

+

DOUBLE

+

5

+

表示值类型为双浮点数。

+
+ +## SingleKVStore + +单版本分布式数据库,继承自KVStore,提供查询数据和同步数据的方法。在调用SingleKVStore的方法前,需要先通过getKVStore构建一个KVStore实例。 + +### get + +get\(key: string, callback: AsyncCallback\): void + +获取指定键的值,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

key

+

string

+

+

要查询数据的key,不能为空且长度不大于MAX_KEY_LENGTH

+

callback

+

AsyncCallback<Uint8Array | string | boolean | number>

+

+

回调函数,获取查询的值。

+
+ +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) { + if (err != undefined) { + console.log("put err: " + JSON.stringify(err)); + return; + } + console.log("put success"); + kvStore.get(KEY_TEST_STRING_ELEMENT, function (err,data) { + console.log("get success data: " + data); + }); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + + +### get + +get\(key: string\): Promise + +获取指定键的值,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

key

+

string

+

+

要查询数据的key,不能为空且长度不大于MAX_KEY_LENGTH

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<Uint8Array | string | boolean | number>

+

Promise实例,用于获取异步返回结果。

+
+ + +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-test-string'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((data) => { + console.log("put success: " + JSON.stringify(data)); + kvStore.get(KEY_TEST_STRING_ELEMENT).then((data) => { + console.log("get success data: " + data); + }).catch((err) => { + console.log("get err: " + JSON.stringify(err)); + }); + }).catch((err) => { + console.log("put err: " + JSON.stringify(err)); + }); + }catch (e) { + console.log("An unexpected error occurred. Error:" + e); + } + ``` + +### getEntries ### + +getEntries\(keyPrefix: string, callback: AsyncCallback\): void; + +获取匹配指定键前缀的所有键值对,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

keyPrefix

+

string

+

+

表示要匹配的键前缀。

+

callback

+

AsyncCallback<Entry[]>

+

+

回调函数,获取指定前缀的键值对列表。

+
+ +- 示例 + + ``` + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_number_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.INTEGER, + value : 222 + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + kvStore.getEntries('batch_test_number_key', function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + }); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries ### + +getEntries\(keyPrefix: string\): Promise; + +获取匹配指定键前缀的所有键值对,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

keyPrefix

+

string

+

+

表示要匹配的键前缀。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<Entry[]>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + kvStore.getEntries('batch_test_string_key').then((entrys) => { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + console.log('entrys[0].value: ' + JSON.stringify(entrys[0].value)); + console.log('entrys[0].value.value: ' + entrys[0].value.value); + }).catch((err) => { + console.log('getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('PutBatch001 e ' + e); + } + ``` + + +### getEntries ### + +getEntries\(query: Query, callback: AsyncCallback\): void; + +获取与指定 Query 对象匹配的键值对列表,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+

callback

+

AsyncCallback<Entry[]>

+

+

回调函数,获取指定前缀的键值对列表。

+
+ +- 示例 + + ``` + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + kvStore.getEntries('batch_test_bool_key', function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + }); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries ### + +getEntries\(query: Query\): Promise; + +获取匹配指定键前缀的所有键值对,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<Entry[]>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('GetEntries entries: ' + entries); + kvStore.putBatch(entries).then(async (err) => { + console.log('GetEntries putBatch success'); + const query = new factory.Query(); + query.prefixKey("batch_test"); + kvStore.getEntries(query).then((entrys) => { + console.log('GetEntries getEntries success'); + }).catch((err) => { + console.log('GetEntries getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('GetEntries putBatch fail ' + JSON.stringify(err)); + }); + console.log('GetEntries success'); + }catch(e) { + console.log('GetEntries e ' + e); + } + ``` + + +### getResultSet ### + +getResultSet\(keyPrefix: string, callback: AsyncCallback\): void; + +从 KvStore 数据库中获取具有指定前缀的结果集,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

keyPrefix

+

string

+

+

表示要匹配的键前缀。

+

callback

+

AsyncCallback<KvStoreResultSet>

+

+

回调函数,获取具有指定前缀的结果集。

+
+ +- 示例 + + ``` + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err, data) { + console.log('GetResultSet putBatch success'); + kvStore.getResultSet('batch_test_string_key', async function (err, result) { + console.log('GetResultSet getResultSet success'); + resultSet = result; + kvStore.closeResultSet(resultSet, function (err, data) { + console.log('GetResultSet closeResultSet success'); + }) + }); + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet ### + +getResultSet\(keyPrefix: string\): Promise; + +从 KvStore 数据库中获取具有指定前缀的结果集,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

keyPrefix

+

string

+

+

表示要匹配的键前缀。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<KvStoreResultSet>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('GetResult putBatch success'); + }).catch((err) => { + console.log('PutBatch putBatch fail ' + JSON.stringify(err)); + }); + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('GetResult getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('GetResult getResultSet fail ' + JSON.stringify(err)); + }); + kvStore.closeResultSet(resultSet).then((err) => { + console.log('GetResult closeResultSet success'); + }).catch((err) => { + console.log('GetResult closeResultSet fail ' + JSON.stringify(err)); + }); + + }catch(e) { + console.log('GetResult e ' + e); + } + ``` + + +### getResultSet ### + +getResultSet\(query: Query, callback: AsyncCallback\): void; + +获取与指定 Query 对象匹配的 KvStoreResultSet 对象,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+

callback

+

AsyncCallback<KvStoreResultSet>

+

+

回调函数,获取与指定 Query 对象匹配的 KvStoreResultSet 对象。

+
+ +- 示例 + + ``` + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries, async function (err, data) { + console.log('putBatch success'); + kvStore.getResultSet('batch_test_string_key', async function (err, result) { + console.log('getResultSet success'); + resultSet = result; + kvStore.closeResultSet(resultSet, function (err, data) { + }) + }); + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet ### + +getResultSet\(query: Query\): Promise; + +获取与指定 Query 对象匹配的 KvStoreResultSet 对象,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<KvStoreResultSet>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + }).catch((err) => { + console.log('putBatch fail ' + err); + }); + kvStore.getResultSet('batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + err); + }); + kvStore.closeResultSet(resultSet).then((err) => { + console.log('closeResultSet success'); + }).catch((err) => { + console.log('closeResultSet fail ' + err); + }); + }catch(e) { + console.log('ResultSet e ' + e); + } + ``` + +### closeResultSet ### + +closeResultSet\(resultSet: KvStoreResultSet, callback: AsyncCallback\): void; + +关闭由 getResultSet 返回的 KvStoreResultSet 对象,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

resultSet

+

KvStoreResultSet

+

+

表示要关闭的 KvStoreResultSet 对象。

+

callback

+

AsyncCallback<void>

+

+

回调函数,获取由 getResultSet 返回的 KvStoreResultSet 对象。

+
+ +- 示例 + + ``` + try { + console.log('CloseResultSet success'); + let resultSet = null; + kvStore.closeResultSet(resultSet, function (err, data) { + if (err == undefined) { + console.log('closeResultSet success'); + } else { + console.log('closeResultSet fail'); + } + }); + }catch(e) { + console.log('CloseResultSet e ' + e); + } + ``` + + +### closeResultSet ### + +closeResultSet\(resultSet: KvStoreResultSet\): Promise; + +关闭由 getResultSet 返回的 KvStoreResultSet 对象,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

resultSet

+

KvStoreResultSet

+

+

表示要关闭的 KvStoreResultSet 对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + console.log('CloseResultSet success'); + let resultSet = null; + kvStore.closeResultSet(resultSet).then(() => { + console.log('closeResultSet success'); + }).catch((err) => { + console.log('closeResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('CloseResultSet e ' + e); + } + ``` + + +### getResultSize ### + +getResultSize\(query: Query, callback: AsyncCallback\): void; + +获取与指定 Query 对象匹配的结果数,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+

callback

+

AsyncCallback<number>

+

+

回调函数,获取与指定 Query 对象匹配的结果数。

+
+ +- 示例 + + ``` + try { + // pass query + console.log('GetResultSize success'); + }catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### getResultSize ### + +getResultSize\(query: Query\): Promise; + +获取与指定 Query 对象匹配的结果数,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<number>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + // pass query + console.log('GetResultSize success'); + }catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### removeDeviceData ### + +removeDeviceData\(deviceId: string, callback: AsyncCallback\): void; + +删除指定设备的数据,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

表示要删除设备的名称。

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +- 示例 + + ``` + const KEY_TEST_FLOAT_ELEMENT = 'key_test_float_2'; + const KEY_TEST_STRING_ELEMENT = 'key_test_string_2'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, async function (err,data) { + console.log('put success'); + const deviceid = 'no_exist_device_id'; + kvStore.removeDeviceData(deviceid, async function (err,data) { + if (err == undefined) { + console.log('removeDeviceData success'); + done(); + } else { + console.log('removeDeviceData fail'); + kvStore.get(KEY_TEST_STRING_ELEMENT, async function (err,data) { + console.log('RemoveDeviceData get success'); + }); + } + }); + }); + }catch(e) { + console.log('RemoveDeviceData e ' + e); + } + ``` + + +### removeDeviceData ### + +removeDeviceData\(deviceId: string\): Promise; + +删除指定设备的数据,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

表示要删除设备的名称。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string_2'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-001'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((err) => { + console.log('removeDeviceData put success'); + }).catch((err) => { + console.log('put fail ' + JSON.stringify(err)); + }); + const deviceid = 'no_exist_device_id'; + kvStore.removeDeviceData(deviceid).then((err) => { + console.log('removeDeviceData success'); + }).catch((err) => { + console.log('removeDeviceData fail ' + JSON.stringify(err)); + }); + kvStore.get(KEY_TEST_STRING_ELEMENT).then((data) => { + console.log('get success data:' + data); + }).catch((err) => { + console.log('RemoveDeviceData get fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('RemoveDeviceData e ' + e); + } + ``` + + +### on ### + +on\(event: 'syncComplete', syncCallback: Callback>\): void; + +注册同步 SingleKvStore 数据库回调,并通过异步方式返回。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

event

+

'syncComplete'

+

+

设备状态改变时触发的事件名。

+

syncCallback

+

Callback<Array<[string, number]>>>

+

+

用于向调用方发送同步结果的回调。

+
+ +- 示例 + + ``` + const KEY_TEST_FLOAT_ELEMENT = 'key_test_float'; + const VALUE_TEST_FLOAT_ELEMENT = 321.12; + try { + kvStore.on('dataChange', 0, function (data) { + console.log('OnChange 0' + data) + }); + kvStore.put(KEY_TEST_FLOAT_ELEMENT, VALUE_TEST_FLOAT_ELEMENT).then((data) => { + console.log('OnChange put success'); + }).catch((error) => { + console.log('OnChange put fail ' + error); + }); + }catch(e) { + console.log('OnChange put e ' + e); + } + ``` + + +### off ### + +off\(event: 'syncComplete', syncCallback: Callback>\): void; + +取消注册同步 SingleKvStore 数据库回调,并通过异步方式返回。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

event

+

'syncComplete'

+

+

设备状态改变时触发的事件名。

+

syncCallback

+

Callback<Array<[string, number]>>>

+

+

用于向调用方发送同步结果的回调。

+
+ +- 示例 + + ``` + try { + const func = function (data) { + console.log('OffChange 0' + data) + }; + kvStore.on('dataChange', 0, func); + kvStore.off('dataChange', func); + }catch(e) { + console.log('OffChange e ' + e); + } + ``` + + +### sync + +sync\(deviceIdList: string\[\], mode: SyncMode, allowedDelayMs?: number\): void + +在手动同步模式下,触发数据库同步,此方法为同步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceIdList

+

string[]

+

+

同一组网环境下,需要同步的设备的deviceId列表。

+

mode

+

SyncMode

+

+

同步类型。

+

allowedDelayMs

+

number

+

+

可选参数,允许延时时间,单位:ms(毫秒)。

+
+ +- 示例: + + ``` + kvStore.sync(deviceIds, 1, 1000); + ``` + +### setSyncParam ### + +setSyncParam\(defaultAllowedDelayMs: number, callback: AsyncCallback\): void; + +设置允许数据库同步的默认延迟,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

defaultAllowedDelayMs

+

number

+

+

表示数据库同步允许的默认延迟,以毫秒为单位。

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +- 示例 + + ``` + try { + const defaultAllowedDelayMs = 500; + kvStore.setSyncParam(defaultAllowedDelayMs, function (err,data) { + console.log('SetSyncParam put success'); + }); + }catch(e) { + console.log('testSingleKvStoreSetSyncParam101 e ' + e); + } + ``` + + +### setSyncParam ### + +setSyncParam\(defaultAllowedDelayMs: number\): Promise; + +设置允许数据库同步的默认延迟,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

defaultAllowedDelayMs

+

number

+

+

表示数据库同步允许的默认延迟,以毫秒为单位。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + const defaultAllowedDelayMs = 500; + kvStore.setSyncParam(defaultAllowedDelayMs).then((err) => { + console.log('SetSyncParam put success'); + }).catch((err) => { + console.log('SetSyncParam put fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('SetSyncParam e ' + e); + } + ``` + + +### getSecurityLevel ### + +getSecurityLevel\(callback: AsyncCallback\): void; + +获取数据库的安全级别,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

callback

+

AsyncCallback<SecurityLevel>

+

+

回调函数。

+
+ +- 示例 + + ``` + try { + kvStore.getSecurityLevel(function (err,data) { + console.log('getSecurityLevel success'); + }); + }catch(e) { + console.log('GetSecurityLeve e ' + e); + } + ``` + + +### getSecurityLevel ### + +getSecurityLevel(\): Promise; + +获取数据库的安全级别,并通过Promise方式返回,此方法为异步方法。 + +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<SecurityLevel>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + kvStore.getSecurityLevel().then((data) => { + console.log(' getSecurityLevel success'); + }).catch((err) => { + console.log('getSecurityLevel fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetSecurityLeve e ' + e); + } + ``` + + +## DeviceKVStore ## + +在分布式系统中通过设备管理分布式数据,继承自KvStore,提供查询数据和同步数据的方法。在调用DeviceKVStore的方法前,需要先通过getKVStore构建一个KVStore实例。 + +### get ### + +get\(deviceId: string, key: string, callback: AsyncCallback\): void; + +获取与指定设备 ID 和密钥匹配的 String 值,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

标识要查询其数据的设备。

+

key

+

string

+

+

表示要查询的String值的键。

+

callback

+

AsyncCallback<boolean|string|number|Uint8Array>

+

+

回调函数,返回匹配给定条件的字符串值。

+
+ +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string_2'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-002'; + try{ + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, async function (err,data) { + console.log('put success'); + kvStore.get(localDeviceId, KEY_TEST_STRING_ELEMENT, function (err,data) { + console.log('get success'); + }); + }) + }catch(e) { + console.log('get e' + e); + } + ``` + + +### get ### + +get\(deviceId: string, key: string\): Promise; + +获取与指定设备 ID 和密钥匹配的 String 值,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

标识要查询其数据的设备。

+

key

+

string

+

+

表示要查询的String值的键。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<boolean|string|number|Uint8Array>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string_2'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-002'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then(async (data) => { + console.log(' put success'); + kvStore.get(localDeviceId, KEY_TEST_STRING_ELEMENT).then((data) => { + console.log('get success'); + }).catch((err) => { + console.log('get fail ' + JSON.stringify(err)); + }); + }).catch((error) => { + console.log('put error' + error); + }); + } catch (e) { + console.log('Get e ' + e); + } + ``` + + +### getEntries ### + +getEntries\(deviceId: string, keyPrefix: string, callback: AsyncCallback\): void; + +获取与指定设备 ID 和密钥前缀匹配的所有键值对,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

标识要查询其数据的设备。

+

keyPrefix

+

string

+

+

表示要匹配的键前缀。

+

callback

+

AsyncCallback<Entry[]>

+

+

回调函数,返回满足给定条件的所有键值对的列表。

+
+ +- 示例 + + ``` + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + kvStore.getEntries(localDeviceId, 'batch_test_string_key', function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + }); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries ### + +getEntries\(deviceId: string, keyPrefix: string\): Promise; + +获取与指定设备 ID 和密钥前缀匹配的所有键值对,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

标识要查询其数据的设备。

+

keyPrefix

+

string

+

+

表示要匹配的键前缀。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<Entry[]>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + kvStore.getEntries(localDeviceId, 'batch_test_string_key').then((entrys) => { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + console.log('entrys[0]: ' + JSON.stringify(entrys[0])); + console.log('entrys[0].value: ' + JSON.stringify(entrys[0].value)); + console.log('entrys[0].value.value: ' + entrys[0].value.value); + }).catch((err) => { + console.log('getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries ### + +getEntries\(query: Query, callback: AsyncCallback\): void; + +获取与指定 Query 对象匹配的键值对列表,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+

callback

+

AsyncCallback<Entry[]>

+

+

回调函数,返回与指定 Query 对象匹配的键值对列表。

+
+ +- 示例 + + ``` + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + kvStore.getEntries(localDeviceId, 'batch_test_bool_key', function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + }); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries ### + +getEntries\(query: Query\): Promise; + +获取与指定 Query 对象匹配的键值对列表,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<Entry[]>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + kvStore.getEntries(localDeviceId, 'batch_test_bool_key').then((entrys) => { + console.log('getEntries success'); + }).catch((err) => { + console.log('getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries ### + +getEntries\(deviceId: string, query: Query, callback: AsyncCallback\): void; + +获取与指定设备 ID 和 Query 对象匹配的键值对列表,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

键值对所属的设备ID。

+

query

+

Query

+

+

表示查询对象。

+

callback

+

AsyncCallback<Entry[]>

+

+

回调函数,返回与指定 Query 对象匹配的键值对列表。

+
+ +- 示例 + + ``` + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries, async function (err,data) { + console.log('putBatch success'); + kvStore.getEntries(localDeviceId, 'batch_test_bool_key', function (err,entrys) { + console.log('getEntries success'); + console.log('entrys.length: ' + entrys.length); + }); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getEntries ### + +getEntries\(deviceId: string, query: Query\): Promise; + +获取与指定设备 ID 和 Query 对象匹配的键值对列表,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

键值对所属的设备ID。

+

query

+

Query

+

+

表示查询对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<Entry[]>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + var arr = new Uint8Array([21,31]); + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_bool_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.BYTE_ARRAY, + value : arr + } + } + entries.push(entry); + } + console.log('entries: ' + entries); + kvStore.putBatch(entries).then(async (err) => { + console.log('putBatch success'); + kvStore.getEntries(localDeviceId, 'batch_test_bool_key').then((entrys) => { + console.log('getEntries success'); + }).catch((err) => { + console.log('getEntries fail ' + JSON.stringify(err)); + }); + }).catch((err) => { + console.log('putBatch fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('PutBatch e ' + e); + } + ``` + + +### getResultSet ### + +getResultSet\(deviceId: string, keyPrefix: string, callback: AsyncCallback\): void; + +获取与指定设备 ID 和密钥前缀匹配的 KvStoreResultSet 对象,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

标识要查询其数据的设备。

+

keyPrefix

+

string

+

+

表示要匹配的键前缀。

+

callback

+

AsyncCallback<KvStoreResultSet>

+

+

回调函数,返回 KvStoreResultSet 对象。

+
+ +- 示例 + + ``` + try { + let resultSet; + kvStore.getResultSet(localDeviceId, 'batch_test_string_key', async function (err, result) { + console.log('getResultSet success'); + resultSet = result; + kvStore.closeResultSet(resultSet, function (err, data) { + console.log('closeResultSet success'); + }) + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet ### + +getResultSet\(deviceId: string, keyPrefix: string\): Promise; + +获取与指定设备 ID 和密钥前缀匹配的 KvStoreResultSet 对象,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

标识要查询其数据的设备。

+

keyPrefix

+

string

+

+

表示要匹配的键前缀。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<KvStoreResultSet>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + let resultSet; + kvStore.getResultSet(localDeviceId, 'batch_test_string_key').then((result) => { + console.log('getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('getResultSet fail ' + JSON.stringify(err)); + }); + kvStore.closeResultSet(resultSet).then((err) => { + console.log('closeResultSet success'); + }).catch((err) => { + console.log('closeResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet ### + +getResultSet\(query: Query, callback: AsyncCallback\): void; + +获取与指定 Query 对象匹配的 KvStoreResultSet 对象,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+

callback

+

AsyncCallback<KvStoreResultSet>

+

+

回调函数,返回与指定 Query 对象匹配的 KvStoreResultSet 对象。

+
+ +- 示例 + + ``` + try { + let resultSet; + kvStore.getResultSet(function (err, result) { + console.log('getResultSet success'); + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet ### + +getResultSet\(query: Query\): Promise; + +获取与指定 Query 对象匹配的 KvStoreResultSet 对象,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<KvStoreResultSet>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('GetResultSet putBatch success'); + }).catch((err) => { + console.log('PutBatch putBatch fail ' + JSON.stringify(err)); + }); + const query = new factory.Query(); + query.deviceId(localDeviceId); + query.prefixKey("batch_test"); + console.log("GetResultSet " + query.getSqlLike()); + kvStore.getResultSet(query).then((result) => { + console.log('GetResultSet getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('GetResultSet getResultSet fail ' + JSON.stringify(err)); + }); + kvStore.closeResultSet(resultSet).then((err) => { + console.log('GetResultSet closeResultSet success'); + }).catch((err) => { + console.log('GetResultSet closeResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet ### + +getResultSet\(deviceId: string, query: Query, callback: AsyncCallback\): void; + +获取与指定设备ID和Query对象匹配的KvStoreResultSet对象,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

KvStoreResultSet对象所属的设备ID。

+

query

+

Query

+

+

表示查询对象。

+

callback

+

AsyncCallback<KvStoreResultSet>

+

+

回调函数,返回与指定 Query 对象匹配的 KvStoreResultSet 对象。

+
+ +- 示例 + + ``` + try { + let resultSet; + kvStore.getResultSet('test_key_string', 123, function (err, result) { + console.log('getResultSet success'); + }); + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### getResultSet ### + +getResultSet\(deviceId: string, query: Query\): Promise; + +获取与指定设备ID和Query对象匹配的KvStoreResultSet对象,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

KvStoreResultSet对象所属的设备ID。

+

query

+

Query

+

+

表示查询对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<KvStoreResultSet>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + let resultSet; + let entries = []; + for (var i = 0; i < 10; i++) { + var key = 'batch_test_string_key'; + var entry = { + key : key + i, + value : { + type : factory.ValueType.STRING, + value : 'batch_test_string_value' + } + } + entries.push(entry); + } + kvStore.putBatch(entries).then(async (err) => { + console.log('GetResultSet putBatch success'); + }).catch((err) => { + console.log('PutBatch putBatch fail ' + JSON.stringify(err)); + }); + const query = new factory.Query(); + prefixKey("batch_test"); + kvStore.getResultSet(localDeviceId, query).then((result) => { + console.log('GetResultSet getResultSet success'); + resultSet = result; + }).catch((err) => { + console.log('GetResultSet getResultSet fail ' + JSON.stringify(err)); + }); + query.deviceId(localDeviceId); + console.log("GetResultSet " + query.getSqlLike()); + kvStore.closeResultSet(resultSet).then((err) => { + console.log('GetResultSet closeResultSet success'); + }).catch((err) => { + console.log('GetResultSet closeResultSet fail ' + JSON.stringify(err)); + }); + + }catch(e) { + console.log('GetResultSet e ' + e); + } + ``` + + +### closeResultSet ### + +closeResultSet\(resultSet: KvStoreResultSet, callback: AsyncCallback\): void; + +关闭由 getResultSet 返回的 KvStoreResultSet 对象,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

resultSet

+

KvStoreResultSet

+

+

指示要关闭的 KvStoreResultSet 对象。

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +- 示例 + + ``` + try { + console.log('CloseResultSet success'); + let resultSet = null; + kvStore.closeResultSet(resultSet, function (err, data) { + if (err == undefined) { + console.log('closeResultSet success'); + } else { + console.log('closeResultSet fail'); + } + }); + }catch(e) { + console.log('CloseResultSet e ' + e); + } + ``` + + +### closeResultSet ### + +closeResultSet\(resultSet: KvStoreResultSet\): Promise; + +关闭由 getResultSet 返回的 KvStoreResultSet 对象,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

resultSet

+

KvStoreResultSet

+

+

指示要关闭的 KvStoreResultSet 对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + console.log('CloseResultSet success'); + let resultSet = null; + kvStore.closeResultSet(resultSet).then(() => { + console.log('closeResultSet success'); + }).catch((err) => { + console.log('closeResultSet fail ' + JSON.stringify(err)); + }); + }catch(e) { + console.log('CloseResultSet e ' + e); + } + ``` + + +### getResultSize ### + +getResultSize\(query: Query, callback: AsyncCallback\): void; + +获取与指定 Query 对象匹配的结果数,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+

callback

+

AsyncCallback<number>

+

+

回调函数,返回与指定 Query 对象匹配的结果数。

+
+ +- 示例 + + ``` + try { + // pass query + console.log('GetResultSize success'); + }catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### getResultSize ### + +getResultSize\(query: Query\): Promise; + +获取与指定 Query 对象匹配的结果数,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

query

+

Query

+

+

表示查询对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<number>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + // pass query + console.log('GetResultSize success'); + }catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### getResultSize ### + +getResultSize\(deviceId: string, query: Query, callback: AsyncCallback\): void; + +获取与指定设备 ID 和 Query 对象匹配的结果数,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

表示结果所属的设备ID。

+

query

+

Query

+

+

表示查询对象。

+

callback

+

AsyncCallback<number>

+

+

回调函数,返回与指定 Query 对象匹配的结果数。

+
+ +- 示例 + + ``` + try { + // pass query + console.log('GetResultSize success'); + }catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### getResultSize ### + +getResultSize\(deviceId: string, query: Query\): Promise; + +获取与指定设备 ID 和 Query 对象匹配的结果数,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

表示结果所属的设备ID。

+

query

+

Query

+

+

表示查询对象。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<number>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + try { + // pass query + console.log('GetResultSize success'); + }catch(e) { + console.log('GetResultSize e ' + e); + } + ``` + + +### removeDeviceData ### + +removeDeviceData\(deviceId: string, callback: AsyncCallback\): void; + +从当前数据库中删除指定设备的数据,并通过callback方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

标识要删除其数据的设备。

+

callback

+

AsyncCallback<void>

+

+

回调函数。

+
+ +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-001'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, async function (err,data) { + console.log('RemoveDeviceData put success'); + const deviceid = 'no_exist_device_id'; + kvStore.removeDeviceData(deviceid, async function (err,data) { + if (err == undefined) { + console.log('removeDeviceData success'); + } else { + console.log('testDeviceKvStoreRemoveDeviceData101 removeDeviceData fail'); + kvStore.get(localDeviceId, KEY_TEST_STRING_ELEMENT, async function (err,data) { + console.log('RemoveDeviceData get success'); + }); + } + }); + }); + }catch(e) { + console.log('testDeviceKvStoreRemoveDeviceData101 e ' + e); + } + ``` + + +### removeDeviceData ### + +removeDeviceData\(deviceId: string\): Promise; + +从当前数据库中删除指定设备的数据,并通过Promise方式返回,此方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceId

+

string

+

+

标识要删除其数据的设备。

+
+ +- 返回值: + + + + + + + + + + +

类型

+

说明

+

Promise<void>

+

Promise实例,用于获取异步返回结果。

+
+ +- 示例 + + ``` + const KEY_TEST_STRING_ELEMENT = 'key_test_string'; + const VALUE_TEST_STRING_ELEMENT = 'value-string-001'; + try { + kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT).then((err) => { + console.log('RemoveDeviceData put success'); + }).catch((err) => { + console.log('RemoveDeviceData put fail ' + JSON.stringify(err)); + }); + + const deviceid = 'no_exist_device_id'; + kvStore.removeDeviceData(deviceid).then((err) => { + console.log('RemoveDeviceData removeDeviceData success'); + }).catch((err) => { + console.log('RemoveDeviceData removeDeviceData fail ' + JSON.stringify(err)); + }); + + kvStore.get(localDeviceId, KEY_TEST_STRING_ELEMENT).then((data) => { + console.log('RemoveDeviceData get success data:' + data); + }).catch((err) => { + console.log('RemoveDeviceData get fail ' + JSON.stringify(err)); + }); + + }catch(e) { + console.log('RemoveDeviceData e ' + e); + } + ``` + + +### sync ### + +sync\(deviceIdList: string[], mode: SyncMode, allowedDelayMs?: number\): void; + +同步 DeviceKvStore 数据库,该方法为异步方法。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

deviceIdList

+

string[]

+

+

需要同步DeviceKvStore数据库的设备ID列表。

+

mode

+

SyncMode

+

+

表示同步方式,PUSH、PULL或PUSH_PULL。

+

allowedDelayMs

+

+ number

+

+

可选参数,允许延时时间,单位:ms(毫秒)。

+
+ +- 示例 + + ``` + const KEY_TEST_SYNC_ELEMENT = 'key_test_sync'; + const VALUE_TEST_SYNC_ELEMENT = 'value-string-001'; + try { + kvStore.on('syncComplete', function (data) { + console.log('Sync dataChange'); + }); + kvStore.put(KEY_TEST_SYNC_ELEMENT + 'testSync101', VALUE_TEST_SYNC_ELEMENT, function (err,data) { + console.log('Sync put success'); + const devices = ['A12C1F9261528B21F95778D2FDC0B2E33943E6251AC5487F4473D005758905DB']; + const mode = factory.SyncMode.PULL_ONLY; + kvStore.sync(devices, mode); + }); + }catch(e) { + console.log('Sync e' + e); + } + ``` + +### on ### + +on\(event: 'syncComplete', syncCallback: Callback\>): void; + +注册同步 DeviceKvStore 数据库回调,通过异步回调返回。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

event

+

'syncComplete'

+

+

设备状态改变时触发的事件名。

+

syncCallback

+

Callback<Array<[string, number]>>>

+

+

用于向调用方发送同步结果的回调。

+
+ +- 示例 + + ``` + const KEY_TEST_FLOAT_ELEMENT = 'key_test_float'; + const VALUE_TEST_FLOAT_ELEMENT = 321.12; + try { + kvStore.on('dataChange', 0, function (data) { + console.log('OnChange 0' + data) + }); + kvStore.put(KEY_TEST_FLOAT_ELEMENT, VALUE_TEST_FLOAT_ELEMENT).then((data) => { + console.log('OnChange put success'); + }).catch((error) => { + console.log('OnChange put fail ' + error); + }); + }catch(e) { + console.log('OnChange put e ' + e); + } + ``` + + +### off ### + +off\(event: 'syncComplete', syncCallback: Callback>\): void; + +取消注册同步 DeviceKvStore 数据库回调,通过异步回调返回。 + +- 参数: + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

event

+

'syncComplete'

+

+

设备状态改变时触发的事件名。

+

syncCallback

+

Callback<Array<[string, number]>>>

+

+

用于向调用方发送同步结果的回调。

+
+ +- 示例 + + ``` + try { + const func = function (data) { + console.log('OffChange 0' + data) + }; + kvStore.on('dataChange', 0, func); + kvStore.off('dataChange', func); + }catch(e) { + console.log('OffChange001 e ' + e); + } + ``` + + +## SyncMode + +用于指定同步模式。 + + + + + + + + + + + + + + + + + + + + +

名称

+

默认值

+

说明

+

PULL_ONLY

+

0

+

表示只能从远端拉取数据到本端。

+

PUSH_ONLY

+

1

+

表示只能从本端推送数据到对端。

+

PUSH_PULL

+

2

+

表示从本端推送数据到远端,然后从远端拉取数据到本端。

+
diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/04.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/04.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 0000000000000000000000000000000000000000..470ad910215dfa6145e145066f35099704fe8274 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/04.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,1171 @@ +--- +title: 关系型数据库 +permalink: /pages/000b000303 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 关系型数据库 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import dataRdb from '@ohos.data.rdb' +``` + + +## 权限 + +无 + + +## dataRdb.getRdbStore + +getRdbStore(config: StoreConfig, version: number, callback: AsyncCallback<RdbStore>): void + +获得一个相关的RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作,结果以callback形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | config | [StoreConfig](#storeconfig) | 是 | 与此RDB存储相关的数据库配置。 | + | version | number | 是 | 数据库版本。 | + | callback | AsyncCallback<[RdbStore](#rdbstore)> | 是 | 指定callback回调函数。返回一个RdbStore。 | + +- 示例: + ``` + import dataRdb from '@ohos.data.rdb' + const STORE_CONFIG = { name: "RdbTest.db" } + const SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS EMPLOYEE (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER, SALARY REAL, CODES BLOB)" + dataRdb.getRdbStore(STORE_CONFIG, 1, function (err, rdbStore) { + rdbStore.executeSql(SQL_CREATE_TABLE) + console.info(TAG + 'create table done.') + }) + ``` + + +## dataRdb.getRdbStore + +getRdbStore(config: StoreConfig, version: number): Promise<RdbStore> + +获得一个相关的RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作,结果以Promise形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | config | [StoreConfig](#storeconfig) | 是 | 与此RDB存储相关的数据库配置。 | + | version | number | 是 | 数据库版本。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<[RdbStore](#rdbstore)> | 指定Promise回调函数。返回一个RdbStore。 | + +- 示例: + ``` + import dataRdb from '@ohos.data.rdb' + const STORE_CONFIG = { name: "RdbTest.db" } + const SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS EMPLOYEE (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER, SALARY REAL, CODES BLOB)" + let promise = dataRdb.getRdbStore(STORE_CONFIG, 1); + promise.then(async (rdbStore) => { + await rdbStore.executeSql(SQL_CREATE_TABLE, null) + }).catch((err) => { + expect(null).assertFail(); + }) + ``` + + +## dataRdb.deleteRdbStore + +deleteRdbStore(name: string, callback: AsyncCallback<void>): void + +删除数据库,结果以callback形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 数据库名称。 | + | callback | AsyncCallback<void> | 是 | 指定callback回调函数。如果数据库已删除,则为true;否则返回false。 | + +- 示例: + ``` + import dataRdb from '@ohos.data.rdb' + dataRdb.deleteRdbStore("RdbTest.db", function (err, rdbStore) { + console.info(TAG + 'delete store done.')}) + ``` + + +## dataRdb.deleteRdbStore + +deleteRdbStore(name: string): Promise<void> + +使用指定的数据库文件配置删除数据库,结果以Promise形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 数据库名称。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | 指定Promise回调函数。如果数据库已删除,则为true;否则返回false。 | + +- 示例: + ``` + import dataRdb from '@ohos.data.rdb' + let promise = dataRdb.deleteRdbStore("RdbTest.db") + promise.then(()=>{ + console.info(TAG + 'delete store done.') + }) + ``` + + +## RdbPredicates + +表示关系型数据库(RDB)的谓词。该类确定RDB中条件表达式的值是true还是false。 + + +### constructor + +constructor(name: string) + + +构造函数。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 数据库表名。 | + +- 示例: + ``` + import dataRdb from '@ohos.data.rdb' + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + ``` + + +### equalTo + +equalTo(field: string, value: ValueType): RdbPredicates + + +配置谓词以匹配数据字段为ValueType且值等于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "lisi") + ``` + + +### notEqualTo + +notEqualTo(field: string, value: ValueType): RdbPredicates + + +配置谓词以匹配数据字段为ValueType且值不等于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.notEqualTo("NAME", "lisi") + ``` + + +### beginWrap + +beginWrap(): RdbPredicates + + +向谓词添加左括号。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回带有左括号的Rdb谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "lisi") + .beginWrap() + .equalTo("AGE", 18) + .or() + .equalTo("SALARY", 200.5) + .endWrap() + ``` + + +### endWrap + +endWrap(): RdbPredicates + + +向谓词添加右括号。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回带有右括号的Rdb谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "lisi") + .beginWrap() + .equalTo("AGE", 18) + .or() + .equalTo("SALARY", 200.5) + .endWrap() + ``` + + +### or + +or(): RdbPredicates + + +将或条件添加到谓词中。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回带有或条件的Rdb谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Lisa") + .or() + .equalTo("NAME", "Rose") + ``` + + +### and + +and(): RdbPredicates + + +向谓词添加和条件。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回带有和条件的Rdb谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Lisa") + .and() + .equalTo("SALARY", 200.5) + ``` + + +### contains + +contains(field: string, value: string): RdbPredicat + + +配置谓词以匹配数据字段为String且value包含指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | string | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.contains("NAME", "os") + ``` + + +### beginsWith + +beginsWith(field: string, value: string): RdbPredicates + + +配置谓词以匹配数据字段为String且值以指定字符串开头的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | string | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.beginsWith("NAME", "os") + ``` + + +### endsWith + +endsWith(field: string, value: string): RdbPredicates + + +配置谓词以匹配数据字段为String且值以指定字符串结尾的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | string | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.endsWith("NAME", "se") + ``` + + +### isNull + +isNull(field: string): RdbPredicates + + +配置谓词以匹配值为null的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例 + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.isNull("NAME") + ``` + + +### isNotNull + +isNotNull(field: string): RdbPredicates + + +配置谓词以匹配值不为null的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.isNotNull("NAME") + ``` + + +### like + +like(field: string, value: string): RdbPredicates + + +配置谓词以匹配数据字段为String且值类似于指定字符串的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | string | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.like("NAME", "%os%") + ``` + + +### glob + +glob(field: string, value: string): RdbPredicates + + +配置RdbPredicates匹配数据字段为String的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | string | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回指定的Rdb谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.glob("NAME", "?h*g") + ``` + + +### between + +between(field: string, low: ValueType, high: ValueType): RdbPredicates + + +将谓词配置为匹配数据字段为ValueType且value在给定范围内的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | low | [ValueType](#valuetype) | 是 | 指示与谓词匹配的最小值。 | + | high | [ValueType](#valuetype) | 是 | 指示要与谓词匹配的最大值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.between("AGE", 10, 50) + ``` + + +### notBetween + +notBetween(field: string, low: ValueType, high: ValueType): RdbPredicates + + +配置RdbPredicates以匹配数据字段为ValueType且value超出给定范围的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | low | [ValueType](#valuetype) | 是 | 指示与谓词匹配的最小值。 | + | high | [ValueType](#valuetype) | 是 | 指示要与谓词匹配的最大值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.notBetween("AGE", 10, 50) + ``` + + +### greaterThan + +greaterThan(field: string, value: ValueType): RdbPredicatesgr + + +配置谓词以匹配数据字段为ValueType且值大于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.greaterThan("AGE", 18) + ``` + + +### lessThan + +lessThan(field: string, value: ValueType): RdbPredicates + + +配置谓词以匹配数据字段为valueType且value小于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.lessThan("AGE", 20) + ``` + + +### greaterThanOrEqualTo + + +greaterThanOrEqualTo(field: string, value: ValueType): RdbPredicates + + +配置谓词以匹配数据字段为ValueType且value大于或等于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.greaterThanOrEqualTo("AGE", 18) + ``` + + +### lessThanOrEqualTo + + +lessThanOrEqualTo(field: string, value: ValueType): RdbPredicates + + +配置谓词以匹配数据字段为ValueType且value小于或等于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.lessThanOrEqualTo("AGE", 20) + ``` + + +### orderByAsc + + +orderByAsc(field: string): RdbPredicates + + +配置谓词以匹配其值按升序排序的列。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.orderByAsc("NAME") + ``` + + +### orderByDesc + + +orderByDesc(field: string): RdbPredicates + + +配置谓词以匹配其值按降序排序的列。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.orderByDesc("AGE") + ``` + + +### distinct + +distinct(): RdbPredicates + + +配置谓词以过滤重复记录并仅保留其中一个。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回可用于过滤重复记录的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Rose").distinct("NAME") + let resultSet = await rdbStore.query(predicates, ["NAME"]) + ``` + + +### limitAs + +limitAs(value: number): RdbPredicates + + +设置最大数据记录数的谓词。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | value | number | 是 | 最大数据记录数。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回可用于设置最大数据记录数的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Rose").limitAs(3) + ``` + + +### offsetAs + +offsetAs(rowOffset: number): RdbPredicates + + +配置RdbPredicates以指定返回结果的起始位置。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | rowOffset | number | 是 | 返回结果的起始位置,取值为正整数。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回具有指定返回结果起始位置的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Rose").offsetAs(3) + ``` + + +### groupBy + +groupBy(fields: Array<string>): RdbPredicates + + +配置RdbPredicates按指定列分组查询结果。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fields | Array<string> | 是 | 指定分组依赖的列名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回分组查询列的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.groupBy(["AGE", "NAME"]) + ``` + + +### indexedBy + +indexedBy(indexName: string): RdbPredicates + + +配置RdbPredicates以指定索引列。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | indexName | string | 是 | 索引列的名称。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回具有指定索引列的RdbPredicates。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.indexedBy("SALARY_INDEX") + ``` + + +### in + +in(field: string, value: Array<ValueType>): RdbPredicates + + +配置RdbPredicates以匹配数据字段为ValueType数组且值在给定范围内的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | Array<[ValueType](#valuetype)> | 是 | 以ValueType型数组形式指定的要匹配的值。 | + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.in("AGE", [18, 20]) + ``` + + +### notIn + +notIn(field: string, value: Array<ValueType>): RdbPredicates + + +将RdbPredicates配置为匹配数据字段为ValueType且值超出给定范围的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | Array<[ValueType](#valuetype)> | 是 | 以ValueType数组形式指定的要匹配的值。 | + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [RdbPredicates](#rdbpredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.notIn("NAME", ["Lisa", "Rose"]) + ``` + + +## RdbStore + +提供管理关系数据库(RDB)方法的接口。 + + +### insert + +insert(name: string, values: ValuesBucket, callback: AsyncCallback<number>):void + +向目标表中插入一行数据,结果以callback形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 指定的目标表名。 | + | values | [ValuesBucket](#valuesbucket) | 是 | 表示要插入到表中的数据行。 | + | callback | AsyncCallback<number> | 是 | 指定callback回调函数。如果操作成功,返回行ID;否则返回-1。 | + +- 示例: + ``` + const valueBucket = { + "NAME": "Lisa", + "AGE": 18, + "SALARY": 100.5, + "CODES": new Uint8Array([1, 2, 3, 4, 5]), + } + rdbStore.insert("EMPLOYEE", valueBucket, function (err, ret) { + expect(1).assertEqual(ret) + console.log(TAG + "insert first done: " + ret)}) + ``` + + +### insert + +insert(name: string, values: ValuesBucket):Promise<number> + +向目标表中插入一行数据,结果以Promise形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 指定的目标表名。 | + | values | [ValuesBucket](#valuesbucket) | 是 | 表示要插入到表中的数据行。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<number> | 指定Promise回调函数。如果操作成功,返回行ID;否则返回-1。 | + +- 示例: + ``` + const valueBucket = { + "NAME": "Lisa", + "AGE": 18, + "SALARY": 100.5, + "CODES": new Uint8Array([1, 2, 3, 4, 5]), + } + let promise = rdbStore.insert("EMPLOYEE", valueBucket) + promise.then(async (ret) => { + await console.log(TAG + "insert first done: " + ret) + }).catch((err) => {}) + ``` + + +### update + +update(values: ValuesBucket, rdbPredicates: RdbPredicates, callback: AsyncCallback<number>):void + +根据RdbPredicates的指定实例对象更新数据库中的数据,结果以callback形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | values | [ValuesBucket](#valuesbucket) | 是 | value指示数据库中要更新的数据行。键值对与数据库表的列名相关联 | + | rdbPredicates | [RdbPredicates](#rdbpredicates) | 是 | 表示要插入到表中的数据行。 | + | callback | AsyncCallback<number> | 是 | 指定的callback回调方法。返回受影响的行数。 | + +- 示例: + ``` + const valueBucket = { + "NAME": "Rose", + "AGE": 22, + "SALARY": 200.5, + "CODES": new Uint8Array([1, 2, 3, 4, 5]), + } + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Lisa") + rdbStore.update(valueBucket, predicates, function (err, ret) { + console.log(TAG + "updated row count: " + changedRows)}) + ``` + + +### update + +update(values: ValuesBucket, rdbPredicates: RdbPredicates):Promise<number> + +根据RdbPredicates的指定实例对象更新数据库中的数据,结果以Promise形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | values | [ValuesBucket](#valuesbucket) | 是 | value指示数据库中要更新的数据行。键值对与数据库表的列名相关联 | + | rdbPredicates | [RdbPredicates](#rdbpredicates) | 是 | 表示要插入到表中的数据行。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<number> | 指定的Promise回调方法。返回受影响的行数。 | + +- 示例: + ``` + const valueBucket = { + "NAME": "Rose", + "AGE": 22, + "SALARY": 200.5, + "CODES": new Uint8Array([1, 2, 3, 4, 5]), + } + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Lisa") + let promise = rdbStore.update(valueBucket, predicates) + promise.then(async (ret) => { + await console.log(TAG + "updated row count: " + changedRows) + }).catch((err) => {}) + ``` + + +### delete + +delete(rdbPredicates: RdbPredicates, callback: AsyncCallback<number>):void + + +根据rdbPredicates的指定实例对象从数据库中删除数据,结果以callback形式返回。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | rdbPredicates | [RdbPredicates](#rdbpredicates) | 是 | RdbPredicates的实例对象指定的删除条件。 | + | callback | AsyncCallback<number> | 是 | 指定callback回调函数。返回受影响的行数。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Lisa") + rdbStore.delete(predicates, function (err, rows) { + console.log(TAG + "delete rows: " + rows)}) + ``` + + +### delete + +delete(rdbPredicates: RdbPredicates):Promise<number> + +根据rdbPredicates的指定实例对象从数据库中删除数据,结果以Promise形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | rdbPredicates | [RdbPredicates](#rdbpredicates) | 是 | RdbPredicates的实例对象指定的删除条件。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<number> | 指定Promise回调函数。返回受影响的行数。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Lisa") + let promise = rdbStore.delete(predicates) + promise.then((rows) => { + console.log(TAG + "delete rows: " + rows) + }).catch((err) => {}) + ``` + + +### query + +query(rdbPredicates: RdbPredicates, columns: Array<string>, callback: AsyncCallback<ResultSet>):void + +根据指定条件查询数据库中的数据,结果以callback形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | rdbPredicates | [RdbPredicates](#rdbpredicates) | 是 | 表示rdbPredicates的实例对象指定的查询条件。 | + | columns | Array<string> | 是 | 表示要查询的列。如果值为空,则查询应用于所有列。 | + + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Rose") + rdbStore.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"], function (err, resultSet) { + console.log(TAG + "resultSet column names:" + resultSet.columnNames) + console.log(TAG + "resultSet column count:" + resultSet.columnCount)}) + ``` + + +### query + +query(rdbPredicates: RdbPredicates, columns: Array<string>):Promise<ResultSet> + +根据指定条件查询数据库中的数据,结果以Promise形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | rdbPredicates | [RdbPredicates](#rdbpredicates) | 是 | 表示rdbPredicates的实例对象指定的查询条件。 | + | columns | Array<string> | 是 | 表示要查询的列。如果值为空,则查询应用于所有列。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Rose") + let promise = rdbStore.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]) + promise.then((resultSet) => { + console.log(TAG + "resultSet column names:" + resultSet.columnNames) + console.log(TAG + "resultSet column count:" + resultSet.columnCount)}) + ``` + + +### executeSql + +executeSql(sql: string, bindArgs: Array<ValueType>, callback: AsyncCallback<void>):void + +执行包含指定参数但不返回值的SQL语句,结果以callbck形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | sql | string | 是 | 指定要执行的SQL语句。 | + | bindArgs | Array<[ValueType](#valuetype)> | 是 | SQL语句中参数的值。 | + | callback | AsyncCallback<void> | 是 | 指定callback回调函数。 | + +- 示例: + ``` + rdbStore.executeSql("DELETE FROM EMPLOYEE", function () { + console.info(TAG + 'delete done.')}) + ``` + + +### executeSql + +executeSql(sql: string, bindArgs: Array<ValueType>):Promise<void> + +执行包含指定参数但不返回值的SQL语句,结果以Promise形式返回。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | sql | string | 是 | 指定要执行的SQL语句。 | + | bindArgs | Array<[ValueType](#valuetype)> | 是 | SQL语句中参数的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | 指定Promise回调函数。 | + +- 示例: + ``` + let promise = rdbStore.executeSql("DELETE FROM EMPLOYEE") + promise.then(() => { + console.info(TAG + 'delete done.')}) + ``` + + +## StoreConfig + +管理关系数据库配置。 + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| name | string | 是 | 数据库文件名。 | + + +## ValueType + +用于表示允许的数据字段类型。 + +| 名称 | 说明 | +| -------- | -------- | +| number | 表示值类型为数字。 | +| string | 表示值类型为字符。 | +| boolean | 表示值类型为布尔值。 | + + +## ValuesBucket + +用于存储键值对。 + + +| 名称 | 参数类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| [key: string] | [ValueType](#valuetype)\| Uint8Array \| null | 是 | 用于存储键值对。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/05.\347\273\223\346\236\234\351\233\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/05.\347\273\223\346\236\234\351\233\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..be33925a003bd65ee1e714e2eda327f8bcca96b5 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/05.\347\273\223\346\236\234\351\233\206.md" @@ -0,0 +1,372 @@ +--- +title: 结果集 +permalink: /pages/000b000304 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 结果集 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 使用说明 + +需要通过[RdbStore.query()](/pages/000b000303#query)获取resultSet对象。 + +``` +import dataRdb from '@ohos.data.rdb'; +let predicates = new dataRdb.RdbPredicates("EMPLOYEE") +predicates.equalTo("AGE", 18) +let promise = rdbStore.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]) +promise.then((resultSet) => { + await console.log(TAG + "resultSet columnNames:" + resultSet.columnNames); + await console.log(TAG + "resultSet columnCount:" + resultSet.columnCount);}) +``` + + +## 权限 + +无 + + +## ResultSet + +提供通过查询数据库生成的数据库结果集的访问方法。 + + +### 属性 + + +| 名称 | 参数类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| columnNames | Array<string> | 是 | 获取结果集中所有列的名称。 | +| columnCount | number | 是 | 获取结果集中的列数。 | +| rowCount | number | 是 | 获取结果集中的行数。 | +| rowIndex | number | 是 | 获取结果集当前行的索引。 | +| isAtFirstRow | boolean | 是 | 检查结果集是否位于第一行。 | +| isAtLastRow | boolean | 是 | 检查结果集是否位于最后一行。 | +| isEnded | boolean | 是 | 检查结果集是否位于最后一行之后。 | +| isStarted | boolean | 是 | 检查指针是否移动过。 | +| isClosed | boolean | 是 | 检查当前结果集是否关闭。 | + + +### getColumnIndex + +getColumnIndex(columnName: string): number + +根据指定的列名获取列索引。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | columnName | string | 是 | 表示结果集中指定列的名称。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | number | 返回指定列的索引。 | + +- 示例: + ``` + resultSet.goToFirstRow() + const id = resultSet.getLong(resultSet.getColumnIndex("ID")) + const name = resultSet.getString(resultSet.getColumnIndex("NAME")) + const age = resultSet.getLong(resultSet.getColumnIndex("AGE")) + const salary = resultSet.getDouble(resultSet.getColumnIndex("SALARY")) + ``` + + +### getColumnName + +getColumnName(columnIndex: number): string + +根据指定的列索引获取列名。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | columnIndex | number | 是 | 表示结果集中指定列的索引。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 返回指定列的名称。 | + +- 示例: + ``` + const id = resultSet.getColumnName(0) + const name = resultSet.getColumnName(1) + const age = resultSet.getColumnName(2) + ``` + + +### goTo + +goTo(offset:number): boolean + +向前或向后转至结果集的指定行,相对于其当前位置偏移。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | offset | number | 是 | 表示相对于当前位置的偏移量。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 如果成功移动结果集,则为true;否则返回false。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + let resultSet = await rdbStore.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]) + resultSet.goTo(1) + resultSet.close() + resultSet = null + ``` + + +### goToRow + +goToRow(position: number): boolean + +转到结果集的指定行。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | position | number | 是 | 表示要移动到的指定位置。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 如果成功移动结果集,则为true;否则返回false。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + let resultSet = await rdbStore.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]) + resultSet.goToRow(1) + resultSet.close() + resultSet = null + ``` + + +### goToFirstRow + +goToFirstRow(): boolean + + +转到结果集的第一行。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 如果成功移动结果集,则为true;否则返回false。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + let resultSet = await rdbStore.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]) + resultSet.goToFirstRow() + resultSet.close() + resultSet = null; + ``` + + +### goToLastRow + +goToLastRow(): boolean + +转到结果集的最后一行。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 如果成功移动结果集,则为true;否则返回false。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + let resultSet = await rdbStore.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]) + resultSet.goToLastRow() + resultSet.close() + resultSet = null; + ``` + + +### goToNextRow + +goToNextRow(): boolean + +转到结果集的下一行。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 如果成功移动结果集,则为true;否则返回false。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + let resultSet = await rdbStore.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]) + resultSet.goToNextRow() + resultSet.close() + resultSet = null; + ``` + + +### goToPreviousRow + +goToPreviousRow(): boolean + +转到结果集的上一行。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 如果成功移动结果集,则为true;否则返回false。 | + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + let resultSet = await rdbStore.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]) + resultSet.goToPreviousRow() + resultSet.close() + resultSet = null + ``` + + +### getBlob + +getBlob(columnIndex: number): Uint8Array + +以字节数组的形式获取当前行中指定列的值。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | columnIndex | number | 是 | 指定的列索引,从0开始。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Uint8Array | 以字节数组的形式返回指定列的值。 | + +- 示例: + ``` + const codes = resultSet.getBlob(resultSet.getColumnIndex("CODES")) + ``` + + +### getString + +getString(columnIndex: number): string + +以字符串形式获取当前行中指定列的值。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | columnIndex | number | 是 | 指定的列索引,从0开始。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 以字符串形式返回指定列的值。 | + +- 示例: + ``` + const name = resultSet.getString(resultSet.getColumnIndex("NAME")) + ``` + + +### getLong + +getLong(columnIndex: number): number + +以Long形式获取当前行中指定列的值。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | columnIndex | number | 是 | 指定的列索引,从0开始。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | number | 以Long形式返回指定列的值。 | + +- 示例: + ``` + const age = resultSet.getLong(resultSet.getColumnIndex("AGE")) + ``` + + +### getDouble + +getDouble(columnIndex: number): number + +以double形式获取当前行中指定列的值。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | columnIndex | number | 是 | 指定的列索引,从0开始。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | number | 以double形式返回指定列的值。 | + +- 示例: + ``` + const salary = resultSet.getDouble(resultSet.getColumnIndex("SALARY")) + ``` + + +### isColumnNull + +isColumnNull(columnIndex: number): boolean + +检查当前行中指定列的值是否为null。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | columnIndex | number | 是 | 指定的列索引,从0开始。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 如果当前行中指定列的值为null,则返回true,否则返回false。 | + +- 示例: + ``` + const isColumnNull = resultSet.isColumnNull(resultSet.getColumnIndex("CODES")) + ``` + + +### close + +close(): void + +关闭结果集。 + + +- 示例: + ``` + let predicates = new dataRdb.RdbPredicates("EMPLOYEE") + let resultSet = await rdbStore.query(predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]) + resultSet.close() + resultSet = null + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/06.DataAbility\350\260\223\350\257\215.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/06.DataAbility\350\260\223\350\257\215.md" new file mode 100644 index 0000000000000000000000000000000000000000..de2431e5b3a508563f6bca0a758d694f4bf40b0c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/04.\346\225\260\346\215\256\347\256\241\347\220\206/06.DataAbility\350\260\223\350\257\215.md" @@ -0,0 +1,800 @@ +--- +title: DataAbility谓词 +permalink: /pages/000b000305 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# DataAbility 谓词 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import dataAbility from '@ohos.data.dataAbility' +``` + + +## 权限 + +无 + + +## dataAbility.createRdbPredicates + + +createRdbPredicates(name: string, dataAbilityPredicates: DataAbilityPredicates): rdb.RdbPredicates + + +从DataAabilityPredicates对象创建RdbPredicates对象。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 数据库表中表名。 | + | dataAbilityPredicates | [DataAbilityPredicates](#dataabilitypredicates) | 是 | dataAbility谓词。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | rdb.[RdbPredicates](/pages/000b000303#rdbpredicates) | 返回RdbPredicates对象。 | + +- 示例: + ``` + let dataAbilityPredicates = new dataAbility.DataAbilityPredicates() + dataAbilityPredicates.equalTo("NAME", "Rose").between("AGE", 16, 30) + let predicates = dataAbility.createRdbPredicates("EMPLOYEE", dataAbilityPredicates) + ``` + + +## DataAbilityPredicates + +提供用于实现不同查询方法的谓词。 + + +### equalTo + + +equalTo(field: string, value: ValueType): DataAbilityPredicates + + +配置谓词以匹配数据类型为ValueType且值等于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](/pages/000b000303#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.equalTo("NAME", "lisi") + ``` + + +### notEqualTo + + +notEqualTo(field: string, value: ValueType): DataAbilityPredicates + + +配置谓词以匹配数据类型为ValueType且值不等于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](/pages/000b000303#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.notEqualTo("NAME", "lisi") + ``` + + +### beginWrap + + +beginWrap(): DataAbilityPredicates + + +向谓词添加左括号。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回带有左括号的DataAbility谓词。 | + +- 示例: + ``` + let predicates = new dataAbilitylity.DataAbilityPredicates("EMPLOYEE") + predicates.equalTo("NAME", "lisi") + .beginWrap() + .equalTo("AGE", 18) + .or() + .equalTo("SALARY", 200.5) + .endWrap() + ``` + + +### endWrap + + +endWrap(): DataAbilityPredicates + + +向谓词添加右括号。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回带有右括号的DataAbility谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.equalTo("NAME", "lisi") + .beginWrap() + .equalTo("AGE", 18) + .or() + .equalTo("SALARY", 200.5) + .endWrap() + ``` + + +### or + + +or(): DataAbilityPredicates + + +将或条件添加到谓词中。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回带有或条件的DataAbility谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Lisa") + .or() + .equalTo("NAME", "Rose") + ``` + + +### and + + +and(): DataAbilityPredicates + + +向谓词添加和条件。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回带有和条件的DataAbility谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Lisa") + .and() + .equalTo("SALARY", 200.5) + ``` + + +### contains + + +contains(field: string, value: string): DataAbilityPredicates + + +配置谓词以匹配数据类型为String且value包含指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | string | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.contains("NAME", "os") + ``` + + +### beginsWith + + +beginsWith(field: string, value: string): DataAbilityPredicates + + +配置谓词以匹配数据类型为String且值以指定字符串开头的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | string | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.beginsWith("NAME", "os") + ``` + + +### endsWith + + +endsWith(field: string, value: string): DataAbilityPredicates + + +配置谓词以匹配数据类型为String且值以指定字符串结尾的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | string | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.endsWith("NAME", "se") + ``` + + +### isNull + + +isNull(field: string): DataAbilityPredicates + + +配置谓词以匹配值为null的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.isNull("NAME") + ``` + + +### isNotNull + + +isNotNull(field: string): DataAbilityPredicates + + +配置谓词以匹配值不为null的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.isNotNull("NAME") + ``` + + +### like + + +like(field: string, value: string): DataAbilityPredicates + + +配置谓词以匹配数据类型为string且值类似于指定字符串的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | string | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.like("NAME", "%os%") + ``` + + +### glob + + +glob(field: string, value: string): DataAbilityPredicates + + +配置谓词匹配数据类型为string的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | string | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.glob("NAME", "?h*g") + ``` + + +### between + + +between(field: string, low: ValueType, high: ValueType): DataAbilityPredicates + + +将谓词配置为匹配数据类型为ValueType且value在指定范围内的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | low | [ValueType](/pages/000b000303#valuetype) | 是 | 指示与谓词匹配的最小值。 | + | high | [ValueType](/pages/000b000303#valuetype) | 是 | 指示与谓词匹配的最大值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.between("AGE", 10, 50) + ``` + + +### notBetween + + +notBetween(field: string, low: ValueType, high: ValueType): DataAbilityPredicates + + +配置谓词以匹配数据类型为ValueType且value超出给定范围的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | low | [ValueType](/pages/000b000303#valuetype) | 是 | 指示与谓词匹配的最小值。 | + | high | [ValueType](/pages/000b000303#valuetype) | 是 | 指示与谓词匹配的最大值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.notBetween("AGE", 10, 50) + ``` + + +### greaterThan + + +greaterThan(field: string, value: ValueType): DataAbilityPredicates + + +配置谓词以匹配数据类型为ValueType且值大于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](/pages/000b000303#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.greaterThan("AGE", 18) + ``` + + +### lessThan + + +lessThan(field: string, value: ValueType): DataAbilityPredicates + + +配置谓词以匹配数据类型为valueType且value小于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](/pages/000b000303#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.lessThan("AGE", 20) + ``` + + +### greaterThanOrEqualTo + + +greaterThanOrEqualTo(field: string, value: ValueType): DataAbilityPredicates + + +配置谓词以匹配数据类型为ValueType且value大于或等于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](/pages/000b000303#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.greaterThanOrEqualTo("AGE", 18) + ``` + + +### lessThanOrEqualTo + + +lessThanOrEqualTo(field: string, value: ValueType): DataAbilityPredicates + + +配置谓词以匹配数据类型为ValueType且value小于或等于指定值的字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | [ValueType](/pages/000b000303#valuetype) | 是 | 指示要与谓词匹配的值。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.lessThanOrEqualTo("AGE", 20) + ``` + + +### orderByAsc + + +orderByAsc(field: string): DataAbilityPredicates + + +配置谓词以匹配其值按升序排序的列。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.orderByAsc("NAME") + ``` + + +### orderByDesc + + +orderByDesc(field: string): DataAbilityPredicates + + +配置谓词以匹配其值按降序排序的列。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.orderByDesc("AGE") + ``` + + +### distinct + + +distinct(): DataAbilityPredicates + + +配置谓词以过滤重复记录并仅保留其中一个。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回可用于过滤重复记录的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Rose").distinct("NAME") + let resultSet = await rdbStore.query(predicates, ["NAME"]) + ``` + + +### limitAs + + +limitAs(value: number): DataAbilityPredicates + + +设置最大数据记录数的谓词。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | value | number | 是 | 最大数据记录数。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回可用于设置最大数据记录数的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Rose").limitAs(3) + ``` + + +### offsetAs + + +offsetAs(rowOffset: number): DataAbilityPredicates + + +配置谓词以指定返回结果的起始位置。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | rowOffset | number | 是 | 返回结果的起始位置,取值为正整数。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回具有指定返回结果起始位置的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.equalTo("NAME", "Rose").offsetAs(3) + ``` + + +### groupBy + + +groupBy(fields: Array<string>): DataAbilityPredicates + + +配置谓词按指定列分组查询结果。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fields | Array<string> | 是 | 指定分组依赖的列名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回分组查询列的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.groupBy(["AGE", "NAME"]) + ``` + + +### indexedBy + + +indexedBy(indexName: string): DataAbilityPredicates + + +配置谓词以指定索引列。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | indexName | string | 是 | 索引列的名称。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回具有指定索引列的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.indexedBy("SALARY_INDEX") + ``` + + +### in + + +in(field: string, value: Array<ValueType>): DataAbilityPredicates + + +配置谓词以匹配数据类型为ValueType数组且值在给定范围内的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | Array<[ValueType](/pages/000b000303#valuetype)> | 是 | 以ValueType型数组形式指定的要匹配的值。 | + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.in("AGE", [18, 20]) + ``` + + +### notIn + + +notIn(field: string, value: Array<ValueType>): DataAbilityPredicates + + +配置谓词以匹配数据类型为ValueType数组且值不在给定范围内的指定字段。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | field | string | 是 | 数据库表中的列名。 | + | value | Array<[ValueType](/pages/000b000303#valuetype)> | 是 | 以ValueType型数组形式指定的要匹配的值。 | + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DataAbilityPredicates](#dataabilitypredicates) | 返回与指定字段匹配的谓词。 | + +- 示例: + ``` + let predicates = new dataAbility.DataAbilityPredicates("EMPLOYEE") + predicates.notIn("NAME", ["Lisa", "Rose"]) + ``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/05.\350\264\246\345\217\267\347\256\241\347\220\206/01.\345\210\206\345\270\203\345\274\217\345\270\220\345\217\267\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/05.\350\264\246\345\217\267\347\256\241\347\220\206/01.\345\210\206\345\270\203\345\274\217\345\270\220\345\217\267\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..b37c2f9d89e1066e022a4a322e4e2e353ba8a8a2 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/05.\350\264\246\345\217\267\347\256\241\347\220\206/01.\345\210\206\345\270\203\345\274\217\345\270\220\345\217\267\347\256\241\347\220\206.md" @@ -0,0 +1,157 @@ +--- +title: 分布式帐号管理 +permalink: /pages/000b000400 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 分布式帐号管理 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import account_distributedAccount from '@ohos.account.distributedAccount'; +``` + + +## account_distributedAccount.getDistributedAccountAbility + +getDistributedAccountAbility(): DistributedAccountAbility + +获取分布式帐号单实例对象。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [DistributedAccountAbility](#distributedaccountability) | 返回一个实例,实例提供查询和更新分布式帐号登录状态方法。 | + +- 示例: + ``` + const accountAbility = account_distributedAccount.getDistributedAccountAbility(); + ``` + +## DistributedAccountAbility + +提供查询和更新分布式帐号登录状态方法(需要先获取分布式帐号的单实例对象)。 + +### queryOsAccountDistributedInfo + +queryOsAccountDistributedInfo(callback: AsyncCallback<DistributedInfo>): void + +获取分布式帐号信息,使用callback回调异步返回结果。 + +需要权限:ohos.permission.MANAGE_LOCAL_ACCOUNTS,该权限仅供系统应用使用。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<[DistributedInfo](#distributedinfo)> | 是 | 获取分布式帐号信息的回调。 | + +- 示例: + ``` + const accountAbility = account_distributedAccount.getDistributedAccountAbility(); + accountAbility.queryOsAccountDistributedInfo((err, data) => { + console.log("queryOsAccountDistributedInfo err: " + JSON.stringify(err)); + console.log('Query account info name: ' + data.name); + console.log('Query account info id: ' + data.id); + }); + ``` + +### queryOsAccountDistributedInfo + +queryOsAccountDistributedInfo(): Promise<DistributedInfo> + +获取分布式帐号信息,使用Promise方式异步返回结果。 + +需要权限:ohos.permission.MANAGE_LOCAL_ACCOUNTS,该权限仅供系统应用使用。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<[DistributedInfo](#distributedinfo)> | Promise实例,用于获取异步返回结果。 | + +- 示例: + ``` + const accountAbility = account_distributedAccount.getDistributedAccountAbility(); + accountAbility.queryOsAccountDistributedInfo().then((data) => { + console.log('Query account info name: ' + data.name); + console.log('Query account info id: ' + data.id); + }).catch((err) => { + console.log("queryOsAccountDistributedInfoerr: " + JSON.stringify(err)); + }); + ``` + +### updateOsAccountDistributedInfo + +updateOsAccountDistributedInfo(accountInfo: DistributedInfo, callback: AsyncCallback<void>): void + +更新分布式帐号信息,使用callback回调异步返回结果。 + +需要权限:ohos.permission.MANAGE_LOCAL_ACCOUNTS,该权限仅供系统应用使用。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | accountInfo | [DistributedInfo](#distributedinfo) | 是 | 分布式帐号信息。 | + | callback | AsyncCallback<void> | 是 | 更新分布式帐号信息的回调。 | + +- 示例: + ``` + const accountAbility = account_distributedAccount.getDistributedAccountAbility(); + let accountInfo = {id: '12345', name: 'ZhangSan', event: 'Ohos.account.event.LOGIN'}; + accountAbility.updateOsAccountDistributedInfo(accountInfo, (err) => { + console.log("queryOsAccountDistributedInfo err: " + JSON.stringify(err)); + }); + ``` + +### updateOsAccountDistributedInfo + +updateOsAccountDistributedInfo(accountInfo: DistributedInfo): Promise<void> + +更新分布式帐号信息,使用Promise方式异步返回结果。 + +需要权限:ohos.permission.MANAGE_LOCAL_ACCOUNTS,该权限仅供系统应用使用。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | accountInfo | [DistributedInfo](#distributedinfo) | 是 | 分布式帐户信息。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | Promise实例,用于获取异步返回结果。 | + +- 示例: + ``` + const accountAbility = account_distributedAccount.getDistributedAccountAbility(); + let accountInfo = {id: '12345', name: 'ZhangSan', event: 'Ohos.account.event.LOGIN'}; + accountAbility.updateOsAccountDistributedInfo(accountInfo).then(() => { + console.log('updateOsAccountDistributedInfo Success'); + }).catch((err) => { + console.log("updateOsAccountDistributedInfo err: " + JSON.stringify(err)); + }); + ``` + + +## DistributedInfo + +提供操作系统帐户的分布式信息。 + + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| name | string | 是 | 分布式帐号名称,非空字符串。 | +| id | string | 是 | 分布式帐号UID,非空字符串。 | +| event | string | 是 | 分布式帐号登录状态,包括登录、登出、Token失效和注销,分别对应以下字符串:
- Ohos.account.event.LOGIN
- Ohos.account.event.LOGOUT
- Ohos.account.event.TOKEN_INVALID
- Ohos.account.event.LOGOFF | +| scalableData | object | 否 | 分布式帐号扩展信息,根据业务所需,以k-v形式传递定制化信息。
说明:该参数是预留的可选项,目前查询和更新的方法实现中未使用。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/01.\346\213\250\346\211\223\347\224\265\350\257\235.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/01.\346\213\250\346\211\223\347\224\265\350\257\235.md" new file mode 100644 index 0000000000000000000000000000000000000000..8328518879a1b7dfbbf1e106d70b1b85b9b0018a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/01.\346\213\250\346\211\223\347\224\265\350\257\235.md" @@ -0,0 +1,450 @@ +--- +title: 拨打电话 +permalink: /pages/000b000500 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 拨打电话 + +>**说明:** +> +>本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import call from '@ohos.telephony.call'; +``` + +## call.dial + +dial\(phoneNumber: string, callback: AsyncCallback\): void + +拨打电话,使用callback方式作为异步方法。 + +需要权限:ohos.permission.PLACE\_CALL权限,该权限为系统权限。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | ---------------------------- | ---- | ------------------------------------------------- | + | phoneNumber | string | 是 | 电话号码。 | + | callback | AsyncCallback<boolean> | 是 | 回调函数:
- true:成功。
- false:失败。 | + +- 示例 + + ``` + call.dial("138xxxxxxxx", (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## call.dial + +dial\(phoneNumber: string, options: DialOptions, callback: AsyncCallback\): void + +拨打电话,可设置通话参数,使用callback方式作为异步方法。 + +需要权限:ohos.permission.PLACE\_CALL权限,该权限为系统权限。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | ---------------------------- | ---- | ------------------------------------------------- | + | phoneNumber | string | 是 | 电话号码。 | + | options | DialOptions | 是 | 通话参数,参考[DialOptions](#DialOptions)。 | + | callback | AsyncCallback<boolean> | 是 | 回调函数:
- true:成功。
- false:失败。 | + + +- 示例 + + ``` + call.dial("138xxxxxxxx", { + extras: false + }, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## call.dial + +dial\(phoneNumber: string, options?: DialOptions\): Promise + +拨打电话,可设置通话参数,使用promise方式作为异步方法。 + +需要权限:ohos.permission.PLACE\_CALL权限,该权限为系统权限。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | ----------- | ---- | ------------------------------------------- | + | phoneNumber | string | 是 | 电话号码。 | + | options | DialOptions | 是 | 通话参数,参考[DialOptions](#DialOptions)。 | + +- 返回值 + + | 类型 | 说明 | + | ---------------------- | --------------------------------- | + | Promise<boolean> | 以Promise形式返回拨打电话的结果。 | + +- 示例 + + ``` + let promise = call.dial("138xxxxxxxx", { + extras: false + }); + promise.then(data => { + console.log(`dial success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`dial fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + +## call.hasCall + +hasCall\(callback: AsyncCallback\): void + +判断是否存在通话,使用callback方式作为异步方法。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | -------- | ---------------------------- | ---- | ------------------------------------------------------------ | + | callback | AsyncCallback<boolean> | 是 | 回调函数:
- true:当前存在通话。
- false:当前不存在通话。 | + +- 示例 + + ``` + call.hasCall((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## call.hasCall + +hasCall\(\): Promise + +判断是否存在通话,使用Promise方式作为异步方法。 + +- 返回值 + + | 类型 | 说明 | + | ---------------------- | --------------------------------------- | + | Promise<boolean> | 以Promise形式异步返回判断是否存在通话。 | + +- 示例 + + ``` + let promise = call.hasCall(); + promise.then(data => { + console.log(`hasCall success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`hasCall fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## call.getCallState + +getCallState\(callback: AsyncCallback\): void + +获取通话状态,使用callback方式作为异步方法。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | -------- | -------------------------------------------- | ---- | ------------------------------------ | + | callback | AsyncCallback<[CallState](#CallState)> | 是 | 回调函数:异步返回获取到的通话状态。 | + +- 示例 + + ``` + call.getCallState((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## call.getCallState + +getCallState\(\): Promise + +获取通话状态,使用Promise方式作为异步方法。 + +- 返回值 + + | 类型 | 说明 | + | -------------------------------------- | ----------------------------------------- | + | Promise<[CallState](#CallState)> | 以Promise形式异步返回获取通话状态的结果。 | + +- 示例 + + ``` + let promise = call.getCallState(); + promise.then(data => { + console.log(`getCallState success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`getCallState fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + +## call.isEmergencyPhoneNumber7+ + +isEmergencyPhoneNumber\(phoneNumber: string, callback: AsyncCallback\): void + +判断是否是紧急电话号码,使用callback方式作为异步方法。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | ---------------------------- | ---- | ------------------------------------------------------------ | + | phoneNumber | string | 是 | 电话号码。 | + | callback | AsyncCallback<boolean> | 是 | 回调函数,返回判断是否是紧急电话号码的结果:
- true:是紧急电话号码。
- false:不是紧急电话号码。 | + +- 示例 + + ``` + call.isEmergencyPhoneNumber("138xxxxxxxx", (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## call.isEmergencyPhoneNumber7+ + +isEmergencyPhoneNumber\(phoneNumber: string, options: EmergencyNumberOptions, callback: AsyncCallback\): void + +判断是否是紧急电话号码,使用callback方式作为异步方法。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | ---------------------------- | ---- | ------------------------------------------------------------ | + | phoneNumber | string | 是 | 电话号码。 | + | options | EmergencyNumberOptions | 是 | 手机参数,参考[EmergencyNumberOptions](#EmergencyNumberOptions)。 | + | callback | AsyncCallback<boolean> | 是 | 回调函数,返回判断是否是紧急电话号码的结果:
- true:是紧急电话号码。
- false:不是紧急电话号码。 | + +- 示例 + + ``` + call.isEmergencyPhoneNumber("112", {slotId: 1}, (err, value) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## call.isEmergencyPhoneNumber7+ + +isEmergencyPhoneNumber\(phoneNumber: string, options?: EmergencyNumberOptions\): Promise + +判断是否是紧急电话号码,使用promise方式作为异步方法。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | ---------------------- | ---- | ------------------------------------------------------------ | + | phoneNumber | string | 是 | 电话号码。 | + | options | EmergencyNumberOptions | 是 | 手机参数,参考[EmergencyNumberOptions](#EmergencyNumberOptions)。 | + +- 返回值 + + | 类型 | 说明 | + | ---------------------- | --------------------------------------------------- | + | Promise<boolean> | 以Promise形式异步返回判断是否是紧急电话号码的结果。 | + +- 示例 + + ``` + let promise = call.isEmergencyPhoneNumber("138xxxxxxxx", {slotId: 1}); + promise.then(data => { + console.log(`isEmergencyPhoneNumber success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`isEmergencyPhoneNumber fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + +## call.formatPhoneNumber7+ + +formatPhoneNumber\(phoneNumber: string, callback: AsyncCallback\): void + +格式化电话号码,使用callback方式作为异步方法。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | --------------------------- | ---- | ------------------------------------ | + | phoneNumber | string | 是 | 电话号码。 | + | callback | AsyncCallback<string> | 是 | 回调函数,返回格式化电话号码的结果。 | + +- 示例 + + ``` + call.formatPhoneNumber("138xxxxxxxx", (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## call.formatPhoneNumber7+ + +formatPhoneNumber\(phoneNumber: string, options: NumberFormatOptions, callback: AsyncCallback\): void + +格式化电话号码,可设置格式化参数,使用callback方式作为异步方法。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | --------------------------- | ---- | ------------------------------------------------------------ | + | phoneNumber | string | 是 | 电话号码。 | + | options | NumberFormatOptions | 是 | 格式化参数,参考[NumberFormatOptions](#NumberFormatOptions)。 | + | callback | AsyncCallback<string> | 是 | 回调函数,返回格式化电话号码的结果。 | + +- 示例 + + ``` + call.formatPhoneNumber("138xxxxxxxx",{ + countryCode: "CN" + }, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## call.formatPhoneNumber7+ + +formatPhoneNumber\(phoneNumber: string, options?: NumberFormatOptions\): Promise + +格式化电话号码,可设置格式化参数,使用promise方式作为异步方法。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | ------------------- | ---- | ------------------------------------------------------------ | + | phoneNumber | string | 是 | 电话号码。 | + | options | NumberFormatOptions | 是 | 格式化参数,参考[NumberFormatOptions](#NumberFormatOptions)。 | + +- 返回值 + + | 类型 | 说明 | + | --------------------- | ------------------------------------------- | + | Promise<string> | 以Promise形式异步返回格式化电话号码的结果。 | + +- 示例 + + ``` + let promise = call.formatPhoneNumber("138xxxxxxxx", { + countryCode: "CN" + }); + promise.then(data => { + console.log(`formatPhoneNumber success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`formatPhoneNumber fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + +## call.formatPhoneNumberToE1647+ + +formatPhoneNumberToE164\(phoneNumber: string, countryCode: string, callback: AsyncCallback\): void + +将电话号码格式化为E.164表示形式,使用callback方式作为异步方法。 + +需要格式化的电话号码需要与传入国家码相匹配,如中国手机号需要传入国家码CN,否则格式化后的手机号为null。 + +支持所有国家码。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | --------------------------- | ---- | ----------------------------------------------------- | + | phoneNumber | string | 是 | 电话号码。 | + | countryCode | string | 是 | 国家码,支持所有国家码,如:中国(CN)。 | + | callback | AsyncCallback<string> | 是 | 回调函数,返回将电话号码格式化为E.164表示形式的结果。 | + +- 示例 + + ``` + call.formatPhoneNumberToE164("138xxxxxxxx",{ + countryCode: "CN" + }, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## call.formatPhoneNumberToE1647+ + +formatPhoneNumberToE164\(phoneNumber: string, countryCode: string\): Promise + +将电话号码格式化为E.164表示形式,使用promise方式作为异步方法。 + +需要格式化的手机号码需要与传入国家码相匹配,如中国手机号需要传入国家码CN,否则格式化后的手机号为null。 + +支持所有国家码。 + +- 参数 + + | 参数 | 类型 | 必填 | 说明 | + | ----------- | ------ | ---- | ---------------------------------------- | + | phoneNumber | string | 是 | 电话号码。 | + | countryCode | string | 是 | 国家码,支持所有国家码,如:中国(CN)。 | + +- 返回值 + + | 类型 | 说明 | + | --------------------- | ------------------------------------------------------------ | + | Promise<string> | 以Promise形式异步返回将电话号码格式化为E.164表示形式的结果。 | + +- 示例 + + ``` + let promise = call.formatPhoneNumberToE164("138xxxxxxxx", { + countryCode: "CN" + }); + promise.then(data => { + console.log(`formatPhoneNumberToE164 success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`formatPhoneNumberToE164 fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + +## DialOptions + +拨打电话的可选参数。 +| 参数 | 类型 | 必填 | 说明 | +| ------ | ------- | ---- | ------------------------------------------------------------ | +| extras | boolean | 否 | 根据extras的值判断是否为视频通话,默认为语音通话。
- true:视频通话。
- fasle:语音通话。 | + +## CallState + +通话状态码。 +| 变量 | 值 | 说明 | +| ------------------ | ---- | ------------------------------------------------------------ | +| CALL_STATE_UNKNOWN | -1 | 无效状态,当获取呼叫状态失败时返回。 | +| CALL_STATE_IDLE | 0 | 表示没有正在进行的呼叫。 | +| CALL_STATE_RINGING | 1 | 表示来电正在振铃或等待。 | +| CALL_STATE_OFFHOOK | 2 | 表示至少有一个呼叫处于拨号、通话中或呼叫保持状态,并且没有新的来电振铃或等待。 | + +## EmergencyNumberOptions7+ + +判断是否是紧急电话号码的可选参数。 +| 参数 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------ | +| slotId | number | 否 | 卡槽ID:
- 0:卡槽1。
- 1:卡槽2。 | + +## NumberFormatOptions7+ + +格式化号码的可选参数。 +| 参数 | 类型 | 必填 | 说明 | +| ----------- | ------ | ---- | ---------------------------------------------------------- | +| countryCode | string | 否 | 国家码,支持所有国家的国家码,如:中国(CN)。默认为:CN。 | \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/02.\347\237\255\344\277\241\346\234\215\345\212\241.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/02.\347\237\255\344\277\241\346\234\215\345\212\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..00b2e8975aa0478319406515f3a804c467422ab2 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/02.\347\237\255\344\277\241\346\234\215\345\212\241.md" @@ -0,0 +1,363 @@ +--- +title: 短信服务 +permalink: /pages/000b000501 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 短信服务 + +>**说明:** +> +>本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + +## 导入模块 + +``` +import sms from '@ohos.telephony.sms'; +``` + +## sms.createMessage + +createMessage\(pdu: Array, specification: string, callback: AsyncCallback\): void + +根据协议数据单元(PDU)和指定的短信协议创建短信实例,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------------- | -------------------------------------------------- | ---- | ------------------------------------------------------------ | + | pdu | Array<number> | 是 | 协议数据单元,从收到的信息中获取。 | + | specification | string | 是 | 短信协议类型。
- 3gpp表示GSM/UMTS/LTE SMS
- 3gpp2表示CDMA SMS | + | callback | AsyncCallback<[ShortMessage](#ShortMessage)> | 是 | 回调函数。 | + +- 示例 + + ``` + let specification = '3gpp'; + let pdu = [0x08, 0x91, ...]; + sms.createMessage(pdu, specification, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sms.createMessage + +createMessage\(pdu: Array, specification: string\): Promise + +根据协议数据单元(PDU)和指定的短信协议创建短信实例,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------------- | ------------------- | ---- | ------------------------------------------------------------ | + | pdu | Array<number> | 是 | 协议数据单元,从收到的信息中获取。 | + | specification | string | 是 | 短信协议类型。
- 3gpp表示GSM/UMTS/LTE SMS
- 3gpp2表示CDMA SMS | + +- 返回值 + + | 类型 | 说明 | + | -------------------------------------------- | --------------------------------- | + | Promise<[ShortMessage](#ShortMessage)> | 以Promise形式返回创建的短信实例。 | + +- 示例 + + ``` + let specification = '3gpp'; + let pdu = [0x08, 0x91, ...]; + let promise = sms.createMessage(pdu, specification); + promise.then(data => { + console.log(`createMessage success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`createMessage fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + +## sms.sendMessage + +sendMessage(options: SendMessageOptions): void + +发送短信。 + +需要ohos.permission.SEND_MESSAGES权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | + | options | [SendMessageOptions](#SendMessageOptions) | 是 | 发送短信的参数和回调,参考[SendMessageOptions](#SendMessageOptions)。 | + +- 示例 + + ``` + let sendCallback = function (err, data) { + console.log(`sendCallback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + } + let deliveryCallback = function (err, data) { + console.log(`deliveryCallback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + } + let slotId = 0; + let content = '短信内容'; + let destinationHost = '+861xxxxxxxxxx'; + let serviceCenter = '+861xxxxxxxxxx'; + let destinationPort = 1000; + let options = {slotId, content, destinationHost, serviceCenter, destinationPort, sendCallback, deliveryCallback}; + sms.sendMessage(options); + ``` + + +## sms.getDefaultSmsSlotId7+ + +getDefaultSmsSlotId\(callback: AsyncCallback\): void + +获取发送短信的默认SIM卡槽ID,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------------- | ---- | ---------------------------------------- | + | callback | AsyncCallback<number> | 是 | 回调函数。
- 0:卡槽1
- 1:卡槽2 | + +- 示例 + + ``` + sms.getDefaultSmsSlotId((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sms.getDefaultSmsSlotId7+ + +getDefaultSmsSlotId\(\): Promise + +获取发送短信的默认SIM卡槽ID,使用Promise方式作为异步方法。 + +- 返回值 + + | 类型 | 说明 | + | --------------- | ------------------------------------------------------------ | + | Promise | 以Promise形式返回发送短信的默认SIM卡:
- 0:卡槽1
- 1:卡槽2 | + +- 示例 + + ``` + let promise = call.getDefaultSmsSlotId(); + promise.then(data => { + console.log(`getDefaultSmsSlotId success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`getDefaultSmsSlotId fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## sms.setSmscAddr7+ + +setSmscAddr\(slotId: number, smscAddr: string, callback: AsyncCallback\): void + +设置短信服务中心(SMSC)地址,使用callback方式作为异步方法。 + +需要ohos.permission.SET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------- | ---- | ----------------------------------------- | + | slotId | number | 是 | SIM卡槽ID:
- 0:卡槽1
- 1:卡槽2 | + | smscAddr | string | 是 | 短信服务中心地址。 | + | callback | AsyncCallback<void> | 是 | 回调函数。 | + +- 示例 + + ``` + let slotId = 0; + let smscAddr = '+861xxxxxxxxxx'; + sms.setSmscAddr(slotId, smscAddr, (err,data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sms.setSmscAddr7+ + +setSmscAddr\(slotId: number, smscAddr: string\): Promise + +设置短信服务中心(SMSC)地址,使用Promise方式作为异步方法。 + +需要ohos.permission.SET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------ | ---- | ----------------------------------------- | + | slotId | number | 是 | SIM卡槽ID:
- 0:卡槽1
- 1:卡槽2 | + | smscAddr | string | 是 | 短信服务中心地址。 | + +- 返回值 + + | 类型 | 说明 | + | ------------------- | ------------------------------- | + | Promise<void> | 以Promise形式异步返回设置结果。 | + +- 示例 + + ``` + let slotId = 0; + let smscAddr = '+861xxxxxxxxxx'; + let promise = sms.setSmscAddr(slotId, smscAddr); + promise.then(data => { + console.log(`setSmscAddr success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`setSmscAddr fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## sms.getSmscAddr7+ + +getSmscAddr\(slotId: number, callback: AsyncCallback\): void + +获取短信服务中心(SMSC)地址,使用callback方式作为异步方法。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------------- | ---- | ----------------------------------------- | + | slotId | number | 是 | SIM卡槽ID:
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback<string> | 是 | 回调函数。 | + +- 示例 + + ``` + let slotId = 0; + sms.getSmscAddr(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sms.getSmscAddr7+ + +getSmscAddr\(slotId: number\): Promise + +获取短信服务中心(SMSC)地址,使用Promise方式作为异步方法。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | ----------------------------------------- | + | slotId | number | 是 | SIM卡槽ID:
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | --------------------- | --------------------------------------------- | + | Promise<string> | 以Promise形式返回获取短信服务中心地址的结果。 | + +- 示例 + + ``` + let slotId = 0; + let promise = sms.getSmscAddr(slotId); + promise.then(data => { + console.log(`getSmscAddr success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`getSmscAddr fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## ShortMessage + +短信实例。 + +| 变量 | 类型 | 说明 | +| ------------------------ | --------------------------------------- | ------------------------------------------------------------ | +| emailAddress | string | 电子邮件地址。 | +| emailMessageBody | string | 电子邮件正文。 | +| hasReplyPath | boolean | 收到的短信是否包含“TP-Reply-Path”,默认为false。
“TP-Reply-Path”:移动电话根据发送SMS消息的短消息中心进行回复。 | +| isEmailMessage | boolean | 收到的短信是否为电子邮件。 | +| isReplaceMessage | boolean | 收到的短信是否为“替换短信”,默认为false。
“替换短信”有关详细信息,参见 “3GPP TS 23.040 9.2.3.9”。 | +| isSmsStatusReportMessage | boolean | 当前消息是否为“短信状态报告”,默认为false。
“短信状态报告”是一种特定格式的短信,被用来从Service Center到Mobile Station传送状态报告。 | +| messageClass | [ShortMessageClass](#ShortMessageClass) | 短信类型。 | +| pdu | Array<number> | SMS消息中的协议数据单元 (PDU)。 | +| protocolId | number | 发送短信时使用的协议标识。 | +| scAddress | string | 短消息服务中心(SMSC)地址。 | +| scTimestamp | number | SMSC时间戳。 | +| status | number | SMS-STATUS-REPORT消息中的短信状态指示短信服务中心(SMSC)发送的短信状态。 | +| userRawData | Array<number> | 除数据头外的用户数据。 | +| visibleMessageBody | string | 短信正文。 | +| visibleRawAddress | string | 发送者地址。 | + + +## ShortMessageClass + +短信类型。 + +| 变量 | 值 | 说明 | +| ---------------- | ---- | ---------------------------------------- | +| UNKNOWN | 0 | 未知类型。 | +| INSTANT_MESSAGE | 1 | 即时消息,收到后立即显示。 | +| OPTIONAL_MESSAGE | 2 | 存储在设备或SIM卡上的短信。 | +| SIM_MESSAGE | 3 | 包含SIM卡信息的短信,需要存储在SIM卡中。 | +| FORWARD_MESSAGE | 4 | 要转发到另一台设备的短信。 | + + +## SendMessageOptions + +发送短信的参数和回调。 + +根据SendMessageOptions中的可选参数content的值判断短信类型。 + +| 参数名 | 类型 | 必填 | 说明 | +| ---------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| slotId | number | 是 | 用于发送短信的SIM卡槽ID:
- 0:卡槽1
- 1:卡槽2 | +| destinationHost | string | 是 | 短信的发送地址。 | +| content | string \| Array<number> | 是 | 如果内容是字符串,则这是一条文本短信。如果内容是字节数组,则这是一条数据短信。 | +| serviceCenter | string | 否 | 短信中心地址。默认使用SIM卡中的短信中心地址。 | +| destinationPort | number | 否 | 如果发送数据消息,destinationPort 是必需的。否则是可选的。 | +| sendCallback | AsyncCallback<[ISendShortMessageCallback](#ISendShortMessageCallback)> | 否 | 短信发送结果回调,返回短信发送的结果,参考[ISendShortMessageCallback](#ISendShortMessageCallback)。 | +| deliveryCallback | AsyncCallback<[IDeliveryShortMessageCallback](#IDeliveryShortMessageCallback)> | 否 | 短信送达结果回调,返回短信递送报告,参考[IDeliveryShortMessageCallback](#IDeliveryShortMessageCallback)。 | + + +## ISendShortMessageCallback + +回调实例。返回短信发送结果、存储已发送短信的URI和是否为长短信的最后一部分。 + +| 参数名 | 类型 | 必填 | 说明 | +| ---------- | ------------------------------- | ---- | ------------------------------------------------------------ | +| isLastPart | boolean | 否 | 指定这是否是长短信的最后一部分。true表示这是长短信的最后一部分,false表示不是。默认为false。 | +| result | [SendSmsResult](#SendSmsResult) | 是 | 短信发送结果。 | +| url | string | 是 | 存储发送短信的URI。 | + + +## IDeliveryShortMessageCallback + +回调实例。返回短信送达报告。 + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------------- | ---- | -------------- | +| pdu | Array<number> | 是 | 短信送达报告。 | + + +## SendSmsResult + +短信发送结果。 + +| 参数名 | 值 | 说明 | +| ------------------------------------ | ---- | ------------------------------------------------------ | +| SEND_SMS_SUCCESS | 0 | 发送短信成功。 | +| SEND_SMS_FAILURE_UNKNOWN | 1 | 发送短信失败,原因未知。 | +| SEND_SMS_FAILURE_RADIO_OFF | 2 | 发送短信失败,原因为调制解调器关机。 | +| SEND_SMS_FAILURE_SERVICE_UNAVAILABLE | 3 | 发送短信失败,原因为网络不可用、不支持发送或接收短信。 | \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/03.SIM\345\215\241\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/03.SIM\345\215\241\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..623bc4746bcb4b8cca41d409633e9c420b16b69f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/03.SIM\345\215\241\347\256\241\347\220\206.md" @@ -0,0 +1,400 @@ +--- +title: SIM卡管理 +permalink: /pages/000b000502 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# SIM卡管理 + +>**说明:** +> +>本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + +## 导入模块 + +``` +import sim from '@ohos.telephony.sim'; +``` + +## sim.getSimIccId + +getSimIccId\(slotId: number, callback: AsyncCallback\): void + +获取指定卡槽SIM卡的ICCID(Integrate Circuit Card Identity),使用callback方式作为异步方法。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------------- | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback<string> | 是 | 回调函数。 | + + +- 示例 + + ``` + sim.getSimIccId(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sim.getSimIccId + +getSimIccId\(slotId: number\): Promise + +获取指定卡槽SIM卡的ICCID(Integrate Circuit Card Identity),使用Promise方式作为异步方法。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | --------------------- | ---------------------------------- | + | Promise<string> | 以Promise形式返回指定卡槽的ICCID。 | + +- 示例 + + ``` + let promise = sim.getSimIccId(0); + promise.then(data => { + console.log(`getSimIccId success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getSimIccId fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + +## sim.getDefaultVoiceSlotId7+ + +getDefaultVoiceSlotId\(callback: AsyncCallback\): void + +获取默认语音业务的卡槽ID,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | --------------------------- | ---- | ---------- | + | callback | AsyncCallback<number> | 是 | 回调函数。 | + +- 示例 + + ``` + sim.getDefaultVoiceSlotId((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sim.getDefaultVoiceSlotId7+ + +getDefaultVoiceSlotId\(\): Promise + +获取默认语音业务的卡槽ID,使用Promise方式作为异步方法。 + +- 返回值 + + | 类型 | 说明 | + | ----------------- | --------------------------------------- | + | Promise\ | 以Promise形式返回默认语音业务的卡槽ID。 | + +- 示例 + + ``` + let promise = sim.getDefaultVoiceSlotId(); + promise.then(data => { + console.log(`getDefaultVoiceSlotId success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getDefaultVoiceSlotId fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + +## sim.getISOCountryCodeForSim + +getISOCountryCodeForSim\(slotId: number, callback: AsyncCallback\): void + +获取指定卡槽SIM卡的ISO国家码,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------- | ---- | ---------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback\ | 是 | 回调函数。返回国家码,例如:CN(中国)。 | + +- 示例 + + ``` + sim.getISOCountryCodeForSim(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sim.getISOCountryCodeForSim + +getISOCountryCodeForSim\(slotId: number\): Promise + +获取指定卡槽SIM卡的ISO国家码,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | ----------------- | ------------------------------------------------------------ | + | Promise\ | 以Promise形式返回获取指定卡槽SIM卡的ISO国家码,例如:CN(中国)。 | + +- 示例 + + ``` + let promise = sim.getISOCountryCodeForSim(0); + promise.then(data => { + console.log(`getISOCountryCodeForSim success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getISOCountryCodeForSim fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## sim.getSimOperatorNumeric + +getSimOperatorNumeric\(slotId: number, callback: AsyncCallback\): void + +获取指定卡槽SIM卡的归属PLMN(Public Land Mobile Network)号,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------- | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + sim.getSimOperatorNumeric(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sim.getSimOperatorNumeric + +getSimOperatorNumeric\(slotId: number\): Promise + +获取指定卡槽SIM卡的归属PLMN(Public Land Mobile Network)号,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | ----------------- | ------------------------------------------------ | + | Promise\ | 以Promise形式返回获取指定卡槽SIM卡的归属PLMN号。 | + +- 示例 + + ``` + let promise = sim.getSimOperatorNumeric(0); + promise.then(data => { + console.log(`getSimOperatorNumeric success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getSimOperatorNumeric fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## sim.getSimSpn + +getSimSpn\(slotId: number, callback: AsyncCallback\): void + +获取指定卡槽SIM卡的服务提供商名称(Service Provider Name,SPN),使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------- | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + sim.getSimSpn(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sim.getSimSpn + +getSimSpn\(slotId: number\): Promise + +获取指定卡槽SIM卡的服务提供商名称(Service Provider Name,SPN),使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | ----------------- | ----------------------------------------- | + | Promise\ | 以Promise形式返回获取指定卡槽SIM卡的SPN。 | + +- 示例 + + ``` + let promise = sim.getSimSpn(0); + promise.then(data => { + console.log(`getSimSpn success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getSimSpn fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## sim.getSimState + +getSimState\(slotId: number, callback: AsyncCallback\): void + +获取指定卡槽的SIM卡状态,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------------------------------------- | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback\<[SimState](#SimState)\> | 是 | 回调函数。参考[SimState](#SimState)。 | + +- 示例 + + ``` + sim.getSimState(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sim.getSimState + +getSimState\(slotId: number\): Promise + +获取指定卡槽的SIM卡状态,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | -------------------------------- | ------------------------------------------ | + | Promise\<[SimState](#SimState)\> | 以Promise形式返回获取指定卡槽的SIM卡状态。 | + +- 示例 + + ``` + let promise = sim.getSimState(0); + promise.then(data => { + console.log(`getSimState success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getSimState fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + +## sim.getSimGid1 + +getSimGid1\(slotId: number, callback: AsyncCallback\): void + +获取指定卡槽SIM卡的GID1\(Group Identifier Level 1\),使用callback方式作为异步方法。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------- | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback\ | 是 | 回调函数。 | + +- 示例 + + ``` + sim.getSimGid1(0, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## sim.getSimGid1 + +getSimGid1\(slotId: number\): Promise + +获取指定卡槽SIM卡的GID1\(Group Identifier Level 1\),使用Promise方式作为异步方法。 + +需要ohos.permission.GET\_TELEPHONY\_STATE权限,该权限为系统权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | ----------------- | ------------------------------------------------------------ | + | Promise\ | 以Promise形式返回获取指定卡槽SIM卡的GID1(Group Identifier Level 1)。 | + +- 示例 + + ``` + let promise = sim.getSimGid1(0); + promise.then(data => { + console.log(`getSimGid1 success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getSimGid1 fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## SimState + +SIM卡状态。 + +| 变量 | 说明 | +| --------------------- | ---------------------------------------------------------- | +| SIM_STATE_UNKNOWN | SIM卡状态未知,即无法获取准确的状态。 | +| SIM_STATE_NOT_PRESENT | 表示SIM卡处于not present状态,即卡槽中没有插入SIM卡。 | +| SIM_STATE_LOCKED | 表示SIM卡处于locked状态,即SIM卡被PIN、PUK或网络锁锁定。 | +| SIM_STATE_NOT_READY | 表示SIM卡处于not ready状态,即SIM卡在位但无法正常工作。 | +| SIM_STATE_READY | 表示SIM卡处于ready状态,即SIM卡在位且工作正常。 | +| SIM_STATE_LOADED | 表示SIM卡处于loaded状态,即SIM卡在位且所有卡文件加载完毕。 | \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/04.\347\275\221\347\273\234\346\220\234\347\264\242.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/04.\347\275\221\347\273\234\346\220\234\347\264\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..6869bb32849704760312f9cfdfa741f2ce56d01e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/06.\347\224\265\350\257\235\346\234\215\345\212\241/04.\347\275\221\347\273\234\346\220\234\347\264\242.md" @@ -0,0 +1,472 @@ +--- +title: 网络搜索 +permalink: /pages/000b000503 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 网络搜索 + +>**说明:** +> +>本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import radio from '@ohos.telephony.radio' +``` + +## radio.getRadioTech + +getRadioTech\(slotId: number, callback: AsyncCallback<\{psRadioTech: RadioTechnology, csRadioTech: RadioTechnology\}\>\): void + +获取当前接入的CS域和PS域无线接入技术,使用callback方式作为异步方法。 + +需要ohos.permission.GET\_NETWORK\_INFO权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback\<{psRadioTech: [RadioTechnology](#RadioTechnology), csRadioTech:[RadioTechnology](#RadioTechnology)}\> | 是 | 回调函数。 | + +- 示例 + + ``` + let slotId = 0; + radio.getRadioTech(slotId, (err, data) =>{ + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## radio.getRadioTech + +getRadioTech\(slotId: number\): Promise<\{psRadioTech: RadioTechnology, csRadioTech: RadioTechnology\}\> + +获取当前接入的CS域和PS域无线接入技术,使用Promise方式作为异步方法。 + +需要ohos.permission.GET\_NETWORK\_INFO权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | ------------------------------------------------------------ | ----------------------------------------------- | + | Promise<{psRadioTech: [RadioTechnology](#RadioTechnology), csRadioTech: [RadioTechnology](#RadioTechnology)}> | 以Promise形式返回获取当前接入的CS域和PS域技术。 | + +- 示例 + + ``` + let slotId = 0; + let promise = radio.getRadioTech(slotId); + promise.then(data => { + console.log(`getRadioTech success, data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getRadioTech fail, err->${JSON.stringify(err)}`); + }); + ``` + + +## radio.getNetworkState + +getNetworkState\(callback: AsyncCallback\): void + +获取网络状态,使用callback方式作为异步方法。 + +需要ohos.permission.GET\_NETWORK\_INFO权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------------------------------- | ---- | ---------- | + | callback | AsyncCallback\<[NetworkState](#NetworkState)\> | 是 | 回调函数。 | + +- 示例 + + ``` + radio.getNetworkState((err, data) =>{ + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## radio.getNetworkState + +getNetworkState\(slotId: number, callback: AsyncCallback\): void + +获取网络状态,使用callback方式作为异步方法。 + +需要ohos.permission.GET\_NETWORK\_INFO权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ---------------------------------------------- | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback\<[NetworkState](#NetworkState)\> | 是 | 回调函数。 | + +- 示例 + + ``` + let slotId = 0; + radio.getNetworkState(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## radio.getNetworkState + +getNetworkState\(slotId?: number\): Promise + +获取网络状态,使用Promise方式作为异步方法。 + +需要ohos.permission.GET\_NETWORK\_INFO权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 否 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | ---------------------------------------- | --------------------------- | + | Promise\<[NetworkState](#NetworkState)\> | 以Promise形式返回网络状态。 | + +- 示例 + + ``` + let slotId = 0; + let promise = radio.getNetworkState(slotId); + promise.then(data => { + console.log(`getNetworkState success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getNetworkState fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## radio.getNetworkSelectionMode + +getNetworkSelectionMode\(slotId: number, callback: AsyncCallback\): void + +获取当前选网模式,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback\<[NetworkSelectionMode](#NetworkSelectionMode)\> | 是 | 回调函数。 | + +- 示例 + + ``` + let slotId = 0; + radio.getNetworkSelectionMode(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## radio.getNetworkSelectionMode + +getNetworkSelectionMode\(slotId: number\): Promise + +获取当前选网模式,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | -------------------------------------------------------- | ------------------------------- | + | Promise\<[NetworkSelectionMode](#NetworkSelectionMode)\> | 以Promise形式返回当前选网模式。 | + +- 示例 + + ``` + let slotId = 0; + let promise = radio.getNetworkSelectionMode(slotId); + promise.then(data => { + console.log(`getNetworkSelectionMode success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getNetworkSelectionMode fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## radio.getISOCountryCodeForNetwork7+ + +getISOCountryCodeForNetwork\(slotId: number, callback: AsyncCallback\): void + +获取注册网络所在国家的ISO国家码,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ----------------------- | ---- | ---------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback\ | 是 | 回调函数。返回国家码,例如:CN(中国)。 | + +- 示例 + + ``` + let slotId = 0; + radio.getISOCountryCodeForNetwork(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## radio.getISOCountryCodeForNetwork7+ + +getISOCountryCodeForNetwork\(slotId: number\): Promise + +获取注册网络所在国家的ISO国家码,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | ----------------- | ------------------------------------------------------------ | + | Promise\ | 以Promise形式返回注册网络所在国家的ISO国家码,例如CN(中国)。 | + +- 示例 + + ``` + let slotId = 0; + let promise = radio.getISOCountryCodeForNetwork(slotId); + promise.then(data => { + console.log(`getISOCountryCodeForNetwork success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.log(`getISOCountryCodeForNetwork fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## radio.getSignalInformation + +getSignalInformation\(slotId: number, callback: AsyncCallback\>\): void + +获取指定SIM卡槽对应的注册网络信号强度信息列表,使用callback方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + | callback | AsyncCallback\\> | 是 | 回调函数,返回[SignalInformation](#SignalInformation)对象的数组。 | + +- 示例 + + ``` + let slotId = 0; + radio.getSignalInformation(slotId, (err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## radio.getSignalInformation + +getSignalInformation\(slotId: number\): Promise\> + +获取指定SIM卡槽对应的注册网络信号强度信息列表,使用Promise方式作为异步方法。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | ------ | ------ | ---- | -------------------------------------- | + | slotId | number | 是 | 卡槽ID。
- 0:卡槽1
- 1:卡槽2 | + +- 返回值 + + | 类型 | 说明 | + | ----------------------------------------------------------- | ------------------------------------------------------------ | + | Promise\\> | 以Promise形式返回网络信号强度[SignalInformation](#SignalInformation)对象的数组。 | + +- 示例 + + ``` + let slotId = 0; + let promise = radio.getSignalInformation(slotId); + promise.then(data => { + console.log(`getSignalInformation success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`getSignalInformation fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## radio.isRadioOn7+ + +isRadioOn\(callback: AsyncCallback\): void + +判断Radio是否打开,使用callback方式作为异步方法。 + +需要ohos.permission.GET\_NETWORK\_INFO权限。 + +- 参数 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | ------------------------ | ---- | ------------------------------------------------------- | + | callback | AsyncCallback\ | 是 | 回调函数。
- true:Radio打开
- false:Radio关闭 | + +- 示例 + + ``` + radio.isRadioOn((err, data) => { + console.log(`callback: err->${JSON.stringify(err)}, data->${JSON.stringify(data)}`); + }); + ``` + + +## radio.isRadioOn7+ + +isRadioOn\(\): Promise + +判断Radio是否打开,使用Promise方式作为异步方法。 + +需要ohos.permission.GET\_NETWORK\_INFO权限。 + +- 返回值 + + | 类型 | 说明 | + | ------------------ | ------------------------------------------------------------ | + | Promise\ | 以Promise形式返回判断Radio是否打开的结果。
- true:Radio打开
- false:Radio关闭 | + +- 示例 + + ``` + let promise = radio.isRadioOn(); + promise.then(data => { + console.log(`isRadioOn success, promise: data->${JSON.stringify(data)}`); + }).catch(err => { + console.error(`isRadioOn fail, promise: err->${JSON.stringify(err)}`); + }); + ``` + + +## RadioTechnology + +无线接入技术。 + +| 变量 | 值 | 说明 | +| ------------------------- | ---- | ------------------------------------------------------------ | +| RADIO_TECHNOLOGY_UNKNOWN | 0 | 未知无线接入技术(RAT)。 | +| RADIO_TECHNOLOGY_GSM | 1 | 无线接入技术GSM(Global System For Mobile Communication)。 | +| RADIO_TECHNOLOGY_1XRTT | 2 | 无线接入技术1XRTT(Single-Carrier Radio Transmission Technology)。 | +| RADIO_TECHNOLOGY_WCDMA | 3 | 无线接入技术WCDMA(Wideband Code Division Multiple Access)。 | +| RADIO_TECHNOLOGY_HSPA | 4 | 无线接入技术HSPA(High Speed Packet Access)。 | +| RADIO_TECHNOLOGY_HSPAP | 5 | 无线接入技术HSPAP(High Speed packet access (HSPA+) )。 | +| RADIO_TECHNOLOGY_TD_SCDMA | 6 | 无线接入技术TDSCDMA(TimeDivision-Synchronous Code Division Multiple Access)。 | +| RADIO_TECHNOLOGY_EVDO | 7 | 无线接入技术EVDO(Evolution、Data Only)。 | +| RADIO_TECHNOLOGY_EHRPD | 8 | 无线接入技术EHRPD(Evolved High Rate Package Data)。 | +| RADIO_TECHNOLOGY_LTE | 9 | 无线接入技术LTE(Long Term Evolution)。 | +| RADIO_TECHNOLOGY_LTE_CA | 10 | 无线接入技术LTE_CA(Long Term Evolution_Carrier Aggregation)。 | +| RADIO_TECHNOLOGY_IWLAN | 11 | 无线接入技术IWLAN(Industrial Wireless LAN)。 | +| RADIO_TECHNOLOGY_NR | 12 | 无线接入技术NR(New Radio)。 | + + +## SignalInformation + +网络信号强度信息对象。 + +| 属性名 | 类型 | 说明 | +| ----------- | --------------------------- | ------------------ | +| signalType | [NetworkType](#NetworkType) | 网络信号强度类型。 | +| signalLevel | number | 网络信号强度等级。 | + + +## NetworkType + +网络类型。 + +| 变量 | 值 | 说明 | +| -------------------- | ---- | ------------------------------------------------------------ | +| NETWORK_TYPE_UNKNOWN | 0 | 未知网络类型。 | +| NETWORK_TYPE_GSM | 1 | 网络类型为GSM(Global System For Mobile Communication)。 | +| NETWORK_TYPE_CDMA | 2 | 网络类型为CDMA(Code Division Multiple Access)。 | +| NETWORK_TYPE_WCDMA | 3 | 网络类型为WCDMA(Wideband Code Division Multiple Access)。 | +| NETWORK_TYPE_TDSCDMA | 4 | 网络类型为TDSCDMA(TimeDivision-Synchronous Code Division Multiple Access)。 | +| NETWORK_TYPE_LTE | 5 | 网络类型为LTE(Long Term Evolution)。 | +| NETWORK_TYPE_NR | 6 | 网络类型为5G NR(New Radio)。 | + +## NetworkState + +网络注册状态。 + +| 变量 | 类型 | 说明 | +| ----------------- | --------------------- | ------------------------------ | +| longOperatorName | string | 注册网络的长运营商名称。 | +| shortOperatorName | string | 注册网络的短运营商名称。 | +| plmnNumeric | string | 注册网络的PLMN码。 | +| isRoaming | boolean | 是否处于漫游状态。 | +| regState | [RegState](#RegState) | 设备的网络注册状态。 | +| nsaState | [NsaState](#NsaState) | 设备的NSA网络注册状态。 | +| isCaActive | boolean | CA的状态。 | +| isEmergency | boolean | 此设备是否只允许拨打紧急呼叫。 | + + +## RegState + +网络注册状态。 + +| 变量 | 值 | 说明 | +| ----------------------------- | ---- | -------------------------- | +| REG_STATE_NO_SERVICE | 0 | 设备不能使用任何服务。 | +| REG_STATE_IN_SERVICE | 1 | 设备可以正常使用业务。 | +| REG_STATE_EMERGENCY_CALL_ONLY | 2 | 设备只能使用紧急呼叫业务。 | +| REG_STATE_POWER_OFF | 3 | 蜂窝无线电已关闭。 | + + +## NsaState + +非独立组网状态。 + +| 变量 | 值 | 说明 | +| -------------------------- | ---- | ---------------------------------------------------------- | +| NSA_STATE_NOT_SUPPORT | 1 | 设备在不支持NSA的LTE小区下处于空闲状态或连接状态。 | +| NSA_STATE_NO_DETECT | 2 | 在支持NSA但不支持NR覆盖检测的LTE小区下,设备处于空闲状态。 | +| NSA_STATE_CONNECTED_DETECT | 3 | 设备在LTE小区下连接到LTE网络支持NSA和NR覆盖检测。 | +| NSA_STATE_IDLE_DETECT | 4 | 支持NSA和NR覆盖检测的LTE小区下设备处于空闲状态。 | +| NSA_STATE_DUAL_CONNECTED | 5 | 设备在支持NSA的LTE小区下连接到LTE + NR网络。 | +| NSA_STATE_SA_ATTACHED | 6 | 设备在5GC附着时在NG-RAN小区下空闲或连接到NG-RAN小区。 | + + +## NetworkSelectionMode + +选网模式。 + +| 变量 | 值 | 说明 | +| --------------------------- | ---- | -------------- | +| NETWORK_SELECTION_UNKNOWN | 0 | 未知选网模式。 | +| NETWORK_SELECTION_AUTOMATIC | 1 | 自动选网模式。 | +| NETWORK_SELECTION_MANUAL | 2 | 手动选网模式。 | \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/07.\347\275\221\347\273\234\344\270\216\350\277\236\346\216\245/01.WLAN.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/07.\347\275\221\347\273\234\344\270\216\350\277\236\346\216\245/01.WLAN.md" new file mode 100644 index 0000000000000000000000000000000000000000..241a809d42c8b62b55431f03c770ae67e7d87812 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/07.\347\275\221\347\273\234\344\270\216\350\277\236\346\216\245/01.WLAN.md" @@ -0,0 +1,137 @@ +--- +title: WLAN +permalink: /pages/000b000600 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# WLAN + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + +## 导入模块 + +``` +import wifi from '@ohos.wifi_native_js'; +``` + +## wifi.isWifiActive + +isWifiActive(): boolean + +查询WLAN是否已激活。 + +**返回值:** + +| **类型** | **说明** | +| -------- | ---------------------------- | +| boolean | true:已激活, false:未激活。 | + +## wifi.getSignalLevel + +getSignalLevel(rssi: number, band: number): number + +查询WLAN信号强度。 + +**参数:** + +| **参数名** | **类型** | **必填** | **说明** | +| ---------- | -------- | -------- | --------------------- | +| rssi | number | 是 | 热点的信号强度(dBm)。 | +| band | number | 是 | WLAN接入点的频段。 | + +**返回值:** + +| **类型** | **说明** | +| -------- | ---------------------------- | +| number | 信号强度,取值范围为[0, 4]。 | + +## wifi.scan + +scan(): boolean + +启动WLAN扫描。 + +**返回值:** + +| **类型** | **说明** | +| -------- | -------------------------------------------- | +| boolean | true:扫描操作成功, false:扫描操作执行失败。 | + +## wifi.getScanInfos + +getScanInfos(): Promise> + +获取扫描结果,使用promise方式作为异步方法。 + +**返回值:** + +| **类型** | **说明** | +| ------------------------------------------------ | ---------------------- | +| Promise< Array\<[WifiScanInfo](#wifiscaninfo)> > | 返回扫描到的热点列表。 | + +## wifi.getScanInfos + +getScanInfos(callback: AsyncCallback>): void + +获取扫描结果,使用callback方式作为异步方法。 + +| **参数名** | **类型** | **必填** | **说明** | +| ---------- | ----------------------------------------------------- | -------- | ------------------------------ | +| callback | AsyncCallback< Array\<[WifiScanInfo](#wifiscaninfo)>> | 是 | 扫描到的热点列表结果回调函数。 | + +**示例:** + +``` +import wifi from '@ohos.wifi_native_js'; + + +wifi.getScanInfos(result => { + var len = Object.keys(result).length; + console.log("received scan info size: " + len); + for (var i = 0; i < len; ++j) { + console.info("ssid: " + result[i].ssid); + console.info("bssid: " + result[i].bssid); + console.info("securityType: " + result[i].securityType); + console.info("rssi: " + result[i].rssi); + console.info("band: " + result[i].band); + console.info("frequency: " + result[i].frequency); + console.info("timestamp: " + result[i].timestamp); + } +}); + +wifi.getScanInfos().then(result => { + var len = Object.keys(result).length; + console.log("received scan info size: " + len); + for (var i = 0; i < len; ++i) { + console.info("ssid: " + result[i].ssid); + console.info("bssid: " + result[i].bssid); + console.info("securityType: " + result[i].securityType); + console.info("rssi: " + result[i].rssi); + console.info("band: " + result[i].band); + console.info("frequency: " + result[i].frequency); + console.info("timestamp: " + result[i].timestamp); + } +}); +``` + +## WifiScanInfo + +WLAN热点信息。 + +| **参数名** | **类型** | **读写属性** | **说明** | +| ------------ | ---------------- | ------------ | ----------------------------- | +| ssid | string | 只读 | 热点的SSID,编码格式为UTF-8。 | +| bssid | string | 只读 | 热点的BSSID。 | +| securityType | WifiSecurityType | 只读 | WLAN加密类型。 | +| rssi | number | 只读 | 热点的信号强度(dBm)。 | +| band | number | 只读 | WLAN接入点的频段。 | +| frequency | number | 只读 | WLAN接入点的频率。 | +| timestamp | number | 只读 | 时间戳。 | \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/01.\344\274\240\346\204\237\345\231\250.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/01.\344\274\240\346\204\237\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..d7a8af4541758ec45837e858d3e68288f43b6069 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/01.\344\274\240\346\204\237\345\231\250.md" @@ -0,0 +1,1580 @@ +--- +title: 传感器 +permalink: /pages/000b000700 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 传感器 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import sensor from '@ohos.sensor'; +``` + + +## 权限列表 + +计步器:ohos.permission.ACTIVITY_MOTION + +心率:ohos.permission.READ_HEALTH_DATA + +加速度:ohos.permission.ACCELEROMETER + +陀螺仪:ohos.permission.GYROSCOPE + + +## sensor.on(SensorType.SENSOR_TYPE_ID_ACCELEROMETER) + +on(type: SensorType.SENSOR_TYPE_ID_ACCELEROMETER, callback: AsyncCallback<AccelerometerResponse>,options?: Options): void + + +监听加速度传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的加速度传感器类型为SENSOR_TYPE_ID_ACCELEROMETER。 | + | callback | AsyncCallback<[AccelerometerResponse](#accelerometerresponse)> | 是 | 注册加速度传感器的回调函数,上报的数据类型为AccelerometerResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type:SensorType.SENSOR_TYPE_ID_ACCELEROMETER,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + }, + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_LINEAR_ACCELERATION) + +on(type:SensorType.SENSOR_TYPE_ID_LINEAR_ACCELERATION,callback:AsyncCallback<LinearAccelerometerResponse>, options?: Options): void + +监听线性加速度传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的线性加速度传感器类型为SENSOR_TYPE_ID_LINEAR_ACCELERATION。 | + | callback | AsyncCallback<[LinearAccelerometerResponse](#linearaccelerometerresponse)> | 是 | 注册线性加速度传感器的回调函数,上报的数据类型为LinearAccelerometerResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type:SensorType.SENSOR_TYPE_ID_LINEAR_ACCELEROMETER,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED) + +on(type:SensorType.SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED,callback:AsyncCallback<AccelerometerUncalibratedResponse>, options?: Options): void + +监听未校准加速度计传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的未校准加速度计传感器类型为SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED。 | + | callback | AsyncCallback<[AccelerometerUncalibratedResponse](#accelerometeruncalibratedresponse)> | 是 | 注册未校准加速度计传感器的回调函数,上报的数据类型为AccelerometerUncalibratedResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type:SensorType.SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + //打印data在x,y,z轴坐标的偏移量 + console.info('X-coordinate bias: ' + data.biasX); + console.info('Y-coordinate bias: ' + data.biasY); + console.info('Z-coordinate bias: ' + data.biasZ); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_GRAVITY) + +on(type: SensorType.SENSOR_TYPE_ID_GRAVITY, callback: AsyncCallback<GravityResponse>,options?: Options): void + +监听重力传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的重力传感器类型为SENSOR_TYPE_ID_GRAVITY。 | + | callback | AsyncCallback<[GravityResponse](#gravityresponse)> | 是 | 注册重力传感器的回调函数,上报的数据类型为GravityResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type:SensorType.SENSOR_TYPE_ID_GRAVITY,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_GYROSCOPE) + +on(type: SensorType.SENSOR_TYPE_ID_GYROSCOPE, callback: AsyncCallback<GyroscopeResponse>, options?: Options): void + +监听陀螺仪传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的陀螺仪传感器类型为SENSOR_TYPE_ID_GYROSCOPE。 | + | callback | AsyncCallback<[GyroscopeResponse](#gyroscoperesponse)> | 是 | 注册陀螺仪传感器的回调函数,上报的数据类型为GyroscopeResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type:SensorType.SENSOR_TYPE_ID_GUROSCOPE,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED) + +on(type:SensorType.SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED,callback:AsyncCallback<GyroscopeUncalibratedResponse>, options?: Options): void + +监听未校准陀螺仪传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的未校准陀螺仪传感器类型为SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED。 | + | callback | AsyncCallback<[GyroscopeUncalibratedResponse](#gyroscopeuncalibratedresponse)> | 是 | 注册未校准陀螺仪传感器的回调函数,上报的数据类型为GyroscopeUncalibratedResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + //打印data的x,y,z轴坐标的偏移量 + console.info('X-coordinate bias: ' + data.biasX); + console.info('Y-coordinate bias: ' + data.biasY); + console.info('Z-coordinate bias: ' + data.biasZ); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_SIGNIFICANT_MOTION) + +on(type: SensorType.SENSOR_TYPE_ID_SIGNIFICANT_MOTION, callback: AsyncCallback<SignificantMotionResponse>, options?: Options): void + +监听有效运动传感器数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的有效运动传感器类型为SENSOR_TYPE_ID_SIGNIFICANT_MOTION。 | + | callback | AsyncCallback<[SignificantMotionResponse](#significantmotionresponse)> | 是 | 注册有效运动传感器的回调函数,上报的数据类型为SignificantMotionResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_SIGNIFICANT_MOTION,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + console.info('Scalar data: ' + data.scalar); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_PEDOMETER_DETECTION) + +on(type: SensorType.SENSOR_TYPE_ID_PEDOMETER_DETECTION, callback: AsyncCallback<PedometerDetectResponse>, options?: Options): void + +监听计步检测传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的计步检测传感器类型为SENSOR_TYPE_ID_PEDOMETER_DETECTION。 | + | callback | AsyncCallback<[PedometerDetectResponse](#pedometerdetectresponse)> | 是 | 注册计步检测传感器的回调函数,上报的数据类型为PedometerDetectResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_PEDOMETER_DETECTION,function(error,data){ + if (error) { + console.error(""Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + console.info('Scalar data: ' + data.scalar); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_PEDOMETER) + +on(type: SensorType.SENSOR_TYPE_ID_PEDOMETER, callback: AsyncCallback<PedometerResponse>, options?: Options): void + +监听计步传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的计步传感器类型为SENSOR_TYPE_ID_PEDOMETER。 | + | callback | AsyncCallback<[PedometerResponse](#pedometerresponse)> | 是 | 注册计步传感器的回调函数,上报的数据类型为PedometerResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_PEDOMETER,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的步数 + console.info('Steps: ' + data.steps); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_AMBIENT_TEMPERATURE) + +on(type:SensorType.SENSOR_TYPE_ID_AMBIENT_TEMPERATURE,callback:AsyncCallback<AmbientTemperatureResponse>, options?: Options): void + +监听环境温度传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的环境温度传感器类型为SENSOR_TYPE_ID_AMBIENT_TEMPERATURE。 | + | callback | AsyncCallback<[AmbientTemperatureResponse](#ambienttemperatureresponse)> | 是 | 注册环境温度传感器的回调函数,上报的数据类型为AmbientTemperatureResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_AMBIENT_TEMPERATURE,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的温度值 + console.info('Temperature: ' + data.temperature); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD) + +on(type: SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD, callback: AsyncCallback<MagneticFieldResponse>,options?: Options): void + +监听磁场传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的磁场传感器类型为SENSOR_TYPE_ID_MAGNETIC_FIELD。 | + | callback | AsyncCallback<[MagneticFieldResponse](#magneticfieldresponse)> | 是 | 注册磁场传感器的回调函数,上报的数据类型为MagneticFieldResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED) + +on(type:SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED,callback:AsyncCallback<MagneticFieldUncalibratedResponse>, options: Options): void + +监听未校准磁场传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的未校准磁场传感器类型为SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED。 | + | callback | AsyncCallback<[MagneticFieldUncalibratedResponse](#magneticfielduncalibratedresponse)> | 是 | 注册未校准磁场传感器的回调函数,上报的数据类型为MagneticFieldUncalibratedResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + ensor.on(type: SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + //打印data的x,y,z轴坐标的偏移量 + console.info('X-coordinate bias: ' + data.biasX); + console.info('Y-coordinate bias: ' + data.biasY); + console.info('Z-coordinate bias: ' + data.biasZ); + } + {interval: 10000000} //设置数据的上报频率。 + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_PROXIMITY) + +on(type: SensorType.SENSOR_TYPE_ID_PROXIMITY, callback: AsyncCallback<ProximityResponse>,options?: Options): void + +监听接近光传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的接近光传感器类型为SENSOR_TYPE_ID_PROXIMITY。 | + | callback | AsyncCallback<[ProximityResponse](#proximityresponse)> | 是 | 注册接近光传感器的回调函数,上报的数据类型为ProximityResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_PROXIMITY,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的距离值 + console.info('Distance: ' + data.distance); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_HUMIDITY) + +on(type: SensorType.SENSOR_TYPE_ID_HUMIDITY, callback: AsyncCallback<HumidityResponse>,options?: Options): void + +监听湿度传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的湿度传感器类型为SENSOR_TYPE_ID_HUMIDITY。 | + | callback | AsyncCallback<[HumidityResponse](#humidityresponse)> | 是 | 注册湿度传感器的回调函数,上报的数据类型为HumidityResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_HUMIDITY,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的湿度值 + console.info('Humidity: ' + data.humidity); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_BAROMETER) + +on(type: SensorType.SENSOR_TYPE_ID_BAROMETER, callback: AsyncCallback<BarometerResponse>,options?: Options): void + +监听气压计传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的气压计传感器类型为SENSOR_TYPE_ID_BAROMETER。 | + | callback | AsyncCallback<[BarometerResponse](#barometerresponse)> | 是 | 注册气压计传感器的回调函数,上报的数据类型为BarometerResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_BAROMETER,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的压强值 + console.info('Atmospheric pressure: ' + data.pressure); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_HALL) + +on(type: SensorType.SENSOR_TYPE_ID_HALL, callback: AsyncCallback<HallResponse>, options?: Options): void + +监听霍尔传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的霍尔传感器类型为SENSOR_TYPE_ID_HALL。 | + | callback | AsyncCallback<[HallResponse](#hallresponse)> | 是 | 注册霍尔传感器的回调函数,上报的数据类型为 HallResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_HALL,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的状态值 + console.info('Status: ' + data.status); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_AMBIENT_LIGHT) + +on(type: SensorType.SENSOR_TYPE_ID_AMBIENT_LIGHT, callback: AsyncCallback<LightResponse>, options?: Options): void + +监听环境光传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的环境光传感器类型为SENSOR_TYPE_ID_AMBIENT_LIGHT。 | + | callback | AsyncCallback<[LightResponse](#lightresponse)> | 是 | 注册环境光传感器的回调函数,上报的数据类型为LightResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_AMBIENT_LIGHT,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的光强值 + console.info(''Illumination: ' + data.intensity); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_ORIENTATION) + +on(type: SensorType.SENSOR_TYPE_ID_ORIENTATION, callback: AsyncCallback<OrientationResponse>, options?: Options): void + +监听方向传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的方向传感器类型为SENSOR_TYPE_ID_ORIENTATION | + | callback | AsyncCallback<[OrientationResponse](#orientationresponse)> | 是 | 注册方向传感器的回调函数,上报的数据类型为OrientationResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_ORIENTATION,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_ROTATION_VECTOR) + +on(type:SensorType.SENSOR_TYPE_ID_ROTATION_VECTOR,callback:AsyncCallback<RotationVectorResponse>,options?: Options): void + +监听旋转矢量传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的旋转矢量传感器类型为SENSOR_TYPE_ID_ROTATION_VECTOR。 | + | callback | AsyncCallback<[RotationVectorResponse](#rotationvectorresponse)> | 是 | 注册旋转矢量传感器的回调函数,上报的数据类型为RotationVectorResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_ROTATION_VECTOR,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + {interval: 10000000} + ); + ``` + + +## sensor.on(SensorType.SENSOR_TYPE_ID_WEAR_DETECTION) + +on(type: SensorType.SENSOR_TYPE_ID_WEAR_DETECTION, callback: AsyncCallback<WearDetectionResponse>,options?: Options): void + +监听佩戴检测传感器的数据变化。如果多次调用该接口,仅最后一次调用生效。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要订阅的佩戴检测传感器类型为SENSOR_TYPE_ID_WEAR_DETECTION。 | + | callback | AsyncCallback<[WearDetectionResponse](#weardetectionresponse)> | 是 | 注册佩戴检测传感器的回调函数,上报的数据类型为WearDetectionResponse。 | + | options | [Options](#options) | 否 | 可选参数列表,设置上报频率,默认值为200000000ns。 | + +- 示例: + ``` + sensor.on(type: SensorType.SENSOR_TYPE_ID_WEAR_DETECTION,function(error,data){ + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的佩戴状态 + console.info('Wear status: ' + data.value); + } + {interval: 10000000} + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_ACCELEROMETER) + +once(type: SensorType.SENSOR_TYPE_ID_ACCELEROMETER, callback: AsyncCallback<AccelerometerResponse>): void + +监听加速度传感器的数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 加速度传感器类型为SENSOR_TYPE_ID_ACCELEROMETER。 | + | callback | AsyncCallback<[AccelerometerResponse](#accelerometerresponse)> | 是 | 注册一次加速度传感器的回调函数,上报的数据类型为AccelerometerResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_ACCELEROMETER, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_LINEAR_ACCELERATION) + +once(type:SensorType.SENSOR_TYPE_ID_LINEAR_ACCELERATION,callback:AsyncCallback<LinearAccelerometerResponse>): void + +监听线性加速度传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 线性加速度传感器类型为SENSOR_TYPE_ID_LINEAR_ACCELERATION。 | + | callback | AsyncCallback<[LinearAccelerometerResponse](#linearaccelerometerresponse)> | 是 | 注册一次线性加速度传感器的回调函数,上报的数据类型为LinearAccelerometerResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_LINEAR_ACCELERATION, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED) + +once(type:SensorType.SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED,callback:AsyncCallback<AccelerometerUncalibratedResponse>): void + +监听未校准加速度传感器的数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 未校准加速度传感器类型为SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED。 | + | callback | AsyncCallback<[AccelerometerUncalibratedResponse](#accelerometeruncalibratedresponse)> | 是 | 注册一次未校准加速度传感器的回调函数,上报的数据类型为AccelerometerUncalibratedResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + //打印data的x,y,z轴坐标的偏移量 + console.info('X-coordinate bias: ' + data.biasX); + console.info('Y-coordinate bias: ' + data.biasY); + console.info('Z-coordinate bias: ' + data.biasZ); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_GRAVITY) + +once(type: SensorType.SENSOR_TYPE_ID_GRAVITY, callback: AsyncCallback<GravityResponse>): void + +监听重力传感器的数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 重力传感器类型为SENSOR_TYPE_ID_GRAVITY。 | + | callback | AsyncCallback<[GravityResponse](#gravityresponse)> | 是 | 注册一次重力传感器的回调函数,上报的数据类型为GravityResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_GRAVITY, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_GYROSCOPE) + +once(type: SensorType.SENSOR_TYPE_ID_GYROSCOPE, callback: AsyncCallback<GyroscopeResponse>): void + +监听陀螺仪传感器的数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 陀螺仪传感器类型为SENSOR_TYPE_ID_GYROSCOPE。 | + | callback | AsyncCallback<[GyroscopeResponse](#gyroscoperesponse)> | 是 | 注册一次陀螺仪传感器的回调函数,上报的数据类型为GyroscopeResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_GYROSCOPE, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED) + +once(type:SensorType.SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED,callback:AsyncCallback<GyroscopeUncalibratedResponse>): void + +监听未校准陀螺仪传感器的数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 未校准陀螺仪传感器类型为SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED。 | + | callback | AsyncCallback<[GyroscopeUncalibratedResponse](#gyroscopeuncalibratedresponse)> | 是 | 注册一次未校准陀螺仪传感器的回调函数,上报的数据类型为GyroscopeUncalibratedResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + //打印data的x,y,z轴坐标的偏移量 + console.info('X-coordinate bias: ' + data.biasX); + console.info('Y-coordinate bias: ' + data.biasY); + console.info('Z-coordinate bias: ' + data.biasZ); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_SIGNIFICANT_MOTION) + +once(type: SensorType.SENSOR_TYPE_ID_SIGNIFICANT_MOTION,callback:AsyncCallback<SignificantMotionResponse>): void + +监听有效运动传感器的数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 有效运动传感器类型为SENSOR_TYPE_ID_SIGNIFICANT_MOTION。 | + | callback | AsyncCallback<[SignificantMotionResponse](#significantmotionresponse)> | 是 | 注册一次有效运动传感器的回调函数,上报的数据类型为SignificantMotionResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_SIGNIFICANT_MOTION, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + console.info('Scalar data: ' + data.scalar); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_PEDOMETER_DETECTION) + +once(type:SensorType.SENSOR_TYPE_ID_PEDOMETER_DETECTION,callback:AsyncCallback<PedometerDetectResponse>): void + +监听计步检测传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 计步检测传感器类型为SENSOR_TYPE_ID_PEDOMETER_DETECTION。 | + | callback | AsyncCallback<[PedometerDetectResponse](#pedometerdetectresponse)> | 是 | 注册一次计步检测传感器的回调函数,上报的数据类型为PedometerDetectResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_PEDOMETER_DETECTION, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + console.info('Scalar data: ' + data.scalar); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_PEDOMETER) + +once(type: SensorType.SENSOR_TYPE_ID_PEDOMETER, callback: AsyncCallback<PedometerResponse>): void + +监听计步器传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 计步传感器类型为SENSOR_TYPE_ID_PEDOMETER。 | + | callback | AsyncCallback<[PedometerResponse](#pedometerresponse)> | 是 | 注册一次计步传感器的回调函数,上报的数据类型为PedometerResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_PEDOMETER, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的步数 + console.info('Steps: ' + data.steps); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_AMBIENT_TEMPERATURE) + +once(type:SensorType.SENSOR_TYPE_ID_AMBIENT_TEMPERATURE,callback:AsyncCallback<AmbientTemperatureResponse>): void + +监听环境温度传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 环境温度传感器类型为SENSOR_TYPE_ID_AMBIENT_TEMPERATURE。 | + | callback | AsyncCallback<[AmbientTemperatureResponse](#ambienttemperatureresponse)> | 是 | 注册一次环境温度传感器的回调函数,上报的数据类型为AmbientTemperatureResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_AMBIENT_TEMPERATURE, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的温度值 + console.info('Temperature: ' + data.temperature); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD) + +once(type: SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD, callback: AsyncCallback<MagneticFieldResponse>): void + +监听磁场传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 磁场传感器类型为SENSOR_TYPE_ID_MAGNETIC_FIELD。 | + | callback | AsyncCallback<[MagneticFieldResponse](#magneticfieldresponse)> | 是 | 注册一次磁场传感器的回调函数,上报的数据类型为MagneticFieldResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED) + +once(type:SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED,callback:AsyncCallback<MagneticFieldUncalibratedResponse>): void + +监听未校准磁场传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 未校准磁场传感器类型为SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED。 | + | callback | AsyncCallback<[MagneticFieldUncalibratedResponse](#magneticfielduncalibratedresponse)> | 是 | 注册一次未校准磁场传感器的回调函数,上报的数据类型为MagneticFieldUncalibratedResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + //打印data的x,y,z轴坐标的偏移量 + console.info('X-coordinate bias: ' + data.biasX); + console.info('Y-coordinate bias: ' + data.biasY); + console.info('Z-coordinate bias: ' + data.biasZ); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_PROXIMITY) + +once(type: SensorType.SENSOR_TYPE_ID_PROXIMITY, callback: AsyncCallback<ProximityResponse>): void + +监听接近光传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 接近光传感器类型为SENSOR_TYPE_ID_PROXIMITY。 | + | callback | AsyncCallback<[ProximityResponse](#proximityresponse)> | 是 | 注册一次接近光传感器的回调函数,上报的数据类型为ProximityResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_PROXIMITY, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的距离值 + console.info('Distance: ' + data.distance); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_HUMIDITY) + +once(type: SensorType.SENSOR_TYPE_ID_HUMIDITY, callback: AsyncCallback<HumidityResponse>): void + +监听湿度传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 湿度传感器类型为SENSOR_TYPE_ID_HUMIDITY。 | + | callback | AsyncCallback<[HumidityResponse](#humidityresponse)> | 是 | 注册一次湿度传感器的回调函数,上报的数据类型为HumidityResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_HUMIDITY, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的湿度值 + console.info('Humidity: ' + data.humidity); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_BAROMETER) + +once(type: SensorType.SENSOR_TYPE_ID_BAROMETER, callback: AsyncCallback<BarometerResponse>): void + +监听气压计传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 气压计传感器类型为SENSOR_TYPE_ID_BAROMETER。 | + | callback | AsyncCallback<[BarometerResponse](#barometerresponse)> | 是 | 注册一次气压计传感器的回调函数,上报的数据类型为BarometerResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_BAROMETER, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的压强值 + console.info('Atmospheric pressure: ' + data.pressure); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_HALL) + +once(type: SensorType.SENSOR_TYPE_ID_HALL, callback: AsyncCallback<HallResponse>): void + +监听霍尔传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 霍尔传感器类型为SENSOR_TYPE_ID_HALL。 | + | callback | AsyncCallback<[HallResponse](#hallresponse)> | 是 | 注册一次霍尔传感器的回调函数,上报的数据类型为HallResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_HALL, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的状态值 + console.info('Status: ' + data.status); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_AMBIENT_LIGHT) + +once(type: SensorType.SENSOR_TYPE_ID_AMBIENT_LIGHT, callback: AsyncCallback<LightResponse>): void + +监听环境光传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 环境光传感器类型为SENSOR_TYPE_ID_AMBIENT_LIGHT。 | + | callback | AsyncCallback<[LightResponse](#lightresponse)> | 是 | 注册一次环境光传感器的回调函数,上报的数据类型为LightResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_AMBIENT_LIGHT, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的光强值 + console.info(''Illumination: ' + data.intensity); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_ORIENTATION) + +once(type: SensorType.SENSOR_TYPE_ID_ORIENTATION, callback: AsyncCallback<OrientationResponse>): void + +监听方向传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 方向传感器类型为SENSOR_TYPE_ID_ORIENTATION。 | + | callback | AsyncCallback<[OrientationResponse](#orientationresponse)> | 是 | 注册一次方向传感器的回调函数,上报的数据类型为OrientationResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_ORIENTATION, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_ROTATION_VECTOR) + +once(type: SensorType.SENSOR_TYPE_ID_ROTATION_VECTOR, callback: AsyncCallback<RotationVectorResponse>): void + +监听旋转矢量传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 旋转矢量传感器类型为SENSOR_TYPE_ID_ROTATION_VECTOR。 | + | callback | AsyncCallback<[RotationVectorResponse](#rotationvectorresponse)> | 是 | 注册一次旋转矢量传感器的回调函数,上报的数据类型为RotationVectorResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_ROTATION_VECTOR, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的x,y,z轴坐标的分量 + console.info('X-coordinate component: ' + data.x); + console.info('Y-coordinate component: ' + data.y); + console.info('Z-coordinate component: ' + data.z); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_HEART_RATE) + +once(type: SensorType.SENSOR_TYPE_ID_HEART_RATE, callback: AsyncCallback<HeartRateResponse>): void + +监听心率传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 心率传感器类型为SENSOR_TYPE_ID_HEART_RATE。 | + | callback | AsyncCallback<[HeartRateResponse](#heartrateresponse)> | 是 | 注册一次心率传感器的回调函数,上报的数据类型为HeartRateResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_HEART_RATE, function(error, data) { + if (error) { + console.error("Subscription failed. Error code: " + error.code + "; message: " + error.message); + return; + } + //打印data的心率值 + console.info("Heart rate: " + data.heartRate); + } + ); + ``` + + +## sensor.once(SensorType.SENSOR_TYPE_ID_WEAR_DETECTION) + +once(type: SensorType.SENSOR_TYPE_ID_WEAR_DETECTION, callback: AsyncCallback<WearDetectionResponse>): void + +监听佩戴检测传感器数据变化一次。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 佩戴检测传感器类型为SENSOR_TYPE_ID_WEAR_DETECTION。 | + | callback | AsyncCallback<[WearDetectionResponse](#weardetectionresponse)> | 是 | 注册一次穿戴检测传感器的回调函数,上报的数据类型为WearDetectionResponse。 | + +- 示例: + ``` + sensor.once(type:SensorType.SENSOR_TYPE_ID_WEAR_DETECTION, function(error, data) { + if (error) { + console.error("Failed to register data, error code is" + error.code + ", message: " + error.message); + return; + } + //打印data的佩戴状态 + console.info("Wear status: "+ data.value); + } + ); + ``` + + +## sensor.off + +off(type: SensorType, callback?: AsyncCallback<void>): void + +取消订阅传感器数据。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | [SensorType](#sensortype) | 是 | 要取消订阅的传感器类型。 | + | callback | AsyncCallback<void> | 是 | 取消订阅的传感器的回调函数,表示接口调用是否成功。 | + +- 示例: + ``` + sensor.off(type:SensorType.SENSOR_TYPE_ID_ACCELEROMETER, function(error) { + if (error) { + console.error("Failed to unsubscribe from acceleration sensor data. Error code: " + error.code + "; message: " + error.message); + return; + } + console.info("Succeeded in unsubscribing from acceleration sensor data."); + } + ); + + ``` + + +## sensor.createRotationMatrix + +createRotationMatrix(rotationVector: Array<number>): Promise<Array<number>> + +将旋转矢量转换为旋转矩阵,返回值为数组。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | rotationVector | Array<number> | 是 | 旋转矢量指示旋转矢量。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | Promise<Array<number>> | 返回角度变化的数字(z、x和y)数组。 | + +- 示例 + ``` + const promise = sensor.createRotationMatrix([0.20046076, 0.21907, 0.73978853, 0.60376877]); + promise.then((data) => { + console.info(LABEL + 'createRotationMatrix_promise success'); + for (var i=0; i < data.length; i++) { + console.info(LABEL + "data[" + i + "]: " + data[i]); + } + }).catch((reason) => { + console.info(LABEL + "promise::catch", reason); + }); + ``` + +## SensorType + +表示要订阅或取消订阅的传感器类型。 + + +| 名称 | 默认值 | 说明 | +| -------- | -------- | -------- | +| SENSOR_TYPE_ID_ACCELEROMETER | 1 | 加速度传感器。 | +| SENSOR_TYPE_ID_GYROSCOPE | 2 | 陀螺仪传感器。 | +| SENSOR_TYPE_ID_AMBIENT_LIGHT | 5 | 环境光传感器。 | +| SENSOR_TYPE_ID_MAGNETIC_FIELD | 6 | 磁场传感器。 | +| SENSOR_TYPE_ID_BAROMETER | 8 | 气压计传感器。 | +| SENSOR_TYPE_ID_HALL | 10 | 霍尔传感器。 | +| SENSOR_TYPE_ID_PROXIMITY | 12 | 接近光传感器。 | +| SENSOR_TYPE_ID_HUMIDITY | 13 | 湿度传感器。 | +| SENSOR_TYPE_ID_ORIENTATION | 256 | 方向传感器。 | +| SENSOR_TYPE_ID_GRAVITY | 257 | 重力传感器。 | +| SENSOR_TYPE_ID_LINEAR_ACCELERATION | 258 | 线性加速度传感器。 | +| SENSOR_TYPE_ID_ROTATION_VECTOR | 259 | 旋转矢量传感器。 | +| SENSOR_TYPE_ID_AMBIENT_TEMPERATURE | 260 | 环境温度传感器。 | +| SENSOR_TYPE_ID_MAGNETIC_FIELD_UNCALIBRATED | 261 | 未校准磁场传感器。 | +| SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED | 263 | 未校准陀螺仪传感器。 | +| SENSOR_TYPE_ID_SIGNIFICANT_MOTION | 264 | 有效运动传感器。 | +| SENSOR_TYPE_ID_PEDOMETER_DETECTION | 265 | 计步检测传感器。 | +| SENSOR_TYPE_ID_PEDOMETER | 266 | 计步传感器。 | +| SENSOR_TYPE_ID_HEART_RATE | 278 | 心率传感器。 | +| SENSOR_TYPE_ID_WEAR_DETECTION | 280 | 佩戴检测传感器。 | +| SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED | 281 | 未校准加速度计传感器。 | + + +## AccelerometerResponse + +加速度传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | + + +## LinearAccelerometerResponse + +线性加速度传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | + + +## AccelerometerUncalibratedResponse + +未校准加速度计传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | +| biasX | number | 是 | 是 | x轴坐标偏移量。 | +| biasY | number | 是 | 是 | y轴坐标偏移量。 | +| biasZ | number | 是 | 是 | z轴坐标偏移量。 | + + +## GravityResponse + +重力传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | + + +## OrientationResponse + +方向传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | + + +## RotationVectorResponse + +旋转矢量传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | + + +## GyroscopeResponse + +陀螺仪传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | + + +## GyroscopeUncalibratedResponse + +未校准陀螺仪传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | +| biasX | number | 是 | 是 | x轴坐标偏移量。 | +| biasY | number | 是 | 是 | y轴坐标偏移量。 | +| biasZ | number | 是 | 是 | z轴坐标偏移量。 | + + +## SignificantMotionResponse + +有效运动传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| scalar | number | 是 | 是 | 表示剧烈运动程度。测量三个物理轴(x、y 和 z)上,设备是否存在大幅度运动;如果取值为1则代表存在大幅度运动,取值为0则代表没有大幅度运动。 | + + +## ProximityResponse + +接近光传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| distance | number | 是 | 是 | 可见物体与设备显示器的接近程度。0表示接近,1表示远离。 | + + +## LightResponse + +环境光传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| intensity | number | 是 | 是 | 光强(单位:勒克斯)。 | + + +## HallResponse + +霍尔传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| status | number | 是 | 是 | 显示霍尔状态。测量设备周围是否存在磁力吸引,0表示有,1表示没有。 | + + +## MagneticFieldResponse + +磁场传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | + + +## MagneticFieldUncalibratedResponse + +未校准磁场传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | +| biasX | number | 是 | 是 | x轴坐标偏移量。 | +| biasY | number | 是 | 是 | y轴坐标偏移量。 | +| biasZ | number | 是 | 是 | z轴坐标偏移量。 | + + +## PedometerResponse + +计步传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| steps | number | 是 | 是 | 计数的步骤数。每次设备重新启动时,该值将从0重新计算。 | + + +## HumidityResponse + +湿度传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| humidity | number | 是 | 是 | 湿度值。测量环境的相对湿度,以百分比 (%) 表示。 | + + +## PedometerDetectResponse + +计步检测传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| scalar | number | 是 | 是 | 计步器检测。检测用户的计步动作,如果取值为1则代表用户产生了计步行走的动作,取值为0则代表用户没有发生运动。 | + + +## AmbientTemperatureResponse + +温度传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| temperature | number | 是 | 是 | 环境温度(单位:摄氏度)。 | + + +## BarometerResponse + +气压计传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| pressure | number | 是 | 是 | 压力值(单位:帕斯卡)。 | + + +## HeartRateResponse + +心率传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| heartRate | number | 是 | 是 | 心率值。测量用户的心率数值,单位是次/分。 | + + +## WearDetectionResponse + +佩戴检测传感器数据。 + + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| value | boolean | 是 | 是 | 表示设备是否被穿戴(true 表示已穿戴,false表示未穿戴)。 | + + +## Options + +设置传感器上报频率 + +| 名称 | 参数类型 | 说明 | +| -------- | -------- | -------- | +| interval | number | 表示传感器的上报频率,默认值为200000000ns。 | + + +## RotationMatrixResponse + +设置旋转矩阵响应对象 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| rotation | Array<number> | 是 | 是 | 旋转矩阵。 | +| inclination | Array<number> | 是 | 是 | 倾斜矩阵。 | + + +## CoordinatesOptions + +设置坐标选项对象 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x坐标偏移量。 | +| y | number | 是 | 是 | y坐标偏移量。 | + + +## GeomagneticResponse + +设置地磁响应对象 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| x | number | 是 | 是 | x轴坐标分量。 | +| y | number | 是 | 是 | y轴坐标分量。 | +| z | number | 是 | 是 | z轴坐标分量。 | +| geomagneticDip | number | 是 | 是 | 地磁倾角。 | +| deflectionAngle | number | 是 | 是 | 偏转角。 | +| levelIntensity | number | 是 | 是 | 水平强度。 | +| totalIntensity | number | 是 | 是 | 总强度。 | + + +## LocationOptions + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| latitude | number | 是 | 是 | 纬度。 | +| longitude | number | 是 | 是 | 经度。 | +| altitude | number | 是 | 是 | 海拔。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/02.\346\214\257\345\212\250.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/02.\346\214\257\345\212\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..0a261296e1764985544923abb0621325717201b1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/02.\346\214\257\345\212\250.md" @@ -0,0 +1,207 @@ +--- +title: 振动 +permalink: /pages/000b000701 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 振动 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import vibrate from '@ohos.vibrator'; +``` + + +## 权限列表 + +ohos.permission.VIBRATE + + +## vibrate.vibrate + +vibrate(duration: number): Promise<void> + + +按照指定持续时间触发马达振动。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | duration | number | 是 | 指示马达振动的持续时间。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | 指示触发振动是否成功。 | + + +- 示例: + ``` + vibrator.vibrate(1000).then(error)=>{ + if(error){ + console.log(“error.code”+error.code+“error.message”+error.message); + }else{ + console.log(“Promise returned to indicate a successful vibration.”); + } + } + ``` + + +## vibrate.vibrate + +vibrate(duration: number, callback?: AsyncCallback<void>): void + +按照指定持续时间触发马达振动。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | duration | number | 是 | 指示马达振动的持续时间。 | + | callback | AsyncCallback<void> | 否 | 马达执行振动的回调函数,指示触发振动是否成功。 | + +- 示例**:** + ``` + vibrator.vibrate(1000,function(error){ + if(error){ + console.log(“error.code”+error.code+“error.message”+error.message); + }else{ + console.log(“Callback returned to indicate a successful vibration.”); + } + }) + ``` + + +## vibrate.vibrate + +vibrate(effectId: EffectId): Promise<void> + +按照指定振动效果触发马达振动。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | effectId | [EffectId](#effectid) | 是 | 指示马达振动效果的字符串。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | 指示触发振动是否成功。 | + +- 示例: + ``` + vibrator.vibrate(effectId:EffectId).then(error)=>{ + if(error){ + console.log(“error.code”+error.code+“error.message”+error.message); + }else{ + Console.log(“Promise returned to indicate a successful vibration.”); + } + } + ``` + + +## vibrate.vibrate + +vibrate(effectId: EffectId, callback?: AsyncCallback<void>): void + +按照指定振动效果触发马达振动。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | effectId | [EffectId](#effectid) | 是 | 指示马达振动效果的字符串。 | + | callback | AsyncCallback<void> | 否 | 马达执行振动的回调函数,指示触发振动是否成功。 | + +- 示例: + ``` + vibrator.vibrate(effectId:EffectId,function(error){ + if(error){ + console.log(“error.code”+error.code+“error.message”+error.message); + }else{ + console.log(“Callback returned to indicate a successful vibration.”); + } + }) + ``` + + +## vibrate.stop + +stop(stopMode: VibratorStopMode): Promise<void> + +按照要停止指定的振动模式来停止马达的振动。如果要停止的振动模式与触发马达振动时的模式不相同,则调用本接口会失败。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | stopMode | [VibratorStopMode](#vibratorstopmode) | 是 | 指示马达要停止指定的振动模式。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | 指示停止振动是否成功。 | + +- 示例: + ``` + vibrator.stop(stopMode:VibratorStopMode).then((error)=>{ + if(error){ + console.log(“error.code”+error.code+“error.message”+error.message); + }else{ + Console.log(“Promise returned to indicate successful.”); + } + }) + ``` + + +## vibrate.stop + +stop(stopMode: VibratorStopMode, callback?: AsyncCallback<void>): void; + +按照要停止指定的振动模式来停止马达的振动。如果要停止的振动模式与触发马达振动时的模式不相同,则调用本接口会失败。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | stopMode | [VibratorStopMode](#vibratorstopmode) | 是 | 指示马达要停止指定的振动模式。 | + | callback | AsyncCallback<void> | 否 | 马达停止振动的回调函数,指示停止振动是否成功。 | + +- 示例: + ``` + vibrator.stop(stopMode:VibratorStopMode,function(error){ + if(error){ + console.log(“error.code”+error.code+“error.message”+error.message); + }else{ + Console.log(“Callback returned to indicate successful.”); + } + }) + ``` + + +## EffectId + +表示马达振动效果的字符串。 + +| 名称 | 默认值 | 说明 | +| -------- | -------- | -------- | +| EFFECT_CLOCK_TIMER | "haptic.clock.timer" | 调整定时器时振动器的振动效果。 | + + +## VibratorStopMode + +表示马达要停止指定的振动模式。 + +| 名称 | 默认值 | 说明 | +| -------- | -------- | -------- | +| VIBRATOR_STOP_MODE_TIME | "time" | 停止模式为duration模式的振动。即触发振动时参数类型为number,参数本身为指示振动持续时间的触发方式。 | +| VIBRATOR_STOP_MODE_PRESET | "preset" | 停止模式为预置EffectId的振动。即触发振动时参数类型为EffectId,参数本身为指示马达振动效果的字符串的触发方式。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/03.\345\261\217\345\271\225\344\272\256\345\272\246.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/03.\345\261\217\345\271\225\344\272\256\345\272\246.md" new file mode 100644 index 0000000000000000000000000000000000000000..3d5f0cb5f4b6cb16a101e4acd86004004f6d26ac --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/03.\345\261\217\345\271\225\344\272\256\345\272\246.md" @@ -0,0 +1,42 @@ +--- +title: 屏幕亮度 +permalink: /pages/000b000702 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 屏幕亮度 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import brightness from '@ohos.brightness'; +``` + + +## brightness.setValue + +setValue(value: number) + +设置系统的屏幕亮度。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | value | number | 是 | 亮度的值(0~255) | + +- 示例: + ``` + import brightness from '@ohos.brightness.d.ts'; + brightness.setValue(128); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/04.\347\224\265\351\207\217\344\277\241\346\201\257.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/04.\347\224\265\351\207\217\344\277\241\346\201\257.md" new file mode 100644 index 0000000000000000000000000000000000000000..7545090c896b90a92a896ddffce967eccd52c649 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/04.\347\224\265\351\207\217\344\277\241\346\201\257.md" @@ -0,0 +1,87 @@ +--- +title: 电量信息 +permalink: /pages/000b000703 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 电量信息 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import batteryInfo from '@ohos.batteryInfo'; +``` + + +## 属性 + +描述电池信息。 + +| 名称 | 类型 | 可读 | 可写 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| batterySOC | number | 是 | 否 | 表示当前设备剩余电池容量。 | +| chargingStatus | [BatteryChargeState](#batterychargestate) | 是 | 否 | 表示当前设备电池的充电状态。 | +| healthStatus | [BatteryHealthState](#batteryhealthstate) | 是 | 否 | 表示当前设备电池的健康状态。 | +| pluggedType | [BatteryPluggedType](#batterypluggedtype) | 是 | 否 | 表示当前设备连接的充电器类型。 | +| voltage | number | 是 | 否 | 表示当前设备电池的电压。 | +| technology | string | 是 | 否 | 表示当前设备电池的技术型号。 | +| batteryTemperature | number | 是 | 否 | 表示当前设备电池的温度。 | +| isBatteryPresent7+ | boolean | 是 | 否 | 表示当前设备是否支持电池或者电池是否在位。 | + +- 示例: + ``` + import batteryInfo from '@ohos.batteryInfo'; + var batterySoc = batteryInfo.batterySOC; + ``` + + +## BatteryPluggedType + +表示连接的充电器类型的枚举。 + + +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| NONE | 0 | 表示连接充电器类型未知。 | +| AC | 1 | 表示连接的充电器类型为交流充电器。 | +| USB | 2 | 表示连接的充电器类型为USB。 | +| WIRELESS | 3 | 表示连接的充电器类型为无线充电器。 | + + +## BatteryChargeState + +表示电池充电状态的枚举。 + + +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| NONE | 0 | 表示电池充电状态未知。 | +| ENABLE | 1 | 表示电池充电状态为使能状态。 | +| DISABLE | 2 | 表示电池充电状态为停止状态。 | +| FULL | 3 | 表示电池充电状态为已充满状态。 | + + +## BatteryHealthState + +表示电池的健康状态的枚举。 + + +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| UNKNOWN | 0 | 表示电池健康状态未知。 | +| GOOD | 1 | 表示电池健康状态为正常。 | +| OVERHEAT | 2 | 表示电池健康状态为过热。 | +| OVERVOLTAGE | 3 | 表示电池健康状态为过压。 | +| COLD | 4 | 表示电池健康状态为低温。 | +| DEAD | 5 | 表示电池健康状态为僵死状态。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/05.\347\263\273\347\273\237\347\224\265\346\272\220\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/05.\347\263\273\347\273\237\347\224\265\346\272\220\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..0ce5c5f421400626ee3b44e83bc0749d347e91d1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/05.\347\263\273\347\273\237\347\224\265\346\272\220\347\256\241\347\220\206.md" @@ -0,0 +1,115 @@ +--- +title: 系统电源管理 +permalink: /pages/000b000704 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 系统电源管理 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import power from '@ohos.power'; +``` + + +## 权限 + +关机权限: ohos.permission.SHUTDOWN + +重启权限: ohos.permission.REBOOT + +重启并进入recovery模式的权限:ohos.permission.REBOOT_RECOVERY + + +## power.shutdownDevice + +shutdownDevice(reason: string): void + +系统关机。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | reason | string | 是 | 关机原因。 | + +- 示例: + ``` + power.shutdownDevice("shutdown_test"); + console.info('power_shutdown_device_test success') + ``` + + +## power.rebootDevice + +rebootDevice(reason: string): void + +重启设备。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | reason | string | 是 | 重启原因。 | + +- 示例: + ``` + power.rebootDevice("reboot_test"); + console.info('power_reboot_device_test success') + ``` + + +## power.isScreenOn + +isScreenOn(callback: AsyncCallback<boolean>): void + +检测当前设备的亮灭屏状态。 + +- 参数: + | 类型 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<boolean> | 是 | 指定的callback回调方法,用于获取返回值。
callback返回值:亮屏返回true,灭屏返回false。 | + +- 示例: + ``` + power.isScreenOn((error, screenOn) => { + if (typeof error === "undefined") { + console.info('screenOn status is ' + screenOn); + } else { + console.log('error: ' + error); + } + }) + ``` + + +## power.isScreenOn + +isScreenOn(): Promise<boolean> + +检测当前设备的亮灭屏状态。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<boolean> | Promise实例,用于异步获取返回值,亮屏返回true,灭屏返回false。 | + +- 示例: + ``` + power.isScreenOn() + .then(screenOn => { + console.info('screenOn status is ' + screenOn); + }) + .catch(error => { + console.log('error: ' + error); + }) + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/06.Runninglock\351\224\201.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/06.Runninglock\351\224\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..b91a507939c178341fcedc9f46ecf986bfc7065b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/06.Runninglock\351\224\201.md" @@ -0,0 +1,221 @@ +--- +title: Runninglock锁 +permalink: /pages/000b000705 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# Runninglock锁 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import runninglock from '@ohos.runningLock'; +``` + + +## 权限 + +申请、使用锁的权限:ohos.permission.RUNNING_LOCK + + +## RunningLockType + +RunningLock锁的类型。 + +| 名称 | 默认值 | 描述 | +| -------- | -------- | -------- | +| BACKGROUND | 1 | 阻止系统休眠的锁。 | +| PROXIMITY_SCREEN_CONTROL | 2 | 通过接近或者远离状态来控制亮灭屏的锁。 | + + +## isRunningLockTypeSupported + +isRunningLockTypeSupported(type: RunningLockType, callback: AsyncCallback<boolean>): void + +查询系统是否支持该类型的锁。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | RunningLockType | 是 | 需要查询的锁的类型。 | + | callback | AsyncCallback<boolean> | 是 | 指定的callback回调方法,用于获取返回值。
callback返回值:支持返回true,不支持返回false。 | + +- 示例: + ``` + runningLock.isRunningLockTypeSupported(runningLock.RunningLockType.BACKGROUND, (error, supported) => { + if (typeof error === "undefined") { + console.info('BACKGROUND support status is ' + supported); + } else { + console.log('error: ' + error); + } + }) + ``` + + +## isRunningLockTypeSupported + +isRunningLockTypeSupported(type: RunningLockType): Promise<boolean> + +查询系统是否支持该类型的锁。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | RunningLockType | 是 | 需要查询的锁的类型。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<boolean> | Promise实例,用于异步获取返回值,支持返回true,不支持返回false。 | + +- 示例: + ``` + runningLock.isRunningLockTypeSupported(runningLock.RunningLockType.PROXIMITY_SCREEN_CONTROL) + .then(supported => { + console.info('PROXIMITY_SCREEN_CONTROL support status is ' + supported); + }) + .catch(error => { + console.log('error: ' + error); + }); + ``` + + +## createRunningLock + +createRunningLock(name: string, type: RunningLockType, callback: AsyncCallback<RunningLock>): void + +创建RunningLock锁。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 锁的名字。 | + | type | RunningLockType | 是 | 要创建的锁的类型。 | + | callback | AsyncCallback<[RunningLock](#runninglock)> | 是 | 指定的callback回调方法,用于获取返回的RunningLock锁对象。 | + +- 示例: + ``` + runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) + .then(runninglock => { + var used = runninglock.isUsed(); + console.info('runninglock is used: ' + used); + runninglock.lock(500); + used = runninglock.isUsed(); + console.info('after lock runninglock is used ' + used); + }) + .catch(error => { + console.log('create runningLock test error: ' + error); + }) + ``` + + +## createRunningLock + +createRunningLock(name: string, type: RunningLockType): Promise<RunningLock> + +创建Runninglock锁。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 锁的名字。 | + | type | RunningLockType | 是 | 要创建的锁的类型。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<[RunningLock](#runninglock)> | Promise实例,用于异步获取返回的RunningLock锁对象。 | + +- 示例: + ``` + runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) + .then(runninglock => { + console.info('create runningLock success'); + }) + .catch(error => { + console.log('create runningLock test error: ' + error); + }) + ``` + + +## RunningLock + +阻止系统休眠的锁。 + + +### lock + +lock(timeout: number): void + +锁定和持有RunningLock + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | timeout | number | 否 | 锁定和持有RunningLock的时长。 | + +- 示例: + ``` + runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) + .then(runningLock => { + runningLock.lock(100) + console.info('create runningLock success') + }) + .catch(error => { + console.log('Lock runningLock test error: ' + error) + }); + ``` + + +### unlock + +unlock(): void + +释放Runninglock锁。 + +- 示例: + ``` + runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) + .then(runningLock => { + runningLock.unlock() + console.info('unLock runningLock success') + }) + .catch(error => { + console.log('unLock runningLock test error: ' + error) + }); + ``` + + +### isUsed + +isUsed(): boolean + +查询当前Runninglock是持有状态,还是释放状态。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 当前RunningLock是持有状态返回true,释放状态返回false。 | + +- 示例: + ``` + runningLock.createRunningLock("running_lock_test", runningLock.RunningLockType.BACKGROUND) + .then(runningLock => { + var used = runningLock.isUsed() + console.info('runningLock used status: ' + used) + }) + .catch(error => { + console.log('runningLock isUsed test error: ' + error) + }); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/07.\350\256\276\345\244\207\344\277\241\346\201\257.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/07.\350\256\276\345\244\207\344\277\241\346\201\257.md" new file mode 100644 index 0000000000000000000000000000000000000000..d6dd5250f4d9ece92b7836671a17e2f8bb213874 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/07.\350\256\276\345\244\207\344\277\241\346\201\257.md" @@ -0,0 +1,60 @@ +--- +title: 设备信息 +permalink: /pages/000b000706 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 设备信息 + +## 导入模块 + +``` +import deviceInfo from '@ohos.deviceInfo' +``` + + +## 权限列表 + +无 + + +## 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 描述 | +| -------- | -------- | -------- | -------- | -------- | +| deviceType | string | 是 | 否 | 设备类型。 | +| manufacture | string | 是 | 否 | 设备厂家名称。 | +| brand | string | 是 | 否 | 设备品牌名称。 | +| marketName | string | 是 | 否 | 外部产品系列。 | +| productSeries | string | 是 | 否 | 产品系列。 | +| productModel | string | 是 | 否 | 认证型号。 | +| softwareModel | string | 是 | 否 | 内部软件子型号。 | +| hardwareModel | string | 是 | 否 | 硬件版本号。 | +| hardwareProfile | string | 是 | 否 | 硬件Profile。 | +| serial | string | 是 | 否 | 设备序列号。 | +| bootloaderVersion | string | 是 | 否 | Bootloader版本号。 | +| abiList | string | 是 | 否 | 应用二进制接口(Abi)列表。 | +| securityPatchTag | string | 是 | 否 | 安全补丁级别。 | +| displayVersion | string | 是 | 否 | 产品版本。 | +| incrementalVersion | string | 是 | 否 | 差异版本号。 | +| osReleaseType | string | 是 | 否 | 系统的发布类型,取值为:
- Canary:面向特定开发者发布的早期预览版本,不承诺API稳定性。
- Beta:面向开发者公开发布的Beta版本,不承诺API稳定性。
- Release:面向开发者公开发布的正式版本,承诺API稳定性。 | +| osFullName | string | 是 | 否 | 系统版本。 | +| majorVersion | number | 是 | 否 | Major版本号,随主版本更新增加。 | +| seniorVersion | number | 是 | 否 | Senior版本号,随局部架构、重大特性增加。 | +| featureVersion | number | 是 | 否 | Feature版本号,标识规划的新特性版本。 | +| buildVersion | number | 是 | 否 | Build版本号,标识编译构建的版本号。 | +| sdkApiVersion | number | 是 | 否 | 系统软件API版本。 | +| firstApiVersion | number | 是 | 否 | 首个版本系统软件API版本。 | +| versionId | string | 是 | 否 | 版本ID。 | +| buildType | string | 是 | 否 | 构建类型。 | +| buildUser | string | 是 | 否 | 构建用户。 | +| buildHost | string | 是 | 否 | 构建主机。 | +| buildTime | string | 是 | 否 | 构建时间。 | +| buildRootHash | string | 是 | 否 | 构建版本Hash。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/08.\347\263\273\347\273\237\345\261\236\346\200\247.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/08.\347\263\273\347\273\237\345\261\236\346\200\247.md" new file mode 100644 index 0000000000000000000000000000000000000000..caff37872f59565f31864d907373d56d99a51514 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/08.\347\263\273\347\273\237\345\261\236\346\200\247.md" @@ -0,0 +1,240 @@ +--- +title: 系统属性 +permalink: /pages/000b000707 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 系统属性 + +## 导入模块 + +``` +import parameter from '@ohos.systemParameter' +``` + + +## 权限列表 + +无 + + +## parameter.getSync + +getSync(key: string, def?: string) + +获取系统属性Key对应的值。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待查询的系统属性Key。 | +| def | string | 否 | 默认值。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| string | 系统属性值,若key不存在,返回默认值。若未指定默认值,返回空字符串。 | + +**示例:** + +``` +try { + var info = parameter.getSync("test.parameter.key"); + console.log(JSON.stringify(info)); +}catch(e){ + console.log("getSync unexpected error: " + e); +} +``` + + +## parameter.get + +get(key: string, callback: AsyncCallback<string>) + +获取系统属性Key对应的值。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待查询的系统属性Key。 | +| callback | AsyncCallback<string> | 是 | 回调函数。 | + +**示例:** + +``` +try { + parameter.get("test.parameter.key", function (err, data) { + if (err == undefined) { + console.log("get test.parameter.key value success:" + data) + } else { + console.log(" get test.parameter.key value err:" + err.code) + }}); +}catch(e){ + console.log("get unexpected error: " + e); +} +``` + + +## parameter.get + +get(key: string, def: string, callback: AsyncCallback<string>) + +获取系统属性Key对应的值。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待查询的系统属性Key。 | +| def | string | 是 | 默认值。 | +| callback | AsyncCallback<string> | 是 | 回调函数。 | + +**示例:** + +``` +try { + parameter.get("test.parameter.key", "default", function (err, data) { + if (err == undefined) { + console.log("get test.parameter.key value success:" + data) + } else { + console.log(" get test.parameter.key value err:" + err.code) + } + }); +}catch(e){ + console.log("get unexpected error:" + e) +} +``` + + +## parameter.get + +get(key: string, def?: string) + +获取系统属性Key对应的值。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待查询的系统属性Key。 | +| def | string | 否 | 默认值。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<string> | Promise示例,用于异步获取结果。 | + +**示例:** + +``` +try { + var p = parameter.get("test.parameter.key"); + p.then(function (value) { + console.log("get test.parameter.key success: " + value); + }).catch(function (err) { + console.log("get test.parameter.key error: " + err.code); + }); +}catch(e){ + console.log("get unexpected error: " + e); +} +``` + + +## parameter.setSync + +setSync(key: string, value: string) + +设置系统属性Key对应的值。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待设置的系统属性Key。 | +| value | string | 是 | 待设置的系统属性值。 | + +**示例:** + +``` +try { + parameter.setSync("test.parameter.key", "default"); +}catch(e){ + console.log("set unexpected error: " + e); +} +``` + + +## parameter.set(key: string, value: string, callback: AsyncCallback<void>) + +set(key: string, value: string, callback: AsyncCallback<void>) + +设置系统属性Key对应的值。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待查询的系统属性Key。 | +| def | string | 是 | 默认值。 | +| callback | AsyncCallback<void> | 是 | 回调函数。 | + +**示例:** + +``` +try { + parameter.set("test.parameter.key", "testValue", function (err, data) { + if (err == undefined) { + console.log("set test.parameter.key value success :" + data) + } else { + console.log("set test.parameter.key value err:" + err.code) + }}); +}catch(e){ + console.log("set unexpected error: " + e); +} +``` + + +## parameter.set(key: string, def?: string) + +set(key: string, def?: string) + +设置系统属性Key对应的值。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| key | string | 是 | 待查询的系统属性Key。 | +| def | string | 否 | 默认值。 | + +**返回值:** + +| 类型 | 说明 | +| -------- | -------- | +| Promise<string> | Promise示例,用于异步获取结果。 | + +**示例:** + +``` +try { + var p = para.set("test.parameter.key", "testValue"); + p.then(function (value) { + console.log("set test.parameter.key success: " + value); + }).catch(function (err) { + console.log(" set test.parameter.key error: " + err.code); + }); +}catch(e){ + console.log("set unexpected error: " + e); +} +``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/09.\350\256\276\345\244\207\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/09.\350\256\276\345\244\207\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..5c65bc06a5675a4ee153f49b31ce8b12e0395ec8 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/09.\350\256\276\345\244\207\347\256\241\347\220\206.md" @@ -0,0 +1,202 @@ +--- +title: 设备管理 +permalink: /pages/000b000708 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 设备管理 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import deviceManager from '@ohos.distributedHardware.deviceManager'; +``` + + +## deviceManager.createDeviceManager + +createDeviceManager(bundleName: string, callback: AsyncCallback<DeviceManager>): void + +创建一个设备管理器实例。 +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | bundleName | string | 是 | 指示应用程序的包名。 | + | callback | AsyncCallback<[DeviceManager](#devicemanager)> | 是 | DeviceManager实例创建时调用的回调,返回设备管理器对象实例。 | + +- 示例: + ``` + deviceManager.createDeviceManager("ohos.samples.jshelloworld", (err, data) => { + if (err) { + console.info("createDeviceManager err:" + JSON.stringify(err)); + return; + } + console.info("createDeviceManager success"); + this.dmInstance = data; + }); + ``` + + +## DeviceStateChangeAction + +表示设备状态变化的枚举。 + +| 名称 | 默认值 | 说明 | +| -------- | -------- | -------- | +| ONLINE | 0 | 设备上线。 | +| READY | 1 | 设备就绪,设备信息同步已完成。 | +| OFFLINE | 2 | 设备下线。 | +| CHANGE | 3 | 设备信息更改。 | + + +## DeviceType + +表示设备类型的枚举类。 + +| 名称 | 默认值 | 说明 | +| -------- | -------- | -------- | +| SPEAKER | 0x0A | 智能音箱 | +| PHONE | 0x0E | 手机 | +| TABLET | 0x11 | 平板 | +| WEARABLE | 0x6D | 智能穿戴 | +| TV | 0x9C | 智慧屏 | + + +## DeviceInfo + +设备信息。 + +| 名称 | 类型 | 必填 | 描述 | +| -------- | -------- | -------- | -------- | +| deviceId | number | 是 | 设备的唯一标识。 | +| deviceName | string | 是 | 设备名称。 | +| deviceType | number | 是 | 设备类型。 | + + +## DeviceManager + +设备管理实例,用于获取可信设备和本地设备的相关信息。在调用DeviceManager的方法前,需要先通过createDeviceManager构建一个DeviceManager实例dmInstance。 + + +### release + +release(): void + +设备管理实例不再使用后,通过该方法释放DeviceManager实例。 + +- 示例: + ``` + dmInstance.release(); + ``` + + +### getTrustedDeviceListSync + +getTrustedDeviceListSync(): Array<DeviceInfo> + +同步获取所有可信设备列表。 + +- 返回值: + | 名称 | 说明 | + | -------- | -------- | + | Array<[DeviceInfo](#deviceinfo)> | 返回可信设备列表。 | + +- 示例: + ``` + var deviceInfoList = dmInstance.getTrustedDeviceListSync(); + ``` + + +### on('deviceStateChange') + +on(type: 'deviceStateChange', callback: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void + +注册设备状态回调。 + +- 参数: + | 名称 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 注册设备状态回调,固定为deviceStateChange。 | + | callback | Callback<{ action: [DeviceStateChangeAction](#devicestatechangeaction), device: [DeviceInfo](#deviceinfo) }> | 是 | 指示要注册的设备状态回调,返回设备状态和设备信息。 | + +- 示例: + ``` + dmInstance.on('deviceStateChange', (data) => { + console.info("deviceStateChange on:" + JSON.stringify(data)); + } + ); + ``` + + +### off('deviceStateChange') + +off(type: 'deviceStateChange', callback?: Call back<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void + +取消注册设备状态回调。 + +- 参数: + | 名称 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 根据应用程序的包名取消注册设备状态回调。 | + | callback | Callback<{ action: [DeviceStateChangeAction](#devicestatechangeaction), device: [DeviceInfo](#deviceinfo)  }> | 是 | 指示要取消注册的设备状态回调,返回设备状态和设备信息。 | + +- 示例: + ``` + dmInstance.off('deviceStateChange', (data) => { + console.info('deviceStateChange' + JSON.stringify(data)); + } + ); + ``` + + +### on('serviceDie') + +on(type: 'serviceDie', callback: () => void): void + +注册设备管理服务死亡监听。 + +- 参数: + | 名称 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 注册serviceDie回调,以便在devicemanager服务异常终止时通知应用程序。 | + | callback | () => void | 是 | 注册serviceDie的回调方法。 | + +- 示例: + ``` + dmInstance.on("serviceDie", () => { + console.info("serviceDie on"); + } + ); + ``` + + +### off('serviceDie') + +off(type: 'serviceDie', callback?: () => void): void + +取消注册设备管理服务死亡监听。 + +- 参数: + | 名称 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 取消注册serviceDie回调,以便在devicemanager服务异常终止时通知应用程序。 | + | callback | () => void | 否 | 取消注册serviceDie的回调方法。 | + +- 示例: + ``` + dmInstance.off("serviceDie", () => { + console.info("serviceDie off"); + } + ); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/10.\346\230\276\347\244\272\350\256\276\345\244\207\345\261\236\346\200\247.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/10.\346\230\276\347\244\272\350\256\276\345\244\207\345\261\236\346\200\247.md" new file mode 100644 index 0000000000000000000000000000000000000000..49d33961c0da04a86646fd59ab99f417db8a9948 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/10.\346\230\276\347\244\272\350\256\276\345\244\207\345\261\236\346\200\247.md" @@ -0,0 +1,157 @@ +--- +title: 显示设备属性 +permalink: /pages/000b000709 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 显示设备属性 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import display from '@ohos.display'; +``` + + +## 权限列表 + +无 + + +## DisplayState + +用于表示显示设备的状态。 + +| 名称 | 默认值 | 说明 | +| -------- | -------- | -------- | +| STATE_UNKNOWN | 0 | 表示显示设备状态未知。 | +| STATE_OFF | 1 | 表示显示设备状态为关闭。 | +| STATE_ON | 2 | 表示显示设备状态为开启。 | +| STATE_DOZE | 3 | 表示显示设备为低电耗模式。 | +| STATE_DOZE_SUSPEND | 4 | 表示显示设备为睡眠模式,CPU为挂起状态 。 | +| STATE_VR | 5 | 表示显示设备为VR模式。 | +| STATE_ON_SUSPEND | 6 | 表示显示设备为开启状态,CPU为挂起状态。 | + + +## Display + +描述display对象的属性。 + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| id | number | 是 | 否 | 显示设备的id号。 | +| name | string | 是 | 否 | 显示设备的名称。 | +| alive | boolean | 是 | 否 | 显示设备是否启用。 | +| state | [DisplayState](#displaystate) | 是 | 否 | 显示设备的状态。 | +| refreshRate | number | 是 | 否 | 显示设备的刷新率。 | +| rotation | number | 是 | 否 | 显示设备的屏幕旋转角度。 | +| width | number | 是 | 否 | 显示设备的宽度,单位为像素。 | +| height | number | 是 | 否 | 显示设备的高度,单位为像素。 | +| densityDPI | number | 是 | 否 | 显示设备的屏幕密度,单位为DPI。 | +| densityPixels | number | 是 | 否 | 显示设备的屏幕密度,单位为像素。 | +| scaledDensity | number | 是 | 否 | 显示设备的显示字体的缩放因子。 | +| xDPI | number | 是 | 否 | x方向中每英寸屏幕的确切物理像素值。 | +| yDPI | number | 是 | 否 | y方向中每英寸屏幕的确切物理像素值。 | + + +## display.getDefaultDisplay + +getDefaultDisplay(callback: AsyncCallback<Display>): void; + +获取当前默认的display对象。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<[Display](#display)> | 是 | 回调返回显示设备的属性。 | + +- 示例 + ``` + var displayClass = null; + display.getDefaultDisplay((err, data) => { + if (err) { + console.error('Failed to obtain the default display object. Code: ' + JSON.stringify(err)); + return; + } + console.info('Succeeded in obtaining the default display object. Data:' + JSON.stringify(data)); + displayClass = data; + }); + ``` + + +## display.getAllDisplay + +getAllDisplay(callback: AsyncCallback<Array<Display>>): void; + +获取当前所有的display对象。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callback | AsyncCallback<Array<[Display](#display)>> | 是 | 回调返回多个显示设备的属性。 | + +- 示例 + ``` + display.getAllDisplay((err, data) => { + if (err) { + console.error('Failed to obtain all the display objects. Code: ' + JSON.stringify(err)); + return; + } + console.info('Succeeded in obtaining all the display objects. Data: ' + JSON.stringify(data)) + }); + ``` + + +## display.on('add'|'remove'|'change') + +on(type: 'add'|'remove'|'change', callback: Callback<number>): void; + +开启监听。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 设置监听类型。
- type为"add",表示监听增加显示设备。
- type为"remove",表示监听移除显示设备。
- type为"change",表示监听改变显示设备。 | + | callback | Callback<number> | 是 | 回调返回监听到的显示设备的id。 | + +- 示例 + ``` + var type = "add"; + var callback = (data) => { + console.info('Listening enabled. Data: ' + JSON.stringify(data)) + } + display.on(type, callback); + ``` + + +## display.off('add'|'remove'|'change') + +off(type: 'add'|'remove'|'change', callback?: Callback<number>): void; + +关闭监听。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 设置监听类型。
- type为"add",表示监听增加显示设备。
- type为"remove",表示监听移除显示设备。
- type为"change",表示监听改变显示设备。 | + | callback | Callback<number> | 否 | 回调返回监听到的显示设备的id。 | + +- 示例 + ``` + var type = "remove"; + display.off(type); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/11.\345\215\207\347\272\247.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/11.\345\215\207\347\272\247.md" new file mode 100644 index 0000000000000000000000000000000000000000..989ea8ae62f88cd62103313a849622b5043618ef --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/08.\350\256\276\345\244\207\347\256\241\347\220\206/11.\345\215\207\347\272\247.md" @@ -0,0 +1,570 @@ +--- +title: 升级 +permalink: /pages/000b00070a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 升级 + +升级范围:升级整个OpenHarmony系统,包括内置的资源、预置应用;第三方的应用不在升级的范围。 + +升级依赖:升级分为SD卡升级和在线升级两种。 + +- SD卡升级依赖升级包和SD卡安装。 +- 在线升级依赖手机厂商部署的用于管理升级包的服务器。服务器由手机厂商部署,IP由调用者传入,请求的request接口是固定的,由手机厂商开发。 + +## 导入模块 + +```js +import client from '@ohos.update' +``` + +## 权限列表 + +无 + +## Updater + +### getNewVersionInfo + +getNewVersionInfo(callback: AsyncCallback\): void + +获取新版本信息,使用callback方式作为异步方法。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------ | ---- | ------------------ | +| callback | AsyncCallback<[NewVersionInfo](#newversioninfo)> | 否 | 回调返回新版本信息 | + +**示例:** + +``` +updater.getNewVersionInfo(info => { + console.log("getNewVersionInfo success " + info.status); + console.log(`info versionName = ` + info.result[0].versionName); + console.log(`info versionCode = ` + info.result[0].versionCode); + console.log(`info verifyInfo = ` + info.result[0].verifyInfo); +)}; +``` + +### getNewVersionInfo + +getNewVersionInfo(): Promise\ + +获取新版本信息,使用promise方式作为异步方法。 + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------- | ------------------------- | +| Promise\<[NewVersionInfo](#newversioninfo)> | Promise,用于异步获取结果 | + +**示例:** + +``` +var p = updater.getNewVersionInfo(); +p.then(function (value) { + console.log(`info versionName = ` + value.result[0].versionName); + console.log(`info versionCode = ` + value.result[0].versionCode); + console.log(`info verifyInfo = ` + value.result[0].verifyInfo); +}).catch(function (err) { + console.log("getNewVersionInfo promise error: " + err.code); +)}; +``` + +### checkNewVersion + +checkNewVersion(callback: AsyncCallback\): void + +检查新版本,使用callback方式作为异步方法。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------- | ---- | ------------------ | +| callback | AsyncCallback\<[NewVersionInfo](#newversioninfo)> | 否 | 回调返回新版本信息 | + +**示例:** + +``` +updater.checkNewVersion(info => { + console.log("checkNewVersion success " + info.status); + console.log(`info versionName = ` + info.result[0].versionName); + console.log(`info versionCode = ` + info.result[0].versionCode); + console.log(`info verifyInfo = ` + info.result[0].verifyInfo); +)}; +``` + +### checkNewVersion + +checkNewVersion(): Promise\ + +检查新版本,使用promise方式作为异步方法。 + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------- | ------------------------- | +| Promise\<[NewVersionInfo](#newversioninfo)> | Promise函数返回新版本信息 | + +**示例:** + +``` +var p = updater.checkNewVersion(); +p.then(function (value) { + console.log(`info versionName = ` + value.result[0].versionName); + console.log(`info versionCode = ` + value.result[0].versionCode); + console.log(`info verifyInfo = ` + value.result[0].verifyInfo); +}).catch(function (err) { + console.log("checkNewVersion promise error: " + err.code); +)}; +``` + +### verifyUpdatePackage + +verifyUpdatePackage(upgradeFile: string, certsFile: string): void + +升级前检查升级包是否有效。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----------- | ------ | ---- | ------------------ | +| upgradeFile | string | 是 | 待校验的升级包路径 | +| certsFile | string | 是 | 证书路径 | + +**示例:** + +``` +var getVar = update.getUpdater(); +getVar.on("verifyProgress", function (callback){ + console.info('on verifyProgress ' + callback.percent); +}); +getVar.verifyUpdatePackage("XXX", "XXX"); +getVar.off("verifyProgress"); +``` + +### rebootAndCleanUserData + +rebootAndCleanUserData(): Promise\ + +重启设备并清除用户分区数据。 + +**返回值:** + +| 类型 | 说明 | +| ---------------- | ------------------------------- | +| Promise\ | Promise示例,用于异步获取结果。 | + +**示例:** + +``` +var getVar = update.getUpdater(); +p = getVar.rebootAndCleanUserData(); +p.then(function (value) { + console.info("rebootAndCleanUserData promise success: " + value); +}).catch(function (err) { + console.info("rebootAndCleanUserData promise error: " + err.code); +}); +``` + +### rebootAndCleanUserData + +rebootAndCleanUserData(callback: AsyncCallback\): void + +重启设备并清除用户分区数据。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ---------------------- | +| callback | Function | 是 | AsyncCallback\ | + +**示例:** + +``` +var getVar = update.getUpdater(); +getVar.rebootAndCleanUserData(function (err, data) { + if (err.code == 0) { + console.info("rebootAndCleanUserData callback success:" + data) + } else { + console.info("rebootAndCleanUserData callback err:" + err.code) + } +}); +``` + +### applyNewVersion + +applyNewVersion(): Promise\ + +重启设备后安装升级包。 + +**返回值:** + +| 类型 | 说明 | +| ---------------- | ------------------------------- | +| Promise\ | Promise示例,用于异步获取结果。 | + +**示例:** + +``` +var getVar = update.getUpdater(); +p.then(function (value) { + console.info("applyNewVersion promise success: " + value); +}).catch(function (err) { + console.info("applyNewVersion promise error: " + err.code); +}); +``` + +### applyNewVersion + +applyNewVersion(callback: AsyncCallback\): void + +重启设备后安装升级包。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ---------------------- | +| callback | Function | 是 | AsyncCallback\ | + +**示例:** + +``` +var getVar = update.getUpdater(); +getVar.applyNewVersion(function (err, data) { + if (err.code == 0) { + console.info("applyNewVersion callback success:" + data) + } else { + console.info("applyNewVersion callback err:" + err.code) + } +}); +``` + +### download + +download(): void + +下载新版本,并监听下载进程。 + +**示例:** + +``` +updater.on("downloadProgress", progress => { + console.log("downloadProgress on" + progress); + console.log(`downloadProgress status: ` + progress.status); + console.log(`downloadProgress percent: ` + progress.percent); +)}; +updater.download(); +``` + +### upgrade + +updater.upgrade():void + +启动升级。 + +**示例:** + +``` +updater.on("upgradeProgress", progress => { + console.log("upgradeProgress on" + progress); + console.log(`upgradeProgress status: ` + progress.status); + console.log(`upgradeProgress percent: ` + progress.percent); +)}; +updater.upgrade(); +``` + +### setUpdatePolicy + +setUpdatePolicy(policy: UpdatePolicy, callback: AsyncCallback\): void + +设置升级策略,使用callback方式作为异步方法。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------- | ---- | ------------ | +| policy | [UpdatePolicy](#updatepolicy) | 是 | 设置升级策略 | +| callback | AsyncCallback\ | 是 | 回调返回结果 | + +**示例:** + +``` +// 设置策略 +let policy = { +autoDownload: false, +autoDownloadNet: true, +mode: 2, +autoUpgradeInterval: [ 2, 3 ], +autoUpgradeCondition: 2 +} +updater.setUpdatePolicy(policy, function(result) { +console.log("setUpdatePolicy ", result)}); +``` + +### setUpdatePolicy + +setUpdatePolicy(policy: UpdatePolicy): Promise\ + +设置升级策略,使用promise方式作为异步方法。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ----------------------------- | ---- | ------------ | +| policy | [UpdatePolicy](#updatepolicy) | 是 | 设置升级策略 | + +**返回值:** + +| 类型 | 说明 | +| ---------------- | ----------------------- | +| Promise\ | Promise函数返回设置结果 | + +**示例:** + +``` +let policy = { +autoDownload: false, +autoDownloadNet: true, +mode: 2, +autoUpgradeInterval: [ 2, 3 ], +autoUpgradeCondition: 2 +} +updater.setUpdatePolicy(policy) +.then(data=> +console.log('set policy success') +) +``` + +### getUpdatePolicy + +getUpdatePolicy(callback: AsyncCallback\): void + +获取升级策略信息,使用callback方式作为异步方法。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------------- | ---- | -------------------- | +| callback | AsyncCallback\<[UpdatePolicy](#updatepolicy)> | 否 | 回调返回升级策略信息 | + +**示例:** + +``` +updater.getUpdatePolicy(policy => { + console.log("getUpdatePolicy success"); + console.log(`policy autoDownload = ` + policy.autoDownload); + console.log(`policy autoDownloadNet = ` + policy.autoDownloadNet); + console.log(`policy mode = ` + policy.mode); +)}; +``` + +### getUpdatePolicy + +getUpdatePolicy(): Promise\ + +获取升级策略,通过promise方式作为异步方法。 + +**返回值:** + +| 类型 | 说明 | +| --------------------------------------- | --------------------------- | +| Promise\<[UpdatePolicy](#updatepolicy)> | Promise函数返回升级策略信息 | + +**示例:** + +``` +p = updater.getUpdatePolicy(); +p.then(function (value) { + console.log(`info autoDownload = ` + value.autoDownload); + console.log(`info autoDownloadNet = ` + value.autoDownloadNet); + console.log(`info mode = ` + value.mode); +}).catch(function (err) { + console.log("getUpdatePolicy promise error: " + err.code); +)}; +``` + +## update.getUpdater + +getUpdater(upgradeFile: string, updateType?: UpdateTypes): Updater + +获取本地升级Updater。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----------- | --------------------------- | ---- | -------- | +| upgradeFile | string | 是 | 升级文件 | +| updateType | [UpdateTypes](#updatetypes) | 是 | 升级类型 | + +**返回值:** + +| 类型 | 说明 | +| ------------------- | -------- | +| [Updater](#updater) | 升级对象 | + +**示例:** + +``` +try { + page.data.updater = update.getUpdater('/data/updater/updater.zip', 'OTA'); +} catch(error) { + console.error(" Fail to get updater error: " + error); +} +``` + +## update.getUpdaterForOther + +getUpdaterForOther(upgradeFile: string, device: string, updateType?: UpdateTypes): Updater + +获取升级对象给待升级设备。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----------- | --------------------------- | ---- | ---------- | +| upgradeFile | string | 是 | 升级文件 | +| device | string | 是 | 待升级设备 | +| updateType | [UpdateTypes](#updatetypes) | 是 | 升级类型 | + +**返回值:** + +| 类型 | 说明 | +| ------------------- | -------- | +| [Updater](#updater) | 升级对象 | + +**示例:** + +``` +try { + page.data.updater = update.getUpdaterForOther('/data/updater/updater.zip', '1234567890', 'OTA'); +} catch(error) { + console.error(" Fail to get updater error: " + error); +} +``` + +## update.getUpdaterFromOther + +getUpdaterFromOther(upgradeFile: string, device: string, updateType?: UpdateTypes): Updater + +获取其它设备为本设备升级的Updater。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ----------- | --------------------------- | ---- | ---------- | +| upgradeFile | string | 是 | 升级文件 | +| device | string | 是 | 待升级设备 | +| updateType | [UpdateTypes](#updatetypes) | 是 | 升级类型 | + +**返回值:** + +| 类型 | 说明 | +| ------------------- | -------- | +| [Updater](#updater) | 升级对象 | + +**示例:** + +``` +try { + page.data.updater = update.getUpdaterFromOther('/data/updater/updater.zip', '1234567890', 'OTA'); +} catch(error) { + console.error(" Fail to get updater error: " + error); +} +``` + +## UpdateTypes + +升级类型。 + +| 参数名 | 说明 | +| ------ | -------- | +| OTA | OTA升级 | +| patch | 补丁升级 | + +## PackageTypes + +升级包类型。 + +| 参数名 | 默认值 | 说明 | +| -------------------- | ------ | -------------- | +| PACKAGE_TYPE_NORMAL | 1 | 通用升级包 | +| PACKAGE_TYPE_BASE | 2 | 基础升级包 | +| PACKAGE_TYPE_CUST | 3 | 定制升级包 | +| PACKAGE_TYPE_PRELOAD | 4 | 预装升级包 | +| PACKAGE_TYPE_COTA | 5 | 参数配置升级包 | +| PACKAGE_TYPE_VERSION | 6 | 版本升级包 | +| PACKAGE_TYPE_PATCH | 7 | 补丁包 | + +## InstallMode + +安装模式。 + +| 参数名 | 默认值 | 说明 | +| ------------------- | ------ | -------- | +| INSTALL_MODE_NORMAL | 0 | 正常升级 | +| INSTALL_MODE_NIGHT | 1 | 夜间升级 | +| INSTALL_MODE_AUTO | 2 | 自动升级 | + +## NewVersionStatus + +新版本检测状态。 + +| 参数名 | 默认值 | 说明 | +| ------------------- | ------ | ---------------- | +| VERSION_STATUS_ERR | -1 | 检测版本时出错 | +| VERSION_STATUS_NEW | 0 | 检测到新版本 | +| VERSION_STATUS_NONE | 1 | 没有检测到新版本 | +| VERSION_STATUS_BUSY | 2 | 检测版本时忙 | + +## UpdatePolicy + +升级策略。 + +| 名称 | 参数类型 | 必填 | 说明 | +| ------------------- | --------------------------- | ---- | -------------- | +| autoDownload | bool | 是 | 自动升级开关 | +| installMode | [InstallMode](#installmode) | 是 | 安装模式 | +| autoUpgradeInterval | Array\ | 是 | 自动升级时间段 | + +## NewVersionInfo + +新版本信息。 + +| 名称 | 参数类型 | 必填 | 说明 | +| --------------- | ------------------------------------------- | ---- | -------- | +| status | [NewVersionStatus](#newversionstatus) | 是 | 升级状态 | +| errMsg | string | 是 | 错误信息 | +| checkResults | Array<[CheckResult](#checkresult)> | 是 | 检测结果 | +| descriptionInfo | Array\<[DescriptionInfo](#descriptioninfo)> | 是 | 描述信息 | + +## CheckResult + +检测结果。 + +| 名称 | 参数类型 | 必填 | 说明 | +| ------------- | ----------------------------- | ---- | ------------ | +| versionName | string | 是 | 版本名称 | +| versionCode | number | 是 | 版本编码 | +| size | number | 是 | 版本大小 | +| verifyInfo | string | 是 | 版本校验信息 | +| packageType | [PackageTypes](#packagetypes) | 是 | 版本类型 | +| descriptionId | string | 是 | 版本描述信息 | + +## DescriptionInfo + +版本描述信息。 + +| 名称 | 参数类型 | 必填 | 说明 | +| ------------- | -------- | ---- | ----------------- | +| descriptionId | string | 是 | 版本versionId信息 | +| content | string | 是 | 版本changelog信息 | \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/01.\345\272\224\347\224\250\344\270\212\344\270\213\346\226\207.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/01.\345\272\224\347\224\250\344\270\212\344\270\213\346\226\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..a2c44560eb033227b69480da9e582550533f6729 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/01.\345\272\224\347\224\250\344\270\212\344\270\213\346\226\207.md" @@ -0,0 +1,92 @@ +--- +title: 应用上下文 +permalink: /pages/000b000800 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 应用上下文 + + +## 导入模块 + +``` +import app from '@system.app'; +``` + +## 权限列表 + +无 + + +## app.getInfo + +getInfo(): <AppResponse> + +获取当前应用配置文件中声明的信息。 + +- 返回值 + **表1** AppResponse + + | | | | + | -------- | -------- | -------- | + | 参数名 | 类型 | 说明 | + | appID6+ | string | 表示应用的包名,用于标识应用的唯一性。 | + | appName | string | 表示应用的名称。 | + | versionName | string | 表示应用的版本名称。 | + | versionCode | number | 表示应用的版本号。 | + +- 示例 + ``` + export default { + getInfo(){ + var info = app.getInfo(); + console.log(JSON.stringify(info)); + } + } + ``` + + +## app.terminate + +terminate(): void + +退出当前Ability + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 从API Version 7 开始,推荐使用新接口['@ohos.ability.featureAbility'](/pages/000b000000)。 + +- 示例 + ``` + export default { + terminate(){ + app.terminate(); + }} + ``` + +## app.requestFullWindow + +requestFullWindow(duration: number): void + +请求应用以全窗口运行,FA在某些场景下(如半模态FA)会以非全窗口运行,调用该接口会从非全窗口切换为全窗口运行,如果已经以全窗口运行则该接口调用无效。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | duration | number | 否 | 请求全屏时,设定非全屏到全屏的过渡时间,单位为毫秒,默认时间与非全屏到全屏的距离成正比。 | + +- 示例 + ``` + export default { + requestFullWindow(){ + app.requestFullWindow({ + duration: 200}); + } + } + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/02.\346\227\245\345\277\227\346\211\223\345\215\260.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/02.\346\227\245\345\277\227\346\211\223\345\215\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..8575d69e0e104a22a38d683aba41081b484d19db --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/02.\346\227\245\345\277\227\346\211\223\345\215\260.md" @@ -0,0 +1,101 @@ +--- +title: 日志打印 +permalink: /pages/000b000801 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 日志打印 + + +## 导入模块 + +无需导入。 + +## 权限列表 + +无 + + +## console.debug + +debug(message: string): void + +打印debug级别的日志信息。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | message | string | 是 | 表示要打印的文本信息。 | + + +## console.log + +log(message: string): void + +打印debug级别的日志信息。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | message | string | 是 | 表示要打印的文本信息。 | + + +## console.info + +info(message: string): void + +打印info级别的日志信息。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | message | string | 是 | 表示要打印的文本信息。 | + + +## console.warn + +warn(message: string): void + +打印warn级别的日志信息。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | message | string | 是 | 表示要打印的文本信息。 | + + +## console.error + +error(message: string): void + +打印error级别的日志信息。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | message | string | 是 | 表示要打印的文本信息。 | + + +## 示例 + +``` +export default { + clickConsole(){ + var versionCode = 1; + console.info('Hello World. The current version code is ' + versionCode); + console.log(`versionCode: ${versionCode}`); + // 以下写法从API Version 6开始支持console.log('versionCode:%d.', versionCode); + } +} +``` + +在DevEco Studio的底部,切换到“HiLog”窗口。选择当前的设备及进程,日志级别选择Info,搜索内容设置为“Hello World”。此时窗口仅显示符合条件的日志,效果如图所示: + +![zh-cn_image_0000001200913929](/images/application-dev/reference/apis/figures/zh-cn_image_0000001200913929.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/03.\351\241\265\351\235\242\350\267\257\347\224\261.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/03.\351\241\265\351\235\242\350\267\257\347\224\261.md" new file mode 100644 index 0000000000000000000000000000000000000000..a2f723f5b1c26cfc422c37e1aea2650a9c9ef16e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/03.\351\241\265\351\235\242\350\267\257\347\224\261.md" @@ -0,0 +1,336 @@ +--- +title: 页面路由 +permalink: /pages/000b000802 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 页面路由 + +> ![icon-notice.gif](/images/application-dev/reference/apis/public_sys-resources/icon-notice.gif) **须知:** +> 页面路由需要在页面渲染完成之后才能调用,在onInit和onReady生命周期中页面还处于渲染阶段,禁止调用页面路由方法。 + + +## 导入模块 + +``` +import router from '@system.router'; +``` + +## 权限列表 + +无 + +## router.push + +push(Object): void + +跳转到应用内的指定页面。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | uri | string | 是 | 表示目标页面的uri,可以用以下两种格式:
- 页面绝对路径,由配置文件中pages列表提供,例如:
  - pages/index/index
  - pages/detail/detail
- 特殊值,如果uri的值是"/",则跳转到首页。 | + | params | Object | 否 | 跳转时要同时传递到目标页面的数据,跳转到目标页面后,参数可以在页面中直接使用,如this.data1(data1为跳转时params参数中的key值)。如果目标页面中已有该字段,则其值会被传入的字段值覆盖。 | + +- 示例 + ``` + // 在当前页面中 + export default { + pushPage() { + router.push({ + uri: 'pages/routerpage2/routerpage2', + params: { + data1: 'message', + data2: { + data3: [123, 456, 789] + }, + }, + }); + } + } + ``` + + ``` + // 在routerpage2页面中 + export default { + data: { + data1: 'default', + data2: { + data3: [1, 2, 3] + } + }, + onInit() { + console.info('showData1:' + this.data1); + console.info('showData3:' + this.data2.data3); + } + } + ``` + + > ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** + > 页面路由栈支持的最大Page数量为32。 + + +## router.replace + +replace(Object): void + +用应用内的某个页面替换当前页面,并销毁被替换的页面。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | uri | string | 是 | 目标页面的uri,可以是以下的两种格式:
- 页面绝对路径,由配置文件中pages列表提供,例如:
  - pages/index/index
  - pages/detail/detail
- 特殊值,如果uri的值是"/",则跳转到首页。 | + | params | Object | 否 | 跳转时要同时传递到目标页面的数据,跳转到目标页面后,参数可以在页面中直接使用,如this.data1(data1为跳转时params参数中的key值)。如果目标页面中已有该字段,则其值会被传入的字段值覆盖。 | + +- 示例 + ``` + // 在当前页面中 + export default { + replacePage() { + router.replace({ + uri: 'pages/detail/detail', + params: { + data1: 'message', + }, + }); + } + } + ``` + + ``` + // 在detail页面中 + export default { + data: { + data1: 'default' + }, + onInit() { + console.info('showData1:' + this.data1) + } + } + ``` + +## router.back + +back(Object): void + +返回上一页面或指定的页面。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | uri | string | 否 | 返回到指定uri的界面,如果页面栈上没有uri页面,则不响应该情况。如果uri未设置,则返回上一页。 | + +- 示例 + ``` + // index页面 + export default { + indexPushPage() { + router.push({ + uri: 'pages/detail/detail', + }); + } + } + ``` + + ``` + // detail页面 + export default { + detailPushPage() { + router.push({ + uri: 'pages/mall/mall', + }); + } + } + ``` + + ``` + // mall页面通过back,将返回detail页面 + export default { + mallBackPage() { + router.back(); + } + } + ``` + + ``` + // detail页面通过back,将返回index页面 + export default { + defaultBack() { + router.back(); + } + } + ``` + + ``` + // 通过back,返回到detail页面 + export default { + backToDetail() { + router.back({uri:'pages/detail/detail'}); + } + } + ``` + + > ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** + > 示例中的uri字段是页面路由,由配置文件中的pages列表指定。 + +## router.clear + +clear(): void + +清空页面栈中的所有历史页面,仅保留当前页面作为栈顶页面。 + +- 示例 + ``` + export default { + clearPage() { + router.clear(); + } + } + ``` + +## router.getLength + +getLength(): string + +获取当前在页面栈内的页面数量。 + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | string | 页面数量,页面栈支持最大数值是32。 | + +- 示例 + ``` + export default { + getLength() { + var size = router.getLength(); + console.log('pages stack size = ' + size); + } + } + ``` + +## router.getState + +getState(): <RouterState> + +获取当前页面的状态信息。 + +- 返回值 + **表1** RouterState + + | 参数名 | 类型 | 说明 | + | -------- | -------- | -------- | + | index | number | 表示当前页面在页面栈中的索引。
> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:**
> 从栈底到栈顶,index从1开始递增。 | + | name | string | 表示当前页面的名称,即对应文件名。 | + | path | string | 表示当前页面的路径。 | + +- 示例 + ``` + export default { + getState() { + var page = router.getState(); + console.log('current index = ' + page.index); + console.log('current name = ' + page.name); + console.log('current path = ' + page.path); + } + } + ``` + +## router.enableAlertBeforeBackPage6+ + +enableAlertBeforeBackPage(Object): void + +开启页面返回询问对话框。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | message | string | 是 | 询问对话框内容。 | + | success | () => void | 否 | 接口调用成功的回调函数。 | + | fail | () => void | 否 | 接口调用失败的回调函数。 | + | complete | () => void | 否 | 接口调用结束的回调函数。 | + +- 示例 + ``` + export default { + enableAlertBeforeBackPage() { + router.enableAlertBeforeBackPage({ + message: 'Message Info', + success: function() { + console.log('success'); + }, + fail: function() { + console.log('fail'); + }, + }); + } + } + ``` + +## router.disableAlertBeforeBackPage6+ + +disableAlertBeforeBackPage(Object): void + +禁用页面返回询问对话框。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | success | () => void | 否 | 接口调用成功的回调函数。 | + | fail | () => void | 否 | 接口调用失败的回调函数。 | + | complete | () => void | 否 | 接口调用结束的回调函数。 | + +- 示例 + ``` + export default { + disableAlertBeforeBackPage() { + router.disableAlertBeforeBackPage({ + success: function() { + console.log('success'); + }, + fail: function() { + console.log('fail'); + }, + }); + } + } + ``` + +## router.getParams7+ + +getParams(): Object + +获取发起跳转的页面往当前页传入的参数。 + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | Object | 发起跳转的页面往当前页传入的参数。 | + +- 示例 + ``` + // 在当前页面中 + export default { + pushPage() { + router.push({ + uri: 'pages/detail/detail', + params: { + data1: 'message', + }, + }); + } + } + // 在detail页面中 + export default { + onInit() { + console.info('showData1:' + router.getParams().data1); + } + } + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/04.\345\274\271\347\252\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/04.\345\274\271\347\252\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..1213cac6a6cd1b6c30601385cf444813e30a66fe --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/04.\345\274\271\347\252\227.md" @@ -0,0 +1,146 @@ +--- +title: 弹窗 +permalink: /pages/000b000803 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 弹窗 + + +## 导入模块 + +``` +import prompt from '@system.prompt'; +``` + + +## 权限列表 + +无 + +## prompt.showToast + +showToast(Object): void + +显示文本弹窗。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | message | string | 是 | 显示的文本信息。 | + | duration | number | 否 | 默认值1500ms,建议区间:1500ms-10000ms。
> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:**
> 若小于1500ms则取默认值,最大取值为10000ms。 | + | $[bottom]^{5+}$ | <length> | 否 | 设置弹窗边框距离屏幕底部的位置。
> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:**
> 仅手机和平板设备支持。 | + +- 示例 + ``` + export default { + showToast() { + prompt.showToast({ + message: 'Message Info', + duration: 2000, + }); + } + } + ``` + + +## prompt.showDialog + +showDialog(): void + +在页面内显示对话框。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | title | string | 否 | 标题文本。 | + | message | string | 否 | 内容文本。 | + | buttons | Array | 否 | 对话框中按钮的数组,结构为:{text:'button', color: '\#666666'},支持1-3个按钮。其中第一个为positiveButton;第二个为negativeButton;第三个为neutralButton。 | + | success | Function | 否 | 接口调用成功的回调函数,返回值如success返回值所示。 | + | cancel | Function | 否 | 取消调用此接口的回调函数。 | + | complete | Function | 否 | 弹框退出时的回调函数。 | + + success返回值: + + | 参数名 | 类型 | 说明 | + | -------- | -------- | -------- | + | index | number | 选中按钮在buttons数组中的索引。 | + +- 示例 + ``` + export default { + showDialog() { + prompt.showDialog({ + title: 'Title Info', + message: 'Message Info', + buttons: [ + { + text: 'button', + color: '#666666', + }, + ], + success: function(data) { + console.log('dialog success callback,click button : ' + data.index); + }, + cancel: function() { + console.log('dialog cancel callback'); + }, + }); + } + } + ``` + +## prompt.showActionMenu6+ + +showActionMenu(Object): void + +显示操作菜单。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | title | string | 否 | 标题文本。 | + | buttons | Array | 是 | 对话框中按钮的数组,结构为:{text:'button', color: '\#666666'},支持1-6个按钮。大于6个按钮时弹窗不显示。 | + | success | (data: TapIndex) => void | 否 | 接口调用成功的回调函数。 | + | cancel | () => void | 否 | 接口调用失败的回调函数。 | + | complete | () => void | 否 | 接口调用结束的回调函数。 | + + **表1** TapIndex + + | 参数名 | 类型 | 说明 | + | -------- | -------- | -------- | + | tapIndex | number | 选中按钮在buttons数组中的索引,从0开始。 | + +- 示例 + ``` + export default { + showActionMenu() { + prompt.showActionMenu({ + title: 'Title Info', + buttons: [ + { + text: 'item1', + color: '#666666', + }, + { + text: 'item2', + color: '#000000', + }, + ], + success: function(data) { + console.log('dialog success callback,click button : ' + data.tapIndex); + }, + fail: function(data) { + console.log('dialog fail callback' + data.errMsg); + }, + }); + } + } + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/05.\345\272\224\347\224\250\351\205\215\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/05.\345\272\224\347\224\250\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..b386f1e8edb9f91e2132a9ecfd7acda297f714af --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/05.\345\272\224\347\224\250\351\205\215\347\275\256.md" @@ -0,0 +1,63 @@ +--- +title: 应用配置 +permalink: /pages/000b000804 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 应用配置 + +- [导入模块](#导入模块) +- [权限列表](#权限列表) +- [configuration.getLocale](#configurationgetLocale) + + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> - 从API Version 7 开始,该接口不再维护,推荐使用新接口['@ohos.i18n'](/pages/000b000101)和['@ohos.intl'](/pages/000b000102)。 +> +> +> + + +## 导入模块 + +``` +import configuration from '@system.configuration'; +``` + +## 权限列表 + +无 + + +## configuration.getLocale + +getLocale(): <LocaleResponse> + +获取应用当前的语言和地区。默认与系统的语言和地区同步。 + +- 返回值 + **表1** LocaleResponse + + | 参数名 | 类型 | 说明 | + | -------- | -------- | -------- | + | language | string | 语言。例如:zh。 | + | countryOrRegion | string | 国家或地区。例如:CN。 | + | dir | string | 文字布局方向。取值范围:
- ltr:从左到右;
- rtl:从右到左。 | + | $unicodeSetting^{5+}$ | string | 语言环境定义的Unicode语言环境键集,如果此语言环境没有特定键集,则返回空集。
例如:{"nu":"arab"},表示当前环境下的数字采用阿拉伯语的数字。 | + +- 示例 + ``` + export default { + getLocale() { + const localeInfo = configuration.getLocale(); + console.info(localeInfo.language); + } + } + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/06.\345\256\232\346\227\266\345\231\250.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/06.\345\256\232\346\227\266\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..5839e867f9507b9adcc7e4b7df696a2fc88b7d19 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/06.\345\256\232\346\227\266\345\231\250.md" @@ -0,0 +1,132 @@ +--- +title: 定时器 +permalink: /pages/000b000805 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 定时器 + + +## 导入模块 + +无需导入。 + + +## 权限列表 + +无 + + +## setTimeout + +setTimeout(handler[,delay[,…args]]): number + +设置一个定时器,该定时器在定时器到期后执行一个函数。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | handler | Function | 是 | 定时器到期后执行函数。 | + | delay | number | 否 | 延迟的毫秒数,函数的调用会在该延迟之后发生。如果省略该参数,delay取默认值0,意味着“马上”执行,或尽快执行。 | + | ...args | Array<any> | 否 | 附加参数,一旦定时器到期,它们会作为参数传递给handler。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | number | timeout定时器的ID。 | + +- 示例 + ``` + export default { + setTimeOut() { + var timeoutID = setTimeout(function() { + console.log('delay 1s'); + }, 1000); + } + } + ``` + + +## clearTimeout + +clearTimeout(timeoutID: number): void + +取消了先前通过调用setTimeout()建立的定时器。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | timeoutID | number | 是 | 要取消定时器的ID, 是由setTimeout()返回的。 | + +- 示例 + ``` + export default { + clearTimeOut() { + var timeoutID = setTimeout(function() { + console.log('do after 1s delay.'); + }, 1000); + clearTimeout(timeoutID); + } + } + ``` + + +## setInterval + +setInterval(handler[, delay[, ...args]]): number + +重复调用一个函数,在每次调用之间具有固定的时间延迟。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | handler | Function | 是 | 要重复调用的函数。 | + | delay | number | 否 | 延迟的毫秒数(一秒等于1000毫秒),函数的调用会在该延迟之后发生。 | + | ...args | Array<any> | 否 | 附加参数,一旦定时器到期,他们会作为参数传递给handler。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | number | intervallID重复定时器的ID。 | + +- 示例 + ``` + export default { + setInterval() { + var intervalID = setInterval(function() { + console.log('do very 1s.'); + }, 1000); + } + } + ``` + + +## clearInterval + +clearInterval(intervalID: number): void + +可取消先前通过 setInterval() 设置的重复定时任务。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | intervalID | number | 是 | 要取消的重复定时器的ID,是由 setInterval() 返回的。 | + +- 示例 + ``` + export default { + clearInterval() { + var intervalID = setInterval(function() { + console.log('do very 1s.'); + }, 1000); + clearInterval(intervalID); + } + } + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/07.\350\256\276\347\275\256\347\263\273\347\273\237\346\227\266\351\227\264.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/07.\350\256\276\347\275\256\347\263\273\347\273\237\346\227\266\351\227\264.md" new file mode 100644 index 0000000000000000000000000000000000000000..4e037e44624615739afc321e383b0bba8f2aec1a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/07.\350\256\276\347\275\256\347\263\273\347\273\237\346\227\266\351\227\264.md" @@ -0,0 +1,187 @@ +--- +title: 设置系统时间 +permalink: /pages/000b000806 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 设置系统时间 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 支持设备 + +| 手机 | 平板 | 智慧屏 | 智能穿戴 | +| -------- | -------- | -------- | -------- | +| 支持 | 支持 | 支持 | 支持 | + + +## 导入模块 + +``` +import systemTime from '@ohos.systemTime'; +``` + + +## systemTime.setTime + +setTime(time : number, callback : AsyncCallback<void>) : void + +设置系统时间,需要ohos.permission.SET_TIME权限。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | time | number | 是 | 目标时间戳(毫秒)。 | + | callback | AsyncCallback<void> | 是 | 回调函数,可以在回调函数中处理接口返回值。 | + +- 示例: + ``` + // time对应的时间为2021-01-20 02:36:25 + var time = 1611081385000; + systemTime.setTime(time, (error, data) => { + if (error) { + console.error(`failed to systemTime.setTime because ` + JSON.stringify(error)); + return; + } + console.log(`success to systemTime.setTime: ` + JSON.stringify(data)); + }); + ``` + + +## systemTime.setTime + +setTime(time : number) : Promise<void> + +设置系统时间,需要ohos.permission.SET_TIME权限。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | time | number | 是 | 目标时间戳(毫秒)。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | 返回的异步回调函数。 | + +- 示例: + ``` + // time对应的时间为2021-01-20 02:36:25 + var time = 1611081385000; + systemTime.setTime(time).then((data) => { + console.log(`success to systemTime.setTime: ` + JSON.stringify(data)); + }).catch((error) => { + console.error(`failed to systemTime.setTime because ` + JSON.stringify(error)); + }); + ``` + + +## systemTime.setDate + +setDate(date: Date, callback: AsyncCallback<void>): void + +设置系统日期,需要ohos.permission.SET_TIME权限。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | date | Date | 是 | 目标日期。 | + | callback | AsyncCallback<void> | 是 | 回调函数,可以在回调函数中处理接口返回值。 | + +- 示例: + ``` + var data = new Date("October 13, 2020 11:13:00"); + systemTime.setDate(data,(error, data) => { + if (error) { + console.error('SystemTimePlugin setDate failed because ' + JSON.stringify(error)); + return; + } + console.info('SystemTimePlugin setDate success data : ' + JSON.stringify(data)); + }); + ``` + + +## systemTime.setDate + +setDate(date: Date): Promise<void> + +设置系统日期,需要ohos.permission.SET_TIME权限。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | date | Date | 是 | 目标日期。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | 返回的异步回调函数。 | + +- 示例: + ``` + var data = new Date("October 13, 2020 11:13:00"); + systemTime.setDate(data).then((value) => { + console.log(`SystemTimePlugin success to systemTime.setDate: ` + JSON.stringify(value)); + }).catch((error) => { + console.error(`SystemTimePlugin failed to systemTime.setDate because: ` + JSON.stringify(error)); + }); + ``` + + +## systemTime.setTimezone + +setTimezone(timezone: string, callback: AsyncCallback<void>): void + +设置系统时区,需要ohos.permission.SET_TIME_ZONE权限。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | timezone | string | 是 | 系统时区。 | + | callback | AsyncCallback<void> | 是 | 回调函数,可以在回调函数中处理接口返回值。 | + +- 示例: + ``` + systemTime.setTimezone('Asia/Shanghai', (error, data) => { + if (error) { + console.error('SystemTimePlugin setTimezone failed because ' + JSON.stringify(error)); + return; + } + console.info('SystemTimePlugin setTimezone success data : ' + JSON.stringify(data)); + }); + ``` + + +## systemTime.setTimezone + +setTimezone(timezone: string): Promise<void> + +设置系统时区,需要ohos.permission.SET_TIME_ZONE权限。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | timezone | string | 是 | 系统时区。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | 返回的异步回调函数。 | + +- 示例: + ``` + systemTime.setTimezone('Asia/Shanghai').then((data) => { + console.log(`SystemTimePlugin success to systemTime.setTimezone: ` + JSON.stringify(data)); + }).catch((error) => { + console.error(`SystemTimePlugin failed to systemTime.setTimezone because: ` + JSON.stringify(error)); + }); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/08.\345\212\250\347\224\273.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/08.\345\212\250\347\224\273.md" new file mode 100644 index 0000000000000000000000000000000000000000..af83bfb143f804d2b1fe16964c4b48649260fc1a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/08.\345\212\250\347\224\273.md" @@ -0,0 +1,252 @@ +--- +title: 动画 +permalink: /pages/000b000807 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 动画 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +requestAnimationFrame:无需导入 + +cancelAnimationFrame:无需导入 + +createAnimator: + +``` +import animator from '@ohos.animator'; +``` + +## 权限列表 + +无 + + +## requestAnimationFrame + +requestAnimationFrame(handler[, [ ...args]]): number + +请求动画帧,逐帧回调JS函数。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | handler | Function | 是 | 表示要逐帧回调的函数。requestAnimationFrame函数回调handler函数时会在第一个参数位置传入timestamp时间戳。它表示requestAnimationFrame开始去执行回调函数的时刻。 | + | ...args | Array<any> | 否 | 附加参数,函数回调时,他们会作为参数传递给handler。 | + +- 返回值 + | 类型 | 说明 | + | -------- | -------- | + | number | requestID请求的ID。 | + +- 示例 + ``` + +
+ +
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + } + .btn{ + width: 300px; + margin-top: 40px; + } + ``` + + ``` + /* xxx.js */ + export default { + data: { + requestId: 0, + startTime: 0, + }, + beginAnimation() { + cancelAnimationFrame(this.requestId); + this.requestId = requestAnimationFrame(this.runAnimation); + }, + runAnimation(timestamp) { + if (this.startTime == 0) { + this.startTime = timestamp; + } + var elapsed = timestamp - this.startTime; + if (elapsed < 500) { + console.log('callback handler timestamp: ' + timestamp); + this.requestId = requestAnimationFrame(this.runAnimation); + } + } + } + ``` + + +## cancelAnimationFrame + +cancelAnimationFrame(requestId: number): void + +取消动画帧,取消逐帧回调请求。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | requestId | number | 是 | 逐帧回调函数的标识id。 | + +- 示例 + ``` + +
+ + +
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + } + .btn{ + width: 300px; + margin-top: 40px; + } + ``` + + ``` + /* xxx.js */ + export default { + data: { + requestId: 0, + startTime: 0, + }, + beginAnimation() { + cancelAnimationFrame(this.requestId); + this.requestId = requestAnimationFrame(this.runAnimation); + }, + runAnimation(timestamp) { + if (this.startTime == 0) { + this.startTime = timestamp; + } + var elapsed = timestamp - this.startTime; + if (elapsed < 500) { + console.log('callback handler timestamp: ' + timestamp); + this.requestId = requestAnimationFrame(this.runAnimation); + } + }, + stopAnimation() { + cancelAnimationFrame(this.requestId); + } + } + ``` + + +## createAnimator + +createAnimator(options[...]): void + +创建动画对象。 + +- 参数 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | options | Object | 是 | 表示待创建Animator对象的属性,详情见下表options说明。 | + +- options说明 + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | duration | number | 否 | 动画播放的时长,单位毫秒,默认为0。 | + | easing | string | 否 | 动画插值曲线,默认为' ease '。 | + | delay | number | 否 | 动画延时播放时长,单位毫秒,默认为0,即不延时。 | + | fill | string | 否 | 动画启停模式,默认值none,详情见:[animation-fill-mode](/pages/000b0100010004) | + | direction | string | 否 | 动画播放模式,默认值normal,详情见:[animation-direction](/pages/000b0100010004) | + | iterations | number | 否 | 动画播放次数,默认值1,设置为0时不播放,设置为-1时无限次播放。 | + | begin | number | 否 | 动画插值起点,不设置时默认为0。 | + | end | number | 否 | 动画插值终点,不设置时默认为1。 | + +- animator支持的接口 + | 参数名 | 类型 | 说明 | + | -------- | -------- | -------- | + | update | options | 过程中可以使用这个接口更新动画参数,入参与createAnimator一致。 | + | play | - | 开始动画。 | + | finish | - | 结束动画。 | + | pause | - | 暂停动画。 | + | cancel | - | 取消动画。 | + | reverse | - | 倒播动画。 | + +- animator支持的事件: + | 参数名 | 类型 | 说明 | + | -------- | -------- | -------- | + | frame | number | 逐帧插值回调事件,入参为当前帧的插值 | + | cancel | - | 动画被强制取消 | + | finish | - | 动画播放完成 | + | repeat | - | 动画重新播放 | + +- 示例 + ``` + +
+
+
+
+ ``` + + ``` + // js + export default { + data : { + divWidth: 200, + divHeight: 200, + animator: null + }, + onInit() { + var options = { + duration: 1500, + easing: 'friction', + fill: 'forwards', + iterations: 2, + begin: 200.0, + end: 400.0 + }; + this.animator = animator.createAnimator(options); + }, + Show() { + var options1 = { + duration: 2000, + easing: 'friction', + fill: 'forwards', + iterations: 1, + begin: 200.0, + end: 400.0 + }; + this.animator.update(options1); + var _this = this; + this.animator.onframe = function(value) { + _this.divWidth = value; + _this.divHeight = value; + }; + this.animator.play(); + } + } + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/09.\345\272\224\347\224\250\346\211\223\347\202\271.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/09.\345\272\224\347\224\250\346\211\223\347\202\271.md" new file mode 100644 index 0000000000000000000000000000000000000000..bb52db7b6762980a2cce6b8f5ad41faf082f051a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/09.\345\272\224\347\224\250\346\211\223\347\202\271.md" @@ -0,0 +1,163 @@ +--- +title: 应用打点 +permalink: /pages/000b000808 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 应用打点 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import hiAppEvent from '@ohos.hiAppEvent'; +``` + + +## 权限 + +无 + + +## hiAppEvent.write + +write(eventName: string, eventType: EventType, keyValues: object, callback: AsyncCallback<void>): void + +应用事件打点方法,将事件写入到当天的事件文件中,可接收类型为Json对象的事件参数,使用callback方式作为异步回调。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | eventName | string | 是 | 应用事件名称。 | + | eventType | [EventType](#eventtype) | 是 | 应用事件类型。 | + | keyValues | object | 是 | 应用事件的参数,key类型只能为string,value类型只能为string、number、boolean、Array(数组数据类型只能为string、number、boolean)。 | + | callback | AsyncCallback<void> | 否 | 回调函数,可以在回调函数中处理接口返回值。
- 返回值为0表示事件校验成功,事件正常异步写入事件文件;
- 大于0表示事件校验存在异常参数,在忽略异常参数后将事件异步写入事件文件;
- 小于0表示事件校验失败,不将事件写入事件文件。 | + +- 示例: + ``` + hiAppEvent.write("test_event", hiAppEvent.EventType.FAULT, {"int_data":100, "str_data":"strValue"}, (err, value) => { + if (err) { + // 事件写入异常:事件存在异常参数时忽略异常参数后继续写入,或者事件校验失败时不执行写入 + console.error(`failed to write event because ${err.code}`); + return; + } + + // 事件写入正常 + console.log(`success to write event: ${value}`); + }); + ``` + + +## hiAppEvent.write + +write(eventName: string, eventType: EventType, keyValues: object): Promise<void> + +应用事件打点方法,将事件写入到当天的事件文件中,可接收类型为Json对象的事件参数,使用promise方式作为异步回调。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | eventName | string | 是 | 应用事件名称。 | + | eventType | [EventType](#eventtype) | 是 | 应用事件类型。 | + | keyValues | object | 是 | 应用事件的参数,key类型只能为string,value类型只能为string、number、boolean、Array(数组数据类型只能为string、number、boolean)。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<void> | Promise实例,可以在其then()、catch()方法中分别对事件写入成功、写入异常的情况进行回调处理。 | + +- 示例: + ``` + hiAppEvent.write("test_event", hiAppEvent.EventType.FAULT, {"int_data":100, "str_data":"strValue"}) + .then((value) => { + // 事件写入正常 + console.log(`success to write event: ${value}`); + }).catch((err) => { + // 事件写入异常:事件存在异常参数时忽略异常参数后继续写入,或者事件校验失败时不执行写入 + console.error(`failed to write event because ${err.code}`); + }); + ``` + + +## hiAppEvent.configure + +configure(config: ConfigOption): boolean + +应用事件打点配置方法,可用于配置打点开关、文件目录存储限额大小等功能。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | config | [ConfigOption](#configoption) | 是 | 应用事件打点配置项对象。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 配置结果,true 表示配置成功,false 表示配置失败。 | + +- 示例: + ``` + // 配置应用事件打点功能开关 + hiAppEvent.configure({ + disable: true + }); + + // 配置事件文件目录存储限额大小 + hiAppEvent.configure({ + maxStorage: '100M' + }); + ``` + + +## ConfigOption + +此接口提供了应用打点的配置选项。 + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | -------- | -------- | +| disable | boolean | 否 | 应用打点功能开关。配置值为true表示关闭打点功能,false表示不关闭打点功能。 | +| maxStorage | string | 否 | 打点数据本地存储文件所在目录的配额大小,默认限额为“10M”。所在目录大小超出限额后会对目录进行清理操作,会按从旧到新的顺序逐个删除打点数据文件,直到目录大小不超出限额时停止。 | + + +## EventType + +事件类型枚举。 + +| 名称 | 默认值 | 说明 | +| -------- | -------- | -------- | +| FAULT | 1 | 故障类型事件。 | +| STATISTIC | 2 | 统计类型事件。 | +| SECURITY | 3 | 安全类型事件。 | +| BEHAVIOR | 4 | 行为类型事件。 | + + +## Event + +此接口提供了所有预定义事件的事件名称常量。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| USER_LOGIN | string | 是 | 否 | 用户登录事件。 | +| USER_LOGOUT | string | 是 | 否 | 用户登出事件。 | +| DISTRIBUTED_SERVICE_START | string | 是 | 否 | 分布式服务启动事件。 | + + +## Param + +此接口提供了所有预定义参数的参数名称常量。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| USER_ID | string | 是 | 否 | 用户自定义ID。 | +| DISTRIBUTED_SERVICE_NAME | string | 是 | 否 | 分布式服务名称。 | +| DISTRIBUTED_SERVICE_INSTANCE_ID | string | 是 | 否 | 分布式服务实例ID。 | diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/10.\346\200\247\350\203\275\346\211\223\347\202\271.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/10.\346\200\247\350\203\275\346\211\223\347\202\271.md" new file mode 100644 index 0000000000000000000000000000000000000000..42a900dfdf1e6878b968326f13bea5ab8878ed9a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/09.\345\237\272\346\234\254\345\212\237\350\203\275/10.\346\200\247\350\203\275\346\211\223\347\202\271.md" @@ -0,0 +1,120 @@ +--- +title: 性能打点 +permalink: /pages/000b000809 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 性能打点 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import bytrace from '@ohos.bytrace'; +``` + + +## 权限 + +无 + + +## bytrace.startTrace + +startTrace(name: string, taskId: number, expectedTime?: number): void + +标记一个预追踪耗时任务的开始,expectedTime是可选参数,标识该任务的期望耗时。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 要追踪的任务名称 | + | taskId | number | 是 | 任务id | + | expectedTime | number | 否 | 期望的耗时时间,单位:ms | + + > ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** + > 如果有多个相同name的任务需要追踪或者对同一个任务要追踪多次,并且这些会同时被执行,则每次调用startTrace的taskId必须不一致。如果具有相同name的任务是串行执行的,则taskId可以相同。在下面bytrace.finishTrace的示例中会举例说明。 + +- 示例: + ``` + bytrace.startTrace("myTestFunc", 1); + bytrace.startTrace("myTestFunc", 1, 5); //从startTrace到finishTrace流程的耗时期望为5ms + ``` + + +## bytrace.finishTrace + +finishTrace(name: string, taskId: number): void + +标记一个预追踪耗时任务的结束。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 要追踪的任务名称 | + | taskId | number | 是 | 任务id | + + > ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** + > finishTrace的name和taskId必须与流程开始的startTrace对应参数值一致。 + +- 示例: + ``` + bytrace.finishTrace("myTestFunc", 1); + ``` + + ``` + //追踪并行执行的同名任务 + bytrace.startTrace("myTestFunc", 1); + ...... //业务流程 + bytrace.startTrace("myTestFunc", 2); //第二个追踪的任务开始,同时第一个追踪的同名任务还没结束,出现了并行执行,对应接口的taskId需要不同。 + ...... //业务流程 + bytrace.finishTrace("myTestFunc", 1); + ...... //业务流程 + bytrace.finishTrace("myTestFunc", 2); + ``` + + ``` + //追踪串行执行的同名任务 + bytrace.startTrace("myTestFunc", 1); + ...... //业务流程 + bytrace.finishTrace("myTestFunc", 1); //第一个追踪的任务结束 + ...... //业务流程 + bytrace.startTrace("myTestFunc", 1); //第二个追踪的同名任务开始,同名的待追踪任务串行执行。 + ...... //业务流程 + bytrace.finishTrace("myTestFunc", 1); + ``` + + +## bytrace.traceByValue + +traceByValue(name: string, value: number): void + +用来标记一个预追踪的数值变量,该变量的数值会不断变化。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 要追踪的数值变量名称 | + | value | number | 是 | 变量的值 | + +- 示例: + ``` + let traceCount = 3; + bytrace.traceByValue("myTestCount", traceCount); + ...... + traceCount = 5; + bytrace.traceByValue("myTestCount", traceCount); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/01.\350\216\267\345\217\226\350\277\233\347\250\213\347\233\270\345\205\263\347\232\204\344\277\241\346\201\257.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/01.\350\216\267\345\217\226\350\277\233\347\250\213\347\233\270\345\205\263\347\232\204\344\277\241\346\201\257.md" new file mode 100644 index 0000000000000000000000000000000000000000..140d6b637c211b978381fae14334542e34e52dc7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/01.\350\216\267\345\217\226\350\277\233\347\250\213\347\233\270\345\205\263\347\232\204\344\277\241\346\201\257.md" @@ -0,0 +1,350 @@ +--- +title: 获取进程相关的信息 +permalink: /pages/000b000900 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 获取进程相关的信息 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import process from '@ohos.process'; +``` + + +## 权限 + +无 + + +## 属性 + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| egid | number | 是 | 否 | 获取进程的有效组标识。 | +| euid | number | 是 | 否 | 获取进程的有效用户身份。 | +| gid | number | 是 | 否 | 获取进程的组标识。 | +| uid | number | 是 | 否 | 获取进程的用户标识。 | +| groups | number[] | 是 | 否 | 获取一个带有补充组id的数组。 | +| pid | number | 是 | 否 | 获取当前进程的pid。 | +| ppid | number | 是 | 否 | 获取当前进程的父进程的pid。 | + + +## ChildProcess + +主进程可以获取子进程的标准输入输出,以及发送信号和关闭子进程。 + + +### 属性 + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| pid | number | 是 | 否 | 子进程的pid。 | +| ppid | number | 是 | 否 | 子进程的父进程的pid。 | +| exitCode | number | 是 | 否 | 子进程的退出码。 | +| killed | boolean | 是 | 否 | 父进程给子进程发信号是否成功。 | + + +### wait + +wait(): Promise<number> + +等待子进程运行结束,返回promise对象,其值为子进程的退出码。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<number> | 异步返回子进程的退出码。 | + +- 示例: + ``` + import process from '@ohos.process'; + var child = process.runCmd('ls'); + var result = child.wait(); + result.then(val=>{ + console.log("result = " + val); + }) + ``` + + +### getOutput + +getOutput(): Promise<Uint8Array> + +获取子进程的标准输出。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<Uint8Array> | 异步返回标准输出的字节流。 | + +- 示例: + ``` + import process from '@ohos.process'; + var child = process.runCmd('ls'); + var result = child.wait(); + child.getOutput.then(val=>{ + console.log("child.getOutput = " + val); + }) + ``` + + +### getErrorOutput + +getErrorOutput(): Promise<Uint8Array> + +getErrorOutput函数用来获取子进程的标准错误输出。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Promise<Uint8Array> | 异步返回标准错误输出的字节流。 | + +- 示例: + ``` + import process from '@ohos.process'; + var child = process.runCmd('madir test.text'); + var result = child.wait(); + child.getErrorOutput.then(val=>{ + console.log("child.getErrorOutput= " + val); + }) + ``` + + +### close + +close(): void + +关闭正在运行的子进程。 + +- 示例: + ``` + import process from '@ohos.process'; + var child = process.runCmd('sleep 5; ls'); + child.close(); + ``` + + +### kill + +kill(signal: number | string): void + +kill函数用来发送信号给子进程,结束指定进程。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | signal | number \| string | 是 | 数字或字符串。 | + +- 示例: + ``` + import process from '@ohos.process'; + var child = process.runCmd('sleep 5; ls'); + child.kill(9); + ``` + + +## process.runCmd + +runCmd(command: string, options?: { timeout : number, killSignal :number | string, maxBuffer : number }) : ChildProcess + +通过runcmd可以fork一个新的进程来运行一段shell,并返回ChildProcess对象。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | command | string | 是 | shell命令。 | + | options | Object | 否 | 相关选项参数。 | + + **表1** options + + | 名称 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | timeout | number | 否 | 子进程运行的ms数,当子进程运行时间超出此时间,则父进程发送killSignal信号给子进程。timeout默认为0。 | + | killSignal | number  \| string | 否 | 子进程运行时间超出timeout时,父进程发送killSignal 信号给子进程。killSignal 默认为'SIGTERM'。 | + | maxBuffer | number | 否 | 子进程标准输入输出的最大缓冲区大小,当超出此大小时则终止子进程。maxBuffer默认1024\*1024。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | [ChildProcess](#childprocess) | 子进程对象。 | + +- 示例: + ``` + import process from '@ohos.process'; + var child = process.runCmd('ls', { maxBuffer : 2 }); + var result = child.wait(); + child.getOutput.then(val=>{ + console.log("child.getOutput = " + val); + } + ``` + + +## process.abort + +abort(): void + +该方法会导致进程立即退出并生成一个核心文件,谨慎使用。 + +- 示例: + ``` + import process from '@ohos.process'; + process.abort(); + ``` + + +## process.on + +on(type: string, listener: EventListener): void + +用该方法来存储用户所触发的事件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 存储事件的type。 | + | listener | EventListener | 是 | 回调的事件。 | + + **表2** EventListener + + | 名称 | 说明 | + | -------- | -------- | + | EventListener = (evt: Object) => void | 用户存储的事件。 | + +- 示例: + ``` + import process from '@ohos.process'; + process.on("data", (e)=>{ + console.log("data callback"); + }) + ``` + + +## process.off + +off(type: string): boolean + +用该方法来删除用户存储的事件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 删除事件的type。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 事件是否删除成功。 | + +- 示例: + ``` + import process from '@ohos.process'; + process.on("data", (e)=>{ + console.log("data callback"); + }) + var result = process.off("data"); + ``` + + +## process.exit + +exit(code: number): void + +用该方法终止程序,谨慎使用。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | code | number | 是 | 进程的退出码。 | + +- 示例: + ``` + import process from '@ohos.process'; + process.exit(0); + ``` + + +## process.cwd + +cwd(): string + +用该方法获取进程的工作目录。 + +- 示例: + ``` + import process from '@ohos.process'; + var path = process.cwd(); + ``` + + +## process.chdir + +chdir(dir: string): void + +用该方法更改进程的当前工作目录。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | dir | string | 是 | 路径。 | + +- 示例: + ``` + import process from '@ohos.process'; + process.chdir('/system'); + ``` + + +## process.uptime + +uptime(): number + +获取当前系统已运行的秒数。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | number | 当前系统已运行的秒数。 | + +- 示例: + ``` + import process from '@ohos.process'; + var time = process.uptime(); + ``` + + +## process.kill + +kill(pid: number,signal: number ): boolean + +用该方法发送signal到指定的进程,结束指定进程。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | pid | number | 是 | 进程的id。 | + | signal | number | 是 | 发送的信号。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 信号是否发送成功。 | + +- 示例: + ``` + import process from '@ohos.process' + var pres = process.pid + var result = that.kill(pres, 28) + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/02.URL\345\255\227\347\254\246\344\270\262\350\247\243\346\236\220.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/02.URL\345\255\227\347\254\246\344\270\262\350\247\243\346\236\220.md" new file mode 100644 index 0000000000000000000000000000000000000000..67b5815efa67a03b3b1acaaf7d6fd146d96c3e27 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/02.URL\345\255\227\347\254\246\344\270\262\350\247\243\346\236\220.md" @@ -0,0 +1,434 @@ +--- +title: URL字符串解析 +permalink: /pages/000b000901 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# URL字符串解析 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import Url from '@ohos.url' +``` + + +## 权限 + +无 + + +## URLSearchParams + + +### constructor + +constructor(init?: string[][] | Record<string, string> | string | URLSearchParams) + +URLSearchParams的构造函数。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | init | string[][] \| Record<string, string> \| string \| URLSearchParams | 否 | 入参对象。
- string[][]:字符串二维数组
- Record<string, string>:对象列表
- string:字符串
- URLSearchParams:对象 | + +- 示例: + ``` + var objectParams = new URLSearchParams([ ['user1', 'abc1'], ['query2', 'first2'], ['query3', 'second3'] ]); + var objectParams1 = new URLSearchParams({"fod" : 1 , "bard" : 2}); + var objectParams2 = new URLSearchParams('?fod=1&bard=2'); + var urlObject = new URL('https://developer.mozilla.org/?fod=1&bard=2'); + var params = new URLSearchParams(urlObject .search); + ``` + + +### append + +append(name: string, value: string): void + +将新的键值对插入到查询字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 需要插入搜索参数的键名。 | + | value | string | 是 | 需要插入搜索参数的值。 | + +- 示例: + ``` + let urlObject = new URL('https://developer.exampleUrl/?fod=1&bard=2'); + let paramsObject = new URLSearchParams(urlObject.search.slice(1)); + paramsObject.append('fod', 3); + ``` + + +### delete + +delete(name: string): void + +删除指定名称的键值对。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 需要删除的键值名称。 | + +- 示例: + ``` + let urlObject = new URL('https://developer.exampleUrl/?fod=1&bard=2'); + let paramsobject = new URLSearchParams(urlObject.search.slice(1)); + paramsobject.delete('foo'); + ``` + + +### getAll + +getAll(name: string): string[] + +获取指定名称的所有键值对。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 指定的键值名称。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string[] | 返回指定名称的所有键值对。 | + +- 示例: + ``` + let urlObject = new URL('https://developer.exampleUrl/?fod=1&bard=2'); + let paramsObject = new URLSearchParams(urlObject.search.slice(1)); + paramsObject.append('fod', 3); // Add a second value for the foo parameter. + console.log(params.getAll('fod')) // Output ["1","3"]. + ``` + + +### entries + +entries(): IterableIterator<[string, string]> + +返回一个ES6的迭代器,迭代器的每一项都是一个 JavaScript Array。Array的第一项是name,Array的第二项是value。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | IterableIterator<[string, string]> | 返回一个ES6的迭代器。 | + +- 示例: + ``` + var searchParamsObject = new URLSearchParams("keyName1=valueName1&keyName2=valueName2"); + for (var pair of searchParamsObject .entries()) { // Show keyName/valueName pairs + console.log(pair[0]+ ', '+ pair[1]); + } + ``` + + +### forEach + +forEach(callbackfn: (value: string, key: string, searchParams: Object) => void, thisArg?: Object): void + +通过回调函数来遍历URLSearchParams实例对象上的键值对。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | callbackfn | function | 是 | 回调函数。 | + | thisArg | Object | 否 | callbackfn被调用时用作this值 | + + **表1** callbackfn的参数说明 + + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | value | string | 是 | 当前遍历到的键值。 | + | key | string | 是 | 当前遍历到的键名。 | + | searchParams | Object | 是 | 当前调用forEach方法的实例对象。 | + +- 示例: + ``` + const myURLObject = new URL('https://developer.exampleUrl/?fod=1&bard=2'); + myURLObject.searchParams.forEach((value, name, searchParams) => { + console.log(name, value, myURLObject.searchParams === searchParams); + }); + ``` + + +### get + +get(name: string): string | null + +获取指定名称对应的第一个值。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 指定键值对的名称。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 返回第一个值。 | + | null | 如果没找到,返回 null。 | + +- 示例: + ``` + var paramsOject = new URLSearchParams(document.location.search.substring(1)); + var name = paramsOject.get("name"); // is the string "Jonathan" + var age = parseInt(paramsOject.get("age"), 10); // is the number 18 + var address = paramsOject.get("address"); // null + ``` + + +### has + +has(name: string): boolean + +判断一个指定的键名对应的值是否存在。 +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 要查找的参数的键名。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | boolean | 是否存在相对应的key值,存在返回true,否则返回false。 | + +- 示例: + ``` + let urlObject = new URL('https://developer.exampleUrl/?fod=1&bard=2'); + let paramsObject = new URLSearchParams(urlObject.search.slice(1)); + paramsObject.has('bard') === true; + ``` + + +### set + +set(name: string, value: string): void + +将与name关联的URLSearchParams对象中的值设置为value。如果存在名称为name的键值对,请将第一个键值对的值设置为value并删除所有其他值。如果不是,则将键值对附加到查询字符串。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | name | string | 是 | 将要设置的参数的键值名。 | + | value | string | 是 | 所要设置的参数值。 | + +- 示例: + ``` + let urlObject = new URL('https://developer.exampleUrl/?fod=1&bard=2'); + let paramsObject = new URLSearchParams(urlObject.search.slice(1)); + paramsObject.set('baz', 3); // Add a third parameter. + ``` + + +### sort + +sort(): void + + +对包含在此对象中的所有键值对进行排序,并返回undefined。排序顺序是根据键的Unicode代码点。该方法使用稳定的排序算法 (即,将保留具有相等键的键值对之间的相对顺序)。 + + +- 示例: + ``` + var searchParamsObject = new URLSearchParams("c=3&a=9&b=4&d=2"); // Create a test URLSearchParams object + searchParamsObject.sort(); // Sort the key/value pairs + console.log(searchParamsObject.toString()); // Display the sorted query string // Output a=9&b=2&c=3&d=4 + ``` + + +### keys + +keys(): IterableIterator<string> + + +返回一个所有键值对的name的ES6迭代器。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | IterableIterator<string> | 返回一个所有键值对的name的ES6迭代器。 | + + +- 示例: + ``` + var searchParamsObject = new URLSearchParams("key1=value1&key2=value2"); // Create a URLSearchParamsObject object for testing + for (var key of searchParamsObject .keys()) { // Output key-value pairs + console.log(key); + } + ``` + + +### values + +values(): IterableIterator<string> + +返回一个所有键值对的value的ES6迭代器。 + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | IterableIterator<string> | 返回一个所有键值对的value的ES6迭代器。 | + +- 示例 + ``` + var searchParams = new URLSearchParams("key1=value1&key2=value2"); // Create a URLSearchParamsObject object for testing + for (var value of searchParams.values()) { + console.log(value); + } + ``` + + +### [Symbol.iterator] + +[Symbol.iterator](): IterableIterator<[string, string]> + + +返回一个ES6的迭代器,迭代器的每一项都是一个 JavaScript Array。Array的第一项是name,Array的第二项是value。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | IterableIterator<[string, string]> | 返回一个ES6的迭代器。 | + + +- 示例: + ``` + const paramsObject = new URLSearchParams('fod=bay&edg=bap'); + for (const [name, value] of paramsObject) { + console.log(name, value); + } + ``` + + +### tostring + +toString(): string + + +返回序列化为字符串的搜索参数,必要时对字符进行百分比编码。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 返回序列化为字符串的搜索参数,必要时对字符进行百分比编码。 | + + +- 示例: + ``` + let url = new URL('https://developer.exampleUrl/?fod=1&bard=2'); + let params = new URLSearchParams(url.search.slice(1)); + params.append('fod', 3); + console.log(params.toString()); + ``` + + +## URL + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| hash | string | 是 | 是 | 获取和设置URL的片段部分。 | +| host | string | 是 | 是 | 获取和设置URL的主机部分。 | +| hostname | string | 是 | 是 | 获取和设置URL的主机名部分,不带端口。 | +| href | string | 是 | 是 | 获取和设置序列化的URL。 | +| origin | string | 是 | 否 | 获取URL源的只读序列化。 | +| password | string | 是 | 是 | 获取和设置URL的密码部分。 | +| pathname | string | 是 | 是 | 获取和设置URL的路径部分。 | +| port | string | 是 | 是 | 获取和设置URL的端口部分。 | +| protocol | string | 是 | 是 | 获取和设置URL的协议部分。 | +| search | string | 是 | 是 | 获取和设置URL的序列化查询部分。 | +| searchParams | URLsearchParams | 是 | 否 | 获取URLSearchParams表示URL查询参数的对象。 | +| username | string | 是 | 是 | 获取和设置URL的用户名部分。 | + + +### constructor + +constructor(url: string, base?: string | URL) + + +URL的构造函数。 + + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | url | string | 是 | 入参对象。 | + | base | string \| URL | 否 | 入参字符串或者对象。
- string:字符串
- URL:字符串或对象 | + + +- 示例: + ``` + var mm = 'http://username:password@host:8080'; + var a = new URL("/", mm); // Output 'http://username:password@host:8080/'; + var b = new URL(mm); // Output 'http://username:password@host:8080/'; + new URL('path/path1', b); // Output 'http://username:password@host:8080/path/path1'; + var c = new URL('/path/path1', b); // Output 'http://username:password@host:8080/path/path1'; + new URL('/path/path1', c); // Output 'http://username:password@host:8080/path/path1'; + new URL('/path/path1', a); // Output 'http://username:password@host:8080/path/path1'; + new URL('/path/path1', "https://www.exampleUrl/fr-FR/toto"); // Output https://www.exampleUrl/path/path1 + new URL('/path/path1', ''); // Raises a TypeError exception as '' is not a valid URL + new URL('/path/path1'); // Raises a TypeError exception as '/path/path1' is not a valid URL + new URL('http://www.shanxi.com', ); // Output http://www.shanxi.com/ + new URL('http://www.shanxi.com', b); // Output http://www.shanxi.com/ + ``` + + +### tostring + +toString(): string + +将解析过后的URL转化为字符串。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 用于返回网址的字符串序列化。 | + + +- 示例: + ``` + const url = new URL('http://username:password@host:8080/directory/file?query=pppppp#qwer=da'); + url.toString() + ``` + + +### toJSON + +toJSON(): string + + +将解析过后的URL转化为JSON字符串。 + + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 用于返回网址的字符串序列化。 | + + +- 示例: + ``` + const url = new URL('http://username:password@host:8080/directory/file?query=pppppp#qwer=da'); + url.toString() + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/03.\345\255\227\347\254\246\344\270\262\347\274\226\350\247\243\347\240\201.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/03.\345\255\227\347\254\246\344\270\262\347\274\226\350\247\243\347\240\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..554ffec1b987a028c8fdc84b1e2610e6179f8952 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/03.\345\255\227\347\254\246\344\270\262\347\274\226\350\247\243\347\240\201.md" @@ -0,0 +1,289 @@ +--- +title: 字符串编解码 +permalink: /pages/000b000902 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 字符串编解码 + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import util from '@ohos.util'; +``` + + +## 权限 + +无 + + +## util.printf + +printf(format: string, ...args: Object[]): string + +通过式样化字符串对输入的内容按特定格式输出。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | format | string | 是 | 式样化字符串。 | + | ...args | Object[] | 否 | 待式样化数据。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 按特定格式式样化后的字符串。 | + +- 示例: + ``` + var res = util.printf("%s", "hello world!"); + console.log(res); + ``` + + +## util.getErrorString + +getErrorString(errno: number): string + +获取系统错误码对应的详细信息。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | errno | number | 是 | 系统发生错误产生的错误码。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 错误码对应的详细信息。 | + +- 示例: + ``` + var errnum = 10; // 10:a system error number + var result = util.getErrorString(errnum); + console.log("result = " + result); + ``` + + +## util.callbackWrapper + +callbackWrapper(original: Function): (err: Object, value: Object)=>void + +对异步函数进行回调化处理,回调中第一个参数将是拒绝原因(如果 Promise 已解决,则为 null),第二个参数将是已解决的值。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | original | Function | 是 | 异步函数。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Function | 返回一个第一个参数是拒绝原因(如果 Promise 已解决,则为 null),第二个参数是已解决的回调函数。 | + +- 示例: + ``` + async function promiseFn() { + return Promise.reject('value'); + } + var cb = util.callbackWrapper(promiseFn); + cb((err, ret) => { + expect(err).strictEqual('value'); + expect(ret).strictEqual(undefined); + }) + ``` + + +## util.promiseWrapper + +promiseWrapper(original: (err: Object, value: Object) => void): Object + +对异步函数处理并返回一个promise的版本。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | original | Function | 是 | 异步函数。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Function | 采用遵循常见的错误优先的回调风格的函数(也就是将 (err, value) => ... 回调作为最后一个参数),并返回一个返回 promise 的版本。 | + +- 示例: + ``` + function aysnFun(str1, str2, callback) { + if (typeof str1 === 'string' && typeof str1 === 'string') { + callback(null, str1 + str2); + } else { + callback('type err'); + } + } + let newPromiseObj = util.promiseWrapper(aysnFun)("Hello", 'World'); + newPromiseObj.then(res => { + expect(res).strictEqual('HelloWorld'); + }) + ``` + + +## TextDecoder + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| encoding | string | 是 | 否 | 编码格式。
- 支持格式:utf-8、ibm866、iso-8859-2、iso-8859-3、iso-8859-4、iso-8859-5、iso-8859-6、iso-8859-7、iso-8859-8、iso-8859-8-i、iso-8859-10、iso-8859-13、iso-8859-14、iso-8859-15、koi8-r、koi8-u、macintosh、windows-874、windows-1250、windows-1251、windows-1252、windows-1253、windows-1254、windows-1255、windows-1256、windows-1257、windows-1258、x-mac-cyrilli、gbk、gb18030、big5、euc-jp、iso-2022-jp、shift_jis、euc-kr、utf-16be、utf-16le。 | +| fatal | boolean | 是 | 否 | 是否显示致命错误。 | +| ignoreBOM | boolean | 是 | 否 | 是否忽略BOM(byte order marker)标记,默认值是false。 | + + +### constructor + +constructor(encoding?: string, options?: { fatal?: boolean; ignoreBOM?: boolean },) + +TextDecoder的构造函数。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | encoding | string | 否 | 编码格式。 | + | options | Object | 否 | 编码相关选项参数,存在两个属性fatal和ignoreBOM。 | + + **表1** options + + | 名称 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | fatal | boolean | 否 | 是否显示致命错误。 | + | ignoreBOM | boolean | 否 | 是否忽略BOM标记。 | + +- 示例: + ``` + var textDecoder = new util.TextDecoder("utf-8",{ignoreBOM:true}); + ``` + + +### decode + +decode(input: Uint8Array, options?:{stream?:false}): string + +通过输入参数解码后输出对应文本。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | input | Uint8Array | 是 | 符合格式需要解码的数组。 | + | options | Object | 否 | 解码相关选项参数。 | + + **表2** options + + | 名称 | 参数类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | stream | boolean | 否 | 在随后的decode()调用中是否跟随附加数据块,如果以块的形式处理数据,则设置为true;如果处理最后的数据块或数据未分块,则设置为false。默认为false。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | string | 解码后的数据。 | + +- 示例: + ``` + var textDecoder = new util.TextDecoder("utf-8",{ignoreBOM:true}); + var result = new Uint8Array(6); + result[0] = 0xEF; + result[1] = 0xBB; + result[2] = 0xBF; + result[3] = 0x61; + result[4] = 0x62; + result[5] = 0x63; + console.log("input num:"); + for(var j= 0; j < 6; j++) { + console.log(result[j]); + } + var retStr = textDecoder.decode( result , {stream:false}); + console.log("retStr = " + retStr); + ``` + + +## TextEncoder + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| encoding | string | 是 | 否 | 编码格式,默认值是utf-8。 | + + +### constructor + +constructor() + +TextEncoder的构造函数。 + +- 示例: + ``` + var textEncoder = new util.TextEncoder(); + ``` + + +### encode + +encode(input?: string): Uint8Array + +通过输入参数编码后输出对应文本。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | input | string | 是 | 需要编码的字符串。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Uint8Array | 返回编码后的文本。 | + +- 示例: + ``` + var textEncoder = new util.TextEncoder(); + var result = new Uint8Array(buffer); + result = textEncoder.encode("\uD800¥¥"); + ``` + + +### encodeInto + +encodeInto(input: string, dest: Uint8Array,):{ read: number; written: number } + +放置生成的UTF-8编码文本。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | input | string | 是 | 需要编码的字符串。 | + | dest | Uint8Array | 是 | Uint8Array对象实例,用于将生成的UTF-8编码文本放入其中。 | + +- 返回值: + | 类型 | 说明 | + | -------- | -------- | + | Uint8Array | 返回编码后的文本。 | + +- 示例: + ``` + var that = new util.TextEncoder(); + var buffer = new ArrayBuffer(4); + this.dest = new Uint8Array(buffer); + var result = that.encodeInto("abcd", this.dest); + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/04.\345\220\257\345\212\250\344\270\200\344\270\252worker.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/04.\345\220\257\345\212\250\344\270\200\344\270\252worker.md" new file mode 100644 index 0000000000000000000000000000000000000000..4b7f545bdebcbb40584b9d0f1ee87bd078cc1b06 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/01.JSAPI\345\217\202\350\200\203/10.\350\257\255\350\250\200\345\237\272\347\241\200\347\261\273\345\272\223/04.\345\220\257\345\212\250\344\270\200\344\270\252worker.md" @@ -0,0 +1,563 @@ +--- +title: 启动一个worker +permalink: /pages/000b000903 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# 启动一个worker + +> ![icon-note.gif](/images/application-dev/reference/apis/public_sys-resources/icon-note.gif) **说明:** +> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 + + +## 导入模块 + +``` +import worker from '@ohos.worker'; +``` + + +## 权限 + +无 + + +## 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| parentPort | [DedicatedWorkerGlobalScope](#dedicatedworkerglobalscope) | 是 | 是 | worker线程用于与宿主线程通信的对象 | + + +## WorkerOptions + +worker构造函数函数的选项信息,用于为worker添加其他信息。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| type | "classic" | 是 | 是 | 按照指定方式执行脚本。 | +| name | string | 是 | 是 | worker的名称。 | + + +## Worker + +使用以下方法前,均需先构造worker实例,Worker类继承[EventTarget](#eventtarget)。 + + +### constructor + +constructor(scriptURL: string, options?: WorkerOptions) + +worker构造函数。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | scriptURL | string | 是 | worker执行脚本的url,路径规范:若DevEco新建工程在pages同级下没有workers目录,需要新建workers目录,将脚本文件放入workers目录。 | + | options | [WorkerOptions](#workeroptions) | 否 | worker构造的选项。 | + +- 返回值: + | 参数名 | 说明 | + | -------- | -------- | + | worker | 执行Worker构造函数生成的Worker对象,失败则返回undefined。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js", {name:"first worker"}); + ``` + + +### postMessage + +postMessage(message: Object, options?: PostMessageOptions): void + +向worker线程发送消息,数据的传输采用结构化克隆算法。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | message | Object | 是 | 发送至worker的数据。 | + | options | [PostMessageOptions](#postmessageoptions) | 否 | 可转移对象是 ArrayBuffer 的实例对象。transferList数组中不可传入null。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js"); + worker.postMessage("hello world"); + + const worker = new worker.Worker("workers/worker.js"); + var buffer = new ArrayBuffer(8); + worker.postMessage(buffer, [buffer]); + ``` + + +### on + +on(type: string, listener: EventListener): void + +向worker添加一个事件监听。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 监听事件的type。 | + | listener | [EventListener](#eventlistener) | 是 | 回调的事件。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.on("alert", (e)=>{ + console.log("alert listener callback"); + }) + ``` + + +### once + +once(type: string, listener: EventListener): void + +向worker添加一个事件监听,事件监听只执行一次便自动删除。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 监听事件的type。 | + | listener | [EventListener](#eventlistener) | 是 | 回调的事件。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js"); + worker.once("alert", (e)=>{ + console.log("alert listener callback"); + }) + ``` + + +### off + +off(type: string, listener?: EventListener): void + +删除worker的事件监听。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 需要删除事件的type。 | + | listener | [EventListener](#eventlistener) | 否 | 需要删除的回调的事件。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js"); + worker.off("alert"); + ``` + + +### terminate + +terminate(): void + +关闭worker线程,终止worker接收消息。 + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.terminate() + ``` + + +### onexit + +onexit?: (code: number) => void + +Worker对象的onexit属性表示worker退出时被调用的事件处理程序,处理程序在宿主线程中执行。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | code | number | 否 | worker退出的code。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.onexit = function(e) { + console.log("onexit") + } + ``` + + +### onerror + +onerror?: (err: ErrorEvent) => void + +Worker对象的onerror属性表示worker在执行过程中发生异常被调用的事件处理程序,处理程序在宿主线程中执行。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | err | [ErrorEvent](#errorevent) | 否 | 异常数据。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.onerror = function(e) { + console.log("onerror") + } + ``` + + +### onmessage + +onmessage?: (event: MessageEvent) => void + +Worker对象的onmessage属性表示宿主线程接收到来自其创建的worker通过parentPort.postMessage接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | event | [MessageEvent](#messageevent) | 否 | 收到的worker消息数据。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.onmessage = function(e) { + console.log("onerror") + } + ``` + + +### onmessageerror + +onmessageerror?: (event: MessageEvent) => void + +Worker对象的onmessageerror属性表示当 Worker 对象接收到一条无法被序列化的消息时被调用的事件处理程序,处理程序在宿主线程中执行。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | event | [MessageEvent](#messageevent) | 否 | 异常数据。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.onmessageerror= function(e) { + console.log("onmessageerror") + } + ``` + + +## EventTarget + + +### addEventListener + +addEventListener(type: string, listener: EventListener): void + +向worker添加一个事件监听。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 监听事件的type。 | + | listener | [EventListener](#eventlistener) | 是 | 回调的事件。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.addEventListener("alert", (e)=>{ + console.log("alert listener callback"); + }) + ``` + + +### removeEventListener + +removeEventListener(type: string, callback?: EventListener): void + +删除worker的事件监听。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | type | string | 是 | 需要删除事件的type。 | + | callback | [EventListener](#eventlistener) | 否 | 需要删除的回调的事件。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.removeEventListener("alert") + ``` + + +### dispatchEvent + +dispatchEvent(event: Event): boolean + +分发定义在worker的事件。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | event | [Event](#event) | 是 | 需要分发的事件。 | + +- 返回值: + | 参数名 | 说明 | + | -------- | -------- | + | boolean | 分发的结果,false表示分发失败。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.dispatchEvent({type:"alert"}) + ``` + + +### removeAllListener + +removeAllListener(): void + +删除worker的所有事件监听。 + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.removeAllListener({type:"alert"}) + ``` + + +## DedicatedWorkerGlobalScope + +worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口关闭worker线程,DedicatedWorkerGlobalScope类继承[WorkerGlobalScope](#workerglobalscope)。 + + +### postMessage + +postMessage(message: Object, options?: PostMessageOptions): void + +worker向宿主线程发送消息。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | message | Object | 是 | 发送至worker的数据。 | + | options | [PostMessageOptions](#postmessageoptions) | 否 | 可转移对象是ArrayBuffer的实例对象。transferList数组中不可传入null。 | + +- 示例: + ``` + // main.js + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.postMessage("hello world") + worker.onmessage = function(e) { + console.log("receive data from worker.js") + } + + // worker.js + import worker from "@ohos.worker"; + const parentPort = worker.parentPort; + parentPort.onmessage = function(e){ + parentPort.postMessage("receive data from main.js") + } + ``` + + +### close + +close(): void + +关闭worker线程,终止worker接收消息。 + +- 示例: + ``` + // main.js + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + + // worker.js + import worker from "@ohos.worker"; + const parentPort = worker.parentPort; + parentPort.onmessage = function(e) { + parentPort.close() + } + ``` + + +### onmessage + +onmessage?: (event: MessageEvent) => void + +DedicatedWorkerGlobalScope的onmessage属性表示worker线程收到来自其宿主线程通过worker.postMessage接口发送的消息时被调用的事件处理程序,处理程序在worker线程中执行。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | event | [MessageEvent](#messageevent) | 否 | 收到的worker消息数据。 | + +- 示例: + ``` + // main.js + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + worker.postMessage("hello world") + + // worker.js + import worker from "@ohos.worker"; + const parentPort = worker.parentPort; + parentPort.onmessage = function(e) { + console.log("receive main.js message") + } + ``` + + +### onmessageerror + +onmessageerror?: (event: MessageEvent) => void + +DedicatedWorkerGlobalScope的onmessageerror属性表示当 Worker 对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在worker线程中执行。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | event | [MessageEvent](#messageevent) | 否 | 异常数据。 | + +- 示例: + ``` + // main.js + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + + // worker.js + import worker from "@ohos.worker"; + const parentPort = worker.parentPort; + parentPort.onmessageerror= function(e) { + console.log("worker.js onmessageerror") + } + ``` + + +## PostMessageOptions + +明确数据传递过程中需要转移所有权对象的类,传递所有权的对象必须是ArrayBuffer。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| transfer | Object[] | 是 | 是 | ArrayBuffer数组,用于传递所有权。 | + + +## Event + +事件类。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| type | string | 是 | 否 | 指定事件的type。 | +| timeStamp | number | 是 | 否 | 事件创建时的时间戳(精度为毫秒)。 | + + +## EventListener + +事件监听类。 + + +### (evt: Event): void | Promise<void> + +执行的回调函数。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | evt | [Event](#event) | 是 | 回调的事件类。 | + +- 返回值 + | 参数名 | 说明 | + | -------- | -------- | + | void \| Promise<void> | 无返回值或者以Promise形式返回。 | + +- 示例: + ``` + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js"); + worker.addEventListener("alert", (e)=>{ + console.log("alert listener callback"); + }) + ``` + + +## ErrorEvent + +错误事件类,用于表示worker执行过程中出现异常的详细信息,ErrorEvent类继承[Event](#event)。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| message | string | 是 | 否 | 异常发生的错误信息。 | +| filename | string | 是 | 否 | 出现异常所在的文件。 | +| lineno | number | 是 | 否 | 异常所在的行数。 | +| colno | number | 是 | 否 | 异常所在的列数。 | +| error | Object | 是 | 否 | 异常类型。 | + + +## MessageEvent + +消息类,持有worker线程间传递的数据。 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| data | T | 是 | 否 | 线程间传递的数据。 | + + +## WorkerGlobalScope + +worker线程自身的运行环境,WorkerGlobalScope类继承[EventTarget](#eventtarget)。 + + +### 属性 + +| 名称 | 参数类型 | 可读 | 可写 | 说明 | +| -------- | -------- | -------- | -------- | -------- | +| name | string | 是 | 否 | worker的名字,有new Worker时指定。 | +| self | [WorkerGlobalScope](#workerglobalscope) & typeof globalThis | 是 | 否 | WorkerGlobalScope本身。 | + + +### onerror + +onerror?: (ev: ErrorEvent) => void + +WorkerGlobalScope的onerror属性表示worker在执行过程中发生异常被调用的事件处理程序,处理程序在worker线程中执行。 + +- 参数: + | 参数名 | 类型 | 必填 | 说明 | + | -------- | -------- | -------- | -------- | + | ev | [ErrorEvent](#errorevent) | 否 | 异常数据。 | + +- 示例: + ``` + // main.js + import worker from '@ohos.worker'; + const worker = new worker.Worker("workers/worker.js") + + // worker.js + import worker from "@ohos.worker"; + const parentPort = worker.parentPort + parentPort.onerror = function(e){ + console.log("worker.js onerror") + } + ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207.md" similarity index 33% rename from "website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207.md" rename to "website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207.md" index 41d39efe18d62b7c3e94619a01f2eedac889c855..75e354efb90dcf7ecaf7ec4510dd7094f4e3f47a 100644 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207.md" +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207.md" @@ -1,6 +1,6 @@ --- title: 文件组织 -permalink: /pages/000d0000 +permalink: /pages/000b01000000 navbar: true sidebar: true prev: true @@ -9,25 +9,21 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:36 --- -# 文件组织 +# 文件组织 -- [目录结构](#zh-cn_topic_0000001058830797_section119431650182015) -- [文件访问规则](#zh-cn_topic_0000001058830797_section6620355202117) -- [媒体文件格式](#zh-cn_topic_0000001058830797_section79731562617) - -## 目录结构 +## 目录结构 JS FA应用的JS模块\(entry/src/main/js/module\)的典型开发目录结构如下: -**图 1** 目录结构 +**图 1** 目录结构 -![](/images/zh-cn/application-dev/js-reference/figures/unnaming-(1).png) +![](/images/application-dev/reference/arkui-js/figures/unnaming-(1).png) -**图 2** 多实例资源共享目录结构5+ -![](/images/zh-cn/application-dev/js-reference/figures/多实例资源共享目录结构5+.png "多实例资源共享目录结构5+") +**图 2** 多实例资源共享目录结构5+ +![](/images/application-dev/reference/arkui-js/figures/多实例资源共享目录结构5+.png "多实例资源共享目录结构5+") 目录结构中文件分类如下: @@ -37,79 +33,102 @@ JS FA应用的JS模块\(entry/src/main/js/module\)的典型开发目录结构如 各个文件夹的作用: -- app.js文件用于全局JavaScript逻辑和应用生命周期管理。 +- app.js文件用于全局JavaScript逻辑和应用生命周期管理,详见[app.js](/pages/000b01000002)说明。 - pages目录用于存放所有组件页面。 - common目录用于存放公共资源文件,比如:媒体资源,自定义组件和JS文件。 -- resources目录用于存放资源配置文件,比如:全局样式、多分辨率加载等配置文件。 +- resources目录用于存放资源配置文件,比如:多分辨率加载等配置文件,详见[资源限定与访问](/pages/000b01000005)章节。 - share目录5+用于配置多个实例共享的资源内容,比如:share中的图片和JSON文件可被default1和default2实例共享。 ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->- 如下文件夹是开发保留文件夹,不可重命名: -> - share -> - resources +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- i18n和resources是开发保留文件夹,不可重命名。 >- 如果share目录中的资源和实例\(default\)中的资源文件同名且目录一致时,实例中资源的优先级高于share中资源的优先级。 +>- share目录当前不支持i18n。 +>- 在使用DevEco Studio进行应用开发时,目录结构中的可选文件夹需要开发者根据实际情况自行创建。 -## 文件访问规则 +## 文件访问规则 应用资源可通过绝对路径或相对路径的方式进行访问,本开发框架中绝对路径以"/"开头,相对路径以"./"或"../"。具体访问规则如下: -- 引用代码文件,需使用相对路径,比如:../common/utils.js。 +- 引用代码文件,推荐使用相对路径,比如:../common/utils.js。 - 引用资源文件,推荐使用绝对路径。比如:/common/xxx.png。 - 公共代码文件和资源文件推荐放在common下,通过以上两条规则进行访问。 - CSS样式文件中通过url\(\)函数创建数据类型,如:url\(/common/xxx.png\)。 ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** >当代码文件A需要引用代码文件B时: >- 如果代码文件A和文件B位于同一目录,则代码文件B引用资源文件时可使用相对路径,也可使用绝对路径。 >- 如果代码文件A和文件B位于不同目录,则代码文件B引用资源文件时必须使用绝对路径。因为Webpack打包时,代码文件B的目录会发生变化。 ->在js文件中通过数据绑定的方式指定资源文件路径时,需使用绝对路径。 +>- 在js文件中通过数据绑定的方式指定资源文件路径时,必须使用绝对路径。 -## 媒体文件格式 +## 媒体文件格式 **表 1** 支持的图片格式 - -

格式

+ + - - - - - - - - - - - - + - + + - + + + +

格式

支持版本

+

支持版本

支持的文件类型

+

支持的文件类型

BMP

+

BMP

API Version 3+

+

API Version 3+

.bmp

+

.bmp

GIF

+

GIF

API Version 3+

+

API Version 3+

.gif

+

.gif

JPEG

+

JPEG

API Version 3+

+

API Version 3+

.jpg

+

.jpg

PNG

+

PNG

+

API Version 3+

API Version 3+

+

.png

+

WebP

.png

+

API Version 3+

.webp

+
+ +**表 2** 支持的视频格式 + + + + + - + - - diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/02.js\346\240\207\347\255\276\351\205\215\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/02.js\346\240\207\347\255\276\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..4b4bdf8ed5117ef3883dadd22ed9e621b353fb52 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/02.js\346\240\207\347\255\276\351\205\215\347\275\256.md" @@ -0,0 +1,187 @@ +--- +title: js标签配置 +permalink: /pages/000b01000001 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:36 +--- +# js标签配置 + +js标签中包含了实例名称、页面路由和窗口样式信息。 + + +

格式

+

支持版本

+

支持的文件类型

+

WebP

+

H.264 AVC

+

Baseline Profile (BP)

API Version 3+

+

API Version 3+

.webp

+

.3gp

+

.mp4

+ + + + + + + + + + + + + + + + + + + + + + + + + +

标签

+

类型

+

默认值

+

必填

+

描述

+

name

+

string

+

default

+

+

标识JS实例的名字。

+

pages

+

Array

+

-

+

+

路由信息,详见“pages”。

+

window

+

Object

+

-

+

+

窗口信息,详见“window”。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>name、pages和window等标签配置需在配置文件(config.json)中的“js”标签中完成设置。 + +## pages + +定义每个页面的路由信息,每个页面由页面路径和页面名组成,页面的文件名就是页面名。比如: + +``` +{ + ... + "pages": [ + "pages/index/index", + "pages/detail/detail" + ] + ... +} +``` + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- pages列表中第一个页面是应用的首页,即entry入口。 +>- 页面文件名不能使用组件名称,比如:text.hml、button.hml等。 + +## window + +window用于定义与显示窗口相关的配置。对于屏幕适配问题,有2种配置方法: + +- 指定designWidth(屏幕逻辑宽度),所有与大小相关的样式(例如width、font-size)均以designWidth和实际屏幕宽度的比例进行缩放,例如在designWidth为720时,如果设置width为100px时,在实际宽度为1440物理像素的屏幕上,width实际渲染像素为200物理像素。 +- 设置autoDesignWidth为true,此时designWidth字段将会被忽略,渲染组件和布局时按屏幕密度进行缩放。屏幕逻辑宽度由设备宽度和屏幕密度自动计算得出,在不同设备上可能不同,请使用相对布局来适配多种设备。例如:在466\*466分辨率,320dpi的设备上,屏幕密度为2(以160dpi为基准),1px等于渲染出的2物理像素。 + + >![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** + >1. 组件样式中类型的默认值,按屏幕密度进行计算和绘制,如:在屏幕密度为2(以160dpi为基准)的设备上,默认为1px时,设备上实际渲染出2物理像素。 + >2. autoDesignWidth、designWidth的设置不影响默认值计算方式和绘制结果。 + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

必填

+

缺省值

+

描述

+

designWidth

+

number

+

+

720

+

页面显示设计时的参考值,实际显示效果基于设备宽度与参考值之间的比例进行缩放。

+

autoDesignWidth

+

boolean

+

+

false

+

页面设计基准宽度是否自动计算,当设为true时,designWidth将会被忽略,设计基准宽度由设备宽度与屏幕密度计算得出。

+
+ +示例如下: + +``` +{ + ... + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + ... +} +``` + +## 示例 + +``` +{ + "app": { + "bundleName": "com.example.player", + "version": { + "code": 1, + "name": "1.0" + }, + "vendor": "example" + } + "module": { + ... + "js": [ + { + "name": "default", + "pages": [ + "pages/index/index", + "pages/detail/detail" + ], + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ], + "abilities": [ + { + ... + } + ] + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/03.app.js.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/03.app.js.md" new file mode 100644 index 0000000000000000000000000000000000000000..faff3b6ebcf2eef6c5da2be129e7f500572e3f9d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/03.app.js.md" @@ -0,0 +1,74 @@ +--- +title: app.js +permalink: /pages/000b01000002 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +--- +# app.js + +## 应用生命周期 + +每个应用可以在app.js自定义应用级[生命周期](/pages/000b01000004)的实现逻辑,以下示例仅在生命周期函数中打印对应日志: + +``` +// app.js +export default { + onCreate() { + console.info('Application onCreate'); + }, + + onDestroy() { + console.info('Application onDestroy'); + }, +} +``` + +## 应用对象6+ + + + + + + + + + + + + +

属性

+

类型

+

描述

+

getApp

+

Function

+

提供getApp()全局方法,可以在自定义js文件中获取app.js中暴露的对象。

+
+ +示例如下: + +``` +// app.js +export default { + data: { + test: "by getAPP" + }, + onCreate() { + console.info('AceApplication onCreate'); + }, + onDestroy() { + console.info('AceApplication onDestroy'); + }, +}; +``` + +``` +// test.js 自定义逻辑代码 +export var appData = getApp().data; +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/01.HML\350\257\255\346\263\225\345\217\202\350\200\203.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/01.HML\350\257\255\346\263\225\345\217\202\350\200\203.md" similarity index 58% rename from "website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/01.HML\350\257\255\346\263\225\345\217\202\350\200\203.md" rename to "website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/01.HML\350\257\255\346\263\225\345\217\202\350\200\203.md" index 16f2dcb5a8586196c2db8f8a812af3370bd33f00..782f6f913ef7804b7e4250acebf8dfffe01c00e2 100644 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/01.HML\350\257\255\346\263\225\345\217\202\350\200\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/01.HML\350\257\255\346\263\225\345\217\202\350\200\203.md" @@ -1,6 +1,6 @@ --- title: HML语法参考 -permalink: /pages/000d000300 +permalink: /pages/000b0100000300 navbar: true sidebar: true prev: true @@ -9,21 +9,13 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:37 --- -# HML语法参考 - -- [页面结构](#zh-cn_topic_0000001059340504_section1062764791514) -- [数据绑定](#zh-cn_topic_0000001059340504_s8821c158917c48098219013e69129d1b) -- [事件绑定](#zh-cn_topic_0000001059340504_s30850b61328e4359910467ab33b3e07d) -- [列表渲染](#zh-cn_topic_0000001059340504_sb777d6d807fa43fea9be400b2600425b) -- [条件渲染](#zh-cn_topic_0000001059340504_sf7f6eab2105a4030a1f34149417d6fc5) -- [逻辑控制块](#zh-cn_topic_0000001059340504_s185169def14340fcbb12c3375cb0f0bb) -- [模板引用](#zh-cn_topic_0000001059340504_section1388145672114) +# HML语法参考 HML(OpenHarmony Markup Language)是一套类HTML的标记语言,通过组件,事件构建出页面的内容。页面具备数据绑定、事件绑定、列表渲染、条件渲染和逻辑控制等高级能力。 -## 页面结构 +## 页面结构 ``` @@ -35,7 +27,7 @@ HML(OpenHarmony Markup Language)是一套类HTML的标记语言,通过组 ``` -## 数据绑定 +## 数据绑定 ``` @@ -56,63 +48,33 @@ export default { } ``` ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** >- 针对数组内的数据修改,请使用splice方法生效数据绑定变更。 ->- hml中的js表达式不支持ES6语法。 +>- hml文件中的js表达式不支持ES6语法。 -## 事件绑定 +## 普通事件绑定 -事件绑定的回调函数接收一个事件对象参数,可以通过访问该事件对象获取事件信息。 +事件通过'on'或者'@'绑定在组件上,当组件触发事件时会执行JS文件中对应的事件处理函数。 -``` - -
- -
- -
- -
- -
- -
- -
- -
- -
-
-``` +事件支持的写法有: -``` -// xxx.js -export default { - data: { - obj: '', - }, - clickfunc: function(e) { - this.obj = 'Hello World'; - console.log(e); - }, -} -``` +- "funcName":funcName为事件回调函数名(在JS文件中定义相应的函数实现)。 +- "funcName\(a,b\)":函数参数例如a,b可以是常量,或者是在JS文件中的data中定义的变量(前面不用写this.)。 - 示例 ```
- {{count}} -
- - - - - - -
+ {{count}} +
+ + + + + + +
``` @@ -168,7 +130,83 @@ export default { ``` -## 列表渲染 +## 冒泡事件绑定5+ + +冒泡事件绑定包括: + +- 绑定冒泡事件:on:\{event\}.bubble。on:\{event\}等价于on:\{event\}.bubble。 +- 绑定并阻止冒泡事件向上冒泡:grab:\{event\}.bubble。grab:\{event\}等价于grab:\{event\}.bubble。 + + >![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** + >详细冒泡事件说明参见[通用事件](/pages/000b0100010002)章节。 + + +- **示例** + + ``` +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ ``` + + ``` + // xxx.js + export default { + clickfunc: function(e) { + console.log(e); + }, + touchstartfuc: function(e) { + console.log(e); + }, + } + ``` + + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 采用旧写法\(onclick\)的事件绑定在最小API版本6以下时采用不冒泡处理,在最小API版本为6及6以上时采用冒泡处理。 + +## 捕获事件绑定5+ + +Touch触摸类事件支持捕获,捕获阶段位于冒泡阶段之前,捕获事件先到达父组件然后达到子组件。 + +捕获事件绑定包括: + +- 绑定捕获事件:on:\{event\}.capture。 +- 绑定并阻止事件向下传递:grab:\{event\}.capture。 + +- 示例 + + ``` +
+ +
+ +
+
+ ``` + + ``` + // xxx.js + export default { + touchstartfuc: function(e) { + console.log(e); + }, + } + ``` + + +## 列表渲染 ``` @@ -214,12 +252,12 @@ tid属性主要用来加速for循环的重渲染,旨在列表中的数据有 - for="v in array":其中v为自定义的元素变量,元素索引默认为$idx。 - for="\(i, v\) in array":其中元素索引为i,元素变量为v,遍历数组对象array。 ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** >- 数组中的每个元素必须存在tid指定的数据属性,否则运行时可能会导致异常。 >- 数组中被tid指定的属性要保证唯一性,如果不是则会造成性能损耗。比如,示例中只有id和name可以作为tid字段,因为它们属于唯一字段。 >- tid不支持表达式。 -## 条件渲染 +## 条件渲染 条件渲染分为2种:if/elif/else和show。两种写法的区别在于:第一种写法里if为false时,组件不会在vdom中构建,也不会渲染,而第二种写法里show为false时虽然也不渲染,但会在vdom中构建;另外,当使用if/elif/else写法时,节点必须是兄弟节点,否则编译无法通过。实例如下: @@ -228,8 +266,8 @@ tid属性主要用来加速for循环的重渲染,旨在列表中的数据有
- Hello-One - Hello-Two + Hello-TV + Hello-Wearable Hello-World
``` @@ -251,11 +289,11 @@ tid属性主要用来加速for循环的重渲染,旨在列表中的数据有 // xxx.js export default { data: { - show: false, + visible: false, display: true, }, toggleShow: function() { - this.show = !this.show; + this.visible = !this.visible; }, toggleDisplay: function() { this.display = !this.display; @@ -263,7 +301,7 @@ export default { } ``` -优化渲染优化:show方法。当show为真时,节点正常渲染;当为假时,仅仅设置display样式为none。 +优化渲染优化:show方法。当show为true时,节点正常渲染;当为false时,仅仅设置display样式为none。 ``` @@ -298,10 +336,10 @@ export default { } ``` ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** >禁止在同一个元素上同时设置for和if属性。 -## 逻辑控制块 +## 逻辑控制块 控制块使得循环渲染和条件渲染变得更加灵活;block在构建时不会被当作真实的节点编译。注意block标签只支持for和if属性。 @@ -333,9 +371,9 @@ export default { } ``` -## 模板引用 +## 模板引用 -HML可以通过element引用模板文件,详细介绍可参考[自定义组件](/pages/000d0200#ZH-CN_TOPIC_0000001162494627)章节。 +HML可以通过element引用模板文件,详细介绍可参考[自定义组件](/pages/000b01000200)章节。 ``` diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/02.CSS\350\257\255\346\263\225\345\217\202\350\200\203.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/02.CSS\350\257\255\346\263\225\345\217\202\350\200\203.md" similarity index 33% rename from "website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/02.CSS\350\257\255\346\263\225\345\217\202\350\200\203.md" rename to "website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/02.CSS\350\257\255\346\263\225\345\217\202\350\200\203.md" index b9a94f148f81b86eb022a62efc6b8c1ed37c867c..8ce940f38c43077e35edf1e0e174fb34e1affdf4 100644 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/02.CSS\350\257\255\346\263\225\345\217\202\350\200\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/02.CSS\350\257\255\346\263\225\345\217\202\350\200\203.md" @@ -1,6 +1,6 @@ --- title: CSS语法参考 -permalink: /pages/000d000301 +permalink: /pages/000b0100000301 navbar: true sidebar: true prev: true @@ -9,33 +9,25 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:37 --- -# CSS语法参考 - -- [尺寸单位](#zh-cn_topic_0000001058988944_section81638230913) -- [样式导入](#zh-cn_topic_0000001058988944_section890312411592) -- [声明样式](#zh-cn_topic_0000001058988944_section197695604215) -- [选择器](#zh-cn_topic_0000001058988944_section381741144310) -- [选择器优先级](#zh-cn_topic_0000001058988944_section1460102134415) -- [伪类](#zh-cn_topic_0000001058988944_section633010213458) -- [样式预编译](#zh-cn_topic_0000001058988944_section1690162216454) +# CSS语法参考 CSS是描述HML页面结构的样式语言。所有组件均存在系统默认样式,也可在页面CSS样式文件中对组件、页面自定义不同的样式。 -## 尺寸单位 +## 尺寸单位 1. 逻辑像素px(文档中以表示): - 1. 默认屏幕具有的逻辑宽度为720px(配置见[配置文件](/pages/000d0001#ZH-CN_TOPIC_0000001162494585)中的window小节),实际显示时会将页面布局缩放至屏幕实际宽度,如100px在实际宽度为1440物理像素的屏幕上,实际渲染为200物理像素(从720px向1440物理像素,所有尺寸放大2倍)。 - 2. 额外配置autoDesignWidth为true时(配置见[配置文件](/pages/000d0001#ZH-CN_TOPIC_0000001162494585)中的window小节),逻辑像素px将按照屏幕密度进行缩放,如100px在屏幕密度为3的设备上,实际渲染为300物理像素。应用需要适配多种设备时,建议采用此方法。 + 1. 默认屏幕具有的逻辑宽度为720px(配置见[配置文件](/pages/000b01000001)中的window小节),实际显示时会将页面布局缩放至屏幕实际宽度,如100px在实际宽度为1440物理像素的屏幕上,实际渲染为200物理像素(从720px向1440物理像素,所有尺寸放大2倍)。 + 2. 额外配置autoDesignWidth为true时(配置见[配置文件](/pages/000b01000001)中的window小节),逻辑像素px将按照屏幕密度进行缩放,如100px在屏幕密度为3的设备上,实际渲染为300物理像素。应用需要适配多种设备时,建议采用此方法。 2. 百分比(文档中以表示):表示该组件占父组件尺寸的百分比,如组件的width设置为50%,代表其宽度为父组件的50%。 -## 样式导入 +## 样式导入 -为了模块化管理和代码复用,CSS样式文件支持 @import 语句,导入 CSS 文件。 +为了模块化管理和代码复用,CSS样式文件支持 @import 语句,导入css文件。 -## 声明样式 +## 声明样式 每个页面目录下存在一个与布局hml文件同名的css文件,用来描述该hml页面中组件的样式,决定组件应该如何显示。 @@ -73,52 +65,52 @@ CSS是描述HML页面结构的样式语言。所有组件均存在系统默认 ``` -## 选择器 +## 选择器 css选择器用于选择需要添加样式的元素,支持的选择器如下表所示: - -

选择器

+ + - - - - - - - - - - - - - - - - - @@ -157,7 +149,7 @@ div { /* 对class="container"的组件下的所有text设置样式 */ .container text { color: #007dff; -}; +} /* 对class="container"的组件下的直接后代text设置样式 */ .container > text { color: #fa2a2d; @@ -166,57 +158,57 @@ div { 以上样式运行效果如下: -![](/images/zh-cn/application-dev/js-reference/figures/sample_css.png) +![](/images/application-dev/reference/arkui-js/figures/sample_css.png) -其中“.container text”将“标题”和“内容”设置为蓝色,而“.container \> text”直接后代选择器将“标题”设置为红色。2者优先级相同,但直接后代选择器声明顺序靠后,将前者样式覆盖(优先级计算见[选择器优先级](#zh-cn_topic_0000001058988944_section1460102134415))。 +其中“.container text”将“标题”和“内容”设置为蓝色,而“.container \> text”直接后代选择器将“标题”设置为红色。2者优先级相同,但直接后代选择器声明顺序靠后,将前者样式覆盖(优先级计算见[选择器优先级](#section1460102134415))。 -## 选择器优先级 +## 选择器优先级 选择器的优先级计算规则与w3c规则保持一致(只支持:内联样式,id,class,tag,后代和直接后代),其中内联样式为在元素style属性中声明的样式。 当多条选择器声明匹配到同一元素时,各类选择器优先级由高到低顺序为:内联样式 \> id \> class \> tag。 -## 伪类 +## 伪类 css伪类是选择器中的关键字,用于指定要选择元素的特殊状态。例如,:disabled状态可以用来设置元素的disabled属性变为true时的样式。 -除了单个伪类之外,还支持伪类的组合,例如,:disabled:checked状态可以用来设置元素的disabled属性和checked属性同时为true时的样式。支持的单个伪类如下表所示,按照优先级降序排列: +除了单个伪类之外,还支持伪类的组合,例如,:focus:checked状态可以用来设置元素的focus属性和checked属性同时为true时的样式。支持的单个伪类如下表所示,按照优先级降序排列: - -

选择器

样例

+

样例

样例描述

+

样例描述

.class

+

.class

.container

+

.container

用于选择class="container"的组件。

+

用于选择class="container"的组件。

#id

+

#id

#titleId

+

#titleId

用于选择id="titleId"的组件。

+

用于选择id="titleId"的组件。

tag

+

tag

text

+

text

用于选择text组件。

+

用于选择text组件。

,

+

,

.title, .content

+

.title, .content

用于选择class="title"和class="content"的组件。

+

用于选择class="title"和class="content"的组件。

#id .class tag

+

#id .class tag

#containerId .content text

+

#containerId .content text

非严格父子关系的后代选择器,选择具有id="containerId"作为祖先元素,class="content"作为次级祖先元素的所有text组件。如需使用严格的父子关系,可以使用“>”代替空格,如:#containerId>.content

+

非严格父子关系的后代选择器,选择具有id="containerId"作为祖先元素,class="content"作为次级祖先元素的所有text组件。如需使用严格的父子关系,可以使用“>”代替空格,如:#containerId>.content。

名称

+ + - - - - - - - - - - - - - - @@ -238,10 +230,10 @@ css伪类是选择器中的关键字,用于指定要选择元素的特殊状 } ``` ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** >针对弹窗类组件及其子元素不支持伪类效果,包括popup、dialog、menu、option、picker -## 样式预编译 +## 样式预编译 预编译提供了利用特有语法生成css的程序,可以提供变量、运算等功能,令开发者更便捷地定义组件样式,目前支持less、sass和scss的预编译。使用样式预编译时,需要将原css文件后缀改为less、sass或scss,如index.css改为index.less、index.sass或index.scss。 @@ -276,7 +268,21 @@ css伪类是选择器中的关键字,用于指定要选择元素的特殊状 } ``` - >![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** + >![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** >引用的预编译文件建议放在common目录进行管理。 +## CSS样式继承6+ + +css样式继承提供了子节点继承父节点样式的能力,继承下来的样式在多选择器样式匹配的场景下,优先级排最低,当前支持以下样式的继承: + +- font-family +- font-weight +- font-size +- font-style +- text-align +- line-height +- letter-spacing +- color +- visibility + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/03.JS\350\257\255\346\263\225\345\217\202\350\200\203.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/03.JS\350\257\255\346\263\225\345\217\202\350\200\203.md" new file mode 100644 index 0000000000000000000000000000000000000000..2a40d52542e00d9a82deac6d5cc7fd413480e17b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/03.JS\350\257\255\346\263\225\345\217\202\350\200\203.md" @@ -0,0 +1,535 @@ +--- +title: JS语法参考 +permalink: /pages/000b0100000302 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# JS语法参考 + +JS文件用来定义HML页面的业务逻辑,支持ECMA规范的JavaScript语言。基于JavaScript语言的动态化能力,可以使应用更加富有表现力,具备更加灵活的设计能力。下面讲述JS文件的编译和运行的支持情况。 + +## 语法 + +支持ES6语法。 + +- 模块声明 + + 使用import方法引入功能模块: + + ``` + import router from '@system.router'; + ``` + +- 代码引用 + + 使用import方法导入js代码: + + ``` + import utils from '../../common/utils.js'; + ``` + + +## 对象 + +- 应用对象 + + +

名称

支持组件

+

支持组件

描述

+

描述

:disabled

+

:disabled

支持disabled属性的组件

+

支持disabled属性的组件

表示disabled属性变为true时的元素(不支持动画样式的设置)。

+

表示disabled属性变为true时的元素(不支持动画样式的设置)。

:active

+

:active

支持click事件的组件

+

支持click事件的组件

表示被用户激活的元素,如:被用户按下的按钮、被激活的tab-bar页签(不支持动画样式的设置)

+

表示被用户激活的元素,如:被用户按下的按钮、被激活的tab-bar页签(不支持动画样式的设置)

:waiting

+

:waiting

button

+

button

表示waiting属性为true的元素(不支持动画样式的设置)

+

表示waiting属性为true的元素(不支持动画样式的设置)

:checked

+

:checked

input[type="checkbox"、type="radio"]、 switch

+

input[type="checkbox"、type="radio"]、 switch

表示checked属性为true的元素(不支持动画样式的设置)

+

表示checked属性为true的元素(不支持动画样式的设置)

+ + + + + + + + + +

属性

+

类型

+

描述

+

$def

+

Object

+

使用this.$app.$def获取在app.js中暴露的对象。

+
说明:

应用对象不支持数据绑定,需主动触发UI更新。

+
+
+ + 示例代码 + + ``` + // app.js + export default { + onCreate() { + console.info('AceApplication onCreate'); + }, + onDestroy() { + console.info('AceApplication onDestroy'); + }, + globalData: { + appData: 'appData', + appVersion: '2.0', + }, + globalMethod() { + console.info('This is a global method!'); + this.globalData.appVersion = '3.0'; + } + }; + ``` + + ``` + // index.js页面逻辑代码 + export default { + data: { + appData: 'localData', + appVersion:'1.0', + }, + onInit() { + this.appData = this.$app.$def.globalData.appData; + this.appVersion = this.$app.$def.globalData.appVersion; + }, + invokeGlobalMethod() { + this.$app.$def.globalMethod(); + }, + getAppVersion() { + this.appVersion = this.$app.$def.globalData.appVersion; + } + } + ``` + +- 页面对象 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

描述

+

data

+

Object/Function

+

页面的数据模型,类型是对象或者函数,如果类型是函数,返回值必须是对象。属性名不能以$或_开头,不要使用保留字for, if, show, tid。

+

data与private和public不能重合使用。

+

$refs

+

Object

+

持有注册过ref 属性的DOM元素或子组件实例的对象。示例见获取DOM元素

+

private

+

Object

+

页面的数据模型,private下的数据属性只能由当前页面修改。

+

public

+

Object

+

页面的数据模型,public下的数据属性的行为与data保持一致。

+

props

+

Array/Object

+

props用于组件之间的通信,可以通过<tag xxxx='value'>方式传递给组件;props名称必须用小写,不能以$或_开头,不要使用保留字for, if, show, tid。目前props的数据类型不支持Function。示例见自定义组件

+

computed

+

Object

+

用于在读取或设置进行预先处理,计算属性的结果会被缓存。计算属性名不能以$或_开头,不要使用保留字。示例见自定义组件

+
+ + +## 方法 + +- 数据方法 + + + + + + + + + + + + + + + + +

方法

+

参数

+

描述

+

$set

+

key: string, value: any

+

添加新的数据属性或者修改已有数据属性。

+

用法:

+

this.$set('key',value):添加数据属性。

+

$delete

+

key: string

+

删除数据属性。

+

用法:

+

this.$delete('key'):删除数据属性。

+
+ + 示例代码 + + ``` + export default { + data: { + keyMap: { + OS: 'OpenHarmony', + Version: '2.0', + }, + }, + getAppVersion() { + this.$set('keyMap.Version', '3.0'); + console.info("keyMap.Version = " + this.keyMap.Version); // keyMap.Version = 3.0 + + this.$delete('keyMap'); + console.info("keyMap.Version = " + this.keyMap); // log print: keyMap.Version = undefined + } + } + ``` + +- 公共方法 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法

+

参数

+

描述

+

$element

+

id: string

+

获得指定id的组件对象,如果无指定id,则返回根组件对象。示例见获取DOM元素

+

用法:

+

<div id='xxx'></div>

+
  • this.$element('xxx'):获得id为xxx的组件对象。
  • this.$element():获得根组件对象。
+

$rootElement

+

+

获取根组件对象。

+

用法:this.$rootElement().scrollTo({ duration: 500, position: 300 }), 页面在500ms内滚动300px。

+

$root

+

+

获得顶级ViewModel实例。获取ViewModel示例。

+

$parent

+

+

获得父级ViewModel实例。获取ViewModel示例。

+

$child

+

id: string

+

获得指定id的子级自定义组件的ViewModel实例。获取ViewModel示例。

+

用法:

+

this.$child('xxx') :获取id为xxx的子级自定义组件的ViewModel实例。

+
+ +- 事件方法 + + + + + + + + + + + + +

方法

+

参数

+

描述

+

$watch

+

data: string, callback: string | Function

+

观察data中的属性变化,如果属性值改变,触发绑定的事件。示例见自定义组件

+

用法:

+

this.$watch('key', callback)

+
+ +- 页面方法 + + + + + + + + + + + + +

方法

+

参数

+

描述

+

scrollTo6+

+

scrollPageParam: ScrollPageParam

+

将页面滚动到目标位置,可以通过ID选择器指定或者滚动距离指定。

+
+ + **表 1** ScrollPageParam6+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

描述

+

position

+

number

+

-

+

指定滚动位置。

+

id

+

string

+

-

+

指定需要滚动到的元素id。

+

duration

+

number

+

300

+

指定滚动时长,单位为毫秒。

+

timingFunction

+

string

+

ease

+

指定滚动动画曲线,可选值参考

+

animation-timing-function

+

complete

+

() => void

+

-

+

指定滚动完成后需要执行的回调函数。

+
+ + 示例: + + ``` + this.$rootElement.scrollTo({position: 0}) + this.$rootElement.scrollTo({id: 'id', duration: 200, timingFunction: 'ease-in', complete: ()=>void}) + ``` + + +## 获取DOM元素 + +1. 通过$refs获取DOM元素 + + ``` + +
+ +
+ ``` + + ``` + // index.js + export default { + data: { + images: [ + { src: '/common/frame1.png' }, + { src: '/common/frame2.png' }, + { src: '/common/frame3.png' }, + ], + }, + handleClick() { + const animator = this.$refs.animator; // 获取ref属性为animator的DOM元素 + const state = animator.getState(); + if (state === 'paused') { + animator.resume(); + } else if (state === 'stopped') { + animator.start(); + } else { + animator.pause(); + } + }, + }; + ``` + +2. 通过$element获取DOM元素 + + ``` + +
+ +
+ ``` + + ``` + // index.js + export default { + data: { + images: [ + { src: '/common/frame1.png' }, + { src: '/common/frame2.png' }, + { src: '/common/frame3.png' }, + ], + }, + handleClick() { + const animator = this.$element('animator'); // 获取id属性为animator的DOM元素 + const state = animator.getState(); + if (state === 'paused') { + animator.resume(); + } else if (state === 'stopped') { + animator.start(); + } else { + animator.pause(); + } + }, + }; + ``` + + +## 获取ViewModel + +根节点所在页面: + +``` + + +
+
+ {{text}} + +
+
+``` + +``` +// root.js +export default { + data: { + text: 'I am root!', + }, +} +``` + +自定义parent组件: + +``` + + +
+ parent component click + hello parent component! + +
+``` + +``` +// parent.js +export default { + data: { + show: false, + text: 'I am parent component!', + }, + parentClicked () { + this.show = !this.show; + console.info('parent component get parent text'); + console.info(`${this.$parent().text}`); + console.info("parent component get child function"); + console.info(`${this.$child('selfDefineChild').childClicked()}`); + }, +} +``` + +自定义child组件: + +``` + +
+ child component clicked + hello child component +
+``` + +``` +// child.js +export default { + data: { + show: false, + text: 'I am child component!', + }, + childClicked () { + this.show = !this.show; + console.info('child component get parent text'); + console.info('${this.$parent().text}'); + console.info('child component get root text'); + console.info('${this.$root().text}'); + }, +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/05.\347\224\237\345\221\275\345\221\250\346\234\237.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/05.\347\224\237\345\221\275\345\221\250\346\234\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..40c69e42bfa708e6ca7610f8e652be3e33410cf0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/05.\347\224\237\345\221\275\345\221\250\346\234\237.md" @@ -0,0 +1,180 @@ +--- +title: 生命周期 +permalink: /pages/000b01000004 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 生命周期 + +## 应用生命周期 + +在app.js中可以定义如下应用生命周期函数: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

描述

+

触发时机

+

onCreate

+

() => void

+

应用创建

+

当应用创建时调用。

+

onShow6+

+

() => void

+

应用处于前台

+

当应用处于前台时触发。

+

onHide6+

+

() => void

+

应用处于后台

+

当应用处于后台时触发。

+

onDestroy

+

() => void

+

应用销毁

+

当应用退出时触发。

+
+ +## 页面生命周期 + +在页面JS文件中可以定义如下页面生命周期函数: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

描述

+

触发时机

+

onInit

+

() => void

+

页面初始化

+

页面数据初始化完成时触发,只触发一次。

+

onReady

+

() => void

+

页面创建完成

+

页面创建完成时触发,只触发一次。

+

onShow

+

() => void

+

页面显示

+

页面显示时触发。

+

onHide

+

() => void

+

页面消失

+

页面消失时触发。

+

onDestroy

+

() => void

+

页面销毁

+

页面销毁时触发。

+

onBackPress

+

() => boolean

+

返回按钮动作

+

当用户点击返回按钮时触发。

+
  • 返回true表示页面自己处理返回逻辑。
  • 返回false表示使用默认的返回逻辑。
  • 不返回值会作为false处理。
+

onActive()5+

+

() => void

+

页面激活

+

页面激活时触发。

+

onInactive()5+

+

() => void

+

页面暂停

+

页面暂停时触发。

+

onNewRequest()5+

+

() => void

+

FA重新请求

+

FA已经启动时收到新的请求后触发。

+
+ +页面A的生命周期接口的调用顺序 + +- 打开页面A:onInit\(\) -\> onReady\(\) -\> onShow\(\) +- 在页面A打开页面B:onHide\(\) +- 从页面B返回页面A:onShow\(\) +- 退出页面A:onBackPress\(\) -\> onHide\(\) -\> onDestroy\(\) +- 页面隐藏到后台运行:onInactive\(\) -\> onHide\(\) +- 页面从后台运行恢复到前台:onShow\(\) -\> onActive\(\) + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001147417424.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/06.\350\265\204\346\272\220\351\231\220\345\256\232\344\270\216\350\256\277\351\227\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/06.\350\265\204\346\272\220\351\231\220\345\256\232\344\270\216\350\256\277\351\227\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..68e30f0b0dd3aabea1a8a19cb4ff7c299e5d0294 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/06.\350\265\204\346\272\220\351\231\220\345\256\232\344\270\216\350\256\277\351\227\256.md" @@ -0,0 +1,141 @@ +--- +title: 资源限定与访问 +permalink: /pages/000b01000005 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 资源限定与访问 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 屏幕密度从API Version 4 开始支持。 +>- 其余限定词从API Version 6 开始支持。 + +## 资源限定词 + +资源限定词可以由一个或多个表征应用场景或设备特征的限定词组合而成,包括屏幕密度等维度,限定词之间通过中划线(-)连接。开发者在**resources**目录下创建限定词文件时,需要掌握限定词文件的命名要求以及与限定词文件与设备状态的匹配规则。 + +## 资源限定词的命名要求 + +- 限定词的组合顺序:屏幕密度。开发者可以根据应用的使用场景和设备特征,选择其中的一类或几类限定词组成目录名称,顺序不可颠倒。其中MCC和MNC须同时存在。 +- 限定词的连接方式:限定词之间均采用中划线(-)连接。例如:res-dark-ldpi.json 。 +- 限定词的取值范围:每类限定词的取值必须符合下表的条件,否则,将无法匹配目录中的资源文件,限定词大小写敏感。 +- 限定词前缀:**resources**资源文件的资源限定词有前缀res,例如res-ldpi.json。 +- 默认资源限定文件:**resources**资源文件的默认资源限定文件为res-defaults.json。 +- 资源限定文件中不支持使用枚举格式的颜色来设置资源。 + +**表 1** 资源限定词 + + + + + + + + + + + + + + + + + + + +

类型

+

含义与取值说明

+

MCC和MNC6+

+

移动设备国家代码 (MCC),设备 SIM 卡中的移动设备网络代码 (MNC),如mcc460-mnc01,mcc460-mnc02。

+

横竖屏6+

+

表示设备的屏幕方向,取值如下:

+
  • vertical:竖屏
  • horizontal:横屏
+

设备类型6+

+

表示设备的类型,取值如下:

+
  • phone:手机
  • tablet:平板
  • tv:智慧屏
  • wearable:智能穿戴
+

屏幕密度

+

表示设备的屏幕密度(单位为dpi),取值如下:

+
  • ldpi:表示低密度屏幕(~120dpi)(0.75基准密度)
  • mdpi:表示中密度屏幕(~160dpi)(基准密度)
  • hdpi:表示高密度屏幕(~240dpi)(1.5基准密度)
  • xhdpi:表示加高密度屏幕(~320dpi)(2.0基准密度)
  • xxhdpi:表示超超高密度屏幕(~480dpi)(3.0基准密度)
  • xxxhdpi:表示超超超高密度屏幕(~640dpi)(4.0基准密度)
+
+ +## 限定词与设备状态的匹配规则 + +- 在为设备匹配对应的资源文件时,限定词目录匹配的优先级从高到低依次为:MCC和MNC\> 横竖屏 \> 深色模式 \> 设备类型 \> 屏幕密度。在资源限定词目录均未匹配的情况下,则匹配默认资源限定文件。 +- 如果限定词目录中包含资源限定词,则对应限定词的取值必须与当前的设备状态完全一致,该目录才能够参与设备的资源匹配。例如:资源限定文件res-hdpi.json与当前设备密度xhdpi无法匹配。 + +## 引用JS模块内resources资源 + +在应用开发的hml和js文件中使用$r的语法,可以对JS模块内的resources目录下的json资源进行格式化,获取相应的资源内容。 + + + + + + + + + + + + +

属性

+

类型

+

描述

+

$r

+

(key: string) => string

+

获取资源限定下具体的资源内容。例如:this.$r('strings.hello')。

+

参数说明:

+
  • key:定义在资源限定文件中的键值,如strings.hello。
+

res-defaults.json示例:

+
{
+    strings: {
+        hello: 'hello world'
+    }
+}
+
+ +## 示例 + +resources/res-dark.json: + +``` +{ + "image": { + "clockFace": "common/dark_face.png" + }, + "colors": { + "background": "#000000" + } +} +``` + +resources/res-defaults.json: + +``` +{ + "image": { + "clockFace": "common/face.png" + }, + "colors": { + "background": "#ffffff" + } +} +``` + +``` + +
+ +
+``` + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>资源限定文件中不支持颜色枚举格式。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/07.\345\244\232\350\257\255\350\250\200\346\224\257\346\214\201.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/07.\345\244\232\350\257\255\350\250\200\346\224\257\346\214\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..5cf2f179a98e50f26bfbccf3cd4586aaa684d956 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/07.\345\244\232\350\257\255\350\250\200\346\224\257\346\214\201.md" @@ -0,0 +1,322 @@ +--- +title: 多语言支持 +permalink: /pages/000b01000006 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 多语言支持 + +基于开发框架的应用会覆盖多个国家和地区,开发框架支持多语言能力后,可以让应用开发者无需开发多个不同语言的版本,就可以同时支持多种语言的切换,为项目维护带来便利。 + +开发者仅需要通过[定义资源文件](#section733935013515)和[引用资源](#section522111116527)两个步骤,就可以使用开发框架的多语言能力;如果需要在应用中获取当前系统语言,请参考[获取语言](#section2872192475310)。 + +## 定义资源文件 + +资源文件用于存放应用在多种语言场景下的资源内容,开发框架使用JSON文件保存资源定义。在[文件组织](/pages/000b01000000)中指定的i18n文件夹内放置语言资源文件,其中语言资源文件的命名是由语言、文字、国家或地区的限定词通过中划线连接组成,其中文字和国家或地区可以省略,如zh-Hant-HK(中国香港地区使用的繁体中文)、zh-CN(中国使用的简体中文)、zh(中文)。命名规则如下: + +``` +language[-script-region].json +``` + +限定词的取值需符合下表要求。 + +**表 1** 限定词取值要求 + + + + + + + + + + + + + + + + +

限定词类型

+

含义与取值说明

+

语言

+

表示设备使用的语言类型,由2~3个小写字母组成。例如:zh表示中文,en表示英语,mai表示迈蒂利语。

+

详细取值范围,请查阅ISO 639(ISO制定的语言编码标准)。

+

文字

+

表示设备使用的文字类型,由1个大写字母(首字母)和3个小写字母组成。例如:Hans表示简体中文,Hant表示繁体中文。

+

详细取值范围,请查阅ISO 15924(ISO制定的文字编码标准)。

+

国家或地区

+

表示用户所在的国家或地区,由2~3个大写字母或者3个数字组成。例如:CN表示中国,GB表示英国。

+

详细取值范围,请查阅ISO 3166-1(ISO制定的国家和地区编码标准)。

+
+ +当开发框架无法在应用中找到系统语言的资源文件时,默认使用en-US.json中的资源内容。 + +资源文件内容格式如下: + +en-US.json + +``` +{ + "strings": { + "hello": "Hello world!", + "object": "Object parameter substitution-{name}", + "array": "Array type parameter substitution-{0}", + "symbol": "@#$%^&*()_+-={}[]\\|:;\"'<>,./?" + }, + + "files": { + "image": "image/en_picture.PNG" + } +} +``` + +由于不同语言针对单复数有不同的匹配规则,在资源文件中使用“zero”“one”“two”“few”“many”“other”定义不同单复数场景下的词条内容。例如中文不区分单复数,仅存在“other”场景;英文存在“one”、“other”场景;阿拉伯语存在上述6种场景。 + +以en-US.json和ar-AE.json为例,资源文件内容格式如下: + +en-US.json + +``` +{ + "strings": { + "people": { + "one": "one person", + "other": "{count} people" + } + } +} +``` + +ar-AE.json + +``` +{ + "strings": { + "people": { + "zero": "لا أحد", + "one": "وحده", + "two": "اثنان", + "few": "ستة اشخاص", + "many": "خمسون شخص", + "other": "مائة شخص" + } + } +} +``` + +## 引用资源 + +在应用开发的页面中使用多语言的语法,包含简单格式化和单复数格式化两种,都可以在hml或js中使用。 + +- 简单格式化方法 + + 在应用中使用$t方法引用资源,$t既可以在hml中使用,也可以在js中使用。系统将根据当前语言环境和指定的资源路径(通过$t的path参数设置),显示对应语言的资源文件中的内容。 + + **表 2** 简单格式化 + + + + + + + + + + + + + + + + +

属性

+

类型

+

参数

+

必填

+

描述

+

$t

+

Function

+

请见表3

+

+

根据系统语言完成简单的替换:this.$t('strings.hello')

+
+ + **表 3** $t参数说明 + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

必填

+

描述

+

path

+

string

+

+

资源路径

+

params

+

Array|Object

+

+

运行时用来替换占位符的实际内容,占位符分为两种:

+
  • 具名占位符,例如{name}。实际内容必须用Object类型指定,例如:$t('strings.object', { name: 'Hello world' })。
  • 数字占位符,例如{0}。实际内容必须用Array类型指定,例如:$t('strings.array', ['Hello world'])。
+
+ +- 简单格式化示例代码 + + ``` + +
+ + {{ $t('strings.hello') }} + + {{ $t('strings.object', { name: 'Hello world' }) }} + + {{ $t('strings.array', ['Hello world']) }} + + {{ hello }} + + {{ replaceObject }} + + {{ replaceArray }} + + + + + +
+ ``` + + ``` + // xxx.js + // 下面为在js文件中的使用方法。 + export default { + data: { + hello: '', + replaceObject: '', + replaceArray: '', + replaceSrc: '', + }, + onInit() { + this.hello = this.$t('strings.hello'); + this.replaceObject = this.$t('strings.object', { name: 'Hello world' }); + this.replaceArray = this.$t('strings.array', ['Hello world']); + this.replaceSrc = this.$t('files.image'); + }, + } + ``` + +- 单复数格式化方法 + + **表 4** 单复数格式化 + + + + + + + + + + + + + + + + +

属性

+

类型

+

参数

+

必填

+

描述

+

$tc

+

Function

+

请见表5

+

+

根据系统语言完成单复数替换:this.$tc('strings.people')

+
说明:

定义资源的内容通过json格式的key为“zero”、“one”、“two”、“few”、“many”和“other”区分。

+
+
+ + **表 5** $tc参数说明 + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

必填

+

描述

+

path

+

string

+

+

资源路径

+

count

+

number

+

+

要表达的值

+
+ +- 单复数格式化示例代码 + + ``` + +
+ + {{ $tc('strings.people', 0) }} + + {{ $tc('strings.people', 1) }} + + {{ $tc('strings.people', 2) }} + + {{ $tc('strings.people', 6) }} + + {{ $tc('strings.people', 50) }} + + {{ $tc('strings.people', 100) }} +
+ ``` + + +## 获取语言 + +获取语言功能请参考[应用配置](/pages/000b000804)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\345\261\236\346\200\247.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\345\261\236\346\200\247.md" new file mode 100644 index 0000000000000000000000000000000000000000..debc5ff007247224739f2dbd43a27fcf048541f2 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\345\261\236\346\200\247.md" @@ -0,0 +1,199 @@ +--- +title: 通用属性 +permalink: /pages/000b0100010000 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 通用属性 + +## 常规属性 + +常规属性指的是组件普遍支持的用来设置组件基本标识和外观显示特征的属性。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

style

+

string

+

-

+

+

组件的样式声明。

+

class

+

string

+

-

+

+

组件的样式类,用于引用样式表。

+

ref

+

string

+

-

+

+

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

+

disabled

+

boolean

+

false

+

+

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

+

focusable

+

boolean

+

false

+

+

当前组件是否可以获取焦点。 当focusable设置为true时,组件可以响应焦点事件和按键事件。当组件额外设置了按键事件或者点击事件时,框架会设置该属性为true。

+

data

+

string

+

-

+

+

给当前组件设置data属性,进行相应的数据存储和读取。JS文件中:

+
  • 在事件回调中使用 e.target.attr.data 读取数据,e为事件回调函数入参。
  • 使用$element或者$refs获取DOM元素后,通过attr.data 进行访问。
+
说明:

从API Version 6 开始,建议使用data-*。

+
+

data-*6+

+

string

+

-

+

+

给当前组件设置data-*属性,进行相应的数据存储和读取。大小写不敏感,如data-A和data-a默认相同。JS文件中:

+
  • 在事件回调中使用 e.target.dataSet.a读取数据,e为事件回调函数入参。
  • 使用$element或者$refs获取DOM元素后,通过dataSet.a进行访问。
+

click-effect5+

+

string

+

-

+

+

通过这个属性可以设置组件的弹性点击效果,当前支持如下三种效果:

+
  • spring-small:建议小面积组件设置,缩放(90%)。
  • spring-medium:建议中面积组件设置,缩放(95%)。
  • spring-large:建议大面积组件设置,缩放(95%)。
+

dir6+

+

string

+

auto

+

+

设置元素布局模式,支持设置rtl、ltr和auto三种属性值:

+
  • rtl:使用从右往左布局模式。
  • ltr:使用从左往右布局模式。
  • auto:跟随系统语言环境。
+
+ +## 渲染属性 + +组件普遍支持的用来设置组件是否渲染的属性。 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

描述

+

for

+

Array

+

-

+

根据设置的数据列表,展开当前元素。

+

if

+

boolean

+

-

+

根据设置的boolean值,添加或移除当前元素。

+

show

+

boolean

+

-

+

根据设置的boolean值,显示或隐藏当前元素。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>属性和样式不能混用,不能在属性字段中进行样式设置。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\346\240\267\345\274\217.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\346\240\267\345\274\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..572914001e3b730811484a2431eb34952c07eec5 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\346\240\267\345\274\217.md" @@ -0,0 +1,640 @@ +--- +title: 通用样式 +permalink: /pages/000b0100010001 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 通用样式 + +组件普遍支持的可以在style或css中设置组件外观样式。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

描述

+

width

+

<length> | <percentage>

+

-

+

设置组件自身的宽度。

+

缺省时使用元素自身内容需要的宽度。

+

height

+

<length> | <percentage>

+

-

+

设置组件自身的高度。

+

缺省时使用元素自身内容需要的高度。

+

min-width5+

+

<length> | <percentage>6+

+

0

+

设置元素的最小宽度。

+

min-height5+

+

<length> | <percentage>6+

+

0

+

设置元素的最小高度。

+

max-width5+

+

<length> | <percentage>6+

+

-

+

设置元素的最大宽度。默认无限制。

+

max-height5+

+

<length> | <percentage>6+

+

-

+

设置元素的最大高度。默认无限制。

+

padding

+

<length> | <percentage>5+

+

0

+

使用简写属性设置所有的内边距属性。

+
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    +
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    +
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    +
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    +
+
+

padding-[left|top|right|bottom]

+

<length> | <percentage>5+

+

0

+

设置左、上、右、下内边距属性。

+

padding-[start|end]

+

<length> | <percentage>5+

+

0

+

设置起始和末端内边距属性。

+

margin

+

<length> | <percentage>5+

+

0

+

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

+
  • 只有一个值时,这个值会被指定给全部的四个边。

    +
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    +
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    +
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    +
+

margin-[left|top|right|bottom]

+

<length> | <percentage>5+

+

0

+

设置左、上、右、下外边距属性。

+

margin-[start|end]

+

<length> | <percentage>5+

+

0

+

设置起始和末端外边距属性。

+

border

+

-

+

0

+

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

+

border-style

+

string

+

solid

+

使用简写属性设置所有边框的样式,可选值为:

+
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
+
  • solid:显示为一条实线。
+

border-[left|top|right|bottom]-style

+

string

+

solid

+

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

+

border-[left|top|right|bottom]

+

-

+

-

+

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

+

border-width

+

<length>

+

0

+

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

+

border-[left|top|right|bottom]-width

+

<length>

+

0

+

分别设置左、上、右、下四个边框的宽度。

+

border-color

+

<color>

+

black

+

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

+

border-[left|top|right|bottom]-color

+

<color>

+

black

+

分别设置左、上、右、下四个边框的颜色。

+

border-radius

+

<length>

+

-

+

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

+

border-[top|bottom]-[left|right]-radius

+

<length>

+

-

+

分别设置左上,右上,右下和左下四个角的圆角半径。

+

background

+

<linear-gradient>

+

-

+

仅支持设置渐变样式,与background-color、background-image不兼容。

+

background-color

+

<color>

+

-

+

设置背景颜色。

+

background-image

+

string

+

-

+

设置背景图片。与background-color、background不兼容,支持网络图片资源和本地图片资源地址。

+

示例:

+
  • background-image: url("/common/background.png")
+

background-size

+
  • string
  • <length> <length>
  • <percentage> <percentage>
+

auto

+

设置背景图片的大小。

+
  • string可选值:
    • contain:把图片扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图片扩展至足够大,以使背景图片完全覆盖背景区域;背景图片的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    +
  • length值参数方式:

    设置背景图片的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    +
  • 百分比参数方式:

    以父元素的百分比来设置背景图片的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    +
+

background-repeat

+

string

+

repeat

+

针对重复背景图片样式进行设置,背景图片默认在水平和垂直方向上重复。

+
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
+

background-position

+
  • string string
  • <length> <length>
  • <percentage> <percentage>
+

0px 0px

+
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    +
+
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>。
+

box-shadow5+

+

string

+

0

+

语法:box-shadow: h-shadow v-shadow blur spread color

+

通过这个样式可以设置当前组件的阴影样式,包括水平位置(必填)、垂直位置(必填)、模糊半径(可选,默认值为0)、阴影延展距离(可选,默认值为0)、阴影颜色(可选,默认值为黑色)。

+

示例:

+
  • box-shadow :10px 20px 5px 10px #888888
  • box-shadow :100px 100px 30px red
  • box-shadow :-100px -100px 0px 40px
+

filter5+

+

string

+

-

+

语法:filter: blur(px)

+

通过这个样式可以设置当前组件布局范围的内容模糊,参数用于指定模糊半径,如果没有设置值,则默认是0(不模糊),不支持百分比。

+

示例:

+
  • filter: blur(10px)
+

backdrop-filter5+

+

string

+

-

+

语法:backdrop-filter: blur(px)

+

通过这个样式可以设置当前组件布局范围的背景模糊,参数用于指定模糊半径,如果没有设置值,则默认是0(不模糊),不支持百分比。

+

示例:

+
  • backdrop-filter: blur(10px)
+

window-filter5+

+

string

+

-

+

语法:window-filter: blur(percent), style5+

+

通过这个样式可以设置当前组件布局范围的窗口模糊程度和模糊样式,如果没有设置值,则默认是0%(不模糊),多块模糊区域时不支持设置不同的模糊值和模糊样式。style可选值:small_light(默认值), medium_light, large_light, xlarge_light, small_dark, medium_dark, large_dark, xlarge_dark。

+

示例:

+
  • window-filter: blur(50%)
  • window-filter: blur(10%), large_light
+
说明:

仅手机和平板设备支持。

+
+

opacity

+

number

+

1

+

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

+

display

+

string

+

+

flex

+

确定一个元素所产生的框的类型,可选值为:

+
  • flex:弹性布局。
  • none:不渲染此元素。
+

visibility

+

string

+

+

visible

+

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

+
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
+
说明:

visibility和display样式都设置时,仅display生效。

+
+

flex

+

number | string

+

-

+

规定当前组件如何适应父组件中的可用空间。

+

flex可以指定1个、2个5+或3个5+值。

+

单值语法:

+
  • 一个无单位数:用来设置组件的flex-grow。
  • 一个有效的宽度值5+:用来设置组件的flex-basis。
+

双值语法5+

+

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

+
  • 一个无单位数:用来设置组件的flex-shrink。
  • 一个有效的宽度值:用来设置组件的flex-basis。
+

三值语法5+

+

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

+
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

+
+

flex-grow

+

number

+

0

+

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

+
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

+
+

flex-shrink

+

number

+

1

+

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

+
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

+
+

flex-basis

+

<length>

+

+

-

+

设置组件在主轴方向上的初始大小。

+
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

+
+

align-self6+

+

string

+

-

+

设置自身在父元素交叉轴上的对齐方式,该样式会覆盖父元素的align-items样式,仅在父容器为div、list。可选值为:

+
  • stretch 弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start 元素向交叉轴起点对齐。
  • flex-end 元素向交叉轴终点对齐。
  • center 元素在交叉轴居中。
  • baseline 元素在交叉轴基线对齐。
+

position

+

string

+

relative

+

设置元素的定位类型,不支持动态变更。

+
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
+
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

+
+

[left|top|right|bottom]

+

<length> | <percentage>6+

+

-

+

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

+
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
+

[start | end]6+

+

<length> | <percentage>

+

-

+

start | end需要配合position样式使用,来确定元素的偏移位置。

+
  • start属性规定元素的起始边缘。该属性定义了定位元素起始外边距边界与其包含块起始边界之间的偏移。
  • end属性规定元素的结尾边缘。该属性定义了一个定位元素的结尾边距边界与其包含块结尾边界之间的偏移。
+

z-index6+

+

number

+

-

+

表示对于同一父节点其子节点的渲染顺序。数值越大,渲染数据越靠后。

+
说明:

z-index不支持auto,并且opacity等其他样式不会影响z-index的渲染顺序。

+
+

image-fill6+

+

<color>

+

-

+

为svg图片填充颜色,支持组件范围(与设置图片资源的属性):button(icon属性)、piece(icon属性)、search(icon属性)、input(headericon属性)、textarea(headericon属性)、image(src属性)、toolbar-item(icon属性)。

+

svg图片文件内的fill属性颜色值在渲染时将被替换为image-fill所配的颜色值,且仅对svg图片内显示声明的fill属性生效。

+

clip-path6+

+

[ <geometry-box> || <basic-shape> ] | none

+

-

+

设置组件的裁剪区域。区域内的部分显示,区域外的不显示。

+

<geometry-box>:表示裁剪区域的作用范围,默认为border-box。可选值为:

+
  • margin-box:margin计算入长宽尺寸内。
  • border-box:border计算入长宽尺寸内。
  • padding-box:padding计算入长宽尺寸内。
  • content-box:margin/border/padding不计算入长宽尺寸内。
+

<basic-shape>:表示裁剪的形状。包含以下类型:

+
  • inset,格式为:inset( <percentage>{1,4} [ round <'border-radius'> ]? )。
  • circle,格式为:circle( [ <percentage> ]? [ at <percentage> <percentage> ]? )。
  • ellipse,格式为:ellipse( [ <percentage>{2} ]? [ at <percentage> <percentage> ]? )。
  • polygon,格式为:polygon( [ <percentage> <percentage> ]# )
  • path,格式为:path( <string> )。
+

mask-image6+

+
  • <linear-gradient>
  • string
+

-

+

设置渐变色遮罩或本地图片设置。

+

设置渐变色遮罩,示例:

+

linear-gradient(to left, black, white)

+

设置纯色遮罩,示例:

+

linear-gradient(to right, grey , grey)

+

设置本地svg图片为遮罩,示例:url(common/mask.svg)

+

mask-size6+

+
  • string
  • <length><length>
  • <percentage> <percentage>
+

auto

+

设置遮罩图片显示大小,仅当mask-image为图片资源时有效。

+

string可选值:

+
  • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
  • cover:把图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
  • auto:保持原图的比例不变。
+

length值参数方式:设置图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

+

百分比参数方式:以原图宽高的百分比来设置图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

+

mask-position6+

+
  • string string
  • <length> <length>
  • <percentage> <percentage>
+

0px 0px

+

设置遮罩图片显示位置,仅当mask-image为图片资源时有效。关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。

+

string可选值:

+
  • left:水平方向上最左侧。
  • right:水平方向上最右侧。
  • top:竖直方向上最顶部。
  • bottom:竖直方向上最底部。
  • center:水平方向或竖直方向上中间位置。
+

length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。

+

百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。

+

可以混合使用<percentage>和<length>。

+

border-image-source7+

+

string

+

-

+

指定元素的边框图片。

+

示例:

+

border-image-source: url("/common/images/border.png")

+

border-image-slice7+

+

<length> | <percentage>

+

0

+

指定图片的边界内向偏移。

+

该属性可以有1到4个值:

+

指定一个值时,该值指定四个边的内偏移。

+

指定两个值时,第一个值指定上下两边的内偏移,第二个指定左右两边的内偏移。

+

指定三个值时,第一个指定上边的内偏移,第二个指定左右两边的内偏移,第三个指定下边的内偏移。

+

指定四个值时分别为上、右、下、左边的内偏移(顺时针顺序)。

+

border-image-width7+

+

<length> | <percentage>

+

0

+

指定图片边界的宽度。

+

指定一个值时,该值指定四个边的宽度。

+

指定两个值时,第一个值指定上下两边的宽度 ,第二个指定左右两边的宽度。

+

指定三个值时,第一个指定上边的宽度 ,第二个指定左右两边的宽度 ,第三个指定下边的宽度。

+

指定四个值时分别为上、右、下、左边的宽度 (顺时针顺序)。

+

border-image-outset7+

+

<length> | <percentage>

+

0

+

指定边框图像可超出边框的大小。

+

指定一个值时,边框图像在四个方向超出边框的距离。

+

指定两个值时,第一个值指定上下两边的边框图像超出边框的距离,第二个指定左右两边的 。

+

指定三个值时,第一个指定上边的边框图像超出边框的距离 ,第二个指定左右两边的边框图像超出边框的距离 ,第三个指定下边的边框图像超出边框的距离 。

+

指定四个值时分别为上、右、下、左边的边框图像超出边框的距离 (顺时针顺序)。

+

border-image-repeat7+

+

string

+

stretch

+

定义图片如何填充边框。

+

stretch: 拉伸图片以填充边框。

+

repeat:平铺图片以填充边框。

+

round:平铺图像。当不能整数次平铺时,根据情况放大或缩小图像。

+

border-image7+

+

string

+

-

+

简写属性,可以选择以下两种设置方式:

+ +
  • 渐变色边框

    示例:

    +

    border-image: linear-gradient(red, yellow) 10px

    +
+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>通用样式都不是必填项。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\351\200\232\347\224\250\344\272\213\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\351\200\232\347\224\250\344\272\213\344\273\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..96fcd3b6f991e59fcdb85b4b3369cbfd11702713 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\351\200\232\347\224\250\344\272\213\344\273\266.md" @@ -0,0 +1,490 @@ +--- +title: 通用事件 +permalink: /pages/000b0100010002 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 通用事件 + +## 事件说明 + +- 事件绑定在组件上,当组件达到事件触发条件时,会执行JS中对应的事件回调函数,实现页面UI视图和页面JS逻辑层的交互; +- 事件回调函数中通过参数可以携带额外的信息,如组件上的数据对象dataset,事件特有的回调参数。 + +相对于私有事件,大部分组件都可以绑定如下事件。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

是否支持冒泡

+

touchstart

+

TouchEvent

+

手指刚触摸屏幕时触发该事件。

+

5+

+

touchmove

+

TouchEvent

+

手指触摸屏幕后移动时触发该事件。

+

5+

+

touchcancel

+

TouchEvent

+

手指触摸屏幕中动作被打断时触发该事件。

+

5+

+

touchend

+

TouchEvent

+

手指触摸结束离开屏幕时触发该事件。

+

5+

+

click

+

-

+

点击动作触发该事件。

+

6+

+

doubleclick7+

+
  

双击动作触发该事件

+

+

longpress

+

-

+

长按动作触发该事件。

+

+

swipe5+

+

SwipeEvent

+

组件上快速滑动后触发该事件。

+

+

attached6+

+

-

+

当前组件节点挂载在渲染树后触发。

+

+

detached6+

+

-

+

当前组件节点从渲染树中移除后触发。

+

+

pinchstart7+

+

PinchEvent

+

手指开始执行捏合操作时触发该事件。

+

+

pinchupdate7+

+

PinchEvent

+

手指执行捏合操作过程中触发该事件。

+

+

pinchend7+

+

PinchEvent

+

手指捏合操作结束离开屏幕时触发该事件。

+

+

pinchcancel7+

+

PinchEvent

+

手指捏合操作被打断时触发该事件。

+

+

dragstart7+

+

DragEvent

+

用户开始拖拽时触发该事件。

+

+

drag7+

+

DragEvent

+

拖拽过程中触发该事件。

+

+

dragend7+

+

DragEvent

+

用户拖拽完成后触发。

+

+

dragenter7+

+

DragEvent

+

进入释放目标时触发该事件。

+

+

dragover7+

+

DragEvent

+

在释放目标内拖动时触发。

+

+

dragleave7+

+

DragEvent

+

离开释放目标区域时触发。

+

+

drop7+

+

DragEvent

+

在可释放目标区域内释放时触发。

+

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 除上述事件外,其他事件均为非冒泡事件,如[input的change事件](/pages/000b0100010205#section1721512551218),详见各个组件。 + +**表 1** BaseEvent对象属性列表 + + + + + + + + + + + + + + + + +

属性

+

类型

+

说明

+

type

+

string

+

当前事件的类型,比如click、longpress等。

+

timestamp

+

number

+

该事件触发时的时间戳。

+
+ +**表 2** TouchEvent对象属性列表\(继承BaseEvent\) + + + + + + + + + + + + + + + + +

属性

+

类型

+

说明

+

touches

+

Array<TouchInfo>

+

触摸事件时的属性集合,包含屏幕触摸点的信息数组。

+

changedTouches

+

Array<TouchInfo>

+

触摸事件时的属性集合,包括产生变化的屏幕触摸点的信息数组。数据格式和touches一样。该属性表示有变化的触摸点,如从无变有,位置变化,从有变无。例如用户手指刚接触屏幕时,touches数组中有数据,但changedTouches无数据。

+
+ +**表 3** TouchInfo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

说明

+

globalX

+

number

+

距离屏幕左上角(不包括状态栏)横向距离。屏幕的左上角为原点。

+

globalY

+

number

+

距离屏幕左上角(不包括状态栏)纵向距离。屏幕的左上角为原点。

+

localX

+

number

+

距离被触摸组件左上角横向距离。组件的左上角为原点。

+

localY

+

number

+

距离被触摸组件左上角纵向距离。组件的左上角为原点。

+

size

+

number

+

触摸接触面积。

+

force6+

+

number

+

接触力信息。

+
+ +**表 4** SwipeEvent 基础事件对象属性列表(继承BaseEvent) + + + + + + + + + + + + + + + + +

属性

+

类型

+

说明

+

direction

+

string

+

滑动方向,可能值有:

+
  1. left:向左滑动;
  2. right:向右滑动;
  3. up:向上滑动;
  4. down:向下滑动。
+

distance6+

+

number

+

在滑动方向上的滑动距离。

+
+ +**表 5** PinchEvent 对象属性列表7+ + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

说明

+

scale

+

number

+

缩放比例

+

pinchCenterX

+

number

+

捏合中心点X轴坐标,单位px

+

pinchCenterY

+

number

+

捏合中心点Y轴坐标,单位px

+
+ +**表 6** DragEvent对象属性列表\(继承BaseEvent\)7+ + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

说明

+

type

+

string

+

事件名称。

+

globalX

+

number

+

距离屏幕左上角坐标原点横向距离。

+

globalY

+

number

+

距离屏幕左上角坐标原点纵向距离。

+

timestamp

+

number

+

时间戳。

+
+ +## 事件对象 + +当组件触发事件后,事件回调函数默认会收到一个事件对象,通过该事件对象可以获取相应的信息。 + +**target对象:** + + + + + + + + + + + + +

属性

+

类型

+

说明

+

dataSet6+

+

Object

+

组件上通过通用属性设置的data-*的自定义属性组成的集合。

+
+ +**示例:** + +``` + +
+
+
+``` + +``` +// xxx.js +export default { + touchstartfunc(msg) { + console.info(`on touch start, point is: ${msg.touches[0].globalX}`); + console.info(`on touch start, data is: ${msg.target.dataSet.a}`); + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/04.\351\200\232\347\224\250\346\226\271\346\263\225.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/04.\351\200\232\347\224\250\346\226\271\346\263\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..810baf44b8bb40f50dd668629736d82d1fc3c2a7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/04.\351\200\232\347\224\250\346\226\271\346\263\225.md" @@ -0,0 +1,679 @@ +--- +title: 通用方法 +permalink: /pages/000b0100010003 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 通用方法 + +当组件通过id属性标识后,可以使用该id获取组件对象并调用相关组件方法。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

必填

+

返回值

+

描述

+

animate

+

+

keyframes: Keyframes, options: Options

+

+

-

+

在组件上创建和运行动画的快捷方式。输入动画所需的keyframes和options,返回animation对象实例。

+

getBoundingClientRect6+

+

-

+

-

+

Rect

+

获取元素的大小及其相对于窗口的位置。

+

createIntersectionObserver6+

+

ObserverParam

+
  

Observer

+

返回Observer对象,用于监听组件在当前页面的变化。

+
+ +**表 1** Rect对象说明6+ + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

描述

+

width

+

number

+

该元素的宽度。

+

height

+

number

+

该元素的高度。

+

left

+

number

+

该元素左边界距离窗口的偏移。

+

top

+

number

+

该元素上边界距离窗口的偏移。

+
+ +**表 2** ObserverParam对象说明6+ + + + + + + + + + + + + +

属性

+

类型

+

描述

+

ratios

+

Array<number>

+

组件超出或小于范围时触发observer的回调。

+
+ +**表 3** Observer对象支持的方法6+ + + + + + + + + + + + + + + + + +

方法

+

参数

+

描述

+

observe

+

callback: function

+

开启observer的订阅方法。超出或小于阈值时触发callback。

+

unobserve

+
  

取消observer的订阅方法。

+
+ +## this.$element\('_id_'\).animate\(Object, Object\) + +通过animate\(keyframes: Keyframes, options: Options\)方法获得animation对象。该对象支持动画属性,动画方法和动画事件。重复多次调用animate方法时,采用replace策略,最后一次调用时传入的参数生效。 + +**表 4** Keyframes + + + + + + + + + + + + +

参数

+

类型

+

说明

+

frames

+

Array<Style>

+

用于设置动画样式属性的对象列表。Style类型说明请见表1 Style类型说明

+
+ +**表 5** Style类型说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

默认值

+

说明

+

width

+

number

+

-

+

动画执行过程中设置到组件上的宽度值。

+

height

+

number

+

-

+

动画执行过程中设置到组件上的高度值。

+

backgroundColor

+

<color>

+

none

+

动画执行过程中设置到组件上的背景颜色。

+

opacity

+

number

+

1

+

设置到组件上的透明度(介于0到1之间)。

+

backgroundPosition

+

string

+

-

+

格式为"x y",单位为百分号或者px。

+

第一个值是水平位置,第二个值是垂直位置。

+

如果仅规定了一个值,另一个值为 50%。

+

transformOrigin

+

string

+

'center center'

+

变换对象的中心点。

+

第一个参数表示x轴的值,可以设置为left、center、right、长度值或百分比值。

+

第二个参数表示y轴的值,可以设置为top、center、bottom、长度值或百分比值。

+

transform

+

Transform

+

-

+

设置到变换对象上的类型。

+

offset

+

number

+

-

+
  • offset值(如果提供)必须在0.0到1.0(含)之间,并以升序排列。
  • 若只有两帧,可以不填offset。
  • 若超过两帧,offset必填。
+
+ +**表 6** Options + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

默认值

+

说明

+

duration

+

number

+

0

+

指定当前动画的运行时长(单位毫秒)。

+

easing

+

string

+

linear

+

描述动画的时间曲线,支持类型见表3 easing有效值说明

+

delay

+

number

+

0

+

设置动画执行的延迟时间(默认值表示无延迟)。

+

iterations

+

number | string

+

1

+

设置动画执行的次数。number表示固定次数,Infinity枚举表示无限次数播放。

+

direction6+

+

string

+

normal

+

指定动画的播放模式:

+

normal: 动画正向循环播放;

+

reverse: 动画反向循环播放;

+

alternate:动画交替循环播放,奇数次正向播放,偶数次反向播放;

+

alternate-reverse:动画反向交替循环播放,奇数次反向播放,偶数次正向播放。

+

fill

+

string

+

none

+

指定动画开始和结束的状态:

+

none:在动画执行之前和之后都不会应用任何样式到目标上。

+

forwards:在动画结束后,目标将保留动画结束时的状态(在最后一个关键帧中定义)。

+

backwards6+:动画将在animation-delay期间应用第一个关键帧中定义的值。当animation-direction为"normal"或"alternate"时应用from关键帧中的值,当animation-direction为"reverse"或"alternate-reverse"时应用to关键帧中的值。

+

both6+:动画将遵循forwards和backwards的规则,从而在两个方向上扩展动画属性。

+
+ +**表 7** easing有效值说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+

描述

+

linear

+

动画线性变化。

+

ease-in

+

动画速度先慢后快,cubic-bezier(0.42, 0.0, 1.0, 1.0)。

+

ease-out

+

动画速度先快后慢,cubic-bezier(0.0, 0.0, 0.58, 1.0)。

+

ease-in-out

+

动画先加速后减速,cubic-bezier(0.42, 0.0, 0.58, 1.0)。

+

friction

+

阻尼曲线,cubic-bezier(0.2, 0.0, 0.2, 1.0)。

+

extreme-deceleration

+

急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。

+

sharp

+

锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。

+

rhythm

+

节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。

+

smooth

+

平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。

+

cubic-bezier(x1, y1, x2, y2)

+

在三次贝塞尔函数中定义动画变化过程,入参的x和y值必须处于0-1之间。

+

steps(number, step-position)6+

+

Step曲线。

+

number必须设置,支持的类型为int。

+

step-position参数可选,支持设置start或end,默认值为end。

+
+ +- 返回值说明 + + animation对象支持的属性: + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

说明

+

finished

+

boolean

+

只读,用于表示当前动画是否已播放完成。

+

pending

+

boolean

+

只读,用于表示当前动画是否处于等待其他异步操作完成的等待状态(例如启动一个延时播放的动画)。

+

playState

+

string

+

可读可写,动画的执行状态:

+
  • idle:未执行状态,包括已结束或未开始。
  • running:动画正在运行。
  • paused:动画暂停。
  • finished:动画播放完成。
+

startTime

+

number

+

可读可写,动画播放开始的预定时间,用途类似于options参数中的delay。

+
+ + animation对象支持的方法: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法

+

参数

+

说明

+

play

+

-

+

组件播放动画。

+

finish

+

-

+

组件完成动画。

+

pause

+

-

+

组件暂停动画。

+

cancel

+

-

+

组件取消动画。

+

reverse

+

-

+

组件倒播动画。

+
+ + animation对象支持的事件: + + + + + + + + + + + + + + + + + + + +

事件

+

说明

+

start6+

+

动画开始事件。

+

cancel

+

动画被强制取消。

+

finish

+

动画播放完成。

+

repeat

+

动画重播事件。

+
+ + +- 示例代码: + + ``` + +
+
+
+ + +
+
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + } + .box{ + width: 200px; + height: 200px; + background-color: #ff0000; + margin-top: 30px; + } + .buttonBox{ + margin-top: 30px; + width: 250px; + justify-content: space-between; + } + button{ + background-color: #8e8b89; + color: white; + width: 100px; + height: 40px; + font-size: 24px; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt'; + export default{ + data:{ + animation:'', + }, + onInit(){ + }, + onShow(){ + var options = { + duration: 1500, + easing: 'friction', + delay: 500, + fill: 'forwards', + iterations: 2, + direction: 'normal', + }; + var frames = [ + {transform: {translate: '-120px -0px'}, opacity: 0.1, offset: 0.0}, + {transform: {translate: '120px 0px'}, opacity: 1.0, offset: 1.0} + ]; + this.animation = this.$element('idName').animate(frames, options); + // handle finish event + this.animation.onfinish = function(){ + prompt.showToast({ + message: "The animation is finished." + }); + }; + // handle cancel event + this.animation.oncancel = function(){ + prompt.showToast({ + message: "The animation is canceled." + }); + }; + // handle repeat event + this.animation.onrepeat = function(){ + prompt.showToast({ + message: "The animation is repeated." + }); + }; + }, + start(){ + this.animation.play(); + }, + cancel(){ + this.animation.cancel(); + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/AnimationAPI裁剪.gif) + + +## this.$element\('_id_'\).getBoundingClientRect\(\)6+ + +获取元素的大小及其相对于窗口的位置。 + +- 示例 + + ``` + // xxx.js + var rect = this.$element('id').getBoundingClientRect(); + console.info(`current element position is ${rect.left}, ${rect.top}`); + ``` + + +## this.$element\('_id_'\).createIntersectionObserver\(\)6+ + +监听元素在当前页面的可见范围。 + +- 示例 + + ``` + // xxx.js + let observer = this.$element('broad').createIntersectionObserver({ + ratios: [0.2, 0.5], // number + }); + + observer.observe((isVisible, ratio)=> { + console.info('this element is ' + isVisible + 'ratio is ' + ratio) + }) + + observer.unobserve() + ``` + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/05.\345\212\250\347\224\273\346\240\267\345\274\217.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/05.\345\212\250\347\224\273\346\240\267\345\274\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..af0842f5da8655073fb0dbe3be2b347d55902b9e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/05.\345\212\250\347\224\273\346\240\267\345\274\217.md" @@ -0,0 +1,544 @@ +--- +title: 动画样式 +permalink: /pages/000b0100010004 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 动画样式 + +组件支持动态的旋转、平移、缩放效果,可在style或css中设置。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

描述

+

transform-origin

+

string6+ | <percentage> | <length> string6+ | <percentage> | <length>

+

center center

+

变换对象的原点位置,支持px和百分比(相对于动画目标组件),如果仅设置一个值,另一个值为50%,第一个string的可选值为:left | center | right ,第二个string的可选值为:top | center | bottom。

+

示例:

+

transform-origin: 200px 30%。

+

transform-origin: 100px top。

+

transform-origin: center center。

+

transform

+

string

+

-

+

支持同时设置平移/旋转/缩放的属性。

+

详见表1

+

animation6+

+

string

+

0s ease 0s 1 normal none running none

+

格式:duration | timing-function | delay | iteration-count | direction | fill-mode | play-state | name,每个字段不区分先后,但是 duration / delay 按照出现的先后顺序解析。

+

animation-name

+

string

+

-

+

指定@keyframes,详见表2

+

animation-delay

+

<time>

+

0

+

定义动画播放的延迟时间。支持的单位为[s(秒)|ms(毫秒) ],默认单位为ms,格式为:1000ms或1s。

+

animation-duration

+

<time>

+

0

+

定义一个动画周期。支持的单位为[s(秒)|ms(毫秒) ],默认单位为ms,格式为:1000ms或1s。

+
说明:

animation-duration 样式必须设置,否则时长为 0,则不会播放动画。

+
+

animation-iteration-count

+

number | infinite

+

1

+

定义动画播放的次数,默认播放一次,可通过设置为infinite无限次播放。

+

animation-timing-function

+

string

+

ease

+

描述动画执行的速度曲线,用于使动画更为平滑。

+

可选项有:

+
  • linear:表示动画从头到尾的速度都是相同的。
  • ease:表示动画以低速开始,然后加快,在结束前变慢,cubic-bezier(0.25, 0.1, 0.25, 1.0)。
  • ease-in:表示动画以低速开始,cubic-bezier(0.42, 0.0, 1.0, 1.0)。
  • ease-out:表示动画以低速结束,cubic-bezier(0.0, 0.0, 0.58, 1.0)。
  • ease-in-out:表示动画以低速开始和结束,cubic-bezier(0.42, 0.0, 0.58, 1.0)。
  • friction:阻尼曲线,cubic-bezier(0.2, 0.0, 0.2, 1.0)。
  • extreme-deceleration:急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。
  • sharp:锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。
  • rhythm:节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。
  • smooth:平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。
  • cubic-bezier:在三次贝塞尔函数中定义动画变化过程,入参的x和y值必须处于0-1之间。
  • steps: 阶梯曲线6+。语法:steps(number[, end|start]);number必须设置,支持的类型为正整数。第二个参数可选,表示在每个间隔的起点或是终点发生阶跃变化,支持设置end或start,默认值为end。
+

animation-direction6+

+

string

+

normal

+

指定动画的播放模式:

+
  • normal: 动画正向循环播放。
  • reverse: 动画反向循环播放。
  • alternate:动画交替循环播放,奇数次正向播放,偶数次反向播放。
  • alternate-reverse:动画反向交替循环播放,奇数次反向播放,偶数次正向播放。
+

animation-fill-mode

+

string

+

none

+

指定动画开始和结束的状态:

+
  • none:在动画执行之前和之后都不会应用任何样式到目标上。
  • forwards:在动画结束后,目标将保留动画结束时的状态(在最后一个关键帧中定义)。
  • backwards6+:动画将在animation-delay期间应用第一个关键帧中定义的值。当animation-direction为"normal"或"alternate"时应用from关键帧中的值,当animation-direction为"reverse"或"alternate-reverse"时应用to关键帧中的值。
  • both6+:动画将遵循forwards和backwards的规则,从而在两个方向上扩展动画属性。
+

animation-play-state6+

+

string

+

running

+

指定动画的当前状态:

+
  • paused:动画状态为暂停。
  • running:动画状态为播放。
+

transition6+

+

string

+

all 0 ease 0

+

指定组件状态切换时的过渡效果,可以通过transition属性设置如下四个属性:

+
  • transition-property:规定设置过渡效果的 CSS 属性的名称,目前支持宽、高、背景色。
  • transition-duration:规定完成过渡效果需要的时间,单位秒。
  • transition-timing-function:规定过渡效果的时间曲线,支持样式动画提供的曲线。
  • transition-delay:规定过渡效果延时启动时间,单位秒。
+
+ +**表 1** transform操作说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

none6+

+

-

+

不进行任何转换。

+

matrix6+

+

<number>

+

入参为六个值的矩阵,6个值分别代表:scaleX, skewY, skewX, scaleY, translateX, translateY。

+

matrix3d6+

+

<number>

+

入参为十六个值的4X4矩阵。

+

translate

+

<length>| <percent>

+

平移动画属性,支持设置x轴和y轴两个维度的平移参数。

+

translate3d6+

+

<length>| <percent>

+

三个入参,分别代表X轴、Y轴、Z轴的平移距离。

+

translateX

+

<length>| <percent>

+

X轴方向平移动画属性。

+

translateY

+

<length>| <percent>

+

Y轴方向平移动画属性。

+

translateZ6+

+

<length>| <percent>

+

Z轴的平移距离。

+

scale

+

<number>

+

缩放动画属性,支持设置x轴和y轴两个维度的缩放参数。

+

scale3d6+

+

<number>

+

三个入参,分别代表X轴、Y轴、Z轴的缩放参数。

+

scaleX

+

<number>

+

X轴方向缩放动画属性。

+

scaleY

+

<number>

+

Y轴方向缩放动画属性。

+

scaleZ6+

+

<number>

+

Z轴的缩放参数。

+

rotate

+

<deg> | <rad> | <grad>6+ | <turn>6+

+

旋转动画属性,支持设置x轴和y轴两个维度的选中参数。

+

rotate3d6+

+

<deg> | <rad> | <grad> | <turn>

+

四个入参,前三个分别为X轴、Y轴、Z轴的旋转向量,第四个是旋转角度。

+

rotateX

+

<deg> | <rad> | <grad>6+ | <turn>6+

+

X轴方向旋转动画属性。

+

rotateY

+

<deg> | <rad> | <grad>6+ | <turn>6+

+

Y轴方向旋转动画属性。

+

rotateZ6+

+

<deg> | <rad> | <grad> | <turn>

+

Z轴方向的旋转角度。

+

skew6+

+

<deg> | <rad> | <grad> | <turn>

+

两个入参,分别为X轴和Y轴的2D倾斜角度。

+

skewX6+

+

<deg> | <rad> | <grad> | <turn>

+

X轴的2D倾斜角度。

+

skewY6+

+

<deg> | <rad> | <grad> | <turn>

+

Y轴的2D倾斜角度。

+

perspective6+

+

<number>

+

3D透视场景下镜头距离元素表面的距离。

+
+ +**表 2** @keyframes属性说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

描述

+

background-color

+

<color>

+

-

+

动画执行后应用到组件上的背景颜色。

+

opacity

+

number

+

1

+

动画执行后应用到组件上的不透明度值,为介于0到1间的数值,默认为1。

+

width

+

<length>

+

-

+

动画执行后应用到组件上的宽度值。

+

height

+

<length>

+

-

+

动画执行后应用到组件上的高度值。

+

transform

+

string

+

-

+

定义应用在组件上的变换类型,见表1

+

background-position6+

+

string | <percentage> | <length> string | <percentage> | <length>

+

50% 50%

+

背景图位置。单位支持百分比和px,第一个值是水平位置,第二个值是垂直位置。如果仅设置一个值,另一个值为50%。第一个string的可选值为:left | center | right ,第二个string的可选值为:top | center | bottom。

+

示例:

+
  • background-position: 200px 30%
  • background-position: 100px top
  • background-position: center center
+
+ +对于不支持起始值或终止值缺省的情况,可以通过from和to显示指定起始和结束。可以通过百分比指定动画运行的中间状态6+。示例: + +``` +
+
+
+
+``` + +``` +.container { + display: flex; + justify-content: center; + align-items: center; +} +.rect{ + width: 200px; + height: 200px; + background-color: #f76160; + animation: Go 3s infinite; +} +@keyframes Go +{ + from { + background-color: #f76160; + transform:translate(100px) rotate(0deg) scale(1.0); + } + /* 可以通过百分比指定动画运行的中间状态6+ */ + 50% { + background-color: #f76160; + transform:translate(100px) rotate(60deg) scale(1.3); + } + to { + background-color: #09ba07; + transform:translate(100px) rotate(180deg) scale(2.0); + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324797.gif) + +``` + +
+
+ animation-play-state: {{playState}} +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; +} +.simpleSize { + background-color: blue; + width: 100px; + height: 100px; +} +.simpleAnimation { + animation: simpleFrames 9s; +} +@keyframes simpleFrames { + from { transform: translateX(0px); } + to { transform: translateX(100px); } +} +``` + +``` +// xxx.js +export default { + data: { + title: "", + playState: "running" + }, + toggleState() { + if (this.playState === "running") { + this.playState = "paused"; + } else { + this.playState = "running"; + } + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285034.gif) + +``` + +
+``` + +``` +/* xxx.css */ +.img { + width: 294px; + height: 233px; + background-image: url('common/heartBeat.jpg'); + background-repeat: no-repeat; + background-position: 0% 0%; + background-size: 900%; + animation-name: heartBeating; + animation-duration: 1s; + animation-delay: 0s; + animation-fill-mode: forwards; + animation-iteration-count: -1; + animation-timing-function: steps(8, end); +} + +@keyframes heartBeating { + from { background-position: 0% 0%;} + to { background-position: 100% 0%;} +} +``` + +``` + +
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; +} +.content { /* 组件状态1 */ + height: 200px; + width: 200px; + background-color: red; + transition: all 5s ease 0s; +} +.content:active { /* 组件状态2 */ + height: 400px; + width: 400px; + background-color: blue; + transition: all 5s linear 0s; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152833768.gif) + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>@keyframes的from/to不支持动态绑定。 +>steps函数的end和start含义如下图所示。 +>![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125220.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/06.\346\270\220\345\217\230\346\240\267\345\274\217.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/06.\346\270\220\345\217\230\346\240\267\345\274\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..1d460c7c01f42e9a8775e1ce626695b151d7884b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/06.\346\270\220\345\217\230\346\240\267\345\274\217.md" @@ -0,0 +1,129 @@ +--- +title: 渐变样式 +permalink: /pages/000b0100010005 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 渐变样式 + +组件普遍支持的在style或css中设置的 可以平稳过渡两个或多个指定的颜色。 + +开发框架支持线性渐变 \(linear-gradient\)和重复线性渐变 \(repeating-linear-gradient\)两种渐变效果。 + +## 线性渐变/重复线性渐变 + +使用渐变样式,需要定义过渡方向和过渡颜色。 + +1. 过渡方向:通过direction或者angle指定: + + - direction:进行方向渐变。 + - angle:进行角度渐变。 + + ``` + background: linear-gradient(direction/angle, color, color, ...); + background: repeating-linear-gradient(direction/angle, color, color, ...); + ``` + +2. 过渡颜色:支持以下四种方式:\#ff0000、\#ffff0000、rgb\(255, 0, 0\)、rgba\(255, 0, 0, 1\)。需要指定至少两种颜色。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

direction

+

to <side-or-corner> <side-or-corner> = [left | right] || [top | bottom]

+

to bottom (由上到下渐变)

+

+

指定过渡方向,如:to left (从右向左渐变) ;或者

+

to bottom right (从左上角到右下角)。

+

angle

+

<deg>

+

180deg

+

+

指定过渡方向,以元素几何中心为坐标原点,水平方向为X轴,angle指定了渐变线与Y轴的夹角(顺时针方向)。

+

color

+

<color> [<length>|<percentage>]

+

-

+

+

定义使用渐变样式区域内颜色的渐变效果。

+
+ +- 示例 + + ``` + #gradient { + height: 300px; + width: 600px; + } + ``` + + **图 1** 默认渐变方向为从上向下渐变 + ![](/images/application-dev/reference/arkui-js/figures/默认渐变方向为从上向下渐变.png "默认渐变方向为从上向下渐变") + + ``` + /* 从顶部开始向底部由红色向绿色渐变 */ + background: linear-gradient(red, #00ff00); + ``` + + **图 2** 45度夹角渐变 + ![](/images/application-dev/reference/arkui-js/figures/45度夹角渐变.png "45度夹角渐变") + + ``` + /* 45度夹角,从红色渐变到绿色 */ + background: linear-gradient(45deg, rgb(255,0,0),rgb(0, 255, 0)); + ``` + + **图 3** 设置方向为to right为从左向右渐变 + ![](/images/application-dev/reference/arkui-js/figures/设置方向为to-right为从左向右渐变.png "设置方向为to-right为从左向右渐变") + + ``` + /* 从左向右渐变,在距离左边90px和距离左边360px (600*0.6) 之间270px宽度形成渐变 */ + background: linear-gradient(to right, rgb(255,0,0) 90px, rgb(0, 255, 0) 60%); + ``` + + **图 4** 从左向右渐变,重复渐变 + ![](/images/application-dev/reference/arkui-js/figures/从左向右渐变-重复渐变.png "从左向右渐变-重复渐变") + + ``` + /* 从左向右重复渐变,重复渐变区域30px(60-30)透明度0.5 */ + background: repeating-linear-gradient(to right, rgba(255, 255, 0, 1) 30px,rgba(0, 0, 255, .5) 60px); + ``` + + diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/04.\350\275\254\345\234\272\346\240\267\345\274\217.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/07.\350\275\254\345\234\272\346\240\267\345\274\217.md" similarity index 30% rename from "website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/04.\350\275\254\345\234\272\346\240\267\345\274\217.md" rename to "website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/07.\350\275\254\345\234\272\346\240\267\345\274\217.md" index 51e6f55b4d45b4327a76963321168239c3a0f597..dd9b7761c0cf19c5a699a1ccb4ca8b0a7290b323 100644 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/04.\350\275\254\345\234\272\346\240\267\345\274\217.md" +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/07.\350\275\254\345\234\272\346\240\267\345\274\217.md" @@ -1,6 +1,6 @@ --- title: 转场样式 -permalink: /pages/000d010003 +permalink: /pages/000b0100010006 navbar: true sidebar: true prev: true @@ -9,40 +9,32 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:46 +date: 2021-12-30 18:31:37 --- -# 转场样式 +# 转场样式 -- [共享元素转场](#zh-cn_topic_0000001058460505_section1884520391817) -- [共享元素注意事项](#zh-cn_topic_0000001058460505_section91806261439) -- [共享元素示例代码](#zh-cn_topic_0000001058460505_section1568117161452) -- [卡片转场样式](#zh-cn_topic_0000001058460505_section765051220203) -- [示例](#zh-cn_topic_0000001058460505_section814213323271) -- [页面转场样式](#zh-cn_topic_0000001058460505_section0565021620) -- [页面转场注意事项](#zh-cn_topic_0000001058460505_section99079442062) - -## 共享元素转场 +## 共享元素转场 **表 1** 共享元素转场属性 - -

名称

+ + - - - - - - - @@ -50,58 +42,58 @@ date: 2021-12-30 12:57:46 **表 2** 共享元素转场样式 - -

名称

类型

+

类型

默认值

+

默认值

描述

+

描述

shareid

+

shareid

string

+

string

+

进行共享元素转场时使用,若不配置,则转场样式不生效。共享元素转场当前支持的组件:list-item, image, text, button, label。

+

进行共享元素转场时使用,若不配置,则转场样式不生效。共享元素转场当前支持的组件:list-item、image、text、button、label。

名称

+ + - - - - - - - - - - - - - - -

名称

类型

+

类型

默认值

+

默认值

描述

+

描述

shared-transition-effect

+

shared-transition-effect

string

+

string

exchange

+

exchange

配置共享元素转场时的入场样式。

-

当前支持:exchange或static,默认为exchange。

-

转场时,目的页配置的样式优先生效。

-
  • exchange表示源页面元素移动到目的页元素位置,并进行适当缩放。
  • static表示目的页元素位置不变,用户可配置透明度动画。当前仅跳转目标页配置的static效果生效。
+

配置共享元素转场时的入场样式。

+

当前支持:exchange或static,默认为exchange。

+

转场时,目的页配置的样式优先生效。

+
  • exchange表示源页面元素移动到目的页元素位置,并进行适当缩放。
  • static表示目的页元素位置不变,用户可配置透明度动画。当前仅跳转目标页配置的static效果生效。

shared-transition-name

+

shared-transition-name

string

+

string

-

+

-

转场时,目的页配置的样式优先生效。该样式用于配置共享元素的动画效果,一个由@keyframes定义的动画序列,支持transform和透明度动画。若共享元素效果与自定义的动画冲突,以自定义动画为准。

+

转场时,目的页配置的样式优先生效。该样式用于配置共享元素的动画效果,一个由@keyframes定义的动画序列,支持transform和透明度动画。若共享元素效果与自定义的动画冲突,以自定义动画为准。

shared-transition-timing-function

+

shared-transition-timing-function

string

+

string

friction

+

friction

转场时,目的页配置的样式优先生效。该属性定义了共享元素转场时的差值曲线。若不配置,默认使用friction曲线。

+

转场时,目的页配置的样式优先生效。该属性定义了共享元素转场时的差值曲线。若不配置,默认使用friction曲线。

-## 共享元素注意事项 +## 共享元素注意事项 1. 若同时配置了共享元素转场和自定义页面转场样式,页面转场效果以自定义效果为准; 2. 共享元素的exchange效果类似下图: -**图 1** 共享元素转场默认效果 -![](/images/zh-cn/application-dev/js-reference/figures/共享元素转场默认效果.png "共享元素转场默认效果") +**图 1** 共享元素转场默认效果 +![](/images/application-dev/reference/arkui-js/figures/共享元素转场默认效果.png "共享元素转场默认效果") 3. 共享元素动画对元素的边框、背景色不生效。 @@ -109,7 +101,7 @@ date: 2021-12-30 12:57:46 5. 动态修改shareid:组件A的shareid被组件B的shareid覆盖,则组件A的共享元素效果失效,即使组件B的shareid被修改,此时组件A的共享元素效果也不会恢复。5+ -## 共享元素示例代码 +## 共享元素示例代码 PageA跳转到PageB,跳转的共享元素为image, shareid为“shareImage”。 @@ -180,38 +172,36 @@ export default { } ``` -## 卡片转场样式 - -**表 3** 卡片转场样式 +## 卡片转场样式 - -

名称

+ + - - - - - - -

名称

类型

+

类型

默认值

+

默认值

描述

+

描述

transition-effect

+

transition-effect

string

+

string

-

+

-

用于配置当前页面中的某个组件在卡片转场过程中是否进行转场动效,当前支持如下配置:

-
  • unfold:配置这个属性的组件,如在卡片的上方,则向上移动一个卡片的高度,如在卡片的下方,则向下移动一个卡片的高度。
  • none:转场过程中没有动效。
+

用于配置当前页面中的某个组件在卡片转场过程中是否进行转场动效,当前支持如下配置:

+
  • unfold:配置这个属性的组件,如在卡片的上方,则向上移动一个卡片的高度,如在卡片的下方,则向下移动一个卡片的高度。
  • none:转场过程中没有动效。
->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** >卡片转场无法和其他转场\(包括共享元素转场和自定义转场\)共同使用。 -## 示例 +## 示例 source\_page包含顶部内容以及卡片列表,点击卡片可以跳转到target\_page。 @@ -223,8 +213,7 @@ source\_page包含顶部内容以及卡片列表,点击卡片可以跳转到ta MAIN TITLE - + {{$item.title}} @@ -274,9 +263,9 @@ export default {
-
- this is detail -
+
+ this is detail +
``` @@ -295,63 +284,63 @@ export default { } ``` -![](/images/zh-cn/application-dev/js-reference/figures/卡片转场.gif) +![](/images/application-dev/reference/arkui-js/figures/卡片转场.gif) -## 页面转场样式 +## 页面转场样式 -**表 4** 页面转场样式 +**表 3** 页面转场样式 - -

名称

+ + - - - - - - - - - - - - - - - - - - -

名称

类型

+

类型

默认值

+

默认值

描述

+

描述

transition-enter

+

transition-enter

string

+

string

-

+

-

与@keyframes相呼应,支持transform和透明度动画,详见表2

+

与@keyframes配套使用,支持transform和透明度动画,详见表2

transition-exit

+

transition-exit

string

+

string

-

+

-

与@keyframes相呼应,支持transform和透明度动画,详见表2

+

与@keyframes配套使用,支持transform和透明度动画,详见表2

transition-duration

+

transition-duration

string

+

string

跟随设备默认的页面转场时间

+

跟随设备默认的页面转场时间

支持的单位为[s(秒)|ms(毫秒) ],默认单位为ms。

+

支持的单位为[s(秒)|ms(毫秒) ],默认单位为ms。

transition-timing-function

+

transition-timing-function

string

+

string

friction

+

friction

描述转场动画执行的速度曲线,用于使转场更为平滑。详细参数见动画样式中“animation-timing-function”有效值说明。

+

描述转场动画执行的速度曲线,用于使转场更为平滑。详细参数见动画样式中“animation-timing-function”有效值说明。

-## 页面转场注意事项 +## 页面转场注意事项 1. 配置自定义转场时,建议配置页面背景色为不透明颜色,否则在转场过程中可能会出现衔接不自然的现象。 2. transition-enter和transition-exit可单独配置,没有配置时使用系统默认的参数; @@ -359,11 +348,11 @@ export default { 4. transition-enter/transition-exit说明如下: 1. push场景下:进入页面栈的Page2.js应用transition-enter描述的动画配置;进入页面栈第二位置的Page1.js应用transition-exit描述的动画配置; - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058830762.png) + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324847.png) 2. back场景下:退出页面栈的Page2.js应用transition-enter描述的动画配置,并进行倒播;从页面栈第二位置进入栈顶位置的Page1.js应用transition-exit描述的动画配置,并进行倒播。 - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058670863.png) + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125268.png) diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/08.\345\252\222\344\275\223\346\237\245\350\257\242.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/08.\345\252\222\344\275\223\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..701889f2a1fdb30d97f43f3be24004d6e397998b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/08.\345\252\222\344\275\223\346\237\245\350\257\242.md" @@ -0,0 +1,316 @@ +--- +title: 媒体查询 +permalink: /pages/000b0100010007 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 媒体查询 + +媒体查询(Media Query)在移动设备上应用十分广泛,开发者经常需要根据设备的大致类型或者特定的特征和设备参数(例如屏幕分辨率)来修改应用的样式。为此媒体查询提供了如下功能: + +1. 针对设备和应用的属性信息,可以设计出相匹配的布局样式。 +2. 当屏幕发生动态改变时(比如分屏、横竖屏切换),应用页面布局同步更新。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>media属性值默认为设备的真实尺寸大小、物理像素和真实的屏幕分辨率。请勿与以720px为基准的项目配置宽度px混淆。 + +## CSS语法规则 + +使用@media来引入查询语句,具体规则如下: + +``` +@media [media-type] [and|not|only] [(media-feature)] { + CSS-Code; +} +``` + +例子: + +@media screen and \(round-screen: true\) \{ … \} // 当设备屏幕是圆形时条件成立 + +@media \(max-height: 800\) \{ … \} // 范围查询,CSS level 3 写法 + +@media \(height <= 800\) \{ … \} // 范围查询,CSS level 4 写法,与CSS level3写法等价 + +@media screen and \(device-type: tv\) or \(resolution < 2\) \{ … \} // 同时包含媒体类型和多个媒体特征的多条件复杂语句查询 + +## 页面中引用资源 + +通过@import方式引入媒体查询,具体使用方法如下: + +``` +@import url [media-type] [and|not|only] [(media-feature)]; +``` + +例如: + +``` +@import '../common/style.css' screen and (min-width: 600) and (max-width: 1200); +``` + +## 媒体类型 + + + + + + + + + + +

类型

+

说明

+

screen

+

按屏幕相关参数进行媒体查询。

+
+ +## 媒体逻辑操作 + +媒体逻辑操作符:and、or、not、only用于构成复杂媒体查询,也可以通过comma(,)将其组合起来,详细解释说明如下表。 + +**表 1** 媒体逻辑操作符 + + + + + + + + + + + + + + + + + + + + + + +

类型

+

说明

+

and

+

将多个媒体特征(Media Feature)以“与”的方式连接成一个媒体查询,只有当所有媒体特征都为true,查询条件成立。另外,它还可以将媒体类型和媒体功能结合起来。

+

例如:screen and (device-type: wearable) and (max-height: 600) 表示当设备类型是智能穿戴同时应用的最大高度小于等于600个像素单位时成立。

+

not

+

取反媒体查询结果,媒体查询结果不成立时返回true,否则返回false。在媒体查询列表中应用not,则not仅取反应用它的媒体查询。

+

例如:not screen and (min-height: 50) and (max-height: 600) 表示当应用高度小于50个像素单位或者大于600个像素单位时成立。

+
说明:

使用not运算符时必须指定媒体类型。

+
+

only

+

当整个表达式都匹配时,才会应用选择的样式,可以应用在防止某些较早的版本的浏览器上产生歧义的场景。一些较早版本的浏览器对于同时包含了媒体类型和媒体特征的语句会产生歧义,比如:

+

screen and (min-height: 50)

+

老版本浏览器会将这句话理解成screen,从而导致仅仅匹配到媒体类型(screen),就应用了指定样式,使用only可以很好地规避这种情况。

+
说明:

使用only时必须指定媒体类型。

+
+

,(comma)

+

将多个媒体特征以“或”的方式连接成一个媒体查询,如果存在结果为true的媒体特征,则查询条件成立。其效果等同于or运算符。

+

例如:screen and (min-height: 1000), (round-screen:true) 表示当应用高度大于等于1000个像素单位或者设备屏幕是圆形时,条件成立。

+

or

+

将多个媒体特征以“或”的方式连接成一个媒体查询,如果存在结果为true的媒体特征,则查询条件成立。

+

例如:screen and (max-height: 1000) or (round-screen:true)表示当应用高度小于等于1000个像素单位或者设备屏幕是圆形时,条件成立。

+
+ +在MediaQuery Level 4中引入了范围查询,使其能够使用max-,min-的同时,也支持了<=,\>=,<,\>操作符。 + +**表 2** 媒体逻辑范围操作符 + + + + + + + + + + + + + + + + + + + +

类型

+

说明

+

<=

+

小于等于,例如:screen and (50 <= height)。

+

>=

+

大于等于,例如:screen and (600 >= height)。

+

<

+

小于,例如:screen and (50 < height)。

+

>

+

大于,例如:screen and (600 > height)。

+
+ +## 媒体特征 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

类型

+

说明

+

height

+

应用页面显示区域的高度。

+

min-height

+

应用页面显示区域的最小高度。

+

max-height

+

应用页面显示区域的最大高度。

+

width

+

应用页面显示区域的宽度。

+

min-width

+

应用页面显示区域的最小宽度。

+

max-width

+

应用页面显示区域的最大宽度。

+

resolution

+

设备的分辨率,支持dpi,dppx和dpcm单位。其中:

+
  • dpi表示每英寸中物理像素个数,1dpi≈0.39dpcm;
  • dpcm表示每厘米上的物理像素个数,1dpcm ≈ 2.54dpi;
  • dppx表示每个px中的物理像素数(此单位按96px=1英寸为基准,与页面中的px单位计算方式不同),1dppx = 96dpi。
+

min-resolution

+

设备的最小分辨率。

+

max-resolution

+

设备的最大分辨率。

+

orientation

+

屏幕的方向。

+

可选值:

+
  • orientation: portrait(设备竖屏)
  • orientation: landscape(设备横屏)
+

aspect-ratio

+

应用页面显示区域的宽度与高度的比值。

+

例如:aspect-ratio:1/2

+

min-aspect-ratio

+

应用页面显示区域的宽度与高度的最小比值。

+

max-aspect-ratio

+

应用页面显示区域的宽度与高度的最大比值。

+

device-height

+

设备的高度。

+

min-device-height

+

设备的最小高度。

+

max-device-height

+

设备的最大高度。

+

device-width

+

设备的宽度。

+

min-device-width

+

设备的最小宽度。

+

max-device-width

+

设备的最大宽度。

+

round-screen

+

屏幕类型,圆形屏幕为true, 非圆形屏幕为 false。

+

dark-mode6+

+

系统为深色模式时为true,否则为false。

+
+ +## 示例代码 + +- 通用媒体特征示例代码: + +``` + +
+
+ Hello World +
+
+``` + +``` +/* xxx.css */ +.container { + width: 300px; + height: 600px; + background-color: #008000; +} +@media (device-type: tv) { + .container { + width: 500px; + height: 500px; + background-color: #fa8072; + } +} +@media (device-type: wearable) { + .container { + width: 300px; + height: 300px; + background-color: #008b8b; + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/05.\350\207\252\345\256\232\344\271\211\345\255\227\344\275\223\346\240\267\345\274\217.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/09.\350\207\252\345\256\232\344\271\211\345\255\227\344\275\223\346\240\267\345\274\217.md" similarity index 65% rename from "website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/05.\350\207\252\345\256\232\344\271\211\345\255\227\344\275\223\346\240\267\345\274\217.md" rename to "website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/09.\350\207\252\345\256\232\344\271\211\345\255\227\344\275\223\346\240\267\345\274\217.md" index ccaf0a5aa1f0260fe8153581b23b46fa8f825cdb..8e8d00dfda1fc4076534473d4c4543e61a903f99 100644 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/05.\350\207\252\345\256\232\344\271\211\345\255\227\344\275\223\346\240\267\345\274\217.md" +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/09.\350\207\252\345\256\232\344\271\211\345\255\227\344\275\223\346\240\267\345\274\217.md" @@ -1,6 +1,6 @@ --- title: 自定义字体样式 -permalink: /pages/000d010004 +permalink: /pages/000b0100010008 navbar: true sidebar: true prev: true @@ -9,21 +9,18 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:46 +date: 2021-12-30 18:31:37 --- -# 自定义字体样式 - -- [定义font-face](#zh-cn_topic_0000001059340506_section185107316712) -- [使用font-face](#zh-cn_topic_0000001059340506_section713052011710) +# 自定义字体样式 font-face用于定义字体样式。应用可以在style中定义font-face来指定相应的字体名和字体资源,然后在font-family样式中引用该字体。 自定义字体可以是从项目中的字体文件中加载的字体。 ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** >字体格式支持ttf和otf。 -## 定义font-face +## 定义font-face ``` @font-face { @@ -40,11 +37,11 @@ font-face用于定义字体样式。应用可以在style中定义font-face来指 自定义字体的来源,支持如下类别: -- 项目中的字体文件:通过url指定项目中的字体文件路径\(只支持绝对路径,详见[资源和文件访问规则](/pages/000d0000#zh-cn_topic_0000001058830797_section6620355202117)章节\)。 +- 项目中的字体文件:通过url指定项目中的字体文件路径\(只支持绝对路径,详见[资源和文件访问规则](/pages/000b01000000#section6620355202117)章节\)。 - 不支持设置多个src。 -## 使用font-face +## 使用font-face 可以在style中定义font-face,然后在font-family样式中指定该font-face的名称,从而应用font-face定义的字体。 diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/10.\345\216\237\345\255\220\345\270\203\345\261\200.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/10.\345\216\237\345\255\220\345\270\203\345\261\200.md" new file mode 100644 index 0000000000000000000000000000000000000000..3ddc3fedc9886421d1ea574c78873d1116589b45 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/10.\345\216\237\345\255\220\345\270\203\345\261\200.md" @@ -0,0 +1,103 @@ +--- +title: 原子布局 +permalink: /pages/000b0100010009 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# 原子布局 + +在屏幕形态和规格不同等情况下,布局效果需要实现自适应,因此系统提供了面向不同屏幕尺寸界面自适应适配的布局能力,称为原子布局。设计师可以考虑使用原子能力,定义元素在不同形态的尺寸界面上体现的自适应规则。开发者可以使用原子布局能力,快速实现让应用在多形态屏幕上有与设计效果相匹配的自适应效果。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 5 开始支持。 + +## 隐藏能力 + +在非折行flex布局基础上,增加了显示优先级标记,可以调整组件内元素水平/垂直方向的显示优先级,根据当前组件容器的可用空间来显示内容。 + + + + + + + + + + + + + + +

样式

+

类型

+

默认值

+

说明

+

display-index

+

number

+

0

+

适用于div等支持flex布局的容器组件中的子组件上,当容器组件在flex主轴上尺寸不足以显示全部内容时,按照display-index值从小到大的顺序进行隐藏,具有相同display-index值的组件同时隐藏,默认值为0,表示隐藏。

+
+ +## 占比能力 + +在非折行的flex布局中,定义了占比能力的组件,保证指定元素始终在容器的某一个比例空间中进行布局。 + + + + + + + + + + + + + + +

样式

+

类型

+

默认值

+

说明

+

flex-weight

+

number

+

-

+

指明当前元素在flex主轴方向上尺寸权值,当且仅当容器组件中所有节点均设置此属性时生效,当前元素尺寸为: 容器主轴尺寸 * 当前权值 / 所有子元素权值和。

+
+ +## 固定比例 + +定义了组件固定比例调整尺寸的能力。 + + + + + + + + + + + + + + +

样式

+

类型

+

默认值

+

说明

+

aspect-ratio

+

number

+

-

+

1. 接受任意大于0的浮点值,定义为该节点的宽度与高度比,设置该属性后,该元素尺寸宽高比按照此属性值进行调整。

+

2. 遵守最大值与最小值的限制。

+

3. 在flex布局中,主轴尺寸先进行调整,后根据该尺寸调整交叉轴。

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/01.badge.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/01.badge.md" new file mode 100644 index 0000000000000000000000000000000000000000..95c9d4196c394076264687f91de8f8235448b66a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/01.badge.md" @@ -0,0 +1,251 @@ +--- +title: badge +permalink: /pages/000b0100010100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# badge + +应用中如果有需用户关注的新事件提醒,可以采用新事件标记来标识。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 5 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持单个子组件。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>仅支持单子组件节点,如果使用多子组件节点,默认使用第一个子组件节点。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

placement

+

string

+

rightTop

+

+

事件提醒的数字标记或者圆点标记的位置,可选值为:

+
  • right:位于组件右边框。
  • rightTop:位于组件边框右上角。
  • left:位于组件左边框。
+

count

+

number

+

0

+

+

设置提醒的消息数,默认为0。当设置相应的提醒消息数大于0时,消息提醒会变成数字标记类型,未设置消息数或者消息数不大于0时,消息提醒将采用圆点标记。

+
说明:

当数字设置为大于maxcount时,将使用maxcount显示。

+

count属性最大支持整数值为2147483647。

+
+

visible

+

boolean

+

false

+

+

是否显示消息提醒,当收到新信息提醒时可以设置该属性为true,显示相应的消息提醒,如果需要使用数字标记类型,同时需要设置相应的count属性。

+

maxcount

+

number

+

99

+

+

最大消息数限制,当收到新信息提醒大于该限制时,标识数字会进行省略,仅显示maxcount+。

+
说明:

maxcount属性最大支持整数值为2147483647。

+
+

config

+

BadgeConfig

+

-

+

+

设置新事件标记相关配置属性。

+

label6+

+

string

+

-

+

+

设置新事件提醒的文本值。

+
说明:

使用该属性时,count和maxcount属性不生效。

+
+
+ +**表 1** BadgeConfig + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

badgeColor

+

<color>

+

#fa2a2d

+

+

新事件标记背景色。

+

textColor

+

<color>

+

#ffffff

+

+

数字标记的数字文本颜色。

+

textSize

+

<length>

+

10px

+

+

数字标记的数字文本大小。

+

badgeSize

+

<length>

+

6px

+

+

圆点标记的默认大小

+
+ +## 样式 + +支持[通用样式](/pages/000b0100010001)。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>badge组件的子组件大小不能超过badge组件本身的大小,否则子组件不会绘制。 + +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + example + + + example + +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + width: 100%; + align-items: center; +} +.badge { + width: 50%; + margin-top: 100px; +} +.text1 { + background-color: #f9a01e; + font-size: 50px; +} +.text2 { + background-color: #46b1e3; + font-size: 50px; +} +``` + +``` +// xxx.js +export default { + data:{ + badgeconfig:{ + badgeColor:"#0a59f7", + textColor:"#ffffff", + } + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/捕获.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/02.dialog.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/02.dialog.md" new file mode 100644 index 0000000000000000000000000000000000000000..2f0721ee394e566bfc92e5ce5dec5baf49b9d9fc --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/02.dialog.md" @@ -0,0 +1,238 @@ +--- +title: dialog +permalink: /pages/000b0100010101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# dialog + +自定义弹窗容器。 + +## 权限列表 + +无 + +## 子组件 + +支持单个子组件。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

dragable7+

+

boolean

+

false

+

+

设置对话框是否支持拖拽。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 弹窗类组件不支持focusable、click-effect属性。 + +## 样式 + +仅支持[通用样式](/pages/000b0100010001)中的width、height、margin、margin-\[left|top|right|bottom\]、margin-\[start|end\]样式。 + +## 事件 + +不支持[通用事件](/pages/000b0100010002),仅支持如下事件: + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

cancel

+

-

+

用户点击非dialog区域触发取消弹窗时触发的事件。

+

show7+

+

-

+

对话框弹出时触发该事件。

+

close7+

+

-

+

对话框关闭时触发该事件。

+
+ +## 方法 + +不支持[通用方法](/pages/000b0100010003),仅支持如下方法。 + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

show

+

-

+

弹出对话框。

+

close

+

-

+

关闭对话框。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>dialog属性、样式均不支持动态更新。 + +## 示例 + +``` + +
+
+ +
+ +
+
+ Simple dialog +
+
+ + +
+
+
+
+``` + +``` +/* xxx.css */ +.doc-page { + flex-direction: column; + justify-content: center; + align-items: center; +} +.btn-div { + width: 100%; + height: 200px; + flex-direction: column; + align-items: center; + justify-content: center; +} +.btn { + background-color: #F2F2F2; + text-color: #0D81F2; +} +.txt { + color: #000000; + font-weight: bold; + font-size: 39px; +} +.dialog-main { + width: 500px; +} +.dialog-div { + flex-direction: column; + align-items: center; +} +.inner-txt { + width: 400px; + height: 160px; + flex-direction: column; + align-items: center; + justify-content: space-around; +} +.inner-btn { + width: 400px; + height: 120px; + justify-content: space-around; + align-items: center; +} +.btn-txt { + background-color: #F2F2F2; + text-color: #0D81F2; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt'; +export default { + showDialog(e) { + this.$element('simpledialog').show() + }, + cancelDialog(e) { + prompt.showToast({ + message: 'Dialog cancelled' + }) + }, + cancelSchedule(e) { + this.$element('simpledialog').close() + prompt.showToast({ + message: 'Successfully cancelled' + }) + }, + setSchedule(e) { + this.$element('simpledialog').close() + prompt.showToast({ + message: 'Successfully confirmed' + }) + }, + doubleclick(e){ + prompt.showToast({ + message: 'doubleclick' + }) + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/4.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/03.div.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/03.div.md" new file mode 100644 index 0000000000000000000000000000000000000000..69a1a1477947ab0d96bb704a24d41cf3159fba2a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/03.div.md" @@ -0,0 +1,718 @@ +--- +title: div +permalink: /pages/000b0100010102 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# div + +基础容器,用作页面结构的根节点或将内容进行分组。 + +## 权限列表 + +无 + +## 子组件 + +支持。 + +## 属性 + +支持[通用属性](/pages/000b0100010000)。 + +## 样式 + +除支持[组件通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

flex-direction

+

string

+

row

+

+

flex容器主轴方向。可选项有:

+
  • column:垂直方向从上到下。
  • row:水平方向从左到右。
+

flex-wrap

+

string

+

nowrap

+

+

flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:

+
  • nowrap:不换行,单行显示。
  • wrap:换行,多行显示。
+

justify-content

+

string

+

flex-start

+

+

flex容器当前行的主轴对齐格式。可选项有:

+
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
  • space-evenly5+: 均匀排列每个元素,每个元素之间的间隔相等。
+

align-items

+

string

+

stretch

+

+

flex容器当前行的交叉轴对齐格式,可选值为:

+
  • stretch:弹性元素在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
+

align-content

+

string

+

flex-start

+

+

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

+
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
+

display

+

string

+

flex

+

+

确定该元素视图框的类型,该值暂不支持动态修改。可选值为:

+
  • flex:弹性布局
  • grid:网格布局
  • none:不渲染此元素
+

grid-template-[columns|rows]

+

string

+

1行1列

+

+

用于设置当前网格布局行和列的数量,不设置时默认1行1列,仅当display为grid时生效。

+

示例:如设置grid-template-columns为:

+
  • 50px 100px 60px:分三列,第一列50px,第二列100px,第三列60px;
  • 1fr 1fr 2fr:分三列,将父组件允许的宽分为4等份,第一列占1份,第二列占一份,第三列占2份;
  • 30% 20% 50%:分三列,将父组件允许的宽为基准,第一列占30%,第二列占20%,第三列占50%;
  • repeat(2,100px):分两列,第一列100px,第二列100px;
  • repeat(auto-fill,100px)5+:按照每列100px的大小和交叉轴大小计算最大正整数重复次数,按照该重复次数布满交叉轴;
  • auto 1fr 1fr:分三列,第一列自适应内部子组件所需宽度,剩余空间分为两等份,第二列占一份,第三列占一份。
+

grid-[columns|rows]-gap

+

<length>

+

0

+

+

用于设置行与行的间距或者列与列的间距,也可以支持通过grid-gap设置相同的行列间距,仅当display为grid时生效。

+

grid-row-[start|end]

+

number

+

-

+

+

用于设置当前元素在网格布局中的起止行号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

+

grid-column-[start|end]

+

number

+

-

+

+

用于设置当前元素在网格布局中的起止列号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

+

grid-auto-flow5+

+

string

+

-

+

+

使用框架自动布局算法进行网格的布局,可选值为:

+
  • row:逐行填充元素,如果行空间不够,则新增行;
  • column:逐列填充元素,如果列空间不够,则新增列。
+

overflow6+

+

string

+

visible

+

+

设置元素内容区超过元素本身大小时的表现形式。

+
  • visible:多个子元素内容超过元素大小时,显示在元素外面;
  • hidden:元素内容超过元素大小时,进行裁切显示;
  • scroll:元素内容超过元素大小时,进行滚动显示并展示滚动条(当前只支持纵向)。
+
说明:
  • overflow: scroll样式需要元素设置固定的大小。
+
+

align-items6+

+

string

+

-

+

+

设置容器中元素交叉轴上的对齐方式:

+
  • stretch:Flex容器内容在交叉轴方向被拉伸到与容器相同的高度或宽度;
  • flex-start:Flex布局容器内元素向交叉轴起点对齐;
  • flex-end:Flex布局容器内元素向交叉轴终点对齐;
  • center:Flex布局容器内元素在交叉轴居中对齐;
  • baseline:如Flex布局纵向排列,则该值与'flex-start'等效。横向布局时,内容元素存在文本时按照文本基线对齐,否则底部对齐。
+

scrollbar-color6+

+

<color>

+

-

+

+

设置滚动条的颜色。

+

scrollbar-width6+

+

<length>

+

-

+

+

设置滚动条的宽度。

+

overscroll-effect6+

+

string

+

-

+

+

设置滚动边缘效果,可选值为:

+
  • spring:弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹;
  • fade:渐隐物理动效,滑动到边缘后展示一个波浪形的渐隐,根据速度和滑动距离的变化渐隐也会发送一定的变化;
  • none:滑动到边缘后无效果
+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

reachstart6+

+

-

+

当页面滑动到最开始的点时触发的事件回调,当flex-direction: row时才会触发。

+

reachend6+

+

-

+

当页面滑动到最末尾的点时触发的事件回调,当flex-direction: row时才会触发。

+

reachtop6+

+

-

+

当页面滑动到最上部的点时触发的事件回调,当flex-direction: column时才会触发。

+

reachbottom6+

+

-

+

当页面滑动到最下部的点时触发的事件回调,当flex-direction: column时才会触发。

+
+ +## 方法 + +除支持[通用方法](/pages/000b0100010003)外,还支持如下方法: + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

返回值

+

描述

+

getScrollOffset6+

+

-

+

ScrollOffset

+

获取元素内容的滚动偏移。

+
说明:
  • 需要设置overflow样式为scroll。
+
+

scrollBy6+

+

ScrollParam

+

-

+

指定元素内容的滚动偏移。

+
说明:
  • 需要设置overflow样式为scroll。
+
+
+ +**表 1** ScrollOffset6+ + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

x

+

number

+

在x轴方向的偏移,单位为px。

+

y

+

number

+

在y轴方向的偏移,单位为px。

+
+ +**表 2** ScrollParam6+ + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

dx

+

number

+

水平方向滑动的偏移量,单位px。

+

dy

+

number

+

垂直方向滑动的偏移量,单位px。

+

smooth

+

boolean

+

是否平滑处理。

+
+ +## 示例 + +1. Flex样式 + + ``` + +
+
+
+
+
+
+
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 454px; + height: 454px; + } + .flex-box { + justify-content: space-around; + align-items: center; + width: 400px; + height: 140px; + background-color: #ffffff; + } + .flex-item { + width: 120px; + height: 120px; + border-radius: 16px; + } + .color-primary { + background-color: #007dff; + } + .color-warning { + background-color: #ff7500; + } + .color-success { + background-color: #41ba41; + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285076.png) + +2. Flex Wrap样式 + + ``` + +
+
+
+
+
+
+
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 454px; + height: 454px; + } + .flex-box { + justify-content: space-around; + align-items: center; + flex-wrap: wrap; + width: 300px; + height: 250px; + background-color: #ffffff; + } + .flex-item { + width: 120px; + height: 120px; + border-radius: 16px; + } + .color-primary { + background-color: #007dff; + } + .color-warning { + background-color: #ff7500; + } + .color-success { + background-color: #41ba41; + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/22.png) + +3. Grid样式 + + ``` + +
+
+
+
+
+
+ ``` + + ``` + /* xxx.css */ + .common { + width: 400px; + height: 400px; + background-color: #ffffff; + align-items: center; + justify-content: center; + margin: 24px; + } + .grid-parent { + display: grid; + grid-template-columns: 35% 35%; + grid-columns-gap: 24px; + grid-rows-gap: 24px; + grid-template-rows: 35% 35%; + } + .grid-child { + width: 100%; + height: 100%; + border-radius: 8px; + } + .grid-left-top { + grid-row-start: 0; + grid-column-start: 0; + grid-row-end: 0; + grid-column-end: 0; + background-color: #3f56ea; + } + .grid-left-bottom { + grid-row-start: 1; + grid-column-start: 0; + grid-row-end: 1; + grid-column-end: 0; + background-color: #00aaee; + } + .grid-right-top { + grid-row-start: 0; + grid-column-start: 1; + grid-row-end: 0; + grid-column-end: 1; + background-color: #00bfc9; + } + .grid-right-bottom { + grid-row-start: 1; + grid-column-start: 1; + grid-row-end: 1; + grid-column-end: 1; + background-color: #47cc47; + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/11.png) + +4. 拖拽7+ + + ``` + +
+
+
+
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + } + .content{ + width: 200px; + height: 200px; + background-color: red; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt'; + export default { + data:{ + left:0, + top:0, + }, + dragstart(e){ + prompt.showToast({ + message: 'Start to be dragged' + }) + }, + drag(e){ + this.left = e.dragevent.globalX; + this.top = e.dragevent.globalY; + }, + dragend(e){ + prompt.showToast({ + message: 'End Drag' + }) + }, + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/9.gif) + + ``` + +
+
+
+
+
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + width: 100%; + position: relative; + max-width: 100%; + } + .content{ + width: 200px; + height: 200px; + background-color: red; + position: absolute; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt'; + export default { + data:{ + left:0, + top:0, + }, + drag(e){ + this.left = e.dragevent.globalX; + this.top = e.dragevent.globalY; + }, + dragenter(e){ + prompt.showToast({ + message: 'enter' + }) + }, + dragover(e){ + prompt.showToast({ + message: 'over' + }) + }, + dragleave(e){ + prompt.showToast({ + message: 'leave' + }) + }, + drop(e){ + prompt.showToast({ + message: 'drop' + }) + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/6.gif) + +5. 手指捏合7+ + + ``` + +
+
+
+
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 454px; + height: 454px;} + .content{ + width: 400px; + height: 400px; + background-color: aqua; + margin:30px + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt'; + export default { + pinchstart(e){ + prompt.showToast({ + message: 'pinchstart!!!' + }) + }, + pinchupdate(e){ + prompt.showToast({ + message: 'Two-finger pinch update' + }) + }, + pinchend(e){ + prompt.showToast({ + message: 'Finished with two fingers pinching' + }) + }, + pinchcancel(e){ + prompt.showToast({ + message: 'Finger pinching is interrupted' + }) + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/5.gif) + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/04.form.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/04.form.md" new file mode 100644 index 0000000000000000000000000000000000000000..075eddc699d58f6e27d5b202aab8e3624b23079c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/04.form.md" @@ -0,0 +1,120 @@ +--- +title: form +permalink: /pages/000b0100010103 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# form + +表单容器,支持容器内input元素的内容提交和重置。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从 API Version 6 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持。 + +## 属性 + +支持[通用属性](/pages/000b0100010000)。 + +## 样式 + +支持[组件通用样式](/pages/000b0100010001)。 + +## 事件 + +处支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

submit

+

FormResult

+

点击提交按钮,进行表单提交时,触发该事件。

+

reset

+

-

+

点击重置按钮后,触发该事件。

+
+ +**表 1** FormResult + + + + + + + + + + + + +

名称

+

类型

+

描述

+

value

+

Object

+

input元素的name和value的值。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + + + + 输入文本 + + Submit + Reset +
+``` + +``` +// xxx.js +export default{ + onSubmit(result) { + console.log(result.value.radioGroup) // radio1 or radio2 + console.log(result.value.user) // text input value + }, + onReset() { + console.log('reset all value') + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/05.list.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/05.list.md" new file mode 100644 index 0000000000000000000000000000000000000000..07cbad318d4e926ce0c8fca71f8365e94b2b962b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/05.list.md" @@ -0,0 +1,729 @@ +--- +title: list +permalink: /pages/000b0100010104 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# list + +列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本。 + +## 权限列表 + +无 + +## 子组件 + +仅支持<[list-item-group](/pages/000b0100010106)\>和<[list-item](/pages/000b0100010105)\>。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

scrollpage

+

boolean

+

false

+

+

设置为true时,将 list 顶部页面中非 list 部分随 list 一起滑出可视区域,当list方向为row时,不支持此属性。

+

cachedcount

+

number

+

0

+

+

长列表延迟加载时list-item最少缓存数量。

+

可视区域外缓存的list-item数量少于该值时,会触发requestitem事件。

+

scrollbar

+

string

+

off

+

+

侧边滑动栏的显示模式(当前只支持纵向):

+
  • off:不显示。
  • auto:按需显示(触摸时显示,2s后消失)。
  • on:常驻显示。
+

scrolleffect

+

string

+

spring

+

+

滑动效果,目前支持如下滑动效果:

+
  • spring:弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹。
  • fade:渐隐物理动效,滑动到边缘后展示一个波浪形的渐隐,根据速度和滑动距离的变化渐隐也会发送一定的变化。
  • no:滑动到边缘后无效果。
+

indexer

+

boolean | Array<string>

+

false

+

+

是否展示侧边栏快速字母索引栏。设置为true或者自定义索引时,索引栏会显示在列表右边界处。示例:

+

"indexer" : "true"表示使用默认字母索引表。

+

"indexer" : "false"表示无索引。

+

"indexer" : ['#',‘1’,'2',‘3’,'4',‘5’,'6',‘7’,'8']表示自定义索引表。自定义时"#"必须要存在。

+
说明:
  • indexer属性生效需要flex-direction属性配合设置为column,且columns属性设置为1。
  • 点击索引条进行列表项索引需要list-item子组件配合设置相应的section属性
+
+

indexercircle5+

+

boolean

+

-

+

+

是否为环形索引。

+

穿戴设备默认为true,其他为false。indexer为false时不生效。

+

indexermulti5+

+

boolean

+

false

+

+

是否开启索引条多语言功能。

+

indexer为false时不生效。

+

indexerbubble5+

+

boolean

+

true

+

+

是否开启索引切换的气泡提示。

+

indexer为false时不生效。

+

divider5+

+

boolean

+

false

+

+

item是否自带分隔线。

+

其样式参考样式列表的divider-color、divider-height、divider-length、divider-origin。

+

shapemode

+

string

+

default

+

+

侧边滑动栏的形状类型。

+
  • default:不指定,跟随主题;
  • rect:矩形;
  • round:圆形。
+

itemscale

+

boolean

+

true

+

+

焦点处理时,可以通过这个属性取消焦点进出的放大缩小效果。该效果仅在智能穿戴和智慧屏上生效。

+
说明:

仅在columns样式为1的时候生效。

+
+

itemcenter

+

boolean

+

false

+

+

初始化页面和滑动后页面总是有一个item处于视口交叉轴的中心位置。该效果仅在智能穿戴上生效。

+

updateeffect

+

boolean

+

false

+

+

用于设置当list内部的item发生删除或新增时是否支持动效。

+
  • false:新增删除item时无过渡动效。
  • true:新增删除item时播放过程动效。
+

chainanimation5+

+

boolean

+

false

+

+

用于设置当前list是否启用链式联动动效,开启后列表滑动以及顶部和底部拖拽时会有链式联动的效果。链式联动效果:list内的list-item间隔一定距离,在基本的滑动交互行为下,主动对象驱动从动对象进行联动,驱动效果遵循弹簧物理动效。

+
  • false:不启用链式联动
  • true:启用链式联动
    说明:
    • 不支持动态修改。
    • 如同时配置了indexer,链式动效不生效。
    • 如配置了链式动效,list-item的sticky不生效。
    +
    +
+

scrollvibrate

+

boolean

+

true

+

+

用于设置当list滑动时是否有振动效果,仅在智能穿戴场景生效,其他场景滑动无振动效果。

+
  • true:列表滑动时有振动效果。
  • false:列表滑动时无振动效果。
+

initialindex

+

number

+

0

+

+

用于设置当前List初次加载时视口起始位置显示的item,默认为0,即显示第一个item,如设置的序号超过了最后一个item的序号,则设置不生效,当同时设置了initialoffset属性时,当前属性不生效。当indexer为true或者scrollpage为true时,不生效。

+

initialoffset

+

<length>

+

0

+

+

用于设置当前List初次加载时视口的起始偏移量,偏移量无法超过当前List可滑动的范围,如果超过会被截断为可滑动范围的极限值。当indexer为true或者scrollpage为true时,不生效。

+

selected5+

+

string

+

-

+

+

指定当前列表中被选中激活的项,可选值为list-item的section属性值。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

divider-color5+

+

<color>

+

transparent

+

+

item分隔线颜色,仅当list的divider属性为true时生效。

+

divider-height5+

+

<length>

+

1

+

+

item分隔线高度,仅当list的divider属性为true时生效。

+

divider-length5+

+

<length>

+

主轴宽度

+

+

item分隔线长度,不设置时最大长度为主轴宽度,具体长度取决于divider-origin,仅当list的divider属性为true时生效。

+

divider-origin5+

+

<length>

+

0

+

+

item分隔线相对于item主轴起点位置的偏移量,仅当list的divider属性为true时生效。

+

flex-direction

+

string

+

+

column

+

+

设置flex容器主轴的方向,指定flex项如何放置在flex容器中,可选值为:

+
  • column:主轴为纵向。
  • row:主轴为横向。
+

其他组件默认值为row,在list组件中默认值为column。

+

columns

+

number

+

1

+

+

list交叉轴方向的显示列数,默认为1列。

+
说明:

设置多列时,在list交叉轴上进行均分,每一列大小相同。

+
+

align-items

+

string

+

stretch

+

+

list每一列交叉轴上的对齐格式,可选值为:

+
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
    说明:

    align-items样式作用在每一列的子元素上,列与列之间采用均分方式布局。

    +
    +
+

item-extent

+

<length> | <percentage>

+

-

+

+

设置内部item为固定大小,设置为百分比格式时,指相对于list的视口主轴方向长度的百分比。

+

fade-color

+

<color>

+

grey

+

+

设置渐隐物理动效的颜色。当滑动效果设置为渐隐物理动效时生效。

+

scrollbar-color6+

+

<color>

+

-

+

+

设置滚动条的颜色。

+

scrollbar-width6+

+

<length>

+

-

+

+

设置滚动条的宽度。

+

scrollbar-offset6+

+

<length>

+

0

+

+

设置滚动条距离List默认位置的偏移量,只支持正数,默认位置在List右边缘,可以通过这个偏移量调整滚动条的水平位置,如果滚动条绘制在list外部,而list父组件有裁剪,会导致滚动条被裁剪。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

indexerchange5+

+

{ local: booleanValue }

+

多语言索引条切换事件,仅当indexer属性为true,indexermulti为true时生效。booleanValue可能值为true或者false:

+
  • true: 当前展示本地索引。
  • false: 当前展示字母索引。
+

scroll

+

{ scrollX: scrollXValue, scrollY: scrollYValue, scrollState: stateValue }

+

列表滑动的偏移量和状态回调。

+

stateValue: 0表示列表滑动已经停止。

+

stateValue: 1表示列表正在用户触摸状态下滑动。

+

stateValue: 2表示列表正在用户松手状态下滑动。

+

scrollbottom

+

-

+

当前列表已滑动到底部位置。

+

scrolltop

+

-

+

当前列表已滑动到顶部位置。

+

scrollend

+

-

+

列表滑动已经结束。

+

scrolltouchup

+

-

+

手指已经抬起且列表仍在惯性滑动。

+

requestitem

+

-

+

请求创建新的list-item。

+

长列表延迟加载时,可视区域外缓存的list-item数量少于cachedcount时,会触发该事件。

+

rotate7+

+

{ rotateValue: number }

+

返回表冠旋转角度增量值,仅智能穿戴支持。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)外,还支持如下方法: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

scrollTo

+

{ index: number(指定位置) }

+

list滑动到指定index的item位置。

+

scrollBy

+

ScrollParam

+

触发list滑动一段距离。

+

智慧屏特有方法。

+

scrollTop

+

{ smooth: boolean }

+

smooth缺省为false,表示直接滚动到顶部。

+

smooth为true,表示平滑滚动到顶部。

+

scrollBottom

+

{ smooth: boolean }

+

smooth缺省为false,表示直接滚动到底部。

+

smooth为true,表示平滑滚动到底部。

+

scrollPage

+

{ reverse: boolean, smooth: boolean }

+

reverse缺省值为false,表示下一页,无完整页则滚动到底部。

+

reverse为true,表示上一页,无完整页则滚动到顶部。

+

smooth缺省值为false,表示直接滚动一页。

+

smooth为true,表示平滑滚动一页。

+

scrollArrow

+

{ reverse: boolean, smooth: boolean }

+

reverse缺省值为false,表示向底部方向滑动一段距离,无足够距离则滚动到底部。

+

reverse为true,表示向顶部方向滑动一段距离,无足够距离则滚动到顶部。

+

smooth缺省值为false,表示直接滚动。

+

smooth为true,表示平滑滚动。

+

collapseGroup

+

{ groupid: string }

+

收拢指定的group。

+

groupid:需要收拢的group的id。

+

当groupid未指定时收拢所有的group。

+

expandGroup

+

{ groupid: string }

+

展开指定的group。

+

groupid:需要展开的group的id。

+

当groupid未指定时展开所有的group。

+

currentOffset

+

-

+

返回当前滑动的偏移量。返回值类型是Object,返回值说明请见表2

+
+ +**表 1** ScrollParam + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

是否必选

+

默认值

+

备注

+

dx

+

number

+

+

0

+

水平方向滑动的偏移量,单位为px。

+

dy

+

number

+

+

0

+

垂直方向滑动的偏移量,单位为px。

+

smooth

+

boolean

+

+

true

+

列表位置跳转时是否有滑动动画。

+
+ +**表 2** currentOffset返回对象属性说明 + + + + + + + + + + + + + + + + +

名称

+

类型

+

备注

+

x

+

number

+

当前x轴滑动偏移量,单位为px。

+

y

+

number

+

当前y轴滑动偏移量,单位为px。

+
+ +## 示例 + +``` + +
+ + + {{$item.title}} + {{$item.date}} + + +
+``` + +``` +// index.js +export default { + data: { + todolist: [{ + title: '刷题', + date: '2021-12-31 10:00:00', + }, { + title: '看电影', + date: '2021-12-31 20:00:00', + }], + }, +} +``` + +``` +/* index.css */ +.container { + display: flex; + justify-content: center; + align-items: center; + left: 0px; + top: 0px; + width: 454px; + height: 454px; +} +.todo-wrapper { + width: 454px; + height: 300px; +} +.todo-item { + width: 454px; + height: 80px; + flex-direction: column; +} +.todo-title { + width: 454px; + height: 40px; + text-align: center; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/33.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/06.list-item.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/06.list-item.md" new file mode 100644 index 0000000000000000000000000000000000000000..b2254b0c4127ec65725f14af4110a3987518c8c8 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/06.list-item.md" @@ -0,0 +1,181 @@ +--- +title: list-item +permalink: /pages/000b0100010105 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# list-item + +<[list](/pages/000b0100010104)\>的子组件,用来展示列表具体item。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>由于父元素list组件的align-items默认样式为stretch,该组件宽度默认充满list组件。设置父元素list组件的align-items样式为非stretch来生效自定义宽度。 + +## 权限列表 + +无 + +## 子组件 + +支持单个子组件。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

type

+

string

+

default

+

+

list-item类型,默认值为default,同一list中可以包含多种type的list-item,相同type的list-item需要确保渲染后的视图布局也相同,如果type固定,则使用show属性代替if属性,确保视图布局不变。

+

primary

+

boolean

+

false

+

+

设置为true表示该item是group中的主item,即收拢时显示的item。如果有多个primary,以第一个为准。如果没有标记为primary的item,则以第一个item为主item。

+

section

+

string

+

-

+

+

当前item的匹配字符串,如不设置则为空。不支持动态修改。group内只有主item设置有效。

+

sticky

+

string

+

none

+

+

设置当前item是否为吸顶item以及其吸顶消失的效果,当前仅支持纵向list,group内部的item不可吸顶,设置该属性无效。

+
  • none:当前item不吸顶。
  • normal:当前item吸顶,消失效果滑动消失。
  • opacity:当前item吸顶,消失效果渐隐消失,仅在智能穿戴上支持。
+

stickyradius

+

<length>

+

1000px

+

+

设置智能穿戴上吸顶item的圆弧效果半径,未设置时使用默认半径。sticky属性为none时,设置该属性无效。

+

clickeffect5+

+

boolean

+

true

+

+

设置当前item是否有点击动效。

+
  • false:item点击时无点击动效。
  • true:item点击时有点击动效。
+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

column-span

+

<number>

+

1

+

+

当前的list-item需要在list中占据的列的数量,默认占一列,仅在list为多列时生效。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

sticky

+

{ state: boolean }

+

吸顶组件回调事件。

+

value: false表示当前item处于非吸顶状态;

+

value: true表示当前item处于吸顶状态;

+

说明:仅当item设置sticky属性时支持注册此事件。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +详见[List示例](/pages/000b0100010104#section24931424488)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/07.list-item-group.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/07.list-item-group.md" new file mode 100644 index 0000000000000000000000000000000000000000..b9192b1de719f961cb953c5e3801583d3258a8f8 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/07.list-item-group.md" @@ -0,0 +1,264 @@ +--- +title: list-item-group +permalink: /pages/000b0100010106 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# list-item-group + +<[list](/pages/000b0100010104)\>的子组件,用来展示分组,宽度默认充满list组件。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 使用该组件时父元素list组件的样式columns必须为1,否则功能异常。 +>- 由于父元素list组件的align-items默认样式为stretch,该组件宽度默认充满list组件。设置父元素list组件的align-items样式为非stretch来生效自定义宽度。 + +## 权限列表 + +无 + +## 子组件 + +仅支持<[list-item](/pages/000b0100010105)\>。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

type

+

string

+

default

+

+

list-item-group类型,同一list支持多种type的list-item-group,相同type的list-item-group需要确保渲染后的视图布局也完全相同,当type固定时,使用show属性代替if属性,确保视图布局不变。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 通用属性中的id用来标识一个group。list中相关的函数的入参以及事件的信息皆以此标识一个唯一的group。 + +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

flex-direction

+

string

+

row

+

+

flex容器主轴方向。可选项有:

+
  • column:垂直方向从上到下
  • row:水平方向从左到右
+

justify-content

+

string

+

flex-start

+

+

flex容器当前行的主轴对齐格式。可选项有:

+
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
  • space-evenly5+: 均匀排列每个元素,每个元素之间的间隔相等。
+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

groupclick

+

{ groupid: string }

+

group点击事件。

+

groupid:被点击的group的id。

+

groupcollapse

+

{ groupid: string }

+

group收拢事件。

+

groupid:收拢的group的id。

+

当不输入参数或者groupid为空时收拢所有分组。

+

groupexpand

+

{ groupid: string }

+

group展开事件。

+

groupid:展开的group的id。

+

当不输入参数或者groupid为空时展开所有分组。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+ One---{{listgroup.value}} +
+
+ +
+ Primary---{{listgroup.value}} +
+
+
+
+
+``` + +``` +/* xxx.css */ +.doc-page { + flex-direction: column; +} +.top-list-item { + width:100%; + background-color:#D4F2E7; +} +.item-div { + flex-direction:column; + align-items:center; + justify-content:space-around; + height:240px; +} +.item-child { + width:100%; + height:60px; + justify-content:space-around; + align-items:center; +} +.item-group-child { + justify-content: center; + align-items: center; + width:100%; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt'; +export default { + data: { + direction: 'column', + list: [] + }, + onInit() { + this.list = [] + this.listAdd = [] + for (var i = 1; i <= 3; i++) { + var dataItem = { + value: 'GROUP' + i, + }; + this.list.push(dataItem); + } + }, + collapseOne(e) { + this.$element('mylist').collapseGroup({ + groupid: 'GROUP1' + }) + }, + expandOne(e) { + this.$element('mylist').expandGroup({ + groupid: 'GROUP1' + }) + }, + collapseAll(e) { + this.$element('mylist').collapseGroup() + }, + expandAll(e) { + this.$element('mylist').expandGroup() + }, + collapse(e) { + prompt.showToast({ + message: 'Close ' + e.groupid + }) + }, + expand(e) { + prompt.showToast({ + message: 'Open ' + e.groupid + }) + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/list6.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/08.panel.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/08.panel.md" new file mode 100644 index 0000000000000000000000000000000000000000..c25de0cb5c043585b3d0914d1e3c000d7bfc931c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/08.panel.md" @@ -0,0 +1,553 @@ +--- +title: panel +permalink: /pages/000b0100010107 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# panel + +可滑动面板。提供一种轻量的内容展示的窗口,可方便的在不同尺寸中切换。属于弹出式组件。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 5 开始支持。 + +## 子组件 + +支持 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

type

+

string

+

foldable

+

+

设置可滑动面板类型,不可动态变更,可选值有:

+
  • minibar:提供minibar和类全屏展示切换效果。

    +
  • foldable:内容永久展示类,提供大(类全屏)、中(类半屏)、小三种尺寸展示切换效果。

    +
  • temporary:内容临时展示区,提供大(类全屏)、中(类半屏)两种尺寸展示切换效果。

    +
+

mode

+

string

+

full

+

+

设置初始状态,mode参数可选值为:

+
  1. mini:类型为minibar和foldable时,为最小状态;类型为temporary,则不生效。

    +
  2. half: 类型为foldable和temporary时,为类半屏状态;类型为minibar,则不生效。

    +
  3. full: 类全屏状态。

    +
+

dragbar

+

boolean

+

true

+

+

设置是否存在dragbar,true表示存在,false表示不存在。

+

fullheight

+

<length>

+

-

+

+

指定full状态下的高度,默认为屏幕尺寸 - 8px。

+

halfheight

+

<length>

+

-

+

+

指定half状态下的高度,默认为屏幕尺寸的一半。

+

miniheight

+

<length>

+

-

+

+

指定mini状态下的高度,默认为48px。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持渲染属性,包括for、if和show。 +>- 不支持focusable和disabled属性。 + +## 样式 + +仅支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

padding

+

<length>

+

0

+

+
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    +
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    +
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    +
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    +
+
+

padding-[left|top|right|bottom]

+

<length>

+

0

+

+

设置左、上、右、下内边距属性。

+

padding-[start|end]

+

<length>

+

0

+

+

设置起始和末端内边距属性。

+

margin

+

<length>

+

0

+

+

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

+
  • 只有一个值时,这个值会被指定给全部的四个边。

    +
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    +
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    +
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    +
+

margin-[left|top|right|bottom]

+

<length>

+

0

+

+

设置左、上、右、下外边距属性。

+

margin-[start|end]

+

<length>

+

0

+

+

设置起始和末端外边距属性。

+

border

+

-

+

0

+

+

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

+

border-style

+

string

+

solid

+

+

使用简写属性设置所有边框的样式,可选值为:

+
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
+
  • solid:显示为一条实线。
+

border-[left|top|right|bottom]-style

+

string

+

solid

+

+

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

+

border-[left|top|right|bottom]

+

-

+

-

+

+

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

+

border-width

+

<length>

+

0

+

+

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

+

border-[left|top|right|bottom]-width

+

<length>

+

0

+

+

分别设置左、上、右、下四个边框的宽度。

+

border-color

+

<color>

+

black

+

+

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

+

border-[left|top|right|bottom]-color

+

<color>

+

black

+

+

分别设置左、上、右、下四个边框的颜色。

+

border-radius

+

<length>

+

-

+

+

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。

+

border-[top|bottom]-[left|right]-radius

+

<length>

+

-

+

+

分别设置左上,右上,右下和左下四个角的圆角半径。

+

background

+

<linear-gradient>

+

-

+

+

仅支持设置渐变样式,与background-color、background-image不兼容。

+

background-color

+

<color>

+

-

+

+

设置背景颜色。

+

background-image

+

string

+

-

+

+

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

+

background-size

+
  • string
  • <length> <length>
  • <percentage> <percentage>
+

auto

+

+

设置背景图片的大小。

+
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    +
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    +
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    +
+

background-repeat

+

string

+

repeat

+

+

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

+
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
+

background-position

+
  • string string
  • <length> <length>
  • <percentage> <percentage>
+

0px 0px

+

+
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    +
+
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
+

opacity

+

number

+

1

+

+

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

+
+ +## 事件 + +仅支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

sizechange

+

{ size: { height: heightLength, width: widthLength }, mode: modeStr }

+

当可滑动面板发生状态变化时触发,mode参数可选值为:

+
  1. mini:类型为minibar和foldable时,处于最小状态;

    +
  2. half: 类型为foldable时,处于类半屏状态;

    +
  3. full: 类全屏状态。

    +
    说明:

    返回的height值为内容区高度值,当dragbar属性为true时,panel本身的高度值为dragbar高度加上内容区高度。

    +
    +
+
+ +## 方法 + +仅支持如下方法: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

show

+

-

+

弹出panel可滑动面板。

+

close

+

-

+

关闭panel可滑动面板。

+
+ +## 示例 + +``` + +
+
+ +
+ +
+
+ Simple panel in {{modeFlag}} mode +
+
+ +
+
+
+
+``` + +``` +/* xxx.css */ +.doc-page { + flex-direction: column; + justify-content: center; + align-items: center; +} +.btn-div { + width: 100%; + height: 200px; + flex-direction: column; + align-items: center; + justify-content: center; +} +.txt { + color: #000000; + font-weight: bold; + font-size: 39px; +} +.panel-div { + width: 100%; + flex-direction: column; + align-items: center; +} +.inner-txt { + width: 100%; + height: 160px; + flex-direction: column; + align-items: center; + justify-content: center; +} +.inner-btn { + width: 100%; + height: 120px; + justify-content: center; + align-items: center; +} +``` + +``` +// xxx.js +export default { + data: { + modeFlag: "half" + }, + showPanel() { + this.$element('simplepanel').show() + }, + closePanel() { + this.$element('simplepanel').close() + }, + changeMode(e) { + this.modeFlag = e.mode + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/panel6.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/09.popup.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/09.popup.md" new file mode 100644 index 0000000000000000000000000000000000000000..9ce9a810475b821de60213067e4286ebaf51e6a9 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/09.popup.md" @@ -0,0 +1,253 @@ +--- +title: popup +permalink: /pages/000b0100010108 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# popup + +气泡指示。在点击绑定的控件后会弹出相应的气泡提示来引导用户进行操作。 + +## 权限列表 + +无 + +## 子组件 + +支持单个子组件节点5+。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性:↵ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

target

+

string

+

-

+

+

目标元素的id属性值,不支持动态切换。

+

placement

+

string

+

bottom

+

+

弹出窗口位置。可选值为:

+
  • left:位于目标元素左边;
  • right:位于目标元素右边;
  • top:位于目标元素上边;
  • bottom:位于目标元素下边;
  • topLeft:位于目标元素左上角;
  • topRight:位于目标元素右上角;
  • bottomLeft:位于目标元素左下角;
  • bottomRight:位于目标元素右下角。
+

keepalive5+

+

boolean

+

false

+

+

设置当前popup是否需要保留。设置为true时,点击屏幕区域或者页面切换气泡不会消失,需调用气泡组件的hide方法才可让气泡消失;设置为false时,点击屏幕区域或者页面切换气泡会自动消失。

+

clickable5+

+

boolean

+

true

+

+

popup是否使用点击弹窗,当设置为false时,只支持方法调用显示。

+

arrowoffset5+

+

<length>

+

0

+

+

popup箭头在弹窗处的偏移,默认居中,正值按照语言方向进行偏移,负值相反。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持focusable属性。 + +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

mask-color

+

<color>

+

-

+

+

遮罩层的颜色,默认值为全透明。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持position相关样式。 + +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

visibilitychange

+

{ visibility: boolean }

+

当气泡弹出和消失时会触发该回调函数。

+
+ +## 方法 + +仅支持如下方法: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

show5+

+

-

+

弹出气泡提示。

+

hide5+

+

-

+

取消气泡提示。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>1. popup气泡弹窗属性、样式均不支持动态更新。 +>2. popup气泡弹窗的margin样式是相对于target元素进行生效的,如popup在target元素下方,此时只生效margin-top样式,popup在target元素左上方,此时只生效margin-bottom和margin-right样式。 +>3. popup的border四边样式需一致,若四边设置不一致且圆角为零,则按左、上、右、下的顺序取第一个被设置的样式,否则border不生效。 +>4. popup的target组件的click事件不生效。 + +## 示例 + +``` + +
+ Click to show the pop-up + + + Text content of the pop-up + + +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + padding-top: 200px; +} +.popup { + mask-color: gray; +} +.text { + color: white; +} +.button { + width: 220px; + height: 70px; + margin-top: 50px; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt' +export default { + visibilitychange(e) { + prompt.showToast({ + message: 'visibility change visibility: ' + e.visibility, + duration: 3000, + }); + }, + showpopup() { + this.$element("popup").show(); + }, + hidepopup() { + this.$element("popup").hide(); + }, +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001178886129.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/10.refresh.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/10.refresh.md" new file mode 100644 index 0000000000000000000000000000000000000000..b2497a6734def1eb5bfb7f7a87b8b128f3613f73 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/10.refresh.md" @@ -0,0 +1,277 @@ +--- +title: refresh +permalink: /pages/000b0100010109 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# refresh + +下拉刷新容器。 + +## 权限列表 + +无 + +## 子组件 + +支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

offset

+

<length>

+

-

+

+

刷新组件静止时距离父组件顶部的距离。

+

refreshing

+

boolean

+

false

+

+

用于标识刷新组件当前是否正在刷新。

+

type

+

string

+

auto

+

+

设置组件刷新时的动效。两个可选值,不支持动态修改。

+
  • auto: 默认效果,列表界面拉到顶后,列表不移动,下拉后有转圈弹出。
  • pulldown: 列表界面拉到顶后,可以继续往下滑动一段距离触发刷新,刷新完成后有回弹效果(如果子组件含有list,防止下拉效果冲突,需将list的scrolleffect设置为no)。
+

lasttime

+

boolean

+

false

+

+

是否显示上次更新时间,字符串格式为:“上次更新时间:XXXX ”,XXXX 按照时间日期显示规范显示,不可动态修改(建议type为pulldown时使用,固定距离位于内容下拉区域底部,使用时注意offset属性设置,防止出现重叠)。

+

timeoffset6+

+

<length>

+

-

+

+

设置更新时间距离父组件顶部的距离。

+

friction

+

number

+

42

+

+

下拉摩擦系数,取值范围:0-100,数值越大refresh组件跟手性高,数值越小refresh跟手性低。

+
说明:

仅手机、平板和智能穿戴设备支持。

+
+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

background-color

+

<color>

+

white

+

+

用于设置刷新组件的背景颜色。

+

progress-color

+

<color>

+

black

+

+

用于设置刷新组件的loading颜色。

+
+ +## 事件 + +仅支持如下事件: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

refresh

+

{ refreshing: refreshingValue }

+

下拉刷新状态变化时触发。可能值:

+
  • false:当前处于下拉刷新过程中。
  • true:当前未处于下拉刷新过程中。
+

pulldown

+

{ state: string }

+

下拉开始和松手时触发。可能值:

+
  • start:表示开始下拉。
  • end:表示结束下拉。
+
+ +## 方法 + +不支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + + +
+ {{$item}} +
+
+
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + width: 100%; + height: 100%; +} + +.list { + width: 100%; + height: 100%; +} + +.listitem { + width: 100%; + height: 150px; +} + +.content { + width: 100%; + height: 100%; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.text { + font-size: 35px; + font-weight: bold; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt'; +export default { + data: { + list:[], + fresh:false + }, + onInit() { + this.list = []; + for (var i = 0; i <= 3; i++) { + var item = '列表元素' + i; + this.list.push(item); + } + }, + refresh: function (e) { + prompt.showToast({ + message: '刷新中...' + }) + var that = this; + that.fresh = e.refreshing; + setTimeout(function () { + that.fresh = false; + var addItem = '更新元素'; + that.list.unshift(addItem); + prompt.showToast({ + message: '刷新完成!' + }) + }, 2000) + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001150719520.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/11.stack.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/11.stack.md" new file mode 100644 index 0000000000000000000000000000000000000000..e25afd9573bdbb787ad11f819c2c993f0db9d549 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/11.stack.md" @@ -0,0 +1,85 @@ +--- +title: stack +permalink: /pages/000b010001010a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# stack + +堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。 + +## 权限列表 + +无 + +## 子组件 + +支持。 + +## 属性 + +支持[通用属性](/pages/000b0100010000)。 + +## 样式 + +支持[通用样式](/pages/000b0100010001)。 + +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + + +
+
+
+
+``` + +``` +/* xxx.css */ +.stack-parent { + width: 400px; + height: 400px; + background-color: #ffffff; + border-width: 1px; + border-style: solid; +} +.back-child { + width: 300px; + height: 300px; + background-color: #3f56ea; +} +.front-child { + width: 100px; + height: 100px; + background-color: #00bfc9; +} +.positioned-child { + width: 100px; + height: 100px; + left: 50px; + top: 50px; + background-color: #47cc47; +} +.bd-radius { + border-radius: 16px; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284958.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/12.stepper.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/12.stepper.md" new file mode 100644 index 0000000000000000000000000000000000000000..74c3c48a66caa1c96ca3145cec98afeb344d6884 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/12.stepper.md" @@ -0,0 +1,235 @@ +--- +title: stepper +permalink: /pages/000b010001010b +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# stepper + +步骤导航器。当完成一个任务需要多个步骤时,可以使用步骤导航器展示当前进展。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 5 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +仅支持子组件。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>步骤导航器内的步骤顺序按照子组件的顺序进行排序。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

描述

+

index

+

number

+

-

+

设置步骤导航器步骤显示第几个stepper-item子组件。

+
+ +## 样式 + +支持[通用样式](/pages/000b0100010001)。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>stepper组件默认占满父容器大小,建议父组件使用应用窗口大小(或者父组件为根节点)来优化体验。 + +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

finish

+

+

当步骤导航器最后一个步骤完成时触发该事件。

+

skip

+

+

当通过setNextButtonStatus方法设置当前步骤导航器可跳过时,点击右侧跳过按钮触发该事件。

+

change

+

{ prevIndex:prevIndex, index: index}

+

当步骤导航器点击左边或者右边文本按钮进行步骤切换时触发该事件,prevIndex表示老步骤的序号,index表示新步骤的序号。

+

next

+

{ index:index, pendingIndex: pendingIndex }

+

当用户点击下一步按钮时触发该事件,index表示当前步骤序号,pendingIndex表示将于跳转的序号,该事件有返回值,返回值格式为:{ pendingIndex:pendingIndex },可以通过指定pendingIndex来修改下一个步骤使用哪个stepper-item子组件。

+

back

+

{ index:index, pendingIndex: pendingIndex }

+

当用户点击上一步按钮时触发该事件,index表示当前步骤序号,pendingIndex表示将于跳转的序号,该事件有返回值,返回值格式为Object:{ pendingIndex:pendingIndex },可以通过指定pendingIndex来修改上一个步骤使用哪个stepper-item子组件。

+
+ +## 方法 + +除支持[通用方法](/pages/000b0100010003)外,支持如下方法: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

setNextButtonStatus

+

{ status: string, label: label }

+

设置当前步骤导航器下一步文本按钮的状态,参数中status类型为string,可选值为:

+
  1. normal:正常状态,下一步文本按钮正常显示,可点击进入下一个步骤;
  2. disabled:不可用状态,下一步文本按钮灰度显示,不可点击进入下一个步骤;
  3. waiting:等待状态,下一步文本按钮不显示,使用等待进度条,不可点击进入下一个步骤。
  4. skip:跳过状态,下一步文本按钮显示跳过按钮,点击时会跳过剩下步骤。
+
+ +## 示例 + +``` + +
+ + +
+ First screen +
+ +
+ +
+ Second screen +
+ +
+ +
+ Third screen +
+ +
+
+
+``` + +``` +/* xxx.css */ +.container { + margin-top: 20px; + flex-direction: column; + align-items: center; + height: 300px; +} +.stepperItem { + flex-direction: column; + align-items: center; +} +.stepperItemContent { + color: #0000ff; + font-size: 50px; + justify-content: center; +} +.button { + width: 60%; + margin-top: 30px; + justify-content: center; +} +``` + +``` +// xxx.js +export default { + data: { + label_1: + { + prevLabel: 'BACK', + nextLabel: 'NEXT', + status: 'normal' + }, + label_2: + { + prevLabel: 'BACK', + nextLabel: 'NEXT', + status: 'normal' + }, + label_3: + { + prevLabel: 'BACK', + nextLabel: 'NEXT', + status: 'normal' + }, + }, + setRightButton(e) { + this.$element('mystepper').setNextButtonStatus({status: 'skip', label: 'SKIP'}); + }, + nextclick(e) { + var index = { + pendingIndex: e.pendingIndex + } + return index; + }, + backclick(e) { + var index = { + pendingIndex: e.pendingIndex + } + return index; + }, +} +``` + +![](/images/application-dev/reference/arkui-js/figures/Video_2021-03-26_154549.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/13.stepper-item.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/13.stepper-item.md" new file mode 100644 index 0000000000000000000000000000000000000000..dec281eb45aff84e83066bf6c0da5b2f2dfed972 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/13.stepper-item.md" @@ -0,0 +1,246 @@ +--- +title: stepper-item +permalink: /pages/000b010001010c +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# stepper-item + +步骤导航器子组件,作为步骤导航器某一个步骤的内容展示组件。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 5 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

label

+

Label

+

-

+

+

自定义步骤导航器底部步骤提示文本按钮属性,不支持动态修改。如果没有定义该属性,步骤导航器在中文语言环境下,使用“返回”和“下一步”文本按钮,在非中文语言环境下,使用“BACK”和“NEXT”文本按钮。针对第一个步骤,没有回退文本按钮,针对最后一个步骤,下一步文本按钮文本使用“开始”(中文语言)或者“START”(非中文语言)。

+
+ +**表 1** Label对象定义 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

描述

+

prevLabel

+

string

+

-

+

步骤导航器底部回退文本按钮的描述文本。

+

nextLabel

+

string

+

-

+

步骤导航器底部下一步文本按钮的描述文本。

+

status

+

string

+

normal

+

步骤导航器当前步骤的初始状态,可选值为:

+
  • normal:正常状态,右侧文本按钮正常显示,可点击进入下一个步骤。
+
  • disabled:不可用状态,右侧文本按钮灰度显示,不可点击进入下一个步骤。
+
  • waiting:等待状态,右侧文本按钮不显示,使用等待进度条,不可点击进入下一个步骤。
+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

-

+

+

文本颜色。

+

font-size

+

<length>

+

-

+

+

文本大小。

+

allow-scale

+

boolean

+

true

+

+

文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+

font-style

+

string

+

normal

+

+

文本字体样式,可选值为:

+
  • normal: 标准的字体样式;
  • italic: 斜体的字体样式。
+

font-weight

+

number|string

+

normal

+

+

文本字体粗细,number类型取值[100, 900]的整数(被100整除),默认为400,取值越大,字体越粗。string类型取值为:lighter、normal、bold、bolder。

+

text-decoration

+

string

+

none

+

+

文本修饰,可选值为:

+
  • underline: 文本下划线修饰。
  • line-through: 穿过文本的修饰线。
  • none: 标准文本。
+

font-family

+

string

+

sans-serif

+

+

字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持长宽样式,宽和父容器stepper一样,高是父容器stepper减去底部导航按钮的高度。 +>- 不支持posit样式。 + +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

appear

+

-

+

当该步骤出现时触发。

+

disappear

+

-

+

当该步骤消失时触发。

+
+ +## 方法 + +不支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +详见[stepper示例](/pages/000b010001010b)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/14.swiper.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/14.swiper.md" new file mode 100644 index 0000000000000000000000000000000000000000..6a1618cdb1ccbb27c0370c8bb3b9c2dbd017ae4d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/14.swiper.md" @@ -0,0 +1,431 @@ +--- +title: swiper +permalink: /pages/000b010001010d +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# swiper + +滑动容器,提供切换子组件显示的能力。 + +## 权限列表 + +无 + +## 子组件 + +支持除之外的子组件。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

index

+

number

+

0

+

+

当前在容器中显示的子组件的索引值。

+

autoplay

+

boolean

+

false

+

+

子组件是否自动播放,自动播放状态下,导航点不可操作5+

+

interval

+

number

+

3000

+

+

使用自动播放时播放的时间间隔,单位为ms。

+

indicator

+

boolean

+

true

+

+

是否启用导航点指示器,默认true。

+

digital5+

+

boolean

+

false

+

+

是否启用数字导航点,默认为false。

+
说明:

必须设置indicator时才能生效数字导航点。

+
+

indicatormask

+

boolean

+

false

+

+

是否采用指示器蒙版,设置为true时,指示器会有渐变蒙版出现。

+
说明:

手机上不生效5+

+
+

indicatordisabled5+

+

boolean

+

false

+

+

指示器是否禁止用户手势操作,设置为true时,指示器不会响应用户的点击拖拽。

+

loop

+

boolean

+

true

+

+

是否开启循环滑动。

+

duration

+

number

+

-

+

+

子组件切换的动画时长。

+

vertical

+

boolean

+

false

+

+

是否为纵向滑动,纵向滑动时采用纵向的指示器。

+

cachedsize7+

+

number

+

-1

+

+

swiper延迟加载时item最少缓存数量。-1表示全部缓存。

+

scrolleffect7+

+

string

+

spring

+

+

滑动效果。目前支持如下:

+
  • spring:弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹。
  • fade:渐隐物理动效,滑动到边缘后展示一个波浪形的渐隐,根据速度和滑动距离的变化渐隐也会发送一定的变化
  • none:滑动到边缘后无效果。
    说明:

    该属性仅在loop属性为false时生效。

    +
    +
+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

indicator-color

+

<color>

+

-

+

+

导航点指示器的填充颜色。

+

indicator-selected-color

+

<color>

+

#ff007dff

+

+

导航点指示器选中的颜色。

+

indicator-size

+

<length>

+

4px

+

+

导航点指示器的直径大小。

+

indicator-top|left|right|bottom

+

<length> | <percentage>

+

-

+

+

导航点指示器在swiper中的相对位置。

+

next-margin7+

+

<length> | <percentage>

+

-

+

+

后边距,用于露出后一项的一小部分。

+

previous-margin7+

+

<length> | <percentage>

+

-

+

+

前边距,用于露出前一项的一小部分。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ index: currentIndex }

+

当前显示的组件索引变化时触发该事件。

+

rotation

+

{ value: rotationValue }

+

智能穿戴表冠旋转事件触发时的回调。

+

animationfinish7+

+

-

+

动画结束时触发该事件。

+
+ +## 方法 + +除支持[通用方法](/pages/000b0100010003)外,还支持如下方法: + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

swipeTo

+

{ index: number(指定位置) }

+

切换到index位置的子组件。

+

showNext

+

+

显示下一个子组件。

+

showPrevious

+

+

显示上一个子组件。

+
+ +## 示例 + +``` + +
+ +
+ First screen +
+
+ Second screen +
+
+ Third screen +
+
+ + + +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + width: 100%; + height: 100%; + align-items: center; +} +.swiper { + flex-direction: column; + align-content: center; + align-items: center; + width: 70%; + height: 130px; + border: 1px solid #000000; + indicator-color: #cf2411; + indicator-size: 14px; + indicator-bottom: 20px; + indicator-right: 30px; + margin-top: 100px; + next-margin:20px; + previous-margin:20px; +} +.swiperContent1{ + height: 100%; + justify-content: center; + background-color: #007dff; +} +.swiperContent2{ + height: 100%; + justify-content: center; + background-color: #ff7500; +} +.swiperContent3{ + height: 100%; + justify-content: center; + background-color: #41ba41; +} +.button { + width: 70%; + margin: 10px; +} +.text { + font-size: 40px; +} +``` + +``` +// xxx.js +export default { + swipeTo() { + this.$element('swiper').swipeTo({index: 2}); + }, + showNext() { + this.$element('swiper').showNext(); + }, + showPrevious() { + this.$element('swiper').showPrevious(); + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/4-0.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/15.tabs.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/15.tabs.md" new file mode 100644 index 0000000000000000000000000000000000000000..858fdb8047a5d4ec0d7253ee3a558dbe7cc7a1c7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/15.tabs.md" @@ -0,0 +1,168 @@ +--- +title: tabs +permalink: /pages/000b010001010e +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# tabs + +tab页签容器。 + +## 权限列表 + +无 + +## 子组件 + +仅支持最多一个<[tab-bar](/pages/000b010001010f)\>和最多一个<[tab-content](/pages/000b0100010110)\>。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

index

+

number

+

0

+

+

当前处于激活态的tab索引。

+

vertical

+

boolean

+

false

+

+

是否为纵向的tab,默认为false,可选值为:

+
  • false:tabbar和tabcontent上下排列。
  • true:tabbar和tabcontent左右排列。
+
+ +## 样式 + +支持[通用样式](/pages/000b0100010001)。 + +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ index: indexValue }

+

tab页签切换后触发。

+
说明:

动态修改index值不会触发该回调。

+
+
+ +## 示例 + +``` + +
+ + + Home + Index + Detail + + +
+ First screen +
+
+ Second screen +
+
+ Third screen +
+
+
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: flex-start; + align-items: center; +} +.tabs { + width: 100%; +} +.tabcontent { + width: 100%; + height: 80%; + justify-content: center; +} +.item-content { + height: 100%; + justify-content: center; +} +.item-title { + font-size: 60px; +} +.tab-bar { + margin: 10px; + height: 60px; + border-color: #007dff; + border-width: 1px; +} +.tab-text { + width: 300px; + text-align: center; +} +``` + +``` +// xxx.js +export default { + change: function(e) { + console.log("Tab index: " + e.index); + }, +} +``` + +![](/images/application-dev/reference/arkui-js/figures/tab.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/16.tab-bar.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/16.tab-bar.md" new file mode 100644 index 0000000000000000000000000000000000000000..f0fdad0921fe84dbae20b9a89390b83308ae66af --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/16.tab-bar.md" @@ -0,0 +1,73 @@ +--- +title: tab-bar +permalink: /pages/000b010001010f +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# tab-bar + +<[tabs](/pages/000b010001010e)\>的子组件,用来展示tab的标签区,子组件排列方式为横向排列。 + +## 权限列表 + +无 + +## 子组件 + +支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

mode

+

string

+

scrollable

+

+

设置组件宽度的可延展性。可选值为:

+
  • scrollable:子组件宽度为实际设置的宽度,当宽度之和(包括margin边距)大于tab-bar的宽度时,子组件可以横向滑动。
  • fixed:子组件宽度均分tab-bar的宽度。
+
+ +## 样式 + +支持[通用样式](/pages/000b0100010001)。 + +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +详见[tabs示例](/pages/000b010001010e#section14993155318710)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/17.tab-content.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/17.tab-content.md" new file mode 100644 index 0000000000000000000000000000000000000000..0b22213ac379463d679b88e35d7f66b6b0237e57 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/17.tab-content.md" @@ -0,0 +1,68 @@ +--- +title: tab-content +permalink: /pages/000b0100010110 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# tab-content + +<[tabs](/pages/000b010001010e)\>的子组件,用来展示tab的内容区,高度默认充满tabs剩余空间,子组件排列方式为横向排列,当作为容器组件的子元素时在主轴方向需要设置tab-content的确定长度,否则无法显示。 + +## 权限列表 + +无 + +## 子组件 + +支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

scrollable

+

boolean

+

true

+

+

是否可以通过左右滑动进行页面切换。默认为true,设置为false后,页面的切换只能通过tab-bar的点击实现。

+
+ +## 样式 + +支持[通用样式](/pages/000b0100010001)。 + +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 示例 + +详见[tabs示例](/pages/000b010001010e#section14993155318710)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/01.button.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/01.button.md" new file mode 100644 index 0000000000000000000000000000000000000000..8209aaca7c2da4297d6e53965e0f4b0503a7242f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/01.button.md" @@ -0,0 +1,424 @@ +--- +title: button +permalink: /pages/000b0100010200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# button + +提供按钮组件,包括胶囊按钮、圆形按钮、文本按钮、弧形按钮、下载按钮。 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

type

+

string

+

-

+

+

不支持动态修改。如果该属性缺省,展示类胶囊型按钮,不同于胶囊类型,四边圆角可以通过border-radius分别指定,如果需要设置该属性,则可选值包括如下:

+
  • capsule:胶囊型按钮,带圆角按钮,有背景色和文本;
  • circle:圆形按钮,支持放置图标;
  • text:文本按钮,仅包含文本显示;
  • arc:弧形按钮,仅支持智能穿戴;
  • download:下载按钮,额外增加下载进度条功能,仅支持手机和智慧屏。
+

value

+

string

+

-

+

+

button的文本值。

+

icon

+

string

+

-

+

+

button的图标路径,图标格式为jpg,png和svg。

+

placement5+

+

string

+

end

+

+

仅在type属性为缺省时生效,设置图标位于文本的位置,可选值为:

+
  • start:图标位于文本起始处;
  • end:图标位于文本结束处;
  • top:图标位于文本上方;
  • bottom:图标位于文本下方。
+

waiting

+

boolean

+

false

+

+

waiting状态,waiting为true时展现等待中转圈效果,位于文本左侧。类型为download时不生效,不支持智能穿戴。

+
+ +## 样式 + +**type设置为非arc时:** + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

text-color

+

<color>

+

#ff007dff

+

+

按钮的文本颜色。

+

font-size

+

<length>

+

16px

+

+

按钮的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

font-style

+

string

+

normal

+

+

按钮的字体样式。

+

font-weight

+

number | string

+

normal

+

+

按钮的字体粗细。见text组件font-weight的样式属性

+

font-family

+

<string>

+

sans-serif

+

+

按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+

icon-width

+

<length>

+

-

+

+

设置圆形按钮内部图标的宽,默认填满整个圆形按钮。

+
说明:

icon使用svg图源时必须设置该样式。

+
+

icon-height

+

<length>

+

-

+

+

设置圆形按钮内部图标的高,默认填满整个圆形按钮。

+
说明:

icon使用svg图源时必须设置该样式。

+
+

radius

+

<length>

+

-

+

+

圆形按钮半径或者胶囊按钮圆角半径。在圆形按钮类型下该样式优先于通用样式的width和height样式。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 胶囊按钮(type=capsule)时,不支持border相关样式; +>- 圆形按钮(type=circle)时,不支持文本相关样式; +>- 文本按钮(type=text)时,自适应文本大小,不支持尺寸设置(radius,width,height),背景透明不支持background-color样式。 + +**type设置为arc时:** + +除支持[通用样式](/pages/000b0100010001)中background-color、opacity、display、visibility、position、\[left|top|right|bottom外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

text-color

+

<color>

+

#de0000

+

+

弧形按钮的文本颜色。

+

font-size

+

<length>

+

37.5px

+

+

弧形按钮的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

弧形按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+

font-style

+

string

+

normal

+

+

弧形按钮的字体样式。

+

font-weight

+

number | string

+

normal

+

+

弧形按钮的字体粗细。见text组件font-weight的样式属性

+

font-family

+

<string>

+

sans-serif

+

+

按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+
+ +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +类型为download时,支持如下方法: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

setProgress

+

{ progress:percent }

+

设定下载按钮进度条进度,取值位于0-100区间内,当设置的值大于0时,下载按钮展现进度条。当设置的值大于等于100时,取消进度条显示。

+
说明:

浮在进度条上的文字通过value值进行变更。

+
+
+ +## 示例 + +``` + +
+ + + + + +
+``` + +``` +/* xxx.css */ +.div-button { + flex-direction: column; + align-items: center; +} +.first{ + background-color: #F2F2F2; + text-color: #0D81F2; +} +.button { + margin-top: 15px; +} +.last{ + background-color: #F2F2F2; + text-color: #969696; + margin-top: 15px; + width: 280px; + height:72px; +} +.button:waiting { + width: 280px; +} +.circle { + background-color: #007dff; + radius: 72px; + icon-width: 72px; + icon-height: 72px; +} +.text { + text-color: red; + font-size: 40px; + font-weight: 900; + font-family: sans-serif; + font-style: normal; +} +.download { + width: 280px; + text-color: white; + background-color: #007dff; +} +``` + +``` +// xxx.js +export default { + data: { + count: 5, + downloadText: "Download" + }, + progress(e) { + this.count+= 10; + this.downloadText = this.count+ "%"; + this.$element('download-btn').setProgress({ progress: this.count}); + if (this.count>= 100) { + this.downloadText = "Done"; + } + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125132.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/02.chart.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/02.chart.md" new file mode 100644 index 0000000000000000000000000000000000000000..ccb73c0add36856b4828112bf5d1768ff838084a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/02.chart.md" @@ -0,0 +1,1168 @@ +--- +title: chart +permalink: /pages/000b0100010201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# chart + +图表组件,用于呈现线形图、柱状图、量规图界面。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

type

+

string

+

line

+

+

设置图表类型(不支持动态修改),可选项有:

+
  • bar:柱状图。
  • line:线形图。
  • gauge:量规图。
  • progress5+:进度类圆形图表。
  • loading5+:加载类圆形图表。
  • rainbow5+:占比类圆形图表。
+

options

+

ChartOptions

+

-

+

+

图表参数设置,柱状图和线形图必须设置参数设置,量规图不生效。可以设置x轴、y轴的最小值、最大值、刻度数、是否显示,线条宽度、是否平滑等。(不支持动态修改)

+

datasets

+

Array<ChartDataset>

+

-

+

+

数据集合,柱状图和线形图必须设置数据集合,量规图不生效。可以设置多条数据集及其背景色。

+

segments5+

+

DataSegment | Array<DataSegment>

+

-

+

+

进度类、加载类和占比类圆形图表使用的数据结构。

+

DataSegment针对进度类和加载类圆形图表使用,

+

Array<DataSegment>针对占比类图标使用,DataSegment最多9个。

+
说明:

仅手机和平板设备支持。

+
+

effects5+

+

boolean

+

true

+

+

是否开启占比类、进度类圆形图表特效。

+
说明:

仅手机和平板设备支持。

+
+

animationduration6+

+

number

+

3000

+

+

设置占比类圆形图表展开动画时长,单位为ms。

+
说明:

仅手机和平板设备支持。

+
+
+ +**表 1** ChartOptions + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

xAxis

+

ChartAxis

+

-

+

+

x轴参数设置。可以设置x轴最小值、最大值、刻度数以及是否显示。

+

yAxis

+

ChartAxis

+

-

+

+

y轴参数设置。可以设置y轴最小值、最大值、刻度数以及是否显示。

+

series

+

ChartSeries

+

-

+

+

数据序列参数设置。可以设置1)线的样式,如线宽、是否平滑;2)设置线最前端位置白点的样式和大小。

+
说明:

仅线形图支持。

+
+
+ +**表 2** ChartDataset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

strokeColor

+

<color>

+

#ff6384

+

+

线条颜色。

+
说明:

仅线形图支持。

+
+

fillColor

+

<color>

+

#ff6384

+

+

填充颜色。线形图表示填充的渐变颜色。

+

data

+

Array<number> | Array<Point>5+

+

-

+

+

设置绘制线或柱中的点集。

+

gradient

+

boolean

+

false

+

+

设置是否显示填充渐变颜色。

+
说明:

仅线形图支持。

+
+
+ +**表 3** ChartAxis + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

min

+

number

+

0

+

+

轴的最小值。

+
说明:

仅线形图支持负数。

+
+

max

+

number

+

100

+

+

轴的最大值。

+
说明:

仅线形图支持负数。

+
+

axisTick

+

number

+

10

+

+

轴显示的刻度数量。

+
说明:

仅支持1~20,且具体显示的效果与如下计算值有关(图的宽度所占的像素/(max-min))。

+

在柱状图中,每组数据显示的柱子数量与刻度数量一致,且柱子显示在刻度处。

+
+

display

+

boolean

+

false

+

+

是否显示轴。

+

color

+

<color>

+

#c0c0c0

+

+

轴颜色。

+
+ +**表 4** ChartSeries + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

lineStyle

+

ChartLineStyle

+

-

+

+

线样式设置,如线宽、是否平滑。

+

headPoint

+

PointStyle

+

-

+

+

线最前端位置白点的样式和大小。

+

topPoint

+

PointStyle

+

-

+

+

最高点的样式和大小。

+

bottomPoint

+

PointStyle

+

-

+

+

最低点的样式和大小。

+

loop

+

ChartLoop

+

-

+

+

设置屏幕显示满时,是否需要重头开始绘制。

+
+ +**表 5** ChartLineStyle + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

width

+

<length>

+

1px

+

+

线宽设置。

+

smooth

+

boolean

+

false

+

+

是否平滑。

+
+ +**表 6** PointStyle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

shape

+

string

+

circle

+

+

高亮点的形状。可选值为:

+
  • circle:圆形。
  • square:方形。
  • triangle:三角形。
+

size

+

<length>

+

5px

+

+

高亮点的大小。

+

strokeWidth

+

<length>

+

1px

+

+

边框宽度

+

strokeColor

+

<color>

+

#ff0000

+

+

边框颜色。

+

fillColor

+

<color>

+

#ff0000

+

+

填充颜色。

+
+ +**表 7** ChartLoop + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

margin

+

<length>

+

1

+

+

擦除点的个数(最新绘制的点与最老的点之间的横向距离)。注意:轻量设备margin和topPoint/bottomPoint/headPoint同时使用时,有概率出现point正好位于擦除区域的情况,导致point不可见,因此不建议同时使用。

+

gradient

+

boolean

+

false

+

+

是否需要渐变擦除。

+
+ +**表 8** Point5+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

value

+

number

+

0

+

+

表示绘制点的Y轴坐标。

+

pointStyle

+

PointStyle

+

-

+

+

表示当前数据点的绘制样式。

+

description

+

string

+

-

+

+

表示当前点的注释内容。

+

textLocation

+

string

+

-

+

+

可选值为top,bottom,none。分别表示注释的绘制位置位于点的上方,下方,以及不绘制。

+

textColor

+

<color>

+

#000000

+

+

表示注释文字的颜色。

+

lineDash

+

string

+

solid

+

+

表示绘制当前线段虚线的样式。“dashed, 5, 5”表示纯虚线,绘制5px的实线后留5px的空白。“solid”表示绘制实线。

+

lineColor

+

<color>

+

#000000

+

+

表示绘制当前线段的颜色。此颜色不设置会默认使用整体的strokeColor。

+
+ +**表 9** DataSegment5+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

startColor

+

Color

+

-

+

+

起始位置的颜色,设置startColor必须设置endColor。不设置startColor时,会使用系统默认预置的颜色数组,具体颜色值见下表。

+

endColor

+

Color

+

-

+

+

终止位置的颜色,设置endColor必须设置startColor。

+

不设置startColor时,会使用系统默认预置的颜色数组。

+

value

+

number

+

0

+

+

占比数据的所占份额,最大100。

+

name

+

string

+

-

+

+

此类数据的名称。

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

数据组

+

浅色主题

+

深色主题

+

0

+

起始颜色:#f7ce00,结束颜色:#f99b11

+

起始颜色:#d1a738,结束颜色:#eb933d

+

1

+

起始颜色:#f76223,结束颜色:#f2400a

+

起始颜色:#e67d50,结束颜色:#d9542b

+

2

+

起始颜色:#f772ac,结束颜色:#e65392

+

起始颜色:#d5749e,结束颜色:#d6568d

+

3

+

起始颜色:#a575eb,结束颜色:#a12df7

+

起始颜色:#9973d1,结束颜色:#5552d9

+

4

+

起始颜色:#7b79f7,结束颜色:#4b48f7

+

起始颜色:#7977d9,结束颜色:#f99b11

+

5

+

起始颜色:#4b8af3,结束颜色:#007dff

+

起始颜色:#4c81d9,结束颜色:#217bd9

+

6

+

起始颜色:#73c1e6,结束颜色:#4fb4e3

+

起始颜色:#5ea6d1,结束颜色:#4895c2

+

7

+

起始颜色:#a5d61d,结束颜色:#69d14f

+

起始颜色:#91c23a,结束颜色:#70ba5d

+

8

+

起始颜色:#a2a2b0,结束颜色:#8e8e93

+

起始颜色:#8c8c99,结束颜色:#6b6b76

+
+ +当类型为量规图时,还支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

percent

+

number

+

0

+

+

当前值占整体的百分比,取值范围为0-100。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

stroke-width

+

<length>

+

32px(量规)

+

24px(占比类圆形图表)

+

+

量规、占比类圆形图表组件刻度条的宽度。

+

start-angle

+

<deg>

+

240(量规)

+

0(占比类圆形图表)

+

+

量规、占比类圆形图表组件刻度条起始角度,以时钟0点为基线。范围为0到360。

+

total-angle

+

<deg>

+

240(量规)

+

360(占比类圆形图表)

+

+

量规、占比类圆形图表组件刻度条总长度,范围为-360到360,负数标识起点到终点为逆时针。

+

center-x

+

<length>

+

-

+

+

量规组件刻度条中心位置,该样式优先于通用样式的position样式。该样式需要和center-y和radius一起配置才能生效。(仅量规图支持)

+

center-y

+

<length>

+

-

+

+

量规组件刻度条中心位置,该样式优先于通用样式的position样式。该样式需要和center-x和radius一起配置才能生效。(仅量规图支持)

+

radius

+

<length>

+

-

+

+

量规组件刻度条半径,该样式优先于通用样式的width和height样式。该样式需要和center-x和center-y一起配置才能生效。(仅量规图支持)

+

colors

+

Array

+

-

+

+

量规组件刻度条每一个区段的颜色。

+

如:colors: #ff0000, #00ff00。(仅量规图支持)

+

weights

+

Array

+

-

+

+

量规组件刻度条每一个区段的权重。

+

如:weights: 2, 2。(仅量规图支持)

+

font-family5+

+

Array

+

-

+

+

表示绘制注释的字体样式,支持自定义字体

+

font-size5+

+

<length>

+

-

+

+

表示绘制注释的字体的大小。

+
+ +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +除支持[通用方法](/pages/000b0100010003)外,还支持如下方法: + + + + + + + + + + + + +

方法

+

参数

+

描述

+

append

+

{

+

serial: number, // 设置要更新的线形图数据下标

+

data: Array<number>, // 设置新增的数据

+

}

+

往已有的数据序列中动态添加数据,根据serial指定目标序列,serial为datasets数组的下标,从0开始。注意:不会更新datasets[index].data。仅线形图支持,按横坐标加1递增(与xAxis min/max设置相关)。

+
+ +## 示例 + +1. 线形图 + + ``` + +
+ + + + + +
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + } + .chart-region { + height: 400px; + width: 700px; + } + .chart-background { + object-fit: fill; + } + .chart-data { + width: 700px; + height: 600px; + } + button { + width: 100%; + height: 50px; + background-color: #F4F2F1; + text-color: #0C81F3; + } + ``` + + ``` + // xxx.js + export default { + data: { + lineData: [ + { + strokeColor: '#0081ff', + fillColor: '#cce5ff', + data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628, 791, 505, 613, 575, 475, 553, 491, 680, 657, 716], + gradient: true, + } + ], + lineOps: { + xAxis: { + min: 0, + max: 20, + display: false, + }, + yAxis: { + min: 0, + max: 1000, + display: false, + }, + series: { + lineStyle: { + width: "5px", + smooth: true, + }, + headPoint: { + shape: "circle", + size: 20, + strokeWidth: 5, + fillColor: '#ffffff', + strokeColor: '#007aff', + display: true, + }, + loop: { + margin: 2, + gradient: true, + } + } + }, + }, + addData() { + this.$refs.linechart.append({ + serial: 0, + data: [Math.floor(Math.random() * 400) + 400] + }) + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324843.png) + +2. 柱状图 + + ``` + +
+ + + + +
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + } + .data-region { + height: 400px; + width: 700px; + } + .data-background { + object-fit: fill; + } + .data-bar { + width: 700px; + height: 400px; + } + ``` + + ``` + // xxx.js + export default { + data: { + barData: [ + { + fillColor: '#f07826', + data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628], + }, + { + fillColor: '#cce5ff', + data: [535, 776, 615, 444, 694, 785, 677, 609, 562, 410], + }, + { + fillColor: '#ff88bb', + data: [673, 500, 574, 483, 702, 583, 437, 506, 693, 657], + }, + ], + barOps: { + xAxis: { + min: 0, + max: 20, + display: false, + axisTick: 10, + }, + yAxis: { + min: 0, + max: 1000, + display: false, + }, + }, + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/barchart.png) + +3. 量规图 + + ``` + +
+
+ +
+
+ ``` + + ``` + /* xxx.css */ + .container { + flex-direction: column; + justify-content: center; + align-items: center; + } + .gauge-region { + height: 400px; + width: 400px; + } + .data-gauge { + colors: #83f115, #fd3636, #3bf8ff; + weights: 4, 2, 1; + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/gauge.png) + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/03.divider.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/03.divider.md" new file mode 100644 index 0000000000000000000000000000000000000000..d08d8de349b5858349ad18e434a49f0a52ca67b9 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/03.divider.md" @@ -0,0 +1,259 @@ +--- +title: divider +permalink: /pages/000b0100010202 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# divider + +提供分隔器组件,分隔不同内容块/内容元素。可用于列表或界面布局。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

vertical

+

boolean

+

false

+

+

使用水平分割线还是垂直分割线,默认水平。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持focusable、disabled属性。 + +## 样式 + +仅支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

margin

+

<length>

+

0

+

+

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

+

margin-[left|top|right|bottom]

+

<length>

+

0

+

+

使用简写属性设置左、上、右、下外边距属性,类型length,单位px,默认值0。

+

color

+

<color>

+

#08000000

+

+

设置分割线颜色。

+

stroke-width

+

<length>

+

1

+

+

设置分割线宽度。

+

display

+

string

+

flex

+

+

确定分割线所产生的框的类型。值flex/none,默认值flex。

+

visibility

+

string

+

visible

+

+

是否显示分割线。不可见的框会占用布局。visible代表显示元素,hidden代表不显示元素。

+

line-cap

+

string

+

butt

+

+

设置分割线条的端点样式,默认为butt,可选值为:

+
  • butt:分割线两端为平行线;
  • round:分割线两端额外添加半圆;
  • square:分割线两端额外添加半方形;
+
说明:

round和square会额外增加一个线宽的分割线长度。

+
+

flex

+

number

+

-

+

+

规定了分割线如何适应父组件中的可用空间。它作为一个简写属性,用来设置组件的flex-grow。

+
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

+
+

flex-grow

+

number

+

0

+

+

设置分割线的伸展因子,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex项加起来的大小)的分配系数。0为不伸展。

+
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

+
+

+

flex-shrink

+

number

+

1

+

+

设置分割线的收缩因子,flex元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

+
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

+
+

flex-basis

+

<length>

+

+

-

+

+

设置分割线在主轴方向上的初始大小。

+
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

+
+
+ +## 事件 + +不支持。 + +## 方法 + +不支持。 + +## 示例 + +``` + +
+
+ +
+
+``` + +``` +/* xxx.css */ +.container { + margin: 20px; + flex-direction:column; + width:100%; + height:100%; + align-items:center; +} +.content{ + width:80%; + height:40%; + border:1px solid #000000; + align-items: center; + justify-content: center; + flex-direction:column; +} +.divider { + margin: 10px; + color: #ff0000ff; + stroke-width: 3px; + line-cap: round; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/1.jpg) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/04.image.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/04.image.md" new file mode 100644 index 0000000000000000000000000000000000000000..ad68ea34e9d81daa86d07525dc6a79a9457e3471 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/04.image.md" @@ -0,0 +1,255 @@ +--- +title: image +permalink: /pages/000b0100010203 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# image + +图片组件,用来渲染展示图片。 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

src

+

string

+

-

+

+

图片的路径,支持本地路径,图片格式包括png、jpg、bmp、svg和gif。

+

支持Base64字符串6+。格式为data:image/[png | jpeg | bmp | webp];base64, [base64 data], 其中[base64 data]为Base64字符串数据。

+

支持dataability://的路径前缀,用于访问通过data ability提供的图片路径6+

+

alt

+

string

+

-

+

+

占位图,当指定图片在加载中时显示。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

object-fit

+

string

+

cover

+

+

设置图片的缩放类型。可选值类型说明请见object-fit 类型说明。(不支持svg格式)

+

match-text-direction

+

boolean

+

false

+

+

图片是否跟随文字方向。(不支持svg格式)

+

fit-original-size

+

boolean

+

false

+

+

image组件在未设置宽高的情况下是否适应图源尺寸(该属性为true时object-fit属性不生效),svg类型图源不支持该属性。

+

object-position7+

+

string

+

0px 0px

+

+

设置图片在组件内展示的位置。

+

设置类型有两种:

+

1. 像素,单位px,示例 15px 15px 代表X轴或者Y轴移动的位置

+

2. 字符,可选值:

+
  • left 图片显示在组件左侧;
  • top 图片显示在组件顶部位置;
  • right 图片显示在组件右侧位置;
  • bottom图片显示在组件底部位置。
+
+ +**表 1** object-fit 类型说明 + + + + + + + + + + + + + + + + + + + + + + +

类型

+

描述

+

cover

+

保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界,居中显示。

+

contain

+

保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内,居中显示。

+

fill

+

不保持宽高比进行放大缩小,使得图片填充满显示边界。

+

none

+

保持原有尺寸进行居中显示。

+

scale-down

+

保持宽高比居中显示,图片缩小或者保持不变。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>使用svg图片资源时: +>- 建议设置image组件的长宽,否则在父组件的长或宽为无穷大的场景下,svg资源将不会绘制; +>- 如果svg描述中未指定相应的长宽,则svg将会填满image组件区域; +>- 如果svg描述中指定了相应的长宽,和image组件本身的长宽效果如下: +>1. 如果image组件本身的长宽小于svg中的长宽,svg会被裁切,仅显示左上角部分; +>2. 如果image组件本身的长宽大于svg中的长宽,svg会被放置在image组件的左上角,image组件其他部分显示空白。 + +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

complete(Rich)

+

{ width:width, height:height }

+

图片成功加载时触发该回调,返回成功加载的图源尺寸。

+

error(Rich)

+

{ width:width, height:height }

+

图片加载出现异常时触发该回调,异常时长宽为零。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + + +
+``` + +``` +/* xxx.css */ +.container { + justify-content: center; + align-items: center; + flex-direction: column; +} +.selects{ + margin-top: 20px; + width:300px; + border:1px solid #808080; + border-radius: 10px; +} +``` + +``` +// xxx.js +export default { + data: { + fit:"cover", + fits: ["cover", "contain", "fill", "none", "scale-down"], + }, + change_fit(e) { + this.fit = e.newValue; + }, +} +``` + +![](/images/application-dev/reference/arkui-js/figures/GIF.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/05.image-animator.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/05.image-animator.md" new file mode 100644 index 0000000000000000000000000000000000000000..e1faf6d09ec9765946a5720cbec0e4ac7a1df6a0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/05.image-animator.md" @@ -0,0 +1,431 @@ +--- +title: image-animator +permalink: /pages/000b0100010204 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# image-animator + +图片帧动画播放器。 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

images

+

Array<ImageFrame>

+

-

+

+

设置图片帧信息集合。每一帧的帧信息包含图片路径、图片大小和图片位置信息。目前支持以下图片格式:png、jpg。ImageFrame的详细说明请见表1

+
说明:

使用时需要使用数据绑定的方式,如images = {{images}},js中声明相应变量:images: [{src: "/common/heart-rate01.png"}, {src: "/common/heart-rate02.png"}]。

+

js中声明相应变量:images: [{src: "/common/heart-rate01.png", duration: "100"}, {src: "/common/heart-rate02.png", duration: "200"}]。支持配置每一帧图片的时长,单位毫秒。6+

+
+

predecode6+

+

number

+

0

+

+

是否启用预解码,默认值为0,即不启用预解码,如该值设为2,则播放当前页时会提前加载后面两张图片至缓存以提升性能。

+

iteration

+

number | string

+

infinite

+

+

设置帧动画播放次数。number表示固定次数,infinite枚举表示无限次数播放。

+

reverse

+

boolean

+

false

+

+

设置播放顺序。false表示从第1张图片播放到最后1张图片; true表示从最后1张图片播放到第1张图片。

+

fixedsize

+

boolean

+

true

+

+

设置图片大小是否固定为组件大小。 true表示图片大小与组件大小一致,此时设置图片的width 、height 、top 和left属性是无效的。false表示每一张图片的 width 、height 、top和left属性都要单独设置。

+

duration

+

string

+

-

+

+

设置单次播放时长。单位支持[s(秒)|ms(毫秒)],默认单位为ms。 duration为0时,不播放图片。 值改变只会在下一次循环开始时生效,当images中设置了单独的duration后,该属性设置无效。

+

fillmode5+

+

string

+

forwards

+

+

指定帧动画执行结束后的状态。可选项有:

+
  • none:恢复初始状态。
  • forwards:保持帧动画结束时的状态(在最后一个关键帧中定义)。
+
+ +**表 1** ImageFrame说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

src

+

<uri>

+

-

+

+

图片路径,图片格式为svg,png和jpg

+

width

+

<length>

+

0

+

+

图片宽度。

+

height

+

<length>

+

0

+

+

图片高度。

+

top

+

<length>

+

0

+

+

图片相对于组件左上角的纵向坐标。

+

left

+

<length>

+

0

+

+

图片相对于组件左上角的横向坐标。

+

duration6+

+

number

+

-

+

+

每一帧图片的播放时长,单位毫秒。

+
+ +## 样式 + +支持[通用样式](/pages/000b0100010001)。 + +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

start

+

-

+

帧动画启动时触发。

+

pause

+

-

+

帧动画暂停时触发。

+

stop

+

-

+

帧动画结束时触发。

+

resume

+

-

+

帧动画恢复时触发。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)外,还支持如下方法: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

start

+

-

+

开始播放图片帧动画。再次调用,重新从第1帧开始播放。

+

pause

+

-

+

暂停播放图片帧动画。

+

stop

+

-

+

停止播放图片帧动画。

+

resume

+

-

+

继续播放图片帧。

+

getState

+

-

+

获取播放状态。可能值有:

+
  • playing:播放中
  • paused:已暂停
  • stopped:已停止。
+
+ +## 示例 + +``` + +
+ +
+ + + + +
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + left: 0px; + top: 0px; + width: 454px; + height: 454px; +} +.animator { + width: 70px; + height: 70px; +} +.btn-box { + width: 264px; + height: 120px; + flex-wrap: wrap; + justify-content: space-around; + align-items: center; +} +.btn { + border-radius: 8px; + width: 120px; + margin-top: 8px; +} +``` + +``` +//xxx.js +export default { + data: { + frames: [ + { + src: "/common/asserts/heart78.png", + }, + { + src: "/common/asserts/heart79.png", + }, + { + src: "/common/asserts/heart80.png", + }, + { + src: "/common/asserts/heart81.png", + }, + { + src: "/common/asserts/heart82.png", + }, + { + src: "/common/asserts/heart83.png", + }, + { + src: "/common/asserts/heart84.png", + }, + { + src: "/common/asserts/heart85.png", + }, + { + src: "/common/asserts/heart86.png", + }, + { + src: "/common/asserts/heart87.png", + }, + { + src: "/common/asserts/heart88.png", + }, + { + src: "/common/asserts/heart89.png", + }, + { + src: "/common/asserts/heart90.png", + }, + { + src: "/common/asserts/heart91.png", + }, + { + src: "/common/asserts/heart92.png", + }, + { + src: "/common/asserts/heart93.png", + }, + { + src: "/common/asserts/heart94.png", + }, + { + src: "/common/asserts/heart95.png", + }, + { + src: "/common/asserts/heart96.png", + }, + ], + }, + handleStart() { + this.$refs.animator.start(); + }, + handlePause() { + this.$refs.animator.pause(); + }, + handleResume() { + this.$refs.animator.resume(); + }, + handleStop() { + this.$refs.animator.stop(); + }, +}; +``` + +![](/images/application-dev/reference/arkui-js/figures/image-animator.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/06.input.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/06.input.md" new file mode 100644 index 0000000000000000000000000000000000000000..7bd113e2715af36f37ad3befe4d44c4d732ddfde --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/06.input.md" @@ -0,0 +1,618 @@ +--- +title: input +permalink: /pages/000b0100010205 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# input + +交互式组件,包括单选框,多选框,按钮和单行文本输入框。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

type

+

string

+

text

+

+

input组件类型,可选值为text,email,date,time,number,password,button,checkbox,radio。

+

其中text,email,date,time,number,password这六种类型之间支持动态切换修改。

+

button,checkbox,radio不支持动态修改。可选值定义如下:

+
  • button:定义可点击的按钮;
  • checkbox:定义多选框;
  • radio:定义单选按钮,允许在多个拥有相同name值的选项中选中其中一个;
  • text:定义一个单行的文本字段
  • email:定义用于e-mail地址的字段;
  • date:定义 date 控件(包括年、月、日,不包括时间);
  • time:定义用于输入时间的控件(不带时区);
  • number:定义用于输入数字的字段;
  • password:定义密码字段(字段中的字符会被遮蔽)。
    说明:

    智能穿戴仅支持button、radio、checkbox类型。

    +
    +
+

checked

+

boolean

+

false

+

+

当前组件是否选中,仅type为checkbox和radio生效。

+

name

+

string

+

-

+

+

input组件的名称。

+

value

+

string

+

-

+

+

input组件的value值,当类型为radio时必填且相同name值的选项该值唯一。

+

placeholder

+

string

+

-

+

+

设置提示文本的内容,仅在type为text|email|date|time|number|password时生效。

+

maxlength

+

number

+

-

+

+

输入框可输入的最多字符数量,不填表示不限制输入框中字符数量。

+

enterkeytype

+

string

+

default

+

+

不支持动态修改。

+

设置软键盘Enter按钮的类型,可选值为:

+
  • default:默认
  • next:下一项
  • go:前往
  • done:完成
  • send:发送
  • search:搜索
+
说明:

除“next”外,点击后会自动收起软键盘。

+
+

headericon

+

string

+

-

+

+

在文本输入前的图标资源路径,该图标不支持点击事件(button,checkbox和radio不生效),图标格式为jpg,png和svg。

+

showcounter5+

+

boolean

+

false

+

+

文本输入框是否显示计数下标,需要配合maxlength一起使用。

+

menuoptions5+

+

Array<MenuOption>

+

-

+

+

设置文本选择弹框点击更多按钮之后显示的菜单项。

+

autofocus6+

+

boolean

+

false

+

+

是否自动获焦。

+
说明:

应用首页中设置不生效,可在onActive中延迟(100-500ms左右)调用focus方法实现输入框在首页中自动获焦。

+
+

selectedstart6+

+

number

+

-1

+

+

开始选择文本时初始选择位置。

+

selectedend6+

+

number

+

-1

+

+

开始选择文本时结尾选择位置。

+

softkeyboardenabled6+

+

boolean

+

true

+

+

编辑时是否弹出系统软键盘。

+

showpasswordicon6+

+

boolean

+

true

+

+

是否显示密码框末尾的图标(仅type为password时生效)。

+
+ +**表 1** MenuOption5+ + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

icon

+

string

+

菜单选项中的图标路径。

+

content

+

string

+

菜单选项中的文本内容。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#e6000000

+

+

单行输入框或者按钮的文本颜色。

+

font-size

+

<length>

+

16px

+

+

单行输入框或者按钮的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

单行输入框或者按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

placeholder-color

+

<color>

+

#99000000

+

+

单行输入框的提示文本的颜色,type为text|email|date|time|number|password时生效。

+

font-weight

+

number | string

+

normal

+

+

单行输入框或者按钮的字体粗细,见text组件font-weight的样式属性

+

caret-color6+

+

<color>

+

-

+

+

设置输入光标的颜色。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + +- 当input类型为text、email、date、time、number、password时,支持如下事件: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ value:inputValue }

+

输入框输入内容发生变化时触发该事件,返回用户当前输入值。

+
说明:

改变value属性值不会触发该回调。

+
+

enterkeyclick

+

{ value:enterKey }

+

软键盘enter键点击后触发该事件,返回enter按钮的类型,enterKey类型为number,可选值为:

+
  • 2:设置enterkeytype属性为go时生效。
  • 3:设置enterkeytype属性为search时生效。
  • 4:设置enterkeytype属性为send时生效。
  • 5:设置enterkeytype属性为next时生效。
  • 6:不设置enterkeytype或者设置enterkeytype属性为default、done时生效。
+

translate5+

+

{ value: selectedText }

+

设置此事件后,进行文本选择操作后文本选择弹窗会出现翻译按钮,点击翻译按钮之后,触发该回调,返回选中的文本内容。

+

share5+

+

{ value: selectedText }

+

设置此事件后,进行文本选择操作后文本选择弹窗会出现分享按钮,点击分享按钮之后,触发该回调,返回选中的文本内容。

+

search5+

+

{ value: selectedText }

+

设置此事件后,进行文本选择操作后文本选择弹窗会出现搜索按钮,点击搜索按钮之后,触发该回调,返回选中的文本内容。

+

optionselect5+

+

{ index:optionIndex, value: selectedText }

+

文本选择弹窗中设置menuoptions属性后,用户在文本选择操作后,点击菜单项后触发该回调,返回点击的菜单项序号和选中的文本内容。

+

selectchange6+

+

{ start: number,end: number }

+

文本选择变化时触发事件。

+
+ +- 当input类型为checkbox、radio时,支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ checked:true | false }

+

checkbox多选框或radio单选框的checked状态发生变化时触发该事件。

+
+ + +## 方法 + +除支持[通用方法](/pages/000b0100010003)外,还支持如下方法: + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

focus

+

{ focus: true|false },focus不传默认为true。

+

使组件获得或者失去焦点,type为text|email|date|time|number|password时,可弹出或收起输入法。

+

showError

+

{ error: string }

+

展示输入错误提示,type为text|email|date|time|number|password时生效。

+

delete6+

+

-

+

type为text|email|date|time|number|password时,根据当前光标位置删除文本内容,如果当前输入组件没有光标,默认删除最后一个字符并展示光标。

+
+ +## 示例 + +1. type为text + + ``` + +
+ + + +
+ ``` + + ``` + /* xxx.css */ + .content { + width: 60%; + flex-direction: column; + align-items: center; + } + .input { + placeholder-color: gray; + } + .button { + background-color: gray; + margin-top: 20px; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt' + export default { + change(e){ + prompt.showToast({ + message: "value: " + e.value, + duration: 3000, + }); + }, + enterkeyClick(e){ + prompt.showToast({ + message: "enterkey clicked", + duration: 3000, + }); + }, + buttonClick(e){ + this.$element("input").showError({ + error: 'error text' + }); + }, + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284984.png) + +2. type为button + + ``` + +
+ +
+ ``` + + ``` + /* xxx.css */ + .div-button { + flex-direction: column; + align-items: center; + } + .button { + margin-top: 30px; + width: 280px; + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001198898293.png) + +3. type为checkbox + + ``` + +
+ +
+ ``` + + ``` + /* xxx.css */ + .content{ + width: 100%; + height: 200px; + align-items: center; + justify-content: center; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt' + export default { + checkboxOnChange(e) { + prompt.showToast({ + message:'checked: ' + e.checked, + duration: 3000, + }); + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324749.png) + +4. type为radio + + ``` + +
+ + + + ``` + + ``` + /* xxx.css */ + .content{ + width: 100%; + height: 200px; + justify-content: center; + align-items: center; + } + ``` + + ``` + // xxx.js + import prompt from '@system.prompt' + export default { + onRadioChange(inputValue, e) { + if (inputValue === e.value) { + prompt.showToast({ + message: 'The chosen radio is ' + e.value, + duration: 3000, + }); + } + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324751.png) + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/07.label.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/07.label.md" new file mode 100644 index 0000000000000000000000000000000000000000..fdda627f5c093bd37fc430b3ae87c67f1756d8e5 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/07.label.md" @@ -0,0 +1,313 @@ +--- +title: label +permalink: /pages/000b0100010206 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# label + +为input、button、textarea组件定义相应的标注,点击该标注时会触发绑定组件的点击效果。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

target

+

string

+

-

+

+

目标组件的属性id值。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#e5000000

+

+

设置文本的颜色。

+

font-size

+

<length>

+

30px

+

+

设置文本的尺寸。

+

allow-scale

+

boolean

+

true

+

+

文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果需要支持动态生效,请参看config描述文件中config-changes标签。

+
+

letter-spacing

+

<length>

+

0px

+

+

设置文本的字符间距。

+

font-style

+

string

+

normal

+

+

设置文本的字体样式,可选值为:

+
  • normal:标准的字体样式;
  • italic:斜体的字体样式。
+

font-weight

+

number | string

+

normal

+

+

设置文本的字体粗细,number类型取值[100, 900],默认为400,取值越大,字体越粗。

+
说明:

number取值必须为100的整数倍。

+
+

string类型取值支持如下四个值:lighter、normal、bold、bolder。

+

text-decoration

+

string

+

none

+

+

设置文本的文本修饰,可选值为:

+
  • underline:文字下划线修饰;
  • line-through:穿过文本的修饰线n
  • none:标准文本。
+

text-align

+

string

+

start

+

+

设置文本的文本对齐方式,可选值为:

+
  • left:文本左对齐;
  • center:文本居中对齐;
  • right:文本右对齐;
  • start:根据文字书写相同的方向对齐;
  • end:根据文字书写相反的方向对齐。
+
说明:

如文本宽度未指定大小,文本的宽度和父容器的宽度大小相等的情况下,对齐效果可能会不明显。

+
+

line-height

+

<length>

+

0px

+

+

设置文本的文本行高,设置为0px时,不限制文本行高,自适应字体大小。

+

text-overflow

+

string

+

clip

+

+

在设置了最大行数的情况下生效,可选值为:

+
  • clip:将文本根据父容器大小进行裁剪显示;
  • ellipsis:根据父容器大小显示,显示不下的文本用省略号代替。需配合max-lines使用。
+

font-family

+

string

+

sans-serif

+

+

设置文本的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+

max-lines

+

number

+

-

+

+

设置文本的最大行数。

+

min-font-size

+

<length>

+

-

+

+

文本最小字号,需要和文本最大字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

+

max-font-size

+

<length>

+

-

+

+

文本最大字号,需要和文本最小字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

+

font-size-step

+

<length>

+

1px

+

+

文本动态调整字号时的步长,需要设置最小,最大字号样式生效。

+

prefer-font-sizes

+

<array>

+

-

+

+

预设的字号集合,在动态尺寸调整时,优先使用预设字号集合中的字号匹配设置的最大行数,如果预设字号集合未设置,则使用最大最小和步长调整字号。针对仍然无法满足最大行数要求的情况,使用text-overflow设置项进行截断,设置预设尺寸集后,font-size、max-font-size、min-font-size和font-size-step不生效。

+

如:prefer-font-sizes: 12px,14px,16px

+
+ +## 事件 + +不支持。 + +## 方法 + +不支持。 + +## 示例 + +``` + +
+
+ + +
+
+ + +
+
+ + +
+
+``` + +``` +/*xxx.css */ +.container { + flex-direction: column; + align-items: center; +} +.row { + flex-direction: row; +} +.label { + width: 200px; + margin-top: 50px; +} +.input { + margin-left: 100px; + margin-top: 50px; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152834002.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/08.marquee.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/08.marquee.md" new file mode 100644 index 0000000000000000000000000000000000000000..c0bc933798924218b46b815d6b0e53b8dc94e898 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/08.marquee.md" @@ -0,0 +1,296 @@ +--- +title: marquee +permalink: /pages/000b0100010207 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# marquee + +跑马灯组件,用于展示一段单行滚动的文字。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

scrollamount

+

number

+

6

+

+

跑马灯每次滚动时移动的最大长度。

+

loop

+

number

+

-1

+

+

跑马灯滚动的次数。如果未指定,则默认值为-1,当该值小于等于零时表示marquee将连续滚动。

+

direction

+

string

+

left

+

+

设置跑马灯的文字滚动方向,可选值为left和right。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#e5000000

+

+

设置跑马灯中文字的文本颜色。

+

font-size

+

<length>

+

37.5

+

+

设置跑马灯中文字的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

设置跑马灯中文字的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

font-weight

+

number | string

+

normal

+

+

设置跑马灯中文字的字体的粗细,见text组件font-weight的样式属性

+

font-family

+

string

+

sans-serif

+

+

设置跑马灯中文字的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

bounce(Rich)

+

-

+

当文本滚动到末尾时触发该事件。

+

finish(Rich)

+

-

+

当完成滚动次数时触发该事件。需要在 loop 属性值大于 0 时触发。

+

start(Rich)

+

-

+

当文本滚动开始时触发该事件。

+
+ +## 方法 + +除支持[通用方法](/pages/000b0100010003)外,还支持如下方法: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

start

+

-

+

开始滚动。

+

stop

+

-

+

停止滚动。

+
+ +## 示例 + +``` + +
+ {{marqueeCustomData}} +
+ + +
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #ffffff; +} +.customMarquee { + width: 100%; + height: 80px; + padding: 10px; + margin: 20px; + border: 4px solid #ff8888; + border-radius: 20px; + font-size: 40px; + color: #ff8888; + font-weight: bolder; + font-family: serif; + background-color: #ffdddd; +} +.content { + flex-direction: row; +} +.controlButton { + flex-grow: 1; + background-color: #F2F2F2; + text-color: #0D81F2; +} +``` + +``` +// xxx.js +export default { + data: { + scrollAmount: 30, + loop: 3, + marqueeDir: 'left', + marqueeCustomData: 'Custom marquee', + }, + onMarqueeBounce: function() { + console.log("onMarqueeBounce"); + }, + onMarqueeStart: function() { + console.log("onMarqueeStart"); + }, + onMarqueeFinish: function() { + console.log("onMarqueeFinish"); + }, + onStartClick (evt) { + this.$element('customMarquee').start(); + }, + onStopClick (evt) { + this.$element('customMarquee').stop(); + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/sample1.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/09.menu.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/09.menu.md" new file mode 100644 index 0000000000000000000000000000000000000000..dd585b531270ceeddb468fe15ff95bd7fa09c7a9 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/09.menu.md" @@ -0,0 +1,277 @@ +--- +title: menu +permalink: /pages/000b0100010208 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# menu + +提供菜单组件,作为临时性弹出窗口,用于展示用户可执行的操作。 + +## 权限列表 + +无 + +## 子组件 + +<[option](/pages/000b0100010209)\>子组件。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性:↵ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

target

+

string

+

-

+

+

目标元素选择器。当使用目标元素选择器后,点击目标元素会自动弹出menu菜单。弹出菜单位置优先为目标元素右下角,当右边可视空间不足时会适当左移,当下方空间不足时会适当上移。

+

type

+

string

+

click

+

+

目标元素触发弹窗的方式,可选值有:

+
  • click:点击弹窗。
  • longpress:长按弹窗。
+

title

+

string

+

-

+

+

菜单标题内容。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持focusable、disabled属性。 + +## 样式 + +仅支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

text-color

+

<color>

+

-

+

+

设置菜单的文本颜色。

+

font-size

+

<length>

+

30px

+

+

设置菜单的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

设置菜单的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

letter-spacing

+

<length>

+

0

+

+

设置菜单的字符间距。

+

font-style

+

string

+

normal

+

+

设置菜单的字体样式。见text组件font-style的样式属性

+

font-weight

+

number | string

+

normal

+

+

设置菜单的字体粗细。见text组件font-weight的样式属性

+

font-family

+

string

+

sans-serif

+

+

设置菜单的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+
+ +## 事件 + +仅支持如下事件: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

selected

+

{ value:value }

+

菜单中某个值被点击选中时触发,返回的value值为option组件的value属性。

+

cancel

+

-

+

用户取消。

+
+ +## 方法 + +仅支持如下方法。 + + + + + + + + + + + + +

名称

+

参数

+

描述

+

show

+

{ x:x, y:y }

+

显示menu菜单。(x, y)指定菜单弹窗位置。其中x表示距离可见区域左边沿的 X 轴坐标,不包含任何滚动偏移,y表示距离可见区域上边沿的 Y 轴坐标,不包含任何滚动偏移以及状态栏。菜单优先显示在弹窗位置右下角,当右边可视空间不足时会适当左移,当下方空间不足时会适当上移。

+
+ +## 示例 + +``` + +
+ Show popup menu. + + + + + +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.title-text { + margin: 20px; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt'; +export default { + onMenuSelected(e) { + prompt.showToast({ + message: e.value + }) + }, + onTextClick() { + this.$element("apiMenu").show({x:280,y:120}); + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/menu13.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/10.option.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/10.option.md" new file mode 100644 index 0000000000000000000000000000000000000000..14e0b1349533fb0eafd859f20794e7245dbe220b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/10.option.md" @@ -0,0 +1,182 @@ +--- +title: option +permalink: /pages/000b0100010209 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# option + +当作为<[select](/pages/000b0100010212)\>的子组件时用来展示下拉选择的具体项目。 + +当作为<[menu](/pages/000b0100010208)\>的子组件时用来展示弹出菜单的具体项目。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性:↵ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

selected

+

boolean

+

-

+

+

选择项是否为下拉列表的默认项,仅在父组件是select时生效。

+

value

+

string

+

-

+

+

选择项的值,作为select、menu父组件的selected事件中的返回值。

+
说明:

option选项的UI展示值需要放在标签内,如<option value="10">十月</option>

+
+

icon

+

string

+

-

+

+

图标资源路径,该图标展示在选项文本前,图标格式为jpg,png和svg。

+
+ +## 样式 + +支持如下样式。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#e6000000

+

+

选择项的文本颜色。

+

font-size

+

<length>

+

16px

+

+

选择项的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

选择项的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

font-weight

+

number | string

+

normal

+

+

选择项的字体粗细,见text组件font-weight的样式属性

+

text-decoration

+

string

+

none

+

+

选择项的文本修饰,见text组件text-decoration的样式属性

+

font-family

+

string

+

sans-serif

+

+

选择项的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+
+ +## 事件 + +不支持。 + +## 方法 + +不支持。 + +## 示例 + +详见[menu示例](/pages/000b0100010208#section54636714136)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/11.picker.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/11.picker.md" new file mode 100644 index 0000000000000000000000000000000000000000..a3720389a7b255d6787665cd51de3582063dab92 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/11.picker.md" @@ -0,0 +1,855 @@ +--- +title: picker +permalink: /pages/000b010001020a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# picker + +滑动选择器组件,类型支持普通选择器、日期选择器、时间选择器、时间日期选择器和多列文本选择器。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性:↵ + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

type

+

string

+

-

+

+

该属性值不支持动态修改。可选择项有:

+
  • text:文本选择器。
  • date:日期选择器。
  • time:时间选择器。
  • datetime:日期时间选择器。
  • multi-text:多列文本选择器。
+
+ +普通选择器:type=text + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

range

+

Array

+

-

+

+

设置普通选择器的取值范围,如["15", "20", "25"]。

+
说明:

使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:["15", "20", "25"]。

+
+

selected

+

string

+

0

+

+

设置普通选择器弹窗的默认取值,取值需要是 range 的索引值,该取值表示选择器弹窗时弹窗界面的默认选择值。

+

value

+

string

+

-

+

+

设置普通选择器的值。

+
+ +日期选择器:type=date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

start

+

<time>

+

1970-1-1

+

+

设置日期选择器的起始时间,格式为 YYYY-MM-DD。

+

end

+

<time>

+

2100-12-31

+

+

设置日期选择器的结束时间,格式为 YYYY-MM-DD。

+

selected

+

string

+

当前日期

+

+

设置日期选择器弹窗的默认取值,格式为 YYYY-MM-DD,该取值表示选择器弹窗时弹窗界面的默认选择值。

+

value

+

string

+

-

+

+

设置日期选择器的值。

+

lunar5+

+

boolean

+

false

+

+

设置日期选择器弹窗界面是否为农历展示。

+

lunarswitch

+

boolean

+

false

+

+

设置日期选择器是否显示农历开关。当值为true时,显示农历开关,点击农历开关可切换公历和农历。当值为false时,不显示农历开关。

+
说明:

仅手机和平板设备支持。 当lunarswitch=true且lunar=true时,开关按钮处于被选中状态。

+
+
+ +时间选择器:type=time + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

containsecond

+

boolean

+

false

+

+

设置时间选择器是否包含秒。

+

selected

+

string

+

当前时间

+

+

设置时间选择器弹窗的默认取值,格式为 HH:mm;当包含秒时,格式为HH:mm:ss,

+

该取值表示选择器弹窗时弹窗界面的默认选择值。

+

value

+

string

+

-

+

+

设置时间选择器的值。

+

hours

+

number

+

241-4

+

-5+

+

+

设置时间选择器采用的时间格式,可选值:

+
  • 12:按照12小时制显示,用上午和下午进行区分;
  • 24:按照24小时制显示。
    说明:

    默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

    +
    +
+
+ +日期时间选择器:type=datetime,日期的选择范围为本年的日月。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

selected

+

string

+

当前日期时间

+

+

设置日期时间选择器弹窗的默认取值,格式有两种,为月日时分MM-DD-HH-mm或者年月日时分YYYY-MM-DD-HH-mm,不设置年时,默认使用当前年,该取值表示选择器弹窗时弹窗界面的默认选择值。

+

value

+

string

+

-

+

+

设置日期时间选择器的值。

+

hours

+

number

+

241-4

+

-5+

+

+

设置日期时间选择器采用的时间格式,可选值:

+
  • 12:按照12小时制显示,用上午和下午进行区分;
  • 24:按照24小时制显示。
    说明:

    默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

    +
    +
+

lunar5+

+

boolean

+

false

+

+

设置日期时间选择器弹窗界面是否为农历展示。

+

lunarswitch

+

boolean

+

false

+

+

设置日期选择器是否显示农历开关。当值为true时,显示农历开关,点击农历开关可切换公历和农历。当值为false时,不显示农历开关。

+
说明:

仅手机和平板设备支持。 当lunarswitch=true且lunar=true时,开关按钮处于被选中状态。

+
+
+ +多列文本选择器:type=multi-text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

columns

+

number

+

-

+

+

设置多列文本选择器的列数。

+

range

+

二维Array

+

-

+

+

设置多列文本选择器的选择项,其中range 为二维数组。长度表示多少列,数组的每项表示每列的数据,如 [["a","b"], ["c","d"]]。

+
说明:

使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:[["a","b"], ["c","d"]]。

+
+

selected

+

Array

+

[0,0,0,…]

+

+

设置多列文本选择器弹窗的默认值,每一列被选中项对应的索引构成的数组,该取值表示选择器弹窗时弹窗界面的默认选择值。

+

value

+

Array

+

-

+

+

设置多列文本选择器的值,每一列被选中项对应的值构成的数组。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

text-color

+

<color>

+

-

+

+

选择器的文本颜色。

+

font-size

+

<length>

+

-

+

+

选择器的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

选择器的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

letter-spacing

+

<length>

+

0

+

+

选择器的字符间距。见text组件的letter-spacing样式属性

+

text-decoration

+

string

+

-

+

+

选择器的文本修饰。见text组件的text-decoration样式属性

+

font-style

+

string

+

normal

+

+

选择器的字体样式。见text组件的font-style样式属性

+

font-weight

+

number | string

+

normal

+

+

选择器的字体粗细。见text组件的font-weight样式属性

+

font-family

+

string

+

sans-serif

+

+

选择器的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+

line-height

+

<length>

+

0px

+

+

选择器的文本行高。

+

column-height5+

+

<length>

+

-

+

+

选择器的选择项列表高度。

+
说明:

仅手机和平板设备支持。

+
+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + +普通选择器: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ newValue:newValue, newSelected:newSelected }

+

普通选择器选择值后点击弹窗中的确定按钮时触发该事件(newSelected为索引)。

+

cancel

+

-

+

用户点击弹窗中的取消按钮时触发该事件。

+
+ +日期选择器: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ year:year, month:month, day:day }

+

日期选择器选择值后点击弹窗中的确认按钮时触发该事件。

+
说明:

month值范围为: 0(1月)~11(12月)。5+

+
+

cancel

+

-

+

用户点击弹窗中的取消按钮时触发该事件。

+
+ +日期时间选择器: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ year:year, month:month, day:day, hour:hour, minute:minute}

+

日期时间选择器选择值后点击弹窗中的确认按钮时触发该事件。

+

cancel

+

-

+

用户点击弹窗中的取消按钮时触发该事件。

+
+ +时间选择器: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ hour:hour, minute:minute,

+

[second:second] }

+

时间选择器选择值后点击弹窗中的确认按钮时触发该事件,当使用时分秒时,还包含秒数据。

+

cancel

+

-

+

用户点击弹窗中的取消按钮时触发该事件。

+
+ +多列文本选择器: + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ newValue:[newValue1, newValue2, newValue3, …], newSelected:[newSelected1, newSelected2, newSelected3, …] }

+

多列文本选择器选择值后点击弹窗中的确认按钮时触发该事件,其中:

+
  • newValue:被选中项对应的值构成的数组。
  • newSelected:被选中项对应的索引构成的数组,两者的长度和range的长度一致。
+

columnchange

+

{ column:column, newValue:newValue, newSelected:newSelected }

+

多列文本选择器中某一列的值改变时触发该事件,其中:

+
  • column:第几列修改。
  • newValue:选中的值。
  • newSelected:选中值对应的索引。
+

cancel

+

-

+

用户点击弹窗中的取消按钮时触发该事件。

+
+ +## 方法 + +除支持[通用方法](/pages/000b0100010003)外,支持如下方法: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

show

+

-

+

显示 picker。

+
+ +## 示例 + +``` + +
+ + + + + + + + + +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; +} +.pickertext{ + background-color: red; + width: 300; + height: 400; +} +.pickerdate{ + background-color: #BEFF5B; + width: 200; + height: 200; +} +.pickertime{ + background-color: #B764FF; + width: 500; + height: 200; +} +.pickerdatetime{ + background-color: #FF6387; + width: 100%; + height: 300; +} +.pickermuitl{ + background-color: #71FF31; +} +``` + +``` +// xxx.js +import router from '@system.router'; +import prompt from '@system.prompt'; +export default { + data: { + rangetext:['15', "20", "25"], + multitext:[["a", "b", "c"], ["e", "f", "g"], ["h", "i"], ["k", "l", "m"]], + textvalue:'default textvalue', + datevalue:'default datevalue', + timevalue:'default timevalue', + datetimevalue:'default datetimevalue', + multitextvalue:'default multitextvalue', + containsecond:true, + multitextselect:[1,2,0], + datetimeselect:'2012-5-6-11-25', + timeselect:'11:22:30', + dateselect:'2021-3-2', + textselect:'2' + }, + textonchange(e) { + this.textvalue = e.newValue; + prompt.showToast({ message:"text:"+e.newValue+",newSelected:"+e.newSelected }) + }, + textoncancel(e) { + prompt.showToast({ message:"text: textoncancel" }) + }, + dateonchange(e) { + this.datevalue = e.year + "-" + e.month + "-" + e.day; + prompt.showToast({ message:"date:"+e.year+"-"+e.month+"-"+e.day }) + }, + dateoncancel() { + prompt.showToast({ message:"date: dateoncancel" }) + }, + timeonchange(e) { + if(this.containsecond){ + this.timevalue=e.hour+":"+e.minute+":"+e.second; + prompt.showToast({ message:"时间:" + e.hour + ":" + e.minute + ":" + e.second }) + } else { + this.timevalue=e.hour+":"+e.minute; + prompt.showToast({ message:"时间:" + e.hour + ":" + e.minute }) + }}, + timeoncancel() { + prompt.showToast({ message:"timeoncancel" }) + }, + datetimeonchange(e) { + this.datetimevalue=e.year+"-"+e.month+"-"+e.day+" "+e.hour+":"+e.minute; + prompt.showToast({ message:"时间:"+e.month+"-"+e.day+" "+e.hour+":"+e.minute }) + }, + datetimeoncancel() { + prompt.showToast({ message:"datetimeoncancel" }) + }, + multitextonchange(e) { + this.multitextvalue=e.newValue; + prompt.showToast({ message:"多列文本更改" + e.newValue }) + }, + multitextoncancel() { + prompt.showToast({ message:"multitextoncancel" }) + }, + popup_picker() { + this.$element("picker_text").show(); + }, +} +``` + +**图 1** text +![](/images/application-dev/reference/arkui-js/figures/text.png "text") + +**图 2** date + + +![](/images/application-dev/reference/arkui-js/figures/date33.png) + +**图 3** time +![](/images/application-dev/reference/arkui-js/figures/time.png "time") + +**图 4** datetime +![](/images/application-dev/reference/arkui-js/figures/datetime.png "datetime") + +**图 5** multitext +![](/images/application-dev/reference/arkui-js/figures/multitext.png "multitext") + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/12.picker-view.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/12.picker-view.md" new file mode 100644 index 0000000000000000000000000000000000000000..334325197a78bd7b06ac65d5fddc1e9997f0fa05 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/12.picker-view.md" @@ -0,0 +1,650 @@ +--- +title: picker-view +permalink: /pages/000b010001020b +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:37 +--- +# picker-view + +嵌入页面的滑动选择器。 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

type

+

string

+

text

+

+

设置滑动选择器的类型,该属性不支持动态修改,可选项有:

+
  • text:文本选择器。
  • time:时间选择器。
  • date:日期选择器。
  • datetime:日期时间选择器。
  • multi-text:多列文本选择器。
+
+ +文本选择器:type=text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

range

+

Array

+

-

+

+

设置文本选择器的取值范围。

+
说明:

使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:["15", "20", "25"]。

+
+

selected

+

string

+

0

+

+

设置文本选择器的默认选择值,该值需要为range的索引。

+

indicatorprefix

+

string

+

-

+

+

文本选择器选定值增加的前缀字段。

+

indicatorsuffix

+

string

+

-

+

+

文本选择器选定值增加的后缀字段。

+
+ +时间选择器:type=time + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

containsecond

+

boolean

+

false

+

+

时间选择器是否包含秒。

+

selected

+

string

+

当前时间

+

+

设置时间选择器的默认取值,格式为 HH:mm;

+

当包含秒时,格式为HH:mm:ss。

+

hours

+

number

+

241-4

+

-5+

+

+

设置时间选择器采用的时间格式,可选值:

+
  • 12:按照12小时制显示,用上午和下午进行区分;
  • 24:按照24小时制显示。
    说明:

    默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

    +
    +
+
+ +日期选择器:type=date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

start

+

<time>

+

1970-1-1

+

+

设置日期选择器的起始时间,格式为 YYYY-MM-DD。

+

end

+

<time>

+

2100-12-31

+

+

设置日期选择器的结束时间,格式为 YYYY-MM-DD。

+

selected

+

string

+

当前日期

+

+

设置日期选择器的默认选择值,格式为 YYYY-MM-DD。

+

lunar5+

+

boolean

+

false

+

+

设置日期选择器弹窗界面是否为农历展示。

+

lunarswitch

+

boolean

+

false

+

+

设置日期选择器是否显示农历开关,显示农历开关时,可以在弹窗界面展现农历的开关由于公历和农历切换。在设置显示农历时,开关状态为开,当设置不显示农历时,开关状态为关。手机生效。

+
说明:

仅手机和平板设备支持。

+
+
+ +日期时间选择器:type=datetime,日期的选择范围为本年的日月。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

selected

+

string

+

当前日期时间

+

+

设置日期时间选择器的默认取值,格式有两种,为月日时分MM-DD-HH-mm或者年月日时分YYYY-MM-DD-HH-mm,不设置年时,默认使用当前年,该取值表示选择器弹窗时弹窗界面的默认选择值。

+

hours

+

number

+

241-4

+

-5+

+

+

设置日期时间选择器采用的时间格式,可选值:

+
  • 12:按照12小时制显示,用上午和下午进行区分;
  • 24:按照24小时制显示。
    说明:

    默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

    +
    +
+

lunar5+

+

boolean

+

false

+

+

设置日期时间选择器弹窗界面是否为农历展示。

+

lunarswitch

+

boolean

+

false

+

+

设置日期时间选择器是否显示农历开关,显示农历开关时,可以在弹窗界面展现农历的开关由于公历和农历切换。在设置显示农历时,开关状态为开,当设置不显示农历时,开关状态为关。手机生效。

+
说明:

仅手机和平板设备支持。

+
+
+ +多列文本选择器:type=multi-text + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

columns

+

number

+

-

+

+

设置多列文本选择器的列数。

+

range

+

二维Array

+

-

+

+

设置多列文本选择器的选择值,该值为二维数组。长度表示多少列,数组的每项表示每列的数据,如 [["a","b"], ["c","d"]]。

+
说明:

使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:[["a","b"], ["c","d"]]。

+
+

selected

+

Array

+

[0,0,0,…]

+

+

设置多列文本选择器的默认值,每一列被选中项对应的索引构成的数组,该取值表示选择器弹窗时弹窗界面的默认选择值。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#ffffff

+

+

候选项字体颜色。

+

font-size

+

<length>

+

16px

+

+

候选项字体尺寸,类型length,单位px。

+

selected-color

+

<color>

+

#ff0a69f7

+

+

选中项字体颜色。

+

selected-font-size

+

<length>

+

20px

+

+

选中项字体尺寸,类型length,单位px。

+

disappear-color5+

+

<color>

+

#ffffff

+

+

渐变消失项的字体颜色。消失项是在一列中有五个选项场景下最上和最下的两个选项。

+
说明:

仅手机和平板设备支持。

+
+

disappear-font-size5+

+

<length>

+

14px

+

+

渐变消失项的字体尺寸。消失项是在一列中有五个选项场景下最上和最下的两个选项。

+
说明:

仅手机和平板设备支持。

+
+

font-family

+

string

+

sans-serif

+

+

选项字体类型。字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+
+ +## 事件 + +仅支持如下事件: + +type=text: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ newValue: newValue, newSelected: newSelected }

+

文本选择器选定值后触发该事件。

+
+ +type=time: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ hour: hour, minute: minute, [second:second] }

+

时间选择器选定值后触发该事件。

+

包含秒时,返回时分秒。

+
+ +type=date: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ year:year, month:month, day:day }

+

日期选择器选择值后触发该事件。

+
+ +type=datetime: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ year:year, month:month, day:day, hour:hour, minute:minute }

+

日期时间选择器选择值后触发该事件。

+
+ +type=multi-text: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

columnchange

+

{ column:column, newValue:newValue, newSelected:newSelected }

+

多列文本选择器某一列的值改变时触发该事件,column:第几列修改,newValue:选中的值,newSelected:选中值对应的索引。

+
+ +## 方法 + +不支持。 + +## 示例 + +``` + +
+ + Selected:{{time}} + + +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + left: 0px; + top: 0px; + width: 454px; + height: 454px; +} +.title { + font-size: 30px; + text-align: center; +} +.time-picker { + width: 500px; + height: 400px; + margin-top: 20px; +} +``` + +``` +/* xxx.js */ +export default { + data: { + defaultTime: "", + time: "", + }, + onInit() { + this.defaultTime = this.now(); + }, + handleChange(data) { + this.time = this.concat(data.hour, data.minute); + }, + now() { + const date = new Date(); + const hours = date.getHours(); + const minutes = date.getMinutes(); + return this.concat(hours, minutes); + }, + + fill(value) { + return (value > 9 ? "" : "0") + value; + }, + + concat(hours, minutes) { + return `${this.fill(hours)}:${this.fill(minutes)}`; + }, +} +``` + +![](/images/application-dev/reference/arkui-js/figures/sssssss.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/13.piece.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/13.piece.md" new file mode 100644 index 0000000000000000000000000000000000000000..193c6f55e8154e1f6dd7e5ae11d683d420ace642 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/13.piece.md" @@ -0,0 +1,146 @@ +--- +title: piece +permalink: /pages/000b010001020c +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# piece + +一种块状的入口,可包含图片和文本。常用于展示收件人,例如:邮件收件人或信息收件人。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 5 开始支持。 + +## 子组件 + +无 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

content

+

string

+

-

+

+

操作块文本内容。

+

closable

+

boolean

+

false

+

+

设置当前操作块是否显示删除图标,当显示删除图标时,点击删除图标会触发close事件。

+

icon

+

string

+

-

+

+

操作块删除图标的url,支持本地。

+
+ +## 样式 + +支持[通用样式](/pages/000b0100010001)。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>文本和图片默认在整个piece组件中居中。 + +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

close

+

-

+

当piece组件点击删除图标触发,此时可以通过渲染属性if删除该组件。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + +
+``` + +``` +/* xxx.css */ +.container { + width: 100%; + height: 100%; + align-items: center; + justify-content: center; +} +``` + +``` +// xxx.js +export default { + data: { + first: true, + second: true + }, + closeSecond(e) { + this.second = false; + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/11-1.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/14.progress.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/14.progress.md" new file mode 100644 index 0000000000000000000000000000000000000000..a8d8f8bc70d28d9d810b7b9b36b1e02b2201a6e6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/14.progress.md" @@ -0,0 +1,526 @@ +--- +title: progress +permalink: /pages/000b010001020d +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# progress + +进度条,用于显示内容加载或操作处理进度。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

type

+

string

+

horizontal

+

+

设置进度条的类型,该属性不支持动态修改,可选值为:

+
  • horizontal:线性进度条;
  • circular:loading样式进度条;
  • ring:圆环形进度条;
  • scale-ring:带刻度圆环形进度条
  • arc:弧形进度条。
  • eclipse5+:圆形进度条,展现类似月圆月缺的进度展示效果。
+
+ +不同类型的进度条还支持不同的属性: + +- 类型为horizontal、ring、scale-ring时,支持如下属性: + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

percent

+

number

+

0

+

+

当前进度。取值范围为0-100。

+

secondarypercent

+

number

+

0

+

+

次级进度。取值范围为0-100。

+
+ +- 类型为ring、scale-ring时,支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

clockwise

+

boolean

+

true

+

+

圆环形进度条是否采用顺时针。

+
+ +- 类型为arc、eclipse5+时,支持如下属性: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

percent

+

number

+

0

+

+

当前进度。取值范围为0-100。

+
+ + +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + +type=horizontal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#ff007dff

+

+

设置进度条的颜色。

+

stroke-width

+

<length>

+

4px

+

+

+

设置进度条的宽度。

+

background-color

+

<color>

+

-

+

+

设置进度条的背景色。

+

secondary-color

+

<color>

+

-

+

+

设置次级进度条的颜色。

+
+ +type=circular + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

-

+

+

loading进度条上的圆点颜色。

+
+ +type=ring, scale-ring + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color> | <linear-gradient>

+

-

+

+

环形进度条的颜色,ring类型支持线性渐变色设置。

+
说明:

线性渐变色仅支持两个颜色参数设置格式,如color = linear-gradient(#ff0000, #00ff00)。

+
+

background-color

+

<color>

+

-

+

+

环形进度条的背景色。

+

secondary-color

+

<color>

+

-

+

+

环形次级进度条的颜色。

+

stroke-width

+

<length>

+

10px

+

+

环形进度条的宽度。

+

scale-width

+

<length>

+

-

+

+

带刻度的环形进度条的刻度粗细,类型为scale-ring生效。

+

scale-number

+

number

+

120

+

+

带刻度的环形进度条的刻度数量,类型为scale-ring生效。

+
+ +type=arc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

-

+

+

+

弧形进度条的颜色。

+

background-color

+

<color>

+

-

+

+

+

弧形进度条的背景色。

+

stroke-width

+

<length>

+

4px

+

+

弧形进度条的宽度。

+
说明:

进度条宽度越大,进度条越靠近圆心,进度条始终在半径区域内。

+
+

start-angle

+

<deg>

+

240

+

+

弧形进度条起始角度,以时钟0点为基线,取值范围为0到360(顺时针)。

+

total-angle

+

<deg>

+

240

+

+

弧形进度条总长度,范围为-360到360,负数标识起点到终点为逆时针。

+

center-x

+

<length>

+

弧形进度条宽度的一半

+

+

弧形进度条中心位置,(坐标原点为组件左上角顶点)。该样式需要和center-y和radius一起使用。

+

center-y

+

<length>

+

弧形进度条高度的一半

+

+

弧形进度条中心位置,(坐标原点为组件左上角顶点)。该样式需要和center-x和radius一起使用。

+

radius

+

<length>

+

弧形进度条宽高最小值的一半

+

+

弧形进度条半径,该样式需要和center-x和center-y一起使用。

+
+ +type=eclipse5+ + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

-

+

+

圆形进度条的颜色。

+

background-color

+

<color>

+

-

+

+

弧形进度条的背景色。

+
+ +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + + + +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + height: 100%; + width: 100%; + align-items: center; +} +.min-progress { + width: 300px; + height: 300px; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/progress.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/15.qrcode.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/15.qrcode.md" new file mode 100644 index 0000000000000000000000000000000000000000..e03022e6dc29d3ca8a093f2329d896b05c29a202 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/15.qrcode.md" @@ -0,0 +1,196 @@ +--- +title: qrcode +permalink: /pages/000b010001020e +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# qrcode + +生成并显示二维码。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 5 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

value

+

string

+

-

+

+

用来生成二维码的内容。

+

type

+

string

+

rect

+

+

二维码类型。可能选项有:

+
  • rect:矩形二维码。
  • circle:圆形二维码。
+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#000000

+

+

二维码颜色。

+

background-color

+

<color>

+

#ffffff

+

+

二维码背景颜色。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- width和height不一致时,取二者较小值作为二维码的边长。且最终生成的二维码居中显示。 +>- width和height只设置一个时,取设置的值作为二维码的边长。都不设置时,使用200px作为默认边长。 + +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + Type + + Color + + Background Color + +
+``` + +``` +/* xxx.css */ +.container { + width: 100%; + height: 100%; + flex-direction: column; + justify-content: center; + align-items: center; +} +.txt { + margin: 30px; + color: orangered; +} +select{ + margin-top: 40px; + margin-bottom: 40px; +} +``` + +``` +/* index.js */ +export default { + data: { + qr_type: 'rect', + qr_size: '300px', + qr_col: '#87ceeb', + col_list: ['#87ceeb','#fa8072','#da70d6','#80ff00ff','#00ff00ff'], + qr_bcol: '#f0ffff', + bcol_list: ['#f0ffff','#ffffe0','#d8bfd8'] + }, + settype(e) { + if (e.checked) { + this.qr_type = 'rect' + } else { + this.qr_type = 'circle' + } + }, + setvalue(e) { + this.qr_value = e.newValue + }, + setcol(e) { + this.qr_col = e.newValue + }, + setbcol(e) { + this.qr_bcol = e.newValue + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/12.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/16.rating.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/16.rating.md" new file mode 100644 index 0000000000000000000000000000000000000000..8f95959ff46a26f5ae55ae02b255e5ddd3aaa376 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/16.rating.md" @@ -0,0 +1,245 @@ +--- +title: rating +permalink: /pages/000b010001020f +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# rating + +评分条,表示用户使用感受的衡量标准条。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

numstars

+

number

+

5

+

+

设置评分条的星级总数。

+

rating

+

number

+

0

+

+

设置评分条当前评星数。

+

stepsize

+

number

+

0.5

+

+

设置评分条的评星步长。

+
说明:

仅手机和平板设备支持

+
+

indicator

+

boolean

+

false

+

+

设置评分条是否作为一个指示器,此时用户不可操作。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

star-background

+

string

+

-

+

+

设置单个星级未选中的背景图片,只支持本地路径图片,图片格式为png和jpg。

+

star-foreground

+

string

+

-

+

+

设置单个星级选中的前景图片,只支持本地路径图片,图片格式为png和jpg。

+

star-secondary

+

string

+

-

+

+

设置单个星级部分选中的次级背景图片,该图片会覆盖背景图片,只支持本地路径图片,图片格式为png和jpg。

+

width

+

<length>|<percentage>

+

120px

+

60px(不可操作)

+

+

默认值是在未设置自定义资源和评分星数时,使用5个星和默认资源下的宽度值。

+

height

+

<length>|<percentage>

+

24px

+

12px(不可操作)

+

+

默认值是在未设置自定义资源和评分星数时,使用5个星和默认资源下的高度值。

+

rtl-flip

+

boolean

+

true

+

+

在RTL文字方向下是否自动翻转图源。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>star-background,star-secondary,star-foreground三个星级图源必须全部设置,否则默认的星级颜色为灰色,以此提示图源设置错误。 + +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ rating: number }

+

评分条的评星发生改变时触发该回调。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + +
+``` + +``` +/* xxx.css */ +.container { + display: flex; + justify-content: center; + align-items: center; +} +rating { + width: 200px; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt'; +export default { + changeRating(e){ + prompt.showToast({ + message: e.rating + }); + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001198670487.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/17.richtext.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/17.richtext.md" new file mode 100644 index 0000000000000000000000000000000000000000..9d9691662464549f4a16d1afd0f0c2b79b08c3ee --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/17.richtext.md" @@ -0,0 +1,105 @@ +--- +title: richtext +permalink: /pages/000b0100010210 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# richtext + +富文本组件,用于展示富文本信息。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 从 API Version 6 开始支持。 +>- 富文本内容需要写在元素标签内。 + +## 权限列表 + +无 + +## 属性 + +仅支持[通用属性](/pages/000b0100010000)中的id、style和class属性。 + +## 样式 + +仅支持[通用样式](/pages/000b0100010001)中的display和visibility样式。 + +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

start

+

-

+

开始加载时触发。

+

complete

+

-

+

加载完成时触发。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持focus、blur、key事件。 +>- 不支持无障碍事件。 +>- 包含richtext的页面返回时richtext显示区域不会跟随页面的转场动效。 +>- richtext内容不建议超过一个屏幕高度,超出部分不会显示。 + +## 方法 + +不支持。 + +## 示例 + +``` + +
+ {{content}} +
+``` + +``` +// xxx.js +export default { + data: { + content: ` +
+ +

h1

+

文本测试(h1测试)

+

h2

+

文本测试(h2测试)

+
+ `, + }, + onLoadStart() { + console.error("start load rich text:" + JSON.stringify()) + }, + onLoadEnd() { + console.error("end load rich text:" + JSON.stringify()) + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/18.search.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/18.search.md" new file mode 100644 index 0000000000000000000000000000000000000000..b5e0dd70750b7aabfae335be7220e3ded92597e4 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/18.search.md" @@ -0,0 +1,308 @@ +--- +title: search +permalink: /pages/000b0100010211 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# search + +提供搜索框组件,用于提供用户搜索内容的输入区域。 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

icon

+

string

+

-

+

+

搜索图标,默认使用系统搜索图标,图标格式为svg,jpg和png。

+

hint

+

string

+

-

+

+

搜索提示文字。

+

value

+

string

+

-

+

+

搜索框搜索文本值。

+

searchbutton5+

+

string

+

-

+

+

搜索框末尾搜索按钮文本值。

+

menuoptions5+

+

Array<MenuOption>

+

-

+

+

设置文本选择弹框点击更多按钮之后显示的菜单项。

+
+ +**表 1** MenuOption5+ + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

icon

+

string

+

菜单选项中的图标路径。

+

content

+

string

+

菜单选项中的文本内容。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#e6000000

+

+

搜索框的文本颜色。

+

font-size

+

<length>

+

16px

+

+

搜索框的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

搜索框的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

placeholder-color

+

<color>

+

#99000000

+

+

搜索框的提示文本颜色。

+

font-weight

+

number | string

+

normal

+

+

搜索框的字体粗细,见text组件font-weight的样式属性

+

font-family

+

string

+

sans-serif

+

+

搜索框的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+

caret-color6+

+

<color>

+

-

+

+

设置输入光标的颜色。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ text:newText }

+

输入内容发生变化时触发。

+
说明:

改变value属性值不会触发该回调。

+
+

submit

+

{ text:submitText }

+

点击搜索图标、搜索按钮5+或者按下软键盘搜索按钮时触发。

+

translate5+

+

{ value: selectedText }

+

设置此事件后,进行文本选择操作后文本选择弹窗会出现翻译按钮,点击翻译按钮之后,触发该回调,返回选中的文本内容。

+

share5+

+

{ value: selectedText }

+

设置此事件后,进行文本选择操作后文本选择弹窗会出现分享按钮,点击分享按钮之后,触发该回调,返回选中的文本内容。

+

search5+

+

{ value: selectedText }

+

设置此事件后,进行文本选择操作后文本选择弹窗会出现搜索按钮,点击搜索按钮之后,触发该回调,返回选中的文本内容。

+

optionselect5+

+

{ index:optionIndex, value: selectedText }

+

文本选择弹窗中设置menuoptions属性后,用户在文本选择操作后,点击菜单项后触发该回调,返回点击的菜单项序号和选中的文本内容。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + +
+``` + +``` +/* xxx.css */ +.container { + display: flex; + justify-content: center; + align-items: center; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001153427082.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/19.select.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/19.select.md" new file mode 100644 index 0000000000000000000000000000000000000000..5392efb007a56168dc28b5158c6427e30cde3ac6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/19.select.md" @@ -0,0 +1,120 @@ +--- +title: select +permalink: /pages/000b0100010212 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# select + +下拉选择按钮,可让用户在多个选项之间选择。 + +## 权限列表 + +无 + +## 子组件 + +支持<[option](/pages/000b0100010209)\>。 + +## 属性 + +支持[通用属性](/pages/000b0100010000)。 + +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

font-family

+

string

+

sans-serif

+

+

字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{newValue: newValue}

+

下拉选择新值后触发该事件,newValue的值为子组件option的value属性值。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- select组件不支持click事件。 + +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ +
+``` + +``` +/* xxx.css */ +.container { + display: flex; + justify-content: center; + align-items: center; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152588538.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/20.slider.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/20.slider.md" new file mode 100644 index 0000000000000000000000000000000000000000..0ce48217b58ad2c07d23c9e3dc98a8f018b47155 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/20.slider.md" @@ -0,0 +1,294 @@ +--- +title: slider +permalink: /pages/000b0100010213 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# slider + +滑动条组件,用来快速调节设置值,如音量、亮度等。 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

min

+

number

+

0

+

+

滑动选择器的最小值。

+

max

+

number

+

100

+

+

滑动选择器的最大值。

+

step

+

number

+

1

+

+

每次滑动的步长。

+

value

+

number

+

0

+

+

滑动选择器的初始值。

+

mode5+

+

string

+

outset

+

+

滑动条样式:

+
  • outset:滑块在滑杆上;
  • inset:滑块在滑杆内。
    说明:

    仅手机和平板设备支持。

    +
    +
+

showsteps5+

+

boolean

+

false

+

+

是否显示步长标识;

+
说明:

仅手机和平板设备支持。

+
+

showtips5+

+

boolean

+

false

+

+

滑动时是否有气泡提示百分比;

+
说明:

仅手机和平板设备支持。

+
+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#19000000

+

+

滑动条的背景颜色。

+

selected-color

+

<color>

+

#ff007dff

+

+

滑动条的已选择颜色。

+

block-color

+

<color>

+

#ffffff

+

+

滑动条的滑块颜色。

+
说明:

仅手机、平板和智慧屏设备支持。

+
+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

ChangeEvent

+

选择值发生变化时触发该事件。

+
+ +**表 1** ChangeEvent + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

说明

+

progress(deprecated5+)

+

string

+

当前slider的进度值。

+

isEnd(deprecated5+)

+

string

+

当前slider是否拖拽结束,可选值为:

+
  • true:slider拖拽结束。
  • false:slider拖拽中。
+

value5+

+

number

+

当前slider的进度值。

+

mode5+

+

string

+

当前change事件的类型,可选值为:

+
  • start:slider的值开始改变。
  • move:slider的值跟随手指拖动中。
  • end:slider的值结束改变。
+
+ +## 示例 + +``` + +
+ slider start value is {{startValue}} + slider current value is {{currentValue}} + slider end value is {{endValue}} + +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; +} +``` + +``` +// xxx.js +export default { + data: { + value: 0, + startValue: 0, + currentValue: 0, + endValue: 0, + }, + setvalue(e) { + if (e.mode == "start") { + this.value = e.value; + this.startValue = e.value; + } else if (e.mode == "move") { + this.value = e.value; + this.currentValue = e.value; + } else if (e.mode == "end") { + this.value = e.value; + this.endValue = e.value; + } + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/slider.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/21.span.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/21.span.md" new file mode 100644 index 0000000000000000000000000000000000000000..c9cb3720ab0e946b22d51f9dfe64c06bcd399e6d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/21.span.md" @@ -0,0 +1,171 @@ +--- +title: span +permalink: /pages/000b0100010214 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# span + +作为<[text](/pages/000b0100010216)\>子组件提供文本修饰能力。 + +## 权限列表 + +无 + +## 子组件 + +支持子组件。 + +## 属性 + +支持[通用属性](/pages/000b0100010000)。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持focusable和disabled属性。 + +## 样式 + +仅支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

-

+

+

设置文本段落的文本颜色。

+

font-size

+

<length>

+

30px

+

+

设置文本段落的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

设置文本段落的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

font-style

+

string

+

normal

+

+

设置文本段落的字体样式,见text组件font-style的样式属性

+

font-weight

+

number | string

+

normal

+

+

设置文本段落的字体粗细,见text组件font-weight的样式属性

+

text-decoration

+

string

+

none

+

+

设置文本段落的文本修饰,见text组件text-decoration样式属性

+

font-family

+

string

+

sans-serif

+

+

设置文本段落的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+
+ +## 事件 + +仅支持[通用事件](/pages/000b0100010002)中的click事件。 + +## 方法 + +不支持。 + +## 示例 + +``` + +
+ + span + +
+``` + +``` +/* xxx.css */ +.container { + display: flex; + justify-content: center; + align-items: center; +} +.title { + font-size: 30px; + text-align: center; + width: 100%; + height: 100px; +} +.spanTxt{ + color: chartreuse; + font-size: 100px; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152588626.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/22.switch.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/22.switch.md" new file mode 100644 index 0000000000000000000000000000000000000000..25f0690e7e98503011152fa8cfceb32f4c99aca1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/22.switch.md" @@ -0,0 +1,274 @@ +--- +title: switch +permalink: /pages/000b0100010215 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# switch + +开关选择器,通过开关,开启或关闭某个功能。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

checked

+

boolean

+

false

+

+

是否选中。

+

showtext

+

boolean

+

false

+

+

是否显示文本。

+

texton

+

string

+

"On"

+

+

选中时显示的文本。

+

textoff

+

string

+

"Off"

+

+

未选中时显示的文本。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

texton-color(Rich)

+

<color>

+

#000000

+

+

选中时显示的文本颜色。

+

textoff-color(Rich)

+

<color>

+

#000000

+

+

未选中时显示的文本颜色。

+

text-padding(Rich)

+

number

+

0px

+

+

texton/textoff中最长文本两侧距离滑块边界的距离。

+

font-size(Rich)

+

<length>

+

-

+

+

文本尺寸,仅设置texton和textoff生效。

+

allow-scale(Rich)

+

boolean

+

true

+

+

文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

font-style(Rich)

+

string

+

normal

+

+

字体样式,仅设置texton和textoff生效。见text组件font-style的样式属性

+

font-weight(Rich)

+

number | string

+

normal

+

+

字体粗细,仅设置texton和textoff生效。见text组件的font-weight的样式属性

+

font-family(Rich)

+

string

+

sans-serif

+

+

字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。仅设置texton和textoff生效。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ checked: checkedValue }

+

选中状态改变时触发该事件。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + +
+``` + +``` +/* xxx.css */ +.container { + display: flex; + justify-content: center; + align-items: center; +} +switch{ + texton-color:#002aff; + textoff-color:silver; + text-padding:20px; +} +``` + +``` +// xxx.js +import prompt from '@system.prompt'; +export default { + data: { + title: 'World' + }, + switchChange(e){ + console.log(e.checked); + if(e.checked){ + prompt.showToast({ + message: "打开开关" + }); + }else{ + prompt.showToast({ + message: "关闭开关" + }); + } + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152862510.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/23.text.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/23.text.md" new file mode 100644 index 0000000000000000000000000000000000000000..cb9171b4e09ada33bfa21a837489a860f252c05f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/23.text.md" @@ -0,0 +1,418 @@ +--- +title: text +permalink: /pages/000b0100010216 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# text + +文本,用于呈现一段信息。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>文本的展示内容需要写在元素标签内。 + +## 权限列表 + +无 + +## 子组件 + +支持<[span](/pages/000b0100010214)\>。 + +## 属性 + +支持[通用属性](/pages/000b0100010000)。 + +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#e5000000

+

+

设置文本的颜色。

+

font-size

+

<length>

+

30px

+

+

设置文本的尺寸。

+

allow-scale

+

boolean

+

true

+

+

文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果需要支持动态生效,请参看config描述文件中config-changes标签。

+
+

letter-spacing

+

<length>

+

0px

+

+

设置文本的字符间距。

+

word-spacing7+

+

<length> | <percentage> | string

+

normal

+

+

设置文本之间的间距,string可选值为:

+

normal:默认的字间距。

+

font-style

+

string

+

normal

+

+

设置文本的字体样式,可选值为:

+
  • normal:标准的字体样式;
  • italic:斜体的字体样式。
+

font-weight

+

number | string

+

normal

+

+

设置文本的字体粗细,number类型取值[100, 900],默认为400,取值越大,字体越粗。

+
说明:

number取值必须为100的整数倍。

+
+

string类型取值支持如下四个值:lighter、normal、bold、bolder。

+

text-decoration

+

string

+

none

+

+

设置文本的文本修饰,可选值为:

+
  • underline:文字下划线修饰;
  • line-through:穿过文本的修饰线n
  • none:标准文本。
+

text-decoration-color7+

+

<color>

+

-

+

+

设置文本修饰线的颜色。

+

text-align

+

string

+

start

+

+

设置文本的文本对齐方式,可选值为:

+
  • left:文本左对齐;
  • center:文本居中对齐;
  • right:文本右对齐;
  • start:根据文字书写相同的方向对齐;
  • end:根据文字书写相反的方向对齐。
+
说明:

如文本宽度未指定大小,文本的宽度和父容器的宽度大小相等的情况下,对齐效果可能会不明显。

+
+

line-height

+

<length> | <percentage>7+ | string7+

+

0px1-6

+

normal7+

+

+

设置文本的文本行高,设置为0px时,不限制文本行高,自适应字体大小。string可选值为:

+

normal7+:默认的行高。

+

text-overflow

+

string

+

clip

+

+

在设置了最大行数的情况下生效,可选值为:

+
  • clip:将文本根据父容器大小进行裁剪显示;
  • ellipsis:根据父容器大小显示,显示不下的文本用省略号代替。需配合max-lines使用。
+

font-family

+

string

+

sans-serif

+

+

设置文本的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+

max-lines

+

number | string7+

+

-

+

+

设置文本的最大行数,string类型可选值为:

+
  • auto7+:文本行数自适应容器高度。
+

min-font-size

+

<length>

+

-

+

+

文本最小字号,需要和文本最大字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

+

max-font-size

+

<length>

+

-

+

+

文本最大字号,需要和文本最小字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

+

font-size-step

+

<length>

+

1px

+

+

文本动态调整字号时的步长,需要设置最小,最大字号样式生效。

+

prefer-font-sizes

+

<array>

+

-

+

+

预设的字号集合,在动态尺寸调整时,优先使用预设字号集合中的字号匹配设置的最大行数,如果预设字号集合未设置,则使用最大最小和步长调整字号。针对仍然无法满足最大行数要求的情况,使用text-overflow设置项进行截断,设置预设尺寸集后,font-size、max-font-size、min-font-size和font-size-step不生效。

+

如:prefer-font-sizes: 12px,14px,16px

+

word-break6+

+

string

+

normal

+

+

设置文本折行模式,可选值为:

+
  • normal:默认换行规则,依据各自语言的规则,允许在字间发生换行。
  • break-all:对于非中文/日文/韩文的文本,可在任意字符间断行。
  • break-word:与break-all相同,不同的地方在于它要求一个没有断行破发点的词必须保持为一个整体单位。
+

text-indent7+

+

<length>

+

-

+

+

设置首行缩进量。

+

white-space7+

+

string

+

pre

+

+

设置处理元素中空白的模式,可选值为:

+
  • normal:所有空格、回车、制表符都合并成一个空格,文本自动换行;
  • nowrap:所有空格、回车、制表符都合并成一个空格,文本不换行;
  • pre:所有东西原样输出,文本不换行;
  • pre-wrap:所有东西原样输出,文本换行;
  • pre-line:所有空格、制表符合并成一个空格,回车不变,文本换行。
+

adapt-height7+

+

boolean

+

false

+

+

文本大小是否自适应容器高度。

+
说明:

设置字体大小自适应相关样式后生效。

+
+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 字体动态缩放:预设尺寸集合和最小最大字号调节基于是否满足最大行数要求,预设尺寸集合会按照从左到右顺序查看是否满足最大行数要求,最小最大字号调节则基于从大到小顺序查看是否满足最大行数要求。 +>- 文本换行:文本可以通过转义字符\\r\\n进行换行。 +>- 文本标签内支持以下转义字符:\\a,\\b,\\f,\\n,\\r,\\t,\\v,\\',\\",\\0。 +>- 当使用子组件span组成文本段落时,如果span属性样式异常,将导致text段落无法显示。 +>- letter-spacing、text-align、line-height、text-overflow和max-lines样式作用于text及其子组件(span)组成的文本内容。 +>- text组件说明:不支持text内同时存在文本内容和span子组件。(如果同时存在,只显示span内的内容\) + +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+
+ + Hello {{ title }} + +
+
+``` + +``` +/* xxx.css */ +.container { + display: flex; + justify-content: center; + align-items: center; +} +.content{ + width: 400px; + height: 400px; + border: 20px; + border-image-source: url("/common/images/landscape.jpg"); + border-image-slice: 20px; + border-image-width: 30px; + border-image-outset: 10px; + border-image-repeat: round; +} +.title { + font-size: 80px; + text-align: center; + width: 400px; + height: 400px; +} +``` + +``` +// xxx.js +export default { + data: { + title: 'World' + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/3.png) + +``` + +
+ + This is a passage + + + This is a passage + +
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + align-items: center; + background-color: #F1F3F5; + justify-content: center; +} +.text1{ + word-spacing: 10px; + adapt-height: true; +} +.text2{ + width: 200px; + max-lines: 1; + text-overflow: ellipsis; + text-valign: middle; + line-height: 40px; + text-decoration: underline; + text-decoration-color: red; + text-indent: 20px; + white-space: pre; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/2.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/24.textarea.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/24.textarea.md" new file mode 100644 index 0000000000000000000000000000000000000000..40eeea1b179a95abb85d65740d41dac0ed76bde3 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/24.textarea.md" @@ -0,0 +1,386 @@ +--- +title: textarea +permalink: /pages/000b0100010217 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# textarea + +多行文本输入的文本框。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

placeholder

+

string

+

-

+

+

多行文本框的提示文本内容。

+

maxlength

+

number

+

-

+

+

多行文本框可输入的最多字符数量。

+

headericon

+

string

+

-

+

+

在文本输入前的图标展示,该图标不支持点击事件,图标格式为jpg,png和svg。

+

extend

+

boolean

+

false

+

+

文本框是否支持可扩展,设置可扩展属性后文本框高度可以跟随文字自适应。

+

value5+

+

string

+

-

+

+

多行文本框的内容。

+

showcounter5+

+

boolean

+

false

+

+

文本框是否需要开启计数下标功能,需要配合maxlength一起使用。

+

menuoptions5+

+

Array<MenuOption>

+

-

+

+

设置文本选择弹框点击更多按钮之后显示的菜单项。

+

autofocus6+

+

boolean

+

false

+

+

是否自动获焦。

+

selectedstart6+

+

number

+

-1

+

+

开始选择文本时初始选择位置。

+

selectedend6+

+

number

+

-1

+

+

开始选择文本时结尾选择位置。

+

softkeyboardenabled6+

+

boolean

+

true

+

+

编辑时是否弹出系统软键盘。

+
+ +**表 1** MenuOption5+ + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

icon

+

string

+

菜单选项中的图标路径。

+

content

+

string

+

菜单选项中的文本内容。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#e6000000

+

+

多行文本框的文本颜色。

+

font-size

+

<length>

+

16px

+

+

多行文本框的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

多行文本框的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

placeholder-color

+

<color>

+

#99000000

+

+

多行文本框的提示文本颜色,type为text|email|date|time|number|password时生效。

+

font-weight

+

number | string

+

normal

+

+

多行文本框的字体粗细,见text组件font-weight的样式属性

+

font-family

+

string

+

sans-serif

+

+

多行文本框的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+

caret-color6+

+

<color>

+

-

+

+

设置输入光标的颜色。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ text: newText, lines: textLines, height: textHeight }

+

输入内容发生变化时触发该事件,通过参数获取输入内容、行数和行高。

+
说明:

改变value属性值不会触发该回调。5+

+
+

translate5+

+

{ value: selectedText }

+

设置此事件后,进行文本选择操作后文本选择弹窗会出现翻译按钮,点击翻译按钮之后,触发该回调,返回选中的文本内容。

+

share5+

+

{ value: selectedText }

+

设置此事件后,进行文本选择操作后文本选择弹窗会出现分享按钮,点击分享按钮之后,触发该回调,返回选中的文本内容。

+

search5+

+

{ value: selectedText }

+

设置此事件后,进行文本选择操作后文本选择弹窗会出现搜索按钮,点击搜索按钮之后,触发该回调,返回选中的文本内容。

+

optionselect5+

+

{ index:optionIndex, value: selectedText }

+

文本选择弹窗中设置menuoptions属性后,用户在文本选择操作后,点击菜单项后触发该回调,返回点击的菜单项序号和选中的文本内容。

+

selectchange6+

+

{ start: number,end: number }

+

文本选择变化时触发事件。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + + +``` + +``` +/* xxx.css */ +.textarea { + placeholder-color: gray; +} +``` + +``` +// xxx.js +change(e){ + prompt.showToast({ + message: 'value: ' + e.text + ', lines: ' + e.lines + ', height: ' + e.height, + duration: 3000, + }); +} +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125124.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/25.toolbar.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/25.toolbar.md" new file mode 100644 index 0000000000000000000000000000000000000000..035abf72d4cfa25b006074375f93eb947f13d559 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/25.toolbar.md" @@ -0,0 +1,54 @@ +--- +title: toolbar +permalink: /pages/000b0100010218 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# toolbar + +工具栏。放在界面底部,用于展示针对当前界面的操作选项。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 5 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持子组件。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>工具栏最多可以展示5个toolbar-item子组件,如果存在6个及以上toolbar-item子组件,则保留前面4个子组件,后续的子组件收纳到工具栏上的更多项中,通过点击更多项弹窗展示剩下的子组件,更多项展示的组件样式采用系统默认样式,toolbar-item上设置的自定义样式不生效。 + +## 属性 + +支持[通用属性](/pages/000b0100010000)。 + +## 样式 + +支持[通用样式](/pages/000b0100010001)。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持height样式,高度固定为56px。 + +## 事件 + +不支持。 + +## 方法 + +不支持。 + +## 示例 + +详见[toolbar-item示例](/pages/000b0100010219)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/26.toolbar-item.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/26.toolbar-item.md" new file mode 100644 index 0000000000000000000000000000000000000000..93f11f48b99c70ca749057516425362a5cfa6cd7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/26.toolbar-item.md" @@ -0,0 +1,300 @@ +--- +title: toolbar-item +permalink: /pages/000b0100010219 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# toolbar-item + +工具栏子组件。作为工具栏组件的子组件,用于展示工具栏上的一个操作选项。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 5 开始支持。 + +## 子组件 + +无 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

value

+

string

+

-

+

+

该操作项文本内容。

+

icon

+

string

+

-

+

+

该操作项图标资源路径,该图标展示在选项文本上,支持本地路径,格式为png,jpg和svg。

+
+ +## 样式 + +仅支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#e6000000

+

+

文本颜色。

+

font-size

+

<length>

+

16px

+

+

文本大小。

+

allow-scale

+

boolean

+

true

+

+

文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+

font-style

+

string

+

normal

+

+

文本字体样式,可选值为:

+
  1. normal: 标准的字体样式;
  2. italic: 斜体的字体样式。
+

font-weight

+

number|string

+

normal

+

+

文本字体粗细,number类型取值[100, 900]的整数(被100整除),默认为400,取值越大,字体越粗。string类型取值为:lighter、normal、bold、bolder。

+

text-decoration

+

string

+

none

+

+

文本修饰,可选值为:

+
  1. underline: 文本下划线修饰;
  2. line-through: 穿过文本的修饰线;
  3. none: 标准文本。
+

font-family

+

string

+

sans-serif

+

+

字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+

background

+

<linear-gradient>

+

-

+

+

仅支持设置渐变样式,与background-color、background-image不兼容。

+

background-color

+

<color>

+

-

+

+

设置背景颜色。

+

background-image

+

string

+

-

+

+

设置背景图片。与background-color、background不兼容;支持网络图片资源和本地图片资源地址。

+

background-size

+
  • string
  • <length> <length>
  • <percentage> <percentage>
+

auto

+

+

设置背景图片的大小。

+
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    +
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    +
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    +
+

background-repeat

+

string

+

repeat

+

+

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

+
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
+

background-position

+
  • string string
  • <length> <length>
  • <percentage> <percentage>
+

0px 0px

+

+
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    +
+
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>。
+

opacity

+

number

+

1

+

+

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

+

display

+

string

+

+

flex

+

+

确定一个元素所产生的框的类型,可选值为:

+
  • flex:弹性布局。
  • none:不渲染此元素。
+

visibility

+

string

+

+

visible

+

+

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

+
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
+
说明:

visibility和display样式都设置时,仅display生效。

+
+
+ +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +不支持。 + +## 示例 + +``` + + + + + + + + +``` + +![](/images/application-dev/reference/arkui-js/figures/000000.jpg) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/27.toggle.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/27.toggle.md" new file mode 100644 index 0000000000000000000000000000000000000000..40c35662665df7088a265b4387468bf1739ac80a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/27.toggle.md" @@ -0,0 +1,245 @@ +--- +title: toggle +permalink: /pages/000b010001021a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# toggle + +状态按钮用于从一组选项中进行选择,并可能在界面上实时显示选择后的结果。通常这一组选项都是由状态按钮构成。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从 API Version 5 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

value

+

string

+

-

+

+

状态按钮的文本值。

+

checked

+

boolean

+

false

+

+

状态按钮是否被选中。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

color

+

<color>

+

#E5000000

+

+

状态按钮的文本颜色。

+

font-size

+

<length>

+

16px

+

+

状态按钮的文本尺寸。

+

allow-scale

+

boolean

+

true

+

+

状态按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

+
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

+
+

font-style

+

string

+

normal

+

+

状态按钮的字体样式。

+

font-weight

+

number | string

+

normal

+

+

状态按钮的字体粗细。见text组件font-weight的样式属性

+

font-family

+

<string>

+

sans-serif

+

+

状态按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + +

名称

+

参数

+

描述

+

change

+

{ checked:isChecked }

+

组件选中状态发生变化时触发。

+
+ +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ 1. Multiple choice example +
+ {{$item}} +
+ 2. Single choice example +
+ +
+
+``` + +``` +/* xxx.css */ +.margin { + margin: 7px; +} +``` + +``` +// xxx.js +export default { + data: { + toggle_list: [ + { "id":"1001", "name":"Living room", "checked":true }, + { "id":"1002", "name":"Bedroom", "checked":false }, + { "id":"1003", "name":"Second bedroom", "checked":false }, + { "id":"1004", "name":"Kitchen", "checked":false }, + { "id":"1005", "name":"Study", "checked":false }, + { "id":"1006", "name":"Garden", "checked":false }, + { "id":"1007", "name":"Bathroom", "checked":false }, + { "id":"1008", "name":"Balcony", "checked":false }, + ], + toggles: ["Living room","Bedroom","Kitchen","Study"], + idx: "" + }, + allclick(arg) { + this.idx = arg + }, + allchange(e) { + if (e.checked === true) { + for (var i = 0; i < this.toggle_list.length; i++) { + if (this.toggle_list[i].id === this.idx) { + this.toggle_list[i].checked = true + } else { + this.toggle_list[i].checked = false + } + } + } + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/screenshot.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/04.\345\252\222\344\275\223\347\273\204\344\273\266/01.video.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/04.\345\252\222\344\275\223\347\273\204\344\273\266/01.video.md" new file mode 100644 index 0000000000000000000000000000000000000000..6e1d95a6e9d64060e01862c82cecb7715013e70e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/04.\345\252\222\344\275\223\347\273\204\344\273\266/01.video.md" @@ -0,0 +1,250 @@ +--- +title: video +permalink: /pages/000b0100010300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# video + +视频播放组件。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 需要在config.json配置 +> ``` +> "configChanges": ["orientation"] +> ``` + +## 权限列表 + +## 子组件 + +不支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

muted

+

boolean

+

false

+

+

视频是否静音播放。

+

src

+

string

+

-

+

+

播放视频内容的路径。

+

autoplay

+

boolean

+

false

+

+

视频是否自动播放。

+

controls

+

boolean

+

true

+

+

控制视频播放的控制栏是否显示,如果设置为false,则不显示控制栏。默认为true,由系统决定显示或隐藏控制栏。

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

object-fit

+

string

+

contain

+

+

视频源的缩放类型,如果poster设置了值,那么此配置还会影响视频海报的缩放类型,可选值参考表1

+
+ +**表 1** object-fit 类型说明 + + + + + + + + + + +

类型

+

描述

+

fill

+

不保持宽高比进行放大缩小,使得图片填充满显示边界。

+
+ +## 事件 + +除支持[通用事件](/pages/000b0100010002)外,还支持如下事件: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

prepared

+

{ duration: value }5+

+

视频准备完成时触发该事件,通过duration可以获取视频时长,单位为s。

+

start

+

-

+

播放时触发该事件。

+

pause

+

-

+

暂停时触发该事件。

+

finish

+

-

+

播放结束时触发该事件。

+

error

+

-

+

播放失败时触发该事件。

+

seeking

+

{ currenttime: value }

+

操作进度条过程时上报时间信息,单位为s。

+

seeked

+

{ currenttime: value }

+

操作进度条完成后,上报播放时间信息,单位为s。

+

timeupdate

+

{ currenttime: value }

+

播放进度变化时触发该事件,单位为s,更新时间间隔为250ms。

+
+ +## 方法 + +除支持[通用方法](/pages/000b0100010003)外,还支持如下方法: + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

start

+

-

+

请求播放视频。

+

pause

+

-

+

请求暂停播放视频。

+

setCurrentTime

+

{ currenttime: value }

+

指定视频播放的进度位置,单位为s。

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/01.canvas\347\273\204\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/01.canvas\347\273\204\344\273\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..6df3773d35bee1b507039898f7ea3f0f69871218 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/01.canvas\347\273\204\344\273\266.md" @@ -0,0 +1,200 @@ +--- +title: canvas组件 +permalink: /pages/000b0100010400 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# canvas组件 + +提供画布组件。用于自定义绘制图形。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +支持[通用属性](/pages/000b0100010000)。 + +## 样式 + +支持[通用样式](/pages/000b0100010001)。 + +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +除支持[通用方法](/pages/000b0100010003)外,还支持如下方法: + +### getContext\(type: '2d', options?: ContextAttrOptions\) + +getContext \(type: '2d', options?: ContextAttrOptions\): CanvasRendering2dContext + +获取canvas绘图上下文。不支持在onInit和onReady中进行调用。 + +- 参数 + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

描述

+

type

+

string

+

+

可选值为'2d',返回值为2D绘制对象,该对象提供具体的2D绘制操作。

+

options6+

+

ContextAttrOptions

+

+

具体表现为当前仅支持配置是否开启抗锯齿功能,默认为关闭。

+
+ + **表 1** ContextAttrOptions + + + + + + + + + + + + +

参数名

+

类型

+

说明

+

antialias

+

boolean

+

是否开启抗锯齿功能,默认为false。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

CanvasRenderingContext2D

+

用于在画布组件上绘制矩形、文本、图片等

+
+ + +### toDataURL6+ + +toDataURL\(type?: string, quality?: number\): string + +生成一个包含图片展示的URL。 + +- 参数 + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

描述

+

type

+

string

+

+

可选参数,用于指定图像格式,默认格式为image/png。

+

quality

+

number

+

+

在指定图片格式为image/jpeg或image/webp的情况下,可以从0到1的区间内选择图片的质量。如果超出取值范围,将会使用默认值0.92。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

string

+

图像的URL地址。

+
+ + +## 示例 + +``` + +
+ + +
+``` + +``` +// xxx.js +export default { + handleClick() { + const el = this.$refs.canvas1; + var dataURL = el.toDataURL(); + console.log(dataURL); + // "data:image/png;base64,xxxxxxxx..." + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/02.CanvasRenderingContext2D\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/02.CanvasRenderingContext2D\345\257\271\350\261\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..44de5b7cdd5fd8f85c439a89178a2a44006274cd --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/02.CanvasRenderingContext2D\345\257\271\350\261\241.md" @@ -0,0 +1,2540 @@ +--- +title: CanvasRenderingContext2D对象 +permalink: /pages/000b0100010401 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# CanvasRenderingContext2D对象 + +使用CanvasRenderingContext2D在canvas画布组件上进行绘制,绘制对象可以是矩形、文本、图片等。 + +- 示例 + + ``` + +
+ + + +
+ ``` + + ``` + // xxx.js + export default { + handleClick() { + const el = this.$refs.canvas1; + const ctx = el.getContext('2d'); + ctx.beginPath(); + ctx.arc(100, 75, 50, 0, 6.28); + ctx.stroke(); + }, + antialias() { + const el = this.$refs.canvas1; + const ctx = el.getContext('2d', { antialias: true }); + ctx.beginPath(); + ctx.arc(100, 75, 50, 0, 6.28); + ctx.stroke(); + } + } + ``` + + +- 示意图(关闭抗锯齿) + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214837333.png) + +- 示意图(开启抗锯齿) + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125162.png) + + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

描述

+

fillStyle

+

<color> | CanvasGradient | CanvasPattern

+

-

+

指定绘制的填充色。

+
  • 类型为<color>时,表示设置填充区域的颜色。
  • 类型为CanvasGradient时,表示渐变对象,使用 createLinearGradient()方法创建。
  • 类型为CanvasPattern时,使用 createPattern()方法创建。
+

lineWidth

+

number

+

-

+

设置绘制线条的宽度。

+

strokeStyle

+

<color> | CanvasGradient | CanvasPattern

+

-

+

设置描边的颜色。

+
  • 类型为<color>时,表示设置描边使用的颜色。
  • 类型为CanvasGradient时,表示渐变对象,使用 createLinearGradient()方法创建。
  • 类型为CanvasPattern时,使用 createPattern()方法创建。
+

lineCap

+

string

+

butt

+

指定线端点的样式,可选值为:

+
  • butt:线端点以方形结束。
  • round:线端点以圆形结束。
  • square:线端点以方形结束,该样式下会增加一个长度和线段厚度相同,宽度是线段厚度一半的矩形。
+

lineJoin

+

string

+

miter

+

指定线段间相交的交点样式,可选值为:

+
  • round:在线段相连处绘制一个扇形,扇形的圆角半径是线段的宽度。
  • bevel:在线段相连处使用三角形为底填充, 每个部分矩形拐角独立。
  • miter:在相连部分的外边缘处进行延伸,使其相交于一点,形成一个菱形区域,该属性可以通过设置miterLimit属性展现效果。
+

miterLimit

+

number

+

10

+

设置斜接面限制值,该值指定了线条相交处内角和外角的距离。

+

font

+

string

+

"normal normal 14px sans-serif"

+

设置文本绘制中的字体样式。

+

语法:ctx.font="font-style font-weight font-size font-family"5+

+
  • font-style(可选),用于指定字体样式,支持如下几种样式:normal, italic。
  • font-weight(可选),用于指定字体的粗细,支持如下几种类型:normal, bold, bolder, lighter, 100, 200, 300, 400, 500, 600, 700, 800, 900。
  • font-size(可选),指定字号和行高,单位只支持px。
  • font-family(可选),指定字体系列,支持如下几种类型:sans-serif, serif, monospace。
+

textAlign

+

string

+

left

+

设置文本绘制中的文本对齐方式,可选值为:

+
  • left:文本左对齐。
  • right:文本右对齐。
  • center:文本居中对齐。
  • start:文本对齐界线开始的地方。
  • end:文本对齐界线结束的地方。
+
说明:

ltr布局模式下start和left一致,rtl布局模式下start和right一致·。

+
+

textBaseline

+

string

+

alphabetic

+

设置文本绘制中的水平对齐方式,可选值为:

+
  • alphabetic:文本基线是标准的字母基线。
  • top:文本基线在文本块的顶部。
  • hanging:文本基线是悬挂基线。
  • middle:文本基线在文本块的中间。
  • ideographic:文字基线是表意字基线;如果字符本身超出了alphabetic 基线,那么ideograhpic基线位置在字符本身的底部。
  • bottom:文本基线在文本块的底部。 与 ideographic 基线的区别在于 ideographic 基线不需要考虑下行字母。
+

globalAlpha

+

number

+

-

+

设置透明度,0.0为完全透明,1.0为完全不透明。

+

lineDashOffset

+

number

+

0.0

+

设置画布的虚线偏移量,精度为float。

+

globalCompositeOperation

+

string

+

source-over

+

设置合成操作的方式。类型字段可选值有source-over,source-atop,source-in,source-out,destination-over,destination-atop,destination-in,destination-out,lighter,copy,xor。具体请参考类型字段说明

+

shadowBlur

+

number

+

0.0

+

设置绘制阴影时的模糊级别,值越大越模糊,精度为float。

+

shadowColor

+

<color>

+

-

+

设置绘制阴影时的阴影颜色。

+

shadowOffsetX

+

number

+

-

+

设置绘制阴影时和原有对象的水平偏移值。

+

shadowOffsetY

+

number

+

-

+

设置绘制阴影时和原有对象的垂直偏移值。

+

imageSmoothingEnabled6+

+

boolean

+

true

+

用于设置绘制图片时是否进行图像平滑度调整,true为启用,false为不启用。

+
+ +### fillStyle + +``` +ctx.fillStyle = '#0000ff'; +ctx.fillRect(20, 20, 150, 100); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001166962736.png) + +### lineWidth + +``` +ctx.lineWidth = 5; +ctx.strokeRect(25, 25, 85, 105); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001166484430.png) + +### strokeStyle + +``` +ctx.lineWidth = 10; +ctx.strokeStyle = '#0000ff'; +ctx.strokeRect(25, 25, 155, 105); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001212124299.png) + +### lineCap + +``` +ctx.lineWidth = 8; +ctx.beginPath(); +ctx.lineCap = 'round'; +ctx.moveTo(30, 50); +ctx.lineTo(220, 50); +ctx.stroke(); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214837127.png) + +### lineJoin + +``` +ctx.beginPath(); +ctx.lineWidth = 8; +ctx.lineJoin = 'miter'; +ctx.moveTo(30, 30); +ctx.lineTo(120, 60); +ctx.lineTo(30, 110); +ctx.stroke(); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214717247.png) + +### miterLimit + +``` +ctx.lineWidth = 8; +ctx.lineJoin = 'miter'; +ctx.miterLimit = 3; +ctx.moveTo(30, 30); +ctx.lineTo(60, 35); +ctx.lineTo(30, 37); +ctx.stroke(); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167001464.png) + +### font + +``` +ctx.font = '30px sans-serif'; +ctx.fillText("Hello World", 20, 60); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167046832.png) + +### textAlign + +``` +ctx.strokeStyle = '#0000ff'; +ctx.moveTo(140, 10); +ctx.lineTo(140, 160); +ctx.stroke(); + +ctx.font = '18px sans-serif'; + +// Show the different textAlign values +ctx.textAlign = 'start'; +ctx.fillText('textAlign=start', 140, 60); +ctx.textAlign = 'end'; +ctx.fillText('textAlign=end', 140, 80); +ctx.textAlign = 'left'; +ctx.fillText('textAlign=left', 140, 100); +ctx.textAlign = 'center'; +ctx.fillText('textAlign=center',140, 120); +ctx.textAlign = 'right'; +ctx.fillText('textAlign=right',140, 140); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167472798.png) + +### textBaseline + +``` +ctx.strokeStyle = '#0000ff'; +ctx.moveTo(0, 120); +ctx.lineTo(400, 120); +ctx.stroke(); + +ctx.font = '20px sans-serif'; + +ctx.textBaseline = 'top'; +ctx.fillText('Top', 10, 120); +ctx.textBaseline = 'bottom'; +ctx.fillText('Bottom', 55, 120); +ctx.textBaseline = 'middle'; +ctx.fillText('Middle', 125, 120); +ctx.textBaseline = 'alphabetic'; +ctx.fillText('Alphabetic', 195, 120); +ctx.textBaseline = 'hanging'; +ctx.fillText('Hanging', 295, 120); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169315920.png) + +### globalAlpha + +``` +ctx.fillStyle = 'rgb(255,0,0)'; +ctx.fillRect(0, 0, 50, 50); +ctx.globalAlpha = 0.4; +ctx.fillStyle = 'rgb(0,0,255)'; +ctx.fillRect(50, 50, 50, 50); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167953648.png) + +### lineDashOffset + +``` +ctx.arc(100, 75, 50, 0, 6.28); +ctx.setLineDash([10,20]); +ctx.lineDashOffset = 10.0; +ctx.stroke(); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167950468.png) + +### globalCompositeOperation + +- 类型字段说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+

描述

+

source-over

+

在现有绘制内容上显示新绘制内容,属于默认值。

+

source-atop

+

在现有绘制内容顶部显示新绘制内容。

+

source-in

+

在现有绘制内容中显示新绘制内容。

+

source-out

+

在现有绘制内容之外显示新绘制内容。

+

destination-over

+

在新绘制内容上方显示现有绘制内容。

+

destination-atop

+

在新绘制内容顶部显示现有绘制内容。

+

destination-in

+

在新绘制内容中显示现有绘制内容。

+

destination-out

+

在新绘制内容外显示现有绘制内容。

+

lighter

+

显示新绘制内容和现有绘制内容。

+

copy

+

显示新绘制内容而忽略现有绘制内容。

+

xor

+

使用异或操作对新绘制内容与现有绘制内容进行融合。

+
+ + +- 示例 + + ``` + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(20, 20, 50, 50); + ctx.globalCompositeOperation = 'source-over'; + ctx.fillStyle = 'rgb(0,0,255)'; + ctx.fillRect(50, 50, 50, 50); + // Start drawing second example + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(120, 20, 50, 50); + ctx.globalCompositeOperation = 'destination-over'; + ctx.fillStyle = 'rgb(0,0,255)'; + ctx.fillRect(150, 50, 50, 50); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001213192781.png) + + 示例中,新绘制内容是蓝色矩形,现有绘制内容是红色矩形。 + + +### shadowBlur + +``` +ctx.shadowBlur = 30; +ctx.shadowColor = 'rgb(0,0,0)'; +ctx.fillStyle = 'rgb(255,0,0)'; +ctx.fillRect(20, 20, 100, 80); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168111514.png) + +### shadowColor + +``` +ctx.shadowBlur = 30; +ctx.shadowColor = 'rgb(0,0,255)'; +ctx.fillStyle = 'rgb(255,0,0)'; +ctx.fillRect(30, 30, 100, 100); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168111610.png) + +### shadowOffsetX + +``` +ctx.shadowBlur = 10; +ctx.shadowOffsetX = 20; +ctx.shadowColor = 'rgb(0,0,0)'; +ctx.fillStyle = 'rgb(255,0,0)'; +ctx.fillRect(20, 20, 100, 80); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001167631876.png) + +### shadowOffsetY + +``` +ctx.shadowBlur = 10; +ctx.shadowOffsetY = 20; +ctx.shadowColor = 'rgb(0,0,0)'; +ctx.fillStyle = 'rgb(255,0,0)'; +ctx.fillRect(30, 30, 100, 100); +``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001213193285.png) + +### imageSmoothingEnabled6+ + +``` +var img = new Image(); +img.src = 'common/image/example.jpg'; +img.onload = function() { + ctx.imageSmoothingEnabled = false; + ctx.drawImage(img, 0, 0, 400, 200); +}; +``` + +![](/images/application-dev/reference/arkui-js/figures/smoothOff.png) + +## 方法 + +### fillRect + +fillRect\(x: number, y: number, width:number, height: number\): void + +填充一个矩形。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

指定矩形左上角点的x坐标。

+

y

+

number

+

指定矩形左上角点的y坐标。

+

width

+

number

+

指定矩形的宽度。

+

height

+

number

+

指定矩形的高度。

+
+ +- 示例 + + ``` + ctx.fillRect(20, 20, 200, 150); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214811029.png) + + +### clearRect + +clearRect\(x: number, y: number, width:number, height: number\): void + +删除指定区域内的绘制内容。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

指定矩形上的左上角x坐标。

+

y

+

number

+

指定矩形上的左上角y坐标。

+

width

+

number

+

指定矩形的宽度。

+

height

+

number

+

指定矩形的高度。

+
+ +- 示例 + + ``` + ctx.fillStyle = 'rgb(0,0,255)'; + ctx.fillRect(0, 0, 400, 200); + ctx.clearRect(20, 20, 150, 100); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214619417.png) + + +### strokeRect + +strokeRect\(x: number, y: number, width:number, height: number\): void + +绘制具有边框的矩形,矩形内部不填充。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

指定矩形的左上角x坐标。

+

y

+

number

+

指定矩形的左上角y坐标。

+

width

+

number

+

指定矩形的宽度。

+

height

+

number

+

指定矩形的高度。

+
+ +- 示例 + + ``` + ctx.strokeRect(30, 30, 200, 150); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214822091.png) + + +### fillText + +fillText\(text: string, x: number, y: number\): void + +绘制填充类文本。 + +- 参数 + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

text

+

string

+

需要绘制的文本内容。

+

x

+

number

+

需要绘制的文本的左下角x坐标。

+

y

+

number

+

需要绘制的文本的左下角y坐标。

+
+ +- 示例 + + ``` + ctx.font = '35px sans-serif'; + ctx.fillText("Hello World!", 20, 60); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214469787.png) + + +### strokeText + +strokeText\(text: string, x: number, y: number\): void + +绘制描边类文本。 + +- 参数 + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

text

+

string

+

需要绘制的文本内容。

+

x

+

number

+

需要绘制的文本的左下角x坐标。

+

y

+

number

+

需要绘制的文本的左下角y坐标。

+
+ +- 示例 + + ``` + ctx.font = '25px sans-serif'; + ctx.strokeText("Hello World!", 20, 60); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214460669.png) + + +### measureText + +measureText\(text: string\): TextMetrics + +该方法返回一个文本测算的对象,通过该对象可以获取指定文本的宽度值。 + +- 参数 + + + + + + + + + + + + +

参数

+

类型

+

描述

+

text

+

string

+

需要进行测量的文本。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

TextMetrics

+

包含指定字体的宽度,该宽度可以通过TextMetrics.width来获取。

+
+ +- 示例 + + ``` + ctx.font = '25px sans-serif'; + var txt = 'Hello World'; + ctx.fillText("width:" + ctx.measureText(txt).width, 20, 60); + ctx.fillText(txt, 20, 110); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169142476.png) + + +### stroke + +stroke\(\): void + +进行边框绘制操作。 + +- 示例 + + ``` + ctx.moveTo(25, 25); + ctx.lineTo(25, 105); + ctx.strokeStyle = 'rgb(0,0,255)'; + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169309930.png) + + +### beginPath + +beginPath\(\): void + +创建一个新的绘制路径。 + +- 示例 + + ``` + ctx.beginPath(); + ctx.lineWidth = '6'; + ctx.strokeStyle = '#0000ff'; + ctx.moveTo(15, 80); + ctx.lineTo(280, 160); + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214629745.png) + + +### moveTo + +moveTo\(x: number, y: number\): void + +路径从当前点移动到指定点。 + +- 参数 + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

指定位置的x坐标。

+

y

+

number

+

指定位置的y坐标。

+
+ +- 示例 + + ``` + ctx.beginPath(); + ctx.moveTo(10, 10); + ctx.lineTo(280, 160); + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169309948.png) + + +### lineTo + +lineTo\(x: number, y: number\): void + +从当前点到指定点进行路径连接。 + +- 参数 + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

指定位置的x坐标。

+

y

+

number

+

指定位置的y坐标。

+
+ +- 示例 + + ``` + ctx.beginPath(); + ctx.moveTo(10, 10); + ctx.lineTo(280, 160); + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169469914.png) + + +### closePath + +closePath\(\): void + +结束当前路径形成一个封闭路径。 + +- 示例 + + ``` + ctx.beginPath(); + ctx.moveTo(30, 30); + ctx.lineTo(110, 30); + ctx.lineTo(70, 90); + ctx.closePath(); + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169151508.png) + + +### createPattern + +createPattern\(image: Image, repetition: string\): Object + +通过指定图像和重复方式创建图片填充的模板。 + +- 参数 + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

image

+

Image

+

图源对象,具体参考Image对象

+

repetition

+

string

+

设置图像重复的方式,取值为:'repeat'、'repeat-x'、 'repeat-y'、'no-repeat'。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

指定图像填充的Pattern对象。

+
+ +- 示例 + + ``` + var pat = ctx.createPattern(img, 'repeat'); + ctx.fillStyle = pat; + ctx.fillRect(0, 0, 20, 20); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169301188.png) + + +### bezierCurveTo + +bezierCurveTo\(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number\): void + +创建三次贝赛尔曲线的路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

cp1x

+

number

+

第一个贝塞尔参数的x坐标值。

+

cp1y

+

number

+

第一个贝塞尔参数的y坐标值。

+

cp2x

+

number

+

第二个贝塞尔参数的x坐标值。

+

cp2y

+

number

+

第二个贝塞尔参数的y坐标值。

+

x

+

number

+

路径结束时的x坐标值。

+

y

+

number

+

路径结束时的y坐标值。

+
+ +- 示例 + + ``` + ctx.beginPath(); + ctx.moveTo(10, 10); + ctx.bezierCurveTo(20, 100, 200, 100, 200, 20); + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214621177.png) + + +### quadraticCurveTo + +quadraticCurveTo\(cpx: number, cpy: number, x: number, y: number\): void + +创建二次贝赛尔曲线的路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

cpx

+

number

+

贝塞尔参数的x坐标值。

+

cpy

+

number

+

贝塞尔参数的y坐标值。

+

x

+

number

+

路径结束时的x坐标值。

+

y

+

number

+

路径结束时的y坐标值。

+
+ +- 示例 + + ``` + ctx.beginPath(); + ctx.moveTo(20, 20); + ctx.quadraticCurveTo(100, 100, 200, 20); + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169461910.png) + + +### arc + +arc\(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise: boolean\): void + +绘制弧线路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

弧线圆心的x坐标值。

+

y

+

number

+

弧线圆心的y坐标值。

+

radius

+

number

+

弧线的圆半径。

+

startAngle

+

number

+

弧线的起始弧度。

+

endAngle

+

number

+

弧线的终止弧度。

+

anticlockwise

+

boolean

+

是否逆时针绘制圆弧。

+
+ +- 示例 + + ``` + ctx.beginPath(); + ctx.arc(100, 75, 50, 0, 6.28); + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169470288.png) + + +### arcTo + +arcTo\(x1: number, y1: number, x2: number, y2: number, radius: number\): void + +依据圆弧经过的点和圆弧半径创建圆弧路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x1

+

number

+

圆弧经过的第一个点的x坐标值。

+

y1

+

number

+

圆弧经过的第一个点的y坐标值。

+

x2

+

number

+

圆弧经过的第二个点的x坐标值。

+

y2

+

number

+

圆弧经过的第二个点的y坐标值。

+

radius

+

number

+

圆弧的圆半径值。

+
+ +- 示例 + + ``` + ctx.moveTo(100, 20); + ctx.arcTo(150, 20, 150, 70, 50); // Create an arc + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169143586.png) + + +### ellipse6+ + +ellipse\(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: number\): void + +在规定的矩形区域绘制一个椭圆。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

椭圆圆心的x轴坐标。

+

y

+

number

+

椭圆圆心的y轴坐标。

+

radiusX

+

number

+

椭圆x轴的半径长度。

+

radiusY

+

number

+

椭圆y轴的半径长度。

+

rotation

+

number

+

椭圆的旋转角度,单位为弧度。

+

startAngle

+

number

+

椭圆绘制的起始点角度,以弧度表示。

+

endAngle

+

number

+

椭圆绘制的结束点角度,以弧度表示。

+

anticlockwise

+

number

+

是否以逆时针方向绘制椭圆,0为顺时针,1为逆时针。(可选参数,默认为0)

+
+ +- 示例 + + ``` + ctx.beginPath(); + ctx.ellipse(200, 200, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI, 1); + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/ellipse.png) + + +### rect + +rect\(x: number, y: number, width: number, height: number\): void + +创建矩形路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

指定矩形的左上角x坐标值。

+

y

+

number

+

指定矩形的左上角y坐标值。

+

width

+

number

+

指定矩形的宽度。

+

height

+

number

+

指定矩形的高度。

+
+ +- 示例 + + ``` + ctx.rect(20, 20, 100, 100); // Create a 100*100 rectangle at (20, 20) + ctx.stroke(); // Draw it + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214630783.png) + + +### fill + +fill\(\): void + +对封闭路径进行填充。 + +- 示例 + + ``` + ctx.rect(20, 20, 100, 100); // Create a 100*100 rectangle at (20, 20) + ctx.fill(); // Draw it in default setting + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214703717.png) + + +### clip + +clip\(\): void + +设置当前路径为剪切路径。 + +- 示例 + + ``` + ctx.rect(0, 0, 200, 200); + ctx.stroke(); + ctx.clip(); + // Draw red rectangle after clip + ctx.fillStyle = "rgb(255,0,0)"; + ctx.fillRect(0, 0, 150, 150); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169303414.png) + + +### rotate + +rotate\(rotate: number\): void + +针对当前坐标轴进行顺时针旋转。 + +- 参数 + + + + + + + + + + + + +

参数

+

类型

+

描述

+

rotate

+

number

+

设置顺时针旋转的弧度值,可以通过Math.PI / 180将角度转换为弧度值。

+
+ +- 示例 + + ``` + ctx.rotate(45 * Math.PI / 180); // Rotate the rectangle 45 degrees + ctx.fillRect(70, 20, 50, 50); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169463368.png) + + +### scale + +scale\(x: number, y: number\): void + +设置canvas画布的缩放变换属性,后续的绘制操作将按照缩放比例进行缩放。 + +- 参数 + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

设置水平方向的缩放值。

+

y

+

number

+

设置垂直方向的缩放值。

+
+ +- 示例 + + ``` + ctx.strokeRect(10, 10, 25, 25); + ctx.scale(2, 2);// Scale to 200% + ctx.strokeRect(10, 10, 25, 25); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214463281.png) + + +### transform + +transform\(scaleX: number, skewX: number, skewY: number, scale: number, translateX: number, translateY: number\): void + +transform方法对应一个变换矩阵,想对一个图形进行变化的时候,只要设置此变换矩阵相应的参数,对图形的各个定点的坐标分别乘以这个矩阵,就能得到新的定点的坐标。矩阵变换效果可叠加。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>变换后的坐标计算方式(x和y为变换前坐标,x'和y'为变换后坐标): +>- x' = scaleX \* x + skewY \* y + translateX +>- y' = skewX \* x + scaleY \* y + translateY + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

scaleX

+

number

+

指定水平缩放值。

+

skewX

+

number

+

指定水平倾斜值。

+

skewY

+

number

+

指定垂直倾斜值。

+

scaleY

+

number

+

指定垂直缩放值。

+

translateX

+

number

+

指定水平移动值。

+

translateY

+

number

+

指定垂直移动值。

+
+ +- 示例 + + ``` + ctx.fillStyle = 'rgb(0,0,0)'; + ctx.fillRect(0, 0, 100, 100) + ctx.transform(1, 0.5, -0.5, 1, 10, 10); + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(0, 0, 100, 100); + ctx.transform(1, 0.5, -0.5, 1, 10, 10); + ctx.fillStyle = 'rgb(0,0,255)'; + ctx.fillRect(0, 0, 100, 100); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214623227.png) + + +### setTransform + +setTransform\(scaleX: number, skewX: number, skewY: number, scale: number, translateX: number, translateY: number\): void + +setTransfrom方法使用的参数和transform\(\)方法相同,但setTransform\(\)方法会重置现有的变换矩阵并创建新的变换矩阵。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

scaleX

+

number

+

指定水平缩放值。

+

skewX

+

number

+

指定水平倾斜值。

+

skewY

+

number

+

指定垂直倾斜值。

+

scaleY

+

number

+

指定垂直缩放值。

+

translateX

+

number

+

指定水平移动值。

+

translateY

+

number

+

指定垂直移动值。

+
+ +- 示例 + + ``` + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(0, 0, 100, 100) + ctx.setTransform(1,0.5, -0.5, 1, 10, 10); + ctx.fillStyle = 'rgb(0,0,255)'; + ctx.fillRect(0, 0, 100, 100); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168984880.png) + + +### translate + +translate\(x: number, y: number\): void + +移动当前坐标系的原点。 + +- 参数 + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

设置水平平移量。

+

y

+

number

+

设置竖直平移量。

+
+ +- 示例 + + ``` + ctx.fillRect(10, 10, 50, 50); + ctx.translate(70, 70); + ctx.fillRect(10, 10, 50, 50); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169144864.png) + + +### createPath2D6+ + +createPath2D\(path: Path2D, cmds: string\): Path2D + +创建一个Path2D对象。 + +- 参数 + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

path

+

Path2D

+

Path2D对象。

+

cmds

+

string

+

SVG的Path描述字符串。

+
+ +- 返回值 + + [Path2D对象](/pages/000b0100010405) + +- 示例 + + ``` + var path1 = ctx.createPath2D(); + path1.moveTo(100, 100); + path1.lineTo(200, 100); + path1.lineTo(100, 200); + path1.closePath(); + ctx.stroke(path1); + var path2 = ctx.createPath2D("M150 150 L50 250 L250 250 Z"); + ctx.stroke(path2); + var path3 = ctx.createPath2D(path2); + ctx.stroke(path3); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214824709.png) + + +### drawImage + +drawImage\(image: Image, sx: number, sy: number, sWidth: number, sHeight: number, dx: number, dy: number, dWidth: number, dHeight: number\):void + +进行图像绘制。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

image

+

Image

+

图片资源,请参考Image对象

+

sx

+

number

+

裁切源图像时距离源图像左上角的x坐标值。

+

sy

+

number

+

裁切源图像时距离源图像左上角的y坐标值。

+

sWidth

+

number

+

裁切源图像时需要裁切的宽度。

+

sHeight

+

number

+

裁切源图像时需要裁切的高度。

+

dx

+

number

+

绘制区域左上角在x轴的位置。

+

dy

+

number

+

绘制区域左上角在y 轴的位置。

+

dWidth

+

number

+

绘制区域的宽度。

+

dHeight

+

number

+

绘制区域的高度。

+
+ +- 示例 + + ``` + var test = this.$element('drawImage'); + var ctx = test.getContext('2d'); + var img = new Image(); + img.src = 'common/image/test.jpg'; + ctx.drawImage(img, 50, 80, 80, 80); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214704759.png) + + +### restore + +restore\(\): void + +对保存的绘图上下文进行恢复。 + +- 示例 + + ``` + ctx.restore(); + ``` + + +### save + +save\(\): void + +对当前的绘图上下文进行保存。 + +- 示例 + + ``` + ctx.save(); + ``` + + +### createLinearGradient6+ + +createLinearGradient\(x0: number, y0: number, x1: number, y1: number\): Object + +创建一个线性渐变色,返回CanvasGradient对象,请参考[CanvasGradient对象](/pages/000b0100010403)。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x0

+

number

+

起点的x轴坐标。

+

y0

+

number

+

起点的y轴坐标。

+

x1

+

number

+

终点的x轴坐标。

+

y1

+

number

+

终点的y轴坐标。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

返回创建的CanvasGradient对象。

+
+ +- 示例 + + ``` + + + + ``` + + ``` + // xxx.js + export default { + handleClick() { + const el = this.$refs.canvas; + const ctx = el.getContext('2d'); + // Linear gradient: start(50,0) end(300,100) + var gradient = ctx.createLinearGradient(50,0, 300,100); + // Add three color stops + gradient.addColorStop(0.0, 'red'); + gradient.addColorStop(0.5, 'white'); + gradient.addColorStop(1.0, 'green'); + // Set the fill style and draw a rectangle + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 500, 500); + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169303416.png) + + +### createRadialGradient6+ + +createRadialGradient\(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number\): Object + +创建一个径向渐变色,返回CanvasGradient对象,请参考CanvasGradient + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x0

+

number

+

起始圆的x轴坐标。

+

y0

+

number

+

起始圆的y轴坐标。

+

r0

+

number

+

起始圆的半径。必须是非负且有限的。

+

x1

+

number

+

终点圆的x轴坐标。

+

y1

+

number

+

终点圆的y轴坐标。

+

r1

+

number

+

终点圆的半径。必须为非负且有限的。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

返回创建的CanvasGradient对象。

+
+ +- 示例 + + ``` + + + + ``` + + ``` + // xxx.js + export default { + handleClick() { + const el = this.$refs.canvas; + const ctx = el.getContext('2d'); + // Radial gradient: inner circle(200,200,r:50) outer circle(200,200,r:200) + var gradient = ctx.createRadialGradient(200,200,50, 200,200,200); + // Add three color stops + gradient.addColorStop(0.0, 'red'); + gradient.addColorStop(0.5, 'white'); + gradient.addColorStop(1.0, 'green'); + // Set the fill style and draw a rectangle + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 500, 500); + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001169463370.png) + + +### createImageData + +createImageData\(width: number, height: number, imageData: Object\): Object + +创建新的ImageData 对象,请参考[ImageData对象](/pages/000b0100010404)。 + +- 参数 + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

width

+

number

+

ImageData的宽度。

+

height

+

number

+

ImageData的高度。

+

imagedata

+

Object

+

复制现有的ImageData对象。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

返回创建的ImageData对象。

+
+ +- 示例 + + ``` + imageData = ctx.createImageData(50, 100); // Create ImageData with 50px width and 100px height + newImageData = ctx.createImageData(imageData); // Create ImageData using the input imageData + ``` + + +### getImageData + +getImageData\(sx: number, sy: number, sw: number, sh: number\): Object + +以当前canvas指定区域内的像素创建ImageData对象。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

sx

+

number

+

需要输出的区域的左上角x坐标。

+

sy

+

number

+

需要输出的区域的左上角y坐标。

+

sw

+

number

+

需要输出的区域的宽度。

+

sh

+

number

+

需要输出的区域的高度。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

返回包含指定区域像素的ImageData对象。

+
+ +- 示例 + + ``` + var test = this.$element('getImageData'); + var ctx = test.getContext('2d'); + var imageData = ctx.getImageData(0, 0, 280, 300); + ``` + + +### putImageData + +putImageData\(imageData: Object, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number\): void + +使用ImageData数据填充新的矩形区域。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

imagedata

+

Object

+

包含像素值的ImageData对象。

+

dx

+

number

+

填充区域在x轴方向的偏移量。

+

dy

+

number

+

填充区域在y轴方向的偏移量。

+

dirtyX

+

number

+

源图像数据矩形裁切范围左上角距离源图像左上角的x轴偏移量。

+

dirtyY

+

number

+

源图像数据矩形裁切范围左上角距离源图像左上角的y轴偏移量。

+

dirtyWidth

+

number

+

源图像数据矩形裁切范围的宽度。

+

dirtyHeight

+

number

+

源图像数据矩形裁切范围的高度。

+
+ +- 示例 + + ``` + var test = this.$element('putImageData'); + var ctx = test.getContext('2d'); + var imgData = ctx.createImageData(100, 100); + for (var i = 0; i < imgData.data.length; i += 4) { + imgData.data[i + 0] = 255; + imgData.data[i + 1] = 0; + imgData.data[i + 2] = 0; + imgData.data[i + 3] = 255; + } + ctx.putImageData(imgData, 10, 10); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214463283.png) + + +### setLineDash + +setLineDash\(segments: Array\): void + +设置画布的虚线样式。 + +- 参数 + + + + + + + + + + + + +

参数

+

类型

+

描述

+

segments

+

Array

+

作为数组用来描述线段如何交替和间距长度。

+
+ +- 示例 + + ``` + ctx.arc(100, 75, 50, 0, 6.28); + ctx.setLineDash([10,20]); + ctx.stroke(); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001214623229.png) + + +### getLineDash + +getLineDash\(\): Array + +获得当前画布的虚线样式。 + +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Array

+

返回数组,该数组用来描述线段如何交替和间距长度。。

+
+ +- 示例 + + ``` + var info = ctx.getLineDash(); + ``` + + +### transferFromImageBitmap7+ + +transferFromImageBitmap\(bitmap: ImageBitmap\): void + +显示给定的ImageBitmap对象。 + +- 参数 + + + + + + + + + + + + +

参数

+

类型

+

描述

+

bitmap

+

ImageBitmap

+

待显示的ImageBitmap对象。

+
+ +- 示例 + + ``` + var canvas = this.$refs.canvasId.getContext('2d'); + var offscreen = new OffscreenCanvas(500,500); + var offscreenCanvasCtx = offscreen.getContext("2d"); + offscreenCanvasCtx.fillRect(0, 0, 200, 200); + + var bitmap = offscreen.transferToImageBitmap(); + canvas.transferFromImageBitmap(bitmap); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001168984882.png) + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/03.Image\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/03.Image\345\257\271\350\261\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..44f55fe406e45fb1fbefa69a37482f40283184f6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/03.Image\345\257\271\350\261\241.md" @@ -0,0 +1,107 @@ +--- +title: Image对象 +permalink: /pages/000b0100010402 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# Image对象 + +图片对象。 + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

默认值

+

必填

+

描述

+

src

+

string

+

-

+

+

图片资源的路径。。

+

width

+

<length>

+

0px

+

+

图片的宽度。

+

height

+

<length>

+

0px

+

+

图片的高度。

+

onload

+

Function

+

-

+

+

图片加载成功后触发该事件,无参数。

+

onerror

+

Function

+

-

+

+

图片加载失败后触发该事件,无参数。

+
+ +## 示例 + +``` +var ctx = this.$element('drawImage').getContext('2d'); +var img = new Image(); +img.src = 'common/images/example.jpg'; +img.onload = function() { + console.log('Image load success'); + ctx.drawImage(img, 0, 0, 360, 250); +}; +img.onerror = function() { + console.log('Image load fail'); +}; +``` + +![](/images/application-dev/reference/arkui-js/figures/1-2.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/04.CanvasGradient\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/04.CanvasGradient\345\257\271\350\261\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..b51c74268ef7656857d61c69ccbf100b65a0456c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/04.CanvasGradient\345\257\271\350\261\241.md" @@ -0,0 +1,62 @@ +--- +title: CanvasGradient对象 +permalink: /pages/000b0100010403 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# CanvasGradient对象 + +渐变对象。 + +## addColorStop + +addColorStop\(offset: number, color: string\): void + +设置渐变断点值,包括偏移和颜色。 + +- 参数 + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

offset

+

number

+

设置渐变点距离起点的位置占总体长度的比例,范围为0到1。

+

color

+

string

+

设置渐变的颜色。

+
+ +- 示例 + + ``` + const gradient = ctx.createLinearGradient(0,0,100,0); + gradient.addColorStop(0,'#00ffff'); + gradient.addColorStop(1,'#ffff00'); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001152610806.png) + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/05.ImageData\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/05.ImageData\345\257\271\350\261\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..278cee5384a2263f54656ee55097eae842eb3ab8 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/05.ImageData\345\257\271\350\261\241.md" @@ -0,0 +1,52 @@ +--- +title: ImageData对象 +permalink: /pages/000b0100010404 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# ImageData对象 + +ImageData对象可以存储canvas渲染的像素数据。 + +## 属性 + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

描述

+

width

+

number

+

矩形区域实际像素宽度。

+

height

+

number

+

矩形区域实际像素高度。

+

data

+

<Uint8ClampedArray>

+

一维数组,保存了相应的颜色数据,数据值范围为0到255。

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/06.Path2D\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/06.Path2D\345\257\271\350\261\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..20ceec2f061b0fe229e1455883be675593924a6c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/06.Path2D\345\257\271\350\261\241.md" @@ -0,0 +1,679 @@ +--- +title: Path2D对象 +permalink: /pages/000b0100010405 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# Path2D对象 + +路径对象,支持通过对象的接口进行路径的描述,并通过Canvas的stroke接口进行绘制。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从 API Version 6 开始支持。 + +## addPath + +addPath\(path: Object\): void + +将另一个路径添加到当前的路径对象中。 + +- 参数 + + + + + + + + + + + + +

参数

+

类型

+

描述

+

path

+

Object

+

需要添加到当前路径的路径对象

+
+ +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164873.png) + + ``` + const ctx = canvas.getContext('2d'); + var path1 = ctx.createPath2D("M250 150 L150 350 L350 350 Z"); + var path2 = ctx.createPath2D(); + path2.addPath(path1); + ctx.stroke(path2); + ``` + + +## setTransform + +setTransform\(scaleX: number, skewX: number, skewY: number, scaleY: number, translateX: number, translateY: number\): void + +依据圆弧经过的点和圆弧半径创建圆弧路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

scaleX

+

number

+

x轴的缩放比例

+

skewX

+

number

+

x轴的倾斜角度

+

skewY

+

number

+

y轴的倾斜角度

+

scaleY

+

number

+

y轴的缩放比例

+

translateX

+

number

+

x轴的平移距离

+

translateY

+

number

+

y轴的平移距离

+
+ +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125208.png) + + ``` + const ctx = canvas.getContext('2d'); + var path = ctx.createPath2D("M250 150 L150 350 L350 350 Z"); + path.setTransform(0.8, 0, 0, 0.4, 0, 0); + ctx.stroke(path); + ``` + + +## closePath + +closePath\(\): void + +将路径的当前点移回到路径的起点,当前点到起点间画一条直线。如果形状已经闭合或只有一个点,则此功能不执行任何操作。 + +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125202.png) + + ``` + const ctx = canvas.getContext('2d'); + var path = ctx.createPath2D(); + path.moveTo(200, 100); + path.lineTo(300, 100); + path.lineTo(200, 200); + path.closePath(); + ctx.stroke(path); + ``` + + +## moveTo + +moveTo\(x: number, y: number\): void + +将路径的当前坐标点移动到目标点,移动过程中不绘制线条。 + +- 参数 + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

目标点X轴坐标

+

y

+

number

+

目标点Y轴坐标

+
+ +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164869.png) + + ``` + const ctx = canvas.getContext('2d'); + var path = ctx.createPath2D(); + path.moveTo(50, 100); + path.lineTo(250, 100); + path.lineTo(150, 200); + path.closePath(); + ctx.stroke(path); + ``` + + +## lineTo + +lineTo\(x: number, y: number\): void + +从当前点绘制一条直线到目标点。 + +- 参数 + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

目标点X轴坐标

+

y

+

number

+

目标点Y轴坐标

+
+ +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127285024.png) + + ``` + const ctx = canvas.getContext('2d'); + var path = ctx.createPath2D(); + path.moveTo(100, 100); + path.lineTo(100, 200); + path.lineTo(200, 200); + path.lineTo(200, 100); + path.closePath(); + ctx.stroke(path); + ``` + + +## bezierCurveTo + +bezierCurveTo\(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number\): void + +创建三次贝赛尔曲线的路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

cp1x

+

number

+

第一个贝塞尔参数的x坐标值。

+

cp1y

+

number

+

第一个贝塞尔参数的y坐标值。

+

cp2x

+

number

+

第二个贝塞尔参数的x坐标值。

+

cp2y

+

number

+

第二个贝塞尔参数的y坐标值。

+

x

+

number

+

路径结束时的x坐标值。

+

y

+

number

+

路径结束时的y坐标值。

+
+ +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324783.png) + + ``` + const ctx = canvas.getContext('2d'); + var path = ctx.createPath2D(); + path.moveTo(10, 10); + path.bezierCurveTo(20, 100, 200, 100, 200, 20); + ctx.stroke(path); + ``` + + +## quadraticCurveTo + +quadraticCurveTo\(cpx: number, cpy: number, x: number ,y: number\): void + +创建二次贝赛尔曲线的路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

cpx

+

number

+

贝塞尔参数的x坐标值。

+

cpy

+

number

+

贝塞尔参数的y坐标值。

+

x

+

number

+

路径结束时的x坐标值。

+

y

+

number

+

路径结束时的y坐标值。

+
+ +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164871.png) + + ``` + const ctx = canvas.getContext('2d'); + var path = ctx.createPath2D(); + path.moveTo(10, 10); + path.quadraticCurveTo(100, 100, 200, 20); + ctx.stroke(path); + ``` + + +## arc + +arc\(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise: number\): void + +绘制弧线路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

弧线圆心的x坐标值。

+

y

+

number

+

弧线圆心的y坐标值。

+

radius

+

number

+

弧线的圆半径。

+

startAngle

+

number

+

弧线的起始弧度。

+

endAngle

+

number

+

弧线的终止弧度。

+

anticlockwise

+

boolean

+

是否逆时针绘制圆弧。

+
+ +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164867.png) + + ``` + const ctx = canvas.getContext('2d'); + var path = ctx.createPath2D(); + path.arc(100, 75, 50, 0, 6.28); + ctx.stroke(path); + ``` + + +## arcTo + +arcTo\(x1: number, y1: number, x2: number, y2: number, radius: number\): void + +依据圆弧经过的点和圆弧半径创建圆弧路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x1

+

number

+

圆弧经过的第一个点的x坐标值。

+

y1

+

number

+

圆弧经过的第一个点的y坐标值。

+

x2

+

number

+

圆弧经过的第二个点的x坐标值。

+

y2

+

number

+

圆弧经过的第二个点的y坐标值。

+

radius

+

number

+

圆弧的圆半径值。

+
+ +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125204.png) + + ``` + const ctx = canvas.getContext('2d'); + var path = ctx.createPath2D(); + path.arcTo(150, 20, 150, 70, 50); + ctx.stroke(path); + ``` + + +## ellipse + +ellipse\(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: number\): void + +在规定的矩形区域绘制一个椭圆。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

椭圆圆心的x轴坐标。

+

y

+

number

+

椭圆圆心的y轴坐标。

+

radiusX

+

number

+

椭圆x轴的半径长度。

+

radiusY

+

number

+

椭圆y轴的半径长度。

+

rotation

+

number

+

椭圆的旋转角度,单位为弧度。

+

startAngle

+

number

+

椭圆绘制的起始点角度,以弧度表示。

+

endAngle

+

number

+

椭圆绘制的结束点角度,以弧度表示。

+

anticlockwise

+

number

+

是否以逆时针方向绘制椭圆,0为顺时针,1为逆时针。(可选参数,默认为0)

+
+ +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324787.png) + + ``` + const ctx = canvas.getContext('2d'); + var path = ctx.createPath2D(); + path.ellipse(200, 200, 50, 100, Math.PI * 0.25, Math.PI * 0.5, Math.PI, 1); + ctx.stroke(path); + ``` + + +## rect + +rect\(x: number, y: number, width: number, height: number\): void + +创建矩形路径。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

类型

+

描述

+

x

+

number

+

指定矩形的左上角x坐标值。

+

y

+

number

+

指定矩形的左上角y坐标值。

+

width

+

number

+

指定矩形的宽度。

+

height

+

number

+

指定矩形的高度。

+
+ +- 示例 + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125212.png) + + ``` + const ctx = canvas.getContext('2d'); + var path = ctx.createPath2D(); + path.rect(20, 20, 100, 100); + ctx.stroke(path); + ``` + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/07.ImageBitmap\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/07.ImageBitmap\345\257\271\350\261\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..3465a74b90645b765f3f98d1500a4deb0f1367b1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/07.ImageBitmap\345\257\271\350\261\241.md" @@ -0,0 +1,48 @@ +--- +title: ImageBitmap对象 +permalink: /pages/000b0100010406 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# ImageBitmap对象 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +ImageBitmap对象由OffscreenCanvas对象的transferToImageBitmap\(\)方法生成,存储了offscreen canvas渲染的像素数据。 + +## 属性 + + + + + + + + + + + + + + + + +

属性

+

类型

+

描述

+

width

+

number

+

ImageBitmap的像素宽度。

+

height

+

number

+

ImageBitmap的像素高度。

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/08.OffscreenCanvas\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/08.OffscreenCanvas\345\257\271\350\261\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..3e51835d310d57ccd8d10f579812bf4d812bd2c7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/08.OffscreenCanvas\345\257\271\350\261\241.md" @@ -0,0 +1,206 @@ +--- +title: OffscreenCanvas对象 +permalink: /pages/000b0100010407 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# OffscreenCanvas对象 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +可以离屏渲染的canvas对象。 + +## 属性 + + + + + + + + + + + + + + + + +

属性

+

类型

+

描述

+

width

+

number

+

offscreen canvas对象的宽度。

+

height

+

number

+

offscreen canvas对象的高度。

+
+ +## 方法 + +### getContext + +getContext\(type: string, options?: CanvasRenderingContext2DSettings\): OffscreenCanvasRenderingContext2D + +获取offscreen canvas绘图上下文,返回值为2D绘制对象。 + +- 参数 + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

描述

+

contextId

+

string

+

+

仅支持"2d"。

+

options

+

CanvasRenderingContext2DSettings

+

+

用于在离屏画布上进行绘制矩形、文本、图片等

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

OffscreenCanvasRenderingContext2D

+

用于在画布组件上绘制矩形、文本、图片等

+
+ + +### toDataURL + +toDataURL\(type?: string, quality?:number\): + +生成一个包含图片展示的URL。 + +- 参数 + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

描述

+

type

+

string

+

+

可选参数,用于指定图像格式,默认格式为image/png。

+

quality

+

number

+

+

在指定图片格式为image/jpeg或image/webp的情况下,可以从0到1的区间内选择图片的质量。如果超出取值范围,将会使用默认值0.92。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

string

+

图像的URL地址。

+
+ + +### transferToImageBitmap + +transferToImageBitmap\(\): ImageBitmap + +在离屏画布最近渲染的图像上创建一个ImageBitmap对象。 + +- 返回值 + + + + + + + + + + +

类型

+

说明

+

ImageBitmap

+

存储离屏画布上渲染的像素数据。

+
+ + +## 示例 + +``` +var canvas = this.$refs.canvasId.getContext('2d'); +var offscreen = new OffscreenCanvas(500,500); +var offscreenCanvasCtx = offscreen.getContext("2d"); + +// ... some drawing for the canvas using the offscreenCanvasCtx ... + +var dataURL = offscreen.toDataURL(); +console.log(dataURL); //data:image/png;base64,xxxxxx + +var bitmap = offscreen.transferToImageBitmap(); +canvas.transferFromImageBitmap(bitmap); +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/09.OffscreenCanvasRenderingContext2D\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/09.OffscreenCanvasRenderingContext2D\345\257\271\350\261\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..656612a7cc2e838222bd1afd3b8db62989e74071 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/09.OffscreenCanvasRenderingContext2D\345\257\271\350\261\241.md" @@ -0,0 +1,322 @@ +--- +title: OffscreenCanvasRenderingContext2D对象 +permalink: /pages/000b0100010408 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:38 +--- +# OffscreenCanvasRenderingContext2D对象 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +使用OffscreenCanvasRenderingContext2D在offscreen canvas上进行绘制,绘制对象可以是矩形、文本、图片等 + +## 属性 + +除支持与CanvasRenderingContext2D对象相同的属性外,还支持如下属性: + + + + + + + + + + + + +

属性

+

类型

+

描述

+

filter

+

string

+

设置图像的滤镜。

+

支持的滤镜效果如下:

+
  • blur:给图像设置高斯模糊
  • brightness:给图片应用一种线性乘法,使其看起来更亮或更暗
  • contrast:调整图像的对比度
  • drop-shadow:给图像设置一个阴影效果
  • grayscale:将图像转换为灰度图像
  • hue-rotate:给图像应用色相旋转
  • invert:反转输入图像
  • opacity:转化图像的透明程度
  • saturate:转换图像饱和度
  • sepia:将图像转换为深褐色
+
+ +- 示例 + +``` +var ctx = this.$refs.canvasid.getContext('2d'); +var offscreen = new OffscreenCanvas(360, 500); +var offCanvas2 = offscreen.getContext("2d"); +var img = new Image(); +img.src = 'common/images/flower.jpg'; +offCanvas2.drawImage(img, 0, 0, 100, 100); +offCanvas2.filter = 'blur(5px)'; +offCanvas2.drawImage(img, 100, 0, 100, 100); + +offCanvas2.filter = 'grayscale(50%)'; +offCanvas2.drawImage(img, 200, 0, 100, 100); + +offCanvas2.filter = 'hue-rotate(90deg)'; +offCanvas2.drawImage(img, 0, 100, 100, 100); + +offCanvas2.filter = 'invert(100%)'; +offCanvas2.drawImage(img, 100, 100, 100, 100); + +offCanvas2.filter = 'drop-shadow(8px 8px 10px green)'; +offCanvas2.drawImage(img, 200, 100, 100, 100); + +offCanvas2.filter = 'brightness(0.4)'; +offCanvas2.drawImage(img, 0, 200, 100, 100); + +offCanvas2.filter = 'opacity(25%)'; +offCanvas2.drawImage(img, 100, 200, 100, 100); + +offCanvas2.filter = 'saturate(30%)'; +offCanvas2.drawImage(img, 200, 200, 100, 100); + +offCanvas2.filter = 'sepia(60%)'; +offCanvas2.drawImage(img, 0, 300, 100, 100); + +offCanvas2.filter = 'contrast(200%)'; +offCanvas2.drawImage(img, 100, 300, 100, 100); +var bitmap = offscreen.transferToImageBitmap(); +ctx.transferFromImageBitmap(bitmap); +``` + +![](/images/application-dev/reference/arkui-js/figures/c3.png) + +## 方法 + +除支持与CanvasRenderingContext2D对象相同的方法外,还支持如下方法: + +### isPointInPath + +isPointInPath\(path?: Path2D, x: number, y: number\): boolean + +判断指定点是否在路径的区域内。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

描述

+

path

+

Path2D

+

+

可选对象,指定用来判断的路径。若没有设置,则使用当前路径。

+

x

+

number

+

+

待判断点的x轴坐标。

+

y

+

number

+

+

待判断点的y轴坐标。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

boolean

+

指定点是否在路径的区域内。

+
+ +- 示例 + + ``` + +
+ In path:{{textValue}} +
+ + ``` + + ``` + // xxx.js + export default { + data: { + textValue: 0 + }, + onShow(){ + var canvas = this.$refs.canvas.getContext('2d'); + var offscreen = new OffscreenCanvas(500,500); + var offscreenCanvasCtx = offscreen.getContext("2d"); + + offscreenCanvasCtx.rect(10, 10, 100, 100); + offscreenCanvasCtx.fill(); + this.textValue = offscreenCanvasCtx.isPointInPath(30, 70); + + var bitmap = offscreen.transferToImageBitmap(); + canvas.transferFromImageBitmap(bitmap); + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001224354967.png) + + +### isPointInStroke + +isPointInStroke\(path?: Path2D, x: number, y: number\): boolean + +判断指定点是否在路径的边缘线上。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

描述

+

path

+

Path2D

+

+

可选对象,指定用来判断的路径。若没有设置,则使用当前路径。

+

x

+

number

+

+

待判断点的x轴坐标。

+

y

+

number

+

+

待判断点的y轴坐标。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

boolean

+

指定点是否在路径的区域内。

+
+ +- 示例 + + ``` + +
+ In path:{{textValue}} +
+ + ``` + + ``` + // xxx.js + export default { + data: { + textValue: 0 + }, + onShow(){ + var canvas = this.$refs.canvas.getContext('2d'); + var offscreen = new OffscreenCanvas(500,500); + var offscreenCanvasCtx = offscreen.getContext("2d"); + + offscreenCanvasCtx.rect(10, 10, 100, 100); + offscreenCanvasCtx.stroke(); + this.textValue = offscreenCanvasCtx.isPointInStroke(50, 10); + + var bitmap = offscreen.transferToImageBitmap(); + canvas.transferFromImageBitmap(bitmap); + } + } + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001178875308.png) + + +### resetTransform + +resetTransform\(\): void + +- 示例 + + ``` + var canvas = this.$refs.canvas.getContext('2d'); + var offscreen = new OffscreenCanvas(500,500); + var offscreenCanvasCtx = offscreen.getContext("2d"); + + offscreenCanvasCtx.transform(1, 0, 1.7, 1, 0, 0); + offscreenCanvasCtx.fillStyle = 'gray'; + offscreenCanvasCtx.fillRect(40, 40, 50, 20); + offscreenCanvasCtx.fillRect(40, 90, 50, 20); + + // Non-skewed rectangles + offscreenCanvasCtx.resetTransform(); + offscreenCanvasCtx.fillStyle = 'red'; + offscreenCanvasCtx.fillRect(40, 40, 50, 20); + offscreenCanvasCtx.fillRect(40, 90, 50, 20); + + var bitmap = offscreen.transferToImageBitmap(); + canvas.transferFromImageBitmap(bitmap); + ``` + + ![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001179035242.png) + + diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" similarity index 79% rename from "website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" rename to "website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" index bc86825ec370b77392a16fc24166e342f2236be2..9344f9abf6c13187148c89b9f0524d0930b60967 100644 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -1,6 +1,6 @@ --- title: 基本概念 -permalink: /pages/000d010500 +permalink: /pages/000b0100010500 navbar: true sidebar: true prev: true @@ -9,11 +9,9 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:46 +date: 2021-12-30 18:31:39 --- -# 基本概念 - -- [栅格系统的概念](#zh-cn_topic_0000001124631123_section1429110563714) +# 基本概念 提供栅格布局效果,通过栅格系统进行元素布局,主要提供栅格容器组件。 @@ -26,12 +24,12 @@ date: 2021-12-30 12:57:46 3. 给应用提供一种灵活的间距调整方法,满足特殊场景布局调整的可能性。 ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** >从API Version 5 开始支持。 -## 栅格系统的概念 +## 栅格系统的概念 -栅格系统有Margins,Gutters,Columns三个属性。 +栅格系统有Margins、Gutters、Columns三个属性。 1. Margins: @@ -43,7 +41,7 @@ date: 2021-12-30 12:57:46 3. Columns: - 是用来辅助布局的主要定位工具,不同的屏幕尺寸匹配不同的Columns数量来辅助布局定位。Columns的宽度在保证Margins和Gutters符合规范的情况下,根据实际设备的宽度和Columns数量自动计算每一个Columns的宽度。![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001079072496.png) + 是用来辅助布局的主要定位工具,不同的屏幕尺寸匹配不同的Columns数量来辅助布局定位。Columns的宽度在保证Margins和Gutters符合规范的情况下,根据实际设备的宽度和Columns数量自动计算每一个Columns的宽度。![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127125136.png) **栅格断点系统** diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/02.grid-container.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/02.grid-container.md" new file mode 100644 index 0000000000000000000000000000000000000000..6ddb311d7ff3a64ebfef1904c7ef61dddb74bad1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/02.grid-container.md" @@ -0,0 +1,291 @@ +--- +title: grid-container +permalink: /pages/000b0100010501 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# grid-container + +栅格布局容器根节点,使用grid-row与grid-col进行栅格布局。 + +## 权限列表 + +无 + +## 子组件 + +仅支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

columns

+

string | number

+

auto

+

+

设置当前布局总列数,使用string类型时仅支持auto,配置为auto时按照当前的sizetype决定总列数:

+
  • xs:2列
  • sm:4列
  • md:8列
  • lg:12列
+

sizetype

+

string

+

auto

+

+

设置当前栅格使用的响应尺寸类型,支持xs, sm, md, lg类型,使用auto时按照当前容器大小自动选择xs, sm, md, lg类型。

+

gutter

+

<length>

+

24px

+

+

设置Gutter宽度

+

gridtemplate6+

+

string

+

default

+

+

当设置了columns和sizetype属性为auto时,可以设置栅格容器的布局模板,通过布局模块设置不同响应尺寸下的Columns、Gutters和Margins,详见可选值说明

+
+ +**表 1** gridtemplate可选值说明6+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  

模板值

+

可响应的栅格断点系统

+

Columns

+

Margins(px)

+

Gutters(px)

+

默认栅格

+

default

+

xs

+

2

+

12

+

12

+

sm

+

4

+

24

+

24

+

md

+

8

+

32

+

24

+

lg

+

12

+

48

+

24

+

宫格布局栅格

+

grid

+

sm(0<设备水平分辨率<600px)

+

4

+

24

+

12

+

md

+

8

+

32

+

12

+

lg

+

12

+

48

+

12

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 本章中px单位是在js标签中配置了autoDesignWidth为true。6+ + +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

justify-content

+

string

+

flex-start

+

+

flex容器当前行的主轴对齐格式。可选项有:

+
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
+

align-items

+

string

+

stretch

+

+

flex容器当前行的交叉轴对齐格式,可选值为:

+
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
+

align-content

+

string

+

flex-start

+

+

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

+
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
+
+ +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +除支持[通用方法](/pages/000b0100010003)外,还支持如下方法: + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

描述

+

getColumns

+

-

+

返回栅格容器列数

+

getColumnWidth

+

-

+

返回栅格容器column宽度

+

getGutterWidth

+

-

+

返回栅格容器gutter宽度

+

getSizeType

+

-

+

返回当前容器响应尺寸类型(xs|sm|md|lg)

+
+ +## 示例 + +详见[grid-col示例](/pages/000b0100010503#section2021865273710)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/03.grid-row.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/03.grid-row.md" new file mode 100644 index 0000000000000000000000000000000000000000..59638fd1970bf4d124023741890b7cf03701ade8 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/03.grid-row.md" @@ -0,0 +1,112 @@ +--- +title: grid-row +permalink: /pages/000b0100010502 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# grid-row + +grid-row是栅格布局容器grid-container的子容器组件,使用flex横向布局,排列每个grid-col容器,justify-content与align-items默认为flex-start,支持折行显示。 + +## 权限列表 + +无 + +## 子组件 + +仅支持。 + +## 属性 + +支持[通用属性](/pages/000b0100010000)。 + +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

flex-wrap

+

string

+

nowrap

+

+

flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:

+
  • nowrap:不换行,单行显示。
  • wrap:换行,多行显示。
+

justify-content

+

string

+

flex-start

+

+

flex容器当前行的主轴对齐格式。可选项有:

+
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
+

align-items

+

string

+

flex-start

+

+

flex容器当前行的交叉轴对齐格式,可选值为:

+
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
+

align-content

+

string

+

flex-start

+

+

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

+
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持宽度相关样式。 + +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +详见[grid-col示例](/pages/000b0100010503#section2021865273710)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/04.grid-col.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/04.grid-col.md" new file mode 100644 index 0000000000000000000000000000000000000000..670a832126a1afdf731408769c984ed15525d4ea --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/04.grid-col.md" @@ -0,0 +1,319 @@ +--- +title: grid-col +permalink: /pages/000b0100010503 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# grid-col + +grid-col是栅格布局容器grid-row的子容器组件。 + +## 权限列表 + +无 + +## 子组件 + +支持。 + +## 属性 + +除支持[通用属性](/pages/000b0100010000)外,还支持如下属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

xs

+

number|object

+

-

+

+

在分辨率为xs模式下,设置该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

+

sm

+

number|object

+

-

+

+

在分辨率为sm模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

+

md

+

number|object

+

-

+

+

在分辨率为md模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

+

lg

+

number|object

+

-

+

+

在分辨率为lg模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

+

span

+

number

+

1

+

+

在未设置明确断点时,默认占用列数

+

offset

+

number

+

0

+

+

未设置具体分辨率模式下偏移时,当前元素延容器布局方向,默认偏移的列数

+
+ +## 样式 + +除支持[通用样式](/pages/000b0100010001)外,还支持如下样式: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

flex-direction

+

string

+

row

+

+

flex容器主轴方向。可选项有:

+
  • column:垂直方向从上到下
  • row:水平方向从左到右
+

flex-wrap

+

string

+

nowrap

+

+

flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:

+
  • nowrap:不换行,单行显示。
  • wrap:换行,多行显示。
+

justify-content

+

string

+

flex-start

+

+

flex容器当前行的主轴对齐格式。可选项有:

+
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
+

align-items

+

string

+

stretch

+

+

flex容器当前行的交叉轴对齐格式,可选值为:

+
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
+

align-content

+

string

+

flex-start

+

+

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

+
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
+

display

+

string

+

flex

+

+

确定该元素视图框的类型,该值暂不支持动态修改。可选值为:

+
  • flex:弹性布局
  • grid:网格布局
  • none:不渲染此元素
+

grid-template-[columns|rows]

+

string

+

1行1列

+

+

用于设置当前网格布局行和列的数量,不设置时默认1行1列,仅当display为grid时生效。

+

示例:如设置grid-template-columns为:

+

(1) 50px 100px 60px:分三列,第一列50px,第二列100px,第三列60px;

+

(2) 1fr 1fr 2fr:分三列,将父组件允许的宽分为4等份,第一列占1份,第二列占一份,第三列占2份;

+

(3) 30% 20% 50%:分三列,将父组件允许的宽为基准,第一列占30%,第二列占20%,第三列占50%;

+

(4) repeat(2,100px):分两列,第一列100px,第二列100px;

+

(5) auto 1fr 1fr:分三列,第一列自适应内部子组件所需宽度,剩余空间分为两等份,第二列占一份,第三列占一份。

+

grid-[columns|rows]-gap

+

<length>

+

0

+

+

用于设置行与行的间距或者列与列的间距,也可以支持通过grid-gap设置相同的行列间距,仅当display为grid时生效。

+

grid-row-[start|end]

+

number

+

-

+

+

用于设置当前元素在网格布局中的起止行号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

+

grid-column-[start|end]

+

number

+

-

+

+

用于设置当前元素在网格布局中的起止列号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持宽度相关样式。 + +## 事件 + +支持[通用事件](/pages/000b0100010002)。 + +## 方法 + +支持[通用方法](/pages/000b0100010003)。 + +## 示例 + +``` + +
+ + + +
+ 內容元素 +
+
+ +
+ 內容元素 +
+
+
+
+
+``` + +``` +/* index.css */ +.container { + flex-direction: column; + padding-top: 80px; +} +``` + +``` +// index.js +import prompt from '@system.prompt'; +export default { + getCol(e) { + this.$element('mygrid').getColumns(function (result) { + prompt.showToast({ + message: e.target.id + ' result = ' + result, + duration: 3000, + }); + }) + }, + getColWidth(e) { + this.$element('mygrid').getColumnWidth(function (result) { + prompt.showToast({ + message: e.target.id + ' result = ' + result, + duration: 3000, + }); + }) + } +} +``` + +![](/images/application-dev/reference/arkui-js/figures/44.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/01.\351\200\232\347\224\250\345\261\236\346\200\247.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/01.\351\200\232\347\224\250\345\261\236\346\200\247.md" new file mode 100644 index 0000000000000000000000000000000000000000..12d7687bc97aea080b83b16db315924903ac9779 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/01.\351\200\232\347\224\250\345\261\236\346\200\247.md" @@ -0,0 +1,186 @@ +--- +title: 通用属性 +permalink: /pages/000b0100010600 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 通用属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

fill

+

<color>

+

black

+

+

使用简写属性设置元素的填充色。支持属性动画。

+

fill-opacity

+

number

+

1

+

+

填充色的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。

+

fill-rule

+

nonzero | evenodd

+

nonzero

+

+

nonzero:非零规则; evenodd:奇偶规则

+

opacity

+

number

+

1

+

+

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。

+

stroke

+

<color>

+

-

+

+

设置形状轮廓的颜色。支持属性动画。

+

stroke-dasharray

+

<string>

+

-

+

+

指定短划线和缺口的长度。格式为[length length length length],短划线和缺口的长度中间空格隔开成对出现。

+

stroke-dashoffset

+

<length>

+

0

+

+

设置关联虚线数组渲染时的偏移量。支持属性动画

+

stroke-linejoin

+

[bevel | miter | round]

+

miter

+

+

进行描边时在路径的拐角处使用的形状。

+

bevel:使用斜角连接路径段;

+

miter:使用尖角连接路径段;

+

round:使用圆角连接路径段。

+

stroke-linecap

+

[butt | round | square]

+

butt

+

+

路径描边时在它们的结尾处使用的形状。

+

butt:不在路径两端扩展;

+

round:在路径的末端延伸半个圆,直径等于线度。

+

square:在路径的末端延伸半个圆,宽度等于线宽的一半,高度等于线宽。

+

stroke-miterlimit

+

number

+

4

+

+

设置将锐角绘制成斜角的极限值。支持属性动画

+

stroke-opacity

+

number

+

1

+

+

轮廓线条的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画

+

stroke-width

+

<length>

+

1px

+

+

设置轮廓线条的宽度。支持属性动画

+

transform

+

<string>

+

-

+

+

设置组件以及子组件的坐标变换参数。

+

支持以下格式:

+

translate(<x> [<y>]) :沿x[y]轴方向平移

+

scale(<x> [<y>]) :沿x[y]轴缩放

+

rotate(<a> [<x> <y>]) :以(x,y)点进行旋转a度角

+

skewX(<a>) :沿x轴倾斜a度角的变换

+

skewY(<a>) :沿y轴倾斜a度角的变换

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/02.svg.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/02.svg.md" new file mode 100644 index 0000000000000000000000000000000000000000..cd9259eac5e34b37f391704f2594c54b13ceb91d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/02.svg.md" @@ -0,0 +1,136 @@ +--- +title: svg +permalink: /pages/000b0100010601 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# svg + +基础容器,主要作为svg的根节点使用,也可以在svg中嵌套使用。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 +>约束条件:svg父组件或者svg组件需要定义宽高值,否则不进行绘制。 + +## 权限列表 + +无 + +## 子组件 + +支持svg、rect、circle、ellipse、path、line、polygon、polyline、text、animate、animateTransform。 + +## 属性 + +支持所列的Svg组件通用属性和以下表格的属性,设置的通用属性会传递给子组件。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

width

+

<length>|<percentage>

+

-

+

+

设置组件的宽度

+

height

+

<length>|<percentage>

+

-

+

+

设置组件的高度

+

x

+

<length>|<percentage>

+

-

+

+

设置当前svg的x轴坐标,根svg节点无效

+

y

+

<length>|<percentage>

+
  

+

设置当前svg的y轴坐标,根svg节点无效

+

viewBox

+

string

+

-

+

+

设置当前svg的视口。支持的格式为<number number number number>,4个参数分别表示min-x, min-y, width and height,viewBox的宽高和svg的宽高不一致,会以中心对齐进行缩放。

+
+ +## 示例 + +``` + +
+ + + + + + + + + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164789.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/03.rect.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/03.rect.md" new file mode 100644 index 0000000000000000000000000000000000000000..9b37ed73b5a97f8358d56bd93a372d11fcf8708b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/03.rect.md" @@ -0,0 +1,142 @@ +--- +title: rect +permalink: /pages/000b0100010602 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# rect + +用于绘制矩形、圆角矩形。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持animate、animateMotion、animateTransform。 + +## 属性 + +支持所列的Svg组件通用属性和以下表格的属性。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

width

+

<length>|<percentage>

+

0

+

+

设置矩形的宽度。支持属性动画

+

height

+

<length>|<percentage>

+

0

+

+

设置矩形的高度。支持属性动画

+

x

+

<length>|<percentage>

+

0

+

+

设置矩形左上角x轴坐标。支持属性动画

+

y

+

<length>|<percentage>

+

0

+

+

设置矩形左上角y轴坐标。支持属性动画

+

rx

+

<length>|<percentage>

+

0

+

+

设置矩形圆角x方向半径。支持属性动画

+

ry

+

<length>|<percentage>

+

0

+

+

设置矩形圆角y方向半径。支持属性动画

+
+ +## 示例 + +``` + +
+ + + + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/0.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/04.circle.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/04.circle.md" new file mode 100644 index 0000000000000000000000000000000000000000..4caa869fcb0f0884fb91ac1c52a1a792d3034260 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/04.circle.md" @@ -0,0 +1,106 @@ +--- +title: circle +permalink: /pages/000b0100010603 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# circle + +圆形形状。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持animate、animateMotion、animateTransform。 + +## 属性 + +支持所列的Svg组件通用属性和以下表格的属性。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

cx

+

<length>|<percentage>

+

0

+

+

设置圆心的x轴坐标。支持属性动画

+

cy

+

<length>|<percentage>

+

0

+

+

设置圆心的y轴坐标。支持属性动画

+

r

+

<length>|<percentage>

+

0

+

+

设置圆的半径。支持属性动画

+
+ +## 示例 + +``` + +
+ + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164853.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/05.ellipse.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/05.ellipse.md" new file mode 100644 index 0000000000000000000000000000000000000000..53cbcceba2b76396efc6478f20e62cd2bebaeb9b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/05.ellipse.md" @@ -0,0 +1,117 @@ +--- +title: ellipse +permalink: /pages/000b0100010604 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# ellipse + +椭圆形状。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持animate、animateMotion、animateTransform。 + +## 属性 + +支持所列的Svg组件通用属性和以下表格的属性。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

cx

+

<length>|<percentage>

+

0

+

+

设置椭圆的x轴坐标。支持属性动画

+

cy

+

<length>|<percentage>

+

0

+

+

设置椭圆的y轴坐标。支持属性动画

+

rx

+

<length>|<percentage>

+

0

+

+

设置椭圆x轴的半径。支持属性动画

+

ry

+

<length>|<percentage>

+

0

+

+

设置椭圆y轴的半径。支持属性动画

+
+ +## 示例 + +``` + +
+ + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164793.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/06.path.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/06.path.md" new file mode 100644 index 0000000000000000000000000000000000000000..1d2b2272c3f768f7a9e7670d6262237962b19b11 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/06.path.md" @@ -0,0 +1,87 @@ +--- +title: path +permalink: /pages/000b0100010605 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# path + +绘制路径。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持animate、animateMotion、animateTransform。 + +## 属性 + +支持所列的Svg组件通用属性和以下表格的属性,设置的通用属性会传递给子组件。 + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

d

+

string

+

-

+

+

设置路径的形状。包含一组字符指令,大写字母为绝对路径,小写字符为相对路径。

+

字母指令表示的意义如下:

+
  • M/m = moveto
  • L/l = lineto
  • H/h = horizontal lineto
  • V/v = vertical lineto
  • C/c = curveto
  • S/s = smooth curveto
  • Q/q = quadratic Belzier curve
  • T/t = smooth quadratic Belzier curveto
  • A/a = elliptical Arc
  • Z/z = closepath
+
+ +## 示例 + +``` + +
+ + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164891.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/07.line.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/07.line.md" new file mode 100644 index 0000000000000000000000000000000000000000..83d8def46cd2ad1fd9828d8df367a0124ae3a265 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/07.line.md" @@ -0,0 +1,121 @@ +--- +title: line +permalink: /pages/000b0100010606 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# line + +绘制线条。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持animate、animateMotion、animateTransform。 + +## 属性 + +支持所列的Svg组件通用属性和以下表格的属性。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

x1

+

<length>|<percentage>

+

-

+

+

设置线条起点的x轴坐标。支持属性动画

+

y1

+

<length>|<percentage>

+

-

+

+

设置线条起点的y轴坐标。支持属性动画

+

x2

+

<length>|<percentage>

+

-

+

+

设置线条终点的x轴坐标。支持属性动画

+

y2

+

<length>|<percentage>

+

-

+

+

设置线条终点的y轴坐标。支持属性动画

+
+ +## 示例 + +``` + +
+ + + + + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001127284954.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/08.polyline.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/08.polyline.md" new file mode 100644 index 0000000000000000000000000000000000000000..82a3909f50503b2219ddc497f7fafe678587306f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/08.polyline.md" @@ -0,0 +1,86 @@ +--- +title: polyline +permalink: /pages/000b0100010607 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# polyline + +绘制折线。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持animate、animateMotion、animateTransform。 + +## 属性 + +支持所列的Svg组件通用属性和以下表格的属性。 + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

points

+

string

+

-

+

+

设置折线的多个坐标点

+

格式为[x1,y1 x2,y2 x3,y3]。

+

支持属性动画,如果属性动画里设置的动效变化值的坐标个数与原始points的格式不一样,则无效

+
+ +## 示例 + +``` + +
+ + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173164845.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/09.polygon.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/09.polygon.md" new file mode 100644 index 0000000000000000000000000000000000000000..a542dab1daaf6163d8d03368bb8eaa1079292dc2 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/09.polygon.md" @@ -0,0 +1,86 @@ +--- +title: polygon +permalink: /pages/000b0100010608 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# polygon + +绘制多边形。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +支持animate、animateMotion、animateTransform。 + +## 属性 + +支持所列的Svg组件通用属性和以下表格的属性。 + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

points

+

string

+

-

+

+

设置多边形的多个坐标点

+

格式为[x1,y1 x2,y2 x3,y3]。

+

支持属性动画,如果属性动画里设置的动效变化值的坐标个数与原始points的格式不一样,则无效

+
+ +## 示例 + +``` + +
+ + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/zh-cn_image_0000001173324721.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/10.text.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/10.text.md" new file mode 100644 index 0000000000000000000000000000000000000000..5e7eace748b43434cac60f7341f1c18cff29e922 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/10.text.md" @@ -0,0 +1,290 @@ +--- +title: text +permalink: /pages/000b0100010609 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# text + +文本,用于呈现一段信息。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 从API Version 7 开始支持。 +>- 文本的展示内容需要写在元素标签内,可嵌套tspan子元素标签分段,可嵌套textPath子元素标签按指定路径绘制。 +>- 只支持被父元素标签svg嵌套。 +>- 只支持默认字体sans-serif + +## 权限列表 + +无 + +## 子组件 + +支持tspan、textpath、animate、animateTransform。 + +## 属性 + +支持以下表格中的属性。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

x

+

<length>|<percentage>

+

0

+

+

设置组件左上角x轴坐标

+

y

+

<length>|<percentage>

+

0

+

+

设置组件左上角y轴坐标

+

dx

+

<length>|<percentage>

+

0

+

+

设置文本x轴偏移

+

dy

+

<length>|<percentage>

+

0

+

+

设置文本y轴偏移

+

rotate

+

number

+

0

+

+

字体以左下角为圆心旋转角度,正数顺时针,负数逆时针

+

font-size

+

<length>

+

30px

+

+

设置文本的尺寸。

+

fill

+

<color>

+

black

+

+

字体填充颜色

+

fill-opacity

+

number

+

1.0

+

+

字体填充透明度

+

opacity

+

number

+

1

+

+

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。

+

stroke

+

<color>

+

black

+

+

绘制字体边框并指定颜色

+

stroke-width

+

number

+

1px

+

+

字体边框宽度

+

stroke-opacity

+

number

+

1.0

+

+

字体边框透明度

+
+ +## 示例 + +``` +/* xxx.css */ +.container { + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + height: 1000px; + width: 1080px; +} +``` + +``` + +
+ + test x|y + test x|y + test opacity + test dx|dy|fill|font-size + test fill-opacity + test 0123456789 + test 中文 + test rotate + test stroke + test stroke-opacity + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/text-part1.png) + +属性动画示例 + +``` +/* xxx.css */ +.container { + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + height: 3000px; + width: 1080px; +} +``` + +``` + +
+ + + + + + text attribute x|opacity|rotate + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/text-animate-part1.gif) + +``` + +
+ + + text attribute font-size + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/text-animate-part2.gif) + +``` + +
+ + + text attribute stroke + + + + text attribute stroke-width-opacity + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/text-animate-part3.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/11.tspan.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/11.tspan.md" new file mode 100644 index 0000000000000000000000000000000000000000..493d11d18c37cb95039802e28a27277184a092f7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/11.tspan.md" @@ -0,0 +1,318 @@ +--- +title: tspan +permalink: /pages/000b010001060a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# tspan + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 从API Version 7 开始支持。 +>- 文本的展示内容需要写在元素标签内,可嵌套子元素标签tspan分段。 +>- 文本分段,只支持被父元素标签svg嵌套。 + +## 权限列表 + +无 + +## 子组件 + +支持tspan。 + +支持以下表格中的属性。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

x

+

<length>|<percentage>

+

0

+

+

设置组件左上角x轴坐标

+

y

+

<length>|<percentage>

+

0

+

+

设置组件左上角y轴坐标。作为textpath子组件时失效。

+

dx

+

<length>|<percentage>

+

0

+

+

设置文本x轴偏移

+

dy

+

<length>|<percentage>

+

0

+

+

设置文本y轴偏移。作为textpath子组件时失效。

+

rotate

+

number

+

0

+

+

字体以左下角为圆心旋转角度,正数顺时针,负数逆时针

+

font-size

+

<length>

+

30px

+

+

设置文本的尺寸。

+

fill

+

<color>

+

black

+

+

字体填充颜色

+

opacity

+

number

+

1

+

+

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。

+

fill-opacity

+

number

+

1.0

+

+

字体填充透明度

+

stroke

+

<color>

+

black

+

+

绘制字体边框并指定颜色

+

stroke-width

+

number

+

1px

+

+

字体边框宽度

+

stroke-opacity

+

number

+

1.0

+

+

字体边框透明度

+
+ +## 示例 + +``` +/* xxx.css */ +.container { + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + height: 1000px; + width: 1080px; +} +``` + +``` + +
+ + + zero text. + first span. + second span. + third span. + + + first span. + second span. + third span. + forth span. + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/tspan-part1.png) + +属性动画示例 + +``` +/* xxx.css */ +.container { + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + height: 3000px; + width: 1080px; +} +``` + +``` + +
+ + + + tspan attribute x|opacity|rotate + + + + + + + + + tspan attribute dx + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/tspan-animate-part1.gif) + +``` + +
+ + + + tspan attribute fill|fill-opacity + + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/tspan-animate-part2.gif) + +``` + +
+ + + + tspan attribute font-size + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/tspan-animate-part3.gif) + +``` + +
+ + + + tspan attribute stroke + + + + + + tspan attribute stroke-width-opacity + + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/tspan-animate-part4.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/12.textPath.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/12.textPath.md" new file mode 100644 index 0000000000000000000000000000000000000000..b0118a455e3fa6fa23d03e4515664a3fd4f76cb0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/12.textPath.md" @@ -0,0 +1,394 @@ +--- +title: textPath +permalink: /pages/000b010001060b +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# textPath + +沿路径绘制文本。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 从API Version 7 开始支持。 +>- 按指定的路径绘制文本,可嵌套子标签tspan分段。 +>- 只支持被父元素标签text嵌套。 + +## 权限列表 + +无 + +## 子组件 + +tspan。 + +## 属性 + +支持以下表格中的属性。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

path

+

string

+

0

+

+

设置路径的形状。

+

字母指令表示的意义如下:

+
  • M = moveto
  • L = lineto
  • H = horizontal lineto
  • V = vertical lineto
  • C = curveto
  • S = smooth curveto
  • Q = quadratic Belzier curve
  • T = smooth quadratic Belzier curveto
  • A = elliptical Arc
  • Z = closepath
+

startOffset

+

<length>|<percentage>

+

0

+

+

设置文本沿path绘制的起始偏移。

+

font-size

+

<length>

+

30px

+

+

设置文本的尺寸。

+

fill

+

<color>

+

black

+

+

字体填充颜色

+

opacity

+

number

+

1

+

+

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。支持属性动画。

+

fill-opacity

+

number

+

1.0

+

+

字体填充透明度

+

stroke

+

<color>

+

black

+

+

绘制字体边框并指定颜色

+

stroke-width

+

number

+

1px

+

+

字体边框宽度

+

stroke-opacity

+

number

+

1.0

+

+

字体边框透明度

+
+ +## 示例 + +textspan属性示例,textpath文本内容沿着属性path中的路径绘制文本,起点偏移20%的path长度。(绘制的元素曲线仅做参照)。 + +``` +/* xxx.css */ +.container { + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + height: 1200px; + width: 600px; +} +``` + +``` + +
+ + + + + This is textpath test. + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/textPath-part1.png) + +textpath与tspan组合示例与效果图 + +``` + +
+ + + + + This is tspan onTextPath. + Let's play. + 12345678912354567891234567891234567891234567891234567890 + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/textPath-part2.png) + +``` + +
+ + + + + This is TextPath. + This is tspan onTextPath. + Let's play. + 12345678912354567891234567891234567891234567891234567890 + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/textPath-part3.png) + +``` + +
+ + + + + + + This is TextPath. + This is first tspan. + This is second tspan. + 12345678912354567891234567891234567891234567891234567890 + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/textPath-part4.png) + +startOffset属性动画,文本绘制时起点偏移从10%运动到40%,不绘制超出path长度范围的文本。 + +``` +/* xxx.css */ +.container { + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + height: 3000px; + width: 1080px; +} +``` + +``` + +
+ + + + + This is tspan onTextPath. + Let's play. + 12345678912354567891234567891234567891234567891234567890 + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/textpath-animate1.gif) + +textpath与tspan组合属性动画与效果图 + +``` + +
+ + + + + + This is TextPath. + + tspan attribute x|rotate + + + + tspan static. + + tspan attribute dx|opacity + + + + tspan move + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/textpath-animate2.gif) + +\(1\) "tspan attribute x|rotate" 文本绘制起点偏移从50px运动到100px,顺时针旋转0度到360度。 + +\(2\) "tspan attribute dx|opacity" 在 "tspan static." 绘制结束后再开始绘制,向后偏移量从0%运动到30%,透明度从浅到深变化。 + +\(3\) "tspan move" 在上一段tspan绘制完成后,向后偏移5%的距离进行绘制,呈现跟随前一段tspan运动的效果。 + +textpath与tspan组合属性动画与效果图 + +``` + +
+ + + + + + This is TextPath. + + tspan attribute fill|fill-opacity + + + + + tspan attribute font-size + + + + Single tspan + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/textpath-animate3.gif) + +\(1\) "This is TextPath." 在path上无偏移绘制第一段文本内容,大小30px,颜色"\#D2691E"。 + +\(2\) "tspan attribute fill|fill-opacity" 相对上一段文本结束后偏移20px,颜色从蓝到红,透明度从浅到深。 + +\(3\) "tspan attribute font-size" 绘制起点相对上一段结束后偏移20px,起点静止,字体大小从10px到50px,整体长度持续拉长。 + +\(4\) "Single tspan" 在上一段的尾部做水平绘制,呈现跟随上一段运动的效果。 + +textpath与tspan组合属性动画与效果图 + +``` + +
+ + + + + + This is TextPath. + + tspan attribute stroke + + + + tspan attribute stroke-width-opacity + + + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/textpath-animate4.gif) + +\(1\) "tspan attribute stroke" 轮廓颜色从红色逐渐转变成绿色。 + +\(2\) "tspan attribute stroke-width-opacity" 轮廓宽度从细1px转变粗5px,透明度从浅到深。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/13.animate.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/13.animate.md" new file mode 100644 index 0000000000000000000000000000000000000000..8e51a2d67e03c8a2940fe9d0d6b4dec4c2aa295d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/13.animate.md" @@ -0,0 +1,283 @@ +--- +title: animate +permalink: /pages/000b010001060c +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# animate + +设置svg组件的属性动画。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

id

+

string

+

-

+

+

组件的唯一标识。

+

attributeName

+

string

+

-

+

+

设置需要进行动效的属性名。

+

begin

+

<time>

+

0

+

+

设置动效的延迟时间。

+

支持输入ms(毫秒)、s(秒)、m(分),默认为s(秒),其他格式不支持

+

dur

+

<time>

+

0

+

+

设置动效持续时间,如果dur没设置,按照end-begin的结果作为持续时间,小于等于0时,动效不触发。

+

支持输入ms(毫秒)、s(秒)、m(分),默认为s(秒),其他格式不支持

+

end

+

<time>

+

0

+

+

设置动效多久时间后结束。支持输入ms(毫秒)、s(秒)、m(分),默认为s(秒),其他格式不支持

+

repeatCount

+

<number | indefinite>

+

1

+

+

设置动画播放的次数,默认无限次播放(indefinite),可通过设置为数值1仅播放一次。

+

fill

+

<freeze | remove>

+

remove

+

+

设置动画结束时的状态。

+

calcMode

+

<discrete | linear | paced | spline>

+

linear

+

+

设置动画的插值模式。

+

discrete:阶跃,from值直接跳转到to的值;

+

linear:线性;

+

paced:线性,设置此项后keyTimes和keyPoints值无效

+

spline:自定义贝塞尔曲线,spline点定义在keyTimes属性中,每个时间间隔控制点由keySplines定义

+

keyTimes

+

string

+

-

+

+

设置关键帧动画的开始时间,值为0~1之间的数值用分号隔开,比如0;0.3;0.8;1。keyTimes、keySplines、values组合设置关键帧动画。keyTimes和values的个数保持一致。keySplines个数为keyTimes个数减一

+

keySplines

+

string

+

-

+

+

与keyTimes相关联的一组贝塞尔控制点。定义每个关键帧的贝塞尔曲线,曲线之间用分号隔开。曲线内的两个控制掉格式为x1 y1 x2 y2。比如0.5 0 0.5 1; 0.5 0 0.5 1;0.5 0 0.5 1

+

by

+

number

+

-

+

+

在动画中对某一指定属性,添加相对偏移值,from默认为原属性值。

+

from

+

string

+

-

+

+

设置需要进行动画的属性的开始值。

+

如果已经设置了values属性,则from失效。

+

to

+

string

+

-

+

+

设置需要进行动画的属性的结束值。

+

如果已经设置了values属性,则to都失效。

+

values

+

string

+

-

+

+

设置一组动画的变化值。格式为value1;value2;value3。

+
+ +## 示例 + +``` + +
+ + + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/animate-1.gif) + +``` + +
+ + + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/1-3.gif) + +``` + +
+ + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/animate-3.gif) + +``` + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/animate-4.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/14.animateMotion.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/14.animateMotion.md" new file mode 100644 index 0000000000000000000000000000000000000000..1f240762d7b86b04defbb114a028dc2a06c543cf --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/14.animateMotion.md" @@ -0,0 +1,107 @@ +--- +title: animateMotion +permalink: /pages/000b010001060d +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# animateMotion + +路径动效。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +支持animate属性\(values不生效\)和以下表格中的属性。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

keyPoints

+

string

+

-

+

+

一组关键帧的点位置,每帧的值为对象沿路径的距离比例。功能与animate属性中的values相同。

+

path

+

string

+

-

+

+

定义运动的路径,使用与path组件d属性相同的语法。

+

rotate

+

[auto | auto-reverse | <number>]

+

auto

+

-

+

设置动画对象的旋转方向

+
+ +## 示例 + +``` + +
+ + + + + + + + + + + + + + + + +
+``` + +![](/images/application-dev/reference/arkui-js/figures/2-4.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/15.animateTransform.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/15.animateTransform.md" new file mode 100644 index 0000000000000000000000000000000000000000..770e5f76fb55de76057f8d9fbe86ab2627f91c57 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/02.\347\273\204\344\273\266/07.svg\347\273\204\344\273\266/15.animateTransform.md" @@ -0,0 +1,246 @@ +--- +title: animateTransform +permalink: /pages/000b010001060e +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# animateTransform + +transform动效,支持的组件范围: + +, , , , , , , + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 权限列表 + +无 + +## 子组件 + +不支持。 + +## 属性 + +支持animate属性和以下表格中的属性。 + + + + + + + + + + + + + + + + +

名称

+

类型

+

默认值

+

必填

+

描述

+

type

+

[translate | scale | rotate | skewX | skewY]

+

-

+

+

设置transform动画的类型

+
+ +## 示例 + +``` + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + background-color: #f8f8ff; +} + +.back_container { + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + height: 1000px; + width: 1080px; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/animate-transform.gif) + +动画叠加 + +``` + +
+
+ + + + + + + + + + + + + + + + + + +
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + background-color: #f8f8ff; +} +.back_container { + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + height: 1000px; + width: 1080px; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/animate-transform2.gif) + +涉及组件示例 + +``` + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+``` + +``` +/* xxx.css */ +.container { + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + background-color: #f8f8ff; +} +.back_container { + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + height: 1000px; + width: 1080px; +} +``` + +![](/images/application-dev/reference/arkui-js/figures/animate-transform3.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/01.\345\237\272\346\234\254\347\224\250\346\263\225.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/01.\345\237\272\346\234\254\347\224\250\346\263\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..886702887bcb9289f74e86d5849c10c7e16ec016 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/01.\345\237\272\346\234\254\347\224\250\346\263\225.md" @@ -0,0 +1,78 @@ +--- +title: 基本用法 +permalink: /pages/000b01000200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 基本用法 + +自定义组件是用户根据业务需求,将已有的组件组合,封装成的新组件,可以在工程中多次调用,从而提高代码的可读性。自定义组件通过element引入到宿主页面,使用方法如下: + +``` + +
+ +
+``` + +结合if-else使用自定义组件的示例: + +``` + + +
+ + +
+``` + +- name属性指自定义组件名称\(非必填\),组件名称对大小写不敏感,默认使用小写。src属性指自定义组件hml文件路径\(必填\),若没有设置name属性,则默认使用hml文件名作为组件名。 +- 事件绑定:自定义组件中绑定子组件事件使用\(on|@\)child1语法,子组件中通过this.$emit\('child1', \{ params: '传递参数' \}\)触发事件并进行传值,父组件执行bindParentVmMethod方法并接收子组件传递的参数。 + + >![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** + >子组件中使用驼峰命名法命名的事件,在父组件中绑定时需要使用短横线分隔命名形式,例如:@children-event表示绑定子组件的childrenEvent事件,如 @children-event="bindParentVmMethod"。 + + +## 对象 + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

描述

+

data

+

Object/Function

+

页面的数据模型,类型是对象或者函数,如果类型是函数,返回值必须是对象。属性名不能以$或_开头,不要使用保留字for, if, show, tid。

+

data与private和public不能重合使用。

+

props

+

Array/Object

+

props用于组件之间的通信,可以通过<tag xxxx='value'>方式传递给组件;props名称必须用小写,不能以$或_开头,不要使用保留字for, if, show, tid。目前props的数据类型不支持Function。

+

computed

+

Object

+

用于在读取或设置进行预先处理,计算属性的结果会被缓存。计算属性名不能以$或_开头,不要使用保留字。

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/02.\350\207\252\345\256\232\344\271\211\344\272\213\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/02.\350\207\252\345\256\232\344\271\211\344\272\213\344\273\266.md" similarity index 91% rename from "website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/02.\350\207\252\345\256\232\344\271\211\344\272\213\344\273\266.md" rename to "website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/02.\350\207\252\345\256\232\344\271\211\344\272\213\344\273\266.md" index 8cb00f61a00cf0969e880cfc531e720b1f8bad01..c7b1d483ba1cef1a6c30d3f0a0167c78b4a7243d 100644 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/02.\350\207\252\345\256\232\344\271\211\344\272\213\344\273\266.md" +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/02.\350\207\252\345\256\232\344\271\211\344\272\213\344\273\266.md" @@ -1,6 +1,6 @@ --- title: 自定义事件 -permalink: /pages/000d0201 +permalink: /pages/000b01000201 navbar: true sidebar: true prev: true @@ -9,9 +9,9 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:31:39 --- -# 自定义事件 +# 自定义事件 子组件comp定义如下: diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/03.Props.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/03.Props.md" similarity index 74% rename from "website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/03.Props.md" rename to "website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/03.Props.md" index 3a23a9f16c86a7b5b4c9547a01810ba818daad04..56391bbaf29fcc738e232fe9e68415f484518a60 100644 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/03.Props.md" +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/03.Props.md" @@ -1,6 +1,6 @@ --- title: Props -permalink: /pages/000d0202 +permalink: /pages/000b01000202 navbar: true sidebar: true prev: true @@ -9,16 +9,11 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:31:39 --- -# Props +# Props -- [添加默认值](#zh-cn_topic_0000001059148556_section448655843113) -- [数据单向性](#zh-cn_topic_0000001059148556_section9681151218247) -- [$watch 监控数据改变](#zh-cn_topic_0000001059148556_section205821113182114) -- [computed 计算属性](#zh-cn_topic_0000001059148556_section1088954011234) - -自定义组件可以通过props声明属性,父组件通过设置属性向子组件传递参数。camelCase \(驼峰命名法\) 的 prop 名,在外部父组件传递参数时需要使用 kebab-case \(短横线分隔命名\) 形式,即当属性compProp在父组件引用时需要转换为comp-prop。给自定义组件添加props,通过父组件向下传递参数的示例如下: +自定义组件可以通过props声明属性,父组件通过设置属性向子组件传递参数,props支持类型包括:String,Number,Boolean,Array,Object,Function。camelCase \(驼峰命名法\) 的 prop 名,在外部父组件传递参数时需要使用 kebab-case \(短横线分隔命名\) 形式,即当属性compProp在父组件引用时需要转换为comp-prop。给自定义组件添加props,通过父组件向下传递参数的示例如下: ``` @@ -42,7 +37,10 @@ export default {
``` -## 添加默认值 +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>自定义属性命名时禁止以on、@、on:、grab: 等保留关键字为开头。 + +## 添加默认值 子组件可以通过固定值default设置默认值,当父组件没有设置该属性时,将使用其默认值。此情况下props属性必须为对象形式,不能用数组形式,示例如下: @@ -74,7 +72,7 @@ export default { ``` -## 数据单向性 +## 数据单向性 父子组件之间数据的传递是单向的,只能从父组件传递给子组件,子组件不能直接修改父组件传递下来的值,可以将props传入的值用data接收后作为默认值,再对data的值进行修改。 @@ -93,7 +91,7 @@ export default { } ``` -## $watch 监控数据改变 +## $watch 感知数据改变 如果需要观察组件中属性变化,可以通过$watch方法增加属性变化回调。使用方法如下: @@ -110,7 +108,7 @@ export default { } ``` -## computed 计算属性 +## computed 计算属性 自定义组件中经常需要在读取或设置某个属性时进行预先处理,提高开发效率,此种情况就需要使用computed字段。computed字段中可通过设置属性的getter和setter方法在属性读写的时候进行触发,使用方式如下: diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/04.\344\272\213\344\273\266\345\217\202\346\225\260.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/04.\344\272\213\344\273\266\345\217\202\346\225\260.md" similarity index 89% rename from "website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/04.\344\272\213\344\273\266\345\217\202\346\225\260.md" rename to "website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/04.\344\272\213\344\273\266\345\217\202\346\225\260.md" index 3103564dc4053508824bffb37654620b22074c4e..049bd214cb7df51b7a9f18532206ea8926b7aca3 100644 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/04.\344\272\213\344\273\266\345\217\202\346\225\260.md" +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/04.\344\272\213\344\273\266\345\217\202\346\225\260.md" @@ -1,6 +1,6 @@ --- title: 事件参数 -permalink: /pages/000d0203 +permalink: /pages/000b01000203 navbar: true sidebar: true prev: true @@ -9,9 +9,9 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:31:39 --- -# 事件参数 +# 事件参数 子组件也可以通过绑定的事件向上传递参数,在自定义事件上添加传递参数的示例如下: diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/05.slot\346\217\222\346\247\275.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/05.slot\346\217\222\346\247\275.md" new file mode 100644 index 0000000000000000000000000000000000000000..a284886c4815e3d79adfbc159017325db8eeff08 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/05.slot\346\217\222\346\247\275.md" @@ -0,0 +1,71 @@ +--- +title: slot插槽 +permalink: /pages/000b01000204 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# slot插槽 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 7 开始支持。 + +## 默认插槽 + +自定义组件中通过slot标签来承载父组件中定义的内容,使用slot标签可以更加灵活的控制自定义组件的内容元素,使用方式如下: + +``` + +
+ 下面使用父组件定义的内容 + +
+``` + +引用该自定义组件方式如下: + +``` + + +
+ + 父组件中定义的内容 + +
+``` + +## 具名插槽 + +当自定义组件中需要使用多个插槽时,可通过对插槽命名的方式进行区分,当填充插槽内容时,通过声明插槽名称,将内容加到对应的插槽中。 + +``` + +
+ 下面使用父组件定义的内容 + + +
+``` + +引用该自定义组件方式如下: + +``` + + +
+ + 插入第二个插槽中 + 插入第一个插槽中 + +
+``` + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>name 和 slot 属性不支持绑定动态数据。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/06.\347\224\237\345\221\275\345\221\250\346\234\237\345\256\232\344\271\211.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/06.\347\224\237\345\221\275\345\221\250\346\234\237\345\256\232\344\271\211.md" new file mode 100644 index 0000000000000000000000000000000000000000..4e7cd9b540d92c2ae537db2d062a2a6709129de9 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/06.\347\224\237\345\221\275\345\221\250\346\234\237\345\256\232\344\271\211.md" @@ -0,0 +1,130 @@ +--- +title: 生命周期定义 +permalink: /pages/000b01000205 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 生命周期定义 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>从API Version 5 开始支持。 + +我们为自定义组件提供了一系列生命周期回调方法,便于开发者管理自定义组件的内部逻辑。生命周期主要包括:onInit,onAttached,onDetached,onLayoutReady,onDestroy,onPageShow和onPageHide。下面我们依次介绍一下各个生命周期回调的时机。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性

+

类型

+

描述

+

触发时机

+

onInit

+

Function

+

初始化自定义组件

+

自定义组件初始化生命周期回调,当自定义组件创建时,触发该回调,主要用于自定义组件中必须使用的数据初始化,该回调只会触发一次调用。

+

onAttached

+

Function

+

自定义组件装载

+

自定义组件被创建后,加入到Page组件树时,触发该回调,该回调触发时,表示组件将被进行显示,该声明周期可用于初始化显示相关数据,通常用于加载图片资源、开始执行动画等场景。。

+

onLayoutReady

+

Function

+

自定义组件布局完成

+

自定义组件插入Page组件树后,将会对自定义组件进行布局计算,调整其内容元素尺寸与位置,当布局计算结束后触发该回调。

+

onDetached

+

Function

+

自定义组件摘除

+

自定义组件摘除时,触发该回调,常用于停止动画或异步逻辑停止执行的场景。

+

onDestroy

+

Function

+

自定义组件销毁

+

自定义组件销毁时,触发该回调,常用于资源释放。

+

onPageShow

+

Function

+

自定义组件Page显示

+

自定义组件所在Page显示后,触发该回调。

+

onPageHide

+

Function

+

自定义组件Page隐藏

+

自定义组件所在Page隐藏后,触发该回调。

+
+ +## 示例 + +``` + +
+ {{value}} +
+``` + +``` +//comp.js +export default { + data: { + value: "组件创建" + }, + onInit() { + console.log("组件创建") + }, + onAttached() { + this.value = "组件挂载" + }, + onDetached() { + this.value = "" + }, + onPageShow() { + console.log("Page显示") + }, + onPageHide() { + console.log("Page隐藏") + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\231\204\345\275\225/01.\347\261\273\345\236\213\350\257\264\346\230\216.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\231\204\345\275\225/01.\347\261\273\345\236\213\350\257\264\346\230\216.md" new file mode 100644 index 0000000000000000000000000000000000000000..de884719dba3a1aa83743e306e7bb8999583aff4 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/01.\345\237\272\344\272\216JS\346\211\251\345\261\225\347\232\204\347\261\273Web\345\274\200\345\217\221\350\214\203\345\274\217/04.\351\231\204\345\275\225/01.\347\261\273\345\236\213\350\257\264\346\230\216.md" @@ -0,0 +1,1112 @@ +--- +title: 类型说明 +permalink: /pages/000b01000300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 类型说明 + +## 长度类型 + + + + + + + + + + + + + + + + +

名称

+

类型定义

+

描述

+

length

+

string | number

+

用于描述尺寸单位,输入为number类型时,使用px单位;输入为string类型时,需要显式指定像素单位,当前支持的像素单位有:

+
  • px:逻辑尺寸单位。
  • fp6+:字体尺寸单位,会随系统字体大小设置发生变化,仅支持文本类组件设置相应的字体大小。
+

percentage

+

string

+

百分比尺寸单位,如“50%”。

+
+ +## 颜色类型 + + + + + + + + + + + + +

名称

+

类型定义

+

描述

+

color

+

string | 颜色枚举字符串

+

用于描述颜色信息。

+
字符串格式如下:
  • 'rgb(255, 255, 255)'
  • 'rgba(255, 255, 255, 1.0)'
  • HEX格式:'#rrggbb','#aarrggbb'
  • 枚举格式:'black','white'。
    说明:

    JS脚本中不支持颜色枚举格式。

    +
    +
+
+
+ +**表 1** 当前支持的颜色枚举 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

枚举名称

+

对应颜色

+

颜色

+

aliceblue

+

#f0f8ff

+

+

antiquewhite

+

#faebd7

+

+

aqua

+

#00ffff

+

+

aquamarine

+

#7fffd4

+

+

azure

+

#f0ffff

+

+

beige

+

#f5f5dc

+

+

bisque

+

#ffe4c4

+

+

black

+

#000000

+

+

blanchedalmond

+

#ffebcd

+

+

blue

+

#0000ff

+

+

blueviolet

+

#8a2be2

+

+

brown

+

#a52a2a

+

+

burlywood

+

#deB887

+

+

cadetblue

+

#5f9ea0

+

+

chartreuse

+

#7fff00

+

+

chocolate

+

#d2691e

+

+

coral

+

#ff7f50

+

+

cornflowerblue

+

#6495ed

+

+

cornsilk

+

#fff8dc

+

+

crimson

+

#dc143c

+

+

cyan

+

#00ffff

+

+

darkblue

+

#00008b

+

+

darkcyan

+

#008b8b

+

+

darkgoldenrod

+

#b8860b

+

+

darkgray

+

#a9a9a9

+

+

darkgreen

+

#006400

+

+

darkgrey

+

#a9a9a9

+

+

darkkhaki

+

#bdb76b

+

+

darkmagenta

+

#8b008b

+

+

darkolivegreen

+

#556b2f

+

+

darkorange

+

#ff8c00

+

+

darkorchid

+

#9932cc

+

+

darkred

+

#8b0000

+

+

darksalmon

+

#e9967a

+

+

darkseagreen

+

#8fbc8f

+

+

darkslateblue

+

#483d8b

+

+

darkslategray

+

#2f4f4f

+

+

darkslategrey

+

#2f4f4f

+

+

darkturquoise

+

#00ced1

+

+

darkviolet

+

#9400d3

+

+

deeppink

+

#ff1493

+

+

deepskyblue

+

#00bfff

+

+

dimgray

+

#696969

+

+

dimgrey

+

#696969

+

+

dodgerblue

+

#1e90ff

+

+

firebrick

+

#b22222

+

+

floralwhite

+

#fffaf0

+

+

forestgreen

+

#228b22

+

+

fuchsia

+

#ff00ff

+

+

gainsboro

+

#dcdcdc

+

+

ghostwhite

+

#f8f8ff

+

+

gold

+

#ffd700

+

+

goldenrod

+

#daa520

+

+

gray

+

#808080

+

+

green

+

#008000

+

+

greenyellow

+

#adff2f

+

+

grey

+

#808080

+

+

honeydew

+

#f0fff0

+

+

hotpink

+

#ff69b4

+

+

indianred

+

#cd5c5c

+

+

indigo

+

#4b0082

+

+

ivory

+

#fffff0

+

+

khaki

+

#f0e68c

+

+

lavender

+

#e6e6fa

+

+

lavenderblush

+

#fff0f5

+

+

lawngreen

+

#7cfc00

+

+

lemonchiffon

+

#fffacd

+

+

lightblue

+

#add8e6

+

+

lightcoral

+

#f08080

+

+

lightcyan

+

#e0ffff

+

+

lightgoldenrodyellow

+

#fafad2

+

+

lightgray

+

#d3d3d3

+

+

lightgreen

+

#90ee90

+

+

lightpink

+

#ffb6c1

+

+

lightsalmon

+

#ffa07a

+

+

lightseagreen

+

#20b2aa

+

+

lightskyblue

+

#87cefa

+

+

lightslategray

+

#778899

+

+

lightslategrey

+

#778899

+

+

lightsteelblue

+

#b0c4de

+

+

lightyellow

+

#ffffe0

+

+

lime

+

#00ff00

+

+

limegreen

+

#32cd32

+

+

linen

+

#faf0e6

+

+

magenta

+

#ff00ff

+

+

maroon

+

#800000

+

+

mediumaquamarine

+

#66cdaa

+

+

mediumblue

+

#0000cd

+

+

mediumorchid

+

#ba55d3

+

+

mediumpurple

+

#9370db

+

+

mediumseagreen

+

#3cb371

+

+

mediumslateblue

+

#7b68ee

+

+

mediumspringgreen

+

#00fa9a

+

+

mediumturquoise

+

#48d1cc

+

+

mediumvioletred

+

#c71585

+

+

midnightblue

+

#191970

+

+

mintcream

+

#f5fffa

+

+

mistyrose

+

#ffe4e1

+

+

moccasin

+

#ffe4b5

+

+

navajowhite

+

#ffdead

+

+

navy

+

#000080

+

+

oldlace

+

#fdf5e6

+

+

olive

+

#808000

+

+

olivedrab

+

#6b8e23

+

+

orange

+

#ffa500

+

+

orangered

+

#ff4500

+

+

orchid

+

#da70d6

+

+

palegoldenrod

+

#eee8aa

+

+

palegreen

+

#98fb98

+

+

paleturquoise

+

#afeeee

+

+

palevioletred

+

#db7093

+

+

papayawhip

+

#ffefd5

+

+

peachpuff

+

#ffdab9

+

+

peru

+

#cd853f

+

+

pink

+

#ffc0cb

+

+

plum

+

#dda0dd

+

+

powderblue

+

#b0e0e6

+

+

purple

+

#800080

+

+

rebeccapurple

+

#663399

+

+

red

+

#ff0000

+

+

rosybrown

+

#bc8f8f

+

+

royalblue

+

#4169e1

+

+

saddlebrown

+

#8b4513

+

+

salmon

+

#fa8072

+

+

sandybrown

+

#f4a460

+

+

seagreen

+

#2e8b57

+

+

seashell

+

#fff5ee

+

+

sienna

+

#a0522d

+

+

silver

+

#c0c0c0

+

+

skyblue

+

#87ceeb

+

+

slateblue

+

#6a5acd

+

+

slategray

+

#708090

+

+

slategrey

+

#708090

+

+

snow

+

#fffafa

+

+

springgreen

+

#00ff7f

+

+

steelblue

+

#4682b4

+

+

tan

+

#d2b48c

+

+

teal

+

#008080

+

+

thistle

+

#d8Bfd8

+

+

tomato

+

#ff6347

+

+

turquoise

+

#40e0d0

+

+

violet

+

#ee82ee

+

+

wheat

+

#f5deb3

+

+

white

+

#ffffff

+

+

whitesmoke

+

#f5f5f5

+

+

yellow

+

#ffff00

+

+

yellowgreen

+

#9acd32

+

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207/01.\347\233\256\345\275\225\347\273\223\346\236\204.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207/01.\347\233\256\345\275\225\347\273\223\346\236\204.md" new file mode 100644 index 0000000000000000000000000000000000000000..c502ce1fbb88a996f6077527a564045d9b4ed586 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207/01.\347\233\256\345\275\225\347\273\223\346\236\204.md" @@ -0,0 +1,32 @@ +--- +title: 目录结构 +permalink: /pages/000b0101000000 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 目录结构 + +FA应用的ets模块\(entry/src/main\)的典型开发目录结构如下: + +![](/images/application-dev/reference/arkui-ts/figures/zh-cn_image_0000001182200571.png) + +**目录结构中文件分类如下:** + +- .ets结尾的ETS(Extended TypeScript)文件,这个文件用于描述UI布局、样式、事件交互和页面逻辑。 + +**各个文件夹和文件的作用:** + +- **app.ets**文件用于全局应用逻辑和应用生命周期管理。 +- **pages**目录用于存放所有组件页面。 +- **common**目录用于存放公共代码文件,比如:自定义组件和公共方法。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 页面支持导入TypeScript和JavaScript文件。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207/02.\345\272\224\347\224\250\344\273\243\347\240\201\346\226\207\344\273\266\350\256\277\351\227\256\350\247\204\345\210\231.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207/02.\345\272\224\347\224\250\344\273\243\347\240\201\346\226\207\344\273\266\350\256\277\351\227\256\350\247\204\345\210\231.md" new file mode 100644 index 0000000000000000000000000000000000000000..1e2cd499a96b9eb83494f9af4801a983abdb89f9 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/01.\346\226\207\344\273\266\347\273\204\347\273\207/02.\345\272\224\347\224\250\344\273\243\347\240\201\346\226\207\344\273\266\350\256\277\351\227\256\350\247\204\345\210\231.md" @@ -0,0 +1,80 @@ +--- +title: 应用代码文件访问规则 +permalink: /pages/000b0101000001 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 应用代码文件访问规则 + +应用代码文件可通过如下方式访问: + +- 使用相对路径引用代码文件,比如:上一级目录:../common/utils/utils.ets,当前目录:./common/utils/utils.ets。 +- 使用当前模块根路径引用代码文件,比如:common/utils/utils.ets。 +- 公共代码文件推荐放在**common**目录下。 + +## 示例 + +``` +import { FoodData, FoodList } from "../common/utils/utils.ets"; + +@Entry +@Component +struct FoodCategoryList { + private foodItems: FoodData[] = [ + new FoodData("Tomato"), + new FoodData("Strawberry"), + new FoodData("Cucumber") + ] + build() { + Column() { + FoodList({ foodItems: this.foodItems }) + } + } +} +``` + +导入文件示例: + +``` +//common/utils/utils.ets + +export class FoodData { + name: string; + constructor(name: string) { + this.name = name; + } +} + +@Component +export struct FoodList { + private foodItems: FoodData[] + + build() { + Column() { + Flex({justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center}) { + Text('Food List') + .fontSize(20) + } + .width(200) + .height(56) + .backgroundColor('#FFf1f3f5') + List() { + ForEach(this.foodItems, item => { + ListItem() { + Text(item.name) + .fontSize(14) + } + }, item => item.toString()) + } + } + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/02.js\346\240\207\347\255\276\351\205\215\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/02.js\346\240\207\347\255\276\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..5f574c06cdfa3569c26d98cfa33db345806f209a --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/02.js\346\240\207\347\255\276\351\205\215\347\275\256.md" @@ -0,0 +1,199 @@ +--- +title: js标签配置 +permalink: /pages/000b01010001 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# js标签配置 + +开发框架需要应用的[config.json](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/basic-config-file-overview-0000000000011951)中配置相关的js标签,其中包含了实例名称、页面路由、视图窗口配置信息。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

标签

+

类型

+

默认值

+

必填

+

描述

+

name

+

string

+

default

+

+

标识ETS实例的名字。

+

pages

+

Array

+

-

+

+

页面路由信息,详见pages说明。

+

window

+

Object

+

-

+

+

视图窗口配置信息,详见window说明。

+

mode

+

Object

+

-

+

+

配置Js Component运行类型与语法风格,详见mode说明。

+
+ +## pages + +定义每个页面入口组件的路由信息,每个页面由页面路径和页面名组成,页面的文件名就是页面名。比如: + +``` +{ + "pages": [ + "pages/index", + "pages/detail" + ] +} +``` + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- pages列表中第一个页面为应用的首页入口。 +>- 页面文件名不能使用组件名称,比如:Text.ets、Button.ets等。 +>- 每个页面文件中必须包含[页面入口组件](/pages/000b010101010201)\(@Entry装饰\)。 + +## window + +window用于配置相关视图显示窗口,支持配置如下属性: + + + + + + + + + + + + +

类型

+

默认值

+

说明

+

designWidth

+

-

+

配置视图显示的逻辑宽度,缺省默认720(智能穿戴默认454)。视图显示的逻辑宽度决定了lpx像素单位大小,如designWidth配置720时,在视图宽度为1440物理像素时,1lpx为2物理像素。详见lpx像素单位说明。

+
+ +``` +{ + ... + "window": { + "designWidth": 720 + } + ... +} +``` + +## mode + +mode用于配置JS Component的运行类型与语法风格,支持如下属性: + + + + + + + + + + + + + + + + +

类型

+

默认值

+

说明

+

type

+

-

+

配置该JS Component的运行类型,可选值为:

+
  • pageAbility:以ability的方式运行该JS Component。
  • form:以卡片的方式运行该JS Component。
+

syntax

+

-

+

配置该JS Component的语法风格,可选值为:

+
  • hml:以hml/css/js风格进行编写。
  • ets:以声明式语法风格进行编写。
+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持同时配置type类型为form,syntax类型为ets。 + +## 示例 + +config.json: + +``` +{ + "app": { + "bundleName": "com.example.player", + "version": { + "code": 1, + "name": "1.0" + }, + "vendor": "example" + }, + "module": { + "js": [{ + "name": "default", + "pages": [ + "pages/index", + "pages/detail" + ], + "window": { + "designWidth": 720 + }, + "mode": { + "type": "pageAbility", + "syntax": "ets" + }, + }], + "abilities": [{ + ... + }] + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/03.\350\265\204\346\272\220\350\256\277\351\227\256/01.\345\252\222\344\275\223\350\265\204\346\272\220\347\261\273\345\236\213\350\257\264\346\230\216.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/03.\350\265\204\346\272\220\350\256\277\351\227\256/01.\345\252\222\344\275\223\350\265\204\346\272\220\347\261\273\345\236\213\350\257\264\346\230\216.md" new file mode 100644 index 0000000000000000000000000000000000000000..b0a15a0093eed8dc0b3f14899d03acd94fd7685e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/03.\350\265\204\346\272\220\350\256\277\351\227\256/01.\345\252\222\344\275\223\350\265\204\346\272\220\347\261\273\345\236\213\350\257\264\346\230\216.md" @@ -0,0 +1,58 @@ +--- +title: 媒体资源类型说明 +permalink: /pages/000b0101000200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 媒体资源类型说明 + +- 开发框架支持的图片资源类型说明 + + + + + + + + + + + + + + + + + + + + + + + + + +

格式

+

文件后缀名

+

JPEG

+

.jpg

+

PNG

+

.png

+

GIF

+

.gif

+

SVG

+

.svg

+

WEBP

+

.webp

+

BMP

+

.bmp

+
+ + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\345\203\217\347\264\240\345\215\225\344\275\215.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\345\203\217\347\264\240\345\215\225\344\275\215.md" new file mode 100644 index 0000000000000000000000000000000000000000..c2a3c0916f37d4cc5e7761a6b36345cef3055b96 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\345\203\217\347\264\240\345\215\225\344\275\215.md" @@ -0,0 +1,138 @@ +--- +title: 像素单位 +permalink: /pages/000b01010003 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 像素单位 + +为开发者提供4种像素单位,框架采用vp为基准数据单位。 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

px

+

屏幕物理像素单位。

+

vp

+

屏幕密度相关像素,根据屏幕像素密度转换为屏幕物理像素。

+

fp

+

字体像素,与vp类似适用屏幕密度变化,随系统字体大小设置变化。

+

lpx

+

视窗逻辑像素单位,lpx单位为实际屏幕宽度与逻辑宽度(通过designWidth配置)的比值。如配置designWidth为720时,在实际宽度为1440物理像素的屏幕上,1lpx为2px大小。

+
+ +## 像素单位转换 + +提供其他单位与px单位互相转换的方法。 + + + + + + + + + + + + + + + + + + + + + + + + + +

接口

+

描述

+

vp2px(value : number) : number

+

将vp单位的数值转换为以px为单位的数值。

+

px2vp(value : number) : number

+

将px单位的数值转换为以vp为单位的数值。

+

fp2px(value : number) : number

+

将fp单位的数值转换为以px为单位的数值。

+

px2fp(value : number) : number

+

将px单位的数值转换为以fp为单位的数值。

+

lpx2px(value : number) : number

+

将lpx单位的数值转换为以px为单位的数值。

+

px2lpx(value : number) : number

+

将px单位的数值转换为以lpx为单位的数值。

+
+ +## 示例 + +``` +@Entry +@Component +struct Example { + build() { + Column() { + Flex({ wrap: FlexWrap.Wrap }) { + Column() { + Text("width(220)") + .width(220).height(40).backgroundColor(0xF9CF93) + .textAlign(TextAlign.Center).fontColor(Color.White).fontSize('12vp') + }.margin(5) + Column() { + Text("width('220px')") + .width('220px').height(40).backgroundColor(0xF9CF93) + .textAlign(TextAlign.Center).fontColor(Color.White) + }.margin(5) + Column() { + Text("width('220vp')") + .width('220vp').height(40).backgroundColor(0xF9CF93) + .textAlign(TextAlign.Center).fontColor(Color.White).fontSize('12vp') + }.margin(5) + Column() { + Text("width('220lpx') designWidth:720") + .width('220lpx').height(40).backgroundColor(0xF9CF93) + .textAlign(TextAlign.Center).fontColor(Color.White).fontSize('12vp') + }.margin(5) + Column() { + Text("width(vp2px(220) + 'px')") + .width(vp2px(220) + 'px').height(40).backgroundColor(0xF9CF93) + .textAlign(TextAlign.Center).fontColor(Color.White).fontSize('12vp') + }.margin(5) + Column() { + Text("fontSize('12fp')") + .width(220).height(40).backgroundColor(0xF9CF93) + .textAlign(TextAlign.Center).fontColor(Color.White).fontSize('12fp') + }.margin(5) + }.width('100%') + } + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/像素单位.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/05.\347\261\273\345\236\213\345\256\232\344\271\211.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/05.\347\261\273\345\236\213\345\256\232\344\271\211.md" new file mode 100644 index 0000000000000000000000000000000000000000..0ddf17a4dadc026ed0714fff60a3cb42cbd47b7f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/01.\346\241\206\346\236\266\350\257\264\346\230\216/05.\347\261\273\345\236\213\345\256\232\344\271\211.md" @@ -0,0 +1,270 @@ +--- +title: 类型定义 +permalink: /pages/000b01010004 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 类型定义 + +## 长度类型 + + + + + + + + + + + + +

名称

+

类型定义

+

描述

+

Length

+

string | number

+

用于描述尺寸单位,输入为number类型时,使用vp单位;输入为string类型时,需要显式指定像素单位,如'10px',也可设置百分比字符串,如'100%'。

+
+ +## 角度类型 + + + + + + + + + + + + +

名称

+

类型定义

+

描述

+

Angle

+

string | number

+

用于角度单位,输入为number类型时,使用deg单位;输入为string类型时需要显示指定角度单位,支持以下两种角度单位:

+
  • deg:如'100deg'。
  • rad:如'3.14rad'。
+
+ +## 点类型 + + + + + + + + + + + + +

名称

+

类型定义

+

描述

+

Point

+

[Length, Length]

+

用于描述点坐标,第一个值为x轴坐标,第二个值为y坐标。

+
+ +## 颜色类型 + +组件属性方法使用的颜色Color说明如下: + + + + + + + + + + + + +

名称

+

类型定义

+

描述

+

Color

+

string | number | Color

+

用于描述颜色信息,输入为string类型时,使用rgb或者rgba进行描述;输入为number类型是,使用HEX格式颜色;输入类型为Color枚举时,使用颜色枚举值。

+
  • 'rgb(255, 255, 255)'。
  • 'rgba(255, 255, 255, 1.0)'。
  • HEX格式:0xrrggbb,0xaarrggbb,'#FFFFFF'。
  • 枚举格式:Color.Black,Color.White等。
+
+ +当前支持的Color颜色枚举: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

颜色名称

+

颜色值

+

颜色示意

+

Black

+

0x000000

+

+

Blue

+

0x0000ff

+

+

Brown

+

0xa52a2a

+

+

Gray

+

0x808080

+

+

Green

+

0x008000

+

+

Orange

+

0xffa500

+

+

Pink

+

0xffc0cb

+

+

Red

+

0xff0000

+

+

White

+

0xffffff

+

+

Yellow

+

0xffff00

+

+
+ +## ColorStop类型 + +颜色断点类型,用于描述渐进色颜色断点。 + + + + + + + + + + + + +

名称

+

类型定义

+

描述

+

ColorStop

+

[Color, number]

+

描述渐进色颜色断点类型,第一个参数为颜色值,第二个参数为0~1之间的比例值。

+
+ +## 示例 + +``` +@Entry +@Component +struct dataTypeExample { + build() { + Column({ space: 5 }) { + Text('Length').fontColor(0xCCCCCC).fontSize(9).width('90%') + Text('90%').width('90%').height(40).backgroundColor(0xF9CF93) + .textAlign(TextAlign.Center).fontColor(Color.White) + Text('320').width(320).height(40).backgroundColor(0xF9CF93) + .textAlign(TextAlign.Center).fontColor(Color.White) + Text('1000px').width('1000px').height(40).backgroundColor(0xF9CF93) + .textAlign(TextAlign.Center).fontColor(Color.White) + + Text('Angle').fontColor(0xCCCCCC).fontSize(9).width('90%') + Text('45deg') + .width(40).height(40) + .rotate({ x: 0, y: 0, z: 1, angle: 45, centerX: '50%', centerY: '50%' }) + .fontColor(Color.White) + .backgroundColor(0xF9CF93).textAlign(TextAlign.Center) + + Text('45rad') + .width(40).height(40) + .rotate({ x: 0, y: 0, z: 1, angle: '45rad', centerX: '50%', centerY: '50%' }) + .fontColor(Color.White) + .backgroundColor(0xF9CF93).textAlign(TextAlign.Center).margin({ top: 30 }) + + Text('Point').fontColor(0xCCCCCC).fontSize(9).width('90%') + Line().width(300).height(40).startPoint([0, 20]).endPoint([300, 20]) + + Text('Color').fontColor('#CCCCCC').fontSize(9).width('90%') + Text('0xF9CF93') + .fontColor(Color.White).textAlign(TextAlign.Center) + .width('90%').height(40).backgroundColor(0xF9CF93) + + Text('#F9CF93') + .fontColor(Color.White).textAlign(TextAlign.Center) + .width('90%').height(40).backgroundColor('#F9CF93') + + Text('rgb(249, 207, 147)') + .fontColor(Color.White).textAlign(TextAlign.Center) + .width('90%').height(40).backgroundColor('rgb(249, 207, 147)') + + Text('rgba(249, 207, 147, 1.0)') + .fontColor(Color.White).textAlign(TextAlign.Center) + .width('90%').height(40).backgroundColor('rgba(249, 207, 147, 1.0)') + + Text('Color.Yellow') + .textAlign(TextAlign.Center) + .width('90%').height(40).backgroundColor(Color.Yellow) + } + .width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/datatype.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/01.\346\217\217\350\277\260\350\247\204\350\214\203\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/01.\346\217\217\350\277\260\350\247\204\350\214\203\344\275\277\347\224\250\350\257\264\346\230\216.md" new file mode 100644 index 0000000000000000000000000000000000000000..b3dec2776645c75f14d41a9c9ee31eedda707f0b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/01.\346\217\217\350\277\260\350\247\204\350\214\203\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -0,0 +1,24 @@ +--- +title: 描述规范使用说明 +permalink: /pages/000b01010100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 描述规范使用说明 + +本节定义了基于TS扩展的声明式开发范式的核心机制和功能。讲述了声明式UI描述、组件化机制、UI状态管理、渲染控制语法和语法糖。 + +本节为应用开发人员开发UI提供了参考规范。有关组件的详细信息,请参考[组件说明](/pages/000b010102000000)。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 所有示例都以TypeScript \(TS\)语言为例,请遵循相应语言的语法要求。 +>- 示例中的**Image**、**Button**、**Text**、**Divider**、**Row**和**Column**等组件是UI框架中预置的组件控件,仅用于解释UI描述规范。 +>- 通用属性方法和事件方法通常支持所有组件,而组件内的属性方法和事件方法仅对当前组件有效。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" new file mode 100644 index 0000000000000000000000000000000000000000..bcd26ee380449801aaa487e9103ca1858b8de8a3 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -0,0 +1,56 @@ +--- +title: 基本概念 +permalink: /pages/000b0101010100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 基本概念 + +基于TS扩展的声明式开发范式提供了一系列基本组件,这些组件以声明方式进行组合和扩展来描述应用程序的UI界面,并且还提供了基本的数据绑定和事件处理机制,帮助开发者实现应用交互逻辑。 + +## HelloWorld基本示例 + +``` +// An example of displaying Hello World. After you click the button, Hello UI is displayed. +@Entry +@Component +struct Hello { + @State myText: string = 'World' + build() { + Column() { + Text('Hello') + .fontSize(30) + Text(this.myText) + .fontSize(32) + Divider() + Button() { + Text('Click me') + .fontColor(Color.Red) + }.onClick(() => { + this.myText = 'UI' + }) + .width(500) + .height(200) + } + } +} +``` + +## 基本概念描述 + +上述示例代码描述了简单页面的结构,并介绍了以下基本概念: + +- **装饰器:**装饰类、结构、方法和变量,并为它们赋予特殊含义。例如,上例中的**@Entry**、**@Component**和**@State**都是装饰器; +- **自定义组件:**可重用的UI单元,可以与其他组件组合,如**@Component**装饰的**struct Hello**; +- **UI描述:**声明性描述UI结构,例如**build\(\)**方法中的代码块; +- **内置组件:**框架中默认内置的基本组件和布局组件,开发者可以直接调用,如**Column**、**Text**、**Divider**、**Button**等; +- **属性方法:**用于配置组件属性,如**fontSize\(\)**、**width\(\)**、**height\(\)**、**color\(\)**等; +- **事件方法:**用于将组件响应逻辑添加到事件中。逻辑是通过事件方法设置的。例如,按钮后面的**onClick\(\)**。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/01.\346\227\240\346\236\204\351\200\240\345\217\202\346\225\260\351\205\215\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/01.\346\227\240\346\236\204\351\200\240\345\217\202\346\225\260\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..63c249a799af3d056f2f2c89e1a4b29defdb53b3 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/01.\346\227\240\346\236\204\351\200\240\345\217\202\346\225\260\351\205\215\347\275\256.md" @@ -0,0 +1,27 @@ +--- +title: 无构造参数配置 +permalink: /pages/000b010101010100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 无构造参数配置 + +组件的接口定义不包含必选构造参数,组件后面的“**\(\)**”中不需要配置任何内容。 + +例如,以下**Divider**组件不包含构造参数: + +``` +Column() { + Text('item 1') + Divider() // No parameter configuration of the divider component + Text('item 2') +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\277\205\351\200\211\345\217\202\346\225\260\346\236\204\351\200\240\351\205\215\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\277\205\351\200\211\345\217\202\346\225\260\346\236\204\351\200\240\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..42dc9c275a853e3a87dd0d75dd4f70bb470faea6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\277\205\351\200\211\345\217\202\346\225\260\346\236\204\351\200\240\351\205\215\347\275\256.md" @@ -0,0 +1,45 @@ +--- +title: 必选参数构造配置 +permalink: /pages/000b010101010101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 必选参数构造配置 + +如果组件的接口定义中包含必选构造参数,则在组件后面的“**\(\)**”中必须配置参数。参数可以使用常量进行赋值。 + +例如: + +**Image**组件的必选参数**src**: + +``` +Image('http://xyz/a.jpg') +``` + +**Text**组件的必选参数**content**: + +``` +Text('123') +``` + +变量或表达式也可以用于参数赋值,其中表达式返回的结果类型必须满足参数类型要求。 + +传递变量或表达式来构造**Image**和**Text**组件的参数示例如下: + +``` +// imagePath, where imageUrl is a private data variable defined in the component. +Image(this.imagePath) +Image('http://' + this.imageUrl) +// count is a private data variable defined in the component. +// (``) and (${}) are the template character string features supported by the TS language and comply with the +// features of the corresponding language. This specification is not limited. +Text(`count: ${this.count}`) +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\345\261\236\346\200\247\351\205\215\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\345\261\236\346\200\247\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..baa50ce882f3509e9822f8ad3ee3462652206df5 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\345\261\236\346\200\247\351\205\215\347\275\256.md" @@ -0,0 +1,59 @@ +--- +title: 属性配置 +permalink: /pages/000b010101010102 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 属性配置 + +使用属性方法配置组件的属性。属性方法紧随组件,并用“**.**”运算符连接。 + +配置**Text**组件的字体大小属性示例: + +``` +Text('123') + .fontSize(12) +``` + +此外,您还可以使用“**.**”操作进行链式调用并同时配置组件的多个属性。 + +您可以同时配置**Image**组件的多个属性,如下所示: + +``` +Image('a.jpg') + .alt('error.jpg') + .width(100) + .height(100) +``` + +除了直接传递常量参数外,还可以传递变量或表达式,如下所示: + +``` +// Size, count, and offset are private variables defined in the component. +Text('hello') + .fontSize(this.size) +Image('a.jpg') + .width(this.count % 2 === 0 ? 100 : 200) + .height(this.offset + 100) +``` + +对于内置组件,框架还为其属性预定义了一些枚举类型,供开发人员调用,枚举值可以作为参数传递。 + +枚举类型必须满足参数类型要求,有关特定属性的枚举类型定义的详细信息。 + +您可以按以下方式配置**Text**组件的颜色和字重属性: + +``` +Text('hello') + .fontSize(20) + .fontColor(Color.Red) + .fontWeight(FontWeight.Bold) +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/04.\344\272\213\344\273\266\351\205\215\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/04.\344\272\213\344\273\266\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..c33682bd19df1bb5fabbb817b40582af58165766 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/04.\344\272\213\344\273\266\351\205\215\347\275\256.md" @@ -0,0 +1,55 @@ +--- +title: 事件配置 +permalink: /pages/000b010101010103 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 事件配置 + +通过事件方法可以配置组件支持的事件。 + +- 使用lambda表达式配置组件的事件方法: + + ``` + // Counter is a private data variable defined in the component. + Button('add counter') + .onClick(() => { + this.counter += 2 + }) + ``` + + +- 使用匿名函数表达式配置组件的事件方法: + + 此时要求我们使用**bind**,以确保函数体中的this引用包含的组件。 + + ``` + // Counter is a private data variable defined in the component. + Button('add counter') + .onClick(function () { + this.counter += 2 + }.bind(this)) + ``` + + +- 使用组件的成员函数配置组件的事件方法: + + ``` + myClickHandler(): void { + // do something + } + + ... + + Button('add counter') + .onClick(this.myClickHandler) + ``` + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/05.\345\255\220\347\273\204\344\273\266\351\205\215\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/05.\345\255\220\347\273\204\344\273\266\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..bc70412e55d4718bec3d922cabb56f1e2ed7afa2 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/02.\345\243\260\346\230\216\345\274\217UI\346\217\217\350\277\260\350\247\204\350\214\203/05.\345\255\220\347\273\204\344\273\266\351\205\215\347\275\256.md" @@ -0,0 +1,60 @@ +--- +title: 子组件配置 +permalink: /pages/000b010101010104 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 子组件配置 + +对于支持子组件配置的组件,例如容器组件,在“**\{ ... \}**”里为组件添加子组件的UI描述。**Column**、**Row**、**Stack**、**Button**、**Grid**和**List**组件都是容器组件。 + +以下是简单的**Column**示例: + +``` +Column() { + Text('Hello') + .fontSize(100) + Divider() + Text(this.myText) + .fontSize(100) + .fontColor(Color.Red) +} +``` + +可以嵌套多个子组件: + +``` +Column() { + Column() { + Button() { + Text('+ 1') + }.type(ButtonType.Capsule) + .onClick(() => console.log ('+1 clicked!')) + Image('1.jpg') + } + Divider() + Column() { + Button() { + Text('+ 2') + }.type(ButtonType.Capsule) + .onClick(() => console.log ('+2 clicked!')) + Image('2.jpg') + } + Divider() + Column() { + Button() { + Text('+ 3') + }.type(ButtonType.Capsule) + .onClick(() => console.log('+3 clicked!')) + Image('3.jpg') + } +}.alignItems(HorizontalAlign.Center) // center align components inside Column +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/01.Component.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/01.Component.md" new file mode 100644 index 0000000000000000000000000000000000000000..afcd5c804f34ef4a218233ec88f86167f34b80ad --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/01.Component.md" @@ -0,0 +1,101 @@ +--- +title: Component +permalink: /pages/000b010101010200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @Component + +**@Component**装饰的**struct**表示该结构体具有组件化能力,能够成为一个独立的组件,这种类型的组件也称为自定义组件。 + +该组件可以组合其他组件,它通过实现**build**方法来描述UI结构,其必须符合**Builder**的接口约束,该接口定义如下: + +``` +interface Builder { + build: () => void +} +``` + +用户定义的组件具有以下特点: + +- **可组合:**允许开发人员组合使用内置组件和其他组件,以及公共属性和方法; +- **可重用:**可以被其他组件重用,并作为不同的实例在不同的父组件或容器中使用; +- **有生命周期:**生命周期的回调方法可以在组件中配置,用于业务逻辑处理; +- **数据驱动更新:**可以由状态数据驱动,实现UI自动更新。 + +组件生命周期主要包括**aboutToAppear**和**aboutToDisappear**回调函数,有关规范,请参见“[组件生命周期回调函数](/pages/000b0101010402)”章节。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 组件必须遵循上述**Builder**接口约束,其他组件在内部的**build**方法中以声明式方式进行组合,在组件的第一次创建和更新场景中都会调用**build**方法。 +>- 组件禁止自定义构造函数。 + +## 示例 + +如下代码定义了**MyComponent**组件**:** + +``` +@Component +struct MyComponent { + build() { + Column() { + Text('my component') + .fontColor(Color.Red) + }.alignItems(HorizontalAlign.Center) // center align Text inside Column + } +} +``` + +**MyComponent**的**build**方法会在初始渲染时执行,此外,当组件中的状态发生变化时,**build**方法将再次执行。 + +以下代码使用了**MyComponent**组件: + +``` +@Component +struct ParentComponent { + build() { + Column() { + MyComponent() + Text('we use component') + .fontSize(20) + } + } +} +``` + +可以多次嵌入**MyComponent**,并嵌入到不同的组件中进行重用: + +``` +@Component +struct ParentComponent { + build() { + Row() { + Column() { + MyComponent() + Text('first column') + .fontSize(20) + } + Column() { + MyComponent() + Text('second column') + .fontSize(20) + } + } + } + + private aboutToAppear() { + console.log('ParentComponent: Just created, about to become rendered first time.') + } + + private aboutToDisappear() { + console.log('ParentComponent: About to be removed from the UI.') + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/02.Entry.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/02.Entry.md" new file mode 100644 index 0000000000000000000000000000000000000000..5de87b4816575665c96ebf2408999410cf2b2783 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/02.Entry.md" @@ -0,0 +1,48 @@ +--- +title: Entry +permalink: /pages/000b010101010201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @Entry + +用**@Entry**装饰的自定义组件用作页面的默认入口组件,加载页面时,将首先创建并呈现**@Entry**装饰的自定义组件。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>在单个源文件中,最多可以使用**@Entry**装饰一个自定义组件。 + +## 示例 + +**@Entry**的用法如下: + +``` +// Only MyComponent decorated by @Entry is rendered and displayed. "hello world" is displayed, but "goodbye" is not displayed. +@Entry +@Component +struct MyComponent { + build() { + Column() { + Text('hello world') + .fontColor(Color.Red) + } + } +} + +@Component +struct HideComponent { + build() { + Column() { + Text('goodbye') + .fontColor(Color.Blue) + } + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/03.Preview.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/03.Preview.md" new file mode 100644 index 0000000000000000000000000000000000000000..07b5452a7a4abb1ee3cd14c774d7f9c630aa08df --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/03.Preview.md" @@ -0,0 +1,73 @@ +--- +title: Preview +permalink: /pages/000b010101010202 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @Preview + +用**@Preview**装饰的自定义组件可以在DevEco的PC预览上进行单组件预览,加载页面时,将创建并呈现**@Preview**装饰的自定义组件。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>在单个源文件中,最多可以使用**@Preview**装饰一个自定义组件。 + +## 示例 + +**@Preview**的用法如下: + +``` +// Display only Hello Component1 on the PC preview. The content under MyComponent is displayed on the real device. +@Entry +@Component +struct MyComponent { + build() { + Column() { + Row() { + Text('Hello World!') + .fontSize("50lpx") + .fontWeight(FontWeight.Bold) + } + Row() { + Component1() + } + Row() { + Component2() + } + } + } +} +@Preview +@Component +struct Component1 { + build() { + Column() { + Row() { + Text('Hello Component1') + .fontSize("50lpx") + .fontWeight(FontWeight.Bold) + } + } + } +} + +@Component +struct Component2 { + build() { + Column() { + Row() { + Text('Hello Component2') + .fontSize("50lpx") + .fontWeight(FontWeight.Bold) + } + } + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/04.Builder.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/04.Builder.md" new file mode 100644 index 0000000000000000000000000000000000000000..7e5fee39e963d692a48d133c746e7c15770bd84f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/04.Builder.md" @@ -0,0 +1,57 @@ +--- +title: Builder +permalink: /pages/000b010101010203 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @Builder + +@Builder装饰器定义了一个如何渲染自定义组件的方法。此装饰器提供了一个修饰方法,其目的是和[build函数](/pages/000b0101010400)一致。@Builder装饰器装饰的方法的语法规范与build函数也保持一致。 + +通过@Builder装饰器可以在一个自定义组件内快速生成多个布局内容。 + +``` +@Entry +@Component +struct CompA { + size : number = 100; + + @Builder SquareText(label: string) { + Text(label) + .width(1 * this.size) + .height(1 * this.size) + } + + @Builder RowOfSquareTexts(label1: string, label2: string) { + Row() { + this.SquareText(label1) + this.SquareText(label2) + } + .width(2 * this.size) + .height(1 * this.size) + } + + build() { + Column() { + Row() { + this.SquareText("A") + this.SquareText("B") + // or as long as tsc is used + } + .width(2 * this.size) + .height(1 * this.size) + this.RowOfSquareTexts("C", "D") + } + .width(2 * this.size) + .height(2 * this.size) + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/05.Extend.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/05.Extend.md" new file mode 100644 index 0000000000000000000000000000000000000000..7543071b3ec3c1387e6023b0d0f238f9055d66a7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/05.Extend.md" @@ -0,0 +1,41 @@ +--- +title: Extend +permalink: /pages/000b010101010204 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @Extend + +**@Extend**装饰器将新的属性函数添加到内置组件上,如**Text**、**Column**、**Button**等。通过**@Extend**装饰器可以快速定义并复用组件的自定义样式。 + +``` +@Extend(Text) function fancy(color: number) { + .fontColor(color) + .fontSize(24) + .fontStyle(FontStyle.Italic) +} + +@Entry +@Component +struct FancyUse { + build() { + Row({ space: 10 }) { + Text("Fancy") + .fancy(Color.Blue) + Text("Fancy") + .fancy(Color.Red) + } + } +} +``` + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>@Extend装饰器不能用在自定义组件struct定义框内。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/06.CustomDialog.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/06.CustomDialog.md" new file mode 100644 index 0000000000000000000000000000000000000000..73aa95e0a650866c15c29c58779918cac57115c5 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/02.\351\200\232\347\224\250UI\346\217\217\350\277\260\350\247\204\350\214\203/03.\347\273\204\344\273\266\345\214\226/06.CustomDialog.md" @@ -0,0 +1,62 @@ +--- +title: CustomDialog +permalink: /pages/000b010101010205 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @CustomDialog + +**@CustomDialog**装饰器用于装饰自定义弹窗。 + +``` +// custom-dialog-demo.ets +@CustomDialog +struct DialogExample { + controller: CustomDialogController; + action: () => void; + + build() { + Row() { + Button ("Close CustomDialog") + .onClick(() => { + this.controller.close(); + this.action(); + }) + }.padding(20) + } +} + +@Entry +@Component +struct CustomDialogUser { + dialogController : CustomDialogController = new CustomDialogController({ + builder: DialogExample({action: this.onAccept}), + cancel: this.existApp, + autoCancel: true + }); + + onAccept() { + console.log("onAccept"); + } + existApp() { + console.log("Cancel dialog!"); + } + + build() { + Column() { + Button("Click to open Dialog") + .onClick(() => { + this.dialogController.open() + }) + } + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" new file mode 100644 index 0000000000000000000000000000000000000000..21e3b95f3d35abe9ebe1b039187b765fae70945d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/01.\345\237\272\346\234\254\346\246\202\345\277\265.md" @@ -0,0 +1,35 @@ +--- +title: 基本概念 +permalink: /pages/000b0101010200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 基本概念 + +在声明式UI编程范式中,UI是应用程序状态的函数,开发人员通过修改当前应用程序状态来更新相应的UI界面。 + +开发框架提供了多种应用程序状态管理的能力。 + +![](/images/application-dev/reference/arkui-ts/figures/CoreSpec_/images/application-dev/reference/arkui-ts/figures_state-mgmt-overview.png) + +## 状态变量装饰器 + +- **@State:**组件拥有的状态属性。每当**@State**装饰的变量更改时,组件会重新渲染更新UI。 +- **@Link:**组件依赖于其父组件拥有的某些状态属性。每当任何一个组件中的数据更新时,另一个组件的状态都会更新,父子组件都会进行重新渲染。 +- **@Prop:**工作原理类似**@Link**,只是子组件所做的更改不会同步到父组件上,属于单向传递。 + +## 应用程序状态数据 + +**AppStorage**是整个UI中使用的应用程序状态的中心“数据库”,UI框架会针对应用程序创建单例**AppStorage**对象,并提供相应的装饰器和接口供应用程序使用。 + +- **@StorageLink:@StorageLink\(name\)**的工作原理类似于**@Consume\(name\)**,不同的是,该给定名称的链接对象是从**AppStorage**中获得的,它在**UI组件**和**AppStorage**之间建立双向绑定同步数据。 +- **@StorageProp:@StorageProp\(name\)**将UI组件属性与**AppStorage**进行单向同步。**AppStorage**中的值更改会更新组件中的属性,但UI组件无法更改**AppStorage**中的属性值。 +- **AppStorage**还提供用于业务逻辑实现的API,用于添加、读取、修改和删除应用程序的状态属性,通过此API所做的更改会导致修改的状态数据同步到UI组件上进行UI更新。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/02.\347\256\241\347\220\206\347\273\204\344\273\266\346\213\245\346\234\211\347\232\204\347\212\266\346\200\201/01.State.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/02.\347\256\241\347\220\206\347\273\204\344\273\266\346\213\245\346\234\211\347\232\204\347\212\266\346\200\201/01.State.md" new file mode 100644 index 0000000000000000000000000000000000000000..280b4c1d08814466673ac63c9003e7cda1218458 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/02.\347\256\241\347\220\206\347\273\204\344\273\266\346\213\245\346\234\211\347\232\204\347\212\266\346\200\201/01.State.md" @@ -0,0 +1,107 @@ +--- +title: State +permalink: /pages/000b010101020100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @State + +**@State**装饰的变量是组件内部的状态数据,当这些状态数据被修改时,将会调用所在组件的**build**方法进行UI刷新。 + +**@State**状态数据具有以下特征: + +- **支持多种类型:**允许如下强类型的按值和按引用类型:**class**、**number**、**boolean**、**string**,以及这些类型的数组,即**Array**、**Array**、**Array**、**Array**。不允许**object**和**any。** +- **支持多实例:**组件不同实例的内部状态数据独立。 +- **内部私有:**标记为**@State**的属性不能直接在组件外部修改。它的生命周期取决于它所在的组件。 +- **需要本地初始化:**必须为所有**@State**变量分配初始值,将变量保持未初始化可能导致框架行为未定义。 +- **创建自定义组件时支持通过状态变量名设置初始值:**在创建组件实例时,可以通过变量名显式指定**@State**状态属性的初始值**。** + +## 简单类型的状态属性示例 + +``` +@Entry +@Component +struct MyComponent { + @State count: number = 0 + // MyComponent provides a method for modifying the @State status data member. + private toggleClick() { + this.count += 1 + } + + build() { + Column() { + Button() { + Text(`click times: ${this.count}`) + .fontSize(10) + }.onClick(this.toggleClick.bind(this)) + } + } +} +``` + +## 复杂类型的状态变量示例 + +``` +// Customize the status data class. +class Model { + value: string + constructor(value: string) { + this.value = value + } +} + +@Entry +@Component +struct EntryComponent { + build() { + Column() { + MyComponent({count: 1, increaseBy: 2}) // MyComponent1 in this document + MyComponent({title: {value: 'Hello, World 2'}, count: 7}) //MyComponent2 in this document + } + } +} + +@Component +struct MyComponent { + @State title: Model = {value: 'Hello World'} + @State count: number = 0 + private toggle: string = 'Hello World' + private increaseBy: number = 1 + + build() { + Column() { + Text(`${this.title.value}`) + Button() { + Text(`Click to change title`).fontSize(10) + }.onClick(() => { + this.title.value = this.toggle ? 'Hello World' : 'Hello UI' + }) // Modify the internal state of MyComponent using the anonymous method. + + Button() { + Text(`Click to increase count=${this.count}`).fontSize(10) + }.onClick(() => { + this.count += this.increaseBy + }) // Modify the internal state of MyComponent using the anonymous method. + } + } +} +``` + +在上述示例中: + +- 用户定义的组件**MyComponent**定义了**@State**状态变量**count**和**title**。如果**count**或**title**的值发生变化,则执行**MyComponent**的**build**方法来重新渲染组件; +- **EntryComponent**中有多个**MyComponent**组件实例,第一个**MyComponent**内部状态的更改不会影响第二个**MyComponent**; +- 创建**MyComponent**实例时通过变量名给组件内的变量进行初始化,如: + + ``` + MyComponent({title: {value: 'Hello, World 2'}, count: 7}) + ``` + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/02.\347\256\241\347\220\206\347\273\204\344\273\266\346\213\245\346\234\211\347\232\204\347\212\266\346\200\201/02.Prop.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/02.\347\256\241\347\220\206\347\273\204\344\273\266\346\213\245\346\234\211\347\232\204\347\212\266\346\200\201/02.Prop.md" new file mode 100644 index 0000000000000000000000000000000000000000..295ad1fd572e9141fe43c57af6cf6446f6d44520 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/02.\347\256\241\347\220\206\347\273\204\344\273\266\346\213\245\346\234\211\347\232\204\347\212\266\346\200\201/02.Prop.md" @@ -0,0 +1,81 @@ +--- +title: Prop +permalink: /pages/000b010101020101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @Prop + +**@Prop**具有与**@State**相同的语义,但初始化方式不同。**@Prop**装饰的变量必须使用其父组件提供的**@State**变量进行初始化,允许组件内部修改**@Prop**变量,但上述更改不会通知给父组件,即**@Prop**属于单向数据绑定。 + +**@Prop**状态数据具有以下特征: + +- **支持简单类型:**仅支持简单类型:number、string、boolean; +- **私有:**仅在组件内访问; +- **支持多个实例:**一个组件中可以定义多个标有**@Prop**的属性; +- **创建自定义组件时将值传递给@Prop变量进行初始化:**在创建组件的新实例时,必须初始化所有@Prop变量,不支持在组件内部进行初始化。 + +## 示例 + +``` +@Entry +@Component +struct ParentComponent { + @State countDownStartValue: number = 10 // 10 Nuggets default start value in a Game + build() { + Column() { + Text(`Grant ${this.countDownStartValue} nuggets to play.`) + Button() { + Text('+1 - Nuggets in New Game') + }.onClick(() => { + this.countDownStartValue += 1 + }) + Button() { + Text('-1 - Nuggets in New Game') + }.onClick(() => { + this.countDownStartValue -= 1 + }) + + // when creatng ChildComponent, the initial value of its @Prop variable must be supplied + // in a named constructor parameter + // also regular costOfOneAttempt (non-Prop) variable is initialied + CountDownComponent({ count: this.countDownStartValue, costOfOneAttempt: 2}) + } + } +} + +@Component +struct CountDownComponent { + @Prop count: number + private costOfOneAttempt: number + + build() { + Column() { + if (this.count > 0) { + Text(`You have ${this.count} Nuggets left`) + } else { + Text('Game over!') + } + + Button() { + Text('Try again') + }.onClick(() => { + this.count -= this.costOfOneAttempt + }) + } + } +} +``` + +在上述示例中,当按“+1”或“-1”按钮时,父组件状态发生变化,重新执行**build**方法,此时将创建一个新的**CountDownComponent**组件。父组件的**countDownStartValue**状态属性被用于初始化子组件的**@Prop**变量。当按下子组件的“Try again”按钮时,其**@Prop**变量**count**将被更改,这将导致**CountDownComponent**重新渲染。但是,**count**值的更改不会影响父组件的**countDownStartValue**值。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>创建新组件实例时,必须初始化其所有**@Prop**变量。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/02.\347\256\241\347\220\206\347\273\204\344\273\266\346\213\245\346\234\211\347\232\204\347\212\266\346\200\201/03.Link.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/02.\347\256\241\347\220\206\347\273\204\344\273\266\346\213\245\346\234\211\347\232\204\347\212\266\346\200\201/03.Link.md" new file mode 100644 index 0000000000000000000000000000000000000000..107149c98c4c2e7100bfe5bf2539dcc74b1cae12 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/02.\347\256\241\347\220\206\347\273\204\344\273\266\346\213\245\346\234\211\347\232\204\347\212\266\346\200\201/03.Link.md" @@ -0,0 +1,138 @@ +--- +title: Link +permalink: /pages/000b010101020102 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @Link + +**@Link**装饰的变量可以和父组件的**@State**变量建立双向数据绑定: + +- **支持多种类型:@Link**变量的值与**@State**变量的类型相同,即class、number、string、boolean或这些类型的数组; +- **私有:**仅在组件内访问; +- **单个数据源:**初始化**@Link**变量的父组件的变量必须是**@State**变量; +- **双向通信:**子组件对**@Link**变量的更改将同步修改父组件的**@State**变量; +- **创建自定义组件时需要将变量的引用传递给@Link变量:**在创建组件的新实例时,必须使用命名参数初始化所有**@Link**变量。**@Link**变量可以使用**@State**变量或**@Link**变量的引用进行初始化。**@State**变量可以通过'**$**'操作符创建引用。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>**@Link**变量不能在组件内部进行初始化。 + +## 简单类型示例 + +``` +@Entry +@Component +struct Player { + @State isPlaying: boolean = false + build() { + Column() { + PlayButton({buttonPlaying: $isPlaying}) + Text(`Player is ${this.isPlaying? '':'not'} playing`) + } + } +} + +@Component +struct PlayButton { + @Link buttonPlaying: boolean + build() { + Column() { + Button() { + Image(this.buttonPlaying? 'play.png' : 'pause.png') + }.onClick(() => { + this.buttonPlaying = !this.buttonPlaying + }) + } + } +} +``` + +**@Link**语义是从'**$**'操作符引出,即**$isPlaying**是**this.isPlaying**内部状态的双向数据绑定。当您单击**PlayButton**时,PlayButton 的**Image**组件和**Text**组件将同时进行刷新。 + +## 复杂类型示例 + +``` +@Entry +@Component +struct Parent { + @State arr: number[] = [1, 2, 3] + build() { + Column() { + Child({items: $arr}) + ForEach(this.arr, + item => Text(`${item}`), + item => item.toString()) + } + } +} + +@Component +struct Child { + @Link items: number[] + build() { + Column() { + Button() { + Text('Button1: push') + }.onClick(() => { + this.items.push(100) + }) + Button() { + Text('Button2: replace whole item') + }.onClick(() => { + this.items = [100, 200, 300] + }) + } + } +} +``` + +在上面的示例中,点击**Button1**和**Button2**以更改父组件中显示的文本项目列表。 + +## @Link和@State、@Prop结合使用示例 + +``` +@Entry +@Component +struct ParentView { + @State counter: number = 0 + build() { + Column() { + ChildA({counterVal: this.counter}) // pass by value + ChildB({counterRef: $counter}) // $ creates a Reference that can be bound to counterRef + } + } +} + +@Component +struct ChildA { + @Prop counterVal: number + build() { + Button() { + Text(`ChildA: (${this.counterVal}) + 1`) + }.onClick(() => {this.counterVal+= 1}) + } +} + +@Component +struct ChildB { + @Link counterRef: number + build() { + Button() { + Text(`ChildB: (${this.counterRef}) + 1`) + }.onClick(() => {this.counterRef+= 1}) + } +} +``` + +上述示例中,ParentView包含ChildA和ChildB两个子组件,ParentView的状态变量**counter**分别初始化ChildA和ChildB: + +- ChildB使用**@Link**建立双向状态绑定。当**ChildB**修改**counterRef**状态变量值时,该更改将同步到**ParentView**和**ChildA**共享; +- ChildA使用**@Prop**建立从**ParentView**到自身的单向状态绑定。当**ChildA**修改状态时,**ChildA**将重新渲染,但该更改不会传达给**ParentView**和**ChildB。** + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/01.\346\216\245\345\217\243/01.\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\346\225\260\346\215\256\345\255\230\345\202\250.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/01.\346\216\245\345\217\243/01.\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\346\225\260\346\215\256\345\255\230\345\202\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..17efb7bc4ec4bc7d704c52cd398c95cae3089b94 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/01.\346\216\245\345\217\243/01.\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\346\225\260\346\215\256\345\255\230\345\202\250.md" @@ -0,0 +1,166 @@ +--- +title: 应用程序的数据存储 +permalink: /pages/000b01010102020000 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 应用程序的数据存储 + +**AppStorage**是应用程序中的单例对象,由UI框架在应用程序启动时创建。它的目的是为可变应用程序状态属性提供中央存储。**AppStorage**包含整个应用程序中需要访问的所有状态属性。只要应用程序保持运行,**AppStorage**存储就会保留所有属性及其值,属性值可以通过唯一的键值进行访问。 + +UI组件可以通过装饰器将应用程序状态数据与**AppStorage**进行同步。应用业务逻辑的实现也可以通过接口访问**AppStorage**。 + +AppStorage的选择状态属性可以与不同的数据源或数据接收器同步。这些数据源和接收器可以是设备上的本地或远程,并具有不同的功能,如数据持久性。这样的数据源和接收器可以独立于UI在业务逻辑中实现。 + +默认情况下,**AppStorage**中的属性是可变的,**AppStorage**还可使用不可变(只读)属性。 + +## AppStorage接口说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法

+

参数说明

+

返回值

+

定义

+

Link

+

key: string

+

@Link

+

如果存在具有给定键的数据,则返回到此属性的双向数据绑定,该双向绑定意味着变量或者组件对数据的更改将同步到AppStorage,通过AppStorage对数据的修改将同步到变量或者组件。如果具有此键的属性不存在或属性为只读,则返回undefined

+

SetAndLink

+

key : String

+

defaultValue: T

+

@Link

+

与Link接口类似。如果当前的key在AppStorage有保存,则返回此key对应的value。如果此key未被创建,则创建一个对应default值的Link返回。

+

Prop

+

key: string

+

@Prop

+

如果存在具有给定键的属性,则返回到此属性的单向数据绑定。该单向绑定意味着只能通过AppStorage将属性的更改同步到变量或者组件。该方法返回的变量为不可变变量,适用于可变和不可变的状态属性,如果具有此键的属性不存在则返回undefined

+
说明:

prop方法对应的属性值类型为简单类型。

+
+

SetAndProp

+

key : string

+

defaultValue: S

+

@Prop

+

与Prop接口类似。如果当前的key在AppStorage有保存,则返回此key对应的value。如果此key未被创建,则创建一个对应default值的Prop返回。

+

Has

+

key: string

+

boolean

+

判断对应键值的属性是否存在

+

Keys

+

void

+

array<string>

+

返回包含所有键的字符串数组。

+

Get

+

string

+

T或undefined

+

通过此接口获取对应此key值的value

+

Set

+

string, newValue :T

+

void

+

对已保存的key值,替换其value值。

+

SetOrCreate

+

string, newValue :T

+

boolean

+

如果相同名字的属性存在:如果此属性可以被更改返回true,否则返回false

+

如果相同名字的属性不存在:创建第一个赋值为defaultValue的属性,不支持null和undefined

+

Delete

+

key : string

+

boolean

+

删除属性,如果存在返回true,不存在返回false

+

Clear

+

none

+

boolean

+

删除所有的属性,如果当前有状态变量依旧引用此属性,则返回false

+

IsMutable

+

key: string

+
  

返回此属性是否存在并且是否可以改变。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>当前接口当前仅可以处理基础类型数据,对于修改object中某一个值尚未支持。 + +## 示例 + +``` +let link1 = AppStorage.Link('PropA') +let link2 = AppStorage.Link('PropA') +let prop = AppStorage.Prop('PropA') + +link1 = 47 // causes link1 == link2 == prop == 47 +link2 = link1 + prop // causes link1 == link2 == prop == 94 +prop = 1 // error, prop is immutable +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/01.\346\216\245\345\217\243/02.\346\214\201\344\271\205\345\214\226\346\225\260\346\215\256\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/01.\346\216\245\345\217\243/02.\346\214\201\344\271\205\345\214\226\346\225\260\346\215\256\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..a914c8395c51f6f58fd82dfc5f28dd61484d35b4 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/01.\346\216\245\345\217\243/02.\346\214\201\344\271\205\345\214\226\346\225\260\346\215\256\347\256\241\347\220\206.md" @@ -0,0 +1,107 @@ +--- +title: 持久化数据管理 +permalink: /pages/000b01010102020001 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 持久化数据管理 + +**PersistentStorage**用于管理应用持久化数据。此对象可以将特定标记的持久化数据链接到AppStorage中,并由AppStorage接口访问对应持久化数据,或者通过@StorageLink修饰器来访问对应key的变量。 + +## PersistentStorage接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

方法

+

参数说明

+

返回值

+

定义

+

PersistProp

+

key : string

+

defaultValue: T

+

void

+

关联命名的属性在AppStorage变为持久化数据。赋值覆盖顺序

+

首先 如果此属性在AppStorage中存在,并且将Persistent中的数据复写为AppStorage中的属性值。

+

其次Persistent中有此命名的属性,使用Persistent中的属性值。

+

最后 以上条件不满足使用defaultValue,不支持null和undefined。

+

DeleteProp

+

key: string

+

void

+

取消双向数据绑定,该属性值将从持久存储中删除。

+

PersistProps

+

keys: {

+

key: string,

+

defaultValue: any

+

}[]

+

void

+

关联多个命名的属性绑定。

+

Keys

+

void

+

Array<string>

+

返回所有持久化属性的标记。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- PersistProp接口使用时,需要保证输入对应的key应当在Appstorage存在。 +>- DeleteProp接口使用时,只能对本次启动已经link过的数据生效。 + +``` +PersistentStorage.PersistProp("highScore", "0"); + +@Entry +@Component +struct PersistentComponent { + @StorageLink('highScore') highScore: string = '0' + @State currentScore: number = 0 + build() { + Column() { + if (this.currentScore === Number(this.highScore)) { + Text(`new highScore : ${this.highScore}`) + } + Button() { + Text(`goal!, currentScore : ${this.currentScore}`) + .fontSize(10) + }.onClick(() => { + this.currentScore++ + if (this.currentScore > Number(this.highScore)) { + this.highScore = this.currentScore.toString() + } + }) + } + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/01.\346\216\245\345\217\243/03.\347\216\257\345\242\203\345\217\230\351\207\217.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/01.\346\216\245\345\217\243/03.\347\216\257\345\242\203\345\217\230\351\207\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..87c3bfdf3bcdbfb450acd551bc4e8b183df7f8fd --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/01.\346\216\245\345\217\243/03.\347\216\257\345\242\203\345\217\230\351\207\217.md" @@ -0,0 +1,131 @@ +--- +title: 环境变量 +permalink: /pages/000b01010102020002 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 环境变量 + +**Environment**是框架在应用程序启动时创建的单例对象,它为**AppStorage**提供了一系列应用程序需要的环境状态属性,这些属性描述了应用程序运行的设备环境。**Environment**及其属性是不可变的,所有属性值类型均为简单类型。 + +如下示例展示了从**Environment**获取语音环境: + +``` +Environment.EnvProp("accessibilityEnabled", "default"); +var enable = AppStorageGet("accessibilityEnabled"); +``` + +**accessibilityEnabled**是**Environment**提供默认系统变量识别符。首先需要将对应系统属性绑定到**Appstorage**中,后可以通过AppStorage中的方法或者装饰器,访问对应系统属性数据。 + +## Environment接口 + + + + + + + + + + + + + + + + + + + + + + + + +

key

+

参数

+

返回值

+

说明

+

EnvProp

+

key : string

+

defaultValue: any

+

boolean

+

关联此系统项到Appstorage中。建议在app启动时使用此Api。如果此属性在Appstorage已经存在则返回false。请勿使用AppStorage中的变量,在调用此方法关联环境变量。

+

EnvProps

+

keys: {

+

key: string,

+

defaultValue: any

+

}[]

+

void

+

关联此系统项数组到Appstorage中。

+

Keys

+

Array<string>

+

number

+

返回关联的系统项。

+
+ +## Environment内置的环境变量 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key

+

类型

+

说明

+

accessibilityEnabled

+

boolean

+

无障碍屏幕朗读是否启用。

+

colorMode

+

ColorMode

+

深浅色模式,选项值为:

+
  • ColorMode.LIGHT:浅色模式;
  • ColorMode.DARK:深色模式。
+

fontScale

+

number

+

字体大小比例,范围为:[0.85, 1.45]。

+

fontWeightScale

+

number

+

字体权重比例,取值范围:[0.6, 1.6]。

+

layoutDirection

+

LayoutDirection

+

布局方向类型,可选值为:

+
  • LayoutDirection.LTR:从左到右;
  • LayoutDirection.RTL:从右到左。
+

languageCode

+

string

+

当前系统语言值,小写字母,例如zh。

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/02.AppStorage\344\270\216\347\273\204\344\273\266\345\220\214\346\255\245.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/02.AppStorage\344\270\216\347\273\204\344\273\266\345\220\214\346\255\245.md" new file mode 100644 index 0000000000000000000000000000000000000000..426cc17cb1b88dc95be8af69b0e0448ccbda74ef --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/03.\347\256\241\347\220\206\345\272\224\347\224\250\347\250\213\345\272\217\347\232\204\347\212\266\346\200\201/02.AppStorage\344\270\216\347\273\204\344\273\266\345\220\214\346\255\245.md" @@ -0,0 +1,67 @@ +--- +title: AppStorage与组件同步 +permalink: /pages/000b010101020201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# AppStorage与组件同步 + +在[管理组件拥有的状态](/pages/000b010101020100)中,我们已经定义了如何将组件的状态变量与父组件或祖先组件中的**@State**装饰的状态变量同步,主要包括**@Prop**、**@Link**、**@Consume**。 + +本章节将定义如何将组件变量与**AppStorage**同步,主要提供**@StorageLink**和**@StorageProp**装饰器。 + +## @StorageLink装饰器 + +组件通过使用**@StorageLink\(key\)**装饰的状态变量,将于**AppStorage**建立双向数据绑定,**key**为**AppStorage**中的属性键值。当创建包含**@StorageLink**的状态变量的组件时,该状态变量的值将使用**AppStorage**中的值进行初始化。在UI组件中对**@StorageLink**的状态变量所做的更改将同步到**AppStorage**,并从**AppStorage**同步到任何其他绑定实例中,如**PersistentStorage**或其他绑定的UI组件。 + +## @StorageProp装饰器 + +组件通过使用**@StorageProp\(key\)**装饰的状态变量,将于**AppStorage**建立单向数据绑定,**key**标识AppStorage中的属性键值。当创建包含**@StoageProp**的状态变量的组件时,该状态变量的值将使用**AppStorage**中的值进行初始化。**AppStorage**中的属性值更改会导致绑定的UI组件进行状态更新。 + +## 示例 + +``` +let varA = AppStorage.Link('varA') +let envLang = AppStorage.Prop('languageCode') + +@Entry +@Component +struct ComponentA { + @StorageLink('varA') varA: number = 2 + @StorageProp('languageCode') lang: string = 'en' + private label: string = 'count' + + private aboutToAppear() { + this.label = (this.lang === 'zh') ? '数' : 'Count' + } + + build() { + Row({ space: 20 }) { + + Button(`${this.label}: ${this.varA}`) + .onClick(() => { + AppStorage.Set('varA', AppStorage.Get('varA') + 1) + }) + Button(`lang: ${this.lang}`) + .onClick(() => { + if (this.lang === 'zh') { + AppStorage.Set('languageCode', 'en') + } else { + AppStorage.Set('languageCode', 'zh') + } + this.label = (this.lang === 'zh') ? '数' : 'Count' + }) + } + } +} +``` + +每次用户单击Count按钮时,this.varA变量值都会增加,此变量与AppStorage中的varA同步。每次用户单击当前语言按钮时,修改AppStorage中的languageCode,此修改会同步给this.lang变量。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/04.\345\205\266\344\273\226\347\261\273\347\233\256\347\232\204\347\212\266\346\200\201\347\256\241\347\220\206/01.Observed\345\222\214ObjectLink\346\225\260\346\215\256\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/04.\345\205\266\344\273\226\347\261\273\347\233\256\347\232\204\347\212\266\346\200\201\347\256\241\347\220\206/01.Observed\345\222\214ObjectLink\346\225\260\346\215\256\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..96d47d711dcf8cdf1ea4e7b57d8a07bbdafb4c12 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/04.\345\205\266\344\273\226\347\261\273\347\233\256\347\232\204\347\212\266\346\200\201\347\256\241\347\220\206/01.Observed\345\222\214ObjectLink\346\225\260\346\215\256\347\256\241\347\220\206.md" @@ -0,0 +1,84 @@ +--- +title: Observed和ObjectLink数据管理 +permalink: /pages/000b010101020300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# Observed和ObjectLink数据管理 + +@observed是用来class的修饰器,表示此对象中的数据变更将被UI页面管理。@objectLink用来修饰被@observed装饰的变量。 + +``` +// 需要监控的对象 +@Observed class ClassA { + static nextID : number = 0; + public id : number; + public c: number; + + constructor(c: number) { + this.id = ClassA.nextID++; + this.c = c; + } +} + +@Observed class ClassB { + public a: ClassA; + + constructor(a: ClassA) { + this.a = a; + } +} +``` + +``` +@Component +struct ViewA { + @ObjectLink a : ClassA; + label : string = "ViewA1"; + build() { + Row() { + Button(`ViewA [${this.label}] this.a.c=${this.a.c} +1`) + .onClick(() => { + this.a.c += 1; + }) + Button(`ViewA [${this.label}] reset this.a =new ClassA(0)`) + .onClick(() => { + this.a = new ClassA(0); // ERROR, this.a is immutable + }) + } + } +} + +@Entry +@Component +struct ViewB { + @State b : ClassB = new ClassB(new ClassA(0)); + + build() { + Column() { + ViewA({label: "ViewA #1", a: this.b.a}) + ViewA({label: "ViewA #2", a: this.b.a}) + + Button(`ViewB: this.b.a = new ClassA(0)`) + .onClick(() => { + this.b.a = new ClassA(0); + }) + Button(`ViewB: this.b = new ClassB(ClassA(0))`) + .onClick(() => { + this.b = new ClassB(new ClassA(0)); + }) + } + } +} +``` + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>@ObjectLink用于修饰变量,并且不可以初始化。@Observed用于修饰类。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/04.\345\205\266\344\273\226\347\261\273\347\233\256\347\232\204\347\212\266\346\200\201\347\256\241\347\220\206/02.Consume\345\222\214Provide\346\225\260\346\215\256\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/04.\345\205\266\344\273\226\347\261\273\347\233\256\347\232\204\347\212\266\346\200\201\347\256\241\347\220\206/02.Consume\345\222\214Provide\346\225\260\346\215\256\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..834e9ebcceabc8ad68448944a5d06a904b03aaf3 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/04.\345\205\266\344\273\226\347\261\273\347\233\256\347\232\204\347\212\266\346\200\201\347\256\241\347\220\206/02.Consume\345\222\214Provide\346\225\260\346\215\256\347\256\241\347\220\206.md" @@ -0,0 +1,119 @@ +--- +title: Consume和Provide数据管理 +permalink: /pages/000b010101020301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @Consume和@Provide数据管理 + +Provide作为数据的提供方,可以更新其子孙节点的数据,并触发页面渲染。Consume在感知到Provide数据的更新后,会触发当前view的重新渲染。 + +**表 1** @Provide + + + + + + + + + + + + + + + + + + + +

类型

+

说明

+

装饰器参数

+

别名:是一个string类型的常量。如果规定别名,则提供对应别名的数据更新。如果没有,则使用变量名作为别名。推荐使用@Provide("alias")这种形式。

+

同步机制

+

@Provide的变量类似@state,可以修改对应变量进行页面重新渲染。也可以修改@Consume装饰的变量,反向修改@State变量。

+

初始值

+

必须制定初始值

+

页面重渲染场景

+

1. 基础类型 boolean,string,number

+

2. observed class,修改其中的属性

+

3. Array:添加,删除,更新数组中的元素

+
+ +**表 2** @Consume + + + + + + + + + + +

类型

+

说明

+

初始值

+

不可设置默认值

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>使用@Provide 和@Consume时避免循环引用导致死循环。 + +其他属性说明与Provide一致。 + +``` +@Entry +@Component +struct CompA { + @Provide("reviewVote") reviewVotes : number = 0; + + build() { + Column() { + CompB() + Button() { + Text(`${this.reviewVotes}`) + .fontSize(30) + } + .onClick(() => { + this.reviewVotes += 1; + }) + } + } +} + +@Component +struct CompB { + build() { + Column() { + CompC() + } + } +} + +@Component +struct CompC { + @Consume("reviewVote") reviewVotes : number; + build() { + Column() { + Button() { + Text(`${this.reviewVotes}`) + .fontSize(30) + } + .onClick(() => { + this.reviewVotes += 1; + }) + } + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/04.\345\205\266\344\273\226\347\261\273\347\233\256\347\232\204\347\212\266\346\200\201\347\256\241\347\220\206/03.Watch.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/04.\345\205\266\344\273\226\347\261\273\347\233\256\347\232\204\347\212\266\346\200\201\347\256\241\347\220\206/03.Watch.md" new file mode 100644 index 0000000000000000000000000000000000000000..337d32fec3e9f5286073faff287076178beb63b0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/03.UI\347\212\266\346\200\201\347\256\241\347\220\206/04.\345\205\266\344\273\226\347\261\273\347\233\256\347\232\204\347\212\266\346\200\201\347\256\241\347\220\206/03.Watch.md" @@ -0,0 +1,47 @@ +--- +title: Watch +permalink: /pages/000b010101020302 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# @Watch + +应用可以注册回调方法。当一个被@State, @Prop, @Link, @ObjectLink, @Provide, @Consume, @StorageProp, 以及 @StorageLink中任意一个装饰器修饰的变量改变时,均可触发此回调。@Watch中的变量一定要使用(“”)进行包装。 + +``` +@Entry +@Component +struct CompA { + @State @Watch("onBasketUpdated") shopBasket : Array = [ 7, 12, 47, 3 ]; + @State totalPurchase : number = 0; + + updateTotal() : number { + let sum = 0; + this.shopBasket.forEach((i) => { sum += i; }); + // calculate new total shop basket value and apply discount if over 100RMB + this.totalPurchase = (sum < 100) ? sum : 0.9 * sum; + return this.totalPurchase; + } + + // @Watch cb + onBasketUpdated(propName: string) : void { + this.updateTotal(); + } + + build() { + Column() { + Button("add to basket").onClick(() => { this.shopBasket.push(Math.round(100 * Math.random())) }) + Text(`${this.totalPurchase}`) + .fontSize(30) + } + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/04.\346\270\262\346\237\223\346\216\247\345\210\266\350\257\255\346\263\225/01.\346\235\241\344\273\266\346\270\262\346\237\223.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/04.\346\270\262\346\237\223\346\216\247\345\210\266\350\257\255\346\263\225/01.\346\235\241\344\273\266\346\270\262\346\237\223.md" new file mode 100644 index 0000000000000000000000000000000000000000..e19d63d69d92b75fd558a58c0463d4fc475629df --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/04.\346\270\262\346\237\223\346\216\247\345\210\266\350\257\255\346\263\225/01.\346\235\241\344\273\266\346\270\262\346\237\223.md" @@ -0,0 +1,51 @@ +--- +title: 条件渲染 +permalink: /pages/000b0101010300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 条件渲染 + +使用**if/else**进行条件渲染。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- if条件语句可以使用状态变量; +>- 使用if可以使子组件的渲染依赖条件语句; +>- 必须在容器组件内使用。 +>- 某些容器组件限制子组件的类型或数量。当将if放置在这些组件内时,这些限制将应用于if和else语句内创建的组件:如当在Grid组件内使用if时,则仅允许if条件语句内使用GridItem组件,而在List组件内则仅允许ListItem组件。 + +## 示例 + +使用if条件语句: + +``` +Column() { + if (this.count > 0) { + Text('count is positive') + } +} +``` + +使用if、else if、else条件语句: + +``` +Column() { + if (this.count < 0) { + Text('count is negative') + } else if (this.count % 2 === 0) { + Divider() + Text('even') + } else { + Divider() + Text('odd') + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/04.\346\270\262\346\237\223\346\216\247\345\210\266\350\257\255\346\263\225/02.\345\276\252\347\216\257\346\270\262\346\237\223.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/04.\346\270\262\346\237\223\346\216\247\345\210\266\350\257\255\346\263\225/02.\345\276\252\347\216\257\346\270\262\346\237\223.md" new file mode 100644 index 0000000000000000000000000000000000000000..24f883290b6643399156a75f115fc13cab354952 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/04.\346\270\262\346\237\223\346\216\247\345\210\266\350\257\255\346\263\225/02.\345\276\252\347\216\257\346\270\262\346\237\223.md" @@ -0,0 +1,137 @@ +--- +title: 循环渲染 +permalink: /pages/000b0101010301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 循环渲染 + +开发框架提供**ForEach**组件来迭代数组,并为每个数组项创建相应的组件。**ForEach**定义如下: + +``` +ForEach( + arr: any[], // Array to be iterated + itemGenerator: (item: any) => void, // child component generator + keyGenerator?: (item: any) => string // (optional) Unique key generator, which is recommended. +) +``` + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 循环渲染使用ForEach从提供的数组中自动生成子组件; +>- 必须在容器组件内使用; +>- 第一个参数必须是数组:允许空数组,空数组场景下不会创建子组件。同时允许设置返回值为数组类型的函数,例如**arr.slice\(1, 3\)**,设置的函数不得改变包括数组本身在内的任何状态变量,如**Array.splice**、**Array.sort**或**Array.reverse**这些原地修改数组的函数; +>- 第二个参数用于生成子组件的lambda函数。它为给定数组项生成一个或多个子组件。单个组件和子组件列表必须括在大括号“**\{....\}**”中; +>- 可选的第三个参数是用于键值生成的匿名函数。它为给定数组项生成唯一且稳定的键值。当子项在数组中的位置更改时,子项的键值不得更改,当数组中的子项被新项替换时,被替换项的键值和新项的键值必须不同。键值生成器的功能是可选的。但是,出于性能原因,强烈建议提供,这使开发框架能够更好地识别数组更改。如单击进行数组反向时,如果没有提供键值生成器,则ForEach中的所有节点都将重建。 +>- 生成的子组件必须允许在**ForEach**的父容器组件中,允许子组件生成器函数中包含**if/else**条件渲染,同时也允许**ForEach**包含在**if/else**条件渲染语句中。 +>- 子项生成器函数的调用顺序不一定和数组中的数据项相同,在开发过程中不要假设子项生成器和键值生成器函数是否执行以及执行顺序。如下示例可能无法正常工作: +> ``` +> ForEach(anArray, item => {Text(`${++counter}. item.label`)}) +> ``` +> 正确的示例如下: +> ``` +> ForEach(anArray.map((item1, index1) => { return { i: index1 + 1, data: item1 }; }), +> item => Text(`${item.i}. item.data.label`), +> item => item.data.id.toString()) +> ``` + +## 示例 + +简单类型数组示例: + +``` +@Entry +@Component +struct MyComponent { + @State arr: number[] = [10, 20, 30] + build() { + Column() { + Button() { + Text('Reverse Array') + }.onClick(() => { + this.arr.reverse() + }) + + ForEach(this.arr, // Parameter 1: array to be iterated + (item: number) => { // Parameter 2: item generator + Text(`item value: ${item}`) + Divider() + }, + (item: number) => item.toString() // Parameter 3: unique key generator, which is optional but recommended. + ) + } + } +} +``` + +复杂类型数组示例: + +``` +class Month { + year: number + month: number + days: Array + + constructor(year, month, days) { + this.year = year; + this.month = month; + this.days = days; + } +} + +@Entry +@Component +struct Calendar1 { +// simulate with 6 months + @State calendar: Month[] = [ + new Month(2020, 1, [...Array(31).keys()]), + new Month(2020, 2, [...Array(28).keys()]), + new Month(2020, 3, [...Array(31).keys()]), + new Month(2020, 4, [...Array(30).keys()]), + new Month(2020, 5, [...Array(31).keys()]), + new Month(2020, 6, [...Array(30).keys()]), + ] + + build() { + Column() { + Button('next month') + .onClick(() => { + this.calendar.shift() + this.calendar.push({ + year: 2020, + month: 7, + days: [...Array(31) + .keys()] + }) + }) + ForEach(this.calendar, + (item: Month) => { + Text('month:' + item.month) + .fontSize(30) + .padding(20) + Grid() { + ForEach(item.days, + (day: number) => { + GridItem() { + Text((day + 1).toString()) + .fontSize(30) + } + }, + (day: number) => day.toString()) + } + .columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr') + .rowsGap(20) + }, + // field is used together with year and month as the unique ID of the month. + (item: Month) => (item.year * 12 + item.month).toString()) + } + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/04.\346\270\262\346\237\223\346\216\247\345\210\266\350\257\255\346\263\225/03.\346\225\260\346\215\256\346\207\222\345\212\240\350\275\275.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/04.\346\270\262\346\237\223\346\216\247\345\210\266\350\257\255\346\263\225/03.\346\225\260\346\215\256\346\207\222\345\212\240\350\275\275.md" new file mode 100644 index 0000000000000000000000000000000000000000..a7a543590e3d6cff2404d54657ab80fd3280b504 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/04.\346\270\262\346\237\223\346\216\247\345\210\266\350\257\255\346\263\225/03.\346\225\260\346\215\256\346\207\222\345\212\240\350\275\275.md" @@ -0,0 +1,157 @@ +--- +title: 数据懒加载 +permalink: /pages/000b0101010302 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 数据懒加载 + +开发框架提供**LazyForEach**组件按需迭代数据,并在每次迭代过程中创建相应的组件。**LazyForEach**定义如下: + +``` +interface DataChangeListener { + onDataReloaded(): void; // Called while data reloaded + onDataAdded(index: number): void; // Called while single data added + onDataMoved(from: number, to: number): void; // Called while single data moved + onDataDeleted(index: number): void; // Called while single data deleted + onDataChanged(index: number): void; // Called while single data changed +} +interface IDataSource { + totalCount(): number; // Get total count of data + getData(index: number): any; // Get single data by index + registerDataChangeListener(listener: DataChangeListener): void; // Register listener to listening data changes + unregisterDataChangeListener(listener: DataChangeListener): void; // Unregister listener +} +LazyForEach( + dataSource: IDataSource, // Data source to be iterated + itemGenerator: (item: any) => void, // child component generator + keyGenerator?: (item: any) => string // (optional) Unique key generator, which is recommended. +): void +``` + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 通过LazyForEach的onDataChanged更新数据时,如果itemGenerator里面包含一个全静态(此view中不包含状态变量)的view,此view将不会更新 +>- 数据懒加载组件使用LazyForEach从提供的数据源中自动生成子组件; +>- 必须在容器组件内使用,且仅有List、Grid以及Swiper组件支持数据的按需加载(即只加载可视部分以及其前后少量数据用于缓冲),其他组件仍然是一次加载所有数据; +>- 第一个参数必须是继承自IDataSource的对象,需要开发者实现相关接口; +>- 第二个参数用于生成子组件的lambda函数。它为给定数组项生成一个或多个子组件。单个组件和子组件列表必须括在大括号“**\{....\}**”中; +>- 可选的第三个参数是用于键值生成的匿名函数。它为给定数组项生成唯一且稳定的键值。当子项在数组中的位置更改时,子项的键值不得更改,当数组中的子项被新项替换时,被替换项的键值和新项的键值必须不同。键值生成器的功能是可选的。但是,出于性能原因,强烈建议提供,这使开发框架能够更好地识别数组更改。如单击进行数组反向时,如果没有提供键值生成器,则ForEach中的所有节点都将重建。 +>- 生成的子组件必须允许在**LazyForEach**的父容器组件中,允许**LazyForEach**包含在**if/else**条件渲染语句中。 +>- **LazyForEach**在每次迭代中,必须创建一个且只允许创建一个子组件。 +>- **ForEach**不允许作为**LazyForEach**的子组件,**LazyForEach**也不支持嵌套。 +>- **LazyForEach**中不允许出现**if/else**条件渲染语句。 +>- 子项生成器函数的调用顺序不一定和数据源中的数据项相同,在开发过程中不要假设子项生成器和键值生成器函数是否执行以及执行顺序。如下示例可能无法正常工作: +> ``` +> ForEach(dataSource, item => {Text(`${++counter}. item.label`)}) +> ``` +> 正确的示例如下: +> ``` +> ForEach(dataSource, +> item => Text(`${item.i}. item.data.label`)), +> item => item.data.id.toString()) +> ``` + +## 示例 + +``` +// Basic implementation of IDataSource to handle data listener +class BasicDataSource implements IDataSource { + private listeners: DataChangeListener[] = [] + + public totalCount(): number { + return 0 + } + public getData(index: number): any { + return undefined + } + + registerDataChangeListener(listener: DataChangeListener): void { + if (this.listeners.indexOf(listener) < 0) { + console.info('add listener') + this.listeners.push(listener) + } + } + unregisterDataChangeListener(listener: DataChangeListener): void { + const pos = this.listeners.indexOf(listener); + if (pos >= 0) { + console.info('remove listener') + this.listeners.splice(pos, 1) + } + } + + notifyDataReload(): void { + this.listeners.forEach(listener => { + listener.onDataReloaded() + }) + } + notifyDataAdd(index: number): void { + this.listeners.forEach(listener => { + listener.onDataAdded(index) + }) + } + notifyDataChange(index: number): void { + this.listeners.forEach(listener => { + listener.onDataChanged(index) + }) + } + notifyDataDelete(index: number): void { + this.listeners.forEach(listener => { + listener.onDataDeleted(index) + }) + } + notifyDataMove(from: number, to: number): void { + this.listeners.forEach(listener => { + listener.onDataMoved(from, to) + }) + } +} + +class MyDataSource extends BasicDataSource { + private dataArray: string[] = ['/path/image0', '/path/image1', '/path/image2', '/path/image3'] + + public totalCount(): number { + return this.dataArray.length + } + public getData(index: number): any { + return this.dataArray[index] + } + + public addData(index: number, data: string): void { + this.dataArray.splice(index, 0, data) + this.notifyDataAdd(index) + } + public pushData(data: string): void { + this.dataArray.push(data) + this.notifyDataAdd(this.dataArray.length - 1) + } +} + +@Entry +@Component +struct MyComponent { + private data: MyDataSource = new MyDataSource() + build() { + List({space: 3}) { + LazyForEach(this.data, (item: string) => { + ListItem() { + Row() { + Image(item).width("30%").height(50) + Text(item).fontSize(20).margin({left:10}) + }.margin({left: 10, right: 10}) + } + .onClick(()=>{ + this.data.pushData('/path/image' + this.data.totalCount()) + }) + }, item => item) + } + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/01.build\345\207\275\346\225\260.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/01.build\345\207\275\346\225\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..6538406ae1e1ab2b9cd07087ef769687ed667c0e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/01.build\345\207\275\346\225\260.md" @@ -0,0 +1,23 @@ +--- +title: build函数 +permalink: /pages/000b0101010400 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# build函数 + +**build**函数满足**Builder**构造器接口定义,用于定义组件的声明式UI描述。 + +``` +interface Builder { + build: () => void +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/02.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\210\235\345\247\213\345\214\226.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/02.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\210\235\345\247\213\345\214\226.md" new file mode 100644 index 0000000000000000000000000000000000000000..283a11f70b7f279b60f1797e084befb1c3649c34 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/02.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\210\235\345\247\213\345\214\226.md" @@ -0,0 +1,250 @@ +--- +title: 自定义组件初始化 +permalink: /pages/000b0101010401 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 自定义组件初始化 + +本节介绍自定义组件状态变量的初始化规则。 + +组件的成员变量可以通过两种方式初始化: + +- 本地初始化,例如: + + ``` + @State counter: Counterr = new Counter() + ``` + +- 在构造组件时通过构造参数初始化,例如: + + ``` + MyComponent(counter: $myCounter) + ``` + + +具体允许哪种方式取决于状态变量的装饰器: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

装饰器类型

+

本地初始化

+

通过构造函数参数初始化

+

@State

+

必须

+

可选

+

@Prop

+

禁止

+

必须

+

@Link

+

禁止

+

必须

+

@StorageLink

+

必须

+

禁止

+

@StorageProp

+

必须

+

禁止

+

@Provide

+

必须

+

可选

+

@Consume

+

禁止

+

禁止

+

@ObjectLink

+

禁止

+

必须

+

常规成员变量

+

推荐

+

可选

+
+ +从上表中: + +- **@State**变量需要本地初始化,初始化的值可以被构造参数覆盖; +- **@Prop**和**@Link**变量必须且仅通过构造函数参数进行初始化。 + +通过构造函数方法初始化成员变量,需要遵循如下规则: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

从父组件中的变量(下)到子组件中的变量(右)

+

@state

+

@Link

+

@Prop

+

常规变量

+

@State

+

允许

+

允许

+

允许

+

允许

+

@Link

+

不允许

+

允许

+

不推荐

+

允许

+

@Prop

+

不允许

+

不允许

+

允许

+

允许

+

@StorageLink

+

不允许

+

允许

+

不允许

+

允许

+

@StorageProp

+

不允许

+

不允许

+

不允许

+

允许

+

常规变量

+

允许

+

不允许

+

不允许

+

允许

+
+ +从上表中: + +- 父组件的常规变量可以用于初始化子组件的**@State**变量,但不能用于初始化**@Link**或**@Prop**变量; +- 父组件的**@State**变量可以初始化子组件的**@Prop**、**@Link(通过$)**或常规变量,但不能初始化子组件的**@State**变量; +- 父组件的**@Link**变量可以初始化子组件的@Link或常规变量。但是初始化子组件的**@State**成员是语法错误,此外不建议初始化**@prop;** +- 父组件的**@Prop**变量可以初始化子组件的常规变量或**@Prop**变量,但不能初始化子组件的**@State**或**@Link**变量。 +- @StorageLink和@StorageProp不允许由父组件中传递到子组件。 +- 除了上述规则外,还需要遵循TS的强类型规则。 + +## 示例 + +``` +@Entry +@Component +struct Parent { + @State parentState: ClassA = new ClassA() + build() { + Row() { + CompA({aState: new ClassA, aLink: $parentState}) // valid + CompA({aLink: $parentState}) // valid + CompA() // invalid, @Link aLink remains uninitialized + CompA({aLink: new ClassA}) // invalid, @Link aLink must be a reference ($) to either @State or @Link variable + } + } +} + +@Component +struct CompA { + @State aState: boolean = false // must initialize locally + @Link aLink: ClassA // must not initialize locally + + build() { + Row() { + CompB({bLink: $aLink, // valid init a @Link with reference of another @Link, + bProp: this.aState}) // valid init a @Prop with value of a @State + CompB({aLink: $aState, // invalid: type missmatch expected ref to ClassA, provided reference to boolean + bProp: false}) // valid init a @Prop by constants value + } + } +} + +@Component +struct CompB { + @Link bLink: ClassA = new ClassA() // invalid, must not initialize locally + @Prop bProp: boolean = false // invalid must not initialize locally + + build() { + ... + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\347\224\237\345\221\275\345\221\250\346\234\237\345\233\236\350\260\203\345\207\275\346\225\260.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\347\224\237\345\221\275\345\221\250\346\234\237\345\233\236\350\260\203\345\207\275\346\225\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..33ba84e142c11b8c5c85e29feedcbc7894de3448 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\347\224\237\345\221\275\345\221\250\346\234\237\345\233\236\350\260\203\345\207\275\346\225\260.md" @@ -0,0 +1,93 @@ +--- +title: 自定义组件生命周期回调函数 +permalink: /pages/000b0101010402 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 自定义组件生命周期回调函数 + +自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。 + +## 生命周期回调函数定义 + + + + + + + + + + + + + + + + + + + + + + +

函数名

+

描述

+

aboutToAppear

+

函数在创建自定义组件的新实例后,在执行其build函数之前执行。

+

允许在aboutToAppear函数中改变状态变量,这些更改将在后续执行build函数中生效。

+

aboutToDisappear

+

函数在自定义组件析构消耗之前执行。

+

不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

+

onPageShow

+

当此页面显示时触发一次。包括路由过程、应用进入前后台等场景,仅@Entry修饰的自定义组件生效。

+

onPageHide

+

当此页面消失时触发一次。包括路由过程、应用进入前后台等场景,仅@Entry修饰的自定义组件生效。

+

onBackPress

+

当用户点击返回按钮时触发,,仅@Entry修饰的自定义组件生效。

+
  • 返回true表示页面自己处理返回逻辑, 不进行页面路由。
  • 返回false表示使用默认的返回逻辑。
  • 不返回值会作为false处理。
+
+ +## 示例 + +``` +@Component +struct CountDownTimerComponent { + @State countDownFrom: number = 10 + private timerId: number = -1 + + private aboutToAppear(): void { + this.timerId = setInterval(() => { + if (this.countDownFrom <= 1) { + clearTimeout(this.timerId) + } + this.countDownFrom -= 1 + }, 1000) // decr counter by 1 every second + } + + private aboutToDisappear(): void { + if (this.timerId > 0) { + clearTimeout(this.timerId) + this.timerId = -1 + } + } + + build() { + Text(`${this.countDownFrom} sec left`) + } +} +``` + +上述示例表明,生命周期函数对于允许CountDownTimerComponent管理其计时器资源至关重要,类似的函数也包括异步从网络请求加载资源。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 允许在生命周期函数中使用**Promise**和异步回调函数,比如网络资源获取,定时器设置等; +>- 不允许在生命周期函数中使用**async await**。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/04.\347\273\204\344\273\266\345\210\233\345\273\272\345\222\214\351\207\215\346\226\260\345\210\235\345\247\213\345\214\226\347\244\272\344\276\213.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/04.\347\273\204\344\273\266\345\210\233\345\273\272\345\222\214\351\207\215\346\226\260\345\210\235\345\247\213\345\214\226\347\244\272\344\276\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..cd02db33a3844663e94182418e588b0bf01caca1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/05.\346\267\261\345\205\245\347\220\206\350\247\243\347\273\204\344\273\266\345\214\226/04.\347\273\204\344\273\266\345\210\233\345\273\272\345\222\214\351\207\215\346\226\260\345\210\235\345\247\213\345\214\226\347\244\272\344\276\213.md" @@ -0,0 +1,103 @@ +--- +title: 组件创建和重新初始化示例 +permalink: /pages/000b0101010403 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 组件创建和重新初始化示例 + +``` +@Entry +@Component +struct ParentComp { + @State isCountDown: boolean = true + build() { + Column() { + Text(this.isCountDown ? 'Count Down' : 'Stopwatch') + if (this.isCountDown) { + Image('countdown.png') + TimerComponent({counter: 10, changePerSec: -1, showInColor: Color.Red}) + } else { + Image('stopwatch.png') + TimerComponent({counter: 0, changePerSec: +1, showInColor: Color.Black }) + } + Button(this.isCountDown ? 'Swtich to Stopwatch' : 'Switch to Count Down') + .onClick(() => {this.isCountDown = !this.isCountDown}) + } + } +} + +// Manage and display a count down / stop watch timer +@Component +struct TimerComponent { + @State counter: number = 0 + private changePerSec: number = -1 + private showInColor: Color = Color.Black + private timerId : number = -1 + + build() { + Text(`${this.counter}sec`) + .fontColor(this.showInColor) + } + + aboutToAppear() { + this.timerId = setInterval(() => {this.counter += this.changePerSec}, 1000) + } + + aboutToDisappear() { + if (this.timerId > 0) { + clearTimeout(this.timerId) + this.timerId = -1 + } + } +} +``` + +## 初始创建和渲染 + +1. 创建父组件**ParentComp**; +2. 本地初始化**ParentComp**的状态变量**isCountDown**; +3. 执行**ParentComp**的**build**函数; +4. 创建**Column**内置组件; + 1. 创建**Text**内置组件,设置其文本展示内容,并将**Text**组件实例添加到**Column**中; + 2. 判断if条件,创建**true**分支上的组件; + 1. 创建**Image**内置组件,并设置其图片源地址; + 2. 使用给定的构造函数创建**TimerComponent**; + 1. 创建**TimerComponent**对象; + 2. 本地初始化成员变量初始值; + 3. 使用**TimerComponent**构造函数提供的参数更新成员变量的值; + 4. 执行**TimerComponent**的**aboutToAppear**函数; + 5. 执行**TimerComponent**的**build**函数,创建相应的UI描述结构; + + 3. 创建**Button**内置组件,设置相应的内容。 + + +## 状态更新 + +用户单击按钮时: + +1. **ParentComp**的**isCountDown**状态变量的值更改为false; +2. 执行**ParentComp**的**build**函数; +3. **Column**内置组件会被框架重用并执行重新初始化; +4. **Column**的子组件会重用内存中的对象,但会进行重新初始化; + 1. **Text**内置组件会被重用,但使用新的文本内容进行重新初始化; + 2. 判断if条件,使用false分支上的组件; + 1. 原来true分支上的组件不在使用,这些组件会进行销毁; + 1. 创建的**Image**内置组件实例进行销毁; + 2. **TimerComponent**组件实例进行销毁,**aboutToDisappear**函数被调用; + + 2. 创建false分支上的组件; + 1. 创建**Image**内置组件,并设置其图片源地址; + 2. 使用给定的构造函数重新创建**TimerComponent**; + 3. 新创建的**TimerComponent**进行初始化,并调用**aboutToAppear**函数和**build**函数。 + + 3. **Button**内置组件会被重用,但使用新的图片源地址。 + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/01.\350\243\205\351\245\260\345\231\250.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/01.\350\243\205\351\245\260\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..f3880e69c79b13f06f1d635a62e00cea2011737e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/01.\350\243\205\351\245\260\345\231\250.md" @@ -0,0 +1,93 @@ +--- +title: 装饰器 +permalink: /pages/000b0101010500 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 装饰器 + +装饰器**@Decorator**,被装饰的元素可以是变量声明,类定义,结构体定义,方法定义等,赋予其特殊的含义。 + +多个装饰器实现可以叠加到目标元素,书写在同一行上或者在多行上,推荐书写在多行上。 + +如下**@Component**和**@State**的使用,被**@Component**装饰的元素具备了组件化的含义,使用**@State**装饰的变量具备了状态数据的含义: + +``` +@Component +struct MyComponent { + @State count: number = 0 +} +``` + +装饰器可以书写在同一行上: + +``` +@Entry @Component struct MyComponent { +} +``` + +但更推荐书写在多行上: + +``` +@Entry +@Component +struct MyComponent { +} +``` + +## 支持的装饰器列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

装饰器

+

装饰内容

+

说明

+

@Component

+

struct

+

结构体在装饰后具有基于组件的能力,需要实现build方法来更新UI。

+

@Entry

+

struct

+

组件被装饰后作为页面的入口,页面加载时将被渲染显示。

+

@State

+

基本数据类型,类,数组

+

修饰的状态数据被修改时会触发组件的build方法进行UI界面更新。

+

@Prop

+

基本数据类型

+

修改后的状态数据用于在父组件和子组件之间建立单向数据依赖关系。修改父组件关联数据时,更新当前组件的UI。

+

@Link

+

基本数据类型,类,数组

+

父子组件之间的双向数据绑定。父组件的内部状态数据作为数据源。任何一方所做的修改都会反映给另一方。

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/02.\351\223\276\345\274\217\350\260\203\347\224\250.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/02.\351\223\276\345\274\217\350\260\203\347\224\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..54de94676e038835c12f7aa02aac6373d757f762 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/02.\351\223\276\345\274\217\350\260\203\347\224\250.md" @@ -0,0 +1,26 @@ +--- +title: 链式调用 +permalink: /pages/000b0101010501 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 链式调用 + +允许开发者以“.”链式调用的方式配置UI结构及其属性、事件等。 + +``` +Column() { + Image('1.jpg') + .alt('error.jpg') + .width(100) + .height(100) +}.padding(10) +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/03.struct\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/03.struct\345\257\271\350\261\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..c4751e579664cef45f047147a6686b344453d6c1 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/03.struct\345\257\271\350\261\241.md" @@ -0,0 +1,27 @@ +--- +title: struct对象 +permalink: /pages/000b0101010502 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# struct对象 + +组件可以基于**struct**实现,组件不能有继承关系,**struct**可以比**class**更加快速的创建和销毁。 + +``` +@Component +struct MyComponent { + @State data: string = '' + + build() { + } +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/04.\345\234\250\345\256\236\344\276\213\345\214\226\350\277\207\347\250\213\344\270\255\347\234\201\347\225\245\"new\".md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/04.\345\234\250\345\256\236\344\276\213\345\214\226\350\277\207\347\250\213\344\270\255\347\234\201\347\225\245\"new\".md" new file mode 100644 index 0000000000000000000000000000000000000000..a7b6bd0c4e87051d51ead22f92bc17cbf6a4cb70 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/04.\345\234\250\345\256\236\344\276\213\345\214\226\350\277\207\347\250\213\344\270\255\347\234\201\347\225\245\"new\".md" @@ -0,0 +1,36 @@ +--- +title: 在实例化过程中省略\new\ +permalink: /pages/000b0101010503 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 在实例化过程中省略"new" + +对于**struct**的实例化,可以省略**new**。 + +``` +// 定义 +@Component +struct MyComponent { + build() { + } +} + +// 使用 +Column() { + MyComponent() +} + +// 等价于 +new Column() { + new MyComponent() +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/05.\347\273\204\344\273\266\345\210\233\345\273\272\344\275\277\347\224\250\347\213\254\347\253\213\344\270\200\350\241\214.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/05.\347\273\204\344\273\266\345\210\233\345\273\272\344\275\277\347\224\250\347\213\254\347\253\213\344\270\200\350\241\214.md" new file mode 100644 index 0000000000000000000000000000000000000000..55e3b656893108b5bb2f4842099470a8aa8e6400 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/05.\347\273\204\344\273\266\345\210\233\345\273\272\344\275\277\347\224\250\347\213\254\347\253\213\344\270\200\350\241\214.md" @@ -0,0 +1,63 @@ +--- +title: 组件创建使用独立一行 +permalink: /pages/000b0101010504 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 组件创建使用独立一行 + +**每行代码末尾可以省略分号";"** + +``` +Column() { + Image('icon.png') + Text('text') +} +``` + +等同于: + +``` +Column() { + Image('icon.png'); + Text('text'); +} +``` + +**每行只允许创建一个组件。if, else, else if, ForEach语句单独一行。** + +无效示例: + +``` +Column() { + Image('icon.png') Text('text') // invalid, creation of two components in same line +} + +if (this.condi) {Image('icon.png')} // invalid, if and creation a components in same line +``` + +**内置容器组件、if和ForEach项生成器函数必须在单个子项的情况下使用封闭括号"\{\}"。** + +无效示例: + +``` +if (this.condi) +Image('icon.png'), // invalid, missing {} +else + Text('text'); +``` + +``` +ForEach(this.arr, + (item) => Image('icon.png'), // invalid, missing {} + (item) => item.id.toString() +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/06.\347\224\237\346\210\220\345\231\250\345\207\275\346\225\260\345\206\205\344\275\277\347\224\250TS\350\257\255\350\250\200\347\232\204\351\231\220\345\210\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/06.\347\224\237\346\210\220\345\231\250\345\207\275\346\225\260\345\206\205\344\275\277\347\224\250TS\350\257\255\350\250\200\347\232\204\351\231\220\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..45b1207f5127224a44f27f4ff6f872ee21a9e33d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/02.\345\243\260\346\230\216\345\274\217\350\257\255\346\263\225/06.\350\257\255\346\263\225\347\263\226/06.\347\224\237\346\210\220\345\231\250\345\207\275\346\225\260\345\206\205\344\275\277\347\224\250TS\350\257\255\350\250\200\347\232\204\351\231\220\345\210\266.md" @@ -0,0 +1,39 @@ +--- +title: 生成器函数内使用TS语言的限制 +permalink: /pages/000b0101010505 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 生成器函数内使用TS语言的限制 + +TS语言的使用在生成器函数中存在一定的限制: + +- 表达式仅允许在字符串\($\{expression\}\)、if条件、ForEach的参数和组件的参数中使用; +- 这些表达式中的任何一个都不能导致任何应用程序状态变量(@State、@Link、@Prop)的改变,否则会导致未定义和潜在不稳定的框架行为; +- 允许在生成器函数体的第一行使用console.log,以便开发人员更容易跟踪组件重新渲染。对日志字符串文字中表达式仍遵循上述限制。 +- 生成器函数内部不能有局部变量。 + +上述限制都不适用于事件处理函数(例如**onClick**)的匿名函数实现,它们也不适用于UI组件描述外的其余部分。 + +非法示例: + +``` +build() { + let a: number = 1 // invalid: variable declaration not allowed + console.log(`a: ${a}`) // invalid: console.log only allowed in first line of build + Column() { + Text('Hello ${this.myName.toUpperCase()}') // ok. + ForEach(this.arr.reverse(), ..., ...) // invalid: Array.reverse modifies the @State array varible in place + } + buildSpecial() // invalid: no function calls + Text(this.calcTextValue()) // this function call is ok. +} +``` + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/01.\347\202\271\345\207\273\344\272\213\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/01.\347\202\271\345\207\273\344\272\213\344\273\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..009a991f94bea3630ad8565d4df83449e86213fa --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/01.\347\202\271\345\207\273\344\272\213\344\273\266.md" @@ -0,0 +1,106 @@ +--- +title: 点击事件 +permalink: /pages/000b010102000000 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 点击事件 + + + + + + + + + + + + +

名称

+

支持冒泡

+

功能描述

+

onClick(callback: (event?: ClickEvent) => void)

+

+

点击动作触发该方法调用,event参数见ClickEvent介绍。

+
+ +- ClickEvent对象说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性名称

+

属性类型

+

描述

+

screenX

+

number

+

点击点相对于设备屏幕左边沿的X坐标。

+

screenY

+

number

+

点击点相对于设备屏幕上边沿的Y坐标。

+

x

+

number

+

点击点相对于被点击元素左边沿的X坐标。

+

y

+

number

+

点击点相对于被点击元素上边沿的Y坐标。

+

timestamp

+

number

+

事件时间戳。

+
+ + +## 示例 + +``` +@Entry +@Component +struct ClickExample { + @State text: string = '' + + build() { + Column() { + Button('Click').backgroundColor(0x2788D9) + .onClick((event: ClickEvent) => { + console.info(this.text = 'Button clicked!\n X:' + event.x + '\n' + ' Y:' + event.y) + }) + Text(this.text).padding(15) + }.height(300).width('100%').padding(35) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Click.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/02.\350\247\246\346\221\270\344\272\213\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/02.\350\247\246\346\221\270\344\272\213\344\273\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..5f4667b6569fb160cf30038bc8ae6e4a005a1589 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/02.\350\247\246\346\221\270\344\272\213\344\273\266.md" @@ -0,0 +1,219 @@ +--- +title: 触摸事件 +permalink: /pages/000b010102000001 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 触摸事件 + + + + + + + + + + + + +

名称

+

是否冒泡

+

功能描述

+

onTouch(callback: (event?: TouchEvent) => void)

+

+

触摸动作触发该方法调用,event参数见TouchEvent介绍。

+
+ +## TouchEvent对象说明 + +- 属性 + + + + + + + + + + + + + + + + + + + + + + + + +

属性名称

+

属性类型

+

描述

+

type

+

TouchType

+

触摸事件的类型。

+

touches

+

Array<TouchObject>

+

全部手指信息。

+

changedTouches

+

Array<TouchObject>

+

当前发生变化的手指信息。

+

timestamp

+

number

+

事件时间戳。

+
+ + +- 接口 + + + + + + + + + + +

接口名称

+

功能描述

+

stopPropagation():void

+

阻塞事件冒泡。

+
+ + +- TouchObject对象说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性名称

+

属性类型

+

描述

+

type

+

TouchType

+

触摸事件的类型。

+

id

+

number

+

手指唯一标识符。

+

screenX

+

number

+

触摸点相对于设备屏幕左边沿的X坐标。

+

screenY

+

number

+

触摸点相对于设备屏幕上边沿的Y坐标。

+

x

+

number

+

触摸点相对于被触摸元素左边沿的X坐标。

+

y

+

number

+

触摸点相对于被触摸元素上边沿的Y坐标。

+
+ + +- TouchType枚举说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Down

+

手指按下时触发。

+

Up

+

手指抬起时触发。

+

Move

+

手指按压态在屏幕上移动时触发。

+

Cancel

+

触摸事件取消时触发。

+
+ + +## 示例 + +``` +@Entry +@Component +struct TouchExample { + @State text: string = '' + @State eventType: string = '' + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Button('Touch').backgroundColor(0x2788D9) + .onTouch((event: TouchEvent) => { + if (event.type === TouchType.Down) { + this.eventType = 'Down' + } + if (event.type === TouchType.Up) { + this.eventType = 'Up' + } + if (event.type === TouchType.Move) { + this.eventType = 'Move' + } + console.info(this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: ' + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y) + }) + Text(this.text) + }.height(200).width(350).padding({ left: 35, right: 35, top: 35 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Touch.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/03.\346\214\202\350\275\275\345\215\270\350\275\275\344\272\213\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/03.\346\214\202\350\275\275\345\215\270\350\275\275\344\272\213\344\273\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..3631abd14ccb8eda1c7679829965c31040cfaad4 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/03.\346\214\202\350\275\275\345\215\270\350\275\275\344\272\213\344\273\266.md" @@ -0,0 +1,77 @@ +--- +title: 挂载卸载事件 +permalink: /pages/000b010102000002 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:39 +--- +# 挂载卸载事件 + + + + + + + + + + + + + + + + +

名称

+

支持冒泡

+

功能描述

+

onAppear(callback: () => void)

+

+

组件挂载显示时触发此回调。

+

onDisappear(callback: () => void)

+

+

组件卸载消失时触发此回调。

+
+ +## 示例 + +``` +import prompt from '@system.prompt' + +@Entry +@Component +struct AppearExample { + @State isShow: boolean = true + private myText: string = 'Text for onAppear' + private changeAppear: string = 'Hide Text' + + build() { + Column() { + Button(this.changeAppear) + .onClick(() => { + this.isShow = !this.isShow + }).margin(3).backgroundColor(0x2788D9) + if (this.isShow) { + Text(this.myText) + .onAppear(() => { + this.changeAppear = 'Show Text' + prompt.showToast({ message: 'The text is shown', duration: 2000 }) + }) + .onDisAppear(() => { + this.changeAppear = 'Hide Text' + prompt.showToast({ message: 'The text is hidden', duration: 2000 }) + }) + } + }.padding(30).width('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/appear.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/04.\346\214\211\351\224\256\344\272\213\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/04.\346\214\211\351\224\256\344\272\213\344\273\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..f463e47c5711ffaf4e53b8dd49405ed0987418eb --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\351\200\232\347\224\250\344\272\213\344\273\266/04.\346\214\211\351\224\256\344\272\213\344\273\266.md" @@ -0,0 +1,255 @@ +--- +title: 按键事件 +permalink: /pages/000b010102000003 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 按键事件 + + + + + + + + + + + + +

名称

+

支持冒泡

+

功能描述

+

onKeyEvent(event: (event?: KeyEvent) => void)

+

+

按键动作触发该方法调用,event参数见KeyEvent介绍。

+
+ +## KeyEvent对象说明 + +- 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性名称

+

属性类型

+

描述

+

type

+

KeyType

+

按键的类型。

+

keyCode

+

number

+

按键的键码。

+

keyText

+

string

+

按键的键值。

+

keySource

+

KeySource

+

触发当前按键的输入设备类型。

+

deviceId

+

number

+

触发当前按键的输入设备ID。

+

metaKey

+

number

+

按键发生时元键的状态,1表示按压态,0表示未按压态。

+

timestamp

+

number

+

按键发生时的时间戳。

+
+ + +- 接口 + + + + + + + + + + +

接口名称

+

功能描述

+

stopPropagation(): void

+

阻塞事件冒泡传递。

+
+ +- KeyType枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Down

+

按键按下。

+

Up

+

按键松开。

+
+ + +- KeySource枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Unknown

+

输入设备类型未知。

+

Keyboard

+

输入设备类型为键盘。

+
+ +- 常用KeyCode说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

数值

+

行为

+

物理按键

+

19

+

+

向上方向键。

+

20

+

+

向下方向键。

+

21

+

+

向左方向键。

+

22

+

+

向右方向键。

+

23

+

确定

+

遥控器的确认键。

+

66

+

确定

+

键盘的回车键。

+

160

+

确定

+

键盘的小键盘回车键。

+
+ + +## 示例 + +``` +@Entry +@Component +struct KeyEventExample { + @State text: string = '' + @State eventType: string = '' + + build() { + Column() { + Button('KeyEvent').backgroundColor(0x2788D9) + .onKeyEvent((event: KeyEvent) => { + if (event.type === KeyType.Down) { + this.eventType = 'Down' + } + if (event.type === KeyType.Up) { + this.eventType = 'Up' + } + console.info(this.text = 'KeyType:' + this.eventType + '\nkeyCode:' + event.keyCode + '\nkeyText:' + event.keyText) + }) + Text(this.text).padding(15) + }.height(300).width('100%').padding(35) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/KeyEvent.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/01.\345\260\272\345\257\270\350\256\276\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/01.\345\260\272\345\257\270\350\256\276\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..01c2080943caa60ebd6d78269a4bd34d0cb26d1d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/01.\345\260\272\345\257\270\350\256\276\347\275\256.md" @@ -0,0 +1,160 @@ +--- +title: 尺寸设置 +permalink: /pages/000b010102000100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 尺寸设置 + +设置组件尺寸相关信息。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数说明

+

默认值

+

描述

+

width

+

Length

+

-

+

设置组件自身的宽度,缺省时使用元素自身内容需要的宽度。

+

height

+

Length

+

-

+

设置组件自身的高度,缺省时使用元素自身内容需要的高度。

+

size

+

{

+

width?: Length,

+

height?: Length

+

}

+

-

+

设置高宽尺寸。

+

padding

+

{

+

top?: Length,

+

right?: Length,

+

bottom?: Length,

+

left?: Length

+

} | Length

+

0

+

设置内边距属性。

+

参数为Length类型时,四个方向内边距同时生效。

+

margin

+

{

+

top?: Length,

+

right?: Length,

+

bottom?: Length,

+

left?: Length

+

}

+

| Length

+

0

+

设置外边距属性。

+

参数为Length类型时,四个方向外边距同时生效。

+

constraintSize

+

{

+

minWidth?: Length,

+

maxWidth?: Length,

+

minHeight?: Length,

+

maxHeight?: Lenght

+

}

+

{

+

minWidth: 0,

+

maxWidth: Infinity,

+

minHeight: 0,

+

maxHeight: Infinity

+

}

+

设置约束尺寸,组件布局时,进行尺寸范围限制。

+

layoutWeight

+

number

+

0

+

容器尺寸确定时,元素与兄弟节点主轴布局尺寸按照权重进行分配,忽略本身尺寸设置。

+
说明:

仅在Row/Column/Flex布局中生效。

+
+
+ +## 示例 + +``` +@Entry +@Component +struct SizeExample { + build() { + Column({ space: 10 }) { + Text('margin and padding:').fontSize(12).fontColor(0xCCCCCC).width('90%') + // 宽度80 ,高度80 ,内外边距20 + Row() { + Row() { + Row().size({ width: '100%', height: '100%' }).backgroundColor(0xAFEEEE) + }.width(80).height(80).padding(20).margin(20).backgroundColor(0xFDF5E6) + }.backgroundColor(0xFFA500) + + Text('layoutWeight').fontSize(12).fontColor(0xCCCCCC).width('90%') + // 容器尺寸确定时,元素与兄弟节点主轴布局尺寸按照权重进行分配,忽略本身尺寸设置。 + Row() { + // 权重1 + Text('layoutWeight(1)') + .size({ width: '30%', height: 110 }).backgroundColor(0xFFEFD5).textAlign(TextAlign.Center) + .layoutWeight(1) + // 权重0 + Text('layoutWeight(2)') + .size({ width: '30%', height: 110 }).backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + .layoutWeight(2) + // 权重默认0 + Text('no layoutWeight') + .size({ width: '30%', height: 110 }).backgroundColor(0xD2B48C).textAlign(TextAlign.Center) + }.size({ width: '90%', height: 140 }).backgroundColor(0xAFEEEE) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/size.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/02.\344\275\215\347\275\256\350\256\276\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/02.\344\275\215\347\275\256\350\256\276\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..3230e43cbd07451c7ce121025e2c735efa3c8ad9 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/02.\344\275\215\347\275\256\350\256\276\347\275\256.md" @@ -0,0 +1,205 @@ +--- +title: 位置设置 +permalink: /pages/000b010102000101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 位置设置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

align

+

Alignment

+

Center

+

设置元素内容的对齐方式,只有当设置的width和height大小超过元素本身内容大小时生效。

+

direction

+

Direction

+

Auto

+

设置元素水平方向的布局,可选值参照Direction枚举说明。

+

position

+

{

+

x: Length,

+

y: Length

+

}

+

-

+

使用绝对定位,设置元素锚点相对于父容器顶部起点偏移位置。在布局容器中,设置该属性不影响父容器布局,仅在绘制时进行位置调整。

+

markAnchor

+

{

+

x: Length,

+

y: Length

+

}

+

{

+

x: 0,

+

y: 0

+

}

+

设置元素在位置定位时的锚点,以元素顶部起点作为基准点进行偏移。

+

offset

+

{

+

x: Length,

+

y: Length

+

}

+

{

+

x: 0,

+

y: 0

+

}

+

相对布局完成位置坐标偏移量,设置该属性,不影响父容器布局,仅在绘制时进行位置调整。

+
+ +- Direction枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Ltr

+

元素从左到右布局。

+

Rtl

+

元素从右到左布局。

+

Auto

+

使用系统默认布局方向。

+
+ + +## 示例 + +``` +@Entry +@Component +struct PositionExample { + build() { + Column() { + Column({space: 10}) { + Text('align').fontSize(9).fontColor(0xCCCCCC).width('90%') + Text('top start') + .align(Alignment.TopStart) + .height(50) + .width('90%') + .fontSize(16) + .backgroundColor(0xFFE4C4) + + Text('direction').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row() { + Text('1').height(50).width('25%').fontSize(16).backgroundColor(0xF5DEB3) + Text('2').height(50).width('25%').fontSize(16).backgroundColor(0xD2B48C) + Text('3').height(50).width('25%').fontSize(16).backgroundColor(0xF5DEB3) + Text('4').height(50).width('25%').fontSize(16).backgroundColor(0xD2B48C) + } + .width('90%') + .direction(Direction.Rtl) + } + } + .width('100%').margin({ top: 5 }).direction(Direction.Rtl) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/position.gif) + +``` +@Entry +@Component +struct PositionExample2 { + build() { + Column({ space: 20 }) { + Text('position').fontSize(12).fontColor(0xCCCCCC).width('90%') + Row({ space: 20 }) { + Text('1').size({ width: '45%', height: '50' }).backgroundColor(0xdeb887).border({ width: 1 }) .fontSize(16) + Text('2 position(25, 15)') + .size({ width: '60%', height: '30' }).backgroundColor(0xbbb2cb).border({ width: 1 }) + .fontSize(16).align(Alignment.Start) + .position({ x: 25, y: 15 }) + Text('3').size({ width: '45%', height: '50' }).backgroundColor(0xdeb887).border({ width: 1 }).fontSize(16) + Text('4 position(50%, 70%)') + .size({ width: '50%', height: '50' }).backgroundColor(0xbbb2cb).border({ width: 1 }).fontSize(16) + .position({ x: '50%', y: '70%' }) + }.width('90%').height(100).border({ width: 1, style: BorderStyle.Dashed }) + + Text('markAnchor').fontSize(12).fontColor(0xCCCCCC).width('90%') + Stack({ alignContent: Alignment.TopStart }) { + Row() + .size({ width: '100', height: '100' }) + .backgroundColor(0xdeb887) + Image($r('app.media.ic_health_heart')) + .size({ width: 25, height: 25 }) + .markAnchor({ x: 25, y: 25 }) + Image($r('app.media.ic_health_heart')) + .size({ width: 25, height: 25 }) + .markAnchor({ x: 25, y: 25 }) + .position({ x: '100%', y: '100%' }) + }.margin({ top: 25 }).border({ width: 1, style: BorderStyle.Dashed }) + + Text('offset').fontSize(12).fontColor(0xCCCCCC).width('90%') + Row() { + Text('1').size({ width: '15%', height: '50' }).backgroundColor(0xdeb887).border({ width: 1 }).fontSize(16) + Text('2\noffset(15, 15)') + .size({ width: 120, height: '50' }).backgroundColor(0xbbb2cb).border({ width: 1 }) + .fontSize(16).align(Alignment.Start) + .offset({ x: 15, y: 15 }) + Text('3').size({ width: '15%', height: '50' }).backgroundColor(0xdeb887).border({ width: 1 }).fontSize(16) + Text('4\noffset(-10%, 20%)') + .size({ width: 150, height: '50' }) .backgroundColor(0xbbb2cb).border({ width: 1 }).fontSize(16) + .offset({ x: '-10%', y: '20%' }) + }.width('90%').height(100).border({ width: 1, style: BorderStyle.Dashed }) + } + .width('100%').margin({ top: 25 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/position2.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/03.\345\270\203\345\261\200\347\272\246\346\235\237.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/03.\345\270\203\345\261\200\347\272\246\346\235\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..72d2b2ac6e1f62a9326f73359bf4f93ea3249143 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/03.\345\270\203\345\261\200\347\272\246\346\235\237.md" @@ -0,0 +1,158 @@ +--- +title: 布局约束 +permalink: /pages/000b010102000102 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 布局约束 + + + + + + + + + + + + + + + + + + + +

名称

+

参数说明

+

默认值

+

描述

+

aspectRatio

+

number

+

-

+

指定当前组件的宽高比。

+

displayPriority

+

number

+

-

+

设置当前组件在布局容器中显示的优先级,当父容器空间不足时,低优先级的组件会被隐藏。

+
说明:
  • 仅在Row/Column/Flex(单行)容器组件中生效。
+
+
+ +## 示例 + +``` +@Entry +@Component +struct AspectRatioExample { + private children : string[] = ['1', '2', '3', '4', '5', '6'] + + build() { + Column({space: 20}) { + Text('using container: row').fontSize(14).fontColor(0xCCCCCC).width('100%') + Row({space: 10}) { + ForEach(this.children, (item) => { + Text(item) + .backgroundColor(0xbbb2cb) + .fontSize(20) + .aspectRatio(1.5) + .height(60) + Text(item) + .backgroundColor(0xbbb2cb) + .fontSize(20) + .aspectRatio(1.5) + .width(60) + }, item=>item) + } + .size({width: "100%", height: 100}) + .backgroundColor(0xd2cab3) + .clip(true) + + Text('using container: grid').fontSize(14).fontColor(0xCCCCCC).width('100%') + Grid() { + ForEach(this.children, (item) => { + GridItem() { + Text(item) + .backgroundColor(0xbbb2cb) + .fontSize(40) + .aspectRatio(1.5) + } + }, item=>item) + } + .columnsTemplate('1fr 1fr 1fr') + .columnsGap(10) + .rowsGap(10) + .size({width: "100%", height: 165}) + .backgroundColor(0xd2cab3) + }.padding(10) + } +} +``` + +**图 1** 竖屏显示 +![](/images/application-dev/reference/arkui-ts/figures/竖屏显示.gif "竖屏显示") + +**图 2** 横屏显示 +![](/images/application-dev/reference/arkui-ts/figures/横屏显示.gif "横屏显示") + +``` +class ContainerInfo { + label : string = '' + size : string = '' +} + +class ChildInfo { + text : string = '' + priority : number = 0 +} + +@Entry +@Component +struct DisplayPriorityExample { + private container : ContainerInfo[] = [ + {label: 'Big container', size: '90%'}, + {label: 'Middle container', size: '50%'}, + {label: 'Small container', size: '30%'}] + private children : ChildInfo[] = [ + {text: '1\n(priority:2)', priority: 2}, + {text: '2\n(priority:1)', priority: 1}, + {text: '3\n(priority:3)', priority: 3}, + {text: '4\n(priority:1)', priority: 1}, + {text: '5\n(priority:2)', priority: 2}] + @State currentIndex : number = 0 + + build() { + Column({space: 10}) { + Button(this.container[this.currentIndex].label).backgroundColor(0x317aff) + .onClick((event: ClickEvent) => { + this.currentIndex = (this.currentIndex + 1) % this.container.length + }) + Flex({justifyContent: FlexAlign.SpaceBetween}) { + ForEach(this.children, (item)=>{ + Text(item.text) + .width(120) + .height(60) + .fontSize(24) + .textAlign(TextAlign.Center) + .backgroundColor(0xbbb2cb) + .displayPriority(item.priority) + }, item=>item.text) + } + .width(this.container[this.currentIndex].size) + .backgroundColor(0xd2cab3) + }.width("100%").margin({top:50}) + } +} + +``` + +![](/images/application-dev/reference/arkui-ts/figures/DisplayPriorityExample.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/04.Flex\345\270\203\345\261\200.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/04.Flex\345\270\203\345\261\200.md" new file mode 100644 index 0000000000000000000000000000000000000000..a13cade5daf55c18e76fc013cd78e211bede03a6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/04.Flex\345\270\203\345\261\200.md" @@ -0,0 +1,132 @@ +--- +title: Flex布局 +permalink: /pages/000b010102000103 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Flex布局 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 仅当父组件是Flex组件时生效。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数说明

+

默认值

+

描述

+

flexBasis

+

'auto' | Length

+

'auto'

+

此属性所在的组件在Flex容器中主轴方向上基准尺寸。

+

flexGrow

+

number

+

0

+

Flex容器的剩余空间分配给给此属性所在的组件的比例。

+

flexShrink

+

number

+

1

+

Flex容器压缩尺寸分配给此属性所在的组件的比例。

+

alignSelf

+

ItemAlign

+

Auto

+

覆盖Flex布局容器中alignItems默认配置。

+
+ +## 示例 + +``` +@Entry +@Component +struct FlexExample { + build() { + Column({ space: 5 }) { + Text('flexBasis').fontSize(9).fontColor(0xCCCCCC).width('90%') + // 基于主轴基准尺寸 + // flexBasis()值可以是'auto'(默认值)元素本来的大小 ,如果是数字则类似于.width()/.height() ,基于主轴 + Flex() { + Text('flexBasis(100)') + .flexBasis('100').height(100).lineHeight(70) + .backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + Text('flexBasis("auto")') + .flexBasis('auto').width('60%').height(100).lineHeight(70) + .backgroundColor(0xD2B48C).textAlign(TextAlign.Center) + }.width('90%').height(120).padding(10).backgroundColor(0xAFEEEE) + + Text('flexGrow').fontSize(9).fontColor(0xCCCCCC).width('90%') + // 剩余空间所占比例 + // flexGrow()剩余空间分配给该元素的比例 + Flex() { + Text('flexGrow(2)') + .flexGrow(2).height(100).lineHeight(70) + .backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + Text('flexGrow(1)') + .flexGrow(1).height(100).lineHeight(70) + .backgroundColor(0xD2B48C).textAlign(TextAlign.Center) + }.width('90%').height(120).padding(10).backgroundColor(0xAFEEEE) + + Text('flexShrink').fontSize(9).fontColor(0xCCCCCC).width('90%') + // flexShrink()此属性所在的组件的比例 + // text1比例是0,其他都是默认值1,放不下时直接等比例缩放后两个,第一个不缩放 + Flex({ direction: FlexDirection.Row }) { + Text('flexShrink(0)') + .flexShrink(0).width('50%').height(100).lineHeight(70) + .backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + Text('no flexShrink') + .width('40%').height(100).lineHeight(70).backgroundColor(0xD2B48C).textAlign(TextAlign.Center) + Text('flexShrink(2)') + .flexShrink(2).width('40%').height(100) .lineHeight(70) + .backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + }.width('90%').height(120).padding(10).backgroundColor(0xAFEEEE) + + Text('alignSelf').fontSize(9).fontColor(0xCCCCCC).width('90%') + // alignSelf()覆盖Flex布局容器中alignItems默认配置 + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) { + Text('no alignSelf,height:80').width('33%').height(80) + .backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + Text('alignSelf stretch') + .alignSelf(ItemAlign.Stretch).width('33%').height(80).lineHeight(70) + .backgroundColor(0xD2B48C).textAlign(TextAlign.Center) + Text('no alignSelf,height:100').width('34%').height(100) + .backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + }.width('90%').height(120).padding(10).backgroundColor(0xAFEEEE) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/flex.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/05.\350\276\271\346\241\206\350\256\276\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/05.\350\276\271\346\241\206\350\256\276\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..87fce741380ccc19b2dab0805073afa1e82a7817 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/05.\350\276\271\346\241\206\350\256\276\347\275\256.md" @@ -0,0 +1,132 @@ +--- +title: 边框设置 +permalink: /pages/000b010102000104 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 边框设置 + +设置组件边框样式。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

border

+

{

+

width?: Length,

+

color?: Color,

+

radius?: Length,

+

style?: BorderStyle

+

}

+

-

+

统一边框样式设置接口。

+

borderStyle

+

BorderStyle

+

Solid

+

设置元素的边框样式。

+

borderWidth

+

Length

+

0

+

设置元素的边框宽度。

+

borderColor

+

Color

+

-

+

设置元素的边框颜色。

+

borderRadius

+

Length

+

0

+

设置元素的边框圆角半径。

+
+ +- BorderStyle枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Dotted

+

显示为一系列圆点,圆点半径为borderWidth的一半。

+

Dashed

+

显示为一系列短的方形虚线。

+

Solid

+

显示为一条实线。

+
+ + +## 示例 + +``` +@Entry +@Component +struct BorderExample { + build() { + Flex({ justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { + // 线段 + Text('dashed') + .borderStyle(BorderStyle.Dashed).borderWidth(5).borderColor(0xAFEEEE).borderRadius(10) + .width(120).height(120).textAlign(TextAlign.Center).fontSize(16) + // 点线 + Text('dotted') + .border({ width: 5, color: 0x317AF7, radius: 10, style: BorderStyle.Dotted }) + .width(120).height(120).textAlign(TextAlign.Center).fontSize(16) + }.width('100%').height(150) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/border.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/06.\350\203\214\346\231\257\350\256\276\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/06.\350\203\214\346\231\257\350\256\276\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..35415dd9a9296b4569b89e78ab7badee9824efe6 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/06.\350\203\214\346\231\257\350\256\276\347\275\256.md" @@ -0,0 +1,174 @@ +--- +title: 背景设置 +permalink: /pages/000b010102000105 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 背景设置 + +设置组件的背景色。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

backgroundColor

+

Color

+

-

+

设置组件的背景色。

+

backgroundImage

+

src: string,

+

repeat?: ImageRepeat

+

-

+

src参数:图片地址,支持网络图片资源和本地图片资源地址(不支持svg类型的图片)。

+

repeat参数:设置背景图片的重复样式,默认不重复。

+

backgroundImageSize

+

{

+

width?: Length,

+

height?: Length

+

} | ImageSize

+

Auto

+

设置背景图像的高度和宽度。当输入为{width: Length, height: Length}对象时,如果只设置一个属性,则第二个属性保持图片原始宽高比进行调整。默认保持原图的比例不变。

+

backgroundImagePosition

+

{

+

x?: Length,

+

y?: Length

+

} | Alignment

+

{

+

x: 0,

+

y: 0

+

}

+

设置背景图在组件中显示位置。

+
+ +- ImageSize枚举说明 + + + + + + + + + + + + + + + + +

类型

+

描述

+

Cover

+

默认值,保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。

+

Contain

+

保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内。

+

Auto

+

保持原图的比例不变。

+
+ + +## 示例 + +``` +@Entry +@Component +struct BackgroundExample { + build() { + Column({ space: 5 }) { + Text('background color').fontSize(9).width('90%').fontColor(0xCCCCCC) + Row().width('90%').height(50).backgroundColor(0xE5E5E5).border({ width: 1 }) + + Text('background image repeat along X').fontSize(9).width('90%').fontColor(0xCCCCCC) + Row() + .backgroundImage('/comment/bg.jpg', ImageRepeat.X) + .backgroundImageSize({ width: '250px', height: '140px' }) + .width('90%') + .height(70) + .border({ width: 1 }) + + Text('background image repeat along Y').fontSize(9).width('90%').fontColor(0xCCCCCC) + Row() + .backgroundImage('/comment/bg.jpg', ImageRepeat.Y) + .backgroundImageSize({ width: '500px', height: '120px' }) + .width('90%') + .height(100) + .border({ width: 1 }) + + Text('background image size').fontSize(9).width('90%').fontColor(0xCCCCCC) + Row() + .width('90%').height(150) + .backgroundImage('/comment/bg.jpg', ImageRepeat.NoRepeat) + .backgroundImageSize({ width: 1000, height: 500 }) + .border({ width: 1 }) + + Text('background fill the box(Cover)').fontSize(9).width('90%').fontColor(0xCCCCCC) + // 不保准图片完整的情况下占满盒子 + Row() + .width(200) + .height(50) + .backgroundImage('/comment/bg.jpg', ImageRepeat.NoRepeat) + .backgroundImageSize(ImageSize.Cover) + .border({ width: 1 }) + + Text('background fill the box(Contain)').fontSize(9).width('90%').fontColor(0xCCCCCC) + // 保准图片完整的情况下放到最大 + Row() + .width(200) + .height(50) + .backgroundImage('/comment/bg.jpg', ImageRepeat.NoRepeat) + .backgroundImageSize(ImageSize.Contain) + .border({ width: 1 }) + + Text('background image position').fontSize(9).width('90%').fontColor(0xCCCCCC) + Row() + .width(100) + .height(50) + .backgroundImage('/comment/bg.jpg', ImageRepeat.NoRepeat) + .backgroundImageSize({ width: 1000, height: 560 }) + .backgroundImagePosition({ x: -500, y: -300 }) + .border({ width: 1 }) + } + .width('100%').height('100%').padding({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/back.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/07.\351\200\217\346\230\216\345\272\246\350\256\276\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/07.\351\200\217\346\230\216\345\272\246\350\256\276\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..9c00dc3415b434b68e17f4b1a0ef4182e548a6e8 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/07.\351\200\217\346\230\216\345\272\246\350\256\276\347\275\256.md" @@ -0,0 +1,63 @@ +--- +title: 透明度设置 +permalink: /pages/000b010102000106 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 透明度设置 + +设置组件的透明度。 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

opacity

+

number

+

1

+

元素的不透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

+
+ +## 示例 + +``` +@Entry +@Component +struct OpacityExample { + build() { + Column({ space: 5 }) { + Text('opacity(1)').fontSize(9).width('90%').fontColor(0xCCCCCC) + Text().width('90%').height(50).opacity(1).backgroundColor(0xAFEEEE) + Text('opacity(0.7)').fontSize(9).width('90%').fontColor(0xCCCCCC) + Text().width('90%').height(50).opacity(0.7).backgroundColor(0xAFEEEE) + Text('opacity(0.4)').fontSize(9).width('90%').fontColor(0xCCCCCC) + Text().width('90%').height(50).opacity(0.4).backgroundColor(0xAFEEEE) + } + .width('100%') + .padding({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/opacity.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/08.\346\230\276\351\232\220\346\216\247\345\210\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/08.\346\230\276\351\232\220\346\216\247\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..a43821e45f7240d28fd595822a19f05232ceff93 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/08.\346\230\276\351\232\220\346\216\247\345\210\266.md" @@ -0,0 +1,93 @@ +--- +title: 显隐控制 +permalink: /pages/000b010102000107 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 显隐控制 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

visibility

+

Visibility

+

Visible

+

控制当前组件显示或隐藏。

+
+ +- Visibility枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Hidden

+

隐藏,但参与布局进行占位。

+

Visible

+

显示。

+

None

+

隐藏,但不参与布局,不进行占位。

+
+ + +## 示例 + +``` +@Entry +@Component +struct VisibilityExample { + build() { + Column() { + Column() { + Text('Visible').fontSize(9).width('90%').fontColor(0xCCCCCC) + Row().visibility(Visibility.Visible).width('90%').height(80).backgroundColor(0xAFEEEE) + + Text('None').fontSize(9).width('90%').fontColor(0xCCCCCC) + // 隐藏不参与占位 + Row().visibility(Visibility.None).width('90%').height(80).backgroundColor(0xAFEEEE) + + Text('Hidden').fontSize(9).width('90%').fontColor(0xCCCCCC) + // 隐藏参与占位 + Row().visibility(Visibility.Hidden).width('90%').height(80).backgroundColor(0xAFEEEE) + }.width('90%').border({ width: 1 }) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/visibility.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/09.\347\246\201\347\224\250\346\216\247\345\210\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/09.\347\246\201\347\224\250\346\216\247\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..473d47a6e731e7885e378b68f3ed84c28e626e16 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/09.\347\246\201\347\224\250\346\216\247\345\210\266.md" @@ -0,0 +1,58 @@ +--- +title: 禁用控制 +permalink: /pages/000b010102000108 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 禁用控制 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

enabled

+

boolean

+

true

+

值为true表示组件可用,可响应点击等操作;值为false时,不响应点击等操作。

+
+ +## 示例 + +``` +@Entry +@Component +struct EnabledExample { + build() { + Flex({ justifyContent: FlexAlign.SpaceAround }) { + // 点击没有反应 + Button('disable').enabled(false).backgroundColor(0x317aff).opacity(0.4) + Button('enable').backgroundColor(0x317aff) + } + .width('100%') + .padding({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/enabled.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/10.\346\265\256\345\261\202.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/10.\346\265\256\345\261\202.md" new file mode 100644 index 0000000000000000000000000000000000000000..d9ca5fe3f7b526ac71ca35c71e50c42713499fb3 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/10.\346\265\256\345\261\202.md" @@ -0,0 +1,69 @@ +--- +title: 浮层 +permalink: /pages/000b010102000109 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 浮层 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

overlay

+

title: string,

+

options: {

+

align?: Alignment,

+

offset?: {x: number, y: number}

+

}

+

{

+

align: Alignment.Center,

+

offset: {0, 0}

+

}

+

在当前组件上,增加遮罩文本,布局与当前组件相同。

+
+ +## 示例 + +``` +@Entry +@Component +struct OverlayExample { + build() { + Column() { + Column() { + Text('floating layer') + .fontSize(12).fontColor(0xCCCCCC).maxLines(1) + Column() { + Image($r('app.media.img')) + .width(240).height(240) + .overlay("Don't walk and play with your phone.", { align: Alignment.Bottom, offset: { x: 0, y: -15 } }) + }.border({ color: Color.Black, width: 2 }) + }.width('100%') + }.padding({ top: 20 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/overlay.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/11.Z\345\272\217\346\216\247\345\210\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/11.Z\345\272\217\346\216\247\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..e8cf3abaee1f6dfd2b0daadd67a439317e48513c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/11.Z\345\272\217\346\216\247\345\210\266.md" @@ -0,0 +1,65 @@ +--- +title: Z序控制 +permalink: /pages/000b01010200010a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Z序控制 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

zIndex

+

number

+

0

+

同一容器中兄弟组件显示层级关系,z值越大,显示层级越高。

+
+ +## 示例 + +``` +@Entry +@Component +struct ZIndexExample { + build() { + Column() { + Stack() { + // stack会重叠组件, 默认后定义的在最上面 + Text('first child, zIndex(2)') + .size({width: '40%', height: '30%'}).backgroundColor(0xbbb2cb) + .zIndex(2) + // 默认值0 + Text('second child, default zIndex(0)') + .size({width: '90%', height: '80%'}).backgroundColor(0xd2cab3).align(Alignment.TopStart) + Text('third child, zIndex(1)') + .size({width: '70%', height: '50%'}).backgroundColor(0xc1cbac).align(Alignment.TopStart) + .zIndex(1) + } + }.width('100%').height(200) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/zIndex.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/12.\345\233\276\345\275\242\345\217\230\346\215\242.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/12.\345\233\276\345\275\242\345\217\230\346\215\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..65ad26b47e3db3f90a3bff97d12cfc7784573505 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/12.\345\233\276\345\275\242\345\217\230\346\215\242.md" @@ -0,0 +1,142 @@ +--- +title: 图形变换 +permalink: /pages/000b01010200010b +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 图形变换 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

rotate

+

{

+

x?: number,

+

y?: number,

+

z?: number,

+

angle?: Angle,

+

centerX?: Length,

+

centerY?: Length

+

}

+

{

+

x: 0,

+

y: 0,

+

z: 0,

+

angle: 0,

+

centerX: '50%',

+

centerY: '50%'

+

}

+

(x, y, z)指定一个矢量,表示旋转轴,正角度为顺时针转动,负角度为逆时针转动,默认值为0,同时可以通过centerX和centerY设置旋转的中心点。

+

translate

+

{

+

x?: Length,

+

y?: Length,

+

z? : Length

+

}

+

{

+

x: 0,

+

y: 0,

+

z: 0

+

}

+

可以分别设置X轴、Y轴、Z轴的平移距离,距离的正负控制平移的方向,默认值为0。

+

scale

+

{

+

x?: number,

+

y?: number,

+

z?: number,

+

centerX?: Length,

+

centerY?: Length

+

}

+

{

+

x: 1,

+

y: 1,

+

z: 1,

+

centerX:'50%',

+

centerY:'50%'

+

}

+

可以分别设置X轴、Y轴、Z轴的缩放比例,默认值为1,同时可以通过centerX和centerY设置缩放的中心点。

+

transform

+

matrix: Matrix4

+

-

+

设置当前组件的变换矩阵。

+
+ +## 示例 + +``` +import Matrix4 from '@ohos.matrix4' + +@Entry +@Component +struct TransformExample { + build() { + Column() { + Text('rotate').width('90%').fontColor(0xCCCCCC).padding(15).fontSize(30) + Row() + .rotate({ + x: 1, + y: 1, + z: 1, + centerX: '50%', + centerY: '50%', + angle: 300 + }) // 组件以(1,1,1)为旋转轴,中心点顺时针旋转 300度 + .width(100).height(100).backgroundColor(0xAFEEEE) + + Text('translate').width('90%').fontColor(0xCCCCCC).padding(10).fontSize(30) + Row() + .translate({ x: 100, y: 5 }) // x轴平移100,y轴平移5 + .width(100).height(100).backgroundColor(0xAFEEEE).margin({bottom:10}) + + Text('scale').width('90%').fontColor(0xCCCCCC).padding(15).fontSize(30) + Row() + .scale({ x: 2, y: 0.5 }) // 高度缩小一倍,宽度放大一倍,z轴在2D下无效果 + .width(100).height(100).backgroundColor(0xAFEEEE) + + Text('Matrix4').width('90%').fontColor(0xCCCCCC).padding(15).fontSize(30) + Row() + .width(100).height(100).backgroundColor(0xAFEEEE) + .transform(Matrix4.identity().translate({ x: 100, y: 100, z: 30 })) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/1111.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/13.\345\233\276\345\203\217\346\225\210\346\236\234.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/13.\345\233\276\345\203\217\346\225\210\346\236\234.md" new file mode 100644 index 0000000000000000000000000000000000000000..7f5c5dd55c03a9c80770a1fd01eb3b276ed57b8c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/13.\345\233\276\345\203\217\346\225\210\346\236\234.md" @@ -0,0 +1,171 @@ +--- +title: 图像效果 +permalink: /pages/000b01010200010c +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 图像效果 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

blur

+

number

+

-

+

为当前组件添加内容模糊效果,入参为模糊半径,模糊半径越大越模糊,为0时不模糊。

+

backdropBlur

+

number

+

-

+

为当前组件添加背景模糊效果,入参为模糊半径,模糊半径越大越模糊,为0时不模糊。

+

shadow

+

{

+

radius: number,

+

color?: Color,

+

offsetX?: number,

+

offsetY?: number

+

}

+

-

+

为当前组件添加阴影效果,入参为模糊半径(必填)、阴影的颜色(可选,默认为灰色)、X轴的偏移量(可选,默认为0),Y轴的偏移量(可选,默认为0),偏移量单位为px。

+

grayscale

+

number

+

0.0

+

为当前组件添加灰度效果。值定义为灰度转换的比例,入参1.0则完全转为灰度图像,入参则0.0图像无变化,入参在0.0和1.0之间时,效果呈线性变化。(百分比)

+

brightness

+

number

+

1.0

+

为当前组件添加高光效果,入参为高光比例,值为1时没有效果,小于1时亮度变暗,0为全黑;大于1时亮度增加,数值越大亮度越大。

+

saturate

+

number

+

1.0

+

为当前组件添加饱和度效果,饱和度为颜色中的含色成分和消色成分(灰)的比例,入参为1时,显示原图像,大于1时含色成分越大,饱和度越大;小于1时消色成分越大,饱和度越小。(百分比)

+

contrast

+

number

+

1.0

+

为当前组件添加对比度效果,入参为对比度的值,值为1时,显示原图;大于1时,值越大对比度越高,图像越清晰醒目;小于1时,值越小对比度越低;当对比度为0时,图像变为全灰。(百分比)

+

invert

+

number

+

0

+

反转输入的图像。入参为图像反转的比例。值为1时完全反转。值为0则图像无变化。(百分比)

+

sepia

+

number

+

0

+

将图像转换为深褐色。入参为图像反转的比例。值为1则完全是深褐色的,值为0图像无变化。 (百分比)

+

hueRotate

+

Angle

+

0deg

+

为当前组件添加色相旋转效果,入参为旋转的角度值。当入参为0deg时图像无变化(默认值是0deg),入参没有最大值,超过360deg的值相当于又绕一圈。

+
+ +## 示例 + +``` +@Entry +@Component +struct ImageEffectsExample { + build() { + Column({space:10}) { + // 对字体进行模糊 + Text('font blur').fontSize(15).fontColor(0xCCCCCC).width('90%') + Text('text').blur(3).width('90%').height(40) + .fontSize(16).backgroundColor(0xF9CF93).padding({ left: 5 }) + + // 对背景进行模糊 + Text('backdropBlur').fontSize(15).fontColor(0xCCCCCC).width('90%') + Text().width('90%').height(40).fontSize(16).backdropBlur(3) + .backgroundImage('/comment/bg.jpg') + .backgroundImageSize({ width: 1200, height: 160 }) + + Text('shadow').fontSize(15).fontColor(0xCCCCCC).width('90%') + Image($r('app.media.bg')).width('90%').height(40) + .shadow({ radius: 10, color: Color.Gray, offsetX: 5, offsetY: 5 }) + + Text('grayscale').fontSize(15).fontColor(0xCCCCCC).width('90%') + Image($r('app.media.bg')).width('90%').height(40).grayscale(0.6) + + Text('brightness').fontSize(15).fontColor(0xCCCCCC).width('90%') + Image($r('app.media.bg')).width('90%').height(40).brightness(2.0) + + Text('saturate').fontSize(15).fontColor(0xCCCCCC).width('90%') + Image($r('app.media.bg')).width('90%').height(40).saturate(2.0) + + Text('contrast').fontSize(15).fontColor(0xCCCCCC).width('90%') + Image($r('app.media.bg')).width('90%').height(40).contrast(2.0) + + Text('invert').fontSize(15).fontColor(0xCCCCCC).width('90%') + Image($r('app.media.bg')).width('90%').height(40).invert(1) + + Text('hueRotate').fontSize(15).fontColor(0xCCCCCC).width('90%') + Image($r('app.media.bg')).width('90%').height(40).hueRotate(90) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/2222.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/14.\345\275\242\347\212\266\350\243\201\345\211\252.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/14.\345\275\242\347\212\266\350\243\201\345\211\252.md" new file mode 100644 index 0000000000000000000000000000000000000000..765f69c52036c5e5007140f410faaf7cf979ed9b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/14.\345\275\242\347\212\266\350\243\201\345\211\252.md" @@ -0,0 +1,86 @@ +--- +title: 形状裁剪 +permalink: /pages/000b01010200010d +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 形状裁剪 + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

clip

+

Shape | boolean

+

false

+

参数为Shape类型时,按指定的形状对当前组件进行裁剪;参数为boolean类型时,设置是否按照边缘轮廓进行裁剪。

+

mask

+

Shape

+

-

+

在当前组件上加上指定形状的遮罩。

+
+ +## 示例 + +``` +@Entry +@Component +struct ClipAndMaskExample { + build() { + Column({ space: 5 }) { + Text('clip').fontSize(9).width('90%').fontColor(0xCCCCCC) + // 用一个280px直径的圆对图像进行裁剪 + Image('/comment/bg.jpg') + .clip(new Circle({ width: 80, height: 80 })) + .width('500px').height('280px') + + Row() { + Image('/comment/bg.jpg').width('500px').height('280px') + } + .clip(true) + .borderRadius(20) + + Text('mask').fontSize(9).width('90%').fontColor(0xCCCCCC) + // 给图像添加了一个500px*280px的遮罩 + Image('/comment/bg.jpg') + .mask(new Rect({ width: '500px', height: '280px' }).fill(Color.Gray)) + .width('500px').height('280px') + + // 给图像添加了一个280px*280px的圆遮罩 + Image('/comment/bg.jpg') + .mask(new Circle({ width: '280px', height: '280px' }).fill(Color.Gray)) + .width('500px').height('281px') + } + .width('100%') + .margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/clip.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/15.\346\226\207\346\234\254\346\240\267\345\274\217\350\256\276\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/15.\346\226\207\346\234\254\346\240\267\345\274\217\350\256\276\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..42425472158a74ea08db1dffc23140d8a35f742e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/15.\346\226\207\346\234\254\346\240\267\345\274\217\350\256\276\347\275\256.md" @@ -0,0 +1,190 @@ +--- +title: 文本样式设置 +permalink: /pages/000b01010200010e +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 文本样式设置 + +针对包含文本元素的组件,设置文本样式。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

fontColor

+

Color

+

-

+

设置文本颜色。

+

fontSize

+

Length

+

-

+

设置文本尺寸,Length为number类型时,使用fp单位。

+

fontStyle

+

FontStyle

+

Normal

+

设置文本的字体样式。

+

fontWeight

+

number | FontWeight

+

Normal

+

设置文本的字体粗细,number类型取值[100, 900],取值间隔为100,默认为400,取值越大,字体越粗。

+

提供常用枚举值,参考:FontWeight

+

fontFamily

+

string

+

-

+

设置文本的字体列表。使用多个字体,使用','进行分割,优先级按顺序生效。例如:'Arial, sans-serif'。

+
+ +- FontStyle枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Normal

+

标准的字体样式。

+

Italic

+

斜体的字体样式。

+
+ + +- FontWeight枚举说明 + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Lighter

+

字体较细。

+

Normal

+

字体粗细正常。

+

Regular

+

字体粗细正常。

+

Medium

+

字体粗细适中。

+

Bold

+

字体较粗。

+

Bolder

+

字体非常粗。

+
+ + +## 示例 + +``` +@Entry +@Component +struct TextStyleExample { + build() { + Column({ space: 5 }) { + Text('default text') + + Text('text font color red') + .fontColor(Color.Red) + + Text('text font size 20') + .fontSize(20) + + Text('text font style Italic') + .fontStyle(FontStyle.Italic) + + Text('text fontWeight bold') + .fontWeight(700) + + Text('text fontFamily sans-serif') + .fontFamily('sans-serif') + + Text('red 20 Italic bold cursive text') + .fontColor(Color.Red) + .fontSize(20) + .fontStyle(FontStyle.Italic) + .fontWeight(700) + .fontFamily('cursive') + .textAlign(TextAlign.Center) + .width('90%') + + Text('Orange 18 Normal source-sans-pro text') + .fontColor(Color.Orange) + .fontSize(18) + .fontStyle(FontStyle.Normal) + .fontWeight(400) + .fontFamily('source-sans-pro,cursive,sans-serif') + }.width('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/textstyle.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/16.\346\240\205\346\240\274\350\256\276\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/16.\346\240\205\346\240\274\350\256\276\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..0f4ddbf8ae369dc507d66ba2c20bce1104c0dcc7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/16.\346\240\205\346\240\274\350\256\276\347\275\256.md" @@ -0,0 +1,127 @@ +--- +title: 栅格设置 +permalink: /pages/000b01010200010f +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 栅格设置 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>栅格布局的列宽、列间距由距离最近的GridContainer父组件决定。使用栅格属性的组件树上至少需要有1个GridContainer容器组件。 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

useSizeType

+

{

+

xs?: number | { span: number, offset: number },

+

sm?: number | { span: number, offset: number },

+

md?: number | { span: number, offset: number },

+

lg?: number | { span: number, offset: number }

+

}

+

-

+

设置在特定设备宽度类型下的占用列数和偏移列数,span: 占用列数; offset: 偏移列数。

+

当值为number类型时,仅设置列数, 当格式如{"span": 1, "offset": 0}时,指同时设置占用列数与偏移列数。

+
  • xs: 指设备宽度类型为SizeType.XS时的占用列数和偏移列数。
  • sm: 指设备宽度类型为SizeType.SM时的占用列数和偏移列数。
+
  • md: 指设备宽度类型为SizeType.MD时的占用列数和偏移列数。
  • lg: 指设备宽度类型为SizeType.LG时的占用列数和偏移列数。
+

gridSpan

+

number

+

1

+

默认占用列数,指useSizeType属性没有设置对应尺寸的列数(span)时,占用的栅格列数。

+
说明:

设置了栅格span属性,组件的宽度由栅格布局决定。

+
+

gridOffset

+

number

+

0

+

默认偏移列数,指useSizeType属性没有设置对应尺寸的偏移(offset)时, 当前组件沿着父组件Start方向,偏移的列数,也就是当前组件位于第n列。

+
说明:

1. 配置该属性后,当前组件在父组件水平方向的布局不再跟随父组件原有的布局方式,而是沿着父组件的Start方向偏移一定位移。

+

2. 偏移位移 = (列宽 + 间距)* 列数。

+

3. 设置了偏移(gridOffset)的组件之后的兄弟组件会根据该组件进行相对布局,类似相对布局。

+
+
+ +## 示例 + +``` +@Entry +@Component +struct GridContainerExample1 { + build(){ + GridContainer() { + Row({}) { + Row() { + Text('Left').fontSize(25) + } + .useSizeType({ + xs: { span: 1, offset: 0 }, sm: { span: 1, offset: 0 }, + md: { span: 1, offset: 0 }, lg: { span: 2, offset: 0 } + }) + .height("100%") + .backgroundColor(0x66bbb2cb) + Row() { + Text('Center').fontSize(25) + } + .useSizeType({ + xs: { span: 1, offset: 0 }, sm: { span: 2, offset: 1 }, + md: { span: 5, offset: 1 }, lg: { span: 7, offset: 2 } + }) + .height("100%") + .backgroundColor(0x66b6c5d1) + Row() { + Text('Right').fontSize(25) + } + .useSizeType({ + xs: { span: 1, offset: 0 }, sm: { span: 1, offset: 3 }, + md: { span: 2, offset: 6 }, lg: { span: 3, offset: 9 } + }) + .height("100%") + .backgroundColor(0x66bbb2cb) + } + .height(200) + } + .backgroundColor(0xf1f3f5) + .margin({ top: 10 }) + } +} +``` + +**图 1** 设备宽度为SM +![](/images/application-dev/reference/arkui-ts/figures/设备宽度为SM.png "设备宽度为SM") + +**图 2** 设备宽度为MD +![](/images/application-dev/reference/arkui-ts/figures/设备宽度为MD.png "设备宽度为MD") + +**图 3** 设备宽度为LG +![](/images/application-dev/reference/arkui-ts/figures/设备宽度为LG.png "设备宽度为LG") + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/17.\351\242\234\350\211\262\346\270\220\345\217\230.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/17.\351\242\234\350\211\262\346\270\220\345\217\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..9a9d1481d26983853fca29c2fe8a0eb6b57b9753 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/17.\351\242\234\350\211\262\346\270\220\345\217\230.md" @@ -0,0 +1,190 @@ +--- +title: 颜色渐变 +permalink: /pages/000b010102000110 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 颜色渐变 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

linearGradient

+

{

+

angle?: Angle,

+

direction?:GradientDirection,

+

colors: Array<ColorStop>

+

repeating?: boolean

+

}

+

-

+

线性渐变。

+

angle: 线性渐变的角度。

+

direction: 线性渐变的方向。

+

colors: 为渐变的颜色描述。

+

repeating: 为渐变的颜色重复着色。

+

sweepGradient

+

{

+

center: Point,

+

start?: angle,

+

end?: angle,

+

colors: Array<ColorStop>

+

repeating?: boolean

+

}

+

-

+

角度渐变。

+

center:为角度渐变的中心点。

+

start:角度渐变的起点。

+

end:角度渐变的终点。

+

colors: 为渐变的颜色描述。

+

repeating: 为渐变的颜色重复着色。

+

radialGradient

+

{

+

center: Point,

+

radius: Length,

+

colors: Array<ColorStop>

+

repeating: boolean

+

}

+

-

+

径向渐变。

+

center:径向渐变的中心点。

+

radius:径向渐变的半径。

+

colors: 为渐变的颜色描述。

+

repeating: 为渐变的颜色重复着色。

+
+ +- GradientDirection枚举说明 + + GradientDirection用于描述渐变方向。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Left

+

从右向左。

+

Top

+

从下向上。

+

Right

+

从左向右。

+

Bottom

+

从上向下。

+

LeftTop

+

左上。

+

LeftBottom

+

左下。

+

RightTop

+

右上。

+

RightBottom

+

右下。

+

None

+

无。

+
+ + +## 示例 + +``` +@Entry +@Component +struct ColorGradientExample { + build() { + Column({ space: 5 }) { + Text('linearGradient').fontSize(12).width('90%').fontColor(0xCCCCCC) + Row() + .width('90%') + .height(50) + .linearGradient({ + angle: 90, + direction: GradientDirection.Left, + colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]] + }) + Text('sweepGradient').fontSize(12).width('90%').fontColor(0xCCCCCC) + Row() + .width(100) + .height(100) + .sweepGradient({ + center: [50, 50], + start: 0, + end: 359, + colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]] + }) + Text('radialGradient').fontSize(12).width('90%').fontColor(0xCCCCCC) + Row() + .width(100) + .height(100) + .radialGradient({ + center: [50, 50], + radius: 60, + colors:[[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]] + }) + } + .width('100%') + .padding({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/colorGradient.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/18.Popup\346\216\247\345\210\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/18.Popup\346\216\247\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..067125f4fec76633b2bb896e3df49680bee02458 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/18.Popup\346\216\247\345\210\266.md" @@ -0,0 +1,112 @@ +--- +title: Popup控制 +permalink: /pages/000b010102000111 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Popup控制 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

参数描述

+

bindPopup

+

{

+

show: boolean,

+

popup: {

+

message: string,

+

placementOnTop: boolean,

+

primaryButton?: {

+

value: string,

+

action: ()=>void

+

},

+

secondaryButton?:{

+

value: string,

+

action: () =>void

+

},

+

onStateChange?: (isVisible: boolean) => void

+

}

+

}

+

-

+

show: 当前弹窗提示是否显示,默认值为false。

+

message: 弹窗信息内容。

+

placementOnTop:是否在组件上方显示,默认值为false。

+

primaryButton: 第一个按钮。

+

secondaryButton: 第二个按钮。

+

onStateChange: 弹窗状态变化事件回调,参数为弹窗当前的显示状态。

+
+ +## 示例 + +``` +@Entry +@Component +struct PopupExample { + @State noHandlePopup: boolean = false + @State handlePopup: boolean = false + + build() { + Column({ space: 160 }) { + Button('no handle popup') + .onClick(() => { + this.noHandlePopup = !this.noHandlePopup + }) + .bindPopup(this.noHandlePopup, { + + message: 'content content content ...', + placementOnTop: false, + onStateChange: (e) => { + console.info(e.isVisible.toString()) + if (!e.isVisible) { + this.noHandlePopup = false + } + } + }) + + Button('with handle popup') + .onClick(() => { + this.handlePopup = !this.handlePopup + }) + .bindPopup(this.handlePopup, { + + message: 'content content content ...', + placementOnTop: true, + secondaryButton: { + + value: 'ok', + action: () => { + this.handlePopup = !this.handlePopup + console.info('secondaryButton click') + } + }, + onStateChange: (e) => { + console.info(e.isVisible.toString()) + } + }) + }.width('100%').padding({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/popup.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/19.Menu\346\216\247\345\210\266.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/19.Menu\346\216\247\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..76f5a9c39eea8ece7753b4d2ec668c3569494705 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\351\200\232\347\224\250\345\261\236\346\200\247/19.Menu\346\216\247\345\210\266.md" @@ -0,0 +1,99 @@ +--- +title: Menu控制 +permalink: /pages/000b010102000112 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Menu控制 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

bindMenu

+

Array<MenuItem>

+

-

+

给组件绑定菜单,点击后弹出菜单。

+
+ +- MenuItem + + + + + + + + + + + + + + + + +

名称

+

类型

+

描述

+

value

+

string

+

菜单项文本。

+

action

+

() => void

+

点击菜单项的事件回调。

+
+ + +## 示例 + +``` +@Entry +@Component +struct menuExample { + build() { + Column() { + Text('click for Menu') + } + .width('100%') + .margin({ top: 5 }) + .bindMenu([ + { + value: 'Menu1', + action: () => { + console.info('handle Menu1 select') + } + }, + { + value: 'Menu2', + action: () => { + console.info('handle Menu2 select') + } + }, + ]) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/menu.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/01.\347\273\221\345\256\232\346\211\213\345\212\277\346\226\271\346\263\225.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/01.\347\273\221\345\256\232\346\211\213\345\212\277\346\226\271\346\263\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..5e50fe586beb50c857dfd827adfafbbef5dbb722 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/01.\347\273\221\345\256\232\346\211\213\345\212\277\346\226\271\346\263\225.md" @@ -0,0 +1,260 @@ +--- +title: 绑定手势方法 +permalink: /pages/000b010102000200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 绑定手势方法 + +可以通过如下属性给组件绑定手势识别,手势识别成功后可以通过事件回调通知组件。 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

gesture

+

gesture: GestureType,

+

mask?: GestureMask

+

gesture: -,

+

mask: GestureMask.Normal

+

绑定手势识别。

+

gesture: 绑定的手势类型, mask: 事件响应设置。

+

priorityGesture

+

gesture: GestureType,

+

mask?: GestureMask

+

gesture: -,

+

mask: GestureMask.Normal

+

绑定优先识别手势。

+

gesture: 绑定的手势类型, mask: 事件响应设置。

+
说明:
  • 默认情况下,子组件优先于父组件识别手势,当父组件配置priorityGesture时,父组件优先于子组件进行识别。
+
+

parallelGesture

+

gesture: GestureType,

+

mask?: GestureMask

+

gesture: -,

+

mask: GestureMask.Normal

+

绑定可与子组件手势同时触发的手势。

+

gesture: 绑定的手势类型, mask: 事件响应设置。

+
说明:
  • 手势事件为非冒泡事件。父组件设置parallelGesture时,父子组件相同的手势事件都可以触发,实现类似冒泡效果。
+
+
+ +- GestureMask枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Normal

+

不屏蔽子组件的手势,按照默认手势识别顺序进行识别。

+

IgnoreInternal

+

屏蔽子组件的手势,仅当前容器的手势进行识别。

+
说明:
  • 子组件上系统内置的手势不会被屏蔽,如子组件为List组件时,内置的滑动手势仍然会触发。
+
+
+ + +- 系统提供如下Gesture类型 + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

TapGesture

+

点击手势,支持单次点击、多次点击识别。

+

LongPressGesture

+

长按手势。

+

PanGesture

+

平移手势。

+

PinchGesture

+

捏合手势。

+

RotationGesture

+

旋转手势。

+

GestureGroup

+

手势识别组,多种手势组合为复合手势,支持连续识别、并行识别和互斥识别。

+
+ + +## 响应手势事件 + +组件通过gesture方法绑定手势对象,可以通过手势对象提供的事件相应响应手势操作。如通过TapGesture对象的onAction事件响应点击事件。具体事件定义见各个手势对象章节。 + +- TapGesture事件说明 + + + + + + + + + + +

名称

+

功能描述

+

onAction((event?: GestureEvent) => void)

+

Tap手势识别成功回调。

+
+ + +- GestureEvent对象说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性名称

+

属性类型

+

描述

+

repeat

+

boolean

+

事件是否为重复触发事件,用于LongPressGesture场景。

+

offsetX

+

number

+

手势事件偏移量,用于PanGesture手势触发场景,单位为vp。

+

offsetY

+

number

+

手势事件偏移量,用于PanGesture手势触发场景,单位为vp。

+

scale

+

number

+

缩放比例,用于PinchGesture手势触发场景。

+

pinchCenterX

+

number

+

捏合手势中心点X轴坐标,用于PinchGesture手势触发场景,单位为px。

+

pinchCenterY

+

number

+

捏合手势中心点Y轴坐标,用于PinchGesture手势触发场景,单位为px。

+

angle

+

number

+

旋转角度,用于RotationGesture手势触发场景。

+

timestamp

+

number

+

事件时间戳。

+
+ + +## 示例 + +``` +@Entry +@Component +struct GestureSettingsExample { + @State value: string = '' + + build() { + Column() { + Text('Click\n' + this.value).gesture(TapGesture() + .onAction(() => { + this.value = 'gesture onAction' + })) + }.height(200).width(300).padding(60).border({ width: 1 }).margin(30) + //设置为priorityGesture时,会优先识别该绑定手势忽略内部gesture手势 + .priorityGesture( + TapGesture() + .onAction(() => { + this.value = 'priorityGesture onAction' + }), GestureMask.IgnoreInternal + ) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/GestureSetting.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/01.TapGesture.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/01.TapGesture.md" new file mode 100644 index 0000000000000000000000000000000000000000..6898627102b0fd10970597fff0f76a7a6e430e12 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/01.TapGesture.md" @@ -0,0 +1,108 @@ +--- +title: TapGesture +permalink: /pages/000b01010200020100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# TapGesture + +## 接口 + +TapGesture\(options?: \{ count?: number, fingers?: number \}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

必填

+

默认值

+

参数描述

+

count

+

number

+

+

1

+

识别的连续点击次数。如果设置小于1,会被转化为默认值。

+
说明:

如配置多击,上一次抬起和下一次按下的超时时间为300毫秒(ms)。

+
+

fingers

+

number

+

+

1

+

触发点击的最少手指数,最小为1指, 最大为10指。

+
说明:

1. 当配置多指时,第一根手指按下后300毫秒(ms)内未有足够的手指数按下,手势识别失败。

+

2. 实际点击手指数超过配置值,手势识别失败。

+
+
+ + +## 事件 + + + + + + + + + + +

名称

+

功能描述

+

onAction((event?: GestureEvent) => void)

+

Tap手势识别成功回调。

+
+ +## 示例 + +``` +@Entry +@Component +struct TapGestureExample { + @State value: string = '' + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Text('Click twice') + Text(this.value) + } + .height(200).width(300).padding(60).border({ width: 1 }).margin(30) + .gesture( + TapGesture({ count: 2 }) + .onAction(() => { + this.value = 'TapGesture onAction' + }) + ) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/TapGesture.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/02.LongPressGesture.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/02.LongPressGesture.md" new file mode 100644 index 0000000000000000000000000000000000000000..ffe5b68d9d02831400db23b5de2dcb1ea62d6da7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/02.LongPressGesture.md" @@ -0,0 +1,128 @@ +--- +title: LongPressGesture +permalink: /pages/000b01010200020101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# LongPressGesture + +## 接口 + +LongPressGesture\(options?: \{ fingers?: number, repeat?: boolean, duration?: number \}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

必填

+

默认值

+

参数描述

+

fingers

+

number

+

+

1

+

触发长按的最少手指数,最小为1指, 最大取值为10指。

+

repeat

+

boolean

+

+

false

+

是否连续触发事件回调。

+

duration

+

number

+

+

500

+

最小触发长按的时间,单位为毫秒(ms)。

+
+ + +## 事件 + + + + + + + + + + + + + + + + +

名称

+

功能描述

+

onAction((event?: GestureEvent) => void)

+

LongPress手势识别成功回调。

+

onActionEnd((event?: GestureEvent) => void)

+

LongPress手势识别成功,手指抬起后触发回调。

+

onActionCancel(event: () => void)

+

LongPress手势识别成功,接收到触摸取消事件触发回调。

+
+ +## 示例 + +``` +@Entry +@Component +struct LongPressGestureExample { + @State count: number = 0 + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Text('LongPress onAction:' + this.count) + } + .height(200).width(300).padding(60).border({ width:1 }).margin(30) + .gesture( + LongPressGesture({ repeat: true }) + //长按动作存在会连续触发 + .onAction((event: GestureEvent) => { + if (event.repeat) { this.count++ } + }) + //长按动作一结束触发 + .onActionEnd(() => { + this.count = 0 + }) + ) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/LongPressGesture.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/03.PanGesture.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/03.PanGesture.md" new file mode 100644 index 0000000000000000000000000000000000000000..1a58e745834561050e8409ef0d977b233fcc8dbc --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/03.PanGesture.md" @@ -0,0 +1,228 @@ +--- +title: PanGesture +permalink: /pages/000b01010200020102 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# PanGesture + +## 接口 + +PanGesture\(options?: \{ fingers?: number, direction?: PanDirection, distance?: number \} | [PanGestureOption](#section14214195212149)\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

必填

+

默认值

+

参数描述

+

fingers

+

number

+

+

1

+

触发滑动的最少手指数,最小为1指, 最大取值为10指。

+

direction

+

PanDirection

+

+

All

+

设置滑动方向,此枚举值支持逻辑与(&)和逻辑或(|)运算。

+

distance

+

number

+

+

5.0

+

最小滑动识别距离,单位为vp。

+
+ +- PanDirection枚举说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

All

+

所有方向可滑动。

+

Horizontal

+

水平方向可滑动。

+

Vertical

+

竖直方向可滑动。

+

Left

+

向左滑动。

+

Right

+

向右滑动。

+

Up

+

向上滑动。

+

Down

+

向下滑动。

+

None

+

任何方向都不可滑动。

+
+ + +### PanGestureOption + +通过PanGestureOption对象接口可以动态修改滑动手势识别器的属性,从而避免通过状态变量修改属性(状态变量修改会导致UI刷新)。 + +PanGestureOption\(options?: \{ fingers?: number, direction?: PanDirection, distance?: number \}\) + +- 参数 + + 同[PanGesture](#li118312377710)参数说明。 + + +- 接口 + + + + + + + + + + + + + + + + +

名称

+

功能描述

+

setDirection(value: PanDirection)

+

设置direction属性。

+

setDistance(value: number)

+

设置distance属性。

+

setFingers(value: number)

+

设置fingers属性。

+
+ + +## 事件 + + + + + + + + + + + + + + + + + + + +

名称

+

功能描述

+

onActionStart((event?: GestureEvent) => void)

+

Pan手势识别成功回调。

+

onActionUpdate((event?: GestureEvent) => void)

+

Pan手势移动过程中回调。

+

onActionEnd((event?: GestureEvent) => void)

+

Pan手势识别成功,手指抬起后触发回调。

+

onActionCancel(event: () => void)

+

Pan手势识别成功,接收到触摸取消事件触发回调。

+
+ +## 示例 + +``` +@Entry +@Component +struct PanGestureExample { + @State offsetX: number = 0 + @State offsetY: number = 0 + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Text('PanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY) + } + .height(100).width(200).padding(20).border({ width: 1 }).margin(80) + .translate({ x: this.offsetX, y: this.offsetY, z: 5 }) + .gesture( + PanGesture({}) + .onActionStart((event: GestureEvent) => { + console.info('Pan start') + }) + .onActionUpdate((event: GestureEvent) => { + this.offsetX = event.offsetX + this.offsetY = event.offsetY + }) + .onActionEnd(() => { + console.info('Pan end') + }) + ) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/PanGesture.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/04.PinchGesture.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/04.PinchGesture.md" new file mode 100644 index 0000000000000000000000000000000000000000..4cacd58785dcc4e66ba111b1ee766ea7f7bb3452 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/04.PinchGesture.md" @@ -0,0 +1,124 @@ +--- +title: PinchGesture +permalink: /pages/000b01010200020103 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# PinchGesture + +## 接口 + +PinchGesture\(options?: \{ fingers?: number, distance?: number \}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

必填

+

默认值

+

参数描述

+

fingers

+

number

+

+

2

+

触发捏合的最少手指数, 最小为2指,最大为5指。

+

distance

+

number

+

+

3.0

+

最小识别距离,单位为vp。

+
+ + +## 事件 + + + + + + + + + + + + + + + + + + + +

名称

+

功能描述

+

onActionStart((event?: GestureEvent) => void)

+

Pinch手势识别成功回调。

+

onActionUpdate((event?: GestureEvent) => void)

+

Pinch手势移动过程中回调。

+

onActionEnd((event?: GestureEvent) => void)

+

Pinch手势识别成功,手指抬起后触发回调。

+

onActionCancel(event: () => void)

+

Pinch手势识别成功,接收到触摸取消事件触发回调。

+
+ +## 示例 + +``` +@Entry +@Component +struct PinchGestureExample { + @State scale: number = 1 + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Text('PinchGesture scale:' + this.scale) + } + .height(100).width(200).padding(20).border({ width: 1 }).margin(80) + .scale({ x: this.scale, y: this.scale, z: this.scale }) + .gesture( + PinchGesture() + .onActionStart((event: GestureEvent) => { + console.info('Pinch start') + }) + .onActionUpdate((event: GestureEvent) => { + this.scale = event.scale + }) + .onActionEnd(() => { + console.info('Pinch end') + }) + ) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/PinchGesture.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/05.RotationGesture.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/05.RotationGesture.md" new file mode 100644 index 0000000000000000000000000000000000000000..4c93a015f23b1cf8173d7d405eff6cbe8c8651ca --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/02.\345\237\272\347\241\200\346\211\213\345\212\277/05.RotationGesture.md" @@ -0,0 +1,124 @@ +--- +title: RotationGesture +permalink: /pages/000b01010200020104 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# RotationGesture + +## 接口 + +RotationGesture\(options?: \{ fingers?: number, angle?: number \}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

必填

+

默认值

+

参数描述

+

fingers

+

number

+

+

2

+

触发旋转的最少手指数, 最小为2指,最大为5指。

+

angle

+

number

+

+

1.0

+

触发旋转手势的最小改变度数,单位为度数。

+
+ + +## 事件 + + + + + + + + + + + + + + + + + + + +

名称

+

功能描述

+

onActionStart((event?: GestureEvent) => void)

+

Rotation手势识别成功回调。

+

onActionUpdate((event?: GestureEvent) => void)

+

Rotation手势移动过程中回调。

+

onActionEnd((event?: GestureEvent) => void)

+

Rotation手势识别成功,手指抬起后触发回调。

+

onActionCancel(event: () => void)

+

Rotation手势识别成功,接收到触摸取消事件触发回调。

+
+ +## 示例 + +``` +@Entry +@Component +struct RotationGestureExample { + @State angle: number = 0 + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Text('RotationGesture angle:' + this.angle) + } + .height(100).width(200).padding(20).border({ width:1 }) + .margin(80).rotate({ x:1, y:2, z:3, angle: this.angle }) + .gesture( + RotationGesture() + .onActionStart((event: GestureEvent) => { + console.log('Rotation start') + }) + .onActionUpdate((event: GestureEvent) => { + this.angle = event.angle + }) + .onActionEnd(() => { + console.log('Rotation end') + }) + ) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/RotationGesture.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/03.\347\273\204\345\220\210\346\211\213\345\212\277.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/03.\347\273\204\345\220\210\346\211\213\345\212\277.md" new file mode 100644 index 0000000000000000000000000000000000000000..109022f6c6dcfb3efb106b208373966f62a91a87 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\211\213\345\212\277\345\244\204\347\220\206/03.\347\273\204\345\220\210\346\211\213\345\212\277.md" @@ -0,0 +1,155 @@ +--- +title: 组合手势 +permalink: /pages/000b010102000202 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# 组合手势 + +## 接口 + +GestureGroup\(mode: GestureMode, ...gesture: GestureType\[\]\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

mode

+

GestureMode

+

+

-

+

设置组合手势识别模式。

+

gesture

+

TapGesture

+

| LongPressGesture

+

| PanGesture

+

| PinchGesture

+

| RotationGesture

+

+

-

+

可变长参数,1个或者多个基础手势类型,这些手势会被组合识别。

+
+ +- GestureMode枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Sequence

+

顺序识别,按照手势的注册顺序识别手势,直到所有手势识别成功。当有一个手势识别失败时,所有手势识别失败。

+

Parallel

+

并发识别,注册的手势同时识别,直到所有手势识别结束,手势识别互相不影响。

+

Exclusive

+

互斥识别,注册的手势同时识别,若有一个手势识别成功,则结束手势识别。

+
+ + +## 事件 + + + + + + + + + + +

名称

+

功能描述

+

onCancel(event: () => void)

+

顺序组合手势(GestureMode.Sequence)取消后触发回调。

+
+ +## 示例 + +``` +@Entry +@Component +struct GestureGroupExample { + @State count: number = 0 + @State offsetX: number = 0 + @State offsetY: number = 0 + @State borderStyle: BorderStyle = BorderStyle.Solid + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Text('sequence gesture\n' + 'LongPress onAction:' + this.count + '\nPanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY) + }.translate({ x: this.offsetX, y: this.offsetY, z: 5 }) + .height(100).width(200).padding(10).margin(80).border({ width: 1, style: this.borderStyle }) + .gesture( + GestureGroup(GestureMode.Sequence, + LongPressGesture({ repeat: true }) + .onAction((event: GestureEvent) => { + if (event.repeat) {this.count++} + console.log('LongPress onAction') + }) + .onActionEnd(() => { + console.log('LongPress end') + }), + PanGesture({}) + .onActionStart(() => { + this.borderStyle = BorderStyle.Dashed + console.log('pan start') + }) + .onActionUpdate((event: GestureEvent) => { + this.offsetX = event.offsetX + this.offsetY = event.offsetY + console.log('pan update') + }) + ) + .onCancel(() => { + console.log('sequence gesture canceled') + }) + ) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/GestureGroup.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/01.Blank.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/01.Blank.md" new file mode 100644 index 0000000000000000000000000000000000000000..ecd15624cc5cb414f91a7d2ea3db12cf6a7ffe71 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/01.Blank.md" @@ -0,0 +1,116 @@ +--- +title: Blank +permalink: /pages/000b0101020100 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Blank + +空白填充组件,在容器主轴方向上,空白填充组件具有自动填充容器空余部分的能力。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 仅当父组件为Row/Column时生效。 + +## 权限列表 + +无 + +## 子组件 + +无 + +## 接口 + +Blank\(min?: Length\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

min

+

Length

+

+

0

+

空白填充组件在容器主轴上的最小大小。

+
+ + +## 属性 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

color

+

Color

+

0x00000000

+

设置空白填充的填充颜色。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 不支持通用属性方法。 + +## 示例 + +``` +@Entry +@Component +struct BlankExample { + build() { + Column() { + Row() { + Text('Bluetooth').fontSize(18) + Blank() + Text('on/off').fontSize(18).height(60) + }.width('100%').backgroundColor(0xFFFFFF).borderRadius(15).padding(12) + }.backgroundColor(0xEFEFEF).padding(20) + } +} +``` + +竖屏状态 + +![](/images/application-dev/reference/arkui-ts/figures/blank_v.gif) + +横屏状态 + +![](/images/application-dev/reference/arkui-ts/figures/blank_h.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/02.Button.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/02.Button.md" new file mode 100644 index 0000000000000000000000000000000000000000..b62de96986aee82316ea458e81748b293265fbec --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/02.Button.md" @@ -0,0 +1,234 @@ +--- +title: Button +permalink: /pages/000b0101020101 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Button + +提供按钮组件。 + +## 权限列表 + +无 + +## 子组件 + +可以包含子组件。 + +## 接口 + +- Button\(options?: \{type?: ButtonType, stateEffect?: boolean\}\) + + **表 1** options参数说明 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

type

+

ButtonType

+

+

Capsule

+

描述按钮风格。

+

stateEffect

+

boolean

+

+

true

+

按钮按下时是否开启切换效果,当状态置为false时,点击效果关闭。

+
+ + +- Button\(label?: string, options?: \{ type?: ButtonType, stateEffect?: boolean \}\) + + 使用文本内容创建相应的按钮组件,此时Button无法包含子组件。 + + **表 2** value参数说明 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

label

+

string

+

+

-

+

按钮文本内容。

+

options

+

Object

+

+

-

+

options参数说明

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

type

+

ButtonType

+

Capsule

+

设置Button样式。

+

stateEffect

+

boolean

+

true

+

状态切换时是否开启切换效果,当状态置为false时,点击效果关闭。

+
+ +- ButtonType枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Capsule

+

胶囊型按钮(圆角默认为高度的一半)。

+

Circle

+

圆形按钮。

+

Normal

+

普通按钮(默认不带圆角)。

+
+ + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- 按钮圆角通过[通用属性borderRadius设置](/pages/000b010102000104)(不支持通过border接口设置圆角)。 +>- 按钮文本通过[通用文本样式](/pages/000b01010200010e)进行设置。 + +## 示例 + +``` +@Entry +@Component +struct ButtonExample { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) { + Text('Common button').fontSize(9).fontColor(0xCCCCCC) + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Button('Ok', { type: ButtonType.Normal, stateEffect: true }).borderRadius(8).backgroundColor(0x317aff).width(90) + Button({ type: ButtonType.Normal, stateEffect: true }) { + Row() { + Image($r('app.media.loading')).width(20).height(20).margin({ left: 12 }) + Text('loading').fontSize(12).fontColor(0xffffff).margin({ left: 5, right: 12 }) + }.alignItems(VerticalAlign.Center) + }.borderRadius(8).backgroundColor(0x317aff).width(90) + Button('Disable', { type: ButtonType.Normal, stateEffect: false }).opacity(0.5) + .borderRadius(8).backgroundColor(0x317aff).width(90) + } + + Text('Capsule button').fontSize(9).fontColor(0xCCCCCC) + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Button('Ok', { type: ButtonType.Capsule, stateEffect: true }).backgroundColor(0x317aff).width(90) + Button({ type: ButtonType.Capsule, stateEffect: true }) { + Row() { + Image($r('app.media.loading')).width(20).height(20).margin({ left: 12 }) + Text('loading').fontSize(12).fontColor(0xffffff).margin({ left: 5, right: 12 }) + }.alignItems(VerticalAlign.Center).width(90) + }.backgroundColor(0x317aff) + .onClick((event: ClickEvent) => { + AlertDialog.show({ message: 'The login is successful' }) + }) + Button('Disable', { type: ButtonType.Capsule, stateEffect: false }).opacity(0.5) + .backgroundColor(0x317aff).width(90) + } + + Text('Circle button').fontSize(9).fontColor(0xCCCCCC) + Flex({ alignItems: ItemAlign.Center, wrap: FlexWrap.Wrap }) { + Button({ type: ButtonType.Circle, stateEffect: true }) { + Image($r('app.media.ic_public_app_filled')).width(20).height(20) + }.width(55).height(55).backgroundColor(0x317aff) + Button({ type: ButtonType.Circle, stateEffect: true }) { + Image($r('app.media.ic_public_delete_filled')).width(30).height(30) + }.width(55).height(55).margin({ left: 20 }).backgroundColor(0xF55A42) + } + }.height(400).padding({ left: 35, right: 35, top: 35 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Button.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/03.DataPanel.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/03.DataPanel.md" new file mode 100644 index 0000000000000000000000000000000000000000..3f74fb0e1c9ccbd933b6c8ab206d033a67b68749 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/03.DataPanel.md" @@ -0,0 +1,86 @@ +--- +title: DataPanel +permalink: /pages/000b0101020102 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# DataPanel + +数据面板组件,用于将多个数据占比情况使用环形占比图进行展示。 + +## 子组件 + +无 + +## 接口 + +DataPanel\(value:\{values: number\[\], max?: number\}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

values

+

number[]

+

+

-

+

数据值列表,最大支持9个数据。

+

max

+

number

+

+

100

+

数据的最大值。

+
+ + +## 示例 + +``` +@Entry +@Component +struct DataPanelExample { + public values1: number[] = [40, 20, 20, 10, 10] + + build() { + Column({ space: 5 }) { + DataPanel({ values: this.values1, max: 100 }) + .width(150) + .height(150) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/datapanel.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/04.Divider.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/04.Divider.md" new file mode 100644 index 0000000000000000000000000000000000000000..3c842d032acd2e9d8101ed3ddd77038a1d395d0b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/04.Divider.md" @@ -0,0 +1,118 @@ +--- +title: Divider +permalink: /pages/000b0101020103 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Divider + +提供分隔器组件,分隔不同内容块/内容元素。 + +## 权限列表 + +无 + +## 子组件 + +无 + +## 接口 + +Divider\(\) + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

vertical

+

boolean

+

false

+

使用水平分割线还是垂直分割线,false: 水平分割线, true:垂直分割线。

+

color

+

Color

+

-

+

设置分割线颜色。

+

strokeWidth

+

Length

+

1

+

设置分割线宽度。

+

lineCap

+

LineCapStyle

+

Butt

+

设置分割线条的端点样式,默认为Butt。

+
+ +## 事件 + +不支持通用事件。 + +## 示例 + +``` +@Entry +@Component +struct DividerExample { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) { + Text('Horizontal divider').fontSize(9).fontColor(0xCCCCCC) + Row().width('100%').height(40).backgroundColor(0xF1F3F5) + Divider() + Row().width('100%').height(40).backgroundColor(0xF1F3F5) + + Text('Vertical divider').fontSize(9).fontColor(0xCCCCCC) + Flex({ alignItems: ItemAlign.Center, wrap: FlexWrap.Wrap }) { + Text('bravery') + Divider().vertical(true).margin(20).height(15) + Text('effort') + Divider().vertical(true).margin(20).height(15) + Text('upward') + }.width(250) + + Text('Custom Styles').fontSize(9).fontColor(0xCCCCCC) + Row().width('100%').height(40).backgroundColor(0xF1F3F5) + Divider().vertical(false).strokeWidth(5).color(0x2788D9).lineCap(LineCapStyle.Round) + Row().width('100%').height(40).backgroundColor(0xF1F3F5) + }.width('100%').height(350).padding({ left: 35, right: 35, top: 35 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/divider.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/05.Image.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/05.Image.md" new file mode 100644 index 0000000000000000000000000000000000000000..4ca5c9c317eb505b844bb6c4a885d05f9b597d58 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/05.Image.md" @@ -0,0 +1,461 @@ +--- +title: Image +permalink: /pages/000b0101020104 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Image + +图片组件,用来渲染展示图片。 + +## 权限列表 + +ohos.permission.INTERNET(使用网络图片) + +## 子组件 + +无 + +## 接口 + +Image\(src: string | PixelMap\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

src

+

string

+

+

-

+

图片的URI,支持本地图片和网络路径。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

alt

+

string

+

-

+

加载时显示的占位图。支持本地图片和网络路径。

+

objectFit

+

ImageFit

+

Cover

+

设置图片的缩放类型。

+

objectRepeat

+

ImageRepeat

+

NoRepeat

+

设置图片的重复样式。

+
说明:
  • SVG类型图源不支持该属性。
+
+

interpolation

+

ImageInterpolation

+

None

+

设置图片的插值效果,仅针对图片放大插值。

+
说明:
  • SVG类型图源不支持该属性。
  • PixelMap资源不支持该属性。
+
+

renderMode

+

ImageRenderMode

+

Original

+

设置图片渲染的模式。

+
说明:
  • SVG类型图源不支持该属性。
+
+

sourceSize

+

{

+

width: number,

+

height: number

+

}

+

-

+

设置图片解码尺寸,将原始图片解码成指定尺寸的图片,number类型单位为px。

+
说明:

PixelMap资源不支持该属性。

+
+
+ +- ImageFit枚举说明 + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Cover

+

保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。

+

Contain

+

保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内。

+

Fill

+

不保持宽高比进行放大缩小,使得图片填充满显示边界。

+

None

+

保持原有尺寸显示。通常配合objectRepeat属性一起使用。

+

ScaleDown

+

保持宽高比显示,图片缩小或者保持不变。

+
+ + +- ImageInterpolation枚举说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

None

+

不使用插值图片数据。

+

High

+

高度使用插值图片数据,可能会影响图片渲染的速度。

+

Medium

+

中度使用插值图片数据。

+

Low

+

低度使用插值图片数据。

+
+ + +- ImageRenderMode枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Original

+

按照原图进行渲染,包括颜色。

+

Template

+

将图像渲染为模板图像,忽略图片的颜色信息。

+
+ + +## 事件 + + + + + + + + + + + + + + + + +

名称

+

功能描述

+

onComplete(callback: (event?: { width: number, height: number, componentWidth: number, componentHeight: number, loadingStatus: number }) => void)

+

图片成功加载时触发该回调,返回成功加载的图源尺寸。

+

onError(callback: (event?: { componentWidth: number, componentHeight: number }) => void)

+

图片加载出现异常时触发该回调。

+

onFinish(callback: () => void)

+

当加载的源文件为带动效的svg图片时,当svg动效播放完成时会触发这个回调,如果动效为无限循环动效,则不会触发这个回调。

+
+ +## 示例 + +``` +// Image1 +@Entry +@Component +struct ImageExample1 { + private on: string = 'http://uxd.rnd.huawei.com/uxIcon/file/2021-08/d2d6e6c6-043f-471e-80e3-57199142201e.svg' + @State src: string = this.on + + build() { + Column() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start }) { + Text('default').fontSize(16).fontColor(0xcccccc).height(30) + Row({ space: 5 }) { + Image($r('app.media.ic_png')) + .width(110).height(110).border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .overlay('png', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + Image($r('app.media.ic_gif')) + .width(110).height(110).border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .overlay('gif', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + Image($r('app.media.ic_svg')) + .width(110).height(110).border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .overlay('svg', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + } + Row({ space: 5 }) { + Image($r('app.media.img_example')) + .width(110).height(110).border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .overlay('jpg', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + Image(this.src) + .width(110).height(110).border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .overlay('network', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + }.margin({ top: 25, bottom: 10 }) + } + + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start }) { + Text('objectFit').fontSize(16).fontColor(0xcccccc).height(30) + Row({ space: 5 }) { + Image($r('app.media.img_example')) + .border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .objectFit(ImageFit.None).width(110).height(110) + .overlay('None', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + Image($r('app.media.img_example')) + .border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .objectFit(ImageFit.Fill).width(110).height(110) + .overlay('Fill', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + Image($r('app.media.img_example')) + .border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .objectFit(ImageFit.Cover).width(110).height(110) + .overlay('Cover', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + } + Row({ space: 5 }) { + Image($r('app.media.img_example_w250')) + .border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .objectFit(ImageFit.Contain).width(110).height(110) + .overlay('Contain', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + Image($r('app.media.img_example_w250')) + .border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .objectFit(ImageFit.ScaleDown).width(110).height(110) + .overlay('ScaleDown', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + }.margin({ top: 25 }) + } + }.height(320).width(360).padding({ right: 10, top: 10 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Image1.gif) + +``` +// Image2 +@Entry +@Component +struct ImageExample2 { + @State width: number = 100 + @State height: number = 100 + + build() { + Column({ space: 10 }) { + Text('renderMode').fontSize(12).fontColor(0xcccccc).width('96%').height(30) + Row({ space: 50 }) { + Image($r('app.media.img_example')) + .renderMode(ImageRenderMode.Original).width(100).height(100) + .border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .overlay('Original', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + Image($r('app.media.img_example')) + .renderMode(ImageRenderMode.Template).width(100).height(100) + .border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .overlay('Template', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + } + + Text('alt').fontSize(12).fontColor(0xcccccc).width('96%').height(30) + Image('') + .alt($r('app.media.Image_none')) + .width(100).height(100).border({ width: 1 }).borderStyle(BorderStyle.Dashed) + + Text('sourceSize').fontSize(12).fontColor(0xcccccc).width('96%') + Row({ space: 50 }) { + Image($r('app.media.img_example')) + .sourceSize({ + width: 150, + height: 150 + }) + .objectFit(ImageFit.ScaleDown).width('25%').aspectRatio(1) + .border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .overlay('w:150 h:150', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + Image($r('app.media.img_example')) + .sourceSize({ + width: 200, + height: 200 + }) + .objectFit(ImageFit.ScaleDown).width('25%').aspectRatio(1) + .border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .overlay('w:200 h:200', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + } + + Text('objectRepeat').fontSize(12).fontColor(0xcccccc).width('96%').height(30) + Row({ space: 5 }) { + Image($r('app.media.ic_health_heart')) + .width(120).height(125).border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .objectRepeat(ImageRepeat.XY).objectFit(ImageFit.ScaleDown) + .overlay('ImageRepeat.XY', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + Image($r('app.media.ic_health_heart')) + .width(110).height(125).border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .objectRepeat(ImageRepeat.Y).objectFit(ImageFit.ScaleDown) + .overlay('ImageRepeat.Y', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + Image($r('app.media.ic_health_heart')) + .width(110).height(125).border({ width: 1 }).borderStyle(BorderStyle.Dashed) + .objectRepeat(ImageRepeat.X).objectFit(ImageFit.ScaleDown) + .overlay('ImageRepeat.X', { align: Alignment.Bottom, offset: { x: 0, y: 20 } }) + } + }.height(150).width('100%').padding({ right: 10 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Image2.gif) + +``` +// Image3 +@Entry +@Component +struct ImageExample3 { + @State width: number = 0 + @State height: number = 0 + private on: Resource = $r('app.media.wifi_on') + private off: Resource = $r('app.media.wifi_off') + private on2off: Resource = $r('app.media.wifi_on2off') + private off2on: Resource = $r('app.media.wifi_off2on') + @State src: Resource = this.on + + build() { + Column() { + Row({ space: 20 }) { + Column() { + Image($r('app.media.img_example1')) + .alt($r('app.media.ic_public_picture')) + .sourceSize({ + width: 900, + height: 900 + }) + .objectFit(ImageFit.Cover) + .height(180).width(180) + .onComplete((msg: { width: number,height: number }) => { + this.width = msg.width + this.height = msg.height + }) + .onError(() => { + console.log('load image fail') + }) + .overlay('\nwidth: ' + String(this.width) + ' height: ' + String(this.height), { + align: Alignment.Bottom, + offset: { x: 0, y: 20 } + }) + } + + Image(this.src) + .width(120).height(120) + .onClick(() => { + if (this.src == this.on || this.src == this.off2on) { + this.src = this.on2off + } else { + this.src = this.off2on + } + }) + .onFinish(() => { + if (this.src == this.off2on) { + this.src = this.on + } else { + this.src = this.off + } + }) + } + }.width('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Image3.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/06.ImageAnimator.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/06.ImageAnimator.md" new file mode 100644 index 0000000000000000000000000000000000000000..b61f727a14889d220fd79e8efa2d17d16a12b1c0 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/06.ImageAnimator.md" @@ -0,0 +1,341 @@ +--- +title: ImageAnimator +permalink: /pages/000b0101020105 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# ImageAnimator + +提供帧动画组件来实现逐帧播放图片的能力,可以配置需要播放的图片列表,每张图片可以配置时长。 + +## 子组件 + +无 + +## 接口 + +ImageAnimator\(\) + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

images

+

Array<{

+

src:string,

+

width?:Length,

+

height?:Length,

+

top?:Length,

+

left?:Length,

+

duration?:number

+

}>

+

[]

+

+

设置图片帧信息集合。每一帧的帧信息包含图片路径、图片大小、图片位置和图片播放时长信息。详细说明如下:

+

src:图片路径,图片格式为svg,png和jpg。

+

width:图片宽度。

+

height:图片高度。

+

top:图片相对于组件左上角的纵向坐标。

+

left:图片相对于组件左上角的横向坐标。

+

duration:每一帧图片的播放时长,单位毫秒。

+

state

+

AnimationStatus

+

Initial

+

+

默认为初始状态,用于控制播放状态。

+

duration

+

number

+

1000

+

+

单位为毫秒,默认时长为1000ms;duration为0时,不播放图片;值的改变只会在下一次循环开始时生效;当images中设置了单独的duration后,该属性设置无效。

+

reverse

+

boolean

+

false

+

+

设置播放顺序。false表示从第1张图片播放到最后1张图片; true表示从最后1张图片播放到第1张图片。

+

fixedSize

+

boolean

+

true

+

+

设置图片大小是否固定为组件大小。 true表示图片大小与组件大小一致,此时设置图片的width 、height 、top 和left属性是无效的。false表示每一张图片的 width 、height 、top和left属性都要单独设置。

+

preDecode

+

number

+

0

+

+

是否启用预解码,默认值为0,即不启用预解码,如该值设为2,则播放当前页时会提前加载后面两张图片至缓存以提升性能。

+

fillMode

+

FillMode

+

Forwards

+

+

设置动画开始前和结束后的状态,可选值参见FillMode说明。

+

iterations

+

number

+

1

+

+

默认播放一次,设置为-1时表示无限次播放。

+
+ +- AnimationStatus枚举说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Initial

+

动画初始状态

+

Running

+

动画处于播放状态。

+

Paused

+

动画处于暂停状态。

+

Stopped

+

动画处于停止状态。

+
+ + +- FillMode枚举值说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

None

+

播放完成后恢复初始状态。

+

Forwards

+

播放完成后保持动画结束时的状态。

+

Backwards

+

在animation-delay所指定的一段时间内,在动画显示之前,应用开始属性值。

+

Both

+

向前和向后填充模式都被应用。

+
+ + +## 事件 + + + + + + + + + + + + + + + + + + + + + + +

名称

+

功能描述

+

onStart() => void

+

状态回调,动画开始播放时触发。

+

onPause() => void

+

状态回调,动画暂停播放时触发。

+

onRepeat() => void

+

状态回调,动画重新播放时触发。

+

onCancel() => void

+

状态回调,动画取消播放时触发。

+

onFinish() => void

+

状态回调,动画播放完成时触发。

+
+ +## 示例 + +``` +@Entry +@Component +struct ImageAnimatorExample { + @State state: AnimationStatus = AnimationStatus.Initial + @State reverse: boolean = false + @State iterations: number = 1 + + build() { + Column({ space:5 }) { + ImageAnimator() + .images([ + { + src: '/comment/bg1.jpg', + duration: 500, + width: 325, + height: 200, + top: 0, + left: 0 + }, + { + src: '/comment/bg2.jpg', + duration: 500, + width: 325, + height: 200, + top: 0, + left: 0 + }, + { + src: '/comment/bg3.jpg', + duration: 500, + width: 325, + height: 200, + top: 0, + left: 0 + }, + { + src: '/comment/bg4.jpg', + duration: 500, + width: 325, + height: 200, + top: 0, + left: 0 + } + ]) + .state(this.state).reverse(this.reverse).fixedSize(false).preDecode(2) + .fillMode(FillMode.None).iterations(this.iterations).width(325).height(210) + .margin({top:100}) + .onStart(() => { // 当帧动画开始播放后触发 + console.info('Start') + }) + .onPause(() => { + console.info('Pause') + }) + .onRepeat(() => { + console.info('Repeat') + }) + .onCancel(() => { + console.info('Cancel') + }) + .onFinish(() => { // 当帧动画播放完成后触发 + console.info('Finish') + }) + Row() { + Button('start').width(100).padding(5).onClick(() => { + this.state = AnimationStatus.Running + }) + Button('pause').width(100).padding(5).onClick(() => { + this.state = AnimationStatus.Paused + }) + Button('stop').width(100).padding(5).onClick(() => { + this.state = AnimationStatus.Stopped + }) + } + Row() { + Button('reverse').width(100).padding(5).onClick(() => { + this.reverse = !this.reverse + }) + Button('once').width(100).padding(5).onClick(() => { + this.iterations = 1 + }) + Button('iteration').width(100).padding(5).onClick(() => { + this.iterations = -1 + }) + } + }.width('100%').height('100%').backgroundColor(0xF1F3F5) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/ImageAnimator.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/07.Progress.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/07.Progress.md" new file mode 100644 index 0000000000000000000000000000000000000000..b21d79131716bc4716bfa81f6cd63e59e342e4cd --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/07.Progress.md" @@ -0,0 +1,180 @@ +--- +title: Progress +permalink: /pages/000b0101020106 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Progress + +进度条,用于显示内容加载或操作处理进度。 + +## 支持设备 + + + + + + + + + + + + + + + + +

手机

+

平板

+

车机

+

智慧屏

+

智能穿戴

+

支持

+

支持

+

支持

+

不支持

+

不支持

+
+ +## 子组件 + +无 + +## 接口说明 + +Progress\(value: \{value: number, total?: number, style?: ProgressStyle\}\) + +创建有明确进度的进度条。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

value

+

number

+

+

-

+

指定当前进度值。

+

total

+

number

+

+

100

+

指定进度总长。

+

style

+

ProgressStyle

+

+

Linear

+

指定进度条样式。

+
+ + +- ProgressStyle枚举说明 + + + + + + + + + + +

名称

+

描述

+

Linear

+

线性进度条样式。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

value

+

number

+

-

+

设置当前进度值。

+

color

+

Color

+

-

+

设置进度条前景色。

+
+ +## 示例 + +``` +@Entry +@Component +struct ProgressExample { + build() { + Column({ space: 5 }) { + Text('Linear Progress').fontSize(9).fontColor(0xCCCCCC).width('90%') + Progress({ value: 10, style: ProgressStyle.Linear }).width(200) + + Text('Linear Progress Color').fontSize(9).fontColor(0xCCCCCC).width('90%') + Progress({ value: 20, total: 150, style: ProgressStyle.Linear }).color(Color.Red).value(50).width(200) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/progress-15.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/08.QRCode.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/08.QRCode.md" new file mode 100644 index 0000000000000000000000000000000000000000..fd69ccce513f5e14f163b5d81e3b9a3413350715 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/08.QRCode.md" @@ -0,0 +1,110 @@ +--- +title: QRCode +permalink: /pages/000b0101020107 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# QRCode + +显示二维码信息。 + +## 权限类别 + +无 + +## 子组件 + +无 + +## 接口 + +QRCode\(value: string\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

value

+

string

+

+

-

+

二维码内容字符串。

+
+ + +## 属性 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

color

+

Color

+

Black

+

设置二维码颜色。

+
+ +## 事件 + +通用事件仅支持点击事件。 + +## 示例 + +``` +@Entry +@Component +struct QRCodeExample { + private value: string = 'hello world' + + build() { + Column({ space: 5 }) { + Text('normal').fontSize(9).width('90%').fontColor(0xCCCCCC) + QRCode(this.value).width(200).height(200) + + Text('color').fontSize(9).width('90%').fontColor(0xCCCCCC) + QRCode(this.value).color(0xF7CE00).width(200).height(200) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/qrcode.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/09.Rating.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/09.Rating.md" new file mode 100644 index 0000000000000000000000000000000000000000..ec623c87bdaa2472e92bf32eca750b497a53fa82 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/09.Rating.md" @@ -0,0 +1,157 @@ +--- +title: Rating +permalink: /pages/000b0101020108 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Rating + +评分条组件。 + +## 子组件 + +无 + +## 接口说明 + +Rating\(options?: \{ rating: number, indicator?: boolean \}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

rating

+

number

+

+

0

+

设置并接收评分值。

+

indicator

+

boolean

+

+

false

+

仅作为指示器使用,不可操作。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

stars

+

number

+

5

+

设置评星总数。

+

stepSize

+

number

+

0.5

+

操作评级的步长。

+

starStyle

+

{

+

backgroundUri: string,

+

foregroundUri: string,

+

secondaryUri?: string

+

}

+

-

+

backgroundSrc:未选中的星级的图片链接,可由用户自定义或使用系统默认图片,仅支持本地。

+

foregroundSrc:选中的星级的图片路径,可由用户自定义或使用系统默认图片,仅支持本地。

+

secondarySrc:部分选中的星级的图片路径,可由用户自定义或使用系统默认图片,仅支持本地。

+
+ +## 事件 + + + + + + + + + + +

名称

+

功能描述

+

onChange(callback:(value: number) => void)

+

操作评分条的评星发生改变时触发该回调。

+
+ +## 示例 + +``` +@Entry +@Component +struct RatingExample { + @State rating: number = 1 + @State indicator: boolean = false + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Text('current score is ' + this.rating).fontSize(20) + Rating({ rating: this.rating, indicator: this.indicator }) + .stars(5) + .stepSize(0.5) + .onChange((value: number) => { + this.rating = value + }) + }.width(350).height(200).padding(35) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Rating.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/10.Span.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/10.Span.md" new file mode 100644 index 0000000000000000000000000000000000000000..6bdad5b9bdd5704067d6d60e31341ac8d1149ef4 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/10.Span.md" @@ -0,0 +1,145 @@ +--- +title: Span +permalink: /pages/000b0101020109 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Span + +文本段落,只能作为Text子组件,呈现一段文本信息。 + +## 权限列表 + +无 + +## 子组件 + +无 + +## 接口 + +Span\(content: string\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

content

+

string

+

+

-

+

文本内容。

+
+ + +## 属性 + +通用属性方法仅支持通用文本样式。 + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

decoration

+

{

+

type: TextDecorationType,

+

color?: Color

+

}

+

{

+

type: TextDecorationType.None

+

}

+

设置文本装饰线样式及其颜色。

+

textCase

+

TextCase

+

Normal

+

设置文本大小写。

+
+ +## 事件 + +通用事件仅支持点击事件。 + +## 示例 + +``` +@Entry +@Component +struct SpanExample { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) { + Text('Basic Usage').fontSize(9).fontColor(0xCCCCCC) + Text() { + Span('This is the Span component').fontSize(12).textCase(TextCase.Normal) + .decoration({ type: TextDecorationType.None, color: Color.Red }) + } + + Text('Text Decoration').fontSize(9).fontColor(0xCCCCCC) + Text() { + Span('I am Underline-span').decoration({ type: TextDecorationType.Underline, color: Color.Red }).fontSize(12) + } + Text() { + Span('I am LineThrough-span').decoration({ type: TextDecorationType.LineThrough, color: Color.Red }).fontSize(12) + } + Text() { + Span('I am Overline-span').decoration({ type: TextDecorationType.Overline, color: Color.Red }).fontSize(12) + } + + Text('Text Case').fontSize(9).fontColor(0xCCCCCC) + Text() { + Span('I am Lower-span').textCase(TextCase.LowerCase).fontSize(12) + .decoration({ type: TextDecorationType.None, color: Color.Red }) + } + Text() { + Span('I am Upper-span').textCase(TextCase.UpperCase).fontSize(12) + .decoration({ type: TextDecorationType.None, color: Color.Red }) + } + }.width('100%').height(250).padding({ left: 35, right: 35, top: 35 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Span.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/11.Slider.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/11.Slider.md" new file mode 100644 index 0000000000000000000000000000000000000000..9480601b527e521ebf88e65aed7ba73f9704dbe3 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/11.Slider.md" @@ -0,0 +1,293 @@ +--- +title: Slider +permalink: /pages/000b010102010a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Slider + +滑动条组件,用来快速调节设置值,如音量、亮度等。 + +## 子组件 + +无 + +## 接口 + +Slider\(value:\{value?: number, min?: number, max?: number, step?: number, style?: SliderStyle\}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

value

+

number

+

+

0

+

当前进度值。

+

min

+

number

+

+

0

+

设置最小值。

+

max

+

number

+

+

100

+

设置最大值

+

step

+

number

+

+

1

+

设置Slider滑动跳动值,当设置相应的step时,Slider为间歇滑动。

+

style

+

SliderStyle

+

+

Outset

+

设置Slider的滑块样式。

+
+ +- SliderStyle枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

OutSet

+

滑块在滑轨上。

+

InSet

+

滑块在滑轨内。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

blockColor

+

Color

+

-

+

设置滑块的颜色。

+

trackColor

+

Color

+

-

+

设置滑轨的背景颜色。

+

selectedColor

+

Color

+

-

+

设置滑轨的已滑动颜色。

+

showSteps

+

boolean

+

false

+

设置当前是否显示步长刻度值。

+

showTips

+

boolean

+

false

+

设置滑动时是否显示气泡提示百分比。

+
+ +## 事件 + +通用事件仅支持:OnAppear,OnDisAppear。 + + + + + + + + + + +

名称

+

功能描述

+

onChange(callback: (value: number, mode: SliderChangeMode) => void)

+

Slider滑动时触发事件回调。

+

value:当前进度值。

+

mode:拖动状态。

+
+ +- SliderChangeMode枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Begin

+

用户开始拖动滑块。

+

Moving

+

用户拖动滑块中。

+

End

+

用户结束拖动滑块。

+
+ + +## 示例 + +``` +@Entry +@Component +struct SliderExample { + @State outSetValue: number = 40 + @State inSetValue: number = 40 + + build() { + Column({ space: 5 }) { + Text('slider out set').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row() { + Slider({ + value: this.outSetValue, + min: 0, + max: 100, + step: 1, + style: SliderStyle.OutSet + }) + .blockColor(Color.Blue) + .trackColor(Color.Gray) + .selectedColor(Color.Blue) + .showSteps(true) + .showTips(true) + .onChange((value: number, mode: SliderChangeMode) => { + this.outSetValue = value + console.info('value:' + value + 'mode:' + mode.toString()) + }) + Text(this.outSetValue.toFixed(0)).fontSize(16) + } + .padding({ top: 50 }) + .width('80%') + + Text('slider in set').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row() { + Slider({ + value: this.inSetValue, + min: 0, + max: 100, + step: 1, + style: SliderStyle.InSet + }) + .blockColor(0xCCCCCC) + .trackColor(Color.Black) + .selectedColor(0xCCCCCC) + .showSteps(false) + .showTips(false) + .onChange((value: number, mode: SliderChangeMode) => { + this.inSetValue = value + console.info('value:' + value + 'mode:' + mode.toString()) + }) + Text(this.inSetValue.toFixed(0)).fontSize(16) + } + .width('80%') + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/sider.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/12.Text.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/12.Text.md" new file mode 100644 index 0000000000000000000000000000000000000000..b7db6bb1596c0552123a69f39ed2eb99cf9d2476 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/02.\345\237\272\347\241\200\347\273\204\344\273\266/12.Text.md" @@ -0,0 +1,346 @@ +--- +title: Text +permalink: /pages/000b010102010b +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Text + +文本,用于呈现一段信息。 + +## 权限列表 + +无 + +## 子组件 + +可以包含[Span](/pages/000b0101020109)子组件。 + +## 接口 + +Text\(content?: string\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

content

+

string

+

+

''

+

文本内容,包含子组件Span时不生效,显示Span内容。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

textAlign

+

TextAlign

+

Start

+

设置多行文本的文本对齐方式。

+

textOverflow

+

{overflow: TextOverflow}

+

{overflow: TextOverflow.Clip}

+

设置文本超长时的显示方式。

+

maxLines

+

number

+

Infinity

+

设置文本的最大行数。

+

lineHeight

+

Length

+

-

+

设置文本的文本行高,设置值不大于0时,不限制文本行高,自适应字体大小,Length为number类型时单位为fp。

+

decoration

+

{

+

type: TextDecorationType,

+

color?: Color

+

}

+

{

+

type: TextDecorationType.None,

+

color:Color.Black

+

}

+

设置文本装饰线样式及其颜色。

+

baselineOffset

+

Length

+

-

+

设置文本基线的偏移量。

+

textCase

+

TextCase

+

Normal

+

设置文本大小写。

+
+ +- TextAlign枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Center

+

文本居中对齐。

+

Start

+

根据文字书写相同的方向对齐。

+

End

+

根据文字书写相反的方向对齐。

+
+ + +- TextOverflow枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Clip

+

文本超长时进行裁剪显示。

+

Ellipsis

+

文本超长时显示不下的文本用省略号代替。

+

None

+

文本超长时不进行裁剪。

+
+ + +- TextDecorationType枚举说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Underline

+

文字下划线修饰。

+

LineThrough

+

穿过文本的修饰线。

+

Overline

+

文字上划线修饰。

+

None

+

不使用文本装饰线。

+
+ + +- TextCase枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Normal

+

保持文本原有大小写。

+

LowerCase

+

文本采用全小写。

+

UpperCase

+

文本采用全大写。

+
+ + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>不支持Text内同时存在文本内容和Span子组件。(如果同时存在,只显示Span内的内容\)。 + +## 示例 + +``` +@Entry +@Component +struct TextExample1 { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) { + Text('lineHeight').fontSize(9).fontColor(0xCCCCCC) + Text('This is the text with the line height set This is the text with the line height set This is the text with the line height set.') + .lineHeight(25).fontSize(12).border({ width: 1 }).padding(10) + + Text('TextOverflow').fontSize(9).fontColor(0xCCCCCC) + Text('This is the setting of textOverflow to none text content This is the setting of textOverflow to none text content.') + .textOverflow({ overflow: TextOverflow.None }) + .fontSize(12).border({ width: 1 }).padding(10) + Text('This is the setting of textOverflow to Clip text content This is the setting of textOverflow to Clip text content.') + .textOverflow({ overflow: TextOverflow.Clip }) + .maxLines(1).fontSize(12).border({ width: 1 }).padding(10) + Text('This is set textOverflow to Ellipsis text content This is set textOverflow to Ellipsis text content.') + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .maxLines(1).fontSize(12).border({ width: 1 }).padding(10) + + Text('decoration').fontSize(9).fontColor(0xCCCCCC) + Text('This is the text content with the decoration set to Underline and the color set to Red.') + .decoration({ type: TextDecorationType.Underline, color: Color.Red }) + .fontSize(12).border({ width: 1 }).padding(10) + Text('This is the text content with the decoration set to LineThrough and the color set to Red.') + .decoration({ type: TextDecorationType.LineThrough, color: Color.Red }) + .fontSize(12).border({ width: 1 }).padding(10) + Text('This is the text content with the decoration set to Overline and the color set to Red.') + .decoration({ type: TextDecorationType.Overline, color: Color.Red }) + .fontSize(12).border({ width: 1 }).padding(10) + }.height(600).width(350).padding({ left: 35, right: 35, top: 35 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Text1.gif) + +``` +@Entry +@Component +struct TextExample2 { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) { + Text('textCase').fontSize(9).fontColor(0xCCCCCC) + Text('This is the text content with textCase set to Normal.') + .textCase(TextCase.Normal) + .fontSize(12).border({ width: 1 }).padding(10).width('100%') + Text('This is the text content with textCase set to LowerCase.') + .textCase(TextCase.LowerCase) + .fontSize(12).border({ width: 1 }).padding(10).width('100%') + Text('This is the text content with textCase set to UpperCase.') + .textCase(TextCase.UpperCase) + .fontSize(12).border({ width: 1 }).padding(10) + + Text('textAlign').fontSize(9).fontColor(0xCCCCCC) + Text('This is the text content with textAlign set to Center.') + .textAlign(TextAlign.Center) + .fontSize(12).border({ width: 1 }).padding(10).width('100%') + Text('This is the text content with textAlign set to Start.') + .textAlign(TextAlign.Start) + .fontSize(12).border({ width: 1 }).padding(10).width('100%') + Text('This is the text content with textAlign set to End.') + .textAlign(TextAlign.End) + .fontSize(12).border({ width: 1 }).padding(10).width('100%') + + Text('baselineOffset').fontSize(9).fontColor(0xCCCCCC) + Text('This is the text content with baselineOffset set to 10.') + .baselineOffset(10).fontSize(12).border({ width: 1 }).padding(10).width('100%') + Text('This is the text content with baselineOffset set to 30.') + .baselineOffset(30).fontSize(12).border({ width: 1 }).padding(10).width('100%') + Text('This is the text content with baselineOffset set to -10.') + .baselineOffset(-10).fontSize(12).border({ width: 1 }).padding(10).width('100%') + }.height(700).width(350).padding({ left: 35, right: 35, top: 35 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Text2.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/01.AlphabetIndexer.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/01.AlphabetIndexer.md" new file mode 100644 index 0000000000000000000000000000000000000000..955549b22dc8ccd8d57a3f38186e28e466694dcd --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/01.AlphabetIndexer.md" @@ -0,0 +1,263 @@ +--- +title: AlphabetIndexer +permalink: /pages/000b0101020200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# AlphabetIndexer + +字母索引条。 + +## 支持设备 + + + + + + + + + + + + + + + + +

手机

+

平板

+

车机

+

智慧屏

+

智能穿戴

+

支持

+

支持

+

支持

+

不支持

+

不支持

+
+ +## 子组件 + +无 + +## 接口 + +AlphabetIndexer\(value: \{arrayValue : Array, selected : number\}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

arrayValue

+

Array<string>

+

+

-

+

字母索引字符串数组。

+

selected

+

number

+

+

-

+

选中项编号。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

描述

+

selectedColor

+

Color

+

选中文本文字颜色。

+

popupColor

+

Color

+

弹出提示文本字体颜色。

+

selectedBackgroundColor

+

Color

+

选中文本背景颜色。

+

popupBackground

+

Color

+

弹窗索引背景色。

+

usingPopup

+

boolean

+

是否使用弹出索引提示。

+

selectedFont

+

{

+

size?: number,

+

weight?: FontWeight,

+

family?: string,

+

style?: FontStyle

+

}

+

选中文本文字样式。

+

popupFont

+

{

+

size?: number,

+

weight?: FontWeight,

+

family?: string,

+

style?: FontStyle

+

}

+

弹出提示文本字体样式。

+

font

+

{

+

size?: number,

+

weight?: FontWeight,

+

family?: string,

+

style?: FontStyle

+

}

+

字母索引条默认文本字体样式。

+

itemSize

+

Length

+

字母索引条字母区域大小,字母区域为正方形,设置正方形边长。

+

alignStyle

+

IndexerAlign

+

字母索引条对齐样式,支持左侧对齐样式与右侧对齐样式,影响弹窗弹出位置。

+
+ +- IndexerAlign枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Left

+

弹框显示在索引条右侧。

+

Right

+

弹框显示在索引条左侧。

+
+ + +## 事件 + + + + + + + + + + +

名称

+

功能描述

+

onSelected(index: number) => void

+

索引条选中回调。

+
+ +## 示例 + +``` +@Entry +@Component +struct AlphabetIndexerComponent { + private value: string[] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] + + build() { + AlphabetIndexer({ ArrayValue: this.value, selected: 0 }) + .selectedColor(0xffffff) // 选中颜色 + .popupColor(0xFFFAF0) // 弹出框颜色 + .selectedBackgroundColor(0xCCCCCC) // 选中背景颜色 + .popupBackground(0xD2B48C) // 弹出框背景颜色 + .usingPopup(true) // 是否显示弹出框 + .selectedFont({ size: 16, weight: FontWeight.Bolder }) // 选中的样式 + .popupFont({ size: 30, weight: FontWeight.Bolder }) // 弹出框的演示 + .itemSize(28) // 每一项的大小正方形 + .alignStyle(IndexerAlign.Left) // 左对齐 + .onSelected((index: number) => { + console.info(this.value[index] + '被选中了') // 选中的事件 + }) + .margin({ left: 50 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/alphabetindexer.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/02.Badge.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/02.Badge.md" new file mode 100644 index 0000000000000000000000000000000000000000..e7b8695ea315b1ac8fe04da39418b9cd04446c8e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/02.Badge.md" @@ -0,0 +1,283 @@ +--- +title: Badge +permalink: /pages/000b0101020201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Badge + +新事件标记组件,在组件上提供事件信息展示能力。 + +## 子组件 + +支持单个子组件。 + +## 接口 + +Badge\(value: \{count: number, position?: BadgePosition, maxCount?: number, style?: BadgeStyle\}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

count

+

number

+

+

-

+

设置提醒消息数。

+

position

+

BadgePosition

+

+

RightTop

+

设置提示点显示位置。

+

maxCount

+

number

+

+

99

+

最大消息数,超过最大消息时仅显示maxCount+。

+

style

+

BadgeStyle

+

+

-

+

Badge组件可设置样式,支持设置文本颜色、尺寸、圆点颜色和尺寸。

+
+ + +Badge\(value: \{value: string, position?: BadgePosition, style?: BadgeStyle\}\) + +根据字符串创建提醒组件。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

value

+

string

+

+

-

+

提示内容的文本字符串。

+

position

+

BadgePosition

+

+

RightTop

+

设置提示点显示位置。

+

style

+

BadgeStyle

+

+

-

+

Badge组件可设置样式,支持设置文本颜色、尺寸、圆点颜色和尺寸。

+
+ + +- BadgeStyle对象说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

类型

+

必填

+

默认值

+

描述

+

color

+

Color

+

+

White

+

文本颜色。

+

fontSize

+

number | string

+

+

10

+

文本大小。

+

badgeSize

+

number | string

+

+

-

+

badge的大小。

+

badgeColor

+

Color

+

+

Red

+

badge的颜色。

+
+ + +- BadgePosition枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Right

+

圆点显示在右侧纵向居中。

+

RightTop

+

圆点显示在右上角。

+

Left

+

圆点显示在左侧纵向居中。

+
+ + +## 示例 + +``` +@Entry +@Component +struct BadgeExample { + @State counts: number = 1 + @State message: string = 'new' + + build() { + Flex({ justifyContent: FlexAlign.SpaceAround }) { + Badge({ + count: this.counts, + maxCount: 99, + style: { color: 0xFFFFFF, fontSize: 16, badgeSize: 20, badgeColor: Color.Red } + }) { + Button('message') + .onClick(() => { + this.counts++ + }) + .width(100).height(50).backgroundColor(0x317aff) + }.width(100).height(50) + + Badge({ + value: this.message, + style: { color: 0xFFFFFF, fontSize: 9, badgeSize: 20, badgeColor: Color.Blue } + }) { + Text('message') + .width(80).height(50).fontSize(16).lineHeight(37) + .borderRadius(10).textAlign(TextAlign.Center).backgroundColor(0xF3F4ED) + }.width(80).height(50) + + Badge({ + value: '', + position: 1, + style: { badgeSize: 6, badgeColor: Color.Red } + }) { + Text('message') + .width(90).height(50).fontSize(16).lineHeight(37) + .borderRadius(10).textAlign(TextAlign.Center).backgroundColor(0xF3F4ED) + }.width(90).height(50) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/badge.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/03.Column.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/03.Column.md" new file mode 100644 index 0000000000000000000000000000000000000000..828b807ca908572c8877af2a8fd2f0b22acfe48d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/03.Column.md" @@ -0,0 +1,144 @@ +--- +title: Column +permalink: /pages/000b0101020202 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Column + +沿垂直方向布局的容器。 + +## 权限列表 + +无 + +## 子组件 + +可以包含子组件。 + +## 接口 + +Column\(options?: \{ space?: Length \}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

space

+

Length

+

+

0

+

纵向布局元素间距。

+
+ + +## 属性 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

alignItems

+

HorizontalAlign

+

Center

+

设置子组件在水平方向上的对齐格式。

+
+ +- HorizontalAlign枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Start

+

按照语言方向起始端对齐。

+

Center

+

居中对齐,默认对齐方式。

+

End

+

按照语言方向末端对齐。

+
+ + +## 示例 + +``` +@Entry +@Component +struct ColumnExample { + build() { + Column({ space: 5 }) { + Text('space').fontSize(9).fontColor(0xCCCCCC).width('90%') + Column({ space: 5 }) { + Column().width('100%').height(50).backgroundColor(0xAFEEEE) + Column().width('100%').height(50).backgroundColor(0x00FFFF) + }.width('90%').height(107).border({ width: 1 }) + + Text('alignItems(Start)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Column() { + Column().width('50%').height(50).backgroundColor(0xAFEEEE) + Column().width('50%').height(50).backgroundColor(0x00FFFF) + }.alignItems(HorizontalAlign.Start).width('90%').border({ width: 1 }) + + Text('alignItems(End)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Column() { + Column().width('50%').height(50).backgroundColor(0xAFEEEE) + Column().width('50%').height(50).backgroundColor(0x00FFFF) + }.alignItems(HorizontalAlign.End).width('90%').border({ width: 1 }) + }.width('100%').padding({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/column.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/04.ColumnSplit.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/04.ColumnSplit.md" new file mode 100644 index 0000000000000000000000000000000000000000..98220485f9fb98379e4f67f3a95caedbd2f82390 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/04.ColumnSplit.md" @@ -0,0 +1,74 @@ +--- +title: ColumnSplit +permalink: /pages/000b0101020203 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# ColumnSplit + +将子组件纵向布局,并在每个子组件之间插入一根横向的分割线。 + +## 子组件 + +可以包含子组件。 + +## 接口 + +ColumnSplit\(\) + +## 属性 + + + + + + + + + + + + +

名称

+

参数类型

+

描述

+

resizeable

+

boolean

+

分割线是否可拖拽,默认为false。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>与RowSplit相同,ColumnSplit的分割线最小能拖动到刚好包含子组件。 + +## 示例 + +``` +@Entry +@Component +struct ColumnSplitExample { + build() { + Column(){ + Text('The secant line can be dragged').fontSize(9).fontColor(0xCCCCCC).width('90%') + ColumnSplit() { + Text('1').width('100%').height(50).backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + Text('2').width('100%').height(50).backgroundColor(0xD2B48C).textAlign(TextAlign.Center) + Text('3').width('100%').height(50).backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + Text('4').width('100%').height(50).backgroundColor(0xD2B48C).textAlign(TextAlign.Center) + Text('5').width('100%').height(50).backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + } + .resizeable(true) + .width('90%').height('60%') + }.width('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/ColumnSplit.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/05.Counter.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/05.Counter.md" new file mode 100644 index 0000000000000000000000000000000000000000..464dbe8dcd9a8136d52b04a2c42dbc8195a96e1c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/05.Counter.md" @@ -0,0 +1,75 @@ +--- +title: Counter +permalink: /pages/000b0101020204 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Counter + +计数器组件,提供相应的增加或者减少的计数操作。 + +## 子组件 + +可以包含子组件。 + +## 接口 + +Counter\(\) + +## 事件 + +不支持通用事件和手势, 仅支持如下事件: + + + + + + + + + + + + + +

名称

+

功能描述

+

onInc(callback: () => void)

+

监听数值增加事件。

+

onDec(callback: () => void)

+

监听数值减少事件。

+
+ +## 示例 + +``` +@Entry +@Component +struct CounterExample { + @State value: number = 0 + + build() { + Column() { + Counter() { + Text(this.value.toString()) + }.margin(100) + .onInc(() => { + this.value++ + }) + .onDec(() => { + this.value-- + }) + }.width("100%") + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Counter.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/06.Flex.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/06.Flex.md" new file mode 100644 index 0000000000000000000000000000000000000000..9b771188ccf8ca135aae0ca6c23cd8d2adbd0006 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/06.Flex.md" @@ -0,0 +1,468 @@ +--- +title: Flex +permalink: /pages/000b0101020205 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Flex + +弹性布局组件。 + +## 权限列表 + +无 + +## 子组件 + +可以包含子组件。 + +## 接口 + +Flex\(options?: \{ direction?: FlexDirection, wrap?: FlexWrap, justifyContent?: FlexAlign, alignItems?: ItemAlign, alignContent?: FlexAlign \}\) + +标准Flex布局容器。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

direction

+

FlexDirection

+

+

Row

+

子组件在Flex容器上排列的方向,即主轴的方向。

+

wrap

+

FlexWrap

+

+

NoWrap

+

Flex容器是单行/列还是多行/列排列。

+

justifyContent

+

FlexAlign

+

+

Start

+

子组件在Flex容器主轴上的对齐格式。

+

alignItems

+

ItemAlign

+

+

Stretch

+

子组件在Flex容器交叉轴上的对齐格式。

+

alignContent

+

FlexAlign

+

+

Start

+

交叉轴中有额外的空间时,多行内容的对齐方式。仅在wrap为Wrap或WrapReverse下生效。

+
+ +- FlexDirection枚举说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Row

+

主轴与行方向一致作为布局模式。

+

RowReverse

+

与Row方向相反方向进行布局。

+

Column

+

主轴与列方向一致作为布局模式。

+

ColumnReverse

+

与Column相反方向进行布局。

+
+ + +- FlexWrap枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

NoWrap

+

Flex容器的元素单行/列布局,子项允许超出容器。

+

Wrap

+

Flex容器的元素多行/列排布,子项允许超出容器。

+

WrapReverse

+

Flex容器的元素反向多行/列排布,子项允许超出容器。

+
+ + +- FlexAlign枚举说明 + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Start

+

元素在主轴方向首端对齐, 第一个元素与行首对齐,同时后续的元素与前一个对齐。

+

Center

+

元素在主轴方向中心对齐,第一个元素与行首的距离与最后一个元素与行尾距离相同。

+

End

+

元素在主轴方向尾部对齐, 最后一个元素与行尾对齐,其他元素与后一个对齐。

+

SpaceBetween

+

Flex主轴方向均匀分配弹性元素,相邻元素之间距离相同。 第一个元素与行首对齐,最后一个元素与行尾对齐。

+

SpaceAround

+

Flex主轴方向均匀分配弹性元素,相邻元素之间距离相同。 第一个元素到行首的距离和最后一个元素到行尾的距离时相邻元素之间距离的一半。

+

SpaceEvenly

+

Flex主轴方向元素等间距布局, 相邻元素之间的间距、第一个元素与行首的间距、最后一个元素到行尾的间距都完全一样。

+
+ + +## 示例 + +``` +// Example 01 +@Entry +@Component +struct FlexExample1 { + build() { + Column() { + Column({ space: 5 }) { + Text('direction:Row').fontSize(9).fontColor(0xCCCCCC).width('90%') + Flex({ direction: FlexDirection.Row }) { + Text('1').width('20%').height(50).backgroundColor(0xF5DEB3) + Text('2').width('20%').height(50).backgroundColor(0xD2B48C) + Text('3').width('20%').height(50).backgroundColor(0xF5DEB3) + Text('4').width('20%').height(50).backgroundColor(0xD2B48C) + } + .height(70) + .width('90%') + .padding(10) + .backgroundColor(0xAFEEEE) + + Text('direction:RowReverse').fontSize(9).fontColor(0xCCCCCC).width('90%') + Flex({ direction: FlexDirection.RowReverse }) { + Text('1').width('20%').height(50).backgroundColor(0xF5DEB3) + Text('2').width('20%').height(50).backgroundColor(0xD2B48C) + Text('3').width('20%').height(50).backgroundColor(0xF5DEB3) + Text('4').width('20%').height(50).backgroundColor(0xD2B48C) + } + .height(70) + .width('90%') + .padding(10) + .backgroundColor(0xAFEEEE) + + Text('direction:Column').fontSize(9).fontColor(0xCCCCCC).width('90%') + Flex({ direction: FlexDirection.Column }) { + Text('1').width('100%').height(40).backgroundColor(0xF5DEB3) + Text('2').width('100%').height(40).backgroundColor(0xD2B48C) + Text('3').width('100%').height(40).backgroundColor(0xF5DEB3) + Text('4').width('100%').height(40).backgroundColor(0xD2B48C) + } + .height(160) + .width('90%') + .padding(10) + .backgroundColor(0xAFEEEE) + + Text('direction:ColumnReverse').fontSize(9).fontColor(0xCCCCCC).width('90%') + Flex({ direction: FlexDirection.ColumnReverse }) { + Text('1').width('100%').height(40).backgroundColor(0xF5DEB3) + Text('2').width('100%').height(40).backgroundColor(0xD2B48C) + Text('3').width('100%').height(40).backgroundColor(0xF5DEB3) + Text('4').width('100%').height(40).backgroundColor(0xD2B48C) + } + .height(160) + .width('90%') + .padding(10) + .backgroundColor(0xAFEEEE) + }.width('100%').margin({ top: 5 }) + }.width('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Flex01.gif) + +``` +// Example 02 +@Entry +@Component +struct FlexExample2 { + build() { + Column() { + Column({ space: 5 }) { + Text('Wrap').fontSize(9).fontColor(0xCCCCCC).width('90%') + Flex({ wrap: FlexWrap.Wrap }) { + Text('1').width('50%').height(50).backgroundColor(0xF5DEB3) + Text('2').width('50%').height(50).backgroundColor(0xD2B48C) + Text('3').width('50%').height(50).backgroundColor(0xD2B48C) + } + .width('90%') + .padding(10) + .backgroundColor(0xAFEEEE) + + Text('NoWrap').fontSize(9).fontColor(0xCCCCCC).width('90%') + Flex({ wrap: FlexWrap.NoWrap }) { + Text('1').width('50%').height(50).backgroundColor(0xF5DEB3) + Text('2').width('50%').height(50).backgroundColor(0xD2B48C) + Text('3').width('50%').height(50).backgroundColor(0xF5DEB3) + } + .width('90%') + .padding(10) + .backgroundColor(0xAFEEEE) + + Text('WrapReverse').fontSize(9).fontColor(0xCCCCCC).width('90%') + Flex({ wrap: FlexWrap.WrapReverse , direction:FlexDirection.Row }) { + Text('1').width('50%').height(50).backgroundColor(0xF5DEB3) + Text('2').width('50%').height(50).backgroundColor(0xD2B48C) + Text('3').width('50%').height(50).backgroundColor(0xD2B48C) + } + .width('90%') + .height(120) + .padding(10) + .backgroundColor(0xAFEEEE) + }.width('100%').margin({ top: 5 }) + }.width('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/flex02.png) + +``` +// Example 03 +@Component +struct JustifyContentFlex { + @Prop justifyContent : number + + build() { + Flex({ justifyContent: this.justifyContent }) { + Text('1').width('20%').height(50).backgroundColor(0xF5DEB3) + Text('2').width('20%').height(50).backgroundColor(0xD2B48C) + Text('3').width('20%').height(50).backgroundColor(0xF5DEB3) + } + .width('90%') + .padding(10) + .backgroundColor(0xAFEEEE) + } +} + +@Entry +@Component +struct FlexExample3 { + build() { + Column() { + Column({ space: 5 }) { + Text('justifyContent:Start').fontSize(9).fontColor(0xCCCCCC).width('90%') + JustifyContentFlex({ justifyContent: FlexAlign.Start }) + + Text('justifyContent:Center').fontSize(9).fontColor(0xCCCCCC).width('90%') + JustifyContentFlex({ justifyContent: FlexAlign.Center }) + + Text('justifyContent:End').fontSize(9).fontColor(0xCCCCCC).width('90%') + JustifyContentFlex({ justifyContent: FlexAlign.End }) + + Text('justifyContent:SpaceBetween').fontSize(9).fontColor(0xCCCCCC).width('90%') + JustifyContentFlex({ justifyContent: FlexAlign.SpaceBetween }) + + Text('justifyContent:SpaceAround').fontSize(9).fontColor(0xCCCCCC).width('90%') + JustifyContentFlex({ justifyContent: FlexAlign.SpaceAround }) + + Text('justifyContent:SpaceEvenly').fontSize(9).fontColor(0xCCCCCC).width('90%') + JustifyContentFlex({ justifyContent: FlexAlign.SpaceEvenly }) + }.width('100%').margin({ top: 5 }) + }.width('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Flex03.gif) + +``` +// Example 04 +@Component +struct AlignItemsFlex { + @Prop alignItems : number + + build() { + Flex({ alignItems: this.alignItems }) { + Text('1').width('33%').height(30).backgroundColor(0xF5DEB3) + Text('2').width('33%').height(40).backgroundColor(0xD2B48C) + Text('3').width('33%').height(50).backgroundColor(0xF5DEB3) + } + .size({width: '90%', height: 80}) + .padding(10) + .backgroundColor(0xAFEEEE) + } +} + +@Entry +@Component +struct FlexExample4 { + build() { + Column() { + Column({ space: 5 }) { + Text('alignItems:Auto').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignItemsFlex({ alignItems: ItemAlign.Auto }) + + Text('alignItems:Start').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignItemsFlex({ alignItems: ItemAlign.Start }) + + Text('alignItems:Center').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignItemsFlex({ alignItems: ItemAlign.Center }) + + Text('alignItems:End').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignItemsFlex({ alignItems: ItemAlign.End }) + + Text('alignItems:Stretch').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignItemsFlex({ alignItems: ItemAlign.Stretch }) + + Text('alignItems:Baseline').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignItemsFlex({ alignItems: ItemAlign.Baseline }) + }.width('100%').margin({ top: 5 }) + }.width('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Flex04.jpg) + +![](/images/application-dev/reference/arkui-ts/figures/Flex04-16.gif) + +``` +// Example 05 +@Component +struct AlignContentFlex { + @Prop alignContent: number + + build() { + Flex({ wrap: FlexWrap.Wrap, alignContent: this.alignContent }) { + Text('1').width('50%').height(20).backgroundColor(0xF5DEB3) + Text('2').width('50%').height(20).backgroundColor(0xD2B48C) + Text('3').width('50%').height(20).backgroundColor(0xD2B48C) + } + .size({ width: '90%', height: 90 }) + .padding(10) + .backgroundColor(0xAFEEEE) + } +} + +@Entry +@Component +struct FlexExample5 { + build() { + Column() { + Column({ space: 5 }) { + Text('alignContent:Start').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignContentFlex({ alignContent: FlexAlign.Start }) + + Text('alignContent:Center').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignContentFlex({ alignContent: FlexAlign.Center }) + + Text('alignContent:End').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignContentFlex({ alignContent: FlexAlign.End }) + + Text('alignContent:SpaceBetween').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignContentFlex({ alignContent: FlexAlign.SpaceBetween }) + + Text('alignContent:SpaceAround').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignContentFlex({ alignContent: FlexAlign.SpaceAround }) + + Text('alignContent:SpaceEvenly').fontSize(9).fontColor(0xCCCCCC).width('90%') + AlignContentFlex({ alignContent: FlexAlign.SpaceEvenly }) + }.width('100%').margin({ top: 5 }) + }.width('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Flex05.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/07.GridContainer.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/07.GridContainer.md" new file mode 100644 index 0000000000000000000000000000000000000000..922a9c134f1ee0578da81741a0207c27d3b00040 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/07.GridContainer.md" @@ -0,0 +1,206 @@ +--- +title: GridContainer +permalink: /pages/000b0101020206 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# GridContainer + +纵向排布栅格布局容器,仅在栅格布局场景中使用。 + +## 子组件 + +可以包含子组件。 + +## 接口 + +GridContainer\(options? :\{ columns?: number | 'auto', sizeType?: SizeType, gutter?: Length, margin?: Length \}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

默认值

+

说明

+

columns

+

number

+

+

'auto'

+

设置当前布局总列数。

+

sizeType

+

SizeType

+

+

Auto

+

选用设备宽度类型。

+

gutter

+

Length

+

+

-

+

栅格布局列间距。

+

margin

+

Length

+

+

-

+

栅格布局两侧间距。

+
+ +- SizeType枚举说明 + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

XS

+

最小宽度类型设备。

+

SM

+

小宽度类型设备。

+

MD

+

中等宽度类型设备。

+

LG

+

大宽度类型设备。

+

Auto

+

根据设备类型进行选择。

+
+ + +## 属性 + +支持通用属性和Column组件的[属性方法](/pages/000b0101020202#section358284262918)。 + +## 事件 + +支持通用事件。 + +## 示例 + +``` +@Entry +@Component +struct GridContainerExample { + @State sizeType: SizeType = SizeType.XS + + build() { + Column({ space: 5 }) { + GridContainer({ columns: 12, sizeType: this.sizeType, gutter: 10, margin: 20 }) { + Row() { + Text('1') + .useSizeType({ + xs: { span: 6, offset: 0 }, + sm: { span: 2, offset: 0 }, + md: { span: 2, offset: 0 }, + lg: { span: 2, offset: 0 } + }) + .height(50).backgroundColor(0x4682B4).textAlign(TextAlign.Center) + Text('2') + .useSizeType({ + xs: { span: 2, offset: 6 }, + sm: { span: 6, offset: 2 }, + md: { span: 2, offset: 2 }, + lg: { span: 2, offset: 2 } + }) + .height(50).backgroundColor(0x00BFFF).textAlign(TextAlign.Center) + Text('3') + .useSizeType({ + xs: { span: 2, offset: 8 }, + sm: { span: 2, offset: 8 }, + md: { span: 6, offset: 4 }, + lg: { span: 2, offset: 4 } + }) + .height(50).backgroundColor(0x4682B4).textAlign(TextAlign.Center) + Text('4') + .useSizeType({ + xs: { span: 2, offset: 10 }, + sm: { span: 2, offset: 10 }, + md: { span: 2, offset: 10 }, + lg: { span: 6, offset: 6 } + }) + .height(50).backgroundColor(0x00BFFF).textAlign(TextAlign.Center) + } + }.width('90%') + + Text('Click Simulate to change the device width').fontSize(9).width('90%').fontColor(0xCCCCCC) + Row() { + Button('XS') + .onClick(() => { + this.sizeType = SizeType.XS + }).backgroundColor(0x317aff) + Button('SM') + .onClick(() => { + this.sizeType = SizeType.SM + }).backgroundColor(0x317aff) + Button('MD') + .onClick(() => { + this.sizeType = SizeType.MD + }).backgroundColor(0x317aff) + Button('LG') + .onClick(() => { + this.sizeType = SizeType.LG + }).backgroundColor(0x317aff) + } + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/grid.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/08.Grid.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/08.Grid.md" new file mode 100644 index 0000000000000000000000000000000000000000..6a00aee19052bf6997d01ecf6284352e328d1730 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/08.Grid.md" @@ -0,0 +1,161 @@ +--- +title: Grid +permalink: /pages/000b0101020207 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Grid + +网格容器,二维布局,将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以任意组合不同的网格,做出各种各样的布局。 + +## 权限类别 + +无 + +## 子组件 + +包含[GridItem](/pages/000b0101020208)子组件。 + +## 接口说明 + +Grid\(\) + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

columnsTemplate

+

string

+

'1fr'

+

用于设置当前网格布局列的数量,不设置时默认1列 示例, '1fr 1fr 2fr' 分三列,将父组件允许的宽分为4等份,第一列占1份,第二列占一份,第三列占2份。

+

rowsTemplate

+

string

+

'1fr'

+

用于设置当前网格布局行的数量,不设置时默认1行 示例, '1fr 1fr 2fr'分三行,将父组件允许的高分为4等份,第一行占1份,第二行占一份,第三行占2份。

+

columnsGap

+

Length

+

0

+

用于设置列与列的间距。

+

rowsGap

+

Length

+

0

+

用于设置行与行的间距。

+
+ +## 事件 + + + + + + + + + + +

名称

+

功能描述

+

onScrollIndex(first: number) => void

+

当前列表显示的起始位置item发生变化时触发。

+
+ +## 示例 + +``` +@Entry +@Component +struct GridExample { + @State Number: String[] = ['0', '1', '2', '3', '4'] + + build() { + Column({ space: 5 }) { + Grid() { + ForEach(this.Number, (day: string) => { + ForEach(this.Number, (day: string) => { + GridItem() { + Text(day) + .fontSize(16) + .backgroundColor(0xF9CF93) + .width('100%') + .height('100%') + .textAlign(TextAlign.Center) + } + }, day => day) + }, day => day) + } + .columnsTemplate('1fr 1fr 1fr 1fr 1fr') + .rowsTemplate('1fr 1fr 1fr 1fr 1fr') + .columnsGap(10) + .rowsGap(10) + .width('90%') + .backgroundColor(0xFAEEE0) + .height(300) + + Text('scroll').fontColor(0xCCCCCC).fontSize(9).width('90%') + Grid() { + ForEach(this.Number, (day: string) => { + ForEach(this.Number, (day: string) => { + GridItem() { + Text(day) + .fontSize(16) + .backgroundColor(0xF9CF93) + .width('100%') + .height(80) + .textAlign(TextAlign.Center) + } + }, day => day) + }, day => day) + } + .columnsTemplate('1fr 1fr 1fr 1fr 1fr') + .columnsGap(10) + .rowsGap(10) + .onScrollIndex((first: number) => { + console.info(first.toString()) + }) + .width('90%') + .backgroundColor(0xFAEEE0) + .height(300) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/grid-17.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/09.GridItem.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/09.GridItem.md" new file mode 100644 index 0000000000000000000000000000000000000000..aa571a6ca607f9b06f321caeec871725f831b06f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/09.GridItem.md" @@ -0,0 +1,131 @@ +--- +title: GridItem +permalink: /pages/000b0101020208 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# GridItem + +网格容器中单项内容容器。 + +## 权限列表 + +无 + +## 子组件 + +可以包含子组件。 + +## 接口 + +GridItem\(\) + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

rowStart

+

number

+

-

+

用于指定当前元素起始行号。

+

rowEnd

+

number

+

-

+

用于指定当前元素终点行号。

+

columnStart

+

number

+

-

+

用于指定当前元素起始列号。

+

columnEnd

+

number

+

-

+

用于指定当前元素终点列号。

+

forceRebuild

+

boolean

+

false

+

用于设置在触发组件build时是否重新创建此节点。

+
+ +## 示例 + +``` +@Entry +@Component +struct GridItemExample { + @State numbers: string[] = Array.apply(null, Array(16)).map(function (item, i) { return i.toString() }) + + build() { + Column() { + Grid() { + GridItem() { + Text('4') + .fontSize(16).backgroundColor(0xFAEEE0) + .width('100%').height('100%').textAlign(TextAlign.Center) + }.rowStart(1).rowEnd(4) + + ForEach(this.numbers, (item) => { + GridItem() { + Text(item) + .fontSize(16).backgroundColor(0xF9CF93) + .width('100%').height('100%').textAlign(TextAlign.Center) + }.forceRebuild(false) + }, item => item) + + GridItem() { + Text('5') + .fontSize(16).backgroundColor(0xDBD0C0) + .width('100%').height('100%').textAlign(TextAlign.Center) + }.columnStart(1).columnEnd(5) + } + .columnsTemplate('1fr 1fr 1fr 1fr 1fr') + .rowsTemplate('1fr 1fr 1fr 1fr 1fr') + .width('90%').height(300) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/griditem.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/10.List.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/10.List.md" new file mode 100644 index 0000000000000000000000000000000000000000..75b60892a195b89752f7d55bd3f177a28ba444b7 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/10.List.md" @@ -0,0 +1,265 @@ +--- +title: List +permalink: /pages/000b0101020209 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# List + +列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本。 + +## 权限列表 + +无 + +## 子组件 + +包含[ListItem](/pages/000b010102020a)子组件。 + +## 接口 + +List\(options?: \{ space?: number, initialIndex?: number \}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

space

+

number

+

+

0

+

列表项间距。

+

initialIndex

+

number

+

+

0

+

设置当前List初次加载时视口起始位置显示的item,即显示第一个item,如设置的序号超过了最后一个item的序号,则设置不生效。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

listDirection

+

Axis

+

Vertical

+

设置List组件排列方向参照Axis枚举说明。

+

divider

+

{

+

strokeWidth: Length,

+

color?:Color,

+

startMargin?: Length,

+

endMargin?: Length

+

}

+

-

+

用于设置ListItem分割线样式,默认无分割线。

+

strokeWidth: 分割线的线宽。

+

color: 分割线的颜色。

+

startMargin: 分割线距离列表侧边起始端的距离。

+

endMargin: 分割线距离列表侧边结束端的距离。

+

editMode

+

boolean

+

false

+

声明当前List组件是否处于可编辑模式。

+

edgeEffect

+

EdgeEffect

+

Spring

+

滑动效果,目前支持的滑动效果参见EdgeEffect的枚举说明。

+

chainAnimation

+

boolean

+

false

+

用于设置当前list是否启用链式联动动效,开启后列表滑动以及顶部和底部拖拽时会有链式联动的效果。链式联动效果:list内的list-item间隔一定距离,在基本的滑动交互行为下,主动对象驱动从动对象进行联动,驱动效果遵循弹簧物理动效。

+
  • false:不启用链式联动。
  • true:启用链式联动。
+
+ +- Axis枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Vertical

+

纵向排列。

+

Horizontal

+

横向排列。

+
+ + +- EdgeEffect枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Spring

+

弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹。

+

None

+

滑动到边缘后无效果。

+
+ + +## 事件 + + + + + + + + + + + + + +

名称

+

功能描述

+

onItemDelete(index: number) => boolean

+

列表项删除时触发。

+

onScrollIndex(firstIndex: number, lastIndex: number) => void

+

当前列表显示的起始位置和终止位置发生变化时触发。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>List使能可编辑模式需配合事件方法onItemDelete和ListItem的editable属性,即可编辑模式实现删除列表项功能,需满足下列三个条件: +>- 配置editMode\(true\); +>- 绑定onItemDelete回调,回调中return true; +>- ListItem属性editable\(true\)。 + +## 示例 + +``` +@Entry +@Component +struct ListExample { + private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + @State editFlag: boolean = false + + build() { + Stack({ alignContent: Alignment.TopStart }) { + Column() { + List({ space: 20, initialIndex: 0 }) { + ForEach(this.arr, (item) => { + ListItem() { + Text('' + item) + .width('100%').height(100).fontSize(16) + .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF) + }.editable(true) + }, item => item) + } + .listDirection(Axis.Vertical) // 排列方向 + .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线 + .edgeEffect(EdgeEffect.None) // 滑动到边缘无效果 + .chainAnimation(false) // 联动特效关闭 + .onScrollIndex((firstIndex: number, lastIndex: number) => { + console.info('first' + firstIndex) + console.info('last' + lastIndex) + }) + .editMode(this.editFlag) + .onItemDelete((index: number) => { + console.info(this.arr[index] + 'Delete') + this.arr.splice(index, 1) + console.info(JSON.stringify(this.arr)) + this.editFlag = false + return true + }).width('90%') + }.width('100%') + + Button('edit list') + .onClick(() => { + this.editFlag = !this.editFlag + }).margin({ top: 5, left: 20 }) + }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/list.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/11.ListItem.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/11.ListItem.md" new file mode 100644 index 0000000000000000000000000000000000000000..41e84f7648adc656d4c813d769504344c0dbb54d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/11.ListItem.md" @@ -0,0 +1,129 @@ +--- +title: ListItem +permalink: /pages/000b010102020a +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# ListItem + +用来展示列表具体item,宽度默认充满List组件,必须配合List来使用。 + +## 权限列表 + +无 + +## 子组件 + +可以包含单个子组件。 + +## 接口 + +ListItem\(\) + +## 属性 + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

sticky

+

Sticky

+

None

+

设置ListItem吸顶效果,参见Sticky枚举描述。

+

editable

+

boolean

+

false

+

声明当前ListItem元素是否可编辑,进入编辑模式后可删除。

+
+ +- Sticky枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

None

+

无吸顶效果。

+

Normal

+

当前item吸顶,滑动消失。

+
+ + +## 示例 + +``` +@Entry +@Component +struct ListItemExample { + private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + @State editFlag: boolean = false + + build() { + Column() { + List({ space: 20, initialIndex: 0 }) { + ListItem() { + Text('sticky:Normal , click me edit list') + .width('100%').height(40).fontSize(12).fontColor(0xFFFFFF) + .textAlign(TextAlign.Center).backgroundColor(0x696969) + .onClick(() => { + this.editFlag = !this.editFlag + }) + }.sticky(Sticky.Normal) + + ForEach(this.arr, (item) => { + ListItem() { + Text('' + item) + .width('100%').height(100).fontSize(16) + .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF) + }.editable(this.editFlag) + }, item => item) + } + .editMode(true) + .onItemDelete((index: number) => { + console.info(this.arr[index - 1] + 'Delete') + this.arr.splice(index - 1,1) + this.editFlag = false + return true + }).width('90%') + }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/ListItem.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/12.Navigator.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/12.Navigator.md" new file mode 100644 index 0000000000000000000000000000000000000000..9d3299f5fbd3e26f5860064117ffa649ce3d429b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/12.Navigator.md" @@ -0,0 +1,200 @@ +--- +title: Navigator +permalink: /pages/000b010102020b +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Navigator + +路由容器组件,提供路由跳转能力。 + +## 权限列表 + +无 + +## 子组件 + +可以包含子组件。 + +## 接口 + +Navigator\(value?: \{target: string, type?: NavigationType\}\) + +创建路由组件。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

target

+

string

+

+

-

+

指定跳转目标页面的路径。

+

type

+

NavigationType

+

+

Push

+

指定路由方式。

+
+ +- NavigationType枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Push

+

跳转到应用内的指定页面。

+

Replace

+

用应用内的某个页面替换当前页面,并销毁被替换的页面。

+

Back

+

返回上一页面或指定的页面。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + +

名称

+

参数

+

默认值

+

描述

+

active

+

boolean

+

-

+

当前路由组件是否处于激活状态,处于激活状态时,会生效相应的路由操作。

+

params

+

Object

+

undefined

+

跳转时要同时传递到目标页面的数据,可在目标页面使用router.getParams()获得。

+
+ +## 示例 + +``` +// Navigator Page +@Entry +@Component +struct NavigatorExample { + @State active: boolean = false + @State Text: string = 'news' + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) { + Navigator({ target: 'pages/container/navigator/Detail', type: NavigationType.Push }) { + Text('Go to ' + this.Text + ' page').width('100%').textAlign(TextAlign.Center) + }.params({ text: this.Text }) + + Navigator() { + Text('Back to previous page').width('100%').textAlign(TextAlign.Center) + }.active(this.active) + .onClick(() => { + this.active = true + }) + }.height(150).width(350).padding(35) + } +} +``` + +``` +// Detail Page +import router from '@system.router' + +@Entry +@Component +struct DetailExample { + @State text: string = router.getParams().text + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) { + Navigator({ target: 'pages/container/navigator/Back', type: NavigationType.Push }) { + Text('Go to back page').width('100%').height(20) + } + + Text('This is ' + this.text + ' page').width('100%').textAlign(TextAlign.Center) + } + .width('100%').height(200).padding({ left: 35, right: 35, top: 35 }) + } +} + +``` + +``` +// Back Page +@Entry +@Component +struct BackExample { + build() { + Column() { + Navigator({ target: 'pages/container/navigator/Navigator', type: NavigationType.Back }) { + Text('Return to Navigator Page').width('100%').textAlign(TextAlign.Center) + } + }.width('100%').height(200).padding({ left: 35, right: 35, top: 35 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Navigator.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/13.Panel.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/13.Panel.md" new file mode 100644 index 0000000000000000000000000000000000000000..a784ae9d16c3a970b588a880a6ab5906bee2219d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/13.Panel.md" @@ -0,0 +1,238 @@ +--- +title: Panel +permalink: /pages/000b010102020c +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Panel + +可滑动面板。提供一种轻量的内容展示的窗口,可方便的在不同尺寸中切换,属于弹出式组件。 + +## 权限列表 + +无 + +## 子组件 + +可以包含子组件。 + +## 接口 + +Panel\(value:\{show:boolean\}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

show

+

boolean

+

+

-

+

控制Panel显示或隐藏。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

type

+

PanelType

+

Foldable

+

设置可滑动面板的类型。

+

mode

+

PanelMode

+

-

+

设置可滑动面板的初始状态。

+

dragBar

+

boolean

+

true

+

设置是否存在dragbar,true表示存在,false表示不存在。

+

fullHeight

+

Length

+

-

+

指定PanelMode.Full状态下的高度。

+

halfHeight

+

Length

+

-

+

指定PanelMode.Half状态下的高度,默认为屏幕尺寸的一半。

+

miniHeight

+

Length

+

-

+

指定PanelMode.Mini状态下的高度。

+
+ +- PanelType枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Minibar

+

提供minibar和类全屏展示切换效果。

+

Foldable

+

内容永久展示类,提供大(类全屏)、中(类半屏)、小三种尺寸展示切换效果。

+

Temporary

+

内容临时展示区,提供大(类全屏)、中(类半屏)两种尺寸展示切换效果。

+
+ + +- PanelMode枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Mini

+

类型为minibar和foldable时,为最小状态;类型为temporary,则不生效。

+

Half

+

类型为foldable和temporary时,为类半屏状态;类型为minibar,则不生效。

+

Full

+

类全屏状态。

+
+ + +## 事件 + + + + + + + + + + +

名称

+

功能描述

+

onChange(callback: (width: number, height: number, mode: PanelMode) => void)

+

当可滑动面板发生状态变化时触发, 返回的height值为内容区高度值,当dragbar属性为true时,panel本身的高度值为dragbar高度加上内容区高度。

+
+ +## 示例 + +``` +@Entry +@Component +struct PanelExample { + @State show: boolean = false + + build() { + Column() { + Text('2021-09-30 Today Calendar: 1.afternoon......Click for details') + .width('90%').height(50).borderRadius(10) + .backgroundColor(0xFFFFFF).padding({ left: 20 }) + .onClick(() => { + this.show = !this.show + }) + Panel(this.show) { // 展示日程 + Column() { + Text('Today Calendar') + Divider() + Text('1. afternoon 4:00 The project meeting') + } + } + .type(PanelType.Foldable).mode(PanelMode.Half) + .dragBar(true) // 默认开启 + .halfHeight(500) // 默认一半 + .onChange((value: any) => { + console.info(`width:${value.width},height:${value.height},mode:${value.mode}`) + }) + }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Panel.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/14.Row.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/14.Row.md" new file mode 100644 index 0000000000000000000000000000000000000000..9b28da2e002b38b25b5852353ce6b8592f9e008d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/14.Row.md" @@ -0,0 +1,144 @@ +--- +title: Row +permalink: /pages/000b010102020d +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Row + +沿水平方向布局容器。 + +## 权限列表 + +无 + +## 子组件 + +可以包含子组件。 + +## 接口 + +Row\(options?: \{ space?: Length \}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

space

+

Length

+

+

0

+

横向布局元素间距。

+
+ + +## 属性 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

alignItems

+

VerticalAlign

+

Center

+

在垂直方向上子组件的对齐格式。

+
+ +- VerticalAlign枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Top

+

顶部对齐。

+

Center

+

居中对齐,默认对齐方式。

+

Bottom

+

底部对齐。

+
+ + +## 示例 + +``` +@Entry +@Component +struct RowExample { + build() { + Column({ space: 5 }) { + Text('space').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row({ space: 20 }) { + Row().width(150).height(50).backgroundColor(0xAFEEEE) + Row().width(150).height(50).backgroundColor(0x00FFFF) + }.width(321).height(52).border({ width: 1 }) + + Text('alignItems(Bottom)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row() { + Row().width('50%').height(50).backgroundColor(0xAFEEEE) + Row().width('50%').height(50).backgroundColor(0x00FFFF) + }.alignItems(VerticalAlign.Bottom).width('90%').height(100).border({ width: 1 }) + + Text('alignItems(Top)').fontSize(9).fontColor(0xCCCCCC).width('90%') + Row() { + Row().width('50%').height(50).backgroundColor(0xAFEEEE) + Row().width('50%').height(50).backgroundColor(0x00FFFF) + }.alignItems(VerticalAlign.Top).width('90%').height(100).border({ width: 1 }) + }.width('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/row.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/15.RowSplit.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/15.RowSplit.md" new file mode 100644 index 0000000000000000000000000000000000000000..e9706cd11e4df70fea06acd83ec529c72e85373f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/15.RowSplit.md" @@ -0,0 +1,74 @@ +--- +title: RowSplit +permalink: /pages/000b010102020e +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# RowSplit + +将子组件横向布局,并在每个子组件之间插入一根纵向的分割线。 + +## 子组件 + +可以包含子组件 + +## 接口 + +RowSplit\(\) + +## 属性 + + + + + + + + + + + + +

名称

+

参数类型

+

描述

+

resizeable

+

boolean

+

分割线是否可拖拽,默认为false。

+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>RowSplit的分割线最小能拖动到刚好包含子组件。 + +## 示例 + +``` +@Entry +@Component +struct RowSplitExample { + build() { + Column() { + Text('The secant line can be dragged').fontSize(9).fontColor(0xCCCCCC).width('90%') + RowSplit() { + Text('1').width('10%').height(100).backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + Text('2').width('10%').height(100).backgroundColor(0xD2B48C).textAlign(TextAlign.Center) + Text('3').width('10%').height(100).backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + Text('4').width('10%').height(100).backgroundColor(0xD2B48C).textAlign(TextAlign.Center) + Text('5').width('10%').height(100).backgroundColor(0xF5DEB3).textAlign(TextAlign.Center) + } + .resizeable(true) // 可拖动 + .width('90%').height(100) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/RowSplit.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/16.Scroll.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/16.Scroll.md" new file mode 100644 index 0000000000000000000000000000000000000000..95c9ca5f0dc7120192dbd34c9f5866377b5e3991 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/16.Scroll.md" @@ -0,0 +1,398 @@ +--- +title: Scroll +permalink: /pages/000b010102020f +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Scroll + +可滚动的容器组件,当子组件的布局尺寸超过父组件的视口时,内容可以滚动。 + +## 权限列表 + +无 + +## 子组件 + +支持单个子组件。 + +## 接口 + +Scroll\(scroller?: Scroller\) + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

scrollable

+

ScrollDirection

+

Vertical

+

设置滚动方法。

+

scrollBar

+

BarState

+

Auto

+

设置滚动条状态。

+

scrollBarColor

+

Color

+

-

+

设置滚动条的颜色。

+

scrollBarWidth

+

Length

+

-

+

设置滚动条的宽度。

+
+ +- ScrollDirection枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Horizontal

+

仅支持水平方向滚动。

+

Vertical

+

仅支持竖直方向滚动。

+

None

+

不可滚动。

+
+ + +## Scroller + +可滚动容器组件的控制器,可以将此组件绑定至容器组件,然后通过它控制容器组件的滚动,目前支持绑定到List和Scroll组件上。 + +### 导入对象 + +``` +scroller: Scroller = new Scroller() +``` + +### scroller.scrollTo + +scrollTo\(value: \{ xOffset: number | string, yOffset: number | string, animation?: \{ duration: number, curve: Curve \} \}\): void + +滑动到指定位置。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

xOffset

+

Length

+

+

-

+

水平滑动偏移。

+

yOffset

+

Length

+

+

-

+

竖直滑动偏移。

+

animation

+

{

+

duration: number,

+

curve: Curve | CubicBezier | SpringCurve

+

}

+

+
  

动画配置:

+
  • duration: 滚动时长设置。
  • curve: 滚动曲线设置。
+
+ + +### scroller.scrollEdge + +scrollEdge\(value: Edge\): void + +滚动到容器边缘。 + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

value

+

Edge

+

+

-

+
 
+ + +### scroller.scrollPage + +scrollPage\(value: \{ next: boolean, direction?: Axis \}\): void + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

next

+

boolean

+

+

-

+

是否向下翻页。

+
+ + +### scroller.currentOffset + +scroller.currentOffset\(\): Object + +返回当前的滚动偏移量。 + +- 返回值 + + + + + + + + + + +

类型

+

描述

+

{

+

xOffset: number,

+

yOffset: number

+

}

+

xOffset: 水平滑动偏移;

+

yOffset: 竖直滑动偏移。

+
+ + +### scroller.scrollToIndex + +scroller.scrollToIndex\(value: number\): void + +滑动到指定Index。 + +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>仅支持list组件。 + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

value

+

number

+

+

-

+

要滑动到的列表项在列表中的索引值。

+
+ + +## 事件 + + + + + + + + + + + + + + + + +

名称

+

功能描述

+

onScroll(xOffset: number, yOffset: number) => void

+

滚动事件回调, 返回滚动时水平、竖直方向偏移量。

+

onScrollEdge(side: Edge) => void

+

滚动到边缘事件回调。

+

onScrollEnd() => void

+

滚动已经停止。

+
+ +## 示例 + +``` +@Entry +@Component +struct ScrollExample { + scroller: Scroller = new Scroller() + private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + + build() { + Stack({ alignContent: Alignment.TopStart }) { + Scroll(this.scroller) { + Column() { + ForEach(this.arr, (item) => { + Text(item.toString()) + .width('90%').height(150).backgroundColor(0xFFFFFF) + .borderRadius(15).fontSize(16).textAlign(TextAlign.Center) + .margin({ top: 10 }) + }, item => item) + }.width('100%') + } + .scrollable(ScrollDirection.Vertical).scrollBar(BarState.On) + .scrollBarColor(Color.Gray).scrollBarWidth(30) + .onScroll((xOffset: number, yOffset: number) => { + console.info(xOffset + ' ' + yOffset) + }) + .onScrollEdge((side: Edge) => { + console.info('To the edge') + }) + .onScrollEnd(() => { + console.info('Scroll Stop') + }) + + Button('scroll 100') + .onClick(() => { // 点击后下滑100.0距离 + this.scroller.scrollTo({ xOffset: 0, yOffset: this.scroller.currentOffset().yOffset + 100 }) + }) + .margin({ top: 10, left: 20 }) + Button('back top') + .onClick(() => { // 点击后回到顶部 + this.scroller.scrollEdge(Edge.Top) + }) + .margin({ top: 60, left: 20 }) + Button('next page') + .onClick(() => { // 点击后下滑到底部 + this.scroller.scrollPage({ next: true }) + }) + .margin({ top: 110, left: 20 }) + }.width('100%').height('100%').backgroundColor(0xDCDCDC) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/scroll.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/17.Stack.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/17.Stack.md" new file mode 100644 index 0000000000000000000000000000000000000000..f7989c1f891a271918588e18fe3ceca96b70ff52 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/17.Stack.md" @@ -0,0 +1,76 @@ +--- +title: Stack +permalink: /pages/000b0101020210 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Stack + +堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。 + +## 权限列表 + +无 + +## 子组件 + +可以包含子组件。 + +## 接口 + +Stack\(options?: \{ alignContent?: Alignment \}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

alignContent

+

Alignment

+

+

Center

+

设置子组件在容器内的对齐方式。

+
+ + +## 示例 + +``` +@Entry +@Component +struct StackExample { + build() { + Stack({ alignContent: Alignment.Bottom }) { + Text('First child, show in bottom').width('90%').height('100%').backgroundColor(0xd2cab3).align(Alignment.Top) + Text('Second child, show in top').width('70%').height('60%').backgroundColor(0xc1cbac).align(Alignment.Top) + }.width('100%').height(150).margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/stack.jpg) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/18.Swiper.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/18.Swiper.md" new file mode 100644 index 0000000000000000000000000000000000000000..9119b4888512bd51f9a51881e82bea8863cec309 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/18.Swiper.md" @@ -0,0 +1,234 @@ +--- +title: Swiper +permalink: /pages/000b0101020211 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Swiper + +滑动容器,提供切换子组件显示的能力。 + +## 权限列表 + +无 + +## 子组件 + +可以包含子组件。 + +## 接口 + +Swiper\(value:\{controller?: SwiperController\}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

controller

+

SwiperController

+

+

null

+

给组件绑定一个控制器,用来控制组件翻页。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

index

+

number

+

0

+

设置当前在容器中显示的子组件的索引值。

+

autoPlay

+

boolean

+

false

+

子组件是否自动播放,自动播放状态下,导航点不可操作。

+

interval

+

number

+

3000

+

使用自动播放时播放的时间间隔,单位为毫秒。

+

indicator

+

boolean

+

true

+

是否启用导航点指示器。

+

loop

+

boolean

+

true

+

是否开启循环。

+

duration

+

number

+

400

+

子组件切换的动画时长,单位为毫秒。

+

vertical

+

boolean

+

false

+

是否为纵向滑动。

+

itemSpace

+

Length

+

0

+

设置子组件与子组件之间间隙。

+
+ +### SwiperController + +Swiper容器组件的控制器,可以将此对象绑定至Swiper组件,然后通过它控制翻页。 + + + + + + + + + + + + + +

接口名称

+

功能描述

+

showNext():void;

+

翻至下一页。

+

showPrevious():void;

+

翻至上一页。

+
+ +## 事件 + + + + + + + + + + +

名称

+

功能描述

+

onChange( index: number) => void

+

当前显示的组件索引变化时触发该事件。

+
+ +## 示例 + +``` +@Entry +@Component +struct SwiperExample { + private swiperController: SwiperController = new SwiperController() + + build() { + Column({ space: 5 }) { + Swiper(this.swiperController) { + Text('1').width('90%').height(160).backgroundColor(0xAFEEEE).textAlign(TextAlign.Center).fontSize(20) + Text('2').width('90%').height(160).backgroundColor(0xAFEEEE).textAlign(TextAlign.Center).fontSize(20) + Text('3').width('90%').height(160).backgroundColor(0xAFEEEE).textAlign(TextAlign.Center).fontSize(20) + Text('4').width('90%').height(160).backgroundColor(0xAFEEEE).textAlign(TextAlign.Center).fontSize(20) + Text('5').width('90%').height(160).backgroundColor(0xAFEEEE).textAlign(TextAlign.Center).fontSize(20) + } + .index(1) + .autoPlay(true) + .interval(4000) + .indicator(true) // 默认开启指示点 + .loop(false) // 默认开启循环播放 + .duration(1000) + .vertical(false) // 默认横向切换 + .itemSpace(0) + .onChange((index: number) => { + console.info(index.toString()) + }) + + Flex({ justifyContent: FlexAlign.SpaceAround }) { + Button('next') + .onClick(() => { + this.swiperController.showNext() + }) + Button('preview') + .onClick(() => { + this.swiperController.showPrevious() + }) + } + }.margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/swiper.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/19.Tabs.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/19.Tabs.md" new file mode 100644 index 0000000000000000000000000000000000000000..d20cfdc501e689b007046d9600a552193ead30ad --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/19.Tabs.md" @@ -0,0 +1,296 @@ +--- +title: Tabs +permalink: /pages/000b0101020212 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Tabs + +一种可以通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。 + +## 支持设备 + + + + + + + + + + + + + + +

手机

+

平板

+

智慧屏

+

智能穿戴

+

支持

+

支持

+

不支持

+

不支持

+
+ +## 权限列表 + +无 + +## 子组件 + +包含子组件[TabContent](/pages/000b0101020213)。 + +## 接口说明 + +Tabs\(value: \{barPosition?: BarPosition, index?: number, controller?: [TabsController](#section104288910399)\}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

barPosition

+

BarPosition

+

+

Start

+

指定页签位置来创建Tabs容器组件。

+

index

+

number

+

+

0

+

指定初次初始页签索引。

+

controller

+

TabsController

+

+
  

设置Tabs控制器。

+
+ +- BarPosition枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Start

+

vertical属性方法设置为true时,页签位于容器左侧;vertical属性方法设置为false时,页签位于容器顶部。

+

End

+

vertical属性方法设置为true时,页签位于容器右侧;vertical属性方法设置为false时,页签位于容器底部。

+
+ + +### TabsController + +Tabs组件的控制器,用于控制Tabs组件进行页签切换。 + + + + + + + + + + +

接口名称

+

功能描述

+

changeIndex(value: number): void

+

控制Tabs切换到指定页签,index: 页签在Tabs里的索引值,索引值从0开始。

+
+ +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

vertical

+

boolean

+

是否为纵向Tab,默认为false。

+

是否为纵向Tab,默认为false。

+

scrollable

+

boolean

+

是否可以通过左右滑动进行页面切换,默认为true。

+

是否可以通过左右滑动进行页面切换,默认为true。

+

barMode

+

BarMode

+

TabBar布局模式。

+

TabBar布局模式。

+

barWidth

+

number

+

TabBar的宽度值,不设置时使用系统主题中的默认值。

+

TabBar的宽度值,不设置时使用系统主题中的默认值。

+

barHeight

+

number

+

TabBar的高度值,不设置时使用系统主题中的默认值。

+

TabBar的高度值,不设置时使用系统主题中的默认值

+

animationDuration

+

number

+

200

+

TabContent滑动动画时长。

+
+ +- BarMode枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Scrollable

+

TabBar使用实际布局宽度, 超过总长度后可滑动。

+

Fixed

+

所有TabBar平均分配宽度。

+
+ + +## 事件 + + + + + + + + + + +

名称

+

功能描述

+

onChange(callback: (index: number) => void)

+

Tab页签切换后触发的事件。

+
+ +## 示例 + +``` +@Entry +@Component +struct TabsExample { + private controller: TabsController = new TabsController() + + build() { + Column() { + Tabs({ barPosition: BarPosition.Start, index: 1, controller: this.controller }) { + TabContent() { + Column().width('100%').height('100%').backgroundColor(Color.Pink) + }.tabBar('pink') + + TabContent() { + Column().width('100%').height('100%').backgroundColor(Color.Yellow) + }.tabBar('yellow') + + TabContent() { + Column().width('100%').height('100%').backgroundColor(Color.Blue) + }.tabBar('blue') + + TabContent() { + Column().width('100%').height('100%').backgroundColor(Color.Green) + }.tabBar('green') + } + .vertical(true).scrollable(true).barMode(BarMode.Fixed) + .barWidth(70).barHeight(150).animationDuration(400) + .onChange((index: number) => { + console.info(index.toString()) + }) + .width('90%').backgroundColor(0xF5F5F5) + }.width('100%').height(150).margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Tabs.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/20.TabContent.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/20.TabContent.md" new file mode 100644 index 0000000000000000000000000000000000000000..dfbfcbf9fe527ccedfc156aa9d21212ede5b505f --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/03.\345\256\271\345\231\250\347\273\204\344\273\266/20.TabContent.md" @@ -0,0 +1,67 @@ +--- +title: TabContent +permalink: /pages/000b0101020213 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# TabContent + +仅在Tabs中使用,对应一个切换页签的内容视图。 + +## 权限列表 + +无 + +## 子组件 + +支持单个子组件。 + +## 接口 + +TabContent\(\) + +## 属性 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

tabBar

+

string | {

+

icon?: string,

+

text?: string

+

}

+

-

+

设置TabBar上显示内容。

+
说明:

如果icon采用svg格式图源,则要求svg图源删除其自有宽高属性值。如采用带有自有宽高属性的svg图源,icon大小则是svg本身内置的宽高属性值大小。

+
+
+ +>![](/images/application-dev/public_sys-resources/icon-note.gif) **说明:** +>- TabContent组件不支持设置通用宽度属性,其宽度默认撑满Tabs父组件。 +>- TabContent组件不支持设置通用高度属性,其高度由Tabs父组件高度与TabBar组件高度决定。 + +## 示例 + +见[Tabs](/pages/000b0101020212#section1131255321814)。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/01.Circle.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/01.Circle.md" new file mode 100644 index 0000000000000000000000000000000000000000..f3a61f8b02a3b64372cb9a7e22adac4070db511b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/01.Circle.md" @@ -0,0 +1,154 @@ +--- +title: Circle +permalink: /pages/000b0101020300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Circle + +圆形绘制组件。 + +## 子组件 + +无 + +## 接口 + +Circle\(options?: \{width: Length, height: Length\}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

options

+

Object

+

+

-

+

options参数说明

+
+ +- options参数说明 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

width

+

Length

+

+

-

+

宽度。

+

height

+

Length

+

+

-

+

高度。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

width

+

Length

+

0

+

+

圆所在矩形的宽度。

+

height

+

Length

+

0

+

+

圆所在矩形的高度。

+
+ +## 示例 + +``` +@Entry +@Component +struct CircleExample { + build() { + Flex({ justifyContent: FlexAlign.SpaceAround }) { + // 绘制一个直径为150的圆 + Circle({ width: 150, height: 150 }) + // 绘制一个直径为150的圆 + Circle().width(150).height(150) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/circle.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/02.Ellipse.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/02.Ellipse.md" new file mode 100644 index 0000000000000000000000000000000000000000..98eab4bb9c3d0c74e3a7c17f7c843bc82c496dcd --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/02.Ellipse.md" @@ -0,0 +1,154 @@ +--- +title: Ellipse +permalink: /pages/000b0101020301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Ellipse + +椭圆绘制组件。 + +## 子组件 + +无 + +## 接口 + +ellipse\(options?: \{width: Lenght, height: Length\}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

options

+

Object

+

+

-

+

options参数说明

+
+ +- options参数说明 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

width

+

Length

+

+

-

+

宽度。

+

height

+

Length

+

+

-

+

高度。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

width

+

Length

+

0

+

+

椭圆所在矩形的宽度。

+

height

+

Length

+

0

+

+

椭圆所在矩形的高度。

+
+ +## 示例 + +``` +@Entry +@Component +struct EllipseExample { + build() { + Flex({ justifyContent: FlexAlign.SpaceAround }) { + // 在一个 150 * 70 的矩形框中绘制一个椭圆 + Ellipse({ width: 150, height: 80 }) + // 在一个 150 * 70 的矩形框中绘制一个椭圆 + Ellipse().width(150).height(80) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/ellipse-18.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/03.Line.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/03.Line.md" new file mode 100644 index 0000000000000000000000000000000000000000..d9eec4c54708a0800fdd7359c0bf82ca7856507d --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/03.Line.md" @@ -0,0 +1,174 @@ +--- +title: Line +permalink: /pages/000b0101020302 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Line + +直线绘制组件。 + +## 子组件 + +无 + +## 接口 + +Line\(options?: \{width: Lenght, height: Length\}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

options

+

Object

+

+

-

+

options参数说明

+
+ +- options参数说明 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

width

+

Length

+

+

-

+

宽度。

+

height

+

Length

+

+

-

+

高度。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

width

+

Length

+

0

+

+

直线所在矩形的宽度。

+

height

+

Length

+

0

+

+

直线所在矩形的高度。

+

startPoint

+

Point

+

[0, 0]

+

+

直线起点坐标(相对坐标)。

+

endPoint

+

Point

+

[0, 0]

+

+

直线终点坐标(相对坐标)。

+
+ +## 示例 + +``` +@Entry +@Component +struct LineExample { + build() { + Column() { + Line({ width: 50, height: 100 }).startPoint([0, 0]).endPoint([50, 100]) + Line().width(200).height(200).startPoint([50, 50]).endPoint([150, 150]) + }.margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/line.jpg) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/04.Polyline.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/04.Polyline.md" new file mode 100644 index 0000000000000000000000000000000000000000..1311f8282a5d2d37be43b2d565ea74a29105a9b9 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/04.Polyline.md" @@ -0,0 +1,167 @@ +--- +title: Polyline +permalink: /pages/000b0101020303 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Polyline + +折线绘制组件。 + +## 子组件 + +无 + +## 接口 + +Polyline\(options?: \{width: Lenght, height: Length\}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

options

+

Object

+

+

-

+

options参数说明

+
+ +- options参数说明 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

width

+

Length

+

+

-

+

宽度。

+

height

+

Length

+

+

-

+

高度。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

width

+

Length

+

0

+

+

折线所在矩形的宽度。

+

height

+

Length

+

0

+

+

折线所在矩形的高度。

+

points

+

Array<Point>

+

-

+

+

折线经过坐标点列表。

+
+ +## 示例 + +``` +@Entry +@Component +struct PolylineExample { + build() { + Column({ space: 5 }) { + Flex({ justifyContent: FlexAlign.SpaceAround }) { + // 在 100 * 100 的矩形框中绘制一段折线,起点(0, 0),经过(20,60),到达终点(100, 100) + Polyline({ width: 100, height: 100 }).points([[0, 0], [20, 60], [100, 100]]) + // 在 100 * 100 的矩形框中绘制一段折线,起点(0, 0),经过(0,100),到达终点(100, 100) + Polyline().width(100).height(100).points([[0, 0], [0, 100], [100, 100]]) + }.width('100%') + }.margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/polyline.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/05.Polygon.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/05.Polygon.md" new file mode 100644 index 0000000000000000000000000000000000000000..1c78ca86cdb070b4db27bdadf778d2148bebc8db --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/05.Polygon.md" @@ -0,0 +1,169 @@ +--- +title: Polygon +permalink: /pages/000b0101020304 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Polygon + +多边形绘制组件。 + +## 子组件 + +无 + +## 接口 + +Polygon\(value:\{options?: \{width: Lenght, height: Length\}\}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

options

+

Object

+

+

-

+

options参数说明

+
+ +- options参数说明 + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

width

+

Length

+

+

-

+

宽度。

+

height

+

Length

+

+

-

+

高度。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

width

+

Length

+

0

+

+

多边形所在矩形的宽度。

+

height

+

Length

+

0

+

+

多边形所在矩形的高度。

+

points

+

Array<Point>

+

-

+

+

多边形的顶点坐标列表。

+
+ +## 示例 + +``` +@Entry +@Component +struct PolygonExample { + build() { + Column({ space: 5 }) { + Flex({ justifyContent: FlexAlign.SpaceAround }) { + // 在 100 * 100 的矩形框中绘制一个三角形,起点(0, 0),经过(50, 100),终点(100, 0) + Polygon({ width: 100, height: 100 }).points([[0, 0], [50, 100], [100, 0]]) + // 在 100 * 100 的矩形框中绘制一个四边形,起点(0, 0),经过(0, 100)和(100, 100),终点(100, 0) + Polygon().width(100).height(100).points([[0, 0], [0, 100], [100, 100], [100, 0]]) + // 在 100 * 100 的矩形框中绘制一个五边形,起点(50, 0),依次经过(0, 50)、(20, 100)和(80, 100),终点(100, 50) + Polygon().width(100).height(100).points([[50, 0], [0, 50], [20, 100], [80, 100], [100, 50]]) + }.width('100%') + }.margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/polygon.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/06.Path.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/06.Path.md" new file mode 100644 index 0000000000000000000000000000000000000000..9d8944ae1fb4c843390d1fb5a0ae09a66ab5351c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/06.Path.md" @@ -0,0 +1,122 @@ +--- +title: Path +permalink: /pages/000b0101020305 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Path + +路径绘制组件。 + +## 子组件 + +无 + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

width

+

Length

+

0

+

+

路径所在矩形的宽度。

+

height

+

Length

+

0

+

+

路径所在矩形的高度。

+

commands

+

string

+

''

+

+

路径绘制的命令字符串。

+
+ +支持的绘制命令如下: + +- M = moveto +- L = lineto +- H = horizontal lineto +- V = vertical lineto +- C = curveto +- S = smooth curveto +- Q = quadratic Belzier curve +- T = smooth quadratic Belzier curveto +- A = elliptical Arc +- Z = closepath + +如 commands\('M0 20 L50 50 L50 100 Z'\)定义了一条路径,开始于位置(0,20),到达位置(50,50)后再到(50,100),最后在(0,20)处关闭路径。 + +## 示例 + +``` +@Entry +@Component +struct PathExample { + build() { + Column({ space: 5 }) { + Text('Straight line').fontSize(9).fontColor(0xCCCCCC).width('90%') + Path().width(300).height(10).commands('M0 0 L900 0').stroke(Color.Black).strokeWidth(3) + + Text('Straight line graph').fontSize(9).fontColor(0xCCCCCC).width('90%') + Flex({ justifyContent: FlexAlign.SpaceAround }) { + // 先后执行MoveTo(150, 0), LineTo(300, 300), LineTo(0, 300), ClosePath() + Path().width(100).height(100).commands('M150 0 L300 300 L0 300 Z') + // 先后执行MoveTo(0, 0), HorizontalLineto(300), VerticalLineto(300), HorizontalLineto(0), ClosePath() + Path().width(100).height(100).commands('M0 0 H300 V300 H0 Z') + // 先后执行MoveTo(150, 0), LineTo(0, 150), LineTo(60, 300), LineTo(240, 300), LineTo(300, 150), ClosePath() + Path().width(100).height(100).commands('M150 0 L0 150 L60 300 L240 300 L300 150 Z') + }.width('100%') + + Text('Curve graphics').fontSize(9).fontColor(0xCCCCCC).width('90%') + Flex({ justifyContent: FlexAlign.SpaceAround }) { + // 先后执行MoveTo(0, 300),(150, 0)(300, 300)两点之间画曲线, ClosePath() + Path().width(100).height(100).commands("M0 300 S150 0 300 300 Z") + // 先后执行MoveTo(0, 150),(0, 150)(150, 0)(300, 150)三点之间依次画曲线, LineTo(150, 300),ClosePath() + Path().width(100).height(100).commands('M0 150 C0 150 150 0 300 150 L150 300 Z') + } + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/path.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/07.Rect.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/07.Rect.md" new file mode 100644 index 0000000000000000000000000000000000000000..2f46d3a053695de3099ea3b75663ebba01cd57bf --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/07.Rect.md" @@ -0,0 +1,227 @@ +--- +title: Rect +permalink: /pages/000b0101020306 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:40 +--- +# Rect + +矩形绘制组件。 + +## 子组件 + +无 + +## 接口 + +Rect\(value:\{options?: \{width: Length,height: Length,radius?: Length | Array\} | \{width: Length,height: Length,radiusWidth?: Length,radiusHeight?: Length\}\}\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

options

+

Object

+

+

-

+

options参数说明

+
+ +- options参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

width

+

Length

+

+

-

+

宽度。

+

height

+

Length

+

+

-

+

高度。

+

radius

+

Length | Array<Length>

+

+

0

+

圆角半径,支持分别设置四个角的圆角度数。

+

radiusWidth

+

Length

+

+

0

+

圆角宽度。

+

radiusHeight

+

Length

+

+

0

+

圆角高度。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

width

+

Length

+

0

+

+

宽度。

+

height

+

Length

+

0

+

+

高度。

+

radiusWidth

+

Length

+

0

+

+

圆角的宽度,仅设置宽时宽高一致。

+

radiusHeight

+

Length

+

0

+

+

圆角的高度,仅设置高时宽高一致。

+

radius

+

Length | Array<Length>

+

0

+

+

圆角大小。

+
+ +## 示例 + +``` +@Entry +@Component +struct RectExample { + build() { + Column({ space: 5 }) { + Text('normal').fontSize(9).fontColor(0xCCCCCC).width('90%') + // 绘制90% * 50矩形 + Rect({ width: '90%', height: 50 }) + // 绘制90% * 50矩形 + Rect().width('90%').height(50) + + Text('with rounded corners').fontSize(9).fontColor(0xCCCCCC).width('90%') + // 绘制90% * 50矩形, 圆角宽高20 + Rect({ width: '90%', height: 50 }).radiusHeight(20).radiusWidth(20) + // 绘制90% * 50矩形, 圆角宽高20 + Rect({ width: '90%', height: 50 }).radius(20) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/rect.png) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/08.Shape.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/08.Shape.md" new file mode 100644 index 0000000000000000000000000000000000000000..4924474f52eed6750fb41b44345d3d5fd9e83d71 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/03.\347\273\204\344\273\266/04.\347\273\230\345\210\266\347\273\204\344\273\266/08.Shape.md" @@ -0,0 +1,297 @@ +--- +title: Shape +permalink: /pages/000b0101020307 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# Shape + +绘制组件的父组件,父组件中会描述所有绘制组件均支持的通用属性。 + +1、绘制组件使用Shape作为父组件,实现类似SVG的效果。 + +2、绘制组件单独使用,用于在页面上绘制指定的图形。 + +## 子组件 + +可以包含子组件。 + +## 接口 + +Shape\(target?: PixelMap\) + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

target

+

PixelMap

+

+

null

+

绘制目标,可将图形绘制在指定的PixelMap对象中,若未设置,则在当前绘制目标中进行绘制。

+
+ + +## 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

viewPort

+

{

+

x: Length,

+

y: Length,

+

width: Length,

+

height: Length

+

}

+

-

+

+

形状的视口。

+

fill

+

Color

+

Black

+

+

填充颜色。

+

stroke

+

Color

+

-

+

+

边框颜色。

+

strokeDashArray

+

Array<Length>

+

[]

+

+

设置边框的间隙。

+

strokeDashOffset

+

Length

+

0

+

+

边框绘制起点的偏移量。

+

strokeLineCap

+

LineCapStyle

+

Butt

+

+

路径端点绘制样式。

+

strokeLineJoin

+

LineJoinStyle

+

Miter

+

+

边框拐角绘制样式。

+

strokeMiterLimit

+

number

+

4

+

+

锐角绘制成斜角的极限值。

+

strokeOpacity

+

number

+

1

+

+

设置边框的不透明度。

+

strokeWidth

+

Length

+

1

+

+

设置边框的宽度。

+

antiAlias

+

boolean

+

true

+

+

是否开启抗锯齿。

+
+ +- LineJoinStyle枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Bevel

+

使用斜角连接路径段。

+

Miter

+

使用尖角连接路径段。

+

Round

+

使用圆角连接路径段。

+
+ + +## 示例 + +``` +@Entry +@Component +struct ShapeExample { + build() { + Column({ space: 5 }) { + Text('basic').fontSize(9).fontColor(0xCCCCCC).width(320) + // 在Shape的(-2, -2)点绘制一个 300 * 50 带边框的矩形,颜色0x317Af7,边框颜色黑色,边框宽度4,边框间隙20,向左偏移10,尖端样式圆角,拐角样式圆角,抗锯齿(默认开启) + // 在Shape的(-2, 58)点绘制一个 300 * 50 带边框的椭圆,颜色0x317Af7,边框颜色黑色,边框宽度4,边框间隙20,向左偏移10,尖端样式圆角,拐角样式圆角,抗锯齿(默认开启) + // 在Shape的(-2, 118)点绘制一个 300 * 10 线段,颜色0x317Af7,边框颜色黑色,宽度4,间隙20,向左偏移10,尖端样式圆角,拐角样式圆角,抗锯齿(默认开启) + Shape() { + Rect().width(300).height(50) + Ellipse().width(300).height(50).offset({ x: 0, y: 60 }) + Path().width(300).height(10).commands('M0 0 L900 0').offset({ x: 0, y: 120 }) + } + .viewPort({ x: -2, y: -2, width: 304, height: 124 }) + .fill(0x317Af7).stroke(Color.Black).strokeWidth(4) + .strokeDashArray([20]).strokeDashOffset(10).strokeLineCap(LineCapStyle.Round) + .strokeLineJoin(LineJoinStyle.Round).antiAlias(true) + // 在Shape的(-1, -1)点绘制一个 300 * 50 带边框的矩形,颜色0x317Af7,边框颜色黑色,边框宽度2 + Shape() { + Rect().width(300).height(50) + }.viewPort({ x: -1, y: -1, width: 302, height: 52 }).fill(0x317Af7).stroke(Color.Black).strokeWidth(2) + + Text('border').fontSize(9).fontColor(0xCCCCCC).width(320) + // 在Shape的(0, -5)点绘制一个 300 * 10 直线,颜色0xEE8443,边框宽度10,边框间隙20 + Shape() { + Path().width(300).height(10).commands('M0 0 L900 0') + }.viewPort({ x: 0, y: -5, width: 300, height: 10 }).stroke(0xEE8443).strokeWidth(10).strokeDashArray([20]) + // 在Shape的(0, -5)点绘制一个 300 * 10 直线,颜色0xEE8443,边框宽度10,边框间隙20,向左偏移10 + Shape() { + Path().width(300).height(10).commands('M0 0 L900 0') + } + .viewPort({ x: 0, y: -5, width: 300, height: 10 }) + .stroke(0xEE8443).strokeWidth(10).strokeDashArray([20]).strokeDashOffset(10) + // 在Shape的(0, -5)点绘制一个 300 * 10 直线,颜色0xEE8443,边框宽度10,透明度0.5 + Shape() { + Path().width(300).height(10).commands('M0 0 L900 0') + }.viewPort({ x: 0, y: -5, width: 300, height: 10 }).stroke(0xEE8443).strokeWidth(10).strokeOpacity(0.5) + // 在Shape的(0, -5)点绘制一个 300 * 10 直线,颜色0xEE8443,边框宽度10,边框间隙20,向左偏移10,尖端样式圆角 + Shape() { + Path().width(300).height(10).commands('M0 0 L900 0') + } + .viewPort({ x: 0, y: -5, width: 300, height: 10 }) + .stroke(0xEE8443).strokeWidth(10).strokeDashArray([20]).strokeLineCap(LineCapStyle.Round) + // 在Shape的(-5, -5)点绘制一个 300 * 50 带边框的矩形,颜色0x317Af7,边框宽度10,边框颜色0xEE8443,拐角样式圆角 + Shape() { + Rect().width(300).height(50) + } + .viewPort({ x: -5, y: -5, width: 310, height: 60 }) + .fill(0x317Af7).stroke(0xEE8443).strokeWidth(10).strokeLineJoin(LineJoinStyle.Round) + Shape() { + Path().width(300).height(60).commands('M0 0 L400 0 L400 200 Z') + } + .viewPort({ x: -80, y: -5, width: 310, height: 100 }) + .fill(0x317Af7).stroke(0xEE8443).strokeWidth(10) + .strokeLineJoin(LineJoinStyle.Miter).strokeMiterLimit(5) + }.width('100%').margin({ top: 15 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/shape.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/01.\345\261\236\346\200\247\345\212\250\347\224\273.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/01.\345\261\236\346\200\247\345\212\250\347\224\273.md" new file mode 100644 index 0000000000000000000000000000000000000000..2b7c8d6d53fbea85c5c19411dd8aaff1ec8e6673 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/01.\345\261\236\346\200\247\345\212\250\347\224\273.md" @@ -0,0 +1,192 @@ +--- +title: 属性动画 +permalink: /pages/000b01010300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 属性动画 + +组件的通用属性发生变化时,可以创建属性动画进行渐变,提升用户体验。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

duration

+

number

+

1000

+

单位为毫秒,默认动画时长为1000毫秒。

+

curve

+

Curve

+

Linear

+

默认曲线为线性,有效值参见Curve说明。

+

delay

+

number

+

0

+

单位为毫秒,默认不延时播放。

+

iterations

+

number

+

1

+

默认播放一次,设置为-1时表示无限次播放。

+

playMode

+

PlayMode

+

Normal

+

设置动画播放模式,默认播放完成后重头开始播放。

+
+ +- Curve枚举说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Linear

+

表示动画从头到尾的速度都是相同的。

+

Ease

+

表示动画以低速开始,然后加快,在结束前变慢,CubicBezier(0.25, 0.1, 0.25, 1.0)。

+

EaseIn

+

表示动画以低速开始,CubicBezier(0.42, 0.0, 1.0, 1.0)。

+

EaseOut

+

表示动画以低速结束,CubicBezier(0.0, 0.0, 0.58, 1.0)。

+

EaseInOut

+

表示动画以低速开始和结束,CubicBezier(0.42, 0.0, 0.58, 1.0)。

+

FastOutSlowIn

+

标准曲线,cubic-bezier(0.4, 0.0, 0.2, 1.0)。

+

LinearOutSlowIn

+

减速曲线,cubic-bezier(0.0, 0.0, 0.2, 1.0)。

+

FastOutLinearIn

+

加速曲线,cubic-bezier(0.4, 0.0, 1.0, 1.0)。

+

ExtremeDeceleration

+

急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。

+

Sharp

+

锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。

+

Rhythm

+

节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。

+

Smooth

+

平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。

+

Friction

+

阻尼曲线,CubicBezier(0.2, 0.0, 0.2, 1.0)。

+
+ + +## 示例 + +``` +@Entry +@Component +struct AttrAnimationExample { + @State widthSize: number = 200 + @State heightSize: number = 100 + @State flag: boolean = true + + build() { + Column() { + Button('click me') + .onClick((event: ClickEvent) => { + if (this.flag) { + this.widthSize = 100 + this.heightSize = 50 + } else { + this.widthSize = 200 + this.heightSize = 100 + } + this.flag = !this.flag + }) + .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff) + .animation({ + duration: 2000, // 动画时长 + curve: Curve.EaseOut, // 动画曲线 + delay: 500, // 动画延迟 + iterations: 1, // 播放次数 + playMode: PlayMode.Normal // 动画模式 + }) // 对Button组件的宽高属性进行动画配置 + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/AttrAnimation.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/02.\346\230\276\345\274\217\345\212\250\347\224\273.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/02.\346\230\276\345\274\217\345\212\250\347\224\273.md" new file mode 100644 index 0000000000000000000000000000000000000000..a1eed96b9610e8efc47524426744da14206dc0d4 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/02.\346\230\276\345\274\217\345\212\250\347\224\273.md" @@ -0,0 +1,179 @@ +--- +title: 显式动画 +permalink: /pages/000b01010301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 显式动画 + + + + + + + + + + +

接口名称

+

功能描述

+

animateTo(value: AnimationOption, event: ()=> void) : void

+

提供全局animateTo显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。

+

event指定显示动效的闭包函数,在闭包函数中导致的状态变化系统会自动插入过渡动画。

+
+ +## AnimationOption对象说明 + +- 属性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

属性名称

+

属性类型

+

默认值

+

描述

+

duration

+

number

+

1000

+

动画持续时间,单位为毫秒。

+

tempo

+

number

+

1.0

+

动画的播放速度,值越大动画播放越快,值越小播放越慢,为0时无动画效果。

+

curve

+

Curve | Curves

+

Linear

+

动画曲线。

+

delay

+

number

+

0

+

单位为ms(毫秒),默认不延时播放。

+

iterations

+

number

+

1

+

默认播放一次,设置为-1时表示无限次播放。

+

playMode

+

PlayMode

+

Normal

+

设置动画播放模式,默认播放完成后重头开始播放。

+
+ + +- 接口 + + + + + + + + + + +

名称

+

功能描述

+

onFinish() => void

+

动效播放完成回调。

+
+ + +## 示例 + +``` +@Entry +@Component +struct AnimateToExample { + @State widthSize: number = 200 + @State heightSize: number = 100 + private flag: boolean = true + + build() { + Column() { + Button('click me') + .width(this.widthSize) + .height(this.heightSize) + .backgroundColor(0x317aff) + .onClick((event: ClickEvent) => { + // 对Button组件的宽高属性进行动画配置 + if (this.flag) { + animateTo({ + duration: 1000, // 动画时长 + tempo: 0.5, // 播放速率 + curve: Curve.EaseInOut, // 动画曲线 + delay: 200, // 动画延迟 + iterations: 1, // 播放次数 + playMode: PlayMode.Normal, // 动画模式 + onFinish: () => { + console.info('play end') + } + }, () => { + this.widthSize = 100 + this.heightSize = 50 + }) + } else { + animateTo({ + duration: 200, // 动画时长 + curve: Curve.Ease, // 动画曲线 + delay: 200, // 动画延迟 + iterations: 1, // 播放次数 + playMode: PlayMode.Normal, // 动画模式 + onFinish: () => { + console.info('play end') + } + }, () => { + this.widthSize = 200 + this.heightSize = 100 + }) + } + this.flag = !this.flag + }) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/AnimateTo.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/03.\350\275\254\345\234\272\345\212\250\347\224\273/01.\351\241\265\351\235\242\351\227\264\350\275\254\345\234\272.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/03.\350\275\254\345\234\272\345\212\250\347\224\273/01.\351\241\265\351\235\242\351\227\264\350\275\254\345\234\272.md" new file mode 100644 index 0000000000000000000000000000000000000000..af4e3ca2c13338f2ca2a4b900ad23905ba8f742b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/03.\350\275\254\345\234\272\345\212\250\347\224\273/01.\351\241\265\351\235\242\351\227\264\350\275\254\345\234\272.md" @@ -0,0 +1,397 @@ +--- +title: 页面间转场 +permalink: /pages/000b0101030200 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 页面间转场 + +页面转场通过在全局pageTransition方法内配置页面入场组件和页面退场组件来自定义页面转场动效。 + + + + + + + + + + + + + + + + +

组件名称

+

参数

+

参数描述

+

PageTransitionEnter

+

Object

+

页面入场组件,用于自定义当前页面的入场效果,详见动效参数说明

+

PageTransitionExit

+

Object

+

页面退场组件,用于自定义当前页面的退场效果,详见动效参数说明

+
+ +- 动效参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

type

+

RouteType

+

-

+

+

不配置时表明pop为push时效果的逆播。

+

duration

+

number

+

1000

+

+

动画时长,单位为毫秒。

+

curve

+

Curve | Curves

+

Linear

+

+

动画曲线,有效值参见Curve 说明。

+

delay

+

number

+

0

+

+

动画延迟时长,单位为毫秒,默认不延时播放。

+
+ + +- RouteType枚举说明 + + + + + + + + + + + + + +

名称

+

描述

+

Pop

+

PageA跳转到PageB时,PageA为Exit+Push,PageB为Enter+Push。

+

Push

+

PageB返回至PageA时,PageA为Enter+Pop,PageB为Exit+Pop。

+
+ + +## 属性 + +PageTransitionEnter和PageTransitionExit组件支持的属性: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

slide

+

SlideEffect

+

Right

+

+

设置转场的滑入效果,有效值参见SlideEffect说明。

+

translate

+

{

+

x? : number,

+

y? : number,

+

z? : number

+

}

+

-

+

+

设置页面转场时的平移效果,为入场时起点和退场时终点的值,和slide同时设置时默认生效slide。

+

scale

+

{

+

x? : number,

+

y? : number,

+

z? : number,

+

centerX? : number,

+

centerY? : number

+

}

+

-

+

+

设置页面转场时的缩放效果,为入场时起点和退场时终点的值。

+

opacity

+

number

+

1

+

+

设置入场的起点透明度值或者退场的终点透明度值。

+
+ +- SlideEffect枚举说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Left

+

设置到入场时表示从左边滑入,出场时表示滑出到左边。

+

Right

+

设置到入场时表示从右边滑入,出场时表示滑出到右边。

+

Top

+

设置到入场时表示从上边滑入,出场时表示滑出到上边。

+

Bottom

+

设置到入场时表示从下边滑入,出场时表示滑出到下边。

+
+ + +## 事件 + +PageTransitionEnter和PageTransitionExit组件支持的事件: + + + + + + + + + + + + + +

事件

+

功能描述

+

onEnter(type: RouteType, progress: number) => void

+

回调入参为当前入场动画的归一化进度[0 - 1]。

+

onExit(type: RouteType, progress: number) => void

+

回调入参为当前退场动画的归一化进度[0 - 1]。

+
+ +## 示例 + +自定义方式1:配置了当前页面的入场动画为淡入,退场动画为缩小。 + +``` +// index.ets +@Entry +@Component +struct PageTransitionExample1 { + @State scale: number = 1 + @State opacity: number = 1 + @State active: boolean = false + build() { + Column() { + Navigator({ target: 'pages/page1', type: NavigationType.Push }) { + Image($r('app.media.bg1')).width("100%").height("100%") + } + .onClick(() => { + this.active = true + }) + }.scale({ x: this.scale }).opacity(this.opacity) + } +// 自定义方式1:完全自定义转场过程的效果 + pageTransition() { + PageTransitionEnter({ duration: 1200, curve: Curve.Linear }) + .onEnter((type: RouteType, progress: number) => { + this.scale = 1 + this.opacity = progress + }) // 进场过程中会逐帧触发onEnter回调,入参为动效的归一化进度(0% -- 100%) + PageTransitionExit({ duration: 1500, curve: Curve.Ease }) + .onExit((type: RouteType, progress: number) => { + this.scale = 1 - progress + this.opacity = 1 + }) // 退场过程中会逐帧触发onExit回调,入参为动效的归一化进度(0% -- 100%) + } +} +``` + +``` +// page1.ets +@Entry +@Component +struct AExample { + @State scale: number = 1 + @State opacity: number = 1 + @State active: boolean = false + build() { + Column() { + Navigator({ target: 'pages/index' ,type: NavigationType.Push}) { + Image($r('app.media.bg2')).width("100%").height("100%") + } + }.height("100%").width("100%").scale({ x: this.scale }).opacity(this.opacity) + } +// 自定义方式1:完全自定义转场过程的效果 + pageTransition() { + PageTransitionEnter({ duration: 1200, curve: Curve.Linear }) + .onEnter((type: RouteType, progress: number) => { + this.scale = 1 + this.opacity = progress + }) // 进场过程中会逐帧触发onEnter回调,入参为动效的归一化进度(0% -- 100%) + PageTransitionExit({ duration: 1500, curve: Curve.Ease }) + .onExit((type: RouteType, progress: number) => { + this.scale = 1 - progress + this.opacity = 1 + }) // 退场过程中会逐帧触发onExit回调,入参为动效的归一化进度(0% -- 100%) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/PageTransition1.gif) + +自定义方式2:配置了当前页面的入场动画为从左侧滑入,退场为缩小加透明度变化。 + +``` +// index.ets +@Entry +@Component +struct PageTransitionExample { + @State scale: number = 1 + @State opacity: number = 1 + @State active: boolean = false + + build() { + Column() { + Navigator({ target: 'pages/page1', type: NavigationType.Push }) { + Image($r('app.media.bg1')).width("100%").height("100%") + } + .onClick(() => { + this.active = true + }) + }.scale({ x: this.scale }).opacity(this.opacity) + } + +// 自定义方式2:使用系统提供的多种默认效果(平移、缩放、透明度等) + pageTransition() { + PageTransitionEnter({ duration: 1200 }) + .slide(SlideEffect.Left) + PageTransitionExit({ delay: 100 }) + .translate({ x: 100.0, y: 100.0 }) + .opacity(0) + } +} +``` + +``` +// page1.ets +@Entry +@Component +struct PageTransitionExample1 { + @State scale: number = 1 + @State opacity: number = 1 + @State active: boolean = false + + build() { + Column() { + Navigator({ target: 'pages/index', type: NavigationType.Push }) { + Image($r('app.media.bg2')).width ("100%").height("100%") + } + .onClick(() => { + this.active = true + }) + }.scale({ x: this.scale }).opacity(this.opacity) + } + +// 自定义方式2:使用系统提供的多种默认效果(平移、缩放、透明度等) + pageTransition() { + PageTransitionEnter({ duration: 1200 }) + .slide(SlideEffect.Left) + PageTransitionExit({ delay: 100 }) + .translate({ x: 100.0, y: 100.0 }) + .opacity(0) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/PageTransition2.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/03.\350\275\254\345\234\272\345\212\250\347\224\273/02.\347\273\204\344\273\266\345\206\205\350\275\254\345\234\272.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/03.\350\275\254\345\234\272\345\212\250\347\224\273/02.\347\273\204\344\273\266\345\206\205\350\275\254\345\234\272.md" new file mode 100644 index 0000000000000000000000000000000000000000..74bb310f1e0373e35a61710284dfc865ea097ba8 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/03.\350\275\254\345\234\272\345\212\250\347\224\273/02.\347\273\204\344\273\266\345\206\205\350\275\254\345\234\272.md" @@ -0,0 +1,200 @@ +--- +title: 组件内转场 +permalink: /pages/000b0101030201 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 组件内转场 + +组件转场主要通过transition属性进行配置转场参数,在组件插入和删除时进行过渡动效,主要用于容器组件子组件插入删除时提升用户体验(需要配合animateTo才能生效,动效时长、曲线、延时跟随animateTo中的配置)。 + +## 属性 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

参数描述

+

transition

+

Object

+

-

+

所有参数均为可选参数,详细描述见transition入参说明

+
+ +- transition入参说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

type

+

TransitionType

+

All

+

+

默认包括组件新增和删除。

+
说明:

不指定Type时说明插入删除使用同一种效果。

+
+

opacity

+

number

+

1

+

+

设置组件转场时的透明度效果,为插入时起点和删除时终点的值。

+

translate

+

{

+

x? : number,

+

y? : number,

+

z? : number

+

}

+

-

+

+

设置组件转场时的平移效果,为插入时起点和删除时终点的值。

+

scale

+

{

+

x? : number,

+

y? : number,

+

z? : number,

+

centerX? : number,

+

centerY? : number

+

}

+

-

+

+

设置组件转场时的缩放效果,为插入时起点和删除时终点的值。

+

rotate

+

{

+

x?: number,

+

y?: number,

+

z?: number,

+

angle?: Angle,

+

centerX?: Length,

+

centerY?: Length

+

}

+

-

+

+

设置组件转场时的旋转效果,为插入时起点和删除时终点的值。

+
+ + +- TransitionType枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

All

+

指定当前的Transition动效生效在组件的所有变化场景。

+

Insert

+

指定当前的Transition动效生效在组件的插入场景。

+

Delete

+

指定当前的Transition动效生效在组件的删除场景。

+
+ + +## 示例 + +示例功能通过一个Button控制第二个Button的出现和消失,并通过transition配置第二个Button出现和消失的过场动画。 + +``` +@Entry +@Component +struct TransitionExample { + @State btn1: boolean = false + @State show: string = "show" + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center,}) { + Button(this.show).width(80).height(30).backgroundColor(0x317aff).margin({bottom:50}) + .onClick(() => { + animateTo({ duration: 1000 }, () => { + this.btn1 = !this.btn1 + if(this.btn1){ + this.show = "hide" + }else{ + this.show = "show" + } + }) + }) + if (this.btn1) { + // 插入和删除配置为不同的过渡效果 + Button() { + Image($r('app.media.bg1')).width("80%").height(300) + }.transition({ type: TransitionType.Insert, scale : {x:0,y:1.0} }) + .transition({ type: TransitionType.Delete, scale: { x: 1.0, y: 0.0 } }) + } + }.height(400).width("100%").padding({top:100}) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/Transition.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/03.\350\275\254\345\234\272\345\212\250\347\224\273/03.\345\205\261\344\272\253\345\205\203\347\264\240\350\275\254\345\234\272.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/03.\350\275\254\345\234\272\345\212\250\347\224\273/03.\345\205\261\344\272\253\345\205\203\347\264\240\350\275\254\345\234\272.md" new file mode 100644 index 0000000000000000000000000000000000000000..99d9062abd9806a6256a765fa6220f2515663962 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/03.\350\275\254\345\234\272\345\212\250\347\224\273/03.\345\205\261\344\272\253\345\205\203\347\264\240\350\275\254\345\234\272.md" @@ -0,0 +1,142 @@ +--- +title: 共享元素转场 +permalink: /pages/000b0101030202 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 共享元素转场 + +共享元素转场支持页面间的转场,如当前页面的图片转场至下一页面中。 + +## 属性 + + + + + + + + + + + + + + +

名称

+

参数

+

默认值

+

参数描述

+

sharedTransition

+

id: string,

+

options?: Object

+

-

+

两个页面的组件配置为同一个id,则转场过程中会进行共享元素转场,配置为空字符串时不会有共享元素转场效果。

+
+ +- options参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名称

+

参数类型

+

默认值

+

必填

+

参数描述

+

duration

+

number

+

1000

+

+

单位为毫秒,默认动画时长为1000毫秒。

+

curve

+

Curve | Curves

+

Linear

+

+

默认曲线为线性,有效值参见Curve说明。

+

delay

+

number

+

0

+

+

单位为毫秒,默认不延时播放。

+
+ + +## 示例 + +示例功能为两个页面,共享元素转场页面图片点击后转场至页面B的图片。 + +``` +@Entry +@Component +struct SharedTransitionExample { + @State scale: number = 1 + @State opacity: number = 1 + @State active: boolean = false + + build() { + List() { + ListItem() { + Row() { + Navigator({ target: 'pages/common/Animation/transAnimation/PageB', type: NavigationType.Push }) { + Image($r('app.media.ic_health_heart')).width(50).height(50) + .sharedTransition('sharedImage1', { duration: 800, curve: Curve.Linear, delay: 100 }) + }.padding({ left: 10 }) + .onClick(() => { + this.active = true + }) + + Text('SharedTransition').width(80).height(80).textAlign(TextAlign.Center) + } + } + } + } +} +``` + +``` +// PageB +@Entry +@Component +struct BExample { + build() { + Stack() { + Image($r('app.media.ic_health_heart')).width(150).height(150).sharedTransition('sharedImage1') + }.width('100%').height(400) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/SharedTransition.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/04.\350\267\257\345\276\204\345\212\250\347\224\273.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/04.\350\267\257\345\276\204\345\212\250\347\224\273.md" new file mode 100644 index 0000000000000000000000000000000000000000..3c0b5c1b06f320708e6575f9862da1a6035a1d62 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/04.\350\267\257\345\276\204\345\212\250\347\224\273.md" @@ -0,0 +1,82 @@ +--- +title: 路径动画 +permalink: /pages/000b01010303 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 路径动画 + +设置组件进行位移动画时的运动路径。 + +## 属性 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

描述

+

motionPath

+

{

+

path: string,

+

from?: number,

+

to?: number,

+

rotatable?: boolean

+

}

+
说明:

path中支持通过start和end进行起点和终点的替代,如:

+

'Mstart.x start.y L50 50 Lend.x end.y Z'。

+
+

{

+

"",

+

0.0,

+

1.0,

+

false

+

}

+

设置组件的运动路径,入参说明如下:

+
  • path:位移动画的运动路径,使用svg路径字符串。
  • from:运动路径的起点,默认为0.0。
  • to:运动路径的终点,默认为1.0。
  • rotatable:是否跟随路径进行旋转。
+
+ +## 示例 + +``` +@Entry +@Component +struct MotionPathExample { + @State offsetX: number = 0 + @State offsetY: number = 0 + @State toggle: boolean = true + + build() { + Column() { + Button('click me') + .motionPath({ path: 'Mstart.x start.y L300 200 L300 500 Lend.x end.y', from: 0.0, to: 1.0, rotatable: true }) + .onClick((event: ClickEvent) => { + animateTo({ duration: 4000, curve: Curve.Linear }, () => { + this.toggle = !this.toggle; + }) + }).backgroundColor(0x317aff) + }.width('100%').height('100%').alignItems(this.toggle ? HorizontalAlign.Start : HorizontalAlign.Center) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/motion.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/05.\347\237\251\351\230\265\345\217\230\346\215\242.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/05.\347\237\251\351\230\265\345\217\230\346\215\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..1d061c1b151c4b71a891db85075dbcaa3bb9d544 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/05.\347\237\251\351\230\265\345\217\230\346\215\242.md" @@ -0,0 +1,870 @@ +--- +title: 矩阵变换 +permalink: /pages/000b01010304 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 矩阵变换 + +## 导入模块 + +``` +import matrix4 from '@ohos.matrix4' +``` + +## 权限 + +无 + +## matrix4.init + +init\(array: Array\): Object + +Matrix的构造函数,可以通过传入的参数创建一个四阶矩阵,矩阵为列优先。 + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

默认值

+

说明

+

array

+

Array<number>

+

+

[1, 0, 0, 0,

+

0, 1, 0, 0,

+

0, 0, 1, 0,

+

0, 0, 0, 1]

+

参数为长度为16(4*4)的number数组, 详情见参数描述

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

根据入参创建的四阶矩阵对象。

+
+ +- 参数描述 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

m00

+

number

+

+

x轴缩放值,单位矩阵默认为1。

+

m01

+

number

+

+

第2个值,xyz轴旋转会影响这个值。

+

m02

+

number

+

+

第3个值,xyz轴旋转会影响这个值。

+

m03

+

number

+

+

无实际意义。

+

m10

+

number

+

+

第5个值,xyz轴旋转会影响这个值。

+

m11

+

number

+

+

y轴缩放值,单位矩阵默认为1。

+

m12

+

number

+

+

第7个值,xyz轴旋转会影响这个值。

+

m13

+

number

+

+

无实际意义。

+

m20

+

number

+

+

第9个值,xyz轴旋转会影响这个值。

+

m21

+

number

+

+

第10个值,xyz轴旋转会影响这个值。

+

m22

+

number

+

+

z轴缩放值,单位矩阵默认为1。

+

m23

+

number

+

+

无实际意义。

+

m30

+

number

+

+

x轴平移值,单位px,单位矩阵默认为0。

+

m31

+

number

+

+

y轴平移值,单位px,单位矩阵默认为0。

+

m32

+

number

+

+

z轴平移值,单位px,单位矩阵默认为0。

+

m33

+

number

+

+

齐次坐标下生效,产生透视投影效果。

+
+ +- 示例 + + ``` + import Matrix4 from '@ohos.matrix4' + // 创建一个四阶矩阵 + let matrix = Matrix4.init([1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0]) + ``` + + +## matrix4.identity + +identity\(\): Object + +Matrix的初始化函数,可以返回一个单位矩阵对象。 + +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

单位矩阵对象。

+
+ +- 示例 + + ``` + // matrix1 和 matrix2 效果一致 + import Matrix4 from '@ohos.matrix4' + let matrix = Matrix4.init([1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0]) + let matrix2 = Matrix4.identity() + ``` + + +## matrix4.copy + +copy\(\): Object + +Matrix的拷贝函数,可以拷贝一份当前的矩阵对象。 + +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

当前矩阵的拷贝对象。

+
+ +- 示例 + + ``` + import Matrix4 from '@ohos.matrix4' + @Entry + @Component + struct Test { + private matrix1 = Matrix4.identity().translate({x:100}) + private matrix2 = this.matrix1.copy().scale({x:2}) + build() { + Column() { + Image($r("app.media.bg1")) + .width("40%") + .height(100) + .transform(this.matrix1) + Image($r("app.media.bg2")) + .width("40%") + .height(100) + .margin({top:50}) + .transform(this.matrix2) + } + } + } + ``` + + ![](/images/application-dev/reference/arkui-ts/figures/s1.png) + + +## Matrix4 + +### combine + +combine\(matrix: Matrix4\): Object + +Matrix的叠加函数,可以将两个矩阵的效果叠加起来生成一个新的矩阵对象。 + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

默认值

+

说明

+

matrix

+

Matrix4

+

+

-

+

待叠加的矩阵对象。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

矩阵叠加后的对象。

+
+ +- 示例 + + ``` + import Matrix4 from '@ohos.matrix4' + @Entry + @Component + struct Test { + private matrix1 = Matrix4.identity().translate({x:200}).copy() + private matrix2 = Matrix4.identity().scale({x:2}).copy() + build() { + Column() { + // 先平移x轴100px,再缩放两倍x轴 + Image($r("app.media.bg1")).transform(this.matrix1.combine(this.matrix2)) + .width("40%") + .height(100) + .margin({top:50}) + } + } + } + ``` + + ![](/images/application-dev/reference/arkui-ts/figures/q1.png) + + +### invert + +invert\(\): Object + +Matrix的逆函数,可以返回一个当前矩阵对象的逆矩阵,即效果正好相反。 + +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

当前矩阵的逆矩阵对象。

+
+ +- 示例 + + ``` + import Matrix4 from '@ohos.matrix4' + // matrix1(宽放大2倍) 和 matrix2(宽缩小2倍) 效果相反 + let matrix1 = Matrix4.identity().scale({x:2}) + let matrix2 = matrix1.invert() + ``` + + +### translate + +translate\(\{x?: number, y?: number, z?: number\}\): Object + +Matrix的平移函数,可以为当前矩阵增加x轴/Y轴/Z轴平移效果。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

默认值

+

说明

+

x

+

number

+

+

0

+

x轴的平移距离,单位px。

+

y

+

number

+

+

0

+

y轴的平移距离,单位px。

+

z

+

number

+

+

0

+

z轴的平移距离,单位px。

+
+ + +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

增加好平移效果后的矩阵对象。

+
+ +- 示例 + + ``` + import Matrix4 from '@ohos.matrix4' + @Entry + @Component + struct Test { + private matrix1 = Matrix4.identity().translate({x:100, y:200, z:30}) + build() { + Column() { + Image($r("app.media.bg1")).transform(this.matrix1) + .width("40%") + .height(100) + } + } + } + ``` + + ![](/images/application-dev/reference/arkui-ts/figures/s3.png) + + +### scale + +scale\(\{x?: number, y?: number, z?: number, centerX?: number, centerY?: number\}\): Object + +Matrix的缩放函数,可以为当前矩阵增加x轴/Y轴/Z轴缩放效果。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

默认值

+

说明

+

x

+

number

+

+

1

+

x轴的缩放倍数。

+

y

+

number

+

+

1

+

y轴的缩放倍数。

+

z

+

number

+

+

1

+

z轴的缩放倍数。

+

centerX

+

number

+

+

0

+

变换中心点x轴坐标。

+

centerY

+

number

+

+

0

+

变换中心点y轴坐标。

+
+ + +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

增加好缩放效果后的矩阵对象。

+
+ +- 示例 + + ``` + import Matrix4 from '@ohos.matrix4' + @Entry + @Component + struct Test { + private matrix1 = Matrix4.identity().scale({x:2, y:3, z:4, centerX:50, centerY:50}) + build() { + Column() { + Image($r("app.media.bg1")).transform(this.matrix1) + .width("40%") + .height(100) + } + } + } + ``` + + ![](/images/application-dev/reference/arkui-ts/figures/s4-(1).png) + + +### rotate + +rotate\(\{x?: number, y?: number, z?: number, angle?: number, centerX?: Length, centerY?: Length\}\): Object + +Matrix的旋转函数,可以为当前矩阵增加x轴/Y轴/Z轴旋转效果。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

默认值

+

说明

+

x

+

number

+

+

1

+

旋转轴向量x坐标。

+

y

+

number

+

+

1

+

旋转轴向量y坐标。

+

z

+

number

+

+

1

+

旋转轴向量z坐标。

+

angle

+

number

+

+

0

+

旋转角度。

+

centerX

+

number

+

+

0

+

变换中心点x轴坐标。

+

centerY

+

number

+

+

0

+

变换中心点y轴坐标。

+
+ + +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Object

+

增加好旋转效果后的矩阵对象。

+
+ +- 示例 + + ``` + import Matrix4 from '@ohos.matrix4' + @Entry + @Component + struct Test { + private matrix1 = Matrix4.identity().rotate({x:1, y:1, z:2, angle:30}) + build() { + Column() { + Image($r("app.media.bg1")).transform(this.matrix1) + .width("40%") + .height(100) + }.width("100%").margin({top:50}) + } + } + ``` + + ![](/images/application-dev/reference/arkui-ts/figures/1-19.png) + + +### transformPoint + +transformPoint\(point: Point\): Point + +Matrix的坐标点转换函数,可以将当前的变换效果作用到一个坐标点上。 + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

默认值

+

说明

+

point

+

Point

+

+

-

+

需要转换的坐标点。

+
+ + +- 返回值 + + + + + + + + + + +

类型

+

说明

+

Point

+

返回矩阵变换后的Point对象。

+
+ +- 示例 + + ``` + import Matrix4 from '@ohos.matrix4' + import prompt from '@system.prompt' + + @Entry + @Component + struct Test { + private matrix1 = Matrix4.identity().transformPoint([100, 10]) + build() { + Column() { + Button("get Point") + .onClick(() => { + prompt.showToast({message:JSON.stringify(this.matrix1),duration:2000}) + }).backgroundColor(0x2788D9) + }.width("100%").padding(50) + } + } + ``` + + ![](/images/application-dev/reference/arkui-ts/figures/222.gif) + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/06.\346\217\222\345\200\274\350\256\241\347\256\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/06.\346\217\222\345\200\274\350\256\241\347\256\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..ebc8308695ca749604842b9658a2670a7def1e74 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/04.\345\212\250\347\224\273/06.\346\217\222\345\200\274\350\256\241\347\256\227.md" @@ -0,0 +1,309 @@ +--- +title: 插值计算 +permalink: /pages/000b01010305 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 插值计算 + +## 导入模块 + +``` +import curves from '@ohos.curves' +``` + +## 权限 + +无 + +## curves.init + +init\(curve?: Curve\): Object + +插值曲线的初始化函数,可以根据入参创建一个插值曲线对象。 + +- 参数 + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

默认值

+

说明

+

curve

+

Curve

+

+

Linear

+

曲线对象。

+
+ +- 返回值 + + 曲线对象Object。 + + +## curves.steps + +steps\(count: number, end: boolean\): Object + +构造阶梯曲线对象。 + +- 参数: + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

默认值

+

说明

+

count

+

number

+

+

-

+

阶梯的数量,需要为正整数。

+

end

+

boolean

+

+

true

+

在每个间隔的起点或是终点发生阶跃变化 ,默认值为true,即在终点发生阶跃变化。

+
+ +- 返回值 + + 曲线对象Object。 + + +## curves.cubicBezier + +cubicBezier\(x1: number, y1: number, x2: number, y2: number\): Object + +构造三阶贝塞尔曲线对象,曲线的值必须处于0-1之间。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

x1

+

number

+

+

确定贝塞尔曲线第一点横坐标。

+

y1

+

number

+

+

确定贝塞尔曲线第一点纵坐标。

+

x2

+

number

+

+

确定贝塞尔曲线第二点横坐标。

+

y2

+

number

+

+

确定贝塞尔曲线第二点纵坐标。

+
+ +- 返回值 + + 曲线对象Object。 + + +## curves.spring + +spring\(velocity: number, mass: number, stiffness: number, damping: number\): Object + +构造弹簧曲线对象。 + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

velocity

+

number

+

+

初始速度。

+

mass

+

number

+

+

质量。

+

stiffness

+

number

+

+

刚度。

+

damping

+

number

+

+

阻尼。

+
+ +- 返回值 + + 曲线对象Object。 + + +## 示例 + +``` +import Curves from '@ohos.curves' +let curve1 = Curves.init() // 创建一个默认线性插值曲线 +let curve2 = Curves.init(Curve.EaseIn) // 创建一个默认先慢后快插值曲线 +let curve3 = Curves.spring(100, 1, 228, 30) // 创建一个弹簧插值曲线 +let curve3 = Curves.cubicBezier(0.1, 0.0, 0.1, 1.0) // 创建一个三阶贝塞尔曲线 +``` + +曲线对象只能通过上面的接口创建。 + + + + + + + + + + +

接口名称

+

功能描述

+

interpolate(time: number): number

+

插值曲线的插值计算函数,可以通过传入的归一化时间参数返回当前的插值。

+

time: 当前的归一化时间参数,有效值范围0到1。

+

返回归一化time时间点对应的曲线插值。

+
+ +- 示例 + + ``` + import Curves from '@ohos.curves' + let curve = Curves.init(Curve.EaseIn) // 创建一个默认先慢后快插值曲线 + let value: number = curve.interpolate(0.5) // 计算得到时间到一半时的插值 + ``` + + +## 整体示例 + +``` +import Curves from '@ohos.curves' +@Entry +@Component +struct ImageComponent { + @State widthSize: number = 200 + @State heightSize: number = 200 + build() { + Column() { + Text() + .margin({top:100}) + .width(this.widthSize) + .height(this.heightSize) + .backgroundColor(Color.Red) + .onClick(()=> { + let curve = Curves.cubicBezier(0.25, 0.1, 0.25, 1.0); + this.widthSize = curve.interpolate(0.5) * this.widthSize; + this.heightSize = curve.interpolate(0.5) * this.heightSize; + }) + .animation({duration: 2000 , curve: Curves.spring(0.25, 0.1, 0.25, 1.0)}) + }.width("100%").height("100%") + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/5-20.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/01.\350\255\246\345\221\212\345\274\271\347\252\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/01.\350\255\246\345\221\212\345\274\271\347\252\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..c37ce6877e256a1e6a595b6a5ac4f5ce81f4b745 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/01.\350\255\246\345\221\212\345\274\271\347\252\227.md" @@ -0,0 +1,347 @@ +--- +title: 警告弹窗 +permalink: /pages/000b01010400 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 警告弹窗 + +显示警告弹窗组件,可设置文本内容与响应回调。 + +## 属性 + + + + + + + + + + + + + + +

名称

+

参数类型

+

默认值

+

参数描述

+

show

+

options: { paramObject1| paramObject2}

+

-

+

定义并显示AlertDialog组件。

+
+ +- paramObject1参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

title

+

string | Resource

+

+

-

+

弹窗标题。

+

message

+

string | Resource

+

+

-

+

弹窗内容。

+

autoCancel

+

boolean

+

+

true

+

点击遮障层时,是否关闭弹窗。

+

confirm

+

{

+

value: string | Resource,

+

fontColor?: Color | number | string | Resource,

+

backgroundColor?: Color | number | string | Resource,

+

action: () => void

+

}

+

+

-

+

确认按钮的文本内容、文本色、按钮背景色和点击回调。

+

cancel

+

() => void

+

+

-

+

点击遮障层关闭dialog时的回调。

+

alignment

+

DialogAlignment

+

+

DialogAlignment.Default

+

弹窗在竖直方向上的对齐方式。

+

offset

+

{

+

dx: Length | Resource,

+

dy: Length | Resource

+

}

+

+

-

+

弹窗相对alignment所在位置的偏移量。

+

gridCount

+

number

+

+

-

+

弹窗容器宽度所占用栅格数。

+
+ + +- paramObject2参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

title

+

string | Resource

+

+

-

+

弹窗标题。

+

message

+

string | Resource

+

+

-

+

弹窗内容。

+

autoCancel

+

boolean

+

+

true

+

点击遮障层时,是否关闭弹窗。

+

primaryButton

+

{

+

value: string | Resource,

+

fontColor?: Color | number | string | Resource,

+

backgroundColor?: Color | number | string | Resource,

+

action: () => void;

+

}

+

+

-

+

按钮的文本内容、文本色、按钮背景色和点击回调。

+

secondaryButton

+

+

{

+

value: string | Resource,

+

fontColor?: Color | number | string | Resource,

+

backgroundColor?: Color | number | string | Resource,

+

action: () => void;

+

}

+

+

-

+

按钮的文本内容、文本色、按钮背景色和点击回调。

+

cancel

+

() => void

+

+

-

+

点击遮障层关闭dialog时的回调。

+

alignment

+

DialogAlignment

+

+

DialogAlignment.Default

+

弹窗在竖直方向上的对齐方式。

+

offset

+

{

+

dx: Length | Resource,

+

dy: Length | Resource

+

}

+

+

-

+

弹窗相对alignment所在位置的偏移量。

+

gridCount

+

number

+

+

-

+

弹窗容器宽度所占用栅格数。

+
+ + +## 示例 + +``` +@Entry +@Component +struct AlertDialogExample { + build() { + Column({ space: 5 }) { + Button('one button dialog') + .onClick(() => { + AlertDialog.show( + { + title: 'title', + message: 'text', + confirm: { + value: 'button', + action: () => { + console.info('Button-clicking callback') + } + }, + cancel: () => { + console.info('Closed callbacks') + } + } + ) + }) + .backgroundColor(0x317aff) + Button('two button dialog') + .onClick(() => { + AlertDialog.show( + { + title: 'title', + message: 'text', + primaryButton: { + value: 'cancel', + action: () => { + console.info('Callback when the first button is clicked') + } + }, + secondaryButton: { + value: 'ok', + action: () => { + console.info('Callback when the second button is clicked') + } + }, + cancel: () => { + console.info('Closed callbacks') + } + } + ) + }).backgroundColor(0x317aff) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/AlertDialog.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/02.\350\207\252\345\256\232\344\271\211\345\274\271\347\252\227.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/02.\350\207\252\345\256\232\344\271\211\345\274\271\347\252\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..02eec38e3eb93d1e264198a353e03b3dbb2cd538 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/02.\350\207\252\345\256\232\344\271\211\345\274\271\347\252\227.md" @@ -0,0 +1,219 @@ +--- +title: 自定义弹窗 +permalink: /pages/000b01010401 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 自定义弹窗 + +通过CustomDialogController类显示自定义弹窗。 + +## 接口 + +CustomDialogController\(value:\{builder: CustomDialog, cancel?: \(\) =\> void, autoCancel?: boolean\}\) + +- 参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

参数类型

+

必填

+

默认值

+

参数描述

+

builder

+

CustomDialog

+

+

-

+

自定义弹窗内容构造器。

+

cancel

+

() => void

+

+

-

+

点击遮障层退出时的回调。

+

autoCancel

+

boolean

+

+

true

+

是否允许点击遮障层退出。

+

alignment

+

DialogAlignment

+

+

DialogAlignment.Default

+

弹窗在竖直方向上的对齐方式。

+

offset

+

{

+

dx: Length | Resource,

+

dy: Length | Resource

+

}

+

+

-

+

弹窗相对alignment所在位置的偏移量。

+

customStyle

+

boolean

+

+

false

+

弹窗容器样式是否自定义。

+
+ +- DialogAlignment枚举说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Top

+

垂直顶部对齐。

+

Center

+

垂直居中对齐。

+

Bottom

+

垂直底部对齐。

+

Default

+

默认对齐。

+
+ + +### CustomDialogController + +创建对象 + +``` +dialogController : CustomDialogController = new CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, autoCancel?: boolean}) +``` + +open\(\) + +显示自定义弹窗内容,若已显示,则不生效。 + +close\(\) + +关闭显示的自定义弹窗,若已关闭,则不生效。 + +## 示例 + +``` +@CustomDialog +struct CustomDialogExample { + controller: CustomDialogController + cancel: () => void + confirm: () => void + + build() { + Column() { + Text('Software uninstall').width('70%').fontSize(20).margin({ top: 10, bottom: 10 }) + Image($r('app.media.icon')).width(80).height(80) + Text('Whether to uninstall a software?').fontSize(16).margin({ bottom: 10 }) + Flex({ justifyContent: FlexAlign.SpaceAround }) { + Button('cancel') + .onClick(() => { + this.controller.close() + this.cancel() + }).backgroundColor(0xffffff).fontColor(Color.Black) + Button('confirm') + .onClick(() => { + this.controller.close() + this.confirm() + }).backgroundColor(0xffffff).fontColor(Color.Red) + }.margin({ bottom: 10 }) + } + } +} + +@Entry +@Component +struct CustomDialogUser { + dialogController: CustomDialogController = new CustomDialogController({ + builder: CustomDialogExample({ cancel: this.onCancel, confirm: this.onAccept }), + cancel: this.existApp, + autoCancel: true + }) + + onCancel() { + console.info('Callback when the first button is clicked') + } + onAccept() { + console.info('Callback when the second button is clicked') + } + existApp() { + console.info('Click the callback in the blank area') + } + + build() { + Column() { + Button('click me') + .onClick(() => { + this.dialogController.open() + }).backgroundColor(0x317aff) + }.width('100%').margin({ top: 5 }) + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/customdialog.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/03.\345\233\276\347\211\207\347\274\223\345\255\230.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/03.\345\233\276\347\211\207\347\274\223\345\255\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..bf87a6b1fe95f7b491ed4d0d920a6578ceb1d46e --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/03.\345\233\276\347\211\207\347\274\223\345\255\230.md" @@ -0,0 +1,172 @@ +--- +title: 图片缓存 +permalink: /pages/000b01010402 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 图片缓存 + +## 导入模块 + +``` +import app from '@system.app' +``` + +## 权限 + +无 + +## app.setImageCacheCount + +setImageCacheCount\(value: number\): void + +设置内存中缓存解码后图片的数量上限,提升再次加载同源图片的加载速度。如果不设置则默认为0,不进行缓存。缓存采用内置的LRU策略,新图片加载后,如果超过缓存上限,会删除最久未再次加载的缓存。建议根据应用内存需求,设置合理缓存数量,数字过大可能导致内存使用过高。 + +- 参数 + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

value

+

number

+

+

内存中解码后图片的缓存数量。

+
+ +- 示例 + + ``` + // app.ets + import app from '@system.app'; + + export default { + onCreate() { + app.setImageCacheCount(100) // 设置解码后图片内存缓存上限为100张 + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, + } + ``` + + +## app.setImageRawDataCacheSize + +setImageRawDataCacheSize\(value: number\): void + +设置内存中缓存解码前图片数据的大小上限,单位为字节,提升再次加载同源图片的加载速度。如果不设置则默认为0,不进行缓存。缓存采用内置的LRU策略,新图片加载后,如果解码前数据超过缓存上限,会删除最久未再次加载的图片数据缓存。建议根据应用内存需求,设置合理缓存上限,过大可能导致应用内存使用过高。 + +- 参数 + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

value

+

number

+

+

内存中解码前图片数据的缓存大小,单位为字节。

+
+ +- 示例 + + ``` + // app.ets + import app from '@system.app'; + + export default { + onCreate() { + app.setImageRawDataCacheSize(104,857,600) // 设置解码前图片数据内存缓存上限为100MB + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, + } + ``` + + +## app.setImageFileCacheSize + +setImageFileCacheSize\(value: number\): void + +设置图片文件缓存的大小上限,单位为字节,提升再次加载同源图片的加载速度,特别是对网络图源、缩略图会有较明显提升。如果不设置则默认为100MB。缓存采用内置的LRU策略,新图片加载后,如果超过文件缓存上限,会按照时间由远到近删除缓存图片文件直到缓存图片大小满足缓存上限。建议根据应用实际需求,设置合理文件缓存上限,数字过大可能导致磁盘空间占用过高。 + +- 参数 + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

value

+

number

+

+

图片文件的缓存大小,单位为字节。

+
+ +- 示例 + + ``` + // app.ets + import app from '@system.app'; + + export default { + onCreate() { + app.setImageFileCacheSize(209,715,200) // 设置图片文件数据缓存上限为200MB + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, + } + ``` + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/04.\345\252\222\344\275\223\346\237\245\350\257\242.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/04.\345\252\222\344\275\223\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..b3969d330f3ce507f34cb21e7339b2538f89adf5 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/05.\345\205\250\345\261\200UI\346\226\271\346\263\225/04.\345\252\222\344\275\223\346\237\245\350\257\242.md" @@ -0,0 +1,307 @@ +--- +title: 媒体查询 +permalink: /pages/000b01010403 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 媒体查询 + +## 导入模块 + +``` +import mediaquery from '@ohos.mediaquery' +``` + +## 权限 + +无 + +## mediaquery.matchMediaSync + +matchMediaSync\(condition: string\): MediaQueryListener + +设置媒体查询的查询条件,并返回对应的监听句柄。 + +- 参数 + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

condition

+

string

+

+

媒体事件的匹配条件。

+
+ +- 返回值 + + + + + + + + + + +

类型

+

说明

+

MediaQueryListener

+

媒体事件监听句柄,用于注册和去注册监听回调。

+
+ +- 示例 + + ``` + listener = mediaquery.matchMediaSync('(orientation: landscape)'); //监听横屏事件 + ``` + + +## MediaQueryListener + +媒体查询的句柄,并包含了申请句柄时的首次查询结果。 + +### 属性 + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

可读

+

可写

+

说明

+

matches

+

boolean

+

+

+

是否符合匹配条件。

+

media

+

string

+

+

+

媒体事件的匹配条件。

+
+ +### on + +on\(type: 'change', callback: Callback\): void + +通过句柄向对应的查询条件注册回调,当媒体属性发生变更时会触发该回调。 + +- 参数 + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

type

+

boolean

+

+

必须填写字符串'change'。

+

callback

+

Callback<MediaQueryResult>

+

+

向媒体查询注册的回调。

+
+ +- 示例 + + 详见[off示例](#li16426122219256)。 + + +### off + +off\(type: 'change', callback?: Callback\): void + +通过句柄向对应的查询条件去注册回调,当媒体属性发生变更时不在触发指定的回调。 + +- 参数 + + + + + + + + + + + + + + + + + + + +

参数名

+

类型

+

必填

+

说明

+

type

+

boolean

+

+

必须填写字符串'change'。

+

callback

+

Callback<MediaQueryResult>

+

+

需要去注册的回调,如果参数缺省则去注册该句柄下所有的回调。

+
+ +- 示例 + + ``` + listener = mediaquery.matchMediaSync('(orientation: landscape)'); //监听横屏事件 + onPortrait(mediaQueryResult) { + if (mediaQueryResult.matches) { + // do something here + } else { + // do something here + } + } + listener.on('change', onPortrait) // 注册回调 + listener.off('change', onPortrait) // 去注册回调 + ``` + + +## MediaQueryResult + +### 属性 + + + + + + + + + + + + + + + + + + + + + + +

名称

+

参数类型

+

可读

+

可写

+

说明

+

matches

+

boolean

+

+

+

是否符合匹配条件。

+

media

+

string

+

+

+

媒体事件的匹配条件。

+
+ +### 示例 + +``` +import mediaquery from '@ohos.mediaquery' + +let portraitFunc = null + +@Entry +@Component +struct MediaQueryExample { + @State color: string = '#DB7093' + @State text: string = 'Portrait' + listener = mediaquery.matchMediaSync('(orientation: landscape)') + + onPortrait(mediaQueryResult) { + if (mediaQueryResult.matches) { + this.color = '#FFD700' + this.text = 'Landscape' + } else { + this.color = '#DB7093' + this.text = 'Portrait' + } + } + + aboutToAppear() { + portraitFunc = this.onPortrait.bind(this) //bind current js instance + this.listener.on('change', portraitFunc) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text(this.text).fontSize(24).fontColor(this.color) + } + .width('100%').height('100%') + } +} +``` + +![](/images/application-dev/reference/arkui-ts/figures/MediaQuery.gif) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/06.\351\231\204\345\275\225/01.\346\226\207\346\241\243\344\270\255\346\266\211\345\217\212\345\210\260\347\232\204\345\206\205\347\275\256\346\236\232\344\270\276\345\200\274.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/06.\351\231\204\345\275\225/01.\346\226\207\346\241\243\344\270\255\346\266\211\345\217\212\345\210\260\347\232\204\345\206\205\347\275\256\346\236\232\344\270\276\345\200\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..27876e5b4e850bdbe7d28ab316f32879cad62a08 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/02.ArkUI\347\273\204\344\273\266\345\217\202\350\200\203/02.\345\237\272\344\272\216TS\346\211\251\345\261\225\347\232\204\345\243\260\346\230\216\345\274\217\345\274\200\345\217\221\350\214\203\345\274\217/06.\351\231\204\345\275\225/01.\346\226\207\346\241\243\344\270\255\346\266\211\345\217\212\345\210\260\347\232\204\345\206\205\347\275\256\346\236\232\344\270\276\345\200\274.md" @@ -0,0 +1,291 @@ +--- +title: 文档中涉及到的内置枚举值 +permalink: /pages/000b01010500 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 文档中涉及到的内置枚举值 + +## Alignment枚举说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

TopStart

+

顶部起始端。

+

Top

+

顶部横向居中。

+

TopEnd

+

顶部尾端。

+

Start

+

起始端纵向居中。

+

Center

+

横向和纵向居中。

+

End

+

尾端纵向居中。

+

BottomStart

+

底部起始端。

+

Bottom

+

底部横向居中。

+

BottomEnd

+

底部尾端。

+
+ +## ItemAlign枚举说明 + + + + + + + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Auto

+

使用Flex容器中默认配置。

+

Start

+

元素在Flex容器中,交叉轴方向首部对齐。

+

Center

+

元素在Flex容器中,交叉轴方向居中对齐。

+

End

+

元素在Flex容器中,交叉轴方向底部对齐。

+

Stretch

+

元素在Flex容器中,交叉轴方向拉伸填充,在未设置尺寸时,拉伸到容器尺寸。

+

Baseline

+

元素在Flex容器中,交叉轴方向文本基线对齐。

+
+ +## LineCapStyle枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Butt

+

分割线两端为平行线。

+

Round

+

分割线两端为半圆。

+

Square

+

分割线两端为平行线。

+
+ +## PlayMode枚举值说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Normal

+

动画按正常播放。

+

Reverse

+

动画反向播放。

+

Alternate

+

动画在奇数次(1、3、5...)正向播放,在偶数次(2、4、6...)反向播放。

+

AlternateReverse

+

动画在奇数次(1、3、5...)反向播放,在偶数次(2、4、6...)正向播放。

+
+ +## ImageRepeat枚举说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

X

+

只在水平轴上重复绘制图片。

+

Y

+

只在竖直轴上重复绘制图片。

+

XY

+

在两个轴上重复绘制图片。

+

NoRepeat

+

不重复绘制图片。

+
+ +## TextDecorationType枚举说明 + + + + + + + + + + + + + + + + + + + +

名称

+

描述

+

Underline

+

文字下划线修饰。

+

LineThrough

+

穿过文本的修饰线。

+

Overline

+

文字上划线修饰。

+

None

+

不使用文本装饰线。

+
+ +## TextCase枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Normal

+

保持文本原有大小写。

+

LowerCase

+

文本采用全小写。

+

UpperCase

+

文本采用全大写。

+
+ +## BarState枚举说明 + + + + + + + + + + + + + + + + +

名称

+

描述

+

Off

+

不显示。

+

On

+

常驻显示。

+

Auto

+

按需显示(触摸时显示,2s后消失)。

+
+ diff --git "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/02.\345\214\205\347\273\223\346\236\204\350\257\264\346\230\216.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/03.\345\272\224\347\224\250\345\274\200\345\217\221\345\214\205\347\273\223\346\236\204\350\257\264\346\230\216.md" similarity index 80% rename from "website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/02.\345\214\205\347\273\223\346\236\204\350\257\264\346\230\216.md" rename to "website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/03.\345\272\224\347\224\250\345\274\200\345\217\221\345\214\205\347\273\223\346\236\204\350\257\264\346\230\216.md" index ed8b5980090a28741234652eff31f2686809d0a1..ff5cb72e7b98604c38eb22d8ced855e561af4ee0 100644 --- "a/website/docs/01.\346\226\207\346\241\243/10.\345\272\224\347\224\250\345\274\200\345\217\221-\345\277\253\351\200\237\345\205\245\351\227\250/02.\345\214\205\347\273\223\346\236\204\350\257\264\346\230\216.md" +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/03.\345\272\224\347\224\250\345\274\200\345\217\221\345\214\205\347\273\223\346\236\204\350\257\264\346\230\216.md" @@ -1,6 +1,6 @@ --- -title: 包结构说明 -permalink: /pages/000901 +title: 应用开发包结构说明 +permalink: /pages/000b02 navbar: true sidebar: true prev: true @@ -9,14 +9,16 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:45 +date: 2021-12-30 18:31:41 --- -# 包结构说明 +# 包结构说明 在应用开发的工程中,需要在config.json配置文件中对应用的包结构进行声明。 + 配置文件示例如下: + ``` { "app": { @@ -80,9 +82,12 @@ date: 2021-12-30 12:57:45 } ``` + **包结构声明需要注意以下约束:** -- "package"字段命名要保证在相同bundleName的应用内唯一。 -- "abilities"字段下只能声明一个ability。 -- "abilities"字段中ability的"name"字段命名要保证在相同bundleName的应用内唯一。 +- "package"字段命名要保证在相同bundleName的应用内唯一。 + +- "abilities"字段下只能声明一个ability。 + +- "abilities"字段中ability的"name"字段命名要保证在相同bundleName的应用内唯一。 diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/01.\345\270\270\350\247\201\351\227\256\351\242\230\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/01.\345\270\270\350\247\201\351\227\256\351\242\230\346\246\202\350\277\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..9a575dd5c61013ad5752e49fc51c492461998c18 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/01.\345\270\270\350\247\201\351\227\256\351\242\230\346\246\202\350\277\260.md" @@ -0,0 +1,151 @@ +--- +title: 常见问题概述 +permalink: /pages/000b0300 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 常见问题概述 + +- [环境搭建](#section93289248249) + - [轻量和小型系统](#section197234983111) + +- [编译构建子系统](#section18826114693810) + - [轻量和小型系统](#section693410399) + +- [烧录](#section6556741113712) + - [轻量和小型系统](#section1029933713812) + +- [内核](#section13741125564211) + - [基础内核](#section1723365191114) + - [文件系统](#section14523145918136) + - [芯片适配](#section141541939159) + - [三方组件](#section4988163321816) + - [编译链接](#section080219574225) + +- [移植](#section129331824154313) +- [启动恢复](#section83501764443) +- [系统服务](#section19567132114455) + - [公共基础库](#section3214181711465) + - [视觉应用常见问题](#section295651815466) + - [hdc](#section178081876506) + + +常见问题主要用于帮助开发者解决在开发过程中经常出现的一类问题问题。当前提供了如下常见问题供开发者进行查询。 + +## 环境搭建 + +### 轻量和小型系统 + +- [安装hb过程中出现乱码、段错误](/pages/000b0301#section36351051193919) +- [安装hb过程中,提示"cannot import 'sysconfig' from 'distutils'"](/pages/000b0301#section48221013144011) +- [安装hb过程中,提示"module 'platform' has no attribute 'linux\_distribution'"](/pages/000b0301#section8692735427) +- [安装hb过程中,提示"Could not find a version that satisfies the requirement ohos-build"](/pages/000b0301#section8692735427) +- [安装python3过程中,提示“configure: error: no acceptable C compiler found in $PATH”](/pages/000b0301#section870082884217) +- [安装python3过程中,提示“-bash: make: command not found”](/pages/000b0301#section198707170455) +- [安装python3过程中,提示“zlib not available”](/pages/000b0301#section85401445204518) +- [安装python3过程中,提示“No module named '\_ctypes'”](/pages/000b0301#section12202694460) +- [安装 kconfiglib时,遇到lsb\_release错误](/pages/000b0301#section5803174135115) +- [Linux编译服务器终端输入不识别的命令时提示“ImportError: No module named apt\_pkg”](/pages/000b0301#section510820516515) + +## 编译构建子系统 + +### 轻量和小型系统 + +- [编译构建过程中,提示“usr/sbin/ninja: invalid option -- w”](/pages/000b0302#section67961431372) +- [编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses”](/pages/000b0302#section199631617371) +- [编译构建过程中,提示“line 77: mcopy: command not found”](/pages/000b0302#section937435175) +- [编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”](/pages/000b0302#section1115535018713) +- [编译构建过程中,提示“No module named 'Crypto'”](/pages/000b0302#section17982573813) +- [编译构建过程中,提示“Could not find a version that satisfies the requirement six\>=1.9.0”](/pages/000b0302#section1917790845) +- [编译构建过程中,提示“Could not find a version that satisfies the requirement six\>=1.9.0”](/pages/000b0302#section1917790845)” +- [编译构建过程中,提示找不到“-lgcc”](/pages/000b0302#section141771701647) +- [编译构建过程中,提示找不到“python”](/pages/000b0302#section51781202415) +- [编译构建过程中,提示找不到“python3”](/pages/000b0302#section1917950148) + +## 烧录 + +### 轻量和小型系统 + +- [烧写选择串口后,提示“Error: Opening COMxx: Access denied”](/pages/000b0303#section18988185615914) + +- [烧写失败](/pages/000b0303#section1370982513317) +- [串口无回显](/pages/000b0303#section183421944953) +- [Windows电脑与单板网络连接失败](/pages/000b0303#section1215410450215) + +## 内核 + +### 基础内核 + +- [LiteOS-A和LiteOS-M内核对外API的差异](/pages/000b0304#section447571122918) +- [如何分析线程栈溢出](/pages/000b0304#section8623141711293) + +### 文件系统 + +- [Hi3516开源板以写的模式打开同一个文件失败(LiteOS-A)](/pages/000b0304#section517972255311) + +### 芯片适配 + +- [LiteOS内核已支持哪些硬件平台](/pages/000b0304#section868413518533) +- [LiteOS内核已支持哪几款芯片架构](/pages/000b0304#section1131661465417) + +### 三方组件 + +- [OpenHarmony已支持哪些三方组件](/pages/000b0304#section74138185411) +- [在OpenHarmony上使用OpenSSL,出现秘钥长度校验不正确](/pages/000b0304#section10564614135516) +- [setsockopt是否支持SO\_RCVBUF和SO\_SNDBUF选项](/pages/000b0304#section2093373215556) + +### 编译链接 + +- [Arm Linux开发的应用程序,如何在LiteOS-A上运行](/pages/000b0304#section1164175713557) +- [OpenHarmony在什么系统下编译,使用什么编译器](/pages/000b0304#section132287223567) +- [LiteOS-M上使用单独编译成静态库的三方组件,出现三方组件中的全局变量值不正确,或调用三方组件的函数后系统卡死](/pages/000b0304#section15189154225619) +- [LiteOS-A生成目标可执行文件,提示 use VFP register arguments,xxx.o does not](/pages/000b0304#section193571012578) +- [clock\_gettime接口获取的时间打印不对](/pages/000b0304#section8973152015717) + +## 移植 + +- [如何将用户的堆内存挂载进内核](/pages/000b0305#section21471536184914) + +## 启动恢复 + +- [系统启动过程中打印“parse failed!”错误后停止启动](/pages/000b0306#section835662214302) +- [系统启动过程未结束就自动重启,如此反复持续](/pages/000b0306#section3857921143117) +- [参数正确的情况下调用SetParameter/GetParameter返回失败](/pages/000b0306#section548818116328) + +## 系统服务 + +### 公共基础库 + +- [LiteOS-A内核\(Hi3516、Hi3518平台\)KV存储路径设置错误,导致KV存储运行失败](/pages/000b0307#section16520347131511) + +### 视觉应用常见问题 + +- [是否存在一个全局变量,所有的页面都可以访问?](/pages/000b0307#section187297991718) +- [如何获取dom中的元素](/pages/000b0307#section1833493719175) +- [如何在页面间传值?](/pages/000b0307#section184283812183) +- [list如何滚动到某个item?](/pages/000b0307#section11897734131811) +- [text支持多行吗?](/pages/000b0307#section5872656121814) +- [为什么控件不显示?](/pages/000b0307#section7397125317107) +- [如何实现页面滑动?](/pages/000b0307#section338794422010) +- [Left、Top为什么不生效?](/pages/000b0307#section2597193611217) +- [动态绑定为什么不生效?](/pages/000b0307#section6939050172115) +- [如何实现相对定位和绝对定位?](/pages/000b0307#section5547311192215) +- [如何控制控件的显示与隐藏?](/pages/000b0307#section16107113352213) +- [使用Margin时,有什么注意事项?](/pages/000b0307#section1524910142314) +- [使用事件订阅时,有什么注意事项?](/pages/000b0307#section1537132012231) +- [使用动态绑定时,有什么注意事项?](/pages/000b0307#section96561452236) +- [swiper loop属性如何生效?](/pages/000b0307#section690166112414) +- [使用数组时,有什么注意事项?](/pages/000b0307#section1554552822414) + +### hdc + +- [hdc\_std连接不到设备](/pages/000b0307#section1965012223257) +- [hdc\_std运行不了](/pages/000b0307#section1157575212515) + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/02.\347\216\257\345\242\203\346\220\255\345\273\272\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/02.\347\216\257\345\242\203\346\220\255\345\273\272\345\270\270\350\247\201\351\227\256\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..c8d027797d18fc38a9fe827e4ee403a26799ebcc --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/02.\347\216\257\345\242\203\346\220\255\345\273\272\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -0,0 +1,252 @@ +--- +title: 环境搭建常见问题 +permalink: /pages/000b0301 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 环境搭建常见问题 + +- [轻量和小型系统](#section1742119306399) + - [安装hb过程中,出现乱码、段错误](#section36351051193919) + - [安装hb过程中,提示"cannot import 'sysconfig' from 'distutils'"](#section48221013144011) + - [安装hb过程中,提示"module 'platform' has no attribute 'linux\_distribution'"](#section10307193044111) + - [安装hb过程中,提示"Could not find a version that satisfies the requirement ohos-build"](#section8692735427) + - [安装python3过程中,提示“configure: error: no acceptable C compiler found in $PATH”](#section870082884217) + - [安装python3过程中,提示“-bash: make: command not found”](#section198707170455) + - [安装python3过程中,提示“zlib not available”](#section85401445204518) + - [安装python3过程中,提示“No module named '\_ctypes'”](#section12202694460) + - [安装 kconfiglib时,遇到lsb\_release错误](#section5803174135115) + - [Linux编译服务器终端输入不识别的命令时提示“ImportError: No module named apt\_pkg”](#section510820516515) + + +## 轻量和小型系统 + +### 安装hb过程中,出现乱码、段错误 + +- **现象描述** + + 执行“python3 -m pip install --user ohos-build”出现乱码、段错误(segmentation fault)。 + + +- **可能原因** + + pip版本过低。 + +- **解决办法** + + 执行如下命令升级pip。 + + ``` + python3 -m pip install -U pip + ``` + + +### 安装hb过程中,提示"cannot import 'sysconfig' from 'distutils'" + +- **现象描述** + + 执行“python3 -m pip install --user ohos-build”提示"cannot import 'sysconfig' from 'distutils'"。 + + +- **可能原因** + + 缺少distutils模块。 + +- **解决办法** + + 执行如下命令安装。 + + ``` + sudo apt-get install python3.8-distutils + ``` + + +### 安装hb过程中,提示"module 'platform' has no attribute 'linux\_distribution'" + +- **现象描述** + + 执行“python3 -m pip install --user ohos-build”提示"module 'platform' has no attribute 'linux\_distribution'"。 + + +- **可能原因** + + python3 pip安装兼容性问题。 + +- **解决办法** + + 执行如下命令重新安装pip。 + + ``` + sudo apt remove python3-pip + curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py + python get-pip.py + ``` + + +### 安装hb过程中,提示"Could not find a version that satisfies the requirement ohos-build" + +- **现象描述** + + 执行“python3 -m pip install --user ohos-build”提示"Could not find a version that satisfies the requirement ohos-build" + + +- **可能原因** + + 可能是网络环境较差导致的安装失败。 + +- **解决办法** + 1. 请检查网络连接是否正常。如果网络有问题,请修复网络问题后重新安装。 + 2. 若网络正常,请尝试指定临时pypi源的方式安装: + + ``` + python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ohos-build + ``` + + + +### 安装python3过程中,提示“configure: error: no acceptable C compiler found in $PATH” + +- **现象描述** + + 安装python3过程中出现以下错误: + + ``` + configure: error: no acceptable C compiler found in $PATH. See 'config.log' for more details + ``` + +- **可能原因** + + 环境中未安装“gcc”。 + +- **解决办法** + + 1、通过命令“apt-get install gcc”在线安装。 + + 2、完成后,重新安装python3。 + + +### 安装python3过程中,提示“-bash: make: command not found” + +- **现象描述** + + 安装python3过程中出现以下错误: + + ``` + -bash: make: command not found + ``` + +- **可能原因** + + 环境中未安装“make”。 + +- **解决办法** + + 1、通过命令“apt-get install make”在线安装。 + + 2、完成后,重新安装python3。 + + +### 安装python3过程中,提示“zlib not available” + +- **现象描述** + + 安装python3过程中出现以下错误: + + ``` + zipimport.ZipImportError: can't decompress data; zlib not available + ``` + +- **可能原因** + + 环境中未安装“zlib”。 + +- **解决办法** + + 方法1:通过命令“apt-get install zlib”在线安装。 + + 方法2:如果软件源中没有该软件,请从“www.zlib.net”下载版本代码,并离线安装。 + + ![](/images/device-dev/faqs/figures/download-zlib.png) + + 完成下载后,通过以下命令安装: + + ``` + # tar xvf zlib-1.2.11.tar.gz + # cd zlib-1.2.11 + # ./configure + # make && make install + ``` + + 完成后,重新安装python3。 + + +### 安装python3过程中,提示“No module named '\_ctypes'” + +- **现象描述** + + 安装python3过程中出现以下错误: + + ``` + ModuleNotFoundError:No module named ‘_ctypes’ + ``` + + +- **可能原因** + + 环境中未安装“libffi”和“libffi-devel”。 + + +- **解决办法** + + 1、通过命令“apt-get install libffi\* -y”,在线安装。 + + 2、完成后,重新安装python3。 + + +### 安装 kconfiglib时,遇到lsb\_release错误 + +- **现象描述** + + 安装kconfiglib过程中遇到如下错误打印: + + ``` + subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1. + ``` + +- **可能原因** + + lsb\_release模块基于的python版本与现有python版本不一致 + +- **解决办法** + + 执行"find / -name lsb\_release",找到lsb\_release位置并删除,如:"sudo rm -rf /usr/bin/lsb\_release" + + +### Linux编译服务器终端输入不识别的命令时提示“ImportError: No module named apt\_pkg” + +- **现象描述** + + Linux编译服务器终端输入不识别的命令时,提示"ImportError: No module named apt\_pkg" + + +- **可能原因** + + python3 apt安装兼容性问题。 + +- **解决办法** + + 执行如下命令重新安装python3-apt。 + + ``` + sudo apt-get remove python3-apt + sudo apt-get install python3-apt + ``` + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/03.\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/03.\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237\345\270\270\350\247\201\351\227\256\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..ebe77f849585a87af5d4229e47b85c1870329867 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/03.\347\274\226\350\257\221\346\236\204\345\273\272\345\255\220\347\263\273\347\273\237\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -0,0 +1,258 @@ +--- +title: 编译构建子系统常见问题 +permalink: /pages/000b0302 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 编译构建子系统常见问题 + +- [轻量和小型系统](#section78686441462) + - [编译构建过程中,提示“usr/sbin/ninja: invalid option -- w”](#section67961431372) + - [编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses”](#section199631617371) + - [编译构建过程中,提示“line 77: mcopy: command not found”](#section937435175) + - [编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”](#section1115535018713) + - [编译构建过程中,提示“No module named 'Crypto'”](#section17982573813) + - [编译构建过程中,提示“xx.sh : xx unexpected operator”](#section53663205819) + - [编译构建过程中,提示“Could not find a version that satisfies the requirement six\>=1.9.0”](#section1917790845) + - [编译构建过程中,提示找不到“-lgcc”](#section141771701647) + - [编译构建过程中,提示找不到“python”](#section51781202415) + - [编译构建过程中,提示找不到“python3”](#section1917950148) + + +## 轻量和小型系统 + +### 编译构建过程中,提示“usr/sbin/ninja: invalid option -- w” + +- **现象描述:** + + 编译失败,提示“usr/sbin/ninja: invalid option -- w”。 + +- **可能原因:** + + 编译环境中ninja版本太低,不支持--w选项。 + +- **解决办法:** + + 卸载环境中ninja和gn,按照[获取工具](/pages/000a01)。 + + +### 编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses” + +- **现象描述:** + + 编译失败,提示“/usr/bin/ld: cannot find -lncurses”。 + +- **可能原因:** + + 编译环境ncurses库缺失。 + +- **解决办法:** + + ``` + sudo apt-get install lib32ncurses5-dev + ``` + + +### 编译构建过程中,提示“line 77: mcopy: command not found” + +- **现象描述:** + + ​编译失败,提示“line 77: mcopy: command not found”。 + +- **可能原因:** + + 编译环境未安装mcopy。 + +- **解决办法:** + + ``` + ​sudo apt-get install dosfstools mtools + ``` + + +### 编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory” + +- **现象描述:** + + 编译失败,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”。 + +- ​**可能原因:** + + 当前用户对riscv编译器路径下的文件访问权限不够。 + +- ​**解决办法:** + + 查询gcc\_riscv32所在目录。 + + ``` + which riscv32-unknown-elf-gcc + ``` + + 使用chmod命令修改目录权限为755。 + + +### 编译构建过程中,提示“No module named 'Crypto'” + +- **现象描述:** + + 编译失败,提示“No module named 'Crypto'”。 + +- **可能原因:** + + python3未安装Crypto。 + +- **解决办法:** + 1. 查询Python版本号。 + + ``` + python3 --version + ``` + + 2. 需使用python3.7以上版本,然后安装pycryptodome。 + + ``` + sudo pip3 install pycryptodome + ``` + + + +### 编译构建过程中,提示“xx.sh : xx unexpected operator” + +- **现象描述:** + + 编译失败:“xx.sh \[: xx unexpected operator”。 + +- **可能原因:** + + 编译环境shell不是bash。 + +- **解决办法:** + + ``` + sudo rm -rf /bin/sh + sudo ln -s /bin/bash /bin/sh + ``` + + +### 编译构建过程中,提示“Could not find a version that satisfies the requirement six\>=1.9.0” + +- **现象描述** + + 编译构建过程中出现以下错误: + + ``` + Could not find a version that satisfies the requirement six>=1.9.0 + ``` + + +- **可能原因** + + 环境中未安装合适的“six”。 + + +- **解决办法** + + 方法1:通过命令“pip3 install six”,在线安装。 + + 方法2:离线安装 + + 通过网页[https://pypi.org/project/six/\#files](https://pypi.org/project/six/#files),下载安装包。 + + ![](/images/device-dev/faqs/figures/download-six.png) + + 将源码放置在Linux服务器中,并安装“pip3 install six-1.14.0-py2.py3-none-any.whl”。 + + 完成上述安装后,重新构建。 + + +### 编译构建过程中,提示找不到“-lgcc” + +- **现象描述** + + 编译构建过程中出现以下错误: + + ``` + riscv32-unknown-elf-ld: cannot find -lgcc + ``` + + +- **可能原因** + + 交叉编译器gcc\_riscv32的PATH添加错误,如下,在"bin"后多添加了一个“/”,应该删除。 + + ``` + ~/gcc_riscv32/bin/:/data/toolchain/ + ``` + + +- **解决办法** + + 重新修改gcc\_riscv32的PATH,将多余的“/”删除。 + + ``` + ~/gcc_riscv32/bin:/data/toolchain/ + ``` + + +### 编译构建过程中,提示找不到“python” + +- **现象描述** + + 编译构建过程中出现以下错误: + + ``` + -bash: /usr/bin/python: No such file or directory + ``` + + +- **可能原因**1 + + 没有装python。 + +- **解决办法** + + 请按照[安装Python环境](/pages/0001000102) + +- **可能原因2** + + ![](/images/device-dev/faqs/figures/reason-no-python-soft-link.png) + +- **解决办法** + + usr/bin目录下没有python软链接,请运行以下命令添加软链接: + + ``` + # cd /usr/bin/ + # which python3 + # ln -s /usr/local/bin/python3 python + # python --version + ``` + + 例: + + ![](/images/device-dev/faqs/figures/solution-add-soft-link.png) + + +### 编译构建过程中,提示找不到“python3” + +- **现象描述** + + ![](/images/device-dev/faqs/figures/11.png) + + +- **可能原因** + + 没有装python3。 + +- **解决办法** + + 请按照[安装python](/pages/0001000102)。 + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/04.\347\203\247\345\275\225\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/04.\347\203\247\345\275\225\345\270\270\350\247\201\351\227\256\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..39c73a63a669748149da50af9da6a2f395c5c215 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/04.\347\203\247\345\275\225\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -0,0 +1,142 @@ +--- +title: 烧录常见问题 +permalink: /pages/000b0303 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 烧录常见问题 + +- [轻量和小型系统](#section278314413530) + - [烧写选择串口后,提示“Error: Opening COMxx: Access denied”](#section18988185615914) + - [烧写失败](#section1370982513317) + - [串口无回显](#section183421944953) + - [Windows电脑与单板网络连接失败](#section1215410450215) + + +## 轻量和小型系统 + +### 烧写选择串口后,提示“Error: Opening COMxx: Access denied” + +- **现象描述** + + 点击烧写并选择串口后,出现“Error: Opening COMxx: Access denied”。 + + ![](/images/device-dev/faqs/figures/Failed-to-open-the-serial-port.png) + +- **可能原因** + + 串口已经被占用。 + +- 解决方法 + + 检查主机中可能占用该端口的工具,关闭即可。若是当前工具占用,可按以下步骤排查并关闭: + + 1. 排查终端窗口列表,检查是否被monitor或其他终端占用。 + + ![](/images/device-dev/faqs/figures/terminal-list.png) + + 2. 找到占用,点击垃圾桶图标,关闭占用。 + + +### 烧写失败 + +- **现象描述** + + 点击烧写并选择串口后,出现无法烧写的情况。 + +- **可能原因** + + 安装IDE插件DevEco后未重启。 + +- **解决方法** + + 重启IDE。 + + +### 串口无回显 + +- **现象描述** + + 串口显示已连接,重启单板后,回车无任何回显。 + +- **可能原因1** + + 串口连接错误。 + +- **解决办法** + + 修改串口号。 + + 请查看设备管理器,确认连接单板的串口与终端中连接串口是否一致,若不一致,请按镜像运行修改串口号。 + + +- **可能原因2** + + 单板U-boot被损坏。 + +- **解决办法** + + 烧写U-boot。 + + 若上述步骤依旧无法连接串口,可能由于单板U-boot损坏,按下述步骤烧写U-boot。 + + +1. 获取引导文件U-boot。 + + >![](/images/device-dev/public_sys-resources/icon-notice.gif) **须知:** + >单板的U-boot文件请在开源包中获取: + >Hi3516DV300:device\\hisilicon\\hispark\_taurus\\sdk\_liteos\\uboot\\out\\boot\\u-boot-hi3516dv300.bin + >Hi3518EV300:device\\hisilicon\\hispark\_aries\\sdk\_liteos\\uboot\\out\\boot\\u-boot-hi3518ev300.bin + +2. 根据USB烧写步骤烧写U-boot文件。 + + 按照[Hi3516系列USB烧写步骤](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3516_upload-0000001052148681)/[Hi3518系列USB烧写步骤](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3518_upload-0000001057313128)中描述的USB烧写方法,选择对应单板的U-boot文件进行烧写。 + +3. 烧写完成后,登录串口如下图所示。 + + **图 1** U-boot烧写完成串口显示图 + ![](/images/device-dev/faqs/figures/U-boot烧写完成串口显示图.png "U-boot烧写完成串口显示图") + + +### Windows电脑与单板网络连接失败 + +- **现象描述** + + 点击烧写并选择串口后,无法获取文件。 + + **图 2** 网络不通,Hi3516单板无法获取文件 + ![](/images/device-dev/faqs/figures/网络不通-Hi3516单板无法获取文件.png "网络不通-Hi3516单板无法获取文件") + +- **可能原因** + + 单板网络与Windows电脑不联通。 + + Windows电脑防火墙未允许Visual Studio Code联网。 + +- **解决方法** + +1. 检查网线是否连接。 +2. 点击Windows防火墙。 + + ![](/images/device-dev/faqs/figures/hi3516-network-and-firewall-setting.png) + +3. 点击“允许应用通过防火墙”。 + + ![](/images/device-dev/faqs/figures/hi3516-firewall-and-network-protection.png) + +4. 查找Visual Studio Code应用。 + + ![](/images/device-dev/faqs/figures/hi3516-selecting-the-visual-studio-code-application.png) + +5. 勾选Visual Studio Code的专用和公用网络的访问权限。 + + ![](/images/device-dev/faqs/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png) + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/05.\345\206\205\346\240\270\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/05.\345\206\205\346\240\270\345\270\270\350\247\201\351\227\256\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..7eb8094b816de45e3774e17c6f72a149097ce591 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/05.\345\206\205\346\240\270\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -0,0 +1,105 @@ +--- +title: 内核常见问题 +permalink: /pages/000b0304 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 内核常见问题 + +- [基础内核](#section263912372168) + - [LiteOS-A和LiteOS-M内核对外API的差异](#section447571122918) + - [如何分析线程栈溢出](#section8623141711293) + +- [文件系统](#section098519592162) + - [Hi3516开源板以写的模式打开同一个文件失败(LiteOS-A)](#section517972255311) + - [LiteOS内核已支持哪些硬件平台](#section868413518533) + - [LiteOS内核已支持哪几款芯片架构](#section1131661465417) + +- [三方组件](#section971818231178) + - [OpenHarmony已支持哪些三方组件](#section74138185411) + - [在OpenHarmony上使用OpenSSL,出现秘钥长度校验不正确](#section10564614135516) + - [setsockopt是否支持SO\_RCVBUF和SO\_SNDBUF选项](#section2093373215556) + +- [编译链接](#section10955302179) + - [Arm Linux开发的应用程序,OpenHarmony如何在LiteOS-A上运行](#section1164175713557) + - [OpenHarmony在什么系统下编译,使用什么编译器](#section132287223567) + - [LiteOS-M上使用单独编译成静态库的三方组件,出现三方组件中的全局变量值不正确,或调用三方组件的函数后系统卡死](#section15189154225619) + - [LiteOS-A生成目标可执行文件时,提示 use VFP register arguments,xxx.o does not](#section193571012578) + - [clock\_gettime接口获取的时间打印不对](#section8973152015717) + + +## 基础内核 + +### LiteOS-A和LiteOS-M内核对外API的差异 + +基础内核API存在差异,但是LiteOS-A提供标准POSIX接口,LiteOS-M提供标准POSIX和CMSIS接口。如果要支持跨平台,三方适配建议使用POSIX等标准接口。 + +### 如何分析线程栈溢出 + +**问题现象** + +系统异常,提示CURRENT task xxx stack overflow! + +**解决措施** + +1. 创建xxx线程的时候成倍加大栈空间,多次尝试如果问题不复现,则说明任务栈不够,需要调整; +2. 如果成倍加大线程栈,问题依旧复现,则排查xxx线程中是否定义超大数组,或者流程是否存在递归调用; +3. 确认无前述问题,则需要排查是否存在踩内存的情况。 + +## 文件系统 + +### Hi3516开源板以写的模式打开同一个文件失败(LiteOS-A) + +Hi3516开源板使用FAT文件系统,不允许该操作。 + +### LiteOS内核已支持哪些硬件平台 + +开源版本LiteOS-A已支持Hi3516/Hi3518开发板;LiteOS-M已支持Hi3861开发板、STM32F103、野火挑战者STM32F429IGTb、Nucleo\_f767zi等,详细查看kernel/liteos\_m目录下的README\_zh.md文件。 + +### LiteOS内核已支持哪几款芯片架构 + +LiteOS-M已支持risc-v、Cortex-m3\\m4\\m7\\m33、arm9,待支持c-sky、xtensa;LiteOS-A已支持armv7-a,待支持armv8-a,请关注开源社区更新。 + +## 三方组件 + +### OpenHarmony已支持哪些三方组件 + +已提供mbedtls、lwip等开源组件和三方库,可以直接使用;另外提供标准的POSIX接口,可以自行适配。 + +### 在OpenHarmony上使用OpenSSL,出现秘钥长度校验不正确 + +OpenSSL编译选项中要注意架构类型(ARM,X86等)和系统位数(32、64位)是否选择正确。 + +### setsockopt是否支持SO\_RCVBUF和SO\_SNDBUF选项 + +不支持。 + +## 编译链接 + +### Arm Linux开发的应用程序,OpenHarmony如何在LiteOS-A上运行 + +需要用开源版本提供的交叉编译器重新编译应用程序,才可以运行。 + +### OpenHarmony在什么系统下编译,使用什么编译器 + +LiteOS-A在linux环境进行编译,使用LLVM编译器;LiteOS-M在Linux或Windows环境进行编译,使用IAR、Keil、GCC等编译工具。 + +### LiteOS-M上使用单独编译成静态库的三方组件,出现三方组件中的全局变量值不正确,或调用三方组件的函数后系统卡死 + +检查三方组件编译选项中是否有-fPIE -fpie -fPIC -fpic等地址无关编译选项,如果有,则去掉,重新编译成库使用。 + +### LiteOS-A生成目标可执行文件时,提示 use VFP register arguments,xxx.o does not + +请确认xxx.o编译时是否添加-mfloat-abi=xxx -mcpu=xxx -mfpu=xxx编译选项,若没有,则需要添加。 + +### clock\_gettime接口获取的时间打印不对 + +struct timespec结构中tv\_sec为time\_t,而time\_t为long long类型,打印控制符为%lld,请确认实际打印控制符是否正确。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/06.\347\247\273\346\244\215\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/06.\347\247\273\346\244\215\345\270\270\350\247\201\351\227\256\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..a23df13443eca49b0241183d68a025120571f1e8 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/06.\347\247\273\346\244\215\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -0,0 +1,52 @@ +--- +title: 移植常见问题 +permalink: /pages/000b0305 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 移植常见问题 + +- [如何将用户的堆内存挂载进内核](#section21471536184914) + +## 如何将用户的堆内存挂载进内核 + +- 内核堆内存配置的相关宏如下,用户可根据实际情况,在target\_config.h中配置: + +**表 1** 内核堆内存配置相关宏 + + + + + + + + + + + + + + + + +

宏名称

+

描述

+

LOSCFG_SYS_EXTERNAL_HEAP

+

这个宏决定系统是使用内核的内部堆内存还是用户的堆内存,默认为0(即使用内部的堆内存),大小为0x10000;如果用户需要基于外部的堆内存,那么可以将该宏设置为1。

+

LOSCFG_SYS_HEAP_ADDR

+

内核堆内存的起始地址。

+

LOSCFG_SYS_HEAP_SIZE

+

内核堆内存的大小,即LOSCFG_SYS_HEAP_ADDR指定的内存块大小。

+
+ +- 注意事项: + +指定的堆内存范围务必保证没有其他模块使用,避免踩内存,破坏堆内存功能。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/07.\345\220\257\345\212\250\346\201\242\345\244\215\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/07.\345\220\257\345\212\250\346\201\242\345\244\215\345\270\270\350\247\201\351\227\256\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..e8264a9b69b1392299d73e94812f1802bbff5e4c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/07.\345\220\257\345\212\250\346\201\242\345\244\215\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -0,0 +1,70 @@ +--- +title: 启动恢复常见问题 +permalink: /pages/000b0306 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 启动恢复常见问题 + +- [系统启动过程中打印“parse failed!”错误后停止启动](#section835662214302) +- [系统启动过程未结束就自动重启,如此反复持续](#section3857921143117) +- [参数正确的情况下调用SetParameter/GetParameter返回失败](#section548818116328) + +## 系统启动过程中打印“parse failed!”错误后停止启动 + +**现象描述** + +系统启动过程中,打印“\[Init\] InitReadCfg, parse failed! please check file /etc/init.cfg format.”错误,启动过程停止,如下图所示: + +**图 1** 运行报错图 +![](/images/device-dev/faqs/figures/运行报错图.png "运行报错图") + +**可能原因** + +修改init.cfg文件时,漏掉或多加了逗号或括号等,导致init.cfg文件的json格式被破坏。 + +**解决办法** + +仔细检查init.cfg文件,确保其格式符合json格式要求。 + +## 系统启动过程未结束就自动重启,如此反复持续 + +**现象描述** + +镜像烧写完成后系统启动,启动过程未完成即自动重新启动,如此反复持续。 + +**可能原因** + +被init启动的服务都有一个叫做“importance”的属性(详见[第2章表3](/pages/00040d01)描述)。 + +- 当该属性为0时,表示若当前服务进程退出,init不需要重启单板。 +- 当该属性为1时,表示若当前服务进程退出,init需要重启单板。 + +因此出现上述现象的可能原因:有“importance”属性为1的服务在每次启动的过程中都会退出(可能是进程崩溃或出错自动退出),导致init进程自动重启单板。 + +**解决办法** + +1. 需要通过日志确认崩溃或报错退出的服务,并解决其崩溃/报错的问题,然后重新烧写镜像即可。 +2. 也可以将崩溃/报错退出的服务的“importance”属性改为0,然后重新烧写镜像,这样即使其退出,init也不会重启单板。 + +## 参数正确的情况下调用SetParameter/GetParameter返回失败 + +**现象描述** + +在各参数正确的情况下调用SetParameter/GetParameter返回失败。 + +**可能原因** + +程序对SetParameter/GetParameter这两个接口做了权限校验,在各参数正确的情况下调用SetParameter/GetParameter返回操作失败,很有可能是调用者的uid大于1000,没有调用权限。 + +**解决办法** + +无需处理 + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/08.\347\263\273\347\273\237\345\272\224\347\224\250\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/08.\347\263\273\347\273\237\345\272\224\347\224\250\345\270\270\350\247\201\351\227\256\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..9b7a229b3c7d9afadb6a885cff099a33a9070e3c --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/12.\345\217\202\350\200\203/04.\345\270\270\350\247\201\351\227\256\351\242\230-\350\256\276\345\244\207\345\274\200\345\217\221/08.\347\263\273\347\273\237\345\272\224\347\224\250\345\270\270\350\247\201\351\227\256\351\242\230.md" @@ -0,0 +1,224 @@ +--- +title: 系统应用常见问题 +permalink: /pages/000b0307 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 系统应用常见问题 + +- [公共基础库常见问题](#section639433461512) + - [1.LiteOS-A内核\(Hi3516、Hi3518平台\)KV存储路径设置错误,导致KV存储运行失败](#section16520347131511) + +- [视觉应用常见问题](#section787718474161) + - [是否存在一个全局变量,所有的页面都可以访问?](#section187297991718) + - [如何获取dom中的元素](#section1833493719175) + - [如何在页面间传值?](#section184283812183) + - [list如何滚动到某个item?](#section11897734131811) + - [text支持多行吗?](#section5872656121814) + - [为什么控件不显示?](#section7397125317107) + - [如何实现页面滑动?](#section338794422010) + - [Left、Top为什么不生效?](#section2597193611217) + - [动态绑定为什么不生效?](#section6939050172115) + - [如何实现相对定位和绝对定位?](#section5547311192215) + - [如何控制控件的显示与隐藏?](#section16107113352213) + - [使用Margin时,有什么注意事项?](#section1524910142314) + - [使用事件订阅时,有什么注意事项?](#section1537132012231) + - [使用动态绑定时,有什么注意事项?](#section96561452236) + - [swiper loop属性如何生效?](#section690166112414) + - [使用数组时,有什么注意事项?](#section1554552822414) + +- [hdc类问题](#section412357182518) + - [hdc\_std连接不到设备](#section1965012223257) + - [hdc\_std运行不了](#section1157575212515) + + +## 公共基础库常见问题 + +### 1.LiteOS-A内核\(Hi3516、Hi3518平台\)KV存储路径设置错误,导致KV存储运行失败 + +**现象描述** + +LiteOS-A内核\(Hi3516、Hi3518平台\)直接调用KV存储提供的接口,各参数正常的情况下,编译可执行程序运行失败。 + +**可能原因** + +直接运行编译出的可执行文件,没有将程序基于AbilityKit转换成应用,不能由BMS在应用安装时正确设置应用数据存储路径,导致KV存储运行失败。 + +**解决办法** + +显示调用KV存储的UtilsSetEnv接口,设置数据存储路径。 + +``` +UtilsSetEnv("/storage/com.huawei.kv"); +``` + +## 视觉应用常见问题 + +### 是否存在一个全局变量,所有的页面都可以访问? + +当前框架中不存在所有Page都可以访问的全局变量。 + +### 如何获取dom中的元素 + +如何获取dom中的元素? + +通过ref属性获取dom中的元素,详细示例如下图所示;获取的元素只能使用它的方法,不能改变属性。 + +``` + +
+ + +
+ +/* index.js */ +export default { + data: { + images:[ + {src:"common/frame1.png"}, + {src:"common/frame2.png"}, + {src:"common/frame3.png"} + ] + }, + handleClick(){ + //通过$refs属性获取对应的组件,在hml中,组件的ref属性要设置为animator + const animator = this.$refs.animator; + const state = animator.getState(); + if(state == "paused"){ + animator.resume(); + }else if(state == "stopped"){ + animator.start(); + }else{ + animator.pause(); + } + } +} +``` + +### 如何在页面间传值? + +通过router.replace方法中的params参数来传递,参考代码如下: + +第一个页面传递数据: + +``` +router.replace({ + uri:'pages/detail/detail', //要跳转的页面uri + params:{transferData:this.data} //传递的数据,数据个数和名称开发者自己定义, +}); +``` + +第二个界面接受数据: + +``` +onInit(){ + const data = this.transferData; //在onInit函数中接受传递的数据 +} +``` + +### list如何滚动到某个item? + +通过list的scrollTo方法滚动到指定的item,参数是目标item的index。Index参数可以通过scrollend事件获取或者开发者指定。 + +### text支持多行吗? + +text支持多行。通过回车键换行或者是不设置text的高度属性,由控件自动根据内容换行。 + +### 为什么控件不显示? + +**现象描述** + +开发者在hml文件中添加的控件无法显示 + +**可能原因** + +- 未设置width和height值; +- 样式设置错误。 + +**处理步骤** + +\(1\)检查是否设置width和height值,组件必须显式设置width和height值; + +\(2\)检查组件的样式设置是否正确。 + +### 如何实现页面滑动? + +实现页面滑动目前有三种方式:scroll(根组件大小超过屏幕的大小即自动实现scroll效果)、list、swiper。开发者可以参考开发文档查看三者的区别,并加以使用。 + +### Left、Top为什么不生效? + +除根节点外,Left、Top配合Stack组件使用才有效果。 + +### 动态绑定为什么不生效? + +在进行绑定时,必须先将要绑定的对象或者对象的属性进行定义,不能先绑定后定义 + +### 如何实现相对定位和绝对定位? + +使用div、stack(top left属性)来实现相对和绝对定位。 + +### 如何控制控件的显示与隐藏? + +通过display、show和if来控制控件的显示与隐藏。区别在于:if为false时,组件会从VDOM中移除,而show仅是渲染时不可见,组件依然存在于VDOM中。 + +### 使用Margin时,有什么注意事项? + +Stack组件不支持其子组件设置margin属性。 + +### 使用事件订阅时,有什么注意事项? + +在应用运行期间只存在一个page,所以router.replace跳转是先销毁前一个页面,然后在新创建一个界面。因此,如果涉及到事件订阅的页面,每次页面创建时要进行事件订阅,跳转离开界面前取消事件订阅。 + +### 使用动态绑定时,有什么注意事项? + +过多的动态绑定会消耗较多的内存,若非业务需要,尽量不要使用太多的动态绑定。 + +### swiper loop属性如何生效? + +去掉第一个组件或者去掉最后一个组件,剩余的长度大于swiper长度,loop生效。 + +### 使用数组时,有什么注意事项? + +数组元素不宜过多,尽量避免对大数组进行频繁操作。 + +## hdc类问题 + +### hdc\_std连接不到设备 + +- **现象描述** + + 执行 "hdc\_std list targets"命令后结果为:\[Empty\] + +- **解决方法** + 1. 设备没有被识别: + + 在设备管理器中查看是否有hdc设备,在通用串行总线设备中会有“HDC Device”信息。如果没有,hdc无法连接。此时需要插拔设备,或者烧写最新的镜像。 + + 2. hdc\_std工作异常: + + 可以执行"hdc kill"或者"hdc start -r"杀掉hdc服务或者重启hdc服务,然后再执行hdc list targets查看是否已经可以获取设备信息。 + + 3. hdc\_std与设备不匹配: + + 如果设备烧写的是最新镜像,hdc\_std也需要使用最新版本。由于hdc\_std会持续更新,请从开源仓developtools\_hdc\_standard中获取,具体位置在该开源仓的prebuilt目录。 + + + +### hdc\_std运行不了 + +- **现象描述** + + 点击hdc\_std.exe文件无法运行。 + +- **解决方法** + + hdc\_std.exe不需要安装,直接放到磁盘上就能使用,也可以添加到环境变量中。通过打开cmd执行hdc\_std命令直接使用。 + + diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\272\224\347\224\250\345\274\200\345\217\221-\345\252\222\344\275\223/01.\351\237\263\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\272\224\347\224\250\345\274\200\345\217\221-\345\252\222\344\275\223/01.\351\237\263\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" deleted file mode 100644 index 7f74195acaf414f20be397a83dbecf27c571699d..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/12.\345\272\224\347\224\250\345\274\200\345\217\221-\345\252\222\344\275\223/01.\351\237\263\351\242\221\345\274\200\345\217\221\346\246\202\350\277\260.md" +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: 音频开发概述 -permalink: /pages/000b00 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 音频开发概述 - -- [基本概念](#section296512102281) - -OpenHarmony音频模块支持音频业务的开发,提供音频相关的功能,主要包括音频播放、音量管理等。 - ->![](/images/zh-cn/application-dev/media/public_sys-resources/icon-note.gif) **说明:** ->由于权限问题,此部分功能在标准系统暂不可用,待更新。 - -## 基本概念 - -- **采样** - - 采样是指将连续时域上的模拟信号按照一定的时间间隔采样,获取到离散时域上离散信号的过程。 - -- **采样率** - - 采样率为每秒从连续信号中提取并组成离散信号的采样次数,单位用赫兹(Hz)来表示。通常人耳能听到频率范围大约在20Hz~20kHz之间的声音。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。 - -- **声道** - - 声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。 - -- **音频帧** - - 音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms\~60ms为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。 - -- **PCM** - - PCM(Pulse Code Modulation),即脉冲编码调制,是一种将模拟信号数字化的方法,是将时间连续、取值连续的模拟信号转换成时间离散、抽样值离散的数字信号的过程。 - - diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\272\224\347\224\250\345\274\200\345\217\221-\345\252\222\344\275\223/02.\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\272\224\347\224\250\345\274\200\345\217\221-\345\252\222\344\275\223/02.\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" deleted file mode 100644 index 7e0aba6416d48f1027939b1718421b3dabd2d04d..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/12.\345\272\224\347\224\250\345\274\200\345\217\221-\345\252\222\344\275\223/02.\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ /dev/null @@ -1,252 +0,0 @@ ---- -title: 音频播放开发指导 -permalink: /pages/000b01 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 音频播放开发指导 - -- [场景介绍](#section910413166166) -- [接口说明](#section1225204317126) - -## 场景介绍 - -音频播放的主要工作是将音频数据转码为可听见的音频模拟信号并通过输出设备进行播放,同时对播放任务进行管理。 - -**图 1** 音频播放状态机 -![](/images/zh-cn/application-dev/media/figures/音频播放状态机.png "音频播放状态机") - -## 接口说明 - -**表 1** media - - - - - - - - - - - - - -

接口名

-

描述

-

media.createAudioPlayer()

-

创建AudioPlayer实例。

-

AudioPlayer

-

提供音频播放相关功能。

-
- -**表 2** 音频播放相关的interface AudioPlayer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

接口名

-

描述

-

release()

-

释放音频资源。

-

play()

-

开始播放音频源。

-

pause()

-

暂停播放。

-

stop()

-

停止播放。

-

reset()7+

-

重置播放音频源。

-

setVolume(vol: number)

-

改变音频播放音量

-

seek(timeMs: number)

-

改变播放位置。

-

src:string

-

音频播放的媒体URI。

-

state:AudioState

-

播放的状态属性。

-

currentTime:number

-

音频的当前播放位置。

-

duration:number

-

音频播放的时长。

-

loop:boolean

-

音频的循环播放属性。

-

on('play', function callback)

-

监听音频播放开始事件。

-

on('pause', function callback)

-

监听音频播放暂停事件。

-

on('stop', function callback)

-

监听音频播放停止事件。

-

on('reset', function callback)

-

监听音频播放重置事件。

-

on('finish',function callback)

-

监听音频播放结束事件。

-

on('error', function callback)

-

监听音频播放错误事件。

-

on('dataload', function callback)

-

监听音频播放加载数据事件。

-

on('volumeChange', function callback)

-

监听音频播放音量变化事件。

-

on('timeUpdate', function callback)

-

监听音频播放进度改变事件。

-
- -1. 创建音频播放器。 - - ``` - var player = media.createAudioPlayer(); - ``` - -2. 设置消息监听事件。 - - ``` - player.on('play', (err, action) => { - if (err) { - console.error('Error returned in the play() callback.'); - return; - } - console.info('Current player duration: '+ player.duration); - console.info('Current player time: ' + player.currentTime); - console.info('Current player status: '+player.state); - console.info('Pause MP3'); - player.pause(); - }); - player.on('pause', (err, action) => { - if (err) { - console.error('Error returned in the pause() callback.'); - return; - } - console.info('Current player status: ' + player.state); - console.info('Current player time: ' + player.currentTime); - player.seek(30000); // Seek for 30 seconds. - }); - player.on('stop', (err, action) => { - if (err) { - console.error('Error returned in the stop() callback.'); - return; - } - console.info('stop callback invoked. State:' + player.state); - player.reset(); - }); - player.on('dataLoad', (err, action) => { - if (err) { - console.error('Error returned in the dataLoad() callback.'); - return; - } - console.info('dataLoad callback invoked. Current time: ' + player.currentTime); - console.info('Duration of the source:' + player.duration); - player.play(); - }); - player.on('reset', (err, action) => { - if (err) { - console.error('Error returned in the reset() callback.'); - return; - } - console.info('reset callback invoked.'); - player.release(); - }); - player.on('finish', (err, action) => { - if (err) { - console.error('Error returned in the finish() callback.'); - return; - } - console.info('finish callback invoked.'); - }); - player.on('timeUpdate', (seekTime, action) => { - console.info('Seek time: ' + seekTime); - console.info('Current player time: ' + player.currentTime); - var newTime = player.currentTime; - if(newTime == 30000) { - console.info('Seek succeeded. New time: ' + newTime); - } else { - console.error('Seek failed: ', + newTime); - } - player.stop(); - }); - player.on('error', (err) => { - console.error('Player error: ${err.message}'); - }); - ``` - -3. 启动播放。 - - ``` - var audioSourceMp3 = 'file://test.mp3'; - player.src = audioSourceMp3; - player.loop = true; - ``` - - diff --git "a/website/docs/01.\346\226\207\346\241\243/12.\345\272\224\347\224\250\345\274\200\345\217\221-\345\252\222\344\275\223/03.\351\237\263\351\242\221\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/12.\345\272\224\347\224\250\345\274\200\345\217\221-\345\252\222\344\275\223/03.\351\237\263\351\242\221\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" deleted file mode 100644 index 1241b29310fd6228618905d17c9454e9061f56d6..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/12.\345\272\224\347\224\250\345\274\200\345\217\221-\345\252\222\344\275\223/03.\351\237\263\351\242\221\347\256\241\347\220\206\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ /dev/null @@ -1,290 +0,0 @@ ---- -title: 音频管理开发指导 -permalink: /pages/000b02 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 音频管理开发指导 - -- [场景介绍](#section1269212236329) -- [接口说明](#section5122103123215) -- [开发步骤](#section1772415410138) - -## 场景介绍 - -音频管理的主要工作是音量调节与音量查询,以及输入/输出设备查询。 - -## 接口说明 - -**表 1** audio的相关接口 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

接口名

-

描述

-

getAudioManager(): AudioManager

-

获得音频管理器。

-

AudioManager

-

音频管理器。

-

AudioDeviceDescriptor

-

描述音频设备。

-

AudioVolumeType

-

表示音频流类型的枚举。

-

DeviceFlag

-

表示可获取的设备种类的枚举。

-

DeviceRole

-

表示设备角色的枚举。

-

DeviceType

-

表示设备类型的枚举。

-
- -**表 2** 音频管理相关的interface AudioManager - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

接口名

-

描述

-

setVolume(audioType: AudioVolumeType,volume: number,callback: AsyncCallback<void>): void

-

改变某个流的音量。

-

setVolume(audioType: AudioVolumeType,volume: number): Promise<void>

-

改变某个流的音量。

-

getVolume(audioType: AudioVolumeType, callback: AsyncCallback<number>): void

-

获得某个流的音量。

-

getVolume(audioType: AudioVolumeType): Promise<number>

-

获得某个流的音量。

-

getMinVolume(audioType: AudioVolumeType, callback: AsyncCallback<number>): void

-

获得某个流的最小音量。

-

getMinVolume(audioType: AudioVolumeType): Promise<number>

-

获得某个流的最小音量。

-

getMaxVolume(audioType: AudioVolumeType, callback: AsyncCallback<number>): void

-

获得某个流的最大音量。

-

getMaxVolume(audioType: AudioVolumeType): Promise<number>

-

获得某个流的最大音量。

-

getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback<AudioDeviceDescriptors>): void

-

获得设备列表。

-

getDevices(deviceFlag: DeviceFlag): Promise<AudioDeviceDescriptors>

-

获得设备列表。

-
- -**表 3** 表示音频设备的interface AudioDeviceDescriptor - - - - - - - - - - - - - -

属性

-

描述

-

deviceRole: DeviceRole

-

设备角色。

-

deviceType: DeviceType

-

设备类型。

-
- -**表 4** 表示音频流类型的枚举AudioVolumeType - - - - - - - - - - - - - -

枚举值

-

描述

-

MEDIA = 1

-

媒体声音。

-

RINGTONE = 2

-

铃声。

-
- -**表 5** 表示可获取的设备种类的枚举DeviceFlag - - - - - - - - - - - - - - - - -

枚举值

-

描述

-

OUTPUT_DEVICES_FLAG = 1

-

输出设备。

-

INPUT_DEVICES_FLAG = 2

-

输入设备。

-

ALL_DEVICES_FLAG = 3

-

所有设备。

-
- -**表 6** 表示设备角色的枚举DeviceRole - - - - - - - - - - - - - -

枚举值

-

描述

-

INPUT_DEVICE = 1

-

输入设备。

-

OUTPUT_DEVICE = 2

-

输出设备。

-
- -**表 7** 表示设备类型的枚举DeviceType - - - - - - - - - - - - - - - - - - - - - - - - - -

枚举值

-

描述

-

INVALID = 0

-

无效。

-

SPEAKER = 1

-

扬声器。

-

WIRED_HEADSET = 2

-

有线耳机。

-

BLUETOOTH_SCO = 3

-

蓝牙设备。

-

BLUETOOTH_A2DP = 4

-

支持A2DP的蓝牙设备。

-

MIC = 5

-

麦克风。

-
- -## 开发步骤 - -1. 获取音频控制器。 - - ``` - const audioManager = audio.getAudioManager(); - ``` - -2. 改变媒体流的声音。 - - ``` - audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error(`failed to get volume ${err.message}`); - return; - } - console.log(`Media getVolume ${value}`); - }); - ``` - - diff --git "a/website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/02.IPC\344\270\216RPC\351\200\232\344\277\241\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/02.IPC\344\270\216RPC\351\200\232\344\277\241\345\274\200\345\217\221\346\214\207\345\257\274.md" deleted file mode 100644 index 9b2f45c0b8f275701a5e919a133e02bdb850808b..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/13.\345\272\224\347\224\250\345\274\200\345\217\221-\347\275\221\347\273\234\350\277\236\346\216\245/02.IPC\344\270\216RPC\351\200\232\344\277\241\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: IPC与RPC通信开发指导 -permalink: /pages/000c01 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# IPC与RPC通信开发指导 - -- [场景介绍](#section18502174174019) -- [接口说明](#section1633115419401) -- [开发步骤](#section4207112818418) - -## 场景介绍 - -IPC/RPC的主要工作是让运行在不同进程的Proxy和Stub互相通信,包括Proxy和Stub运行在不同设备的情况。 - -## 接口说明 - -**表 1** Native侧IPC接口 - - - - - - - - - - - - - - - - - - - - -

类/接口

-

方法

-

功能说明

-

IRemoteBroker

-

sptr<IRemoteObject> AsObject()

-

返回通信对象。派生类需要实现,Stub端返回RemoteObject对象本身,Proxy端返回代理对象。

-

IRemoteStub

-

virtual int OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)

-

请求处理方法,派生类需要重写,处理Proxy的请求并返回结果。

-

IRemoteProxy

-
  

业务Proxy类派生自IRemoteProxy类。

-
- -## 开发步骤 - -**Native侧开发步骤** - -1. 定义IPC接口ITestAbility - - SA接口继承IPC基类接口IRemoteBroker,接口里定义描述符、业务函数和消息码,其中业务函数在Proxy端和Stub端都需要实现。 - - ``` - class ITestAbility : public IRemoteBroker { - public: - // DECLARE_INTERFACE_DESCRIPTOR是必须的, 入参需使用std::u16string; - DECLARE_INTERFACE_DESCRIPTOR(u"test.ITestAbility"); - int TRANS_ID_PING_ABILITY = 1; // 定义消息码 - virtual int TestPingAbility(const std::u16string &dummy) = 0; // 定义业务函数 - }; - ``` - -2. 定义和实现服务端TestAbilityStub - - 该类是和IPC框架相关的实现,需要继承 IRemoteStub。Stub端作为接收请求的一端,需重写OnRemoteRequest方法用于接收客户端调用。 - - ``` - class TestAbilityStub : public IRemoteStub { - public: - virtual int OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override; - int TestPingAbility(const std::u16string &dummy) override; - }; - - int TestServiceStub::OnRemoteRequest(uint32_t code, - MessageParcel &data, MessageParcel &reply, MessageOption &option) - { - switch (code) { - case TRANS_ID_PING_ABILITY: { - std::u16string dummy = data.ReadString16(); - int result = TestPingAbility(dummy); - reply.WriteInt32(result); - return 0; - } - default: - return IPCObjectStub::OnRemoteRequest(code, data, reply, option); - } - } - ``` - -3. 定义服务端业务函数具体实现类TestAbility - - ``` - class TestAbility : public TestAbilityStub { - public: - int TestPingAbility(const std::u16string &dummy); - } - - int TestAbility::TestPingAbility(const std::u16string &dummy) { - return 0; - } - ``` - -4. 定义和实现客户端TestAbilityProxy - - 该类是Proxy端实现,继承IRemoteProxy,调用SendRequest接口向Stub端发送请求,对外暴露服务端提供的能力。 - - ``` - class TestAbilityProxy : public IRemoteProxy { - public: - explicit TestAbilityProxy(const sptr &impl); - int TestPingService(const std::u16string &dummy) override; - private: - static inline BrokerDelegator delegator_; // 方便后续使用iface_cast宏 - } - - TestAbilityProxy::TestAbilityProxy(const sptr &impl) - : IRemoteProxy(impl) - { - } - - int TestAbilityProxy::TestPingService(const std::u16string &dummy) { - MessageOption option; - MessageParcel dataParcel, replyParcel; - dataParcel.WriteString16(dummy); - int error = Remote()->SendRequest(TRANS_ID_PING_ABILITY, dataParcel, replyParcel, option); - int result = (error == ERR_NONE) ? replyParcel.ReadInt32() : -1; - return result; - } - ``` - -5. SA注册与启动 - - SA需要将自己的TestAbilityStub实例通过AddSystemAbility接口注册到SystemAbilityManager,设备内与分布式的注册参数不同。 - - ``` - // 注册到本设备内 - auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); - samgr->AddSystemAbility(said, new TestAbility()); - - // 在组网场景下,会被同步到其他设备上 - auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); - ISystemAbilityManager::SAExtraProp saExtra; - saExtra.isDistributed = true; // 设置为分布式SA - int result = samgr->AddSystemAbility(said, new TestAbility(), saExtra); - ``` - -6. SA获取与调用 - - 通过SystemAbilityManager的GetSystemAbility方法可获取到对应SA的代理IRemoteObject,然后构造TestAbilityProxy即可。 - - ``` - // 获取本设备内注册的SA的proxy - sptr samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); - sptr remoteObject = samgr->GetSystemAbility(said); - sptr testAbility = iface_cast(remoteObject); // 使用iface_cast宏转换成具体类型 - - // 获取其他设备注册的SA的Proxy - sptr samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); - sptr remoteObject = samgr->GetSystemAbility(sdid, deviceId); // deviceId是指定设备的标识符 - sptr proxy(new TestAbilityProxy(remoteObject)); // 直接构造具体Proxy - ``` - - diff --git "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/01.\345\217\202\344\270\216\350\264\241\347\214\256.md" "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/01.\345\217\202\344\270\216\350\264\241\347\214\256.md" similarity index 67% rename from "website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/01.\345\217\202\344\270\216\350\264\241\347\214\256.md" rename to "website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/01.\345\217\202\344\270\216\350\264\241\347\214\256.md" index 2bbe0aad8e9e8e165a3b8ff9ecd7804bdeead823..d2bc5330704dfa4495865244a29e518aefacc2d6 100644 --- "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/01.\345\217\202\344\270\216\350\264\241\347\214\256.md" +++ "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/01.\345\217\202\344\270\216\350\264\241\347\214\256.md" @@ -1,6 +1,6 @@ --- title: 参与贡献 -permalink: /pages/000e00 +permalink: /pages/000c00 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:31:41 --- # 参与贡献 @@ -21,11 +21,11 @@ date: 2021-12-30 12:57:47 您必须首先签署“开发者原创声明”,然后才能参与社区贡献。 -点击[这里](https://dco.openharmony.io/sign/Z2l0ZWUlMkZvcGVuX2hhcm1vbnk=)签署、查看签署状态。 +点击[这里](https://dco.openharmony.io/sign/Z2l0ZWUlMkZvcGVuX2hhcm1vbnk=)签署,点击[这里](https://dco.openharmony.io/check-sign-status)查询签署状态。 #### 行为准则 -OpenHarmony是一个开源社区。它完全依赖于社区提供友好的开发和协作环境,所以在参与社区贡献之前,请先阅读并遵守OpenHarmony社区的[行为守则](/pages/000e01)。 +OpenHarmony是一个开源社区。它完全依赖于社区提供友好的开发和协作环境,所以在参与社区贡献之前,请先阅读并遵守OpenHarmony社区的[行为守则](/pages/000c01)。 ### 找到感兴趣的SIG @@ -33,13 +33,17 @@ OpenHarmony是一个开源社区。它完全依赖于社区提供友好的开发 ### 开始贡献 -如何贡献代码,请参考[贡献代码](/pages/000e02)。 +如何贡献代码,请参考[贡献代码](/pages/000c02)。 + +## 自测试验证 + +如何根据测试需求开发相关测试用例,请参考[测试子系统](/pages/00000117)。 ## 贡献文档 -如何贡献文档,请参考[贡献文档](/pages/000e04)。 +如何贡献文档,请参考[贡献文档](/pages/extra/7cdb15/)。 ## 社区沟通与交流 -有关详细信息,请参考[社区沟通与交流](/pages/extra/f67e87/)。 +有关详细信息,请参考[社区沟通与交流](/pages/000c05)。 diff --git "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/02.\350\241\214\344\270\272\345\207\206\345\210\231.md" "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/02.\350\241\214\344\270\272\345\207\206\345\210\231.md" similarity index 98% rename from "website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/02.\350\241\214\344\270\272\345\207\206\345\210\231.md" rename to "website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/02.\350\241\214\344\270\272\345\207\206\345\210\231.md" index a86bbd24ab36ac536e0c42107026666a42245e61..6bb139f606a4fbcbe009a6db18ca6dbf91fecdfa 100644 --- "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/02.\350\241\214\344\270\272\345\207\206\345\210\231.md" +++ "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/02.\350\241\214\344\270\272\345\207\206\345\210\231.md" @@ -1,6 +1,6 @@ --- title: 行为准则 -permalink: /pages/000e01 +permalink: /pages/000c01 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:31:41 --- # 行为准则 diff --git "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/03.\350\264\241\347\214\256\344\273\243\347\240\201.md" "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/03.\350\264\241\347\214\256\344\273\243\347\240\201.md" similarity index 46% rename from "website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/03.\350\264\241\347\214\256\344\273\243\347\240\201.md" rename to "website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/03.\350\264\241\347\214\256\344\273\243\347\240\201.md" index 7d5027cdcbf264c67b6838ad2490aeae705484e0..e35359954fb5cbac8d0c775b7a6ebe8dd70897d9 100644 --- "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/03.\350\264\241\347\214\256\344\273\243\347\240\201.md" +++ "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/03.\350\264\241\347\214\256\344\273\243\347\240\201.md" @@ -1,6 +1,6 @@ --- title: 贡献代码 -permalink: /pages/000e02 +permalink: /pages/000c02 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:31:41 --- # 贡献代码 @@ -17,28 +17,35 @@ date: 2021-12-30 12:57:47 ### 设计规范 -[OpenHarmony API治理章程](/pages/extra/d012a7/) +[OpenHarmony架构设计原则](https://gitee.com/openharmony/community/blob/master/sig/sig-QA/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99.md) -[OpenHarmony安全设计规范](/pages/extra/2cc67e/) +[OpenHarmony API治理章程](/pages/extra/8f1b70/) + +[OpenHarmony安全设计规范](/pages/extra/9fd3db/) + +[OpenHarmony编译规范](https://gitee.com/openharmony/community/blob/master/sig/sig-QA/%E7%BC%96%E8%AF%91%E8%A7%84%E8%8C%83.md) ### 代码风格 请遵循OpenHarmony编程规范,进行代码开发、检视、测试,务必保持代码风格统一。 -- [C++语言编程规范](/pages/extra/350529/) -- [C语言编程规范](/pages/extra/6f48b1/) -- [JavaScript语言编程规范](/pages/extra/38b13b/) +- [C++语言编程规范](/pages/extra/65d115/) +- [C语言编程规范](/pages/extra/02fad4/) +- [JavaScript语言编程规范](/pages/extra/af38fc/) - [Python语言编程规范](https://pep8.org/) -- [C&C++语言安全编程指南](/pages/extra/e35557/) -- [Java语言安全编程指南](/pages/extra/d38f7b/) +- [C&C++语言安全编程指南](/pages/extra/e48a5b/) +- [Java语言安全编程指南](/pages/extra/c4548f/) +- [Log打印规范](/pages/extra/b7c90f/) ### 开源软件引入 -若要引入新的第三方开源软件到OpenHarmony项目中,请参考[第三方开源软件引入指导](/pages/extra/ba9721/) +若要引入新的第三方开源软件到OpenHarmony项目中,请参考[第三方开源软件引入指导](/pages/extra/651de8/) ## 贡献工作流 -有关详细信息,请参考[贡献流程](/pages/000e06)。 +有关详细信息,请参考[贡献流程](/pages/000c03)。 + +[代码门禁详细质量要求](https://gitee.com/openharmony/community/blob/master/sig/sig-QA/%E4%BB%A3%E7%A0%81%E9%97%A8%E7%A6%81%E8%A6%81%E6%B1%82.md)。 ## 社区安全问题披露 diff --git "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/07.\350\264\241\347\214\256\346\265\201\347\250\213.md" "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/04.\350\264\241\347\214\256\346\265\201\347\250\213.md" similarity index 92% rename from "website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/07.\350\264\241\347\214\256\346\265\201\347\250\213.md" rename to "website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/04.\350\264\241\347\214\256\346\265\201\347\250\213.md" index d978f2f3dd6e0be13fd121ceae043ab0dfa1cdcd..b52599adc9dbba9a2df436a05b1ee10df68a0108 100644 --- "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/07.\350\264\241\347\214\256\346\265\201\347\250\213.md" +++ "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/04.\350\264\241\347\214\256\346\265\201\347\250\213.md" @@ -1,6 +1,6 @@ --- title: 贡献流程 -permalink: /pages/000e06 +permalink: /pages/000c03 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:31:41 --- # 贡献流程 @@ -58,7 +58,7 @@ date: 2021-12-30 12:57:47 - 您可以在仓库页面内复制远程仓库的拷贝地址,得到$remote\_link: **图 1** 复制远程仓库 - ![](/images/zh-cn/contribute/figures/复制远程仓库.png "复制远程仓库") + ![](/images/contribute/figures/复制远程仓库.png "复制远程仓库") - 在本地电脑执行拷贝命令: @@ -96,6 +96,7 @@ date: 2021-12-30 12:57:47 更新您的本地分支 ``` + git remote add origin $remote_link git fetch origin git checkout master git pull --rebase @@ -144,7 +145,7 @@ repo config --global repo.token 211XXXXXXXXXXXXXXXXXXXXXXXX 2. 在码云上任意一个此次要修改的仓下创建issue\(类似于gerrit的changeID功能,用来关联多个耦合仓修改\),并记录下issue编号\(如下图中的issue编号是\#I1TVV4\)\(如果不涉及多个仓耦合修改,则此步骤不需要\): -![](/images/zh-cn/contribute/figures/无标题1.png) +![](/images/contribute/figures/无标题1.png) 3. 在本地代码工作区新建分支,修改代码,并提交: @@ -194,15 +195,15 @@ repo push --br="20200903" --d="master" --content="#I1TVV4" 在弹出的编辑页面将需要提交仓、分支、commit的注释符打开: -![](/images/zh-cn/contribute/figures/无标题2.png) +![](/images/contribute/figures/无标题2.png) 保存退出,repo会自动将本地分支推送到远端fork仓\(如果没有fork仓,系统会自动创建fork仓\)里,并自动生成PR: -![](/images/zh-cn/contribute/figures/无标题3.png) +![](/images/contribute/figures/无标题3.png) 同时自动将PR和Issue关联: -![](/images/zh-cn/contribute/figures/无标题4.png) +![](/images/contribute/figures/无标题4.png) ## 创建Pull Request(如已通过repo工具自动创建PR,则此步忽略) @@ -210,7 +211,7 @@ repo push --br="20200903" --d="master" --content="#I1TVV4" 详细操作请参考码云帮助中心的开发协作指导:[https://gitee.com/help/articles/4128](https://gitee.com/help/articles/4128) ->![](/images/zh-cn/contribute/public_sys-resources/icon-notice.gif) **须知:** +>![](/images/contribute/public_sys-resources/icon-notice.gif) **须知:** >**多个代码仓存在编译依赖时如何同时发起构建:** >OS\(操作系统\)开发时,经常会遇到多个代码仓的修改具有编译依赖关系,需要同时构建、同时合入。为此码云平台将Issue作为具有编译依赖的多个代码仓提交PR的关联标识。具体操作如下: >1. 在此次提交的任意一个代码仓上创建Issue。 @@ -245,6 +246,8 @@ repo push --br="20200903" --d="master" --content="#I1TVV4" 如果门禁通过,该Issue关联的所有PR均会自动标记“测试通过”。 +详细参考[代码门禁质量要求](https://gitee.com/openharmony/community/blob/master/sig/sig-QA/%E4%BB%A3%E7%A0%81%E9%97%A8%E7%A6%81%E8%A6%81%E6%B1%82.md)。 + ## CI门户 OpenHarmony通过持续集成(CI,Continuous Integration)及时发现代码问题,确保代码质量可靠和功能稳定,包括: @@ -256,10 +259,10 @@ CI门户是为了便于开发者及时查看、分析每日构建和代码门禁 示例:[CI门户入口](http://ci.openharmony.cn/) -![CI门户](/images/zh-cn/contribute/figures/ci-portal.png) +![CI门户](/images/contribute/figures/ci-portal.png) ## 代码审查 请参考码云帮助中心:[https://gitee.com/help/articles/4304](https://gitee.com/help/articles/4304) -**相关主题:[FAQ](/pages/000e03)** +**相关主题:[FAQ](/pages/000c06)** diff --git "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/06.\345\206\231\344\275\234\350\247\204\350\214\203.md" "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/05.\350\264\241\347\214\256\346\226\207\346\241\243/01.\345\206\231\344\275\234\350\247\204\350\214\203.md" similarity index 94% rename from "website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/06.\345\206\231\344\275\234\350\247\204\350\214\203.md" rename to "website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/05.\350\264\241\347\214\256\346\226\207\346\241\243/01.\345\206\231\344\275\234\350\247\204\350\214\203.md" index 8d700982ddedcefb9e4f87d7d946f6b0e2005e28..27880856061f6d7e5fb11c761898369f52cca4fa 100644 --- "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/06.\345\206\231\344\275\234\350\247\204\350\214\203.md" +++ "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/05.\350\264\241\347\214\256\346\226\207\346\241\243/01.\345\206\231\344\275\234\350\247\204\350\214\203.md" @@ -1,6 +1,6 @@ --- title: 写作规范 -permalink: /pages/000e05 +permalink: /pages/000c0400 navbar: true sidebar: true prev: true @@ -9,7 +9,7 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:31:41 --- # 写作规范 @@ -71,7 +71,7 @@ date: 2021-12-30 12:57:47 “OpenHarmony\_DOCUMENTS/docs/quick-start/pic“目录下,文档中使用相对路径引用图片。 ->![](/images/zh-cn/contribute/public_sys-resources/icon-caution.gif) **注意:** +>![](/images/contribute/public_sys-resources/icon-caution.gif) **注意:** >请使用原创图片,避免存在知识产权侵权风险。 - 图形清晰可辨识,图形信息完整,如流程图有“开始”和“结束”。 @@ -80,14 +80,14 @@ date: 2021-12-30 12:57:47 - 中文用中文图,英文用英文图形。 - 图片建议根据内容命名,只用数字序列不利于后续图片的继承。 ->![](/images/zh-cn/contribute/public_sys-resources/icon-note.gif) **说明:** +>![](/images/contribute/public_sys-resources/icon-note.gif) **说明:** >引用方式: >!\[\]\(./pic/pic-standard.png\) 如果是自制图片,配色请参考如下,格式不限png/jpg/gif...均可。 **图 1** 配色示例 -![](/images/zh-cn/contribute/figures/配色示例.png "配色示例") +![](/images/contribute/figures/配色示例.png "配色示例") 如果是截图请参考如下,如需突出图形中的关键信息,可增加红色框线或者文字备注说明。 @@ -102,7 +102,7 @@ date: 2021-12-30 12:57:47 字体大小:10pt **图 2** 截图示例 -![](/images/zh-cn/contribute/figures/截图示例.png "截图示例") +![](/images/contribute/figures/截图示例.png "截图示例") **表格** diff --git "a/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/05.\350\264\241\347\214\256\346\226\207\346\241\243/02.\344\270\272\345\217\221\350\241\214\347\211\210\346\234\254\346\222\260\345\206\231\351\205\215\345\245\227\346\226\207\346\241\243.md" "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/05.\350\264\241\347\214\256\346\226\207\346\241\243/02.\344\270\272\345\217\221\350\241\214\347\211\210\346\234\254\346\222\260\345\206\231\351\205\215\345\245\227\346\226\207\346\241\243.md" new file mode 100644 index 0000000000000000000000000000000000000000..45705c06e9a2600209b67c78afadc305fa533d47 --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/05.\350\264\241\347\214\256\346\226\207\346\241\243/02.\344\270\272\345\217\221\350\241\214\347\211\210\346\234\254\346\222\260\345\206\231\351\205\215\345\245\227\346\226\207\346\241\243.md" @@ -0,0 +1,135 @@ +--- +title: 为发行版本撰写配套文档 +permalink: /pages/000c0401 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 为发行版本撰写配套文档 + +为了帮助开发者更高效使用OpenHarmony社区的每个Release版本,社区会根据每个版本规划的需求特性提供配套文档(如指南、API参考、开发示例、Release Notes、API Changelog、FAQ等)。有的需求涉及新增功能特性和文档,有的需求的是对现有特性和文档内容更新。 + +## OpenHarmony社区文档开发流程 + +每个SIG团队在规划功能特性需求时,需要判断该需求是否涉及新增开发者文档、或变更现有开发者文档,分解需求给SIG Docs 团队,便于文档需求跟踪闭环。SIG Docs团队会根据相关需求,提供文档设计意见,并配合各业务SIG团队完成开发者文档的评审、翻译和发布。社区文档完整开发流程如下: + +![OpenHarmony社区文档开发流程](/images/contribute/figures/docs-sig.png) + +## 业务SIG团队成员或其他开发人员 + +通过每个业务SIG团队为发行版本撰写配套文档基础稿,欢迎社区开发人员参与相关功能特性文档开发。 + +### 分解文档需求 + +1. 在业务SIG需求Issue中给出【配套文档】的分解,如果涉及开发者文档新增、更新,需要关联SIG-Docs。 + +2. 在 [OpenHarmony社区版本发布计划](https://gitee.com/openharmony/release-management/blob/master/OpenHarmony-RoadMap.md)中查看对应版本的特性需求,此文档中给出了OpenHarmony的版本发布时间计划、各版本交付特性、特性状态,所属SIG。 + + 如果该特性需求涉及文档交付,需要在对应的Need Docs列补充判断,SIG_Docs,便于SIG Docs团队闭环跟踪文档交付。 + + +### 开发文档 + +如果你是某个业务SIG的成员,负责开发某一新特性,你需要与SIG Docs一起配合,确保在版本发布之前完成该新特性文档开发。否则,在最终的版本发布中未提供配套文档的特性可能被移除。 + +如果你需要文档组织方面的帮助,请在`#SIG-Docs` ZULIK频道中提问求助。 + +1. 参考[评审人沟通表](/pages/extra/0c10ad/),联系SIG Docs资料作者,沟通文档设计建议。 +2. 获取[文档模板](template),了解文档写作规范。 +3. 尽可能为功能特性提供详细的文档及使用说明,完成功能特性初稿后,提交PR并在PR描述中提供对应的需求Issue链接。 + +### 提交PR评审 + +所有新增内容的PR评审,为确保技术描述准确性需要指定相应业务SIG的技术专家参与技术评审,同时指定SIG Docs的资料专家评审文档规范性内容,请参考[评审人沟通表](/pages/extra/0c10ad/)在PR评论区@相关专家。也可以在`#SIG-Docs` ZULIK频道中反馈评审需求。 + +在评审周期内,所有评审意见闭环修改后,该PR通过审核可以合并入仓的必要条件: + +- 技术评审专家审核后给出`TechApprove`的评论。 +- 文档规范性评审专家审核后给出`DocsApprove`的评论。 + +### 提交测试 + +文档随版本转测试,测试过程中的文档问题,由SIG Test团队测试人员以Issue形式提交到Docs仓,对应文档作者闭环确认测试意见并完成文档修改。 + +### 提交翻译 + +#### Docs仓文档翻译 + +OpenHarmony社区为开发者提供中文、英文的官方文档,中文文档完成评审、测试定稿后,可提交翻译需求Issue,由SIG Docs团队的翻译专家完成英文文档。 + +翻译专家通过PR提交英文文档,并在PR描述中提供对应的中文需求Issue链接。为确保技术翻译描述准确性需要指定相应业务SIG的技术专家参与技术评审,可以是中文文档作者,请参考[评审人沟通表](/pages/extra/0c10ad/)在PR评论区@相关专家。 + +在评审周期内,所有评审意见闭环修改后,该PR通过审核可以合并入仓的必要条件: + +- 技术评审专家审核后给出`TechApprove`的评论。 +- 英文文档规范性评审专家审核后给出`DocsApprove`的评论。 + +#### 非Docs仓文本类翻译 + +针对OpenHarmony核心业务SIG的非Docs仓翻译需求(如API注释等),可提交翻译需求Issue到Docs仓,SIG Docs团队的翻译专家完成英文文档交付。 + +提交翻译需求时,需确保: + +1. 相关中文文档为发布交付件质量标准。 +2. 提供中文文档PR或相关文档路径。 +3. 中文临时文件可提交至[SIG-Docs仓](https://gitee.com/openharmony/community/tree/master/sig/)。 + +## Docs SIG团队成员或文档贡献者 + +SIG Docs团队成员或文档贡献者或,配合各业务SIG团队,评审、优化相关文档输出,英文翻译,确保相关输出符合发布条件。 + +### 了解发行版本规划特性 + +想要了解对应发行版本规划的功能特性、发布计划,可以参加每双周周五例行组织的[SIG Release](https://gitee.com/openharmony/release-management/blob/master/README.md)例会。了解版本进度,需求交付进度,文档交付进度等。 + +同时可以在 [OpenHarmony社区版本发布计划](https://gitee.com/openharmony/release-management/blob/master/OpenHarmony-RoadMap.md)中查看对应版本的特性需求,选择标识有SIG_Docs的相关特性Issue,及关联的文档PR。 + +![版本特性清单](/images/contribute/figures/sig-task.png) + +### 评审PR中提交的中文文档 + +在评审对应特性文档时,建议从以下方面给出中肯的评审建议。 + +#### 语言描述规范 + +- 前后逻辑表达通顺,术语名词表述一致 +- 语言正式避免口语化 +- 避免使用侵犯第三方知识产权的风险词汇 + +#### 内容易理解 + +- 内容逻辑清晰,前后表达一致 +- 内容表达易读易理解,避免使用晦涩、生僻的词语 +- 步骤清晰,有效指导开发者完成相关任务开发 + +#### 图表规范 + +- 图片清晰、图文配合使用 +- 表格有表头、表标题,避免出现单行或单列表 +- 表格中无内容用“-"或者"NA",避免出现空白单元格 + +#### 网站风格 + +- 该PR变更涉及新增Markdown页面时,需确保: + - 该页面内容使用了正确的内容模板 + - 该Markdown文件名称定义符合规范 + - 该页面在整本手册Readme导航中正常显示 + +- 删除Markdown页面、变更Markdown页面名称,需确保: + - 该页面对社区其他内容链接未产生影响,建议本地运行链接检查 + - 整本手册Readme导航中更新目录 + +更多详细规范请参考OpenHarmony社区文档[写作规范](/pages/000c0400)。 + +### 翻译英文文档 + +社区的翻译需求Issue会由SIG Docs团队技术翻译专家完成翻译,也欢迎文档贡献者领取翻译需求任务,提交英文文档PR。 + + + diff --git "a/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/06.\347\244\276\345\214\272\346\262\237\351\200\232\344\270\216\344\272\244\346\265\201.md" "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/06.\347\244\276\345\214\272\346\262\237\351\200\232\344\270\216\344\272\244\346\265\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..67e71b5157a62f638560efe526fbc797d6a7a31b --- /dev/null +++ "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/06.\347\244\276\345\214\272\346\262\237\351\200\232\344\270\216\344\272\244\346\265\201.md" @@ -0,0 +1,90 @@ +--- +title: 社区沟通与交流 +permalink: /pages/000c05 +navbar: true +sidebar: true +prev: true +next: true +search: true +article: true +comment: false +editLink: false +date: 2021-12-30 18:31:41 +--- +# 社区沟通与交流 + +如果您在使用OpenHarmony过程中遇到问题,请加入邮件群组参与讨论,这是参与OpenHarmony项目讨论的正确方式。 + +## 如何订阅邮件列表 + +如果您以前从未订阅过邮件列表,请参照下面的操作步骤。 + +1. 点击您想要订阅的邮件列表的名称。 +2. 浏览器将跳转到该邮件列表的订阅页面,那里将提供有关如何订阅的说明。 +3. 阅读订阅说明,您需要提供一个您希望用来订阅邮件列表的电子邮件地址。 +4. 输入您的电子邮件地址并点击订阅,您将收到一封电子邮件,要求您确认订阅。 +5. 回复您收到的电子邮件以确认您的订阅。 +6. 最后您将收到来自一封来自邮件列表的欢迎邮件。 + +**表 1** : 邮件列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

邮件地址

+

简介

+

功能描述

+

contact@openharmony.io

+

公用邮箱

+

OpenHarmony社区公共邮箱。开发者CLA协议签署可以发邮件到此邮箱。

+

dev@openharmony.io

+

开发邮件列表

+

OpenHarmony社区开发讨论邮件列表,任何社区开发相关话题都可以在邮件列表讨论。任何开发者可订阅

+

cicd@openharmony.io

+

CI邮件列表

+

OpenHarmony社区CICD构建邮件列表,任何开发者可订阅

+

pmc@openharmony.io

+

PMC邮件列表

+

PMC讨论邮件列表,PMC成员可订阅

+

scy@openharmony.io

+

安全问题邮箱

+

开发者可反馈OpenHarmony安全问题到此邮箱。

+

scy-priv@openharmony.io

+

安全组邮件列表

+

安全组成员安全问题处理讨论邮件列表,安全组成员可订阅

+
+ +## 如何发送邮件到邮件列表 + +要将邮件发送到指定的邮件列表,请向上表中列出的邮件地址发送您的电子邮件。 + +这样所有在这个邮件列表中的社区成员都能收到您的电子邮件。 + diff --git "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/04.FAQ.md" "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/07.FAQ.md" similarity index 88% rename from "website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/04.FAQ.md" rename to "website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/07.FAQ.md" index 0f27b276b61f36615fefd1dff8bcec33044176eb..f85180aa21b6d67d4f75ebaf737694096e554081 100644 --- "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/04.FAQ.md" +++ "b/website/docs/01.\346\226\207\346\241\243/13.\350\264\241\347\214\256/07.FAQ.md" @@ -1,6 +1,6 @@ --- title: FAQ -permalink: /pages/000e03 +permalink: /pages/000c06 navbar: true sidebar: true prev: true @@ -9,13 +9,13 @@ search: true article: true comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:31:41 --- # FAQ [多个代码仓存在编译依赖时如何同时发起构建](#section169732563435) -[ `Sign-off-by`相关操作](#section-sign-off) +[ `Signed-off-by`相关操作](#section-signed-off) [DCO校验异常处理](#section-dco) @@ -34,7 +34,7 @@ OS\(操作系统\)开发时,经常会遇到多个代码仓的修改具有编 3. 触发构建\(详见触发构建的操作帮助\)后,构建中心会识别关联了同一Issue的PR,同时下载构建,并在代码审核通过后,同时进行合并入代码库。 -## `Sign-off-by`相关操作 +## `Signed-off-by`相关操作 ### 如何在Commit中添加signoff记录 @@ -74,7 +74,7 @@ OS\(操作系统\)开发时,经常会遇到多个代码仓的修改具有编 2. Commits 中未包含 Signed-off-by信息,例如提示: ``` - 当前检测到如下commit未包含Sign-off-by信息: + 当前检测到如下commit未包含Signed-off-by信息: •123123 @@ -83,7 +83,7 @@ OS\(操作系统\)开发时,经常会遇到多个代码仓的修改具有编 **解决办法**: - 参考`Sign-off-by`相关操作,添加Sign-off-by信息。 + 参考`Signed-off-by`相关操作,添加Signed-off-by信息。格式为:Signed-off-by: user.name 。 在PR的评论框输入`check dco`后,单击”评论”,系统将再次进行DCO校验。 diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/02.js\346\240\207\347\255\276\351\205\215\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/02.js\346\240\207\347\255\276\351\205\215\347\275\256.md" deleted file mode 100644 index 34d30b75cc06ea5c540dc2ec349c125f4d9d4384..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/02.js\346\240\207\347\255\276\351\205\215\347\275\256.md" +++ /dev/null @@ -1,191 +0,0 @@ ---- -title: js标签配置 -permalink: /pages/000d0001 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# js标签配置 - -- [pages](#zh-cn_topic_0000001058948917_section3239252133513) -- [window](#zh-cn_topic_0000001058948917_section728811177376) -- [示例](#zh-cn_topic_0000001058948917_section19421142983812) - -js标签中包含了实例名称、页面路由和窗口样式信息。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

标签

-

类型

-

默认值

-

必填

-

描述

-

name

-

string

-

default

-

-

标识JS实例的名字。

-

pages

-

Array

-

-

-

-

路由信息,详见“pages”。

-

window

-

Object

-

-

-

-

窗口信息,详见“window”。

-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->name、pages和window等标签配置需在配置文件中的“js”标签中完成设置。 - -## pages - -定义每个页面的路由信息,每个页面由页面路径和页面名组成,页面的文件名就是页面名。比如: - -``` -{ - ... - "pages": [ - "pages/index/index", - "pages/detail/detail" - ] - ... -} -``` - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->- pages列表中第一个页面是应用的首页,即entry入口。 ->- 页面文件名不能使用组件名称,比如:text.hml、button.hml等。 - -## window - -window用于定义与显示窗口相关的配置。对于屏幕适配问题,有2种配置方法: - -- 指定designWidth(屏幕逻辑宽度),所有与大小相关的样式(例如width、font-size)均以designWidth和实际屏幕宽度的比例进行缩放,例如在designWidth为720时,如果设置width为100px时,在实际宽度为1440物理像素的屏幕上,width实际渲染像素为200物理像素。 -- 设置autoDesignWidth为true,此时designWidth字段将会被忽略,渲染组件和布局时按屏幕密度进行缩放。屏幕逻辑宽度由设备宽度和屏幕密度自动计算得出,在不同设备上可能不同,请使用相对布局来适配多种设备。例如:在466\*466分辨率,320dpi的设备上,屏幕密度为2(以160dpi为基准),1px等于渲染出的2物理像素。 - - >![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** - >1. 组件样式中类型的默认值,按屏幕密度进行计算和绘制,如:在屏幕密度为2(以160dpi为基准)的设备上,默认为1px时,设备上实际渲染出2物理像素。 - >2. autoDesignWidth、designWidth的设置不影响默认值计算方式和绘制结果。 - - - - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

必填

-

默认值

-

描述

-

designWidth

-

number

-

-

720

-

页面显示设计时的参考值,实际显示效果基于设备宽度与参考值之间的比例进行缩放。

-

autoDesignWidth

-

boolean

-

-

false

-

页面设计基准宽度是否自动计算,当设为true时,designWidth将会被忽略,设计基准宽度由设备宽度与屏幕密度计算得出。

-
- -示例如下: - -``` -{ - ... - "window": { - "designWidth": 720, - "autoDesignWidth": false - } - ... -} -``` - -## 示例 - -``` -{ - "app": { - "bundleName": "com.huawei.player", - "version": { - "code": 1, - "name": "1.0" - }, - "vendor": "example" - } - "module": { - ... - "js": [ - { - "name": "default", - "pages": [ - "pages/index/index", - "pages/detail/detail" - ], - "window": { - "designWidth": 720, - "autoDesignWidth": false - } - } - ], - "abilities": [ - { - ... - } - ] - } -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/03.app.js.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/03.app.js.md" deleted file mode 100644 index 125e9e19f64b8bb13280b9ec709281acb7c4fe46..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/03.app.js.md" +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: app.js -permalink: /pages/000d0002 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false ---- -# app.js - -每个应用可以在app.js自定义应用级生命周期的实现逻辑,包括: - -- onCreate:在应用生成时被调用的生命周期函数。 -- onDestory:在应用销毁时被调用的生命周期函数。 - -以下示例仅在生命周期函数中打印对应日志: - -``` -// app.js -export default { - onCreate() { - console.info('Application onCreate'); - }, - onDestroy() { - console.info('Application onDestroy'); - }, -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/03.JS\350\257\255\346\263\225\345\217\202\350\200\203.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/03.JS\350\257\255\346\263\225\345\217\202\350\200\203.md" deleted file mode 100644 index ea3b6af45a1adc21db1c550298de6303e1ec60e5..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/01.\346\241\206\346\236\266\350\257\264\346\230\216/04.\350\257\255\346\263\225/03.JS\350\257\255\346\263\225\345\217\202\350\200\203.md" +++ /dev/null @@ -1,662 +0,0 @@ ---- -title: JS语法参考 -permalink: /pages/000d000302 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# JS语法参考 - -- [语法](#zh-cn_topic_0000001058562835_s6ca2e99746664509961f65b82d11ab58) -- [对象](#zh-cn_topic_0000001058562835_s7493791622a248fbb2e03703149bb3b5) -- [方法](#zh-cn_topic_0000001058562835_s4e1ff24ec78e41948502d8977d24e44c) -- [获取DOM元素](#zh-cn_topic_0000001058562835_section1560185062215) -- [获取ViewModel](#zh-cn_topic_0000001058562835_section13798143717421) -- [生命周期接口](#zh-cn_topic_0000001058562835_s962b82fb67304ec9a50fb06ffa977560) - -JS文件用来定义HML页面的业务逻辑,支持ECMA规范的JavaScript语言。基于JavaScript语言的动态化能力,可以使应用更加富有表现力,具备更加灵活的设计。下面讲述JS文件的编译和运行的支持情况。 - -## 语法 - -支持ES6语法。 - -- 模块声明 - - 使用import方法引入功能模块: - - ``` - import router from '@system.router'; - ``` - -- 代码引用 - - 使用import方法导入js代码: - - ``` - import utils from '../../common/utils.js'; - ``` - - -## 对象 - -- 应用对象 - - - - - - - - - - - - -

属性

-

类型

-

描述

-

$def

-

Object

-

使用this.$app.$def获取在app.js中暴露的对象。

-
说明:

应用对象不支持数据绑定,需主动触发UI更新。

-
-
- - 示例代码 - - ``` - // app.js - export default { - onCreate() { - console.info('AceApplication onCreate'); - }, - onDestroy() { - console.info('AceApplication onDestroy'); - }, - globalData: { - appData: 'appData', - appVersion: '2.0', - }, - globalMethod () { - console.info('This is a global method!'); - this.globalData.appVersion = '3.0'; - } - }; - ``` - - ``` - // index.js页面逻辑代码 - export default { - data: { - appData: 'localData', - appVersion:'1.0', - }, - onInit() { - this.appData = this.$app.$def.globalData.appData; - this.appVersion = this.$app.$def.globalData.appVersion; - }, - invokeGlobalMethod() { - this.$app.$def.globalMethod(); - }, - getAppVersion() { - this.appVersion = this.$app.$def.globalData.appVersion; - } - } - ``` - -- 页面对象 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

描述

-

data

-

Object/Function

-

页面的数据模型,类型是对象或者函数,如果类型是函数,返回值必须是对象。属性名不能以$或_开头,不要使用保留字for, if, show, tid。

-

data与private和public不能重合使用。

-

$refs

-

Object

-

持有注册过ref 属性的DOM元素或子组件实例的对象。示例见获取DOM元素

-

private

-

Object

-

页面的数据模型,private下的数据属性只能由当前页面修改。

-

public

-

Object

-

页面的数据模型,public下的数据属性的行为与data保持一致。

-

props

-

Array/Object

-

props用于组件之间的通信,可以通过<tag xxxx='value'>方式传递给组件;props名称必须用小写,不能以$或_开头,不要使用保留字for, if, show, tid。目前props的数据类型不支持Function。示例见自定义组件

-

computed

-

Object

-

用于在读取或设置进行预先处理,计算属性的结果会被缓存。计算属性名不能以$或_开头,不要使用保留字。示例见自定义组件

-
- - -## 方法 - -- 数据方法 - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

参数

-

描述

-

$set

-

Function

-

key: string

-

value: any

-

添加新的数据属性或者修改已有数据属性。

-

用法:

-

this.$set('key',value):添加数据属性。

-

$delete

-

Function

-

key: string

-

删除数据属性。

-

用法:

-

this.$delete('key'):删除数据属性。

-
- - 示例代码 - - ``` - export default { - data: { - keyMap: { - OS: 'OpenHarmony', - Version: '2.0', - }, - }, - getAppVersion() { - this.$set('keyMap.Version', '3.0'); - console.info("keyMap.Version = " + this.keyMap.Version); // keyMap.Version = 3.0 - - this.$delete('keyMap'); - console.info("keyMap.Version = " + this.keyMap); // log print: keyMap.Version = undefined - } - } - ``` - -- 公共方法 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

参数

-

描述

-

$element

-

Function

-

id: string 组件id

-

获得指定id的组件对象,如果无指定id,则返回根组件对象。示例见获取DOM元素

-

用法:

-

<div id='xxx'></div>

-
  • this.$element('xxx'):获得id为xxx的组件对象。
  • this.$element():获得根组件对象。
-

$root

-

Function

-

-

获得顶级ViewModel实例。获取ViewModel示例。

-

$parent

-

Function

-

-

获得父级ViewModel实例。获取ViewModel示例。

-

$child

-

Function

-

id: string 组件id

-

获得指定id的子级自定义组件的ViewModel实例。获取ViewModel示例。

-

用法:

-

this.$child('xxx') :获取id为xxx的子级自定义组件的ViewModel实例。

-
- -- 事件方法 - - - - - - - - - - - - - - -

属性

-

类型

-

参数

-

描述

-

$watch

-

Function

-

data: string

-

callback: 函数名,回调函数里有两个参数,第一个参数为属性新值,第二个参数为属性旧值

-

观察data中的属性变化,如果属性值改变,触发绑定的事件。示例见自定义组件

-

用法:

-

this.$watch('key', callback)

-
- - -## 获取DOM元素 - -1. 通过$refs获取DOM元素 - - ``` - -
- -
- ``` - - ``` - // index.js - export default { - data: { - images: [ - { src: '/common/frame1.png' }, - { src: '/common/frame2.png' }, - { src: '/common/frame3.png' }, - ], - }, - handleClick() { - const animator = this.$refs.animator; // 获取ref属性为animator的DOM元素 - const state = animator.getState(); - if (state === 'paused') { - animator.resume(); - } else if (state === 'stopped') { - animator.start(); - } else { - animator.pause(); - } - }, - }; - ``` - -2. 通过$element 方法获取DOM元素 - - ``` - -
- -
- ``` - - ``` - // index.js - export default { - data: { - images: [ - { src: '/common/frame1.png' }, - { src: '/common/frame2.png' }, - { src: '/common/frame3.png' }, - ], - }, - handleClick() { - const animator = this.$element('animator'); // 获取id属性为animator的DOM元素 - const state = animator.getState(); - if (state === 'paused') { - animator.resume(); - } else if (state === 'stopped') { - animator.start(); - } else { - animator.pause(); - } - }, - }; - ``` - - -## 获取ViewModel - -根节点所在页面: - -``` - - -
-
- {{text}} - -
-
-``` - -``` -// root.js -export default { - data: { - text: 'I am root!', - }, -} -``` - -自定义parent组件: - -``` - - -
- parent component click - hello parent component! - -
-``` - -``` -// parent.js -export default { - data: { - show: false, - text: 'I am parent component!', - }, - parentClicked () { - this.show = !this.show; - console.info('parent component get parent text'); - console.info(`${this.$parent().text}`); - console.info("parent component get child function"); - console.info(`${this.$child('selfDefineChild').childClicked()}`); - }, -} -``` - -自定义child组件: - -``` - -
- child component clicked - hello child component -
-``` - -``` -// child.js -export default { - data: { - show: false, - text: 'I am child component!', - }, - childClicked () { - this.show = !this.show; - console.info('child component get parent text'); - console.info('${this.$parent().text}'); - console.info('child component get root text'); - console.info('${this.$root().text}'); - }, -} -``` - -## 生命周期接口 - -- 页面生命周期 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

参数

-

返回值

-

描述

-

触发时机

-

onInit

-

Function

-

-

-

页面初始化

-

页面数据初始化完成时触发,只触发一次。

-

onReady

-

Function

-

-

-

页面创建完成

-

页面创建完成时触发,只触发一次。

-

onShow

-

Function

-

-

-

页面显示

-

页面显示时触发。

-

onHide

-

Function

-

-

-

页面消失

-

页面消失时触发。

-

onDestroy

-

Function

-

-

-

页面销毁

-

页面销毁时触发。

-

onBackPress

-

Function

-

-

Boolean

-

返回按钮动作

-

当用户点击返回按钮时触发。

-
  • 返回true表示页面自己处理返回逻辑。
  • 返回false表示使用默认的返回逻辑。
  • 不返回值会作为false处理。
-

onActive()5+

-

Function

-

-

-

页面激活

-

页面激活时触发。

-

onInactive()5+

-

Function

-

-

-

页面暂停

-

页面暂停时触发。

-

onNewRequest()5+

-

Function

-

-

-

FA重新请求

-

该回调当FA已经启动时收到新的请求后触发。

-
- - 页面A的生命周期接口的调用顺序 - - - 打开页面A:onInit\(\) -\> onReady\(\) -\> onShow\(\) -\> onActive\(\) - - 在页面A打开页面B:onInactive\(\) -\> onHide\(\) - - 从页面B返回页面A:onShow\(\) -\> onActive\(\) - - 退出页面A:onBackPress\(\) -\> onInactive\(\) -\> onHide\(\) -\> onDestroy\(\) - - 页面隐藏到后台运行:onInactive\(\) -\> onHide\(\) - - 页面从后台运行恢复到前台:onShow\(\) - -- 应用生命周期 - - - - - - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

参数

-

返回值

-

描述

-

触发时机

-

onCreate

-

Function

-

-

-

应用创建

-

当应用创建时调用。

-

onDestroy

-

Function

-

-

-

应用退出

-

当应用退出时触发。

-
- - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\347\273\204\344\273\266\346\226\271\346\263\225.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\347\273\204\344\273\266\346\226\271\346\263\225.md" deleted file mode 100644 index a6f83b860ba4cae869b0e0244838dde704ffcf09..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/01.\347\273\204\344\273\266\346\226\271\346\263\225.md" +++ /dev/null @@ -1,479 +0,0 @@ ---- -title: 组件方法 -permalink: /pages/000d010000 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 组件方法 - -- [this.$element\('id'\).animate\(Object, Object\)](#zh-cn_topic_0000001058670837_section844805134319) - -当组件通过id属性标识后,可以使用该id获取组件对象并调用相关组件方法。 - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

必填

-

默认值

-

返回值

-

描述

-

animate

-

-
  • Object: keyframes,用于描述动画关键帧参数
  • Object: options,用于描述动画参数
-

-

-

-

-

-

在组件上创建和运行动画的快捷方式。输入动画所需的keyframes和options,返回animation对象实例。

-
- -## this.$element\('_id_'\).animate\(Object, Object\) - -通过animate\(keyframes, options\)方法获得animation对象。该对象支持动画属性,动画方法和动画事件。重复多次调用animate方法时,采用replace策略,最后一次调用时传入的参数生效。 - -- keyframes - - - - - - - - - - - - -

参数

-

类型

-

说明

-

frames

-

Array<Style>

-

用于设置动画样式属性的对象列表。Style类型说明请见表1 Style类型说明

-
- - **表 1** Style类型说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

默认值

-

说明

-

width

-

number

-

-

-

动画执行过程中设置到组件上的宽度值。

-

height

-

number

-

-

-

动画执行过程中设置到组件上的高度值。

-

backgroundColor

-

<color>

-

none

-

动画执行过程中设置到组件上的背景颜色。

-

opacity

-

number

-

1

-

设置到组件上的透明度(介于0到1之间)。

-

backgroundPosition

-

string

-

-

-

格式为"x y",单位为百分号或者px。

-

第一个值是水平位置,第二个值是垂直位置。

-

如果仅规定了一个值,另一个值为 50%。

-

transformOrigin

-

string

-

'center center'

-

变换对象的中心点。

-

第一个参数表示x轴的值,可以设置为left、center、right、长度值或百分比值。

-

第二个参数表示y轴的值,可以设置为top、center、bottom、长度值或百分比值。

-

transform

-

Transform

-

-

-

设置到变换对象上的类型。

-

offset

-

number

-

-

-
  • offset值(如果提供)必须在0.0到1.0(含)之间,并以升序排列。
  • 若只有两帧,可以不填offset。
  • 若超过两帧,offset必填。
-
- - -- options - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

默认值

-

说明

-

duration

-

number

-

0

-

指定当前动画的运行时长(单位毫秒)。

-

easing

-

string

-

linear

-

描述动画的时间曲线,支持类型见表3 easing有效值说明

-

delay

-

number

-

0

-

设置动画执行的延迟时间(默认值表示无延迟)。

-

iterations

-

number | string

-

1

-

设置动画执行的次数。number表示固定次数,Infinity枚举表示无限次数播放。

-

fill

-

string

-

none

-

指定动画开始和结束的状态:

-

none:在动画执行之前和之后都不会应用任何样式到目标上。

-

forwards:在动画结束后,目标将保留动画结束时的状态(在最后一个关键帧中定义)。

-
- - **表 2** easing有效值说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-

描述

-

linear

-

动画线性变化。

-

ease-in

-

动画速度先慢后快,cubic-bezier(0.42, 0.0, 1.0, 1.0)。

-

ease-out

-

动画速度先快后慢,cubic-bezier(0.0, 0.0, 0.58, 1.0)。

-

ease-in-out

-

动画先加速后减速,cubic-bezier(0.42, 0.0, 0.58, 1.0)。

-

friction

-

阻尼曲线,cubic-bezier(0.2, 0.0, 0.2, 1.0)。

-

extreme-deceleration

-

急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。

-

sharp

-

锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。

-

rhythm

-

节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。

-

smooth

-

平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。

-

cubic-bezier(x1, y1, x2, y2)

-

在三次贝塞尔函数中定义动画变化过程,入参的x和y值必须处于0-1之间。

-

steps(number, step-position)

-

Step曲线。

-

number必须设置,支持的类型为int。

-

step-position参数可选,支持设置start或end,默认值为end。

-
- - -- 返回值 - - animation对象支持的属性: - - - - - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

说明

-

finished

-

boolean

-

只读,用于表示当前动画是否已播放完成。

-

pending

-

boolean

-

只读,用于表示当前动画是否处于等待其他异步操作完成的等待状态(例如启动一个延时播放的动画)。

-

playState

-

string

-

可读可写,动画的执行状态:

-
  • idle:未执行状态,包括已结束或未开始。
  • running:动画正在运行。
  • paused:动画暂停。
  • finished:动画播放完成。
-

startTime

-

number

-

可读可写,动画播放开始的预定时间,用途类似于options参数中的delay。

-
- - animation对象支持的方法: - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

方法

-

参数

-

说明

-

play

-

-

-

组件播放动画。

-

finish

-

-

-

组件完成动画。

-

pause

-

-

-

组件暂停动画。

-

cancel

-

-

-

组件取消动画。

-

reverse

-

-

-

组件倒播动画。

-
- - animation对象支持的事件: - - - - - - - - - - - - - - - - -

事件

-

说明

-

cancel

-

动画被强制取消。

-

finish

-

动画播放完成。

-

repeat

-

动画重播事件。

-
- - -- 示例代码: - - ``` - // xxx.js - import prompt from '@system.prompt'; - export default { - data : { - animation:'', - }, - onInit() { - }, - onShow() { - var options = { - duration: 1500, - easing: 'friction', - delay: 500, - fill: 'forwards', - iterations: 2, - }; - var frames = [ - {transform: {translate: '-120px -0px'}, opacity: 0.1, offset: 0.0}, - {transform: {translate: '120px 0px'}, opacity: 1.0, offset: 1.0} - ]; - this.animation = this.$element('idName').animate(frames, options); - // handle finish event - this.animation.onfinish = function() { - prompt.showToast({ - message: "The animation is finished." - }); - }; - // handle cancel event - this.animation.oncancel = function() { - prompt.showToast({ - message: "The animation is canceled." - }); - }; - // handle repeat event - this.animation.onrepeat = function() { - prompt.showToast({ - message: "The animation is repeated." - }); - }; - }, - start() { - this.animation.play(); - }, - cancel() { - this.animation.cancel(); - } - } - ``` - - ![](/images/zh-cn/application-dev/js-reference/figures/AnimationAPI裁剪.gif) - - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\345\212\250\347\224\273\346\240\267\345\274\217.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\345\212\250\347\224\273\346\240\267\345\274\217.md" deleted file mode 100644 index 20b8efff46efadadfe9389077d1abb7eb06515df..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/02.\345\212\250\347\224\273\346\240\267\345\274\217.md" +++ /dev/null @@ -1,271 +0,0 @@ ---- -title: 动画样式 -permalink: /pages/000d010001 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:45 ---- -# 动画样式 - -组件普遍支持的可以在style或css中设置的动态的旋转、平移、缩放效果。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

描述

-

transform-origin

-

<percentage> | <length> <percentage> | <length>

-

控件中心

-

变换对象的原点位置,支持px和百分比(相对于动画目标组件),如果仅设置一个值,另一个值为50%。

-

示例:

-

transform-origin: 200px 30%

-

transform

-

string

-

-

-

支持同时设置平移/旋转/缩放的属性

-

详见表1

-

animation-name

-

string

-

-

-

指定@keyframes,详见表2

-

animation-delay

-

<time>

-

0

-

定义动画播放的延迟时间。支持的单位为[s(秒)|ms(毫秒) ],默认单位为ms,格式为:1000ms或1s。

-

animation-duration

-

<time>

-

0

-

定义一个动画周期。支持的单位为[s(秒)|ms(毫秒) ],默认单位为ms,格式为:1000ms或1s。

-
说明:

animation-duration 样式必须设置,否则时长为 0,则不会播放动画。

-
-

animation-iteration-count

-

number | infinite

-

1

-

定义动画播放的次数,默认播放一次,可通过设置为infinite无限次播放。

-

animation-timing-function

-

string

-

ease

-

描述动画执行的速度曲线,用于使动画更为平滑。

-

可选项有:

-
  • linear:表示动画从头到尾的速度都是相同的。
  • ease:表示动画以低速开始,然后加快,在结束前变慢,cubic-bezier(0.25, 0.1, 0.25, 1.0)。
  • ease-in:表示动画以低速开始,cubic-bezier(0.42, 0.0, 1.0, 1.0)。
  • ease-out:表示动画以低速结束,cubic-bezier(0.0, 0.0, 0.58, 1.0)。
  • ease-in-out:表示动画以低速开始和结束,cubic-bezier(0.42, 0.0, 0.58, 1.0)。
  • friction:阻尼曲线,cubic-bezier(0.2, 0.0, 0.2, 1.0)。
  • extreme-deceleration:急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。
  • sharp:锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。
  • rhythm:节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。
  • smooth:平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。
  • cubic-bezier:在三次贝塞尔函数中定义动画变化过程,入参的x和y值必须处于0-1之间。
-

animation-fill-mode

-

string

-

none

-

指定动画开始和结束的状态:

-
  • none:在动画执行之前和之后都不会应用任何样式到目标上。
  • forwards:在动画结束后,目标将保留动画结束时的状态(在最后一个关键帧中定义)。
-
- -**表 1** transform操作说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

描述

-

translate

-

<length>| <percent>

-

平移动画属性,支持设置x轴和y轴两个维度的平移参数

-

translateX

-

<length>| <percent>

-

X轴方向平移动画属性

-

translateY

-

<length>| <percent>

-

Y轴方向平移动画属性

-

scale

-

<number>

-

缩放动画属性,支持设置x轴和y轴两个维度的缩放参数

-

scaleX

-

<number>

-

X轴方向缩放动画属性

-

scaleY

-

<number>

-

Y轴方向缩放动画属性

-

rotate

-

<deg> | <rad>

-

旋转动画属性,支持设置x轴和y轴两个维度的选中参数

-

rotateX

-

<deg> | <rad>

-

X轴方向旋转动画属性

-

rotateY

-

<deg> | <rad>

-

Y轴方向旋转动画属性

-
- -**表 2** @keyframes属性说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

描述

-

background-color

-

<color>

-

-

-

动画执行后应用到组件上的背景颜色。

-

opacity

-

number

-

1

-

动画执行后应用到组件上的不透明度值,为介于0到1间的数值,默认为1。

-

width

-

<length>

-

-

-

动画执行后应用到组件上的宽度值。

-

height

-

<length>

-

-

-

动画执行后应用到组件上的高度值。

-

transform

-

string

-

-

-

定义应用在组件上的变换类型,见表1

-
- -对于不支持起始值或终止值缺省的情况,可以通过from和to显示指定起始和结束。示例: - -``` -@keyframes Go -{ - from { - background-color: #f76160; - transform:translate(100px) rotate(0deg) scale(1.0); - } - - to { - background-color: #09ba07; - transform:translate(100px) rotate(180deg) scale(2.0); - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/动画样式demo2.gif) - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->@keyframes的from/to不支持动态绑定。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\270\220\345\217\230\346\240\267\345\274\217.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\270\220\345\217\230\346\240\267\345\274\217.md" deleted file mode 100644 index f683b2f9603744d31e102c4f14b64d2f558c2768..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/03.\346\270\220\345\217\230\346\240\267\345\274\217.md" +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: 渐变样式 -permalink: /pages/000d010002 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# 渐变样式 - -- [线性渐变/重复线性渐变](#zh-cn_topic_0000001058948919_s9fb0b2412d2843e4b06e05acc39dc394) - -组件普遍支持的在style或css中设置的 可以平稳过渡两个或多个指定的颜色。 - -开发框架支持线性渐变 \(linear-gradient\)和重复线性渐变 \(repeating-linear-gradient\)两种渐变效果。 - -## 线性渐变/重复线性渐变 - -使用渐变样式,需要定义过渡方向和过渡颜色。 - -1. 过渡方向:通过direction或者angle指定: - - - direction:进行方向渐变 - - angle:进行角度渐变 - - ``` - background: linear-gradient(direction/angle, color, color, ...); - background: repeating-linear-gradient(direction/angle, color, color, ...); - ``` - -2. 过渡颜色:支持以下四种方式:\#ff0000、\#ffff0000、rgb\(255, 0, 0\)、rgba\(255, 0, 0, 1\)。需要指定至少两种颜色。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

direction

-

to <side-or-corner> <side-or-corner> = [left | right] || [top | bottom]

-

to bottom (由上到下渐变)

-

-

指定过渡方向,如:to left (从右向左渐变) ;或者

-

to bottom right (从左上角到右下角)。

-

angle

-

<deg>

-

180deg

-

-

指定过渡方向,以元素几何中心为坐标原点,水平方向为X轴,angle指定了渐变线与Y轴的夹角(顺时针方向)。

-

color

-

<color> [<length>|<percentage>]

-

-

-

-

定义使用渐变样式区域内颜色的渐变效果。

-
- -- 示例 - - ``` - #gradient { - height: 300px; - width: 600px; - } - ``` - - **图 1** 默认渐变方向为从上向下渐变 - ![](/images/zh-cn/application-dev/js-reference/figures/默认渐变方向为从上向下渐变.png "默认渐变方向为从上向下渐变") - - ``` - /* 从顶部开始向底部由红色向绿色渐变。 */ - background: linear-gradient(red, #00ff00); - ``` - - **图 2** 45度夹角渐变 - ![](/images/zh-cn/application-dev/js-reference/figures/45度夹角渐变.png "45度夹角渐变") - - ``` - /* 45度夹角,从红色渐变到绿色 */ - background: linear-gradient(45deg, rgb(255,0,0),rgb(0, 255, 0)); - ``` - - **图 3** 设置方向为to right为从左向右渐变 - ![](/images/zh-cn/application-dev/js-reference/figures/设置方向为to-right为从左向右渐变.png "设置方向为to-right为从左向右渐变") - - ``` - /* 从左向右渐变,在距离左边90px和距离左边360px (600*0.6) 之间270px宽度形成渐变*/ - background: linear-gradient(to right, rgb(255,0,0) 90px, rgb(0, 0, 255) 60%); - ``` - - **图 4** 从左向右渐变,重复渐变 - ![](/images/zh-cn/application-dev/js-reference/figures/从左向右渐变-重复渐变.png "从左向右渐变-重复渐变") - - ``` - /* 从左向右重复渐变,重复渐变区域30px(60-30)透明度0.5 */ - background: repeating-linear-gradient(to right, rgba(255, 255, 0, 1) 30px,rgba(0, 0, 255, .5) 60px); - ``` - - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/06.\345\216\237\345\255\220\345\270\203\345\261\200.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/06.\345\216\237\345\255\220\345\270\203\345\261\200.md" deleted file mode 100644 index a1ca76a1ea4ed91bc3ab52a6b0f118f94cac4415..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/01.\351\200\232\347\224\250/06.\345\216\237\345\255\220\345\270\203\345\261\200.md" +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: 原子布局 -permalink: /pages/000d010005 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# 原子布局 - -- [隐藏能力](#zh-cn_topic_0000001062070665_section0441154013284) -- [占比能力](#zh-cn_topic_0000001062070665_section13725752194418) -- [固定比例](#zh-cn_topic_0000001062070665_section922215811557) - -为了解决由于屏幕形态和规格不同而导致的对布局效果自适应的要求,系统提供了面向不同屏幕尺寸界面自适应适配的布局能力,称为原子布局。设计师可以考虑使用原子能力,定义元素在不同形态对尺寸界面上体现的自适应规则。开发者可以使用原子布局能力,快速实现让应用在多形态屏幕上有与设计效果相匹配的自适应效果。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->从API Version 5 开始支持。 - -## 隐藏能力 - -在非折行flex布局基础上,增加了显示优先级标记,可以调整组件内元素水平/垂直方向的显示优先级,根据当前组件容器的可用空间来显示内容。 - - - - - - - - - - - - - - -

样式

-

类型

-

默认值

-

说明

-

display-index

-

number

-

Infinity

-

该适用于div等支持flex布局的容器组件中的子组件上,当容器组件在flex主轴上尺寸不足以显示下全部内容时,按照display-index值从小到大的顺序进行隐藏,具有相同display-index值的组件同时隐藏,默认值为Infinity,表示不隐藏。

-
- -## 占比能力 - -在非折行的flex布局中,定义了占比能力的组件,保证指定元素始终在容器的某一个比例空间中进行布局。 - - - - - - - - - - - - - - -

样式

-

类型

-

默认值

-

说明

-

flex-weight

-

number

-

-

-

指明当前元素在flex主轴方向上尺寸权值,当且仅当容器组件中所有节点均设置此属性时生效,当前元素尺寸为: 容器主轴尺寸 * 当前权值 / 所有子元素权值和。

-
- -## 固定比例 - -定义了组件固定比例调整尺寸的能力 - - - - - - - - - - - - - - -

样式

-

类型

-

默认值

-

说明

-

aspect-ratio

-

number

-

-

-

1. 接受任意大于0的浮点值,定义为该节点的宽度与高度比,设置该属性后,该元素尺寸宽高比按照此属性值进行调整。

-

2. 遵守最大值与最小值的限制。

-

3. 在flex布局中,主轴尺寸先进行调整,后根据该尺寸调整交叉轴

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/01.badge.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/01.badge.md" deleted file mode 100644 index c5bc2b8024e08c80cf28adf246c0340cc34393d2..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/01.badge.md" +++ /dev/null @@ -1,778 +0,0 @@ ---- -title: badge -permalink: /pages/000d010100 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# badge - -- [权限列表](#zh-cn_topic_0000001060267851_section11257113618419) -- [子组件](#zh-cn_topic_0000001060267851_section9288143101012) -- [属性](#zh-cn_topic_0000001060267851_section1355418214459) -- [样式](#zh-cn_topic_0000001060267851_section5775351116) -- [事件](#zh-cn_topic_0000001060267851_section43461940193518) -- [示例](#zh-cn_topic_0000001060267851_section3510104413431) - -应用中如果有需用户关注的新事件提醒,可以采用新事件标记来标识。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->从API Version 5 开始支持。 - -## 权限列表 - -无 - -## 子组件 - -支持单个子组件。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->仅支持单子组件节点,如果使用多子组件节点,默认使用第一个子组件节点。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

placement

-

string

-

rightTop

-

-

事件提醒的数字标记或者圆点标记的位置,可选值为:

-
  • right:位于组件右边框;
  • rightTop:位于组件边框右上角;
  • left:位于组件左边框;
-

count

-

number

-

0

-

-

设置提醒的消息数,默认为0。当设置相应的提醒消息数大于0时,消息提醒会变成数字标记类型,未设置消息数或者消息数不大于0时,消息提醒将采用圆点标记。

-
说明:

当数字设置为大于maxcount时,将使用maxcount显示。

-
-

visible

-

boolean

-

false

-

-

是否显示消息提醒,当收到新信息提醒时可以设置该属性为true,显示相应的消息提醒,如果需要使用数字标记类型,同时需要设置相应的count属性。

-

maxcount

-

number

-

99

-

-

最大消息数限制,当收到新信息提醒大于该限制时,标识数字会进行省略,仅显示maxcount+。

-

config

-

BadgeConfig

-

-

-

-

设置新事件标记相关配置属性。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -**表 1** BadgeConfig - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

badgeColor

-

<color>

-

#fa2a2d

-

-

新事件标记背景色。

-

textColor

-

<color>

-

#ffffff

-

-

数字标记的数字文本颜色。

-

textSize

-

<length>

-

10px

-

-

数字标记的数字文本大小。

-

badgeSize

-

<length>

-

6px

-

-

圆点标记的默认大小

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length>

-

0

-

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length>

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length>

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length>

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

number

-

-

-

-

规定当前组件如何适应父组件中的可用空间。它作为一个简写属性,用来设置组件的flex-grow。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->badge组件的子组件大小不能超过badge组件本身的大小,否则子组件不会绘制。 - -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 示例 - -``` - -
- - huawei - - - huawei - -
-``` - -``` -/* xxx.css */ -.container { - flex-direction: column; - width: 100%; - align-items: center; -} -.badge { - width: 50%; - margin-top: 100px; -} -.text1 { - background-color: #f9a01e; - font-size: 50px; -} -.text2 { - background-color: #46b1e3; - font-size: 50px; -} -``` - -``` -// xxx.js -export default { - data:{ - badgeconfig:{ - badgeColor:"#0a59f7", - textColor:"#ffffff", - } - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001083086542.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/02.dialog.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/02.dialog.md" deleted file mode 100644 index ff6aa413e1f258d4470b7866d87fc8a1244728bc..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/02.dialog.md" +++ /dev/null @@ -1,346 +0,0 @@ ---- -title: dialog -permalink: /pages/000d010101 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# dialog - -- [权限列表](#zh-cn_topic_0000001059148550_section11257113618419) -- [子组件](#zh-cn_topic_0000001059148550_section9288143101012) -- [属性](#zh-cn_topic_0000001059148550_section2907183951110) -- [事件](#zh-cn_topic_0000001059148550_section20424336163815) -- [样式](#zh-cn_topic_0000001059148550_section5775351116) -- [方法](#zh-cn_topic_0000001059148550_section11753103216253) -- [示例](#zh-cn_topic_0000001059148550_section6663311114620) - -自定义弹窗容器。 - -## 权限列表 - -无 - -## 子组件 - -支持单个子组件。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - -

名称

-

参数

-

描述

-

cancel

-

-

-

用户点击非dialog区域触发取消弹窗时触发的事件。

-
- -## 样式 - -支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

未设置时使用弹窗默认宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度

-

未设置时使用弹窗默认高度。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]5+

-

<length>

-

0

-

-

设置起始和末端外边距属性。

-
- -## 方法 - -支持如下方法。 - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

show

-

-

-

弹出对话框

-

close

-

-

-

关闭对话框

-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->dialog属性、样式均不支持动态更新。 - -## 示例 - -``` - -
-
- -
- -
-
- Simple dialog -
-
- - -
-
-
-
-``` - -``` -/* xxx.css */ -.doc-page { - flex-direction: column; - justify-content: center; - align-items: center; -} -.btn-div { - width: 100%; - height: 200px; - flex-direction: column; - align-items: center; - justify-content: center; -} -.txt { - color: #000000; - font-weight: bold; - font-size: 39px; -} -.dialog-main { - width: 500px; -} -.dialog-div { - flex-direction: column; - align-items: center; -} -.inner-txt { - width: 400px; - height: 160px; - flex-direction: column; - align-items: center; - justify-content: space-around; -} -.inner-btn { - width: 400px; - height: 120px; - justify-content: space-around; - align-items: center; -} -``` - -``` -// xxx.js -import prompt from '@system.prompt'; - -export default { - showDialog(e) { - this.$element('simpledialog').show() - }, - cancelDialog(e) { - prompt.showToast({ - message: 'Dialog cancelled' - }) - }, - cancelSchedule(e) { - this.$element('simpledialog').close() - prompt.showToast({ - message: 'Successfully cancelled' - }) - }, - setSchedule(e) { - this.$element('simpledialog').close() - prompt.showToast({ - message: 'Successfully confirmed' - }) - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/GIF6.gif) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/03.div.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/03.div.md" deleted file mode 100644 index 1caf66794d064f54167e5cc7a2e6f3493975bb81..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/03.div.md" +++ /dev/null @@ -1,892 +0,0 @@ ---- -title: div -permalink: /pages/000d010102 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# div - -- [权限列表](#zh-cn_topic_0000001059308532_section11257113618419) -- [子组件](#zh-cn_topic_0000001059308532_section9288143101012) -- [属性](#zh-cn_topic_0000001059308532_section2907183951110) -- [事件](#zh-cn_topic_0000001059308532_section77341431152917) -- [样式](#zh-cn_topic_0000001059308532_section5775351116) -- [示例](#zh-cn_topic_0000001059308532_section1241545010391) - -基础容器,用作页面结构的根节点或将内容进行分组。 - -## 权限列表 - -无 - -## 子组件 - -支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

flex-direction

-

string

-

row

-

-

flex容器主轴方向。可选项有:

-
  • column:垂直方向从上到下
  • row:水平方向从左到右
-

flex-wrap

-

string

-

nowrap

-

-

flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:

-
  • nowrap:不换行,单行显示。
  • wrap:换行,多行显示。
-

justify-content

-

string

-

flex-start

-

-

flex容器当前行的主轴对齐格式。可选项有:

-
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
  • space-evenly5+: 均匀排列每个元素,每个元素之间的间隔相等。
-

align-items

-

string

-

stretch

-

-

flex容器当前行的交叉轴对齐格式,可选值为:

-
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
-

align-content

-

string

-

flex-start

-

-

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

-
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
-

display

-

string

-

flex

-

-

确定该元素视图框的类型,该值暂不支持动态修改。可选值为:

-
  • flex:弹性布局
  • grid:网格布局
  • none:不渲染此元素
-

grid-template-[columns|rows]

-

string

-

1行1列

-

-

用于设置当前网格布局行和列的数量,不设置时默认1行1列,仅当display为grid时生效。

-

示例:如设置grid-template-columns为:

-
  • 50px 100px 60px:分三列,第一列50px,第二列100px,第三列60px;
  • 1fr 1fr 2fr:分三列,将父组件允许的宽分为4等份,第一列占1份,第二列占一份,第三列占2份;
  • 30% 20% 50%:分三列,将父组件允许的宽为基准,第一列占30%,第二列占20%,第三列占50%;
  • repeat(2,100px):分两列,第一列100px,第二列100px;
  • repeat(auto-fill,100px)5+:按照每列100px的大小和交叉轴大小计算最大正整数重复次数,按照该重复次数布满交叉轴;
  • auto 1fr 1fr:分三列,第一列自适应内部子组件所需宽度,剩余空间分为两等份,第二列占一份,第三列占一份。
-

grid-[columns|rows]-gap

-

<length>

-

0

-

-

用于设置行与行的间距或者列与列的间距,也可以支持通过grid-gap设置相同的行列间距,仅当display为grid时生效。

-

grid-row-[start|end]

-

number

-

-

-

-

用于设置当前元素在网格布局中的起止行号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

-

grid-column-[start|end]

-

number

-

-

-

-

用于设置当前元素在网格布局中的起止列号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

-

grid-auto-flow5+

-

string

-

-

-

-

使用框架自动布局算法进行网格的布局,可选值为:

-
  • row:逐行填充元素,如果行空间不够,则新增行;
  • column:逐列填充元素,如果列空间不够,则新增列。
-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 示例 - -1. Flex样式 - - ``` - -
-
-
-
-
-
-
- ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 454px; - height: 454px; - } - .flex-box { - justify-content: space-around; - align-items: center; - width: 400px; - height: 140px; - background-color: #ffffff; - } - .flex-item { - width: 120px; - height: 120px; - border-radius: 16px; - } - .color-primary { - background-color: #007dff; - } - .color-warning { - background-color: #ff7500; - } - .color-success { - background-color: #41ba41; - } - ``` - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001061550803.png) - -2. Flex Wrap样式 - - ``` - -
-
-
-
-
-
-
- ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 454px; - height: 454px; - } - .flex-box { - justify-content: space-around; - align-items: center; - flex-wrap: wrap; - width: 300px; - height: 250px; - background-color: #ffffff; - } - .flex-item { - width: 120px; - height: 120px; - border-radius: 16px; - } - .color-primary { - background-color: #007dff; - } - .color-warning { - background-color: #ff7500; - } - .color-success { - background-color: #41ba41; - } - ``` - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001061872693.png) - -3. Grid样式 - - ``` - -
-
-
-
-
-
- ``` - - ``` - /* xxx.css */ - .common { - width: 400px; - height: 400px; - background-color: #ffffff; - align-items: center; - justify-content: center; - margin: 24px; - } - .grid-parent { - display: grid; - grid-template-columns: 50% 50%; - grid-columns-gap: 24px; - grid-rows-gap: 24px; - grid-template-rows: 50% 50%; - } - .grid-child { - width: 100%; - height: 100%; - border-radius: 8px; - } - .grid-left-top { - grid-row-start: 0; - grid-column-start: 0; - grid-row-end: 0; - grid-column-end: 0; - background-color: #3f56ea; - } - .grid-left-bottom { - grid-row-start: 1; - grid-column-start: 0; - grid-row-end: 1; - grid-column-end: 0; - background-color: #00aaee; - } - .grid-right-top { - grid-row-start: 0; - grid-column-start: 1; - grid-row-end: 0; - grid-column-end: 1; - background-color: #00bfc9; - } - .grid-right-bottom { - grid-row-start: 1; - grid-column-start: 1; - grid-row-end: 1; - grid-column-end: 1; - background-color: #47cc47; - } - ``` - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058988992.png) - - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/04.list.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/04.list.md" deleted file mode 100644 index 263a745a25497a9d00fd99ce9f0c8a923fa34d7d..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/04.list.md" +++ /dev/null @@ -1,1162 +0,0 @@ ---- -title: list -permalink: /pages/000d010103 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# list - -- [权限列表](#zh-cn_topic_0000001058670742_section11257113618419) -- [子组件](#zh-cn_topic_0000001058670742_section9288143101012) -- [属性](#zh-cn_topic_0000001058670742_section2907183951110) -- [事件](#zh-cn_topic_0000001058670742_section434813139467) -- [样式](#zh-cn_topic_0000001058670742_section5775351116) -- [方法](#zh-cn_topic_0000001058670742_section47669296127) -- [示例](#zh-cn_topic_0000001058670742_section24931424488) - -列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本。 - -## 权限列表 - -无 - -## 子组件 - -仅支持<[list-item-group](/pages/000d010105#ZH-CN_TOPIC_0000001162414615)\>和<[list-item](/pages/000d010104#ZH-CN_TOPIC_0000001115814816)\>。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

scrollpage

-

boolean

-

false

-

-

设置为true时,将 list 顶部页面中非 list 部分随 list 一起滑出可视区域,当list方向为row时,不支持此属性。

-

cachedcount

-

number

-

0

-

-

长列表延迟加载时list-item最少缓存数量。

-

可视区域外缓存的list-item数量少于该值时,会触发requestitem事件。

-

scrollbar

-

string

-

off

-

-

侧边滑动栏的显示模式(当前只支持纵向):

-
  • off:不显示。
  • auto:按需显示(触摸时显示,2s后消失)。
  • on:常驻显示。
-

scrolleffect

-

string

-

spring

-

-

滑动效果,目前支持如下滑动效果:

-
  • spring:弹性物理动效,滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹。
  • fade:渐隐物理动效,滑动到边缘后展示一个波浪形的渐隐,根据速度和滑动距离的变化渐隐也会发送一定的变化。
  • no:滑动到边缘后无效果。
-

indexer

-

boolean | Array<string>

-

false

-

-

是否展示侧边栏快速字母索引栏。设置为true或者自定义索引时,索引栏会显示在列表右边界处。示例:

-

"indexer" : "true"表示使用默认字母索引表。

-

"indexer" : "false"表示无索引。

-

"indexer" : ["#", "A", ".", "E", ".", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]表示自定义索引表。自定义时"#"必须要存在。

-
说明:
  • indexer属性生效需要flex-direction属性配合设置为column,且columns属性设置为1。
  • 点击索引条进行列表项索引需要list-item子组件配合设置相应的section属性
-
-

indexermulti5+

-

boolean

-

false

-

-

是否开启索引条多语言功能。

-

indexer为false时不生效。

-

indexerbubble5+

-

boolean

-

true

-

-

是否开启索引切换的气泡提示。

-

indexer为false时不生效。

-

divider5+

-

boolean

-

false

-

-

item是否自带分隔线。

-

其样式参考样式列表的divider-color、divider-height、divider-length、divider-origin。

-

shapemode

-

string

-

default

-

-

侧边滑动栏的形状类型。

-
  • default:不指定,跟随主题;
  • rect:矩形;
  • round:圆形。
-

updateeffect

-

boolean

-

false

-

-

用于设置当list内部的item发生删除或新增时是否支持动效。

-
  • false:新增删除item时无过渡动效。
  • true:新增删除item时播放过程动效。
-

chainanimation5+

-

boolean

-

false

-

-

用于设置当前list是否启用链式联动动效,开启后列表滑动以及顶部和底部拖拽时会有链式联动的效果。链式联动效果:list内的list-item间隔一定距离,在基本的滑动交互行为下,主动对象驱动从动对象进行联动,驱动效果遵循弹簧物理动效。

-
  • false:不启用链式联动
  • true:启用链式联动
    说明:
    • 不支持动态修改。
    • 如同时配置了indexer,链式动效不生效。
    • 如配置了链式动效,list-item的sticky不生效。
    -
    -
-

initialindex

-

number

-

0

-

-

用于设置当前List初次加载时视口起始位置显示的item,默认为0,即显示第一个item,如设置的序号超过了最后一个item的序号,则设置不生效,当同时设置了initialoffset属性时,当前属性不生效。当indexer为true或者scrollpage为true时,不生效。

-

initialoffset

-

<length>

-

0

-

-

用于设置当前List初次加载时视口的起始偏移量,偏移量无法超过当前List可滑动的范围,如果超过会被截断为可滑动范围的极限值。当indexer为true或者scrollpage为true时,不生效。

-

selected5+

-

string

-

-

-

-

指定当前列表中被选中激活的项,可选值为list-item的section属性值。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

indexerchange5+

-

{ local: booleanValue }

-

多语言索引条切换事件,仅当indexer属性为true,indexermulti为true时生效。booleanValue可能值为true或者false:

-
  • true: 当前展示本地索引。
  • false: 当前展示字母索引。
-

scroll

-

{ scrollX: scrollXValue, scrollY: scrollYValue, scrollState: stateValue }

-

列表滑动的偏移量和状态回调。

-

stateValue: 0表示列表滑动已经停止。

-

stateValue: 1表示列表正在用户触摸状态下滑动。

-

stateValue: 2表示列表正在用户松手状态下滑动。

-

scrollbottom

-

-

-

当前列表已滑动到底部位置。

-

scrolltop

-

-

-

当前列表已滑动到顶部位置。

-

scrollend

-

-

-

列表滑动已经结束。

-

scrolltouchup

-

-

-

手指已经抬起且列表仍在惯性滑动。

-

requestitem

-

-

-

请求创建新的list-item。

-

长列表延迟加载时,可视区域外缓存的list-item数量少于cachedcount时,会触发该事件。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

divider-color5+

-

<color>

-

transparent

-

-

item分隔线颜色,仅当list的divider属性为true时生效。

-

divider-height5+

-

<length>

-

1

-

-

item分隔线高度,仅当list的divider属性为true时生效。

-

divider-length5+

-

<length>

-

主轴宽度

-

-

item分隔线长度,不设置时最大长度为主轴宽度,具体长度取决于divider-origin,仅当list的divider属性为true时生效。

-

divider-origin5+

-

<length>

-

0

-

-

item分隔线相对于item主轴起点位置的偏移量,仅当list的divider属性为true时生效。

-

flex-direction

-

string

-

-

column

-

-

设置flex容器主轴的方向,指定flex项如何放置在flex容器中,可选值为:

-
  • column:主轴为纵向。
  • row:主轴为横向。
-

其他组件默认值为row,在list组件中默认值为column。

-

columns

-

number

-

1

-

-

list交叉轴方向的显示列数,默认为1列。

-
说明:

设置多列时,在list交叉轴上进行均分,每一列大小相同。

-
-

align-items

-

string

-

stretch

-

-

list每一列交叉轴上的对齐格式,可选值为:

-
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
    说明:

    align-items样式作用在每一列的子元素上,列与列之间采用均分方式布局。

    -
    -
-

item-extent

-

<length> | <percentage>

-

-

-

-

设置内部item为固定大小,设置为百分比格式时,指相对于list的视口主轴方向长度的百分比。

-

fade-color

-

<color>

-

grey

-

-

设置渐隐物理动效的颜色。当滑动效果设置为渐隐物理动效时生效。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 方法 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

scrollTo

-

{ index: number(指定位置) }

-

list滑动到指定index的item位置。

-

scrollTop

-

{ smooth: boolean }

-

smooth缺省为false,表示直接滚动到顶部。

-

smooth为true,表示平滑滚动到顶部。

-

scrollBottom

-

{ smooth: boolean }

-

smooth缺省为false,表示直接滚动到底部。

-

smooth为true,表示平滑滚动到底部。

-

scrollPage

-

{ reverse: boolean, smooth: boolean }

-

reverse缺省值为false,表示下一页,无完整页则滚动到底部。

-

reverse为true,表示上一页,无完整页则滚动到顶部。

-

smooth缺省值为false,表示直接滚动一页。

-

smooth为true,表示平滑滚动一页。

-

scrollArrow

-

{ reverse: boolean, smooth: boolean }

-

reverse缺省值为false,表示向底部方向滑动一段距离,无足够距离则滚动到底部。

-

reverse为true,表示向顶部方向滑动一段距离,无足够距离则滚动到顶部。

-

smooth缺省值为false,表示直接滚动。

-

smooth为true,表示平滑滚动。

-

collapseGroup

-

{ groupid: string }

-

收拢指定的group。

-

groupid:需要收拢的group的id。

-

当groupid未指定时收拢所有的group。

-

expandGroup

-

{ groupid: string }

-

展开指定的group。

-

groupid:需要展开的group的id。

-

当groupid未指定时展开所有的group。

-

currentOffset

-

-

-

返回当前滑动的偏移量。返回值类型是Object,返回值说明请见表2

-
- -**表 1** ListScrollByOptions - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

是否必选

-

默认值

-

备注

-

dx

-

number

-

-

0

-

水平方向滑动的偏移量,单位px。

-

dy

-

number

-

-

0

-

垂直方向滑动的偏移量,单位px。

-

smooth

-

boolean

-

-

true

-

列表位置跳转时是否有滑动动画。

-
- -**表 2** currentOffset返回对象属性说明 - - - - - - - - - - - - - - - - -

名称

-

类型

-

备注

-

x

-

number

-

当前x轴滑动偏移量,单位px。

-

y

-

number

-

当前y轴滑动偏移量,单位px。

-
- -## 示例 - -``` - -
- - - {{$item.title}} - {{$item.date}} - - -
-``` - -``` -// index.js -export default { - data: { - todolist: [{ - title: '刷题', - date: '2021-12-31 10:00:00', - }, { - title: '看电影', - date: '2021-12-31 20:00:00', - }], - }, -} -``` - -``` -/* index.css */ -.container { - display: flex; - justify-content: center; - align-items: center; - left: 0px; - top: 0px; - width: 454px; - height: 454px; -} -.todo-wraper { - width: 454px; - height: 300px; -} -.todo-item { - width: 454px; - height: 80px; - flex-direction: column; -} -.todo-title { - width: 454px; - height: 40px; - text-align: center; -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001082299162.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/05.list-item.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/05.list-item.md" deleted file mode 100644 index 9bdf5041e4bdc527f47f3868659972b5778865f2..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/05.list-item.md" +++ /dev/null @@ -1,691 +0,0 @@ ---- -title: list-item -permalink: /pages/000d010104 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# list-item - -- [权限列表](#zh-cn_topic_0000001058670839_section11257113618419) -- [子组件](#zh-cn_topic_0000001058670839_section9288143101012) -- [属性](#zh-cn_topic_0000001058670839_section2907183951110) -- [事件](#zh-cn_topic_0000001058670839_section26172053201913) -- [样式](#zh-cn_topic_0000001058670839_section5775351116) - -<[list](/pages/000d010103#ZH-CN_TOPIC_0000001162494595)\>的子组件,用来展示列表具体item。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->由于父元素list组件的align-items默认样式为stretch,该组件宽度默认充满list组件。设置父元素list组件的align-items样式为非stretch来生效自定义宽度。 - -## 权限列表 - -无 - -## 子组件 - -支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

type

-

string

-

default

-

-

list-item类型,默认值为default,同一list中可以包含多种type的list-item,相同type的list-item需要确保渲染后的视图布局也相同,如果type固定,则使用show属性代替if属性,确保视图布局不变。

-

primary

-

boolean

-

false

-

-

设置为true表示该item是group中的主item,即收拢时显示的item。如果有多个primary,以第一个为准。如果没有标记为primary的item,则以第一个item为主item。

-

section

-

string

-

-

-

-

当前item的匹配字符串,如不设置则为空。不支持动态修改。group内只有主item设置有效。

-

sticky

-

string

-

none

-

-

设置当前item是否为吸顶item以及其吸顶消失的效果,当前仅支持纵向list,group内部的item不可吸顶,设置该属性无效。

-
  • none:当前item不吸顶。
  • normal:当前item吸顶,消失效果滑动消失。
  • opacity:当前item吸顶,消失效果渐隐消失。
-

clickeffect5+

-

boolean

-

true

-

-

设置当前item是否有点击动效。

-
  • false:item点击时无点击动效。
  • true:item点击时有点击动效。
-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

sticky

-

{ state: boolean }

-

吸顶组件回调事件。

-

value: false表示当前item处于非吸顶状态;

-

value: true表示当前item处于吸顶状态;

-

说明:仅当item设置sticky属性时支持注册此事件。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

column-span

-

<number>

-

1

-

-

当前的list-item需要在list中占据的列的数量,默认占一列,仅在list为多列时生效。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/06.list-item-group.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/06.list-item-group.md" deleted file mode 100644 index 5b72eafb1f127cf4bc979b90fee850e91a0c4785..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/06.list-item-group.md" +++ /dev/null @@ -1,781 +0,0 @@ ---- -title: list-item-group -permalink: /pages/000d010105 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# list-item-group - -- [权限列表](#zh-cn_topic_0000001058830738_section11257113618419) -- [子组件](#zh-cn_topic_0000001058830738_section9288143101012) -- [属性](#zh-cn_topic_0000001058830738_section2907183951110) -- [事件](#zh-cn_topic_0000001058830738_section3892191911214) -- [样式](#zh-cn_topic_0000001058830738_section16337145611017) -- [示例](#zh-cn_topic_0000001058830738_section1159816598218) - -<[list](/pages/000d010103#ZH-CN_TOPIC_0000001162494595)\>的子组件,用来展示分组,宽度默认充满list组件。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->- 使用该组件时父元素list组件的样式columns必须为1,否则功能异常。 ->- 由于父元素list组件的align-items默认样式为stretch,该组件宽度默认充满list组件。设置父元素list组件的align-items样式为非stretch来生效自定义宽度。 - -## 权限列表 - -无 - -## 子组件 - -仅支持<[list-item](/pages/000d010104#ZH-CN_TOPIC_0000001115814816)\>。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

type

-

string

-

default

-

-

list-item-group类型,同一list支持多种type的list-item-group,相同type的list-item-group需要确保渲染后的视图布局也完全相同,当type固定时,使用show属性代替if属性,确保视图布局不变。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -通用属性中的id用来标识一个group。list中相关的函数的入参以及事件的信息皆以此标识一个唯一的group。 - -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

groupclick

-

{ groupid: string }

-

group点击事件。

-

groupid:被点击的group的id。

-

groupcollapse

-

{ groupid: string }

-

group收拢事件。

-

groupid:收拢的group的id。

-

当不输入参数或者groupid为空时收拢所有分组。

-

groupexpand

-

{ groupid: string }

-

group展开事件。

-

groupid:展开的group的id。

-

当不输入参数或者groupid为空时展开所有分组。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

flex-direction

-

string

-

row

-

-

flex容器主轴方向。可选项有:

-
  • column:垂直方向从上到下
  • row:水平方向从左到右
-

justify-content

-

string

-

flex-start

-

-

flex容器当前行的主轴对齐格式。可选项有:

-
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
  • space-evenly5+: 均匀排列每个元素,每个元素之间的间隔相等。
-

display

-

string

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-
- -## 示例 - -``` - -
- - -
-
- - -
-
- - -
-
-
- - - -
- One---{{listgroup.value}} -
-
- -
- Primary---{{listgroup.value}} -
-
-
-
-
-``` - -``` -/* xxx.css */ -.doc-page { - flex-direction: column; -} - -.top-list-item { - width:100%; - background-color:#D4F2E7; -} - -.item-div { - flex-direction:column; - align-items:center; - justify-content:space-around; - height:240px; -} - -.item-child { - width:100%; - height:60px; - justify-content:space-around; - align-items:center; -} - -.item-group-child { - justify-content: center; - align-items: center; - width:100%; -} -``` - -``` -// xxx.js -import prompt from '@system.prompt'; - -export default { - data: { - direction: 'column', - list: [] - }, - onInit() { - this.list = [] - this.listAdd = [] - for (var i = 1; i <= 3; i++) { - var dataItem = { - value: 'GROUP' + i, - }; - this.list.push(dataItem); - } - }, - collapseOne(e) { - this.$element('mylist').collapseGroup({ - groupid: 'GROUP1' - }) - }, - expandOne(e) { - this.$element('mylist').expandGroup({ - groupid: 'GROUP1' - }) - }, - collapseAll(e) { - this.$element('mylist').collapseGroup() - }, - expandAll(e) { - this.$element('mylist').expandGroup() - }, - collapse(e) { - prompt.showToast({ - message: 'Close ' + e.groupid - }) - }, - expand(e) { - prompt.showToast({ - message: 'Open ' + e.groupid - }) - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/list6.gif) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/07.panel.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/07.panel.md" deleted file mode 100644 index c49a9592382a811cf2b04fe84c09626be6cbef77..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/07.panel.md" +++ /dev/null @@ -1,611 +0,0 @@ ---- -title: panel -permalink: /pages/000d010106 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# panel - -- [权限列表](#zh-cn_topic_0000001062321291_section11257113618419) -- [子组件](#zh-cn_topic_0000001062321291_section19368335134016) -- [属性](#zh-cn_topic_0000001062321291_section1100152194018) -- [样式](#zh-cn_topic_0000001062321291_section1137118175437) -- [事件](#zh-cn_topic_0000001062321291_section1614413538447) -- [方法](#zh-cn_topic_0000001062321291_section165301745164719) -- [示例](#zh-cn_topic_0000001062321291_section36743614499) - -可滑动面板。提供一种轻量的内容展示的窗口,可方便的在不同尺寸中切换。属于弹出式组件。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->从API Version 5 开始支持。 - -## 权限列表 - -无 - -## 子组件 - -支持 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

type

-

string

-

-

-

-

设置可滑动面板类型,不可动态变更,可选值有:

-
  • minibar:提供minibar和类全屏展示切换效果。

    -
  • foldable:内容永久展示类,提供大(类全屏)、中(类半屏)、小三种尺寸展示切换效果。

    -
  • temporary:内容临时展示区,提供大(类全屏)、中(类半屏)两种尺寸展示切换效果。

    -
-

mode

-

string

-

full

-

-

设置初始状态,mode参数可选值为:

-
  1. mini:类型为minibar和foldable时,为最小状态;类型为temporary,则不生效。

    -
  2. half: 类型为foldable和temporary时,为类半屏状态;类型为minibar,则不生效。

    -
  3. full: 类全屏状态。

    -
-

dragbar

-

boolean

-

true

-

-

设置是否存在dragbar,true表示存在,false表示不存在。

-

fullheight

-

<length>

-

-

-

-

指定full状态下的高度,默认为屏幕尺寸 - 8px。

-

halfheight

-

<length>

-

-

-

-

指定half状态下的高度,默认为屏幕尺寸的一半。

-

miniheight

-

<length>

-

-

-

-

指定mini状态下的高度,默认为48px。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->panel可滑动面板暂不支持渲染属性,包括for、if和show。 - -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

padding

-

<length>

-

0

-

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length>

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length>

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length>

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-
- -## 事件 - - - - - - - - - - - - -

名称

-

参数

-

描述

-

sizechange

-

{ size: { height: heightLength, width: widthLength }, mode: modeStr }

-

当可滑动面板发生状态变化时触发,mode参数可选值为:

-
  1. mini:类型为minibar和foldable时,处于最小状态;

    -
  2. half: 类型为foldable时,处于类半屏状态;

    -
  3. full: 类全屏状态。

    -
    说明:

    返回的height值为内容区高度值,当dragbar属性为true时,panel本身的高度值为dragbar高度加上内容区高度。

    -
    -
-
- -## 方法 - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

show

-

-

-

弹出panel可滑动面板。

-

close

-

-

-

关闭panel可滑动面板。

-
- -## 示例 - -``` - -
-
- -
- -
-
- Simple panel in {{modeFlag}} mode -
-
- -
-
-
-
-``` - -``` -/* xxx.css */ -.doc-page { - flex-direction: column; - justify-content: center; - align-items: center; -} -.btn-div { - width: 100%; - height: 200px; - flex-direction: column; - align-items: center; - justify-content: center; -} -.txt { - color: #000000; - font-weight: bold; - font-size: 39px; -} -.panel-div { - width: 100%; - flex-direction: column; - align-items: center; -} -.inner-txt { - width: 100%; - height: 160px; - flex-direction: column; - align-items: center; - justify-content: center; -} -.inner-btn { - width: 100%; - height: 120px; - justify-content: center; - align-items: center; -} -``` - -``` -// xxx.js -export default { - data: { - modeFlag: "half" - }, - showPanel(e) { - this.$element('simplepanel').show() - }, - closePanel(e) { - this.$element('simplepanel').close() - }, - changeMode(e) { - this.modeFlag = e.mode - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/panel6.gif) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/08.popup.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/08.popup.md" deleted file mode 100644 index 8f96410beb41d7124f173991dc1bf4b805466d4d..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/08.popup.md" +++ /dev/null @@ -1,688 +0,0 @@ ---- -title: popup -permalink: /pages/000d010107 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# popup - -- [权限列表](#zh-cn_topic_0000001058988948_section11257113618419) -- [子组件](#zh-cn_topic_0000001058988948_s726c642d8f514b0cb5ef8854fe6ac02c) -- [属性](#zh-cn_topic_0000001058988948_s7ff9da9346504b11aca7015dc689dc67) -- [事件](#zh-cn_topic_0000001058988948_section1295913853210) -- [样式](#zh-cn_topic_0000001058988948_s472a5052130e49bca059adfe7bb6b96d) -- [方法](#zh-cn_topic_0000001058988948_section1970516568131) -- [示例](#zh-cn_topic_0000001058988948_section29231018162418) - -气泡指示。在点击绑定的控件后会弹出相应的气泡提示来引导用户进行操作。 - -## 权限列表 - -无 - -## 子组件 - -支持单个子组件节点5+。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

target

-

string

-

-

-

-

目标元素的id属性值,不支持动态切换。

-

placement

-

string

-

bottom

-

-

弹出窗口位置。可选值为:

-
  • left:位于目标元素左边;
  • right:位于目标元素右边;
  • top:位于目标元素上边;
  • bottom:位于目标元素下边;
  • topLeft:位于目标元素左上角;
  • topRight:位于目标元素右上角;
  • bottomLeft:位于目标元素左下角;
  • bottomRight:位于目标元素右下角。
-

keepalive5+

-

boolean

-

false

-

-

设置当前popup是否需要保留。设置为true时,点击屏幕区域或者页面切换气泡不会消失,需调用气泡组件的hide方法才可让气泡消失;设置为false时,点击屏幕区域或者页面切换气泡会自动消失。

-

clickable5+

-

boolean

-

true

-

-

popup是否使用点击弹窗,当设置为false时,只支持方法调用显示。

-

arrowoffset5+

-

<length>

-

0

-

-

popup箭头在弹窗处的偏移,默认居中,正值按照语言方向进行偏移,负值相反。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

visibilitychange

-

{ visibility: boolean }

-

当气泡弹出和消失时会触发该回调函数。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

mask-color

-

<color>

-

#00000000

-

-

遮罩层的颜色,默认值为全透明。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-
- -## 方法 - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

show5+

-

-

-

弹出气泡提示。

-

hide5+

-

-

-

取消气泡提示。

-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->1. popup气泡弹窗属性、样式均不支持动态更新。 ->2. popup气泡弹窗的margin样式是相对于target元素进行生效的,如popup在target元素下方,此时只生效margin-top样式,popup在target元素左上方,此时只生效margin-bottom和margin-right样式。 ->3. popup的border四边样式需一致,若四边设置不一致且圆角为零,则按左、上、右、下的顺序取第一个被设置的样式,否则border不生效。 ->4. popup的target组件的click事件不生效。 - -## 示例 - -``` - -
- Click to show the pop-up - - - Text content of the pop-up - - -
-``` - -``` -/* xxx.css */ -.container { - flex-direction: column; - align-items: center; - padding: 200px; -} -.popup { - mask-color: gray; -} -.text { - color: white; -} -.button { - width: 220px; - height: 70px; - margin-top: 50px; -} -``` - -``` -// xxx.js -import prompt from '@system.prompt' -export default { - visibilitychange(e) { - prompt.showToast({ - message: 'visibility change visibility: ' + e.visibility, - duration: 3000, - }); - }, - showpopup() { - this.$element("popup").show(); - }, - hidepopup() { - this.$element("popup").hide(); - }, -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001082052793.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/09.refresh.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/09.refresh.md" deleted file mode 100644 index f9e3c9e24032d0b4515236f93139d23d3e6a7a22..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/09.refresh.md" +++ /dev/null @@ -1,741 +0,0 @@ ---- -title: refresh -permalink: /pages/000d010108 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# refresh - -- [权限列表](#zh-cn_topic_0000001058562839_section11257113618419) -- [子组件](#zh-cn_topic_0000001058562839_section9288143101012) -- [属性](#zh-cn_topic_0000001058562839_section2907183951110) -- [事件](#zh-cn_topic_0000001058562839_section3892191911214) -- [样式](#zh-cn_topic_0000001058562839_section1465118493710) - -下拉刷新容器。 - -## 权限列表 - -无 - -## 子组件 - -支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

offset

-

<length>

-

-

-

-

刷新组件静止时距离父组件顶部的距离。

-

refreshing

-

boolean

-

false

-

-

用于标识刷新组件当前是否正在刷新。

-

type

-

string

-

auto

-

-

设置组件刷新时的动效。两个可选值,不支持动态修改。

-
  • auto: 默认效果,列表界面拉到顶后,列表不移动,下拉后有转圈弹出。
  • pulldown: 列表界面拉到顶后,可以继续往下滑动一段距离触发刷新,刷新完成后有回弹效果(如果子组件含有list,防止下拉效果冲突,需将list的scrolleffect设置为no)。
-

lasttime

-

boolean

-

false

-

-

是否显示上次更新时间,字符串格式为:“上次更新时间:XXXX ”,XXXX 按照时间日期显示规范显示,不可动态修改(建议type为pulldown时使用,固定距离位于内容下拉区域底部,使用时注意offset属性设置,防止出现重叠)。

-

friction

-

number

-

42

-

-

下拉摩擦系数,取值范围:0-100,数值越大refresh组件跟手性高,数值越小refresh跟手性低。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

refresh

-

{ refreshing: refreshingValue }

-

下拉刷新状态变化时触发。可能值:

-
  • false:当前处于下拉刷新过程中
  • true:当前未处于下拉刷新过程中
-

pulldown

-

{ state: string }

-

下拉开始和松手时触发。可能值:

-
  • start:表示开始下拉。
  • end:表示结束下拉。
-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

background-color

-

<color>

-

white

-

-

用于设置刷新组件的背景颜色。

-

progress-color

-

<color>

-

black

-

-

用于设置刷新组件的loading颜色。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

min-width5+

-

<length>

-

0

-

-

设置元素的最小宽度。

-

min-height5+

-

<length>

-

0

-

-

设置元素的最小高度。

-

max-width5+

-

<length>

-

-

-

-

设置元素的最大宽度。默认无限制。

-

max-height5+

-

<length>

-

-

-

-

设置元素的最大高度。默认无限制。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

box-shadow5+

-

-

-

0

-

-

语法:box-shadow: h-shadow v-shadow blur spread color

-

通过这个样式可以设置当前组件的阴影样式,包括水平位置(必填)、垂直位置(必填)、模糊半径(可选,默认值为0)、阴影延展距离(可选,默认值为0)、阴影颜色(可选,默认值为黑色)。

-

示例:

-
  • box-shadow :10px 20px 5px 10px #888888
  • box-shadow :100px 100px 30px red
  • box-shadow :-100px -100px 0px 40px
-

filter5+

-

string

-

-

-

-

语法:filter: blur(px)

-

通过这个样式可以设置当前组件布局范围的内容模糊,参数用于指定模糊半径,如果没有设置值,则默认是0(不模糊),不支持百分比。

-

示例:

-
  • filter: blur(10px)
-

backdrop-filter5+

-

string

-

-

-

-

语法:backdrop-filter: blur(px)

-

通过这个样式可以设置当前组件布局范围的背景模糊,参数用于指定模糊半径,如果没有设置值,则默认是0(不模糊),不支持百分比。

-

示例:

-
  • backdrop-filter: blur(10px)
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/10.stack.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/10.stack.md" deleted file mode 100644 index 08c78ffbc8b4fa7c04aafca7db3e43c9be4b5099..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/10.stack.md" +++ /dev/null @@ -1,655 +0,0 @@ ---- -title: stack -permalink: /pages/000d010109 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# stack - -- [权限列表](#zh-cn_topic_0000001058830801_section11257113618419) -- [子组件](#zh-cn_topic_0000001058830801_s2936fc34a22b44aa8389d1ec3de8fa61) -- [属性](#zh-cn_topic_0000001058830801_s7207d4d586504fa3be62558273017fbe) -- [事件](#zh-cn_topic_0000001058830801_section1948143416285) -- [样式](#zh-cn_topic_0000001058830801_se6fae888907a4236a6881e60a7567c37) -- [示例](#zh-cn_topic_0000001058830801_section18137649112711) - -堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。 - -## 权限列表 - -无 - -## 子组件 - -支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 示例 - -``` - - -
-
-
-
-``` - -``` -/* xxx.css */ -.stack-parent { - width: 400px; - height: 400px; - background-color: #ffffff; - border-width: 1px; - border-style: solid; -} -.back-child { - width: 300px; - height: 300px; - background-color: #3f56ea; -} -.front-child { - width: 100px; - height: 100px; - background-color: #00bfc9; -} -.positioned-child { - width: 100px; - height: 100px; - left: 50px; - top: 50px; - background-color: #47cc47; -} -.bd-radius { - border-radius: 16px; -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001074522727.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/11.stepper.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/11.stepper.md" deleted file mode 100644 index e5829b6d473a79969afd754b2426e6ef545b7d38..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/11.stepper.md" +++ /dev/null @@ -1,724 +0,0 @@ ---- -title: stepper -permalink: /pages/000d01010a -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# stepper - -- [权限列表](#zh-cn_topic_0000001060518078_section11257113618419) -- [子组件](#zh-cn_topic_0000001060518078_section9288143101012) -- [属性](#zh-cn_topic_0000001060518078_section191521418142311) -- [样式](#zh-cn_topic_0000001060518078_section72591594253) -- [事件](#zh-cn_topic_0000001060518078_section69611614182911) -- [方法](#zh-cn_topic_0000001060518078_section1954212182148) -- [示例](#zh-cn_topic_0000001060518078_section15374183712313) - -步骤导航器。当完成一个任务需要多个步骤时,可以使用步骤导航器展示当前进展。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->从API Version 5 开始支持。 - -## 权限列表 - -无 - -## 子组件 - -仅支持子组件。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->步骤导航器内的步骤顺序按照子组件的顺序进行排序。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

index

-

number

-

-

-

-

设置步骤导航器步骤显示第几个stepper-item子组件。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length>

-

0

-

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length>

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length>

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length>

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

number

-

-

-

-

规定当前组件如何适应父组件中的可用空间。它作为一个简写属性,用来设置组件的flex-grow。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->stepper组件默认占满父容器大小,建议父组件使用应用窗口大小(或者父组件为根节点)来优化体验。 - -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

finish

-

-

当步骤导航器最后一个步骤完成时触发该事件。

-

skip

-

-

当通过setNextButtonStatus方法设置当前步骤导航器可跳过时,点击右侧跳过按钮触发该事件。

-

change

-

{ prevIndex:prevIndex, index: index}

-

当步骤导航器点击左边或者右边文本按钮进行步骤切换时触发该事件,prevIndex表示老步骤的序号,index表示新步骤的序号。

-

next

-

{ index:index, pendingIndex: pendingIndex }

-

当用户点击下一步按钮时触发该事件,index表示当前步骤序号,pendingIndex表示将于跳转的序号,该事件有返回值,返回值格式为:{ pendingIndex:pendingIndex },可以通过指定pendingIndex来修改下一个步骤使用哪个stepper-item子组件。

-

back

-

{ index:index, pendingIndex: pendingIndex }

-

当用户点击上一步按钮时触发该事件,index表示当前步骤序号,pendingIndex表示将于跳转的序号,该事件有返回值,返回值格式为Object:{ pendingIndex:pendingIndex },可以通过指定pendingIndex来修改上一个步骤使用哪个stepper-item子组件。

-
- -## 方法 - - - - - - - - - - - - -

名称

-

参数

-

描述

-

setNextButtonStatus

-

{ status: string, label: label }

-

设置当前步骤导航器下一步文本按钮的状态,参数中status类型为string,可选值为:

-
  1. normal:正常状态,下一步文本按钮正常显示,可点击进入下一个步骤;
  2. disabled:不可用状态,下一步文本按钮灰度显示,不可点击进入下一个步骤;
  3. waiting:等待状态,下一步文本按钮不显示,使用等待进度条,不可点击进入下一个步骤。
  4. skip:跳过状态,下一步文本按钮显示跳过按钮,点击时会跳过剩下步骤。
-
- -## 示例 - -``` - -
- - -
- First screen -
- -
- -
- Second screen -
- -
- -
- Third screen -
- -
-
-
-``` - -``` -/* xxx.css */ -.container { - margin-top: 20px; - flex-direction: column; - align-items: center; - height: 300px; -} -.stepperItem { - flex-direction: column; - align-items: center; -} -.stepperItemContent { - color: #0000ff; - font-size: 50px; - justify-content: center; -} -.button { - width: 60%; - margin-top: 30px; - justify-content: center; -} -``` - -``` -// xxx.js -export default { - data: { - label_1: - { - prevLabel: 'BACK', - nextLabel: 'NEXT', - status: 'normal' - }, - label_2: - { - prevLabel: 'BACK', - nextLabel: 'NEXT', - status: 'normal' - }, - label_3: - { - prevLabel: 'BACK', - nextLabel: 'NEXT', - status: 'normal' - }, - }, - setRightButton(e) { - this.$element('mystepper').setNextButtonStatus({status: 'skip', label: 'SKIP'}); - }, - nextclick(e) { - var index = { - pendingIndex: e.pendingIndex - } - return index; - }, - backclick(e) { - var index = { - pendingIndex: e.pendingIndex - } - return index; - }, -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/Video_2021-03-26_154549.gif) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/12.stepper-item.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/12.stepper-item.md" deleted file mode 100644 index df594c8d9bf213c8e308c62667009c3b4e2b141c..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/12.stepper-item.md" +++ /dev/null @@ -1,650 +0,0 @@ ---- -title: stepper-item -permalink: /pages/000d01010b -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# stepper-item - -- [权限列表](#zh-cn_topic_0000001060038131_section11257113618419) -- [子组件](#zh-cn_topic_0000001060038131_section9288143101012) -- [属性](#zh-cn_topic_0000001060038131_section2907183951110) -- [样式](#zh-cn_topic_0000001060038131_section1326042123512) -- [事件](#zh-cn_topic_0000001060038131_section121081858163714) - -步骤导航器子组件,作为步骤导航器某一个步骤的内容展示组件。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->从API Version 5 开始支持。 - -## 权限列表 - -无 - -## 子组件 - -支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

label

-

Label

-

-

-

-

自定义步骤导航器底部步骤提示文本按钮属性,不支持动态修改。如果没有定义该属性,步骤导航器在中文语言环境下,使用“返回”和“下一步”文本按钮,在非中文语言环境下,使用“BACK”和“NEXT”文本按钮。针对第一个步骤,没有回退文本按钮,针对最后一个步骤,下一步文本按钮文本使用“开始”(中文语言)或者“START”(非中文语言)。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -**表 1** Label对象定义 - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

描述

-

prevLabel

-

string

-

-

-

步骤导航器底部回退文本按钮的描述文本。

-

nextLabel

-

string

-

-

-

步骤导航器底部下一步文本按钮的描述文本。

-

status

-

string

-

normal

-

步骤导航器当前步骤的初始状态,可选值为:

-
  1. normal:正常状态,右侧文本按钮正常显示,可点击进入下一个步骤;
  2. disabled:不可用状态,右侧文本按钮灰度显示,不可点击进入下一个步骤;
  3. waiting:等待状态,右侧文本按钮不显示,使用等待进度条,不可点击进入下一个步骤。
-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#e600000

-

-

文本颜色。

-

font-size

-

<length>

-

16px

-

-

文本大小。

-

allow-scale

-

boolean

-

true

-

-

文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-

font-style

-

string

-

normal

-

-

文本字体样式,可选值为:

-
  1. normal: 标准的字体样式;
  2. italic: 斜体的字体样式。
-

font-weight

-

number|string

-

normal

-

-

文本字体粗细,number类型取值[100, 900]的整数(被100整除),默认为400,取值越大,字体越粗。string类型取值为:lighter、normal、bold、bolder。

-

text-decoration

-

string

-

none

-

-

文本修饰,可选值为:

-
  1. underline: 文本下划线修饰;
  2. line-through: 穿过文本的修饰线;
  3. none: 标准文本。
-

font-family

-

string

-

sans-serif

-

-

字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

padding

-

<length>

-

0

-

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length>

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length>

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length>

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->stepper-item不支持长宽样式,宽和父容器stepper一样,高是父容器stepper减去底部导航按钮的高度。 - -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

appear

-

-

-

当该步骤出现时触发。

-

disappear

-

-

-

当该步骤消失时触发。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/13.swiper.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/13.swiper.md" deleted file mode 100644 index 595eda1e872e5518448a3b25ad9c18f2a3d3d59c..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/13.swiper.md" +++ /dev/null @@ -1,872 +0,0 @@ ---- -title: swiper -permalink: /pages/000d01010c -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# swiper - -- [权限列表](#zh-cn_topic_0000001058948921_section11257113618419) -- [子组件](#zh-cn_topic_0000001058948921_section9288143101012) -- [属性](#zh-cn_topic_0000001058948921_section2907183951110) -- [事件](#zh-cn_topic_0000001058948921_section5891352194417) -- [样式](#zh-cn_topic_0000001058948921_section5775351116) -- [方法](#zh-cn_topic_0000001058948921_section47669296127) -- [示例](#zh-cn_topic_0000001058948921_section1933534232313) - -滑动容器,提供切换子组件显示的能力。 - -## 权限列表 - -无 - -## 子组件 - -支持除之外的子组件。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

index

-

number

-

0

-

-

当前在容器中显示的子组件的索引值。

-

autoplay

-

boolean

-

false

-

-

子组件是否自动播放,自动播放状态下,导航点不可操作5+

-

interval

-

number

-

3000

-

-

使用自动播放时播放的时间间隔,单位为ms。

-

indicator

-

boolean

-

true

-

-

是否启用导航点指示器,默认true。

-

digital5+

-

boolean

-

false

-

-

是否启用数字导航点,默认为false。

-
说明:

必须设置indicator时才能生效数字导航点。

-
-

indicatordisabled5+

-

boolean

-

false

-

-

指示器是否禁止用户手势操作,设置为true时,指示器不会响应用户的点击拖拽。

-

loop

-

boolean

-

true

-

-

是否开启循环轮播。

-

duration

-

number

-

-

-

-

子组件切换的动画时长。

-

vertical

-

boolean

-

false

-

-

是否为纵向滑动,纵向滑动时采用纵向的指示器。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ index: currentIndex }

-

当前显示的组件索引变化时触发该事件。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

indicator-color

-

<color>

-

-

-

-

导航点指示器的填充颜色。

-

indicator-selected-color

-

<color>

-

#ff007dff

-

-

导航点指示器选中的颜色。

-

indicator-size

-

<length>

-

4px

-

-

导航点指示器的直径大小。

-

indicator-top|left|right|bottom

-

<length> | <percentage>

-

-

-

-

导航点指示器在swiper中的相对位置。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 方法 - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

swipeTo

-

{ index: number(指定位置) }

-

切换到index位置的子组件。

-

showNext

-

-

显示下一个子组件。

-

showPrevious

-

-

显示上一个子组件。

-
- -## 示例 - -``` - -
- -
- First screen -
-
- Second screen -
-
- Third screen -
-
- - - -
-``` - -``` -/* xxx.css */ -.container { - flex-direction: column; - width: 100%; - height: 100%; - align-items: center; -} -.swiper { - flex-direction: column; - align-content: center; - align-items: center; - width: 70%; - height: 130px; - border: 1px solid #000000; - indicator-color: #cf2411; - indicator-size: 14px; - indicator-bottom: 20px; - indicator-right: 30px; - margin-top: 100px; -} -.swiperContent { - height: 100%; - justify-content: center; -} -.button { - width: 70%; - margin: 10px; -} -.text { - font-size: 40px; -} -``` - -``` -// xxx.js -export default { - swipeTo() { - this.$element('swiper').swipeTo({index: 2}); - }, - showNext() { - this.$element('swiper').showNext(); - }, - showPrevious() { - this.$element('swiper').showPrevious(); - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/swiper.gif) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/14.tabs.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/14.tabs.md" deleted file mode 100644 index e5d2e1fedc40201109ec8ecdb294ee70e276f1bc..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/14.tabs.md" +++ /dev/null @@ -1,712 +0,0 @@ ---- -title: tabs -permalink: /pages/000d01010d -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# tabs - -- [权限列表](#zh-cn_topic_0000001058460507_section11257113618419) -- [子组件](#zh-cn_topic_0000001058460507_section9288143101012) -- [属性](#zh-cn_topic_0000001058460507_section2907183951110) -- [事件](#zh-cn_topic_0000001058460507_section3892191911214) -- [样式](#zh-cn_topic_0000001058460507_section1212881582618) -- [示例](#zh-cn_topic_0000001058460507_section14993155318710) - -tab页签容器。 - -## 权限列表 - -无 - -## 子组件 - -仅支持最多一个<[tab-bar](/pages/000d01010e#ZH-CN_TOPIC_0000001115974736)\>和最多一个<[tab-content](/pages/000d01010f#ZH-CN_TOPIC_0000001162494601)\>。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

index

-

number

-

0

-

-

当前处于激活态的tab索引。

-

vertical

-

boolean

-

false

-

-

是否为纵向的tab,默认为false,可选值为:

-
  • false:tabbar和tabcontent上下排列。
  • true:tabbar和tabcontent左右排列。
-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ index: indexValue }

-

tab页签切换后触发。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 示例 - -``` - -
- - - Home - Index - Detail - - -
- First screen -
-
- Second screen -
-
- Third screen -
-
-
-
-``` - -``` -/* xxx.css */ -.container { - flex-direction: column; - justify-content: flex-start; - align-items: center; -} -.tabs { - width: 100%; -} -.tabcontent { - width: 100%; - height: 80%; - justify-content: center; -} -.item-content { - height: 100%; - justify-content: center; -} -.item-title { - font-size: 60px; -} -.tab-bar { - margin: 10px; - height: 60px; - border-color: #007dff; - border-width: 1px; -} -.tab-text { - width: 300px; - text-align: center; -} -``` - -``` -// xxx.js -export default { - change: function(e) { - console.log("Tab index: " + e.index); - }, -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/tab.gif) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/15.tab-bar.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/15.tab-bar.md" deleted file mode 100644 index 48ed262cde72bacc9b5e1bc4da9a7e9c4b55e2f9..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/15.tab-bar.md" +++ /dev/null @@ -1,622 +0,0 @@ ---- -title: tab-bar -permalink: /pages/000d01010e -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# tab-bar - -- [权限列表](#zh-cn_topic_0000001058340503_section11257113618419) -- [子组件](#zh-cn_topic_0000001058340503_sfddaafa400fa4802a6c4344a0cc0f9ed) -- [属性](#zh-cn_topic_0000001058340503_s45d9533b71b049aba681c57db73d9f7b) -- [事件](#zh-cn_topic_0000001058340503_section71081937192815) -- [样式](#zh-cn_topic_0000001058340503_s20317619719f4f708afc05306d7630b3) - -<[tabs](/pages/000d01010d#ZH-CN_TOPIC_0000001162414619)\>的子组件,用来展示tab的标签区,子组件排列方式为横向排列。 - -## 权限列表 - -无 - -## 子组件 - -支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

mode

-

string

-

scrollable

-

-

设置组件宽度的可延展性。可选值为:

-
  • scrollable:子组件宽度为实际设置的宽度,当宽度之和大于tab-bar的宽度时,子组件可以横向滑动。
  • fixed:子组件宽度均分tab-bar的宽度。
-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

height

-

<length> | <percentage>

-

100px

-

-

每个tab-bar的高度。

-

缺省时使用元素自身内容需要的高度。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/16.tab-content.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/16.tab-content.md" deleted file mode 100644 index 3844b75671aa7da2bc0a2f55158f56cc6927bdd2..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/02.\345\256\271\345\231\250\347\273\204\344\273\266/16.tab-content.md" +++ /dev/null @@ -1,621 +0,0 @@ ---- -title: tab-content -permalink: /pages/000d01010f -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# tab-content - -- [权限列表](#zh-cn_topic_0000001059340508_section11257113618419) -- [子组件](#zh-cn_topic_0000001059340508_s6831289f2fac48a892746bd57f336c26) -- [属性](#zh-cn_topic_0000001059340508_s623ab9c704b24c329d0e91e85a30263e) -- [事件](#zh-cn_topic_0000001059340508_s0c39d3f35b9d4af69a19456ae743c675) -- [样式](#zh-cn_topic_0000001059340508_section1056973623012) - -<[tabs](/pages/000d01010d#ZH-CN_TOPIC_0000001162414619)\>的子组件,用来展示tab的内容区,高度默认充满tabs剩余空间,子组件排列方式为横向排列,当作为容器组件的子元素时在主轴方向需要设置tab-content的确定长度,否则无法显示。 - -## 权限列表 - -无 - -## 子组件 - -支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

scrollable

-

boolean

-

true

-

-

是否可以通过左右滑动进行页面切换。默认为true,设置为false后,页面的切换只能通过tab-bar的点击实现。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/01.button.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/01.button.md" deleted file mode 100644 index a8d1b1069b9df45d15d89b37e6b65af08ccd901a..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/01.button.md" +++ /dev/null @@ -1,824 +0,0 @@ ---- -title: button -permalink: /pages/000d010200 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# button - -- [子组件](#zh-cn_topic_0000001058670746_section9288143101012) -- [属性](#zh-cn_topic_0000001058670746_section2907183951110) -- [事件](#zh-cn_topic_0000001058670746_section1379202884114) -- [样式](#zh-cn_topic_0000001058670746_section5775351116) -- [示例](#zh-cn_topic_0000001058670746_section16867208402) - -提供按钮组件,包括胶囊按钮、圆形按钮、文本按钮。 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

type

-

string

-

-

-

-

不支持动态修改。如果该属性缺省,展示类胶囊型按钮,不同于胶囊类型,四边圆角可以通过border-radius分别指定,如果需要设置该属性,则可选值包括如下:

-
  • capsule:胶囊型按钮,带圆角按钮,有背景色和文本;
  • circle:圆形按钮,支持放置图标;
  • text:文本按钮,仅包含文本显示;
-

value

-

string

-

-

-

-

button的文本值,circle类型不生效。

-

icon

-

string

-

-

-

-

button的图标路径,仅circle类型生效,图标格式为jpg,png和svg。

-

placement5+

-

string

-

end

-

-

仅在type属性为缺省时生效,设置图标位于文本的位置,可选值为:

-
  • start:图标位于文本起始处;
  • end:图标位于文本结束处;
  • top:图标位于文本上方;
  • bottom:图标位于文本下方。
-

waiting

-

boolean

-

false

-

-

waiting状态,waiting为true时展现等待中转圈效果,位于文本左侧。类型为download时不生效。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

text-color

-

<color>

-

#ff007dff

-

-

按钮的文本颜色。

-

font-size

-

<length>

-

16px

-

-

按钮的文本尺寸。

-

allow-scale

-

boolean

-

true

-

-

按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

-
-

font-style

-

string

-

normal

-

-

按钮的字体样式。

-

font-weight

-

number | string

-

normal

-

-

按钮的字体粗细。见text组件font-weight的样式属性

-

font-family

-

<string>

-

sans-serif

-

-

按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

icon-width

-

<length>

-

-

-

-

设置圆形按钮内部图标的宽,默认填满整个圆形按钮。

-
说明:

icon使用svg图源时必须设置该样式。

-
-

icon-height

-

<length>

-

-

-

-

设置圆形按钮内部图标的高,默认填满整个圆形按钮。

-
说明:

icon使用svg图源时必须设置该样式。

-
-

radius

-

<length>

-

-

-

-

圆形按钮半径或者胶囊按钮圆角半径。在圆形按钮类型下该样式优先于通用样式的width和height样式。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->胶囊按钮(type=capsule)时,不支持border相关样式; ->圆形按钮(type=circle)时,不支持文本相关样式; ->文本按钮(type=text)时,自适应文本大小,不支持尺寸设置(radius,width,height),背景透明不支持background-color样式。 - -## 示例 - -``` - -
- - - - -
-``` - -``` -/* xxx.css */ -.div-button { - flex-direction: column; - align-items: center; -} -.button { - margin-top: 15px; -} -.button:waiting { - width: 280px; -} -.circle { - background-color: #007dff; - radius: 72px; - icon-width: 72px; - icon-height: 72px; -} -.text { - text-color: red; - font-size: 40px; - font-weight: 900; - font-family: sans-serif; - font-style: normal; -} -``` - -``` -// xxx.js -export default { - data: { - progress: 5, - downloadText: "Download" - }, -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058670800.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/02.chart.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/02.chart.md" deleted file mode 100644 index 8c546e9dbb603ef8c9c00410531cbe3d4d3421ca..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/02.chart.md" +++ /dev/null @@ -1,1686 +0,0 @@ ---- -title: chart -permalink: /pages/000d010201 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# chart - -- [权限列表](#zh-cn_topic_0000001059148552_section11257113618419) -- [子组件](#zh-cn_topic_0000001059148552_section9288143101012) -- [属性](#zh-cn_topic_0000001059148552_section2907183951110) -- [方法](#zh-cn_topic_0000001059148552_section5955645132417) -- [事件](#zh-cn_topic_0000001059148552_section749131815264) -- [样式](#zh-cn_topic_0000001059148552_section5775351116) -- [示例](#zh-cn_topic_0000001059148552_section164885329456) - -图表组件,用于呈现线形图、柱状图、量规图界面。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

type

-

string

-

line

-

-

设置图表类型(不支持动态修改),可选项有:

-
  • bar:柱状图。
  • line:线形图。
  • gauge:量规图。
  • progress5+:进度类圆形图表。
  • loading5+:加载类圆形图表。
  • rainbow5+:占比类圆形图表。
-

options

-

ChartOptions

-

-

-

-

图表参数设置,柱状图和线形图必须设置参数设置,量规图不生效。可以设置x轴、y轴的最小值、最大值、刻度数、是否显示,线条宽度、是否平滑等。(不支持动态修改)

-

datasets

-

Array<ChartDataset>

-

-

-

-

数据集合,柱状图和线形图必须设置数据集合,量规图不生效。可以设置多条数据集及其背景色。

-

segments5+

-

DataSegment | Array<DataSegment>

-

-

-

-

进度类、加载类和占比类圆形图表使用的数据结构。

-

DataSegment针对进度类和加载类圆形图表使用,

-

Array<DataSegment>针对占比类图标使用,DataSegment最多9个。

-

effects5+

-

boolean

-

true

-

-

是否开启占比类、进度类圆形图表特效。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -**表 1** ChartOptions - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

xAxis

-

ChartAxis

-

-

-

-

x轴参数设置。可以设置x轴最小值、最大值、刻度数以及是否显示。

-

yAxis

-

ChartAxis

-

-

-

-

y轴参数设置。可以设置y轴最小值、最大值、刻度数以及是否显示。

-

series

-

ChartSeries

-

-

-

-

数据序列参数设置。可以设置1)线的样式,如线宽、是否平滑;2)设置线最前端位置白点的样式和大小。

-
说明:

仅线形图支持。

-
-
- -**表 2** ChartDataset - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

strokeColor

-

<color>

-

#ff6384

-

-

线条颜色。

-
说明:

仅线形图支持。

-
-

fillColor

-

<color>

-

#ff6384

-

-

填充颜色。线形图表示填充的渐变颜色。

-

data

-

Array<number> | Array<Point>5+

-

-

-

-

设置绘制线或柱中的点集。

-

gradient

-

boolean

-

false

-

-

设置是否显示填充渐变颜色。

-
说明:

仅线形图支持。

-
-
- -**表 3** ChartAxis - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

min

-

number

-

0

-

-

轴的最小值。

-
说明:

不支持负数。仅线形图支持。

-
-

max

-

number

-

100

-

-

轴的最大值。

-
说明:

不支持负数。仅线形图支持。

-
-

axisTick

-

number

-

10

-

-

轴显示的刻度数量。

-
说明:

仅支持1~20,且具体显示的效果与如下计算值有关(图的宽度所占的像素/(max-min))。

-

在柱状图中,每组数据显示的柱子数量与刻度数量一致,且柱子显示在刻度处。

-
-

display

-

boolean

-

false

-

-

是否显示轴。

-

color

-

<color>

-

#c0c0c0

-

-

轴颜色。

-
- -**表 4** ChartSeries - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

lineStyle

-

ChartLineStyle

-

-

-

-

线样式设置,如线宽、是否平滑。

-

headPoint

-

PointStyle

-

-

-

-

线最前端位置白点的样式和大小。

-

topPoint

-

PointStyle

-

-

-

-

最高点的样式和大小。

-

bottomPoint

-

PointStyle

-

-

-

-

最低点的样式和大小。

-

loop

-

ChartLoop

-

-

-

-

设置屏幕显示满时,是否需要重头开始绘制。

-
- -**表 5** ChartLineStyle - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length>

-

1px

-

-

线宽设置。

-

smooth

-

boolean

-

false

-

-

是否平滑。

-
- -**表 6** PointStyle - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

shape

-

string

-

circle

-

-

高亮点的形状。可选值为:

-
  • circle:圆形。
  • square:方形。
  • triangle:三角形。
-

size

-

<length>

-

5px

-

-

高亮点的大小。

-

strokeWidth

-

<length>

-

1px

-

-

边框宽度

-

strokeColor

-

<color>

-

#ff0000

-

-

边框颜色。

-

fillColor

-

<color>

-

#ff0000

-

-

填充颜色。

-
- -**表 7** ChartLoop - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

margin

-

<length>

-

1

-

-

擦除点的个数(最新绘制的点与最老的点之间的横向距离)。注意:轻量设备margin和topPoint/bottomPoint/headPoint同时使用时,有概率出现point正好位于擦除区域的情况,导致point不可见,因此不建议同时使用。

-

gradient

-

boolean

-

-

-

是否需要渐变擦除。

-
- -**表 8** Point5+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

value

-

number

-

0

-

-

表示绘制点的Y轴坐标。

-

pointStyle

-

PointStyle

-

-

-

表示当前数据点的绘制样式。

-

description

-

string

-

-

-

表示当前点的注释内容。

-

textLocation

-

string

-

-

-

可选值为top,bottom,none。分别表示注释的绘制位置位于点的上方,下方,以及不绘制。

-

textColor

-

<color>

-

#000000

-

-

表示注释文字的颜色。

-

lineDash

-

string

-

solid

-

-

表示绘制当前线段虚线的样式。“dashed, 5, 5”表示纯虚线,绘制5px的实线后留5px的空白。“solid”表示绘制实线。

-

lineColor

-

<color>

-

#000000

-

-

表示绘制当前线段的颜色。此颜色不设置会默认使用整体的strokeColor。

-
- -**表 9** DataSegment5+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

startColor

-

Color

-

-

-

-

起始位置的颜色,设置startColor必须设置endColor。不设置startColor时,会使用系统默认预置的颜色数组,具体颜色值见下表。

-

endColor

-

Color

-

-

-

-

终止位置的颜色,设置endColor必须设置startColor。

-

不设置startColor时,会使用系统默认预置的颜色数组。

-

value

-

double

-

0

-

-

占比数据的所占份额,最大100。

-

name

-

string

-

-

-

-

此类数据的名称。

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

数据组

-

浅色主题

-

深色主题

-

0

-

起始颜色:#f7ce00,结束颜色:#f99b11

-

起始颜色:#d1a738,结束颜色:#eb933d

-

1

-

起始颜色:#f76223,结束颜色:#f2400a

-

起始颜色:#e67d50,结束颜色:#d9542b

-

2

-

起始颜色:#f772ac,结束颜色:#e65392

-

起始颜色:#d5749e,结束颜色:#d6568d

-

3

-

起始颜色:#a575eb,结束颜色:#a12df7

-

起始颜色:#9973d1,结束颜色:#5552d9

-

4

-

起始颜色:#7b79f7,结束颜色:#4b48f7

-

起始颜色:#7977d9,结束颜色:#f99b11

-

5

-

起始颜色:#4b8af3,结束颜色:#007dff

-

起始颜色:#4c81d9,结束颜色:#217bd9

-

6

-

起始颜色:#73c1e6,结束颜色:#4fb4e3

-

起始颜色:#5ea6d1,结束颜色:#4895c2

-

7

-

起始颜色:#a5d61d,结束颜色:#69d14f

-

起始颜色:#91c23a,结束颜色:#70ba5d

-

8

-

起始颜色:#a2a2b0,结束颜色:#8e8e93

-

起始颜色:#8c8c99,结束颜色:#6b6b76

-
- -当类型为量规图时,还支持如下属性: - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

percent

-

number

-

0

-

-

当前值占整体的百分比,取值范围为0-100。

-
- -## 方法 - - - - - - - - - - - - -

方法

-

参数

-

描述

-

append

-

{

-

serial: number, // 设置要更新的线形图数据下标

-

data: Array<number>, // 设置新增的数据

-

}

-

往已有的数据序列中动态添加数据,根据serial指定目标序列,serial为datasets数组的下标,从0开始。注意:不会更新datasets[index].data。仅线形图支持,按横坐标加1递增(与xAxis min/max设置相关)。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

stroke-width

-

<length>

-

32px(量规)

-

24px(占比类圆形图表)

-

-

量规、占比类圆形图表组件刻度条的宽度。

-

start-angle

-

<deg>

-

240(量规)

-

0(占比类圆形图表)

-

-

量规、占比类圆形图表组件刻度条起始角度,以时钟0点为基线。范围为0到360。

-

total-angle

-

<deg>

-

240(量规)

-

360(占比类圆形图表)

-

-

量规、占比类圆形图表组件刻度条总长度,范围为-360到360,负数标识起点到终点为逆时针。

-

center-x

-

<length>

-

-

-

-

量规组件刻度条中心位置,该样式优先于通用样式的position样式。该样式需要和center-y和radius一起配置才能生效。(仅量规图支持)

-

center-y

-

<length>

-

-

-

-

量规组件刻度条中心位置,该样式优先于通用样式的position样式。该样式需要和center-x和radius一起配置才能生效。(仅量规图支持)

-

radius

-

<length>

-

-

-

-

量规组件刻度条半径,该样式优先于通用样式的width和height样式。该样式需要和center-x和center-y一起配置才能生效。(仅量规图支持)

-

colors

-

Array

-

-

-

-

量规组件刻度条每一个区段的颜色。

-

如:colors: #ff0000, #00ff00。(仅量规图支持)

-

weights

-

Array

-

-

-

-

量规组件刻度条每一个区段的权重。

-

如:weights: 2, 2。(仅量规图支持)

-

font-family5+

-

Array

-

-

-

-

表示绘制注释的字体样式,支持自定义字体

-

font-size5+

-

<length>

-

-

-

-

表示绘制注释的字体的大小。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 示例 - -1. 线形图 - - ``` - -
- - - - - -
- ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - } - .chart-region { - height: 400px; - width: 700px; - } - .chart-background { - object-fit: fill; - } - .chart-data { - width: 700px; - height: 600px; - } - ``` - - ``` - // xxx.js - export default { - data: { - lineData: [ - { - strokeColor: '#0081ff', - fillColor: '#cce5ff', - data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628, 791, 505, 613, 575, 475, 553, 491, 680, 657, 716], - gradient: true, - } - ], - lineOps: { - xAxis: { - min: 0, - max: 20, - display: false, - }, - yAxis: { - min: 0, - max: 1000, - display: false, - }, - series: { - lineStyle: { - width: "5px", - smooth: true, - }, - headPoint: { - shape: "circle", - size: 20, - strokeWidth: 5, - fillColor: '#ffffff', - strokeColor: '#007aff', - display: true, - }, - loop: { - margin: 2, - gradient: true, - } - } - }, - }, - addData() { - this.$refs.linechart.append({ - serial: 0, - data: [Math.floor(Math.random() * 400) + 400] - }) - } - } - ``` - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059148590.png) - -2. 柱状图 - - ``` - -
- - - - -
- ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - } - .data-region { - height: 400px; - width: 700px; - } - .data-background { - object-fit: fill; - } - .data-bar { - width: 700px; - height: 400px; - } - ``` - - ``` - // xxx.js - export default { - data: { - barData: [ - { - fillColor: '#f07826', - data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628], - }, - { - fillColor: '#cce5ff', - data: [535, 776, 615, 444, 694, 785, 677, 609, 562, 410], - }, - { - fillColor: '#ff88bb', - data: [673, 500, 574, 483, 702, 583, 437, 506, 693, 657], - }, - ], - barOps: { - xAxis: { - min: 0, - max: 20, - display: false, - axisTick: 10, - }, - yAxis: { - min: 0, - max: 1000, - display: false, - }, - }, - } - } - ``` - - ![](/images/zh-cn/application-dev/js-reference/figures/barchart.png) - -3. 量规图 - - ``` - -
-
- -
-
- ``` - - ``` - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - } - .gauge-region { - height: 400px; - width: 400px; - } - .data-gauge { - colors: #83f115, #fd3636, #3bf8ff; - weights: 4, 2, 1; - } - ``` - - ![](/images/zh-cn/application-dev/js-reference/figures/gauge.png) - - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/03.divider.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/03.divider.md" deleted file mode 100644 index 70f60f79df66d08c0df2aa6aacfd7c2148692f2f..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/03.divider.md" +++ /dev/null @@ -1,310 +0,0 @@ ---- -title: divider -permalink: /pages/000d010202 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# divider - -- [权限列表](#zh-cn_topic_0000001059340510_section11257113618419) -- [子组件](#zh-cn_topic_0000001059340510_section9288143101012) -- [属性](#zh-cn_topic_0000001059340510_section2907183951110) -- [事件](#zh-cn_topic_0000001059340510_section1398020714187) -- [样式](#zh-cn_topic_0000001059340510_section5775351116) -- [示例](#zh-cn_topic_0000001059340510_section230641814493) - -提供分隔器组件,分隔不同内容块/内容元素。可用于列表或界面布局。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

vertical

-

boolean

-

false

-

-

使用水平分割线还是垂直分割线,默认水平。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - -不支持。 - -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

margin

-

<length>

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-

margin-[left|top|right|bottom]

-

<length>

-

0

-

-

使用简写属性设置左、上、右、下外边距属性,类型length,单位px,默认值0。

-

color

-

<color>

-

#08000000

-

-

设置分割线颜色。

-

stroke-width

-

<length>

-

1

-

-

设置分割线宽度。

-

display

-

string

-

flex

-

-

确定分割线所产生的框的类型。值flex/none,默认值flex。

-

visibility

-

string

-

visible

-

-

是否显示分割线。不可见的框会占用布局。visible代表显示元素,hidden代表不显示元素。

-

line-cap

-

string

-

butt

-

-

设置分割线条的端点样式,默认为butt,可选值为:

-
  • butt:分割线两端为平行线;
  • round:分割线两端额外添加半圆;
  • square:分割线两端额外添加半方形;
-
说明:

round和square会额外增加一个线宽的分割线长度。

-
-

flex

-

number

-

-

-

-

规定了分割线如何适应父组件中的可用空间。它作为一个简写属性,用来设置组件的flex-grow。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-grow

-

number

-

0

-

-

设置分割线的伸展因子,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex项加起来的大小)的分配系数。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

-

flex-shrink

-

number

-

1

-

-

设置分割线的收缩因子,flex元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置分割线在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-
- -## 示例 - -``` - -
-
- -
-
-``` - -``` -/* xxx.css */ -.container { - margin: 20px; - flex-direction:column; - width:100%; - height:100%; - align-items:center; -} -.content{ - width:80%; - height:40%; - border:1px solid #000000; - align-items: center; - justify-content: center; - flex-direction:column; -} -.divider { - margin: 10px; - color: #ff0000ff; - stroke-width: 3px; - line-cap: round; -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/1.jpg) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/04.image.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/04.image.md" deleted file mode 100644 index 7d1709eee2f0f6734f09d3418ed190e07dab8960..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/04.image.md" +++ /dev/null @@ -1,719 +0,0 @@ ---- -title: image -permalink: /pages/000d010203 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# image - -- [子组件](#zh-cn_topic_0000001058670744_section9288143101012) -- [属性](#zh-cn_topic_0000001058670744_section2907183951110) -- [事件](#zh-cn_topic_0000001058670744_section3892191911214) -- [样式](#zh-cn_topic_0000001058670744_section45171131134215) - -图片组件,用来渲染展示图片。 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

src

-

string

-

-

-

-

图片的路径,支持本地路径,图片格式包括png, jpg, bmp, svg和gif。

-

alt

-

string

-

-

-

-

占位图,当指定图片在加载中时显示。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

complete

-

{ width:width, height:height }

-

图片成功加载时触发该回调,返回成功加载的图源尺寸。

-

error

-

{ width:width, height:height }

-

图片加载出现异常时触发该回调,异常时长宽为零。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

object-fit

-

string

-

cover

-

-

设置图片的缩放类型。可选值类型说明请见object-fit 类型说明。(svg格式不支持)

-

match-text-direction

-

boolean

-

false

-

-

图片是否跟随文字方向。(svg格式不支持)

-

fit-original-size

-

boolean

-

false

-

-

image组件在未设置宽高的情况下是否适应图源尺寸(该属性为true时object-fit属性不生效),svg类型图源不支持该属性。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -**表 1** object-fit 类型说明 - - - - - - - - - - - - - - - - - - - - - - -

类型

-

描述

-

cover

-

保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界,居中显示。

-

contain

-

保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内,居中显示。

-

fill

-

不保持宽高比进行放大缩小,使得图片填充满显示边界。

-

none

-

保持原有尺寸进行居中显示。

-

scale-down

-

保持宽高比居中显示,图片缩小或者保持不变。

-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->使用svg图片资源时: ->- 建议设置image组件的长宽,否则在父组件的长或宽为无穷大的场景下,svg资源将不会绘制; ->- 如果svg描述中未指定相应的长宽,则svg将会填满image组件区域; ->- 如果svg描述中指定了相应的长宽,和image组件本身的长宽效果如下: ->1. 如果image组件本身的长宽小于svg中的长宽,svg会被裁切,仅显示左上角部分; ->2. 如果image组件本身的长宽大于svg中的长宽,svg会被放置在image组件的左上角,image组件其他部分显示空白。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/05.image-animator.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/05.image-animator.md" deleted file mode 100644 index 1f8b257896ba3aefe364c78d8c1d61ae2a33117d..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/05.image-animator.md" +++ /dev/null @@ -1,952 +0,0 @@ ---- -title: image-animator -permalink: /pages/000d010204 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# image-animator - -- [子组件](#zh-cn_topic_0000001058830740_section393521619565) -- [属性](#zh-cn_topic_0000001058830740_section1342212415618) -- [事件](#zh-cn_topic_0000001058830740_section17969351566) -- [样式](#zh-cn_topic_0000001058830740_section567195511491) -- [方法](#zh-cn_topic_0000001058830740_section1428810433566) -- [示例](#zh-cn_topic_0000001058830740_section118221913375) - -图片帧动画播放器。 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

images

-

Array<ImageFrame>

-

-

-

-

设置图片帧信息集合。每一帧的帧信息包含图片路径、图片大小和图片位置信息。目前支持以下图片格式:png、jpg。ImageFrame的详细说明请见表1

-
说明:

使用时需要使用数据绑定的方式,如images = {{images}},js中声明相应变量:images: [{src: "/common/heart-rate01.png"}, {src: "/common/heart-rate02.png"}]。

-
-

iteration

-

number | string

-

infinite

-

-

设置帧动画播放次数。number表示固定次数,infinite枚举表示无限次数播放。

-

reverse

-

boolean

-

false

-

-

设置播放顺序。false表示从第1张图片播放到最后1张图片; true表示从最后1张图片播放到第1张图片。

-

fixedsize

-

boolean

-

true

-

-

设置图片大小是否固定为组件大小。 true表示图片大小与组件大小一致,此时设置图片的width 、height 、top 和left属性是无效的。false表示每一张图片的 width 、height 、top和left属性都要单独设置。

-

duration

-

string

-

-

-

-

设置单次播放时长。单位支持[s(秒)|ms(毫秒)],默认单位为ms。 duration为0时,不播放图片。 值改变只会在下一次循环开始时生效。

-

fillmode5+

-

string

-

forwards

-

-

指定帧动画执行结束后的状态。可选项有:

-
  • none:恢复初始状态。
  • forwards:保持帧动画结束时的状态(在最后一个关键帧中定义)。
-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -**表 1** ImageFrame说明 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

src

-

<uri>

-

-

-

-

图片路径,图片格式为svg,png和jpg

-

width

-

<length>

-

0

-

-

图片宽度。

-

height

-

<length>

-

0

-

-

图片高度。

-

top

-

<length>

-

0

-

-

图片相对于组件左上角的纵向坐标。

-

left

-

<length>

-

0

-

-

图片相对于组件左上角的横向坐标。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

start

-

-

-

帧动画启动时触发。

-

pause

-

-

-

帧动画暂停时触发。

-

stop

-

-

-

帧动画结束时触发。

-

resume

-

-

-

帧动画恢复时触发。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 方法 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

start

-

-

-

开始播放图片帧动画。再次调用,重新从第1帧开始播放。

-

pause

-

-

-

暂停播放图片帧动画。

-

stop

-

-

-

停止播放图片帧动画。

-

resume

-

-

-

继续播放图片帧。

-

getState

-

-

-

获取播放状态。可能值有:

-
  • playing:播放中
  • paused:已暂停
  • stopped:已停止。
-
- -## 示例 - -``` - -
- -
- - - - -
-
-``` - -``` -/* xxx.css */ -.container { - flex-direction: column; - justify-content: center; - align-items: center; - left: 0px; - top: 0px; - width: 454px; - height: 454px; -} -.animator { - width: 70px; - height: 70px; -} -.btn-box { - width: 264px; - height: 120px; - flex-wrap: wrap; - justify-content: space-around; - align-items: center; -} -.btn { - border-radius: 8px; - width: 120px; - margin-top: 8px; -} -``` - -``` -//xxx.js -export default { - data: { - frames: [ - { - src: "/common/asserts/heart78.png", - }, - { - src: "/common/asserts/heart79.png", - }, - { - src: "/common/asserts/heart80.png", - }, - { - src: "/common/asserts/heart81.png", - }, - { - src: "/common/asserts/heart82.png", - }, - { - src: "/common/asserts/heart83.png", - }, - { - src: "/common/asserts/heart84.png", - }, - { - src: "/common/asserts/heart85.png", - }, - { - src: "/common/asserts/heart86.png", - }, - { - src: "/common/asserts/heart87.png", - }, - { - src: "/common/asserts/heart88.png", - }, - { - src: "/common/asserts/heart89.png", - }, - { - src: "/common/asserts/heart90.png", - }, - { - src: "/common/asserts/heart91.png", - }, - { - src: "/common/asserts/heart92.png", - }, - { - src: "/common/asserts/heart93.png", - }, - { - src: "/common/asserts/heart94.png", - }, - { - src: "/common/asserts/heart95.png", - }, - { - src: "/common/asserts/heart96.png", - }, - ], - }, - handleStart() { - this.$refs.animator.start(); - }, - handlePause() { - this.$refs.animator.pause(); - }, - handleResume() { - this.$refs.animator.resume(); - }, - handleStop() { - this.$refs.animator.stop(); - }, -}; -``` - -![](/images/zh-cn/application-dev/js-reference/figures/image-animator.gif) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/06.input.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/06.input.md" deleted file mode 100644 index 6e5ee6cf5f98f0681f770ca16ed4e5a50af0045b..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/06.input.md" +++ /dev/null @@ -1,777 +0,0 @@ ---- -title: input -permalink: /pages/000d010205 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# input - -- [权限列表](#zh-cn_topic_0000001059308536_section11257113618419) -- [子组件](#zh-cn_topic_0000001059308536_section9288143101012) -- [属性](#zh-cn_topic_0000001059308536_section2907183951110) -- [事件](#zh-cn_topic_0000001059308536_section3892191911214) -- [样式](#zh-cn_topic_0000001059308536_section066012492913) - -交互式组件,包括单选框,多选框,按钮。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

type

-

string

-

text

-

-

input组件类型,可选值为button,checkbox,radio。

-

button,checkbox,radio不支持动态修改。可选值定义如下:

-
  • button:定义可点击的按钮;
  • checkbox:定义多选框;
  • radio:定义单选按钮,允许在多个拥有相同name值的选项中选中其中一个;
-

checked

-

boolean

-

false

-

-

当前组件是否选中,仅type为checkbox和radio生效。

-

name

-

string

-

-

-

-

input组件的名称。

-

value

-

string

-

-

-

-

input组件的value值,当类型为radio时必填且相同name值的选项该值唯一。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - -- 当input类型为checkbox、radio时,支持如下事件: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ checked:true | false }

-

checkbox多选框或radio单选框的checked状态发生变化时触发该事件。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -- 当input类型为button时,支持如下事件: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- - -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#e6000000

-

-

按钮的文本颜色。

-

font-size

-

<length>

-

16px

-

-

按钮的文本尺寸。

-

allow-scale

-

boolean

-

true

-

-

按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

-
-

font-weight

-

number | string

-

normal

-

-

按钮的字体粗细,见text组件font-weight的样式属性

-

width

-

<length> | <percentage>

-

-

-

-

type为button时,默认值为128px。

-

height

-

<length> | <percentage>

-

-

-

-

type为button时,默认值为70px。

-

font-family

-

string

-

sans-serif

-

-

按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/07.label.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/07.label.md" deleted file mode 100644 index 8c9fa85e82bc0fde4a473f8586af4af29243a51f..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/07.label.md" +++ /dev/null @@ -1,791 +0,0 @@ ---- -title: label -permalink: /pages/000d010206 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# label - -- [权限列表](#zh-cn_topic_0000001058830742_section11257113618419) -- [子组件](#zh-cn_topic_0000001058830742_s0cb8fdf50d8a4f78a86bb76deec468fc) -- [属性](#zh-cn_topic_0000001058830742_s6c8b111b1d2e40b3b356f03389dad9cf) -- [事件](#zh-cn_topic_0000001058830742_section57301035448) -- [样式](#zh-cn_topic_0000001058830742_s5ed16ca4a52b4f8eb4c1a1e04ea9c2c4) -- [示例](#zh-cn_topic_0000001058830742_section1018514431132) - -为input、button、textarea组件定义相应的标注,点击该标注时会触发绑定组件的点击效果。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

target

-

string

-

-

-

-

目标组件的属性id值。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - -不支持。 - -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#e5000000

-

-

设置文本的颜色。

-

font-size

-

<length>

-

30px

-

-

设置文本的尺寸。

-

allow-scale

-

boolean

-

true

-

-

文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果需要支持动态生效,请参看config描述文件中config-changes标签。

-
-

letter-spacing

-

<length>

-

0px

-

-

设置文本的字符间距。

-

font-style

-

string

-

normal

-

-

设置文本的字体样式,可选值为:

-
  • normal:标准的字体样式;
  • italic:斜体的字体样式。
-

font-weight

-

number | string

-

normal

-

-

设置文本的字体粗细,number类型取值[100, 900],默认为400,取值越大,字体越粗。

-
说明:

number取值必须为100的整数倍。

-
-

string类型取值支持如下四个值:lighter、normal、bold、bolder。

-

text-decoration

-

string

-

none

-

-

设置文本的文本修饰,可选值为:

-
  • underline:文字下划线修饰;
  • line-through:穿过文本的修饰线n
  • none:标准文本。
-

text-align

-

string

-

start

-

-

设置文本的文本对齐方式,可选值为:

-
  • left:文本左对齐;
  • center:文本居中对齐;
  • right:文本右对齐;
  • start:根据文字书写相同的方向对齐;
  • end:根据文字书写相反的方向对齐。
-
说明:

如文本宽度未指定大小,文本的宽度和父容器的宽度大小相等的情况下,对齐效果可能会不明显。

-
-

line-height

-

<length>

-

0px

-

-

设置文本的文本行高,设置为0px时,不限制文本行高,自适应字体大小。

-

text-overflow

-

string

-

clip

-

-

在设置了最大行数的情况下生效,可选值为:

-
  • clip:将文本根据父容器大小进行裁剪显示;
  • ellipsis:根据父容器大小显示,显示不下的文本用省略号代替。需配合max-lines使用。
-

font-family

-

string

-

sans-serif

-

-

设置文本的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

max-lines

-

number

-

-

-

-

设置文本的最大行数。

-

min-font-size

-

<length>

-

-

-

-

文本最小字号,需要和文本最大字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

-

max-font-size

-

<length>

-

-

-

-

文本最大字号,需要和文本最小字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

-

font-size-step

-

<length>

-

1px

-

-

文本动态调整字号时的步长,需要设置最小,最大字号样式生效。

-

prefer-font-sizes

-

<array>

-

-

-

-

预设的字号集合,在动态尺寸调整时,优先使用预设字号集合中的字号匹配设置的最大行数,如果预设字号集合未设置,则使用最大最小和步长调整字号。针对仍然无法满足最大行数要求的情况,使用text-overflow设置项进行截断,设置预设尺寸集后,font-size、max-font-size、min-font-size和font-size-step不生效。

-

如:prefer-font-sizes: 12px,14px,16px

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 示例 - -``` - -
-
- - -
-
- - -
-
- - -
-
-``` - -``` -/*xxx.css */ -.container { - flex-direction: column; - align-items: center; -} -.row { - flex-direction: row; -} -.label { - width: 200px; -} -.input { - margin-left: 100px; - margin-top: 50px; -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/label.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/08.marquee.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/08.marquee.md" deleted file mode 100644 index 6cab00075ec25991cf56ae7abe11acca2c8885d3..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/08.marquee.md" +++ /dev/null @@ -1,822 +0,0 @@ ---- -title: marquee -permalink: /pages/000d010207 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# marquee - -- [权限列表](#zh-cn_topic_0000001058340505_section11257113618419) -- [子组件](#zh-cn_topic_0000001058340505_section9288143101012) -- [属性](#zh-cn_topic_0000001058340505_section2907183951110) -- [事件](#zh-cn_topic_0000001058340505_section3892191911214) -- [样式](#zh-cn_topic_0000001058340505_section14898114221220) -- [方法](#zh-cn_topic_0000001058340505_section47669296127) -- [示例](#zh-cn_topic_0000001058340505_section198211501414) - -跑马灯组件,用于展示一段单行滚动的文字。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

scrollamount

-

number

-

6

-

-

跑马灯每次滚动时移动的最大长度。

-

loop

-

number

-

-1

-

-

跑马灯滚动的次数。如果未指定,则默认值为-1,当该值小于等于零时表示marquee将连续滚动。

-

direction

-

string

-

left

-

-

设置跑马灯的文字滚动方向,可选值为left和right。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

bounce

-

-

-

当文本滚动到末尾时触发该事件。

-

finish

-

-

-

当完成滚动次数时触发该事件。需要在 loop 属性值大于 0 时触发。

-

start

-

-

-

当文本滚动开始时触发该事件。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#e5000000

-

-

设置跑马灯中文字的文本颜色。

-

font-size

-

<length>

-

37.5

-

-

设置跑马灯中文字的文本尺寸。

-

allow-scale

-

boolean

-

true

-

-

设置跑马灯中文字的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

-
-

font-weight

-

number | string

-

normal

-

-

设置跑马灯中文字的字体的粗细,见text组件font-weight的样式属性

-

font-family

-

string

-

sans-serif

-

-

设置跑马灯中文字的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 方法 - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

start

-

-

-

开始滚动。

-

stop

-

-

-

停止滚动。

-
- -## 示例 - -``` - -
- {{marqueeCustomData}} -
- - -
-
-``` - -``` -/* xxx.css */ -.container { - flex-direction: column; - justify-content: center; - align-items: center; - background-color: #ffffff; -} -.customMarquee { - width: 100%; - height: 80px; - padding: 10px; - margin: 20px; - border: 4px solid #ff8888; - border-radius: 20px; - font-size: 40px; - color: #ff8888; - font-weight: bolder; - font-family: serif; - background-color: #ffdddd; -} -.content { - flex-direction: row; -} -.controlButton { - flex-grow: 1; -} -``` - -``` -// xxx.js -export default { - data: { - scrollAmount: 30, - loop: 3, - marqueeDir: 'left', - marqueeCustomData: 'Custom marquee', - }, - onMarqueeBounce: function() { - console.log("onMarqueeBounce"); - }, - onMarqueeStart: function() { - console.log("onMarqueeStart"); - }, - onMarqueeFinish: function() { - console.log("onMarqueeFinish"); - }, - onStartClick (evt) { - this.$element('customMarquee').start(); - }, - onStopClick (evt) { - this.$element('customMarquee').stop(); - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/sample1.gif) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/09.menu.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/09.menu.md" deleted file mode 100644 index 748dc067068562112b64e343edc6489f2202adf8..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/09.menu.md" +++ /dev/null @@ -1,309 +0,0 @@ ---- -title: menu -permalink: /pages/000d010208 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# menu - -- [权限列表](#zh-cn_topic_0000001058562841_section11257113618419) -- [子组件](#zh-cn_topic_0000001058562841_section9288143101012) -- [属性](#zh-cn_topic_0000001058562841_section2907183951110) -- [事件](#zh-cn_topic_0000001058562841_section5624519222) -- [样式](#zh-cn_topic_0000001058562841_section5775351116) -- [方法](#zh-cn_topic_0000001058562841_section47669296127) -- [示例](#zh-cn_topic_0000001058562841_section54636714136) - -提供菜单组件,作为临时性弹出窗口,用于展示用户可执行的操作。 - -## 权限列表 - -无 - -## 子组件 - -<[option](/pages/000d010209#ZH-CN_TOPIC_0000001115974742)\>子组件。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

target

-

string

-

-

-

-

目标元素选择器。当使用目标元素选择器后,点击目标元素会自动弹出menu菜单。弹出菜单位置优先为目标元素右下角,当右边可视空间不足时会适当左移,当下方空间不足时会适当上移。

-

type

-

string

-

click

-

-

目标元素触发弹窗的方式,可选值有:

-
  • click:点击弹窗。
  • longpress:长按弹窗。
-

title

-

string

-

-

-

-

菜单标题内容。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-
- -## 事件 - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

selected

-

{ value:value }

-

菜单中某个值被点击选中时触发,返回的value值为option组件的value属性。

-

cancel

-

-

-

用户取消。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

text-color

-

<color>

-

-

-

-

设置菜单的文本颜色。

-

font-size

-

<length>

-

30px

-

-

设置菜单的文本尺寸。

-

allow-scale

-

boolean

-

true

-

-

设置菜单的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

-
-

letter-spacing

-

<length>

-

0

-

-

设置菜单的字符间距。

-

font-style

-

string

-

normal

-

-

设置菜单的字体样式。见text组件font-style的样式属性

-

font-weight

-

number | string

-

normal

-

-

设置菜单的字体粗细。见text组件font-weight的样式属性

-

font-family

-

string

-

sans-serif

-

-

设置菜单的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-
- -## 方法 - -支持如下方法。 - - - - - - - - - - - - -

名称

-

参数

-

描述

-

show

-

{ x:x, y:y }

-

显示menu菜单。(x, y)指定菜单弹窗位置。其中x表示距离可见区域左边沿的 X 轴坐标,不包含任何滚动偏移,y表示距离可见区域上边沿的 Y 轴坐标,不包含任何滚动偏移以及状态栏。菜单优先显示在弹窗位置右下角,当右边可视空间不足时会适当左移,当下方空间不足时会适当上移。

-
- -## 示例 - -``` - -
- Show popup menu. - - - - - -
-``` - -``` -/* xxx.css */ -.container { - flex-direction: column; - align-items: flex-start; - justify-content: center; -} -.title-text { - margin: 20px; -} -``` - -``` -// xxx.js -import prompt from '@system.prompt'; -export default { - onMenuSelected(e) { - prompt.showToast({ - message: e.value - }) - }, - onTextClick() { - this.$element("apiMenu").show({x:280,y:120}); - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/menu13.gif) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/10.option.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/10.option.md" deleted file mode 100644 index ffd1e12e3dd9a9cdd57fa12fdc0643b9a715347c..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/10.option.md" +++ /dev/null @@ -1,222 +0,0 @@ ---- -title: option -permalink: /pages/000d010209 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# option - -- [权限列表](#zh-cn_topic_0000001058830805_section11257113618419) -- [子组件](#zh-cn_topic_0000001058830805_section9288143101012) -- [属性](#zh-cn_topic_0000001058830805_section2907183951110) -- [事件](#zh-cn_topic_0000001058830805_section175135119475) -- [样式](#zh-cn_topic_0000001058830805_section5775351116) - -当作为<[select](/pages/000d010210#ZH-CN_TOPIC_0000001115974746)\>的子组件时用来展示下拉选择的具体项目。 - -当作为<[menu](/pages/000d010208#ZH-CN_TOPIC_0000001162414625)\>的子组件时用来展示弹出菜单的具体项目。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

selected

-

boolean

-

-

-

-

选择项是否为下拉列表的默认项,仅在父组件是select时生效。

-

value

-

string

-

-

-

-

选择项的值,作为select、menu父组件的selected事件中的返回值。

-
说明:

option选项的UI展示值需要放在标签内,如<option value="10">十月</option>

-
-

icon

-

string

-

-

-

-

图标资源路径,该图标展示在选项文本前,图标格式为jpg,png和svg。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

disabled(Rich)5+

-

boolean

-

false

-

-

当前选择项是否被禁用,在禁用场景下,组件将无法响应用户交互。

-
- -## 事件 - -不支持。 - -## 样式 - -支持如下样式。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#e6000000

-

-

选择项的文本颜色

-

font-size

-

<length>

-

16px

-

-

选择项的文本尺寸

-

allow-scale

-

boolean

-

true

-

-

选择项的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

-
-

font-weight

-

number | string

-

normal

-

-

选择项的字体粗细,见text组件font-weight的样式属性

-

text-decoration

-

string

-

none

-

-

选择项的文本修饰,见text组件text-decoration的样式属性

-

font-family

-

string

-

sans-serif

-

-

选择项的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/11.picker.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/11.picker.md" deleted file mode 100644 index 8e4c265cff507b657559172e57776fe4c0940d42..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/11.picker.md" +++ /dev/null @@ -1,1222 +0,0 @@ ---- -title: picker -permalink: /pages/000d01020a -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# picker - -- [权限列表](#zh-cn_topic_0000001059340512_section11257113618419) -- [子组件](#zh-cn_topic_0000001059340512_section9288143101012) -- [属性](#zh-cn_topic_0000001059340512_section2907183951110) -- [事件](#zh-cn_topic_0000001059340512_section3892191911214) -- [样式](#zh-cn_topic_0000001059340512_section1299175511712) -- [方法](#zh-cn_topic_0000001059340512_section47669296127) - -滑动选择器组件,类型支持普通选择器,日期选择器,时间选择器,时间日期选择器,多列文本选择器。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

type

-

string

-

-

-

-

该属性值不支持动态修改。可选择项有:

-
  • text:文本选择器。
  • date:日期选择器。
  • time:时间选择器。
  • datetime:日期时间选择器。
  • multi-text:多列文本选择器。
-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -普通选择器:type=text - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

range

-

Array

-

-

-

-

设置普通选择器的取值范围,如["15", "20", "25"]。

-
说明:

使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:["15", "20", "25"]。

-
-

selected

-

string

-

0

-

-

设置普通选择器弹窗的默认取值,取值需要是 range 的索引值,该取值表示选择器弹窗时弹窗界面的默认选择值。

-

value

-

string

-

-

-

-

设置普通选择器的值。

-
- -日期选择器:type=date - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

start

-

<time>

-

1970-1-1

-

-

设置日期选择器的起始时间,格式为 YYYY-MM-DD。

-

end

-

<time>

-

2100-12-31

-

-

设置日期选择器的结束时间,格式为 YYYY-MM-DD。

-

selected

-

string

-

当前日期

-

-

设置日期选择器弹窗的默认取值,格式为 YYYY-MM-DD,该取值表示选择器弹窗时弹窗界面的默认选择值。

-

value

-

string

-

-

-

-

设置日期选择器的值。

-

lunar5+

-

boolean

-

false

-

-

设置日期选择器弹窗界面是否为农历展示。

-
- -时间选择器:type=time - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

containsecond

-

boolean

-

false

-

-

设置时间选择器是否包含秒。

-

selected

-

string

-

当前时间

-

-

设置时间选择器弹窗的默认取值,格式为 HH:mm;当包含秒时,格式为HH:mm:ss,

-

该取值表示选择器弹窗时弹窗界面的默认选择值。

-

value

-

string

-

-

-

-

设置时间选择器的值。

-

hours

-

number

-

-5+

-

-

设置时间选择器采用的时间格式,可选值:

-
  • 12:按照12小时制显示,用上午和下午进行区分;
  • 24:按照24小时制显示。
    说明:

    默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

    -
    -
-
- -日期时间选择器:type=datetime,日期的选择范围为本年的日月。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

selected

-

string

-

当前日期时间

-

-

设置日期时间选择器弹窗的默认取值,格式有两种,为月日时分MM-DD-HH-mm或者年月日时分YYYY-MM-DD-HH-mm,不设置年时,默认使用当前年,该取值表示选择器弹窗时弹窗界面的默认选择值。

-

value

-

string

-

-

-

-

设置日期时间选择器的值。

-

hours

-

number

-

-5+

-

-

设置日期时间选择器采用的时间格式,可选值:

-
  • 12:按照12小时制显示,用上午和下午进行区分;
  • 24:按照24小时制显示。
    说明:

    默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

    -
    -
-

lunar5+

-

boolean

-

false

-

-

设置日期时间选择器弹窗界面是否为农历展示。

-
- -多列文本选择器:type=multi-text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

columns

-

number

-

-

-

-

设置多列文本选择器的列数。

-

range

-

二维Array

-

-

-

-

设置多列文本选择器的选择项,其中range 为二维数组。长度表示多少列,数组的每项表示每列的数据,如 [["a","b"], ["c","d"]]。

-
说明:

使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:[["a","b"], ["c","d"]]。

-
-

selected

-

Array

-

[0,0,0,…]

-

-

设置多列文本选择器弹窗的默认值,每一列被选中项对应的索引构成的数组,该取值表示选择器弹窗时弹窗界面的默认选择值。

-

value

-

Array

-

-

-

-

设置多列文本选择器的值,每一列被选中项对应的值构成的数组。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -普通选择器: - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ newValue:newValue, newSelected:newSelected }

-

普通选择器选择值后点击弹窗中的确定按钮时触发该事件(newSelected为索引)。

-

cancel

-

-

-

用户点击弹窗中的取消按钮时触发该事件。

-
- -日期选择器: - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ year:year, month:month, day:day }

-

日期选择器选择值后点击弹窗中的确认按钮时触发该事件。

-
说明:

month值范围为: 0(1月)~11(12月)。5+

-
-

cancel

-

-

-

用户点击弹窗中的取消按钮时触发该事件。

-
- -日期时间选择器: - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ year:year, month:month, day:day, hour:hour, minute:minute}

-

日期时间选择器选择值后点击弹窗中的确认按钮时触发该事件。

-

cancel

-

-

-

用户点击弹窗中的取消按钮时触发该事件。

-
- -时间选择器: - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ hour:hour, minute:minute,

-

[second:second] }

-

时间选择器选择值后点击弹窗中的确认按钮时触发该事件,当使用时分秒时,还包含秒数据。

-

cancel

-

-

-

用户点击弹窗中的取消按钮时触发该事件。

-
- -多列文本选择器: - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ newValue:[newValue1, newValue2, newValue3, …], newSelected:[newSelected1, newSelected2, newSelected3, …] }

-

多列文本选择器选择值后点击弹窗中的确认按钮时触发该事件,其中:

-
  • newValue:被选中项对应的值构成的数组。
  • newSelected:被选中项对应的索引构成的数组,两者的长度和range的长度一致。
-

columnchange

-

{ column:column, newValue:newValue, newSelected:newSelected }

-

多列文本选择器中某一列的值改变时触发该事件,其中:

-
  • column:第几列修改。
  • newValue:选中的值。
  • newSelected:选中值对应的索引。
-

cancel

-

-

-

用户点击弹窗中的取消按钮时触发该事件。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

text-color

-

<color>

-

#e6000000

-

-

选择器的文本颜色。

-

font-size

-

<length>

-

30px

-

-

选择器的文本尺寸。

-

allow-scale

-

boolean

-

true

-

-

选择器的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

-
-

letter-spacing

-

<length>

-

0

-

-

选择器的字符间距。见text组件的letter-spacing样式属性

-

text-decoration

-

string

-

-

-

-

选择器的文本修饰。见text组件的text-decoration样式属性

-

font-style

-

string

-

normal

-

-

选择器的字体样式。见text组件的font-style样式属性

-

font-weight

-

number | string

-

normal

-

-

选择器的字体粗细。见text组件的font-weight样式属性

-

font-family

-

string

-

sans-serif

-

-

选择器的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

line-height

-

<length>

-

0px

-

-

选择器的文本行高。

-

column-height5+

-

<length>

-

-

-

-

选择器的选择项列表高度。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 方法 - - - - - - - - - - - - -

名称

-

参数

-

描述

-

show

-

-

-

显示 picker。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/12.picker-view.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/12.picker-view.md" deleted file mode 100644 index a881bf27f3d6eb526e739f5329dec0c95ab52dd9..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/12.picker-view.md" +++ /dev/null @@ -1,1097 +0,0 @@ ---- -title: picker-view -permalink: /pages/000d01020b -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# picker-view - -- [概述](#zh-cn_topic_0000001058988952_section48017573337) -- [子组件](#zh-cn_topic_0000001058988952_section54292411343) -- [属性](#zh-cn_topic_0000001058988952_section121957126347) -- [事件](#zh-cn_topic_0000001058988952_section18155133771112) -- [样式](#zh-cn_topic_0000001058988952_section198061172344) -- [示例](#zh-cn_topic_0000001058988952_section738534695417) - -## 概述 - -嵌入页面的滑动选择器。 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

type

-

string

-

text

-

-

设置滑动选择器的类型,该属性不支持动态修改,可选项有:

-
  • text:文本选择器。
  • time:时间选择器。
  • date:日期选择器。
  • datetime:日期时间选择器。
  • multi-text:多列文本选择器。
-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -文本选择器:type=text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

range

-

Array

-

-

-

-

设置文本选择器的取值范围。

-
说明:

使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:["15", "20", "25"]。

-
-

selected

-

string

-

0

-

-

设置文本选择器的默认选择值,该值需要为range的索引。

-

indicatorprefix

-

string

-

-

-

-

文本选择器选定值增加的前缀字段。

-

indicatorsuffix

-

string

-

-

-

-

文本选择器选定值增加的后缀字段。

-
- -时间选择器:type=time - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

containsecond

-

boolean

-

false

-

-

时间选择器是否包含秒。

-

selected

-

string

-

当前时间

-

-

设置时间选择器的默认取值,格式为 HH:mm;

-

当包含秒时,格式为HH:mm:ss。

-

hours

-

number

-

-5+

-

-

设置时间选择器采用的时间格式,可选值:

-
  • 12:按照12小时制显示,用上午和下午进行区分;
  • 24:按照24小时制显示。
    说明:

    默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

    -
    -
-
- -日期选择器:type=date - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

start

-

<time>

-

1970-1-1

-

-

设置日期选择器的起始时间,格式为 YYYY-MM-DD。

-

end

-

<time>

-

2100-12-31

-

-

设置日期选择器的结束时间,格式为 YYYY-MM-DD。

-

selected

-

string

-

当前日期

-

-

设置日期选择器的默认选择值,格式为 YYYY-MM-DD。

-

lunar5+

-

boolean

-

false

-

-

设置日期选择器弹窗界面是否为农历展示。

-
- -日期时间选择器:type=datetime,日期的选择范围为本年的日月。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

selected

-

string

-

当前日期时间

-

-

设置日期时间选择器的默认取值,格式有两种,为月日时分MM-DD-HH-mm或者年月日时分YYYY-MM-DD-HH-mm,不设置年时,默认使用当前年,该取值表示选择器弹窗时弹窗界面的默认选择值。

-

hours

-

number

-

-5+

-

-

设置日期时间选择器采用的时间格式,可选值:

-
  • 12:按照12小时制显示,用上午和下午进行区分;
  • 24:按照24小时制显示。
    说明:

    默认值会依据系统当前所选地区和语言选择当地习惯的小时制(12小时制或24小时制)。5+

    -
    -
-

lunar5+

-

boolean

-

false

-

-

设置日期时间选择器弹窗界面是否为农历展示。

-
- -多列文本选择器:type=multi-text - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

columns

-

number

-

-

-

-

设置多列文本选择器的列数。

-

range

-

二维Array

-

-

-

-

设置多列文本选择器的选择值,该值为二维数组。长度表示多少列,数组的每项表示每列的数据,如 [["a","b"], ["c","d"]]。

-
说明:

使用时需要使用数据绑定的方式,如range = {{data}},js中声明相应变量:data:[["a","b"], ["c","d"]]。

-
-

selected

-

Array

-

[0,0,0,…]

-

-

设置多列文本选择器的默认值,每一列被选中项对应的索引构成的数组,该取值表示选择器弹窗时弹窗界面的默认选择值。

-
- -## 事件 - -type=text: - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ newValue: newValue, newSelected: newSelected }

-

文本选择器选定值后触发该事件。

-
- -type=time: - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ hour: hour, minute: minute, [second:second] }

-

时间选择器选定值后触发该事件。

-

包含秒时,返回时分秒。

-
- -type=date: - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ year:year, month:month, day:day }

-

日期选择器选择值后触发该事件。

-
- -type=datetime: - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ year:year, month:month, day:day, hour:hour, minute:minute }

-

日期时间选择器选择值后触发该事件。

-
- -type=multi-text: - - - - - - - - - - - - -

名称

-

参数

-

描述

-

columnchange

-

{ column:column, newValue:newValue, newSelected:newSelected }

-

多列文本选择器某一列的值改变时触发该事件,column:第几列修改,newValue:选中的值,newSelected:选中值对应的索引。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#ffffff

-

-

候选项字体颜色。

-

font-size

-

<length>

-

16px

-

-

候选项字体尺寸,类型length,单位px。

-

selected-color

-

<color>

-

#ff0a69f7

-

-

选中项字体颜色。

-

selected-font-size

-

<length>

-

20px

-

-

选中项字体尺寸,类型length,单位px。

-

disappear-color5+

-

<color>

-

#ffffff

-

-

渐变消失项的字体颜色。消失项是在一列中有五个选项场景下最上和最下的两个选项。

-

disappear-font-size5+

-

<length>

-

14px

-

-

渐变消失项的字体尺寸。消失项是在一列中有五个选项场景下最上和最下的两个选项。

-

font-family

-

string

-

sans-serif

-

-

选项字体类型。字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 示例 - -``` - -
- - Selected:{{time}} - - -
-``` - -``` -/* xxx.css */ -.container { - flex-direction: column; - justify-content: center; - align-items: center; - left: 0px; - top: 0px; - width: 454px; - height: 454px; -} -.title { - font-size: 30px; - text-align: center; -} -.time-picker { - width: 500px; - height: 400px; - margin-top: 20px; -} -``` - -``` -/* xxx.js */ -export default { - data: { - defaultTime: "", - time: "", - }, - onInit() { - this.defaultTime = this.now(); - }, - handleChange(data) { - this.time = this.concat(data.hour, data.minute); - }, - now() { - const date = new Date(); - const hours = date.getHours(); - const minutes = date.getMinutes(); - return this.concat(hours, minutes); - }, - - fill(value) { - return (value > 9 ? "" : "0") + value; - }, - - concat(hours, minutes) { - return `${this.fill(hours)}:${this.fill(minutes)}`; - }, -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/sssssss.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/13.piece.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/13.piece.md" deleted file mode 100644 index 06ec07d8508e054001cec532e5e23c92530fce21..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/13.piece.md" +++ /dev/null @@ -1,666 +0,0 @@ ---- -title: piece -permalink: /pages/000d01020c -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# piece - -- [子组件](#zh-cn_topic_0000001060517794_section9288143101012) -- [属性](#zh-cn_topic_0000001060517794_section2907183951110) -- [样式](#zh-cn_topic_0000001060517794_section17756476592) -- [事件](#zh-cn_topic_0000001060517794_section19137152119) -- [示例](#zh-cn_topic_0000001060517794_section118886119320) - -一种块状的入口,可包含图片和文本。常用于展示收件人,例如:邮件收件人或信息收件人。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->从API Version 5 开始支持。 - -## 子组件 - -无 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

content

-

string

-

-

-

-

操作块文本内容。

-

closable

-

boolean

-

false

-

-

设置当前操作块是否显示删除图标,当显示删除图标时,点击删除图标会触发close事件。

-

icon

-

string

-

-

-

-

操作块删除图标的url,支持本地路径,支持的图片格式为png、jpg和svg。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length>

-

0

-

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length>

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length>

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length>

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

number

-

-

-

-

规定当前组件如何适应父组件中的可用空间。它作为一个简写属性,用来设置组件的flex-grow。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->文本和图片默认在整个piece组件中居中。 - -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

close

-

-

-

当piece组件点击删除图标触发,此时可以通过渲染属性if删除该组件。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 示例 - -``` - -
- - -
-``` - -``` -// xxx.js -export default { - data: { - first: true, - second: true - }, - closeSecond(e) { - this.second = false; - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/SVID_20210301_193525_1.gif) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/14.progress.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/14.progress.md" deleted file mode 100644 index 5fdc4b90f08c390a552955234c080ed35b33db1f..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/14.progress.md" +++ /dev/null @@ -1,994 +0,0 @@ ---- -title: progress -permalink: /pages/000d01020d -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# progress - -- [权限列表](#zh-cn_topic_0000001058670841_section11257113618419) -- [子组件](#zh-cn_topic_0000001058670841_section9288143101012) -- [属性](#zh-cn_topic_0000001058670841_section2907183951110) -- [事件](#zh-cn_topic_0000001058670841_section164912362544) -- [样式](#zh-cn_topic_0000001058670841_section5775351116) -- [示例](#zh-cn_topic_0000001058670841_section493033510346) - -进度条,用于显示内容加载或操作处理进度。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

type

-

string

-

horizontal

-

-

设置进度条的类型,该属性不支持动态修改,可选值为:

-
  • horizontal:线性进度条;
  • circular:loading样式进度条;
  • ring:圆环形进度条;
  • scale-ring:带刻度圆环形进度条
  • arc:弧形进度条。
  • eclipse5+:圆形进度条,展现类似月圆月缺的进度展示效果。
-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -不同类型的进度条还支持不同的属性: - -- 类型为horizontal、ring、scale-ring时,支持如下属性: - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

percent

-

number

-

0

-

-

当前进度。取值范围为0-100。

-

secondarypercent

-

number

-

0

-

-

次级进度。取值范围为0-100。

-
- -- 类型为ring、scale-ring时,支持如下属性: - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

clockwise

-

boolean

-

true

-

-

圆环形进度条是否采用顺时针。

-
- -- 类型为arc、eclipse5+时,支持如下属性: - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

percent

-

number

-

0

-

-

当前进度。取值范围为0-100。

-
- - -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - -type=horizontal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#ff007dff

-

-

设置进度条的颜色。

-

stroke-width

-

<length>

-

4px

-

-

-

设置进度条的宽度。

-

background-color

-

<color>

-

-

-

-

设置进度条的背景色。

-

secondary-color

-

<color>

-

-

-

-

设置次级进度条的颜色。

-
- -type=circular - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

-

-

-

loading进度条上的圆点颜色。

-
- -type=ring, scale-ring - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color> | <linear-gradient>

-

-

-

-

环形进度条的颜色,ring类型支持线性渐变色设置。

-
说明:

线性渐变色仅支持两个颜色参数设置格式,如color = linear-gradient(#ff0000, #00ff00)。

-
-

background-color

-

<color>

-

-

-

-

环形进度条的背景色。

-

secondary-color

-

<color>

-

-

-

-

环形次级进度条的颜色。

-

stroke-width

-

<length>

-

10px

-

-

环形进度条的宽度。

-

scale-width

-

<length>

-

-

-

-

带刻度的环形进度条的刻度粗细,类型为scale-ring生效。

-

scale-number

-

number

-

120

-

-

带刻度的环形进度条的刻度数量,类型为scale-ring生效。

-
- -type=arc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

-

-

-

弧形进度条的颜色。

-

background-color

-

<color>

-

-

-

-

弧形进度条的背景色。

-

stroke-width

-

<length>

-

4px

-

-

弧形进度条的宽度。

-
说明:

进度条宽度越大,进度条越靠近圆心。即进度条始终在半径区域内。

-
-

start-angle

-

<deg>

-

240

-

-

弧形进度条起始角度,以时钟0点为基线。范围为0到360(顺时针)。

-

total-angle

-

<deg>

-

240

-

-

弧形进度条总长度,范围为-360到360,负数标识起点到终点为逆时针。

-

center-x

-

<length>

-

-

-

-

弧形进度条中心位置,(坐标原点为组件左上角顶点)。该样式需要和center-y和radius一起。

-

center-y

-

<length>

-

-

-

-

弧形进度条中心位置,(坐标原点为组件左上角顶点)。该样式需要和center-x和radius一起。

-

radius

-

<length>

-

-

-

-

弧形进度条半径,该样式需要和center-x和center-y一起。

-
- -type=eclipse5+ - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

-

-

-

圆形进度条的颜色。

-

background-color

-

<color>

-

-

-

-

弧形进度条的背景色。

-
- -除上述样式之外,所有type还支持如下样式: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 示例 - -``` - -
- - - - -
-``` - -``` -/* xxx.css */ -.container { - flex-direction: column; - height: 100%; - width: 100%; - align-items: center; -} -.min-progress { - width: 300px; - height: 300px; -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/progress.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/15.qrcode.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/15.qrcode.md" deleted file mode 100644 index 0bcd5c0eb06a33966ffbac9a880e7d729187e374..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/15.qrcode.md" +++ /dev/null @@ -1,646 +0,0 @@ ---- -title: qrcode -permalink: /pages/000d01020e -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# qrcode - -- [权限列表](#zh-cn_topic_0000001058562843_section11257113618419) -- [子组件](#zh-cn_topic_0000001058562843_section352513155564) -- [属性](#zh-cn_topic_0000001058562843_section5347151165210) -- [事件](#zh-cn_topic_0000001058562843_section108671611161319) -- [样式](#zh-cn_topic_0000001058562843_section439317598552) -- [示例](#zh-cn_topic_0000001058562843_section81001951259) - -生成并显示二维码。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->从API Version 5 开始支持。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

value

-

string

-

-

-

-

用来生成二维码的内容。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#000000

-

-

二维码颜色

-

background-color

-

<color>

-

#ffffff

-

-

二维码背景颜色

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->- width和height不一致时,以二者最小值作为二维码的边长。且最终生成的二维码居中显示; ->- width和height只设置一个时,取设置的值作为二维码的边长。都不设置时,使用默认200px边长。 - -## 示例 - -``` - -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/16.rating.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/16.rating.md" deleted file mode 100644 index ce676ef84cf39ed504593b8f1757fd9fe0416482..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/16.rating.md" +++ /dev/null @@ -1,683 +0,0 @@ ---- -title: rating -permalink: /pages/000d01020f -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# rating - -- [权限列表](#zh-cn_topic_0000001058460509_section11257113618419) -- [子组件](#zh-cn_topic_0000001058460509_section9288143101012) -- [属性](#zh-cn_topic_0000001058460509_section2907183951110) -- [事件](#zh-cn_topic_0000001058460509_section124498406719) -- [样式](#zh-cn_topic_0000001058460509_section5775351116) - -评分条,表示用户使用感受的衡量标准条。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

numstars

-

number

-

5

-

-

设置评分条的星级总数。

-

rating

-

number

-

0

-

-

设置评分条当前评星数。

-

indicator

-

boolean

-

false

-

-

设置评分条是否作为一个指示器,此时用户不可操作。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ rating: current rating }

-

评分条的评星发生改变时触发该回调。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

star-background

-

string

-

-

-

-

设置单个星级未选中的背景图片,只支持本地路径图片,图片格式为png和jpg。

-

star-foreground

-

string

-

-

-

-

设置单个星级选中的前景图片,只支持本地路径图片,图片格式为png和jpg。

-

star-secondary

-

string

-

-

-

-

设置单个星级部分选中的次级背景图片,该图片会覆盖背景图片,只支持本地路径图片,图片格式为png和jpg。

-

width

-

<length>|<percentage>

-

120px

-

60px(不可操作)

-

-

默认值是在未设置自定义资源和评分星数时,使用5个星和默认资源下的宽度值。

-

height

-

<length>|<percentage>

-

24px

-

12px(不可操作)

-

-

默认值是在未设置自定义资源和评分星数时,使用5个星和默认资源下的高度值。

-

rtl-flip

-

boolean

-

true

-

-

在RTL文字方向下是否自动翻转图源。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->star-background,star-secondary,star-foreground三个星级图源必须全部设置,否则默认的星级颜色为灰色,以此提示图源设置错误。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/17.select.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/17.select.md" deleted file mode 100644 index e1636771182ad2d34714a14046a5848f7f3d9480..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/17.select.md" +++ /dev/null @@ -1,621 +0,0 @@ ---- -title: select -permalink: /pages/000d010210 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# select - -- [权限列表](#zh-cn_topic_0000001058670843_section11257113618419) -- [子组件](#zh-cn_topic_0000001058670843_section9288143101012) -- [属性](#zh-cn_topic_0000001058670843_section2907183951110) -- [事件](#zh-cn_topic_0000001058670843_section3892191911214) -- [样式](#zh-cn_topic_0000001058670843_section648514244510) - -下拉选择按钮,可让用户在多个选项之间选择。 - -## 权限列表 - -无 - -## 子组件 - -支持<[option](/pages/000d010209#ZH-CN_TOPIC_0000001115974742)\>。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{newValue: newValue}

-

下拉选择新值后触发该事件,newValue的值为子组件option的value属性值。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

font-family

-

string

-

sans-serif

-

-

字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/18.slider.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/18.slider.md" deleted file mode 100644 index 222b6271074c01b7e66ecc154f5f625bcb977cb0..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/18.slider.md" +++ /dev/null @@ -1,816 +0,0 @@ ---- -title: slider -permalink: /pages/000d010211 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# slider - -- [子组件](#zh-cn_topic_0000001058948925_section9288143101012) -- [属性](#zh-cn_topic_0000001058948925_section2907183951110) -- [事件](#zh-cn_topic_0000001058948925_section412849105010) -- [样式](#zh-cn_topic_0000001058948925_section5775351116) -- [示例](#zh-cn_topic_0000001058948925_section166243517816) - -滑动条组件,用来快速调节设置值,如音量、亮度等。 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

min

-

number

-

0

-

-

滑动选择器的最小值。

-

max

-

number

-

100

-

-

滑动选择器的最大值。

-

step

-

number

-

1

-

-

每次滑动的步长。

-

value

-

number

-

0

-

-

滑动选择器的初始值。

-

mode5+

-

string

-

outset

-

-

滑动条样式:

-
  • outset:滑块在滑杆上;
  • inset:滑块在滑杆内。
-

showsteps5+

-

boolean

-

false

-

-

是否显示步长标识;

-

showtips5+

-

boolean

-

false

-

-

滑动时是否有气泡提示百分比;

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

ChangeEvent

-

选择值发生变化时触发该事件。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -**表 1** ChangeEvent - - - - - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

说明

-

progress(deprecated5+)

-

string

-

当前slider的进度值。

-

isEnd(deprecated5+)

-

string

-

当前slider是否拖拽结束,可选值为:

-
  • true:slider拖拽结束;
  • false:slider拖拽中。
-

value5+

-

number

-

当前slider的进度值。

-

mode5+

-

string

-

当前change事件的类型,可选值为:

-
  • start:slider的值开始改变;
  • move:slider的值跟随手指拖动中;
  • end:slider的值结束改变。
-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#19000000

-

-

滑动条的背景颜色。

-

selected-color

-

<color>

-

#ff007dff

-

-

滑动条的已选择颜色。

-

block-color

-

<color>

-

#ffffff

-

-

滑动条的滑块颜色。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

padding-[left|right]:32px;

-

padding-[top|bottom]:0px

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 示例 - -``` - -
- slider start value is {{startValue}} - slider current value is {{currentValue}} - slider end value is {{endValue}} - -
-``` - -``` -/* xxx.css */ -.container { - flex-direction: column; - justify-content: center; - align-items: center; -} -``` - -``` -// xxx.js -export default { - data: { - value: 0, - startValue: 0, - currentValue: 0, - endValue: 0, - }, - setvalue(e) { - if (e.mode == "start") { - this.value = e.value; - this.startValue = e.value; - } else if (e.mode == "move") { - this.value = e.value; - this.currentValue = e.value; - } else if (e.mode == "end") { - this.value = e.value; - this.endValue = e.value; - } - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/slider.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/19.span.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/19.span.md" deleted file mode 100644 index d88645671dd8c2791a3314eea414f538f31972b3..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/19.span.md" +++ /dev/null @@ -1,205 +0,0 @@ ---- -title: span -permalink: /pages/000d010212 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# span - -- [权限列表](#zh-cn_topic_0000001058948923_section11257113618419) -- [子组件](#zh-cn_topic_0000001058948923_section9288143101012) -- [属性](#zh-cn_topic_0000001058948923_section2907183951110) -- [事件](#zh-cn_topic_0000001058948923_section1298575017310) -- [样式](#zh-cn_topic_0000001058948923_section5775351116) - -作为<[text](/pages/000d010214#ZH-CN_TOPIC_0000001115974748)\>子组件提供文本修饰能力。 - -## 权限列表 - -无 - -## 子组件 - -支持子组件。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - -不支持。 - -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

-

-

-

设置文本段落的文本颜色

-

font-size

-

<length>

-

30px

-

-

设置文本段落的文本尺寸

-

allow-scale

-

boolean

-

true

-

-

设置文本段落的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

-
-

font-style

-

string

-

normal

-

-

设置文本段落的字体样式,见text组件font-style的样式属性

-

font-weight

-

number | string

-

normal

-

-

设置文本段落的字体粗细,见text组件font-weight的样式属性

-

text-decoration

-

string

-

none

-

-

设置文本段落的文本修饰,见text组件text-decoration样式属性

-

font-family

-

string

-

sans-serif

-

-

设置文本段落的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/20.switch.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/20.switch.md" deleted file mode 100644 index 6eb98b68a08711b5a99092d3b34d15434a8d37c1..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/20.switch.md" +++ /dev/null @@ -1,751 +0,0 @@ ---- -title: switch -permalink: /pages/000d010213 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# switch - -- [权限列表](#zh-cn_topic_0000001058460511_section11257113618419) -- [子组件](#zh-cn_topic_0000001058460511_section9288143101012) -- [属性](#zh-cn_topic_0000001058460511_section2907183951110) -- [事件](#zh-cn_topic_0000001058460511_section138898141137) -- [样式](#zh-cn_topic_0000001058460511_section5775351116) - -开关选择器,通过开关,开启或关闭某个功能。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

checked

-

boolean

-

false

-

-

是否选中。

-

showtext

-

boolean

-

false

-

-

是否显示文本。

-

texton

-

string

-

"On"

-

-

选中时显示的文本。

-

textoff

-

string

-

"Off"

-

-

未选中时显示的文本。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ checked: checkedValue }

-

选中状态改变时触发该事件。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

texton-color

-

<color>

-

#000000

-

-

选中时显示的文本颜色。

-

textoff-color

-

<color>

-

#000000

-

-

未选中时显示的文本颜色。

-

text-padding

-

number

-

0px

-

-

texton/textoff中最长文本两侧距离滑块边界的距离。

-

font-size

-

<length>

-

-

-

-

文本尺寸,仅设置texton和textoff生效。

-

allow-scale

-

boolean

-

true

-

-

文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

-
-

font-style

-

string

-

normal

-

-

字体样式,仅设置texton和textoff生效。见text组件font-style的样式属性

-

font-weight

-

number | string

-

normal

-

-

字体粗细,仅设置texton和textoff生效。见text组件的font-weight的样式属性

-

font-family

-

string

-

sans-serif

-

-

字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。仅设置texton和textoff生效。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/21.text.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/21.text.md" deleted file mode 100644 index a94ff901e07f826336d8f85b1b8c80eedbd0a92e..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/21.text.md" +++ /dev/null @@ -1,808 +0,0 @@ ---- -title: text -permalink: /pages/000d010214 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# text - -- [权限列表](#zh-cn_topic_0000001058830803_section11257113618419) -- [子组件](#zh-cn_topic_0000001058830803_section9288143101012) -- [属性](#zh-cn_topic_0000001058830803_section2907183951110) -- [事件](#zh-cn_topic_0000001058830803_section1476513233592) -- [样式](#zh-cn_topic_0000001058830803_section5775351116) - -文本,用于呈现一段信息。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->文本的展示内容需要写在元素标签内。 - -## 权限列表 - -无 - -## 子组件 - -支持<[span](/pages/000d010212#ZH-CN_TOPIC_0000001115814832)\>。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#e5000000

-

-

设置文本的颜色。

-

font-size

-

<length>

-

30px

-

-

设置文本的尺寸。

-

allow-scale

-

boolean

-

true

-

-

文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果需要支持动态生效,请参看config描述文件中config-changes标签。

-
-

letter-spacing

-

<length>

-

0px

-

-

设置文本的字符间距。

-

font-style

-

string

-

normal

-

-

设置文本的字体样式,可选值为:

-
  • normal:标准的字体样式;
  • italic:斜体的字体样式。
-

font-weight

-

number | string

-

normal

-

-

设置文本的字体粗细,number类型取值[100, 900],默认为400,取值越大,字体越粗。

-
说明:

number取值必须为100的整数倍。

-
-

string类型取值支持如下四个值:lighter、normal、bold、bolder。

-

text-decoration

-

string

-

none

-

-

设置文本的文本修饰,可选值为:

-
  • underline:文字下划线修饰;
  • line-through:穿过文本的修饰线n
  • none:标准文本。
-

text-align

-

string

-

start

-

-

设置文本的文本对齐方式,可选值为:

-
  • left:文本左对齐;
  • center:文本居中对齐;
  • right:文本右对齐;
  • start:根据文字书写相同的方向对齐;
  • end:根据文字书写相反的方向对齐。
-
说明:

如文本宽度未指定大小,文本的宽度和父容器的宽度大小相等的情况下,对齐效果可能会不明显。

-
-

line-height

-

<length>

-

0px

-

-

设置文本的文本行高,设置为0px时,不限制文本行高,自适应字体大小。

-

text-overflow

-

string

-

clip

-

-

在设置了最大行数的情况下生效,可选值为:

-
  • clip:将文本根据父容器大小进行裁剪显示;
  • ellipsis:根据父容器大小显示,显示不下的文本用省略号代替。需配合max-lines使用。
-

font-family

-

string

-

sans-serif

-

-

设置文本的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

max-lines

-

number

-

-

-

-

设置文本的最大行数。

-

min-font-size

-

<length>

-

-

-

-

文本最小字号,需要和文本最大字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

-

max-font-size

-

<length>

-

-

-

-

文本最大字号,需要和文本最小字号同时设置,支持文本字号动态变化。设置最大最小字体样式后,font-size不生效。

-

font-size-step

-

<length>

-

1px

-

-

文本动态调整字号时的步长,需要设置最小,最大字号样式生效。

-

prefer-font-sizes

-

<array>

-

-

-

-

预设的字号集合,在动态尺寸调整时,优先使用预设字号集合中的字号匹配设置的最大行数,如果预设字号集合未设置,则使用最大最小和步长调整字号。针对仍然无法满足最大行数要求的情况,使用text-overflow设置项进行截断,设置预设尺寸集后,font-size、max-font-size、min-font-size和font-size-step不生效。

-

如:prefer-font-sizes: 12px,14px,16px

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->- 字体动态缩放:预设尺寸集合和最小最大字号调节基于是否满足最大行数要求,预设尺寸集合会按照从左到右顺序查看是否满足最大行数要求,最小最大字号调节则基于从大到小顺序查看是否满足最大行数要求。 ->- 文本换行:文本可以通过转义字符\\r\\n进行换行。 ->- 文本标签内支持转义字符'\\'。 ->- 当使用子组件span组成文本段落时,如果span属性样式异常,将导致text段落无法显示。 ->- letter-spacing、text-align、line-height、text-overflow和max-lines样式作用于text及其子组件(span)组成的文本内容。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/22.toolbar.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/22.toolbar.md" deleted file mode 100644 index b013b89ae48f43f6d228b9e4f89b8dcc17a85377..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/22.toolbar.md" +++ /dev/null @@ -1,531 +0,0 @@ ---- -title: toolbar -permalink: /pages/000d010215 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# toolbar - -- [权限列表](#zh-cn_topic_0000001062209279_section11257113618419) -- [子组件](#zh-cn_topic_0000001062209279_section172027510456) -- [属性](#zh-cn_topic_0000001062209279_section153601034618) -- [样式](#zh-cn_topic_0000001062209279_section1889052254711) -- [事件](#zh-cn_topic_0000001062209279_section104349151916) -- [方法](#zh-cn_topic_0000001062209279_section568225514199) - -工具栏。放在界面底部,用于展示针对当前界面的操作选项。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->从API Version 5 开始支持。 - -## 权限列表 - -无 - -## 子组件 - -支持子组件。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->工具栏最多可以展示5个toolbar-item子组件,如果存在6个及以上toolbar-item子组件,则保留前面4个子组件,后续的子组件收纳到工具栏上的更多项中,通过点击更多项弹窗展示剩下的子组件,更多项展示的组件样式采用系统默认样式,toolbar-item上设置的自定义样式不生效。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

padding

-

<length>

-

0

-

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length>

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length>

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length>

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

number

-

-

-

-

规定当前组件如何适应父组件中的可用空间。它作为一个简写属性,用来设置组件的flex-grow。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->toolbar组件高度固定为56px。 - -## 事件 - -无 - -## 方法 - -无 - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/23.toolbar-item.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/23.toolbar-item.md" deleted file mode 100644 index 5008850aebdc5f3c92b2e843887200dfb5a030a3..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/23.toolbar-item.md" +++ /dev/null @@ -1,433 +0,0 @@ ---- -title: toolbar-item -permalink: /pages/000d010216 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# toolbar-item - -- [权限列表](#zh-cn_topic_0000001061931453_section11257113618419) -- [子组件](#zh-cn_topic_0000001061931453_section9288143101012) -- [属性](#zh-cn_topic_0000001061931453_section19217161499) -- [样式](#zh-cn_topic_0000001061931453_section184493015533) -- [事件](#zh-cn_topic_0000001061931453_section571865310552) -- [方法](#zh-cn_topic_0000001061931453_section568225514199) -- [示例](#zh-cn_topic_0000001061931453_section1240714821316) - -工具栏子组件。作为工具栏子组件,用于展示工具栏上的一个操作选项。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->从API Version 5 开始支持。 - -## 权限列表 - -无 - -## 子组件 - -无 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

value

-

string

-

-

-

-

该操作项文本内容。

-

icon

-

string

-

-

-

-

该操作项图标资源路径,该图标展示在选项文本上,支持本地路径,格式为png,jpg和svg。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#e6000000

-

-

文本颜色。

-

font-size

-

<length>

-

16px

-

-

文本大小。

-

allow-scale

-

boolean

-

true

-

-

文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-

font-style

-

string

-

normal

-

-

文本字体样式,可选值为:

-
  1. normal: 标准的字体样式;
  2. italic: 斜体的字体样式。
-

font-weight

-

number|string

-

normal

-

-

文本字体粗细,number类型取值[100, 900]的整数(被100整除),默认为400,取值越大,字体越粗。string类型取值为:lighter、normal、bold、bolder。

-

text-decoration

-

string

-

none

-

-

文本修饰,可选值为:

-
  1. underline: 文本下划线修饰;
  2. line-through: 穿过文本的修饰线;
  3. none: 标准文本。
-

font-family

-

string

-

sans-serif

-

-

字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 方法 - -无 - -## 示例 - -``` - - - - - - - - -``` - -![](/images/zh-cn/application-dev/js-reference/figures/000000.jpg) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/24.toggle.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/24.toggle.md" deleted file mode 100644 index 768e92eb4f78fffaa123504b58160ea26b8dc1f5..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/03.\345\237\272\347\241\200\347\273\204\344\273\266/24.toggle.md" +++ /dev/null @@ -1,648 +0,0 @@ ---- -title: toggle -permalink: /pages/000d010217 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# toggle - -- [权限列表](#zh-cn_topic_0000001061155984_section11257113618419) -- [子组件](#zh-cn_topic_0000001061155984_section9288143101012) -- [属性](#zh-cn_topic_0000001061155984_section2598341175212) -- [样式](#zh-cn_topic_0000001061155984_section3655917541) -- [事件](#zh-cn_topic_0000001061155984_section3892191911214) -- [示例](#zh-cn_topic_0000001061155984_section520313404174) - -状态按钮用于从一组选项中进行选择,并可能在界面上实时显示选择后的结果。通常这一组选项都是由状态按钮构成。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->从 API Version 5 开始支持。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

value

-

string

-

-

-

-

toggle组件的文本值。

-

checked

-

boolean

-

false

-

-

toggle组件是否被选中。

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

color

-

<color>

-

#ff007dff

-

-

按钮的文本颜色。

-

font-size

-

<length>

-

16px

-

-

按钮的文本尺寸。

-

allow-scale

-

boolean

-

true

-

-

按钮的文本尺寸是否跟随系统设置字体缩放尺寸进行放大缩小。

-
说明:

如果在config描述文件中针对ability配置了fontSize的config-changes标签,则应用不会重启而直接生效。

-
-

font-style

-

string

-

normal

-

-

按钮的字体样式。

-

font-weight

-

number | string

-

normal

-

-

按钮的字体粗细。见text组件font-weight的样式属性

-

font-family

-

<string>

-

sans-serif

-

-

按钮的字体列表,用逗号分隔,每个字体用字体名或者字体族名设置。列表中第一个系统中存在的或者通过自定义字体指定的字体,会被选中作为文本的字体。

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length>

-

0

-

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length>

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length>

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length>

-

0

-

-

设置起始和末端外边距属性。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

number

-

-

-

-

规定当前组件如何适应父组件中的可用空间。它作为一个简写属性,用来设置组件的flex-grow。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

change

-

{ checked:isChecked }

-

组件选中状态发生变化时触发。

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 示例 - -``` - -
- 1. Multiple choice example -
- {{$item}} -
- 2. Single choice example -
- -
-
-``` - -``` -/* xxx.css */ -.margin { - margin: 7px; -} -``` - -``` -// xxx.js -export default { - data: { - toggle_list: [ - { "id":"1001", "name":"Living room", "checked":true }, - { "id":"1002", "name":"Bedroom", "checked":false }, - { "id":"1003", "name":"Second bedroom", "checked":false }, - { "id":"1004", "name":"Kitchen", "checked":false }, - { "id":"1005", "name":"Study", "checked":false }, - { "id":"1006", "name":"Garden", "checked":false }, - { "id":"1007", "name":"Bathroom", "checked":false }, - { "id":"1008", "name":"Balcony", "checked":false }, - ], - toggles: ["Living room","Bedroom","Kitchen","Study"], - idx: "" - }, - allclick(arg) { - this.idx = arg - }, - allchange(e) { - if (e.checked === true) { - for (var i = 0; i < this.toggle_list.length; i++) { - if (this.toggle_list[i].id === this.idx) { - this.toggle_list[i].checked = true - } else { - this.toggle_list[i].checked = false - } - } - } - } -} -``` - -![](/images/zh-cn/application-dev/js-reference/figures/screenshot.png) - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/04.\345\252\222\344\275\223\347\273\204\344\273\266/01.Camera.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/04.\345\252\222\344\275\223\347\273\204\344\273\266/01.Camera.md" deleted file mode 100644 index 77afe3e7bfd766266632e6c3882e48d13d5b131f..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/04.\345\252\222\344\275\223\347\273\204\344\273\266/01.Camera.md" +++ /dev/null @@ -1,349 +0,0 @@ ---- -title: Camera -permalink: /pages/000d010300 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# Camera - -- [子组件](#zh-cn_topic_0000001062209279_section172027510456) -- [属性](#zh-cn_topic_0000001062209279_section153601034618) -- [样式](#zh-cn_topic_0000001062209279_section1889052254711) -- [事件](#zh-cn_topic_0000001062209279_section104349151916) -- [方法](#zh-cn_topic_0000001062209279_section568225514199) - -相机组件。一个页面仅支持一个camera组件。 - -## 子组件 - -> 不支持 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-
- - - -## 事件 - -通用 - -## 方法 - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

takePhoto

-

CameraTakePhotoOptions

-

执行拍照

-

startRecord

-

-

-

开始录像

-

closeRecord

-

CameraRecordOptions

-

结束录像

-
- -CameraTakePhotoOptions - - - - - - - - - - - - - - - - - - - - - - - - -
-

quality

-
-

string

-
-

图片质量(L3)

-
-

success

-
-

Function

-
-

接口调用成功,返回uri

-
-

fail

-
-

Function

-
-

接口调用失败

-
-

complete

-
-

Function

-
-

接口调用结束

-
- -CameraRecordOptions - - - - - - - - - - - - - - - - - - - -
-

success

-
-

Function

-
-

接口调用成功,返回uri

-
-

fail

-
-

Function

-
-

接口调用失败

-
-

complete

-
-

Function

-
-

接口调用结束

-
- -## 示例 - -``` -
-
- -
- src: {{src}} photoUri: {{photoUri}} -
- - -
-
- - -
-
-//.js -import router from '@system.router'; -export default { - data: { - photoUri: "", - val: "", - arr:[], - size: -1, - quality:'', - src:'', - heights: 600, - widths:600, - }, - onInit() { - }, - startRecord() { - this.$element('cameraId').startRecorder(); - }, - closeRecord() { - this.$element('cameraId').closeRecorder( - { - success: (res) => { - this.src = res.uri; - }, - fail: (res) => { - this.val = "fail " + res.errormsg + " " + res.errorcode; - }, - complete : (res) => { - this.val += " :complete"; - }, - } - ); - }, - takePhoto() { - this.$element('cameraId').takePhoto( - { - quality: -1, - success: (res) => { - this.photoUri = res.uri; - }, - fail: (res) => { - this.val = "fail " + res.errormsg + " " + res.errorcode; - }, - complete : (res) => { - this.val += " :complete"; - }, - } - ); - }, -``` - -} \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/01.canvas\347\273\204\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/01.canvas\347\273\204\344\273\266.md" deleted file mode 100644 index feb0039b0d91bd12e2d4e8f1e35becf0786d5a67..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/01.canvas\347\273\204\344\273\266.md" +++ /dev/null @@ -1,633 +0,0 @@ ---- -title: canvas组件 -permalink: /pages/000d010400 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# canvas组件 - -- [权限列表](#zh-cn_topic_0000001058670845_section11257113618419) -- [子组件](#zh-cn_topic_0000001058670845_section9288143101012) -- [属性](#zh-cn_topic_0000001058670845_section2907183951110) -- [事件](#zh-cn_topic_0000001058670845_section113421410102110) -- [样式](#zh-cn_topic_0000001058670845_section5775351116) -- [方法](#zh-cn_topic_0000001058670845_section47669296127) - -提供画布组件。用于自定义绘制图形。 - -## 权限列表 - -无 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 方法 - - - - - - - - - - - - -

名称

-

参数

-

描述

-

getContext

-

string

-

获取canvas绘图上下文,参数仅支持“2d”,返回值为2D绘制对象,该对象提供具体的2D绘制操作。详见CanvasRenderingContext2D对象章节。

-

不支持在onInit和onReady中进行调用。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/02.CanvasRenderingContext2D\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/02.CanvasRenderingContext2D\345\257\271\350\261\241.md" deleted file mode 100644 index f921edd061eb59bd133eed9f67f882ca88ad4a06..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/02.CanvasRenderingContext2D\345\257\271\350\261\241.md" +++ /dev/null @@ -1,2660 +0,0 @@ ---- -title: CanvasRenderingContext2D对象 -permalink: /pages/000d010401 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# CanvasRenderingContext2D对象 - -- [fillRect\(\)](#zh-cn_topic_0000001058830807_section16678142165920) -- [fillStyle](#zh-cn_topic_0000001058830807_section159395553313) -- [clearRect\(\)](#zh-cn_topic_0000001058830807_section205940367194) -- [strokeRect\(\)](#zh-cn_topic_0000001058830807_section18427819195711) -- [fillText\(\)](#zh-cn_topic_0000001058830807_section114524106587) -- [strokeText\(\)](#zh-cn_topic_0000001058830807_section4144191355810) -- [measureText\(\)](#zh-cn_topic_0000001058830807_section378313153588) -- [lineWidth](#zh-cn_topic_0000001058830807_section652391716583) -- [strokeStyle](#zh-cn_topic_0000001058830807_section1191517562337) -- [stroke\(\)](#zh-cn_topic_0000001058830807_section1071523411019) -- [beginPath\(\)](#zh-cn_topic_0000001058830807_section12670134392) -- [moveTo\(\)](#zh-cn_topic_0000001058830807_section16813157310) -- [lineTo\(\)](#zh-cn_topic_0000001058830807_section4767915838) -- [closePath\(\)](#zh-cn_topic_0000001058830807_section86825473917) -- [lineCap](#zh-cn_topic_0000001058830807_section6852133718410) -- [lineJoin](#zh-cn_topic_0000001058830807_section395812401442) -- [miterLimit](#zh-cn_topic_0000001058830807_section429711421945) -- [font](#zh-cn_topic_0000001058830807_section17597332121110) -- [textAlign](#zh-cn_topic_0000001058830807_section15681153321114) -- [textBaseline](#zh-cn_topic_0000001058830807_section77981136141111) -- [createPattern\(\)](#zh-cn_topic_0000001058830807_section1034582183919) -- [bezierCurveTo\(\)](#zh-cn_topic_0000001058830807_section450521614318) -- [quadraticCurveTo\(\)](#zh-cn_topic_0000001058830807_section12938183173) -- [arc\(\)](#zh-cn_topic_0000001058830807_section102329511716) -- [arcTo\(\)](#zh-cn_topic_0000001058830807_section3172156571) -- [rect\(\)](#zh-cn_topic_0000001058830807_section1351519304107) -- [fill\(\)](#zh-cn_topic_0000001058830807_section14842031151015) -- [clip\(\)](#zh-cn_topic_0000001058830807_section1355171921416) -- [rotate\(\)](#zh-cn_topic_0000001058830807_section7682182091419) -- [scale\(\)](#zh-cn_topic_0000001058830807_section157714218144) -- [transform\(\)](#zh-cn_topic_0000001058830807_section1675964717570) -- [setTransform\(\)](#zh-cn_topic_0000001058830807_section1439382216440) -- [translate\(\)](#zh-cn_topic_0000001058830807_section931011253449) -- [globalAlpha](#zh-cn_topic_0000001058830807_section188252174810) -- [drawImage\(\)](#zh-cn_topic_0000001058830807_section1953117410488) -- [restore\(\)](#zh-cn_topic_0000001058830807_section64027684817) -- [save\(\)](#zh-cn_topic_0000001058830807_section410672635214) -- [createLinearGradient\(\)6+](#zh-cn_topic_0000001058830807_section1696310905) -- [createImageData\(\)](#zh-cn_topic_0000001058830807_section2021142714524) -- [getImageData\(\)](#zh-cn_topic_0000001058830807_section92731528205217) -- [putImageData\(\)](#zh-cn_topic_0000001058830807_section15774154925515) -- [setLineDash\(\)](#zh-cn_topic_0000001058830807_section1934985155516) -- [getLineDash\(\)](#zh-cn_topic_0000001058830807_section522105285519) -- [lineDashOffset](#zh-cn_topic_0000001058830807_section8283548889) -- [globalCompositeOperation](#zh-cn_topic_0000001058830807_section123871750284) -- [shadowBlur](#zh-cn_topic_0000001058830807_section6207051888) -- [shadowColor](#zh-cn_topic_0000001058830807_section42724396120) -- [shadowOffsetX](#zh-cn_topic_0000001058830807_section1616174021219) -- [shadowOffsetY](#zh-cn_topic_0000001058830807_section272013417128) - -使用CanvasRenderingContext2D在canvas画布组件上进行绘制,绘制对象可以是矩形、文本、图片等。 - -- 示例 - - ``` - - - - ``` - - ``` - // xxx.js - export default { - handleClick() { - const el = this.$refs.canvas1; - const ctx = el.getContext('2d'); - ctx.beginPath(); - ctx.arc(100, 75, 50, 0, 6.28); - ctx.stroke(); - }, - } - ``` - - -- ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001089583647.png) - - -## fillRect\(\) - -填充一个矩形。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x

-

number

-

指定矩形左上角点的x坐标。

-

y

-

number

-

指定矩形左上角点的y坐标。

-

width

-

number

-

指定矩形的宽度。

-

height

-

number

-

指定矩形的高度。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059340532.png) - - ``` - ctx.fillRect(20, 20, 200, 150); - ``` - - -## fillStyle - -指定绘制的填充色。 - -- 参数 - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

color

-

<color>

-

设置填充区域的颜色。

-

gradient

-

CanvasGradient

-

渐变对象,使用 createLinearGradient()方法创建。

-

pattern

-

CanvasPattern

-

使用 createPattern()方法创建。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058562863.png) - - ``` - ctx.fillStyle = '#0000ff'; - ctx.fillRect(20, 20, 150, 100); - ``` - - -## clearRect\(\) - -删除指定区域内的绘制内容。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x

-

number

-

指定矩形上的左上角x坐标。

-

y

-

number

-

指定矩形上的左上角y坐标。

-

width

-

number

-

指定矩形的宽度。

-

height

-

number

-

指定矩形的高度。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059308558.png) - - ``` - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(0, 0, 400, 200); - ctx.clearRect(20, 20, 150, 100); - ``` - - -## strokeRect\(\) - -绘制具有边框的矩形,矩形内部不填充。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x

-

number

-

指定矩形的左上角x坐标。

-

y

-

number

-

指定矩形的左上角y坐标。

-

width

-

number

-

指定矩形的宽度。

-

height

-

number

-

指定矩形的高度。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058670865.png) - - ``` - ctx.strokeRect(30, 30, 200, 150); - ``` - - -## fillText\(\) - -绘制填充类文本。 - -- 参数 - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

text

-

string

-

需要绘制的文本内容。

-

x

-

number

-

需要绘制的文本的左下角x坐标。

-

y

-

number

-

需要绘制的文本的左下角y坐标。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058948947.png) - - ``` - ctx.font = '35px sans-serif'; - ctx.fillText("Hello World!", 20, 60); - ``` - - -## strokeText\(\) - -绘制描边类文本。 - -- 参数 - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

text

-

string

-

需要绘制的文本内容。

-

x

-

number

-

需要绘制的文本的左下角x坐标。

-

y

-

number

-

需要绘制的文本的左下角y坐标。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058340529.png) - - ``` - ctx.font = '25px sans-serif'; - ctx.strokeText("Hello World!", 20, 60); - ``` - - -## measureText\(\) - -该方法返回一个文本测算的对象,通过该对象可以获取指定文本的宽度值。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

text

-

string

-

需要进行测量的文本。

-
- -- 返回值 - - - - - - - - - - -

类型

-

说明

-

TextMetrics

-

包含指定字体的宽度,该宽度可以通过TextMetrics.width来获取。

-
- -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058988974.png) - - ``` - ctx.font = '25px sans-serif'; - var txt = 'Hello World'; - ctx.fillText("width:" + ctx.measureText(txt).width, 20, 60); - ctx.fillText(txt, 20, 110); - ``` - - -## lineWidth - -指定绘制线条的宽度值。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

lineWidth

-

number

-

设置绘制线条的宽度。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059308560.png) - - ``` - ctx.lineWidth = 5; - ctx.strokeRect(25, 25, 85, 105); - ``` - - -## strokeStyle - -设置描边的颜色。 - -- 参数 - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

color

-

<color>

-

指定描边使用的颜色

-

gradient

-

CanvasGradient

-

通过createLinearGradient()方法创建。

-

pattern

-

CanvasPattern

-

通过createPattern()方法创建。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058670867.png) - - ``` - ctx.lineWidth = 10; - ctx.strokeStyle = '#0000ff'; - ctx.strokeRect(25, 25, 155, 105); - ``` - - -## stroke\(\) - -进行边框绘制操作。 - -- 参数 - - 无 - -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058948949.png) - - ``` - ctx.moveTo(25, 25); - ctx.lineTo(25, 105); - ctx.strokeStyle = 'rgb(0,0,255)'; - ctx.stroke(); - ``` - - -## beginPath\(\) - -创建一个新的绘制路径。 - -- 参数 - - 无 - -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058340531.png) - - ``` - ctx.beginPath(); - ctx.lineWidth = '6'; - ctx.strokeStyle = '#0000ff'; - ctx.moveTo(15, 80); - ctx.lineTo(280, 160); - ctx.stroke(); - ``` - - -## moveTo\(\) - -路径从当前点移动到指定点。 - -- 参数 - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x

-

number

-

指定位置的x坐标。

-

y

-

number

-

指定位置的y坐标。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058988976.png) - - ``` - ctx.beginPath(); - ctx.moveTo(10, 10); - ctx.lineTo(280, 160); - ctx.stroke(); - ``` - - -## lineTo\(\) - -从当前点到指定点进行路径连接。 - -- 参数 - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x

-

number

-

指定位置的x坐标。

-

y

-

number

-

指定位置的y坐标。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059308562.png) - - ``` - ctx.beginPath(); - ctx.moveTo(10, 10); - ctx.lineTo(280, 160); - ctx.stroke(); - ``` - - -## closePath\(\) - -结束当前路径形成一个封闭路径。 - -- 参数 - - 无 - -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058830768.png) - - ``` - ctx.beginPath(); - ctx.moveTo(30, 30); - ctx.lineTo(110, 30); - ctx.lineTo(70, 90); - ctx.closePath(); - ctx.stroke(); - ``` - - -## lineCap - -指定线端点的样式。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

lineCap

-

string

-

线条的端点样式,可选值为:

-
  • butt(默认):线端点以方形结束;
  • round:线端点以圆形结束;
  • square:线端点以方形结束,该样式下会增加一个长度和线段厚度相同,宽度是线段厚度一半的矩形。
-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058830831.png) - - ``` - ctx.lineWidth = 8; - ctx.beginPath(); - ctx.lineCap = 'round'; - ctx.moveTo(30, 50); - ctx.lineTo(220, 50); - ctx.stroke(); - ``` - - -## lineJoin - -指定线段间相交的交点样式。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

lineJoin

-

string

-

线条的交点样式,可选值为:

-
  • round:在线段相连处绘制一个扇形,扇形的圆角半径是线段的宽度。
  • bevel:在线段相连处使用三角形为底填充, 每个部分矩形拐角独立。
  • miter(默认):在相连部分的外边缘处进行延伸,使其相交于一点,形成一个菱形区域,该属性可以通过设置miterLimit属性展现效果。
-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058340533.png) - - ``` - ctx.beginPath(); - ctx.lineWidth = 8; - ctx.lineJoin = 'miter'; - ctx.moveTo(30, 30); - ctx.lineTo(120, 60); - ctx.lineTo(30, 110); - ctx.stroke(); - ``` - - -## miterLimit - -设置斜接面限制值,该值指定了线条相交处内角和外角的距离。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

miterLimit

-

number

-

斜接面限制值,该属性默认值为10。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058562869.png) - - ``` - ctx.lineWidth = 8; - ctx.lineJoin = 'miter'; - ctx.miterLimit = 3; - ctx.moveTo(30, 30); - ctx.lineTo(60, 35); - ctx.lineTo(30, 37); - ctx.stroke(); - ``` - - -## font - -设置文本绘制中的字体样式。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

value

-

string

-

字体样式支持:sans-serif, serif, monospace,该属性默认值为14px sans-serif

-

语法:ctx.font="font-style font-weight font-size font-family"5+

-

默认值:"normal normal 14px sans-serif"

-
  • font-style(可选),用于指定字体样式,支持如下几种样式:normal, italic
  • font-weight(可选),用于指定字体的粗细,支持如下几种类型:normal, bold, bolder, lighter, 100, 200, 300, 400, 500, 600, 700, 800, 900
  • font-size(可选),指定字号和行高,单位只支持px,默认值14px。
  • font-family(可选),指定字体系列,支持如下几种类型:sans-serif, serif, monospace
-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059308564.png) - - ``` - ctx.font = '30px sans-serif'; - ctx.fillText("Hello World", 20, 60); - ``` - - -## textAlign - -设置文本绘制中的文本对齐方式。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

align

-

string

-

可选值为:

-
  • left(默认):文本左对齐;
  • right:文本右对齐;
  • center:文本居中对齐;
  • start:文本对齐界线开始的地方;
  • end:文本对齐接线结束的地方。
-
说明:

ltr布局模式下start和left一致,rtl布局模式下start和right一致·。

-
-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058830770.png) - - ``` - ctx.strokeStyle = '#0000ff'; - ctx.moveTo(140, 10); - ctx.lineTo(140, 160); - ctx.stroke(); - - ctx.font = '18px sans-serif'; - - // Show the different textAlign values - ctx.textAlign = 'start'; - ctx.fillText('textAlign=start', 140, 60); - ctx.textAlign = 'end'; - ctx.fillText('textAlign=end', 140, 80); - ctx.textAlign = 'left'; - ctx.fillText('textAlign=left', 140, 100); - ctx.textAlign = 'center'; - ctx.fillText('textAlign=center',140, 120); - ctx.textAlign = 'right'; - ctx.fillText('textAlign=right',140, 140); - ``` - - -## textBaseline - -设置文本绘制中的水平对齐方式。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

textBaseline

-

string

-

可选值为:

-
  • alphabetic(默认):文本基线是标准的字母基线;
  • top:文本基线在文本块的顶部;
  • hanging:文本基线是悬挂基线;
  • middle:文本基线在文本块的中间;
  • ideographic:文字基线是表意字基线;如果字符本身超出了alphabetic 基线,那么ideograhpic基线位置在字符本身的底部;
  • bottom:文本基线在文本块的底部。 与 ideographic 基线的区别在于 ideographic 基线不需要考虑下行字母。
-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058460539.png) - - ``` - ctx.strokeStyle = '#0000ff'; - ctx.moveTo(0, 120); - ctx.lineTo(400, 120); - ctx.stroke(); - - ctx.font = '20px sans-serif'; - - ctx.textBaseline = 'top'; - ctx.fillText('Top', 10, 120); - ctx.textBaseline = 'bottom'; - ctx.fillText('Bottom', 55, 120); - ctx.textBaseline = 'middle'; - ctx.fillText('Middle', 125, 120); - ctx.textBaseline = 'alphabetic'; - ctx.fillText('Alphabetic', 195, 120); - ctx.textBaseline = 'hanging'; - ctx.fillText('Hanging', 295, 120); - ``` - - -## createPattern\(\) - -通过指定图像和重复方式创建图片填充的模板。 - -- 参数 - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

image

-

Image

-

图源对象,具体参考Image对象

-

repetition

-

string

-

设置图像重复的方式,取值为:'repeat'、'repeat-x'、 'repeat-y'、'no-repeat'。

-
- -- 返回值 - - - - - - - - - - -

类型

-

说明

-

Object

-

指定图像填充的Pattern对象。

-
- -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059148582.png) - - ``` - var pat = ctx.createPattern(img, 'repeat'); - ctx.fillStyle = pat; - ctx.fillRect(0, 0, 20, 20); - ``` - - -## bezierCurveTo\(\) - -创建三次贝赛尔曲线的路径。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

cp1x

-

number

-

第一个贝塞尔参数的x坐标值。

-

cp1y

-

number

-

第一个贝塞尔参数的y坐标值。

-

cp2x

-

number

-

第二个贝塞尔参数的x坐标值。

-

cp2y

-

number

-

第二个贝塞尔参数的y坐标值。

-

x

-

number

-

路径结束时的x坐标值。

-

y

-

number

-

路径结束时的y坐标值。

-
- -- 返回值 - - 无 - -- 示例 - - ``` - ctx.beginPath(); - ctx.moveTo(10, 10); - ctx.bezierCurveTo(20, 100, 200, 100, 200, 20); - ctx.stroke(); - ``` - - -## quadraticCurveTo\(\) - -创建二次贝赛尔曲线的路径。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

cpx

-

number

-

贝塞尔参数的x坐标值。

-

cpy

-

number

-

贝塞尔参数的y坐标值。

-

x

-

number

-

路径结束时的x坐标值。

-

y

-

number

-

路径结束时的y坐标值。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059308566.png) - - ``` - ctx.beginPath(); - ctx.moveTo(20, 20); - ctx.quadraticCurveTo(100, 100, 200, 20); - ctx.stroke(); - ``` - - -## arc\(\) - -绘制弧线路径。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x

-

number

-

弧线圆心的x坐标值。

-

y

-

number

-

弧线圆心的y坐标值。

-

radius

-

number

-

弧线的圆半径。

-

startAngle

-

number

-

弧线的起始弧度。

-

endAngle

-

number

-

弧线的终止弧度。

-

anticlockwise

-

boolean

-

是否逆时针绘制圆弧。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058830772.png) - - ``` - ctx.beginPath(); - ctx.arc(100, 75, 50, 0, 6.28); - ctx.stroke(); - ``` - - -## arcTo\(\) - -依据圆弧经过的点和圆弧半径创建圆弧路径。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x1

-

number

-

圆弧经过的第一个点的x坐标值。

-

y1

-

number

-

圆弧经过的第一个点的y坐标值。

-

x2

-

number

-

圆弧经过的第二个点的x坐标值。

-

y2

-

number

-

圆弧经过的第二个点的y坐标值。

-

radius

-

number

-

圆弧的圆半径值。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058830835.png) - - ``` - ctx.moveTo(100, 20); - ctx.arcTo(150, 20, 150, 70, 50); // Create an arc - ctx.stroke(); - ``` - - -## rect\(\) - -创建矩形路径。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x

-

number

-

指定矩形的左上角x坐标值。

-

y

-

number

-

指定矩形的左上角y坐标值。

-

width

-

number

-

指定矩形的宽度。

-

height

-

number

-

指定矩形的高度。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058340537.png) - - ``` - ctx.rect(20, 20, 100, 100); // Create a 100*100 rectangle at (20, 20) - ctx.stroke(); // Draw it - ``` - - -## fill\(\) - -对封闭路径进行填充。 - -- 参数 - - 无 - -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058988982.png) - - ``` - ctx.rect(20, 20, 100, 100); // Create a 100*100 rectangle at (20, 20) - ctx.fill(); // Draw it in default setting - ``` - - -## clip\(\) - -设置当前路径为剪切路径。 - -- 参数 - - 无 - -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059308568.png) - - ``` - ctx.rect(0, 0, 200, 200); - ctx.stroke(); - ctx.clip(); - // Draw red rectangle after clip - ctx.fillStyle = "rgb(255,0,0)"; - ctx.fillRect(0, 0, 150, 150); - ``` - - -## rotate\(\) - -针对当前坐标轴进行顺时针旋转。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

rotate

-

number

-

设置顺时针旋转的弧度值,可以通过Math.PI / 180将角度转换为弧度值。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058830774.png) - - ``` - ctx.rotate(45 * Math.PI / 180); // Rotate the rectangle 45 degrees - ctx.fillRect(70, 20, 50, 50); - ``` - - -## scale\(\) - -设置canvas画布的缩放变换属性,后续的绘制操作将按照缩放比例进行缩放。 - -- 参数 - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x

-

number

-

设置水平方向的缩放值。。

-

y

-

number

-

设置垂直方向的缩放值。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058830837.png) - - ``` - ctx.strokeRect(10, 10, 25, 25); - ctx.scale(2, 2);// Scale to 200% - ctx.strokeRect(10, 10, 25, 25); - ``` - - -## transform\(\) - -transform\(\)方法对应一个变换矩阵,想对一个图形进行变化的时候,只要设置此变换矩阵相应的参数,对图形的各个定点的坐标分别乘以这个矩阵,就能得到新的定点的坐标。矩阵变换效果可叠加。 - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->变换后的坐标计算方式(x和y为变换前坐标,x'和y'为变换后坐标): ->- x' = scaleX \* x + skewY \* y + translateX ->- y' = skewX \* x + scaleY \* y + translateY - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

scaleX

-

number

-

指定水平缩放值。

-

skewX

-

number

-

指定水平倾斜值。

-

skewY

-

number

-

指定垂直倾斜值。

-

scaleY

-

number

-

指定垂直缩放值。

-

translateX

-

number

-

指定水平移动值。

-

translateY

-

number

-

指定垂直移动值。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058460543.png) - - ``` - ctx.fillStyle = 'rgb(0,0,0)'; - ctx.fillRect(0, 0, 100, 100) - ctx.transform(1, 0.5, -0.5, 1, 10, 10); - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(0, 0, 100, 100); - ctx.transform(1, 0.5, -0.5, 1, 10, 10); - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(0, 0, 100, 100); - ``` - - -## setTransform\(\) - -setTransfrom\(\)方法使用的参数和transform\(\)方法相同,但setTransform\(\)方法会重置现有的变换矩阵并创建新的变换矩阵。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

scaleX

-

number

-

指定水平缩放值。

-

skewX

-

number

-

指定水平倾斜值。

-

skewY

-

number

-

指定垂直倾斜值。

-

scaleY

-

number

-

指定垂直缩放值。

-

translateX

-

number

-

指定水平移动值。

-

translateY

-

number

-

指定垂直移动值。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059340544.png) - - ``` - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(0, 0, 100, 100) - ctx.setTransform(1,0.5, -0.5, 1, 10, 10); - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(0, 0, 100, 100); - ``` - - -## translate\(\) - -移动当前坐标系的原点。 - -- 参数 - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x

-

number

-

设置水平平移量。

-

y

-

number

-

设置竖直平移量。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058988984.png) - - ``` - ctx.fillRect(10, 10, 50, 50); - ctx.translate(70, 70); - ctx.fillRect(10, 10, 50, 50); - ``` - - -## globalAlpha - -设置透明度。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

value

-

number

-

0.0为完全透明,1.0为完全不透明。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059148586.png) - - ``` - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(0, 0, 50, 50); - ctx.globalAlpha = 0.4; - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(50, 50, 50, 50); - ``` - - -## drawImage\(\) - -进行图像绘制。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

image

-

Image

-

图片资源,请参考Image对象

-

sx

-

number

-

裁切源图像时距离源图像左上角的x坐标值。

-

sy

-

number

-

裁切源图像时距离源图像左上角的y坐标值。

-

sWidth

-

number

-

裁切源图像时需要裁切的宽度。

-

sHeight

-

number

-

裁切源图像时需要裁切的高度。

-

dx

-

number

-

绘制区域左上角在x轴的位置。

-

dy

-

number

-

绘制区域左上角在y 轴的位置。

-

dWidth

-

number

-

绘制区域的宽度。

-

dHeight

-

number

-

绘制区域的高度。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058830776.png) - - ``` - var test = this.$element('drawImage'); - var ctx = test.getContext('2d'); - var img = new Image(); - img.src = 'common/image/test.jpg'; - ctx.drawImage(img, 50, 80, 80, 80); - ``` - - -## restore\(\) - -对保存的绘图上下文进行恢复。 - -- 参数 - - 无 - -- 返回值 - - 无 - -- 示例 - - ``` - ctx.restore(); - ``` - - -## save\(\) - -对当前的绘图上下文进行保存。 - -- 参数 - - 无 - -- 返回值 - - 无 - -- 示例 - - ``` - ctx.save(); - ``` - - -## createLinearGradient\(\)6+ - -创建一个线性渐变色,返回CanvasGradient对象,请参考[CanvasGradient对象](/pages/000d010403#ZH-CN_TOPIC_0000001162494623)。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

x0

-

number

-

起点的x轴坐标。

-

y0

-

number

-

起点的y轴坐标。

-

x1

-

number

-

终点的x轴坐标。

-

y1

-

number

-

终点的y轴坐标。

-
- -- 返回值 - - - - - - - - - - -

类型

-

说明

-

Object

-

返回创建的CanvasGradient对象。

-
- -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001144077163.png) - - ``` - - - - ``` - - ``` - // xxx.js - export default { - handleClick() { - const el = this.$refs.canvas; - const ctx = el.getContext('2d'); - // Linear gradient: start(50,0) end(300,100) - var gradient = ctx.createLinearGradient(50,0, 300,100); - // Add three color stops - gradient.addColorStop(0.0, 'red'); - gradient.addColorStop(0.5, 'white'); - gradient.addColorStop(1.0, 'green'); - // Set the fill style and draw a rectangle - ctx.fillStyle = gradient; - ctx.fillRect(0, 0, 500, 500); - } - } - ``` - - -## createImageData\(\) - -创建新的ImageData 对象,请参考[ImageData对象](/pages/000d010404#ZH-CN_TOPIC_0000001115814838)。 - -- 参数 - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

width

-

number

-

ImageData的宽度。

-

height

-

number

-

ImageData的高度。

-

imagedata

-

Object

-

复制现有的ImageData对象。

-
- -- 返回值 - - - - - - - - - - -

类型

-

说明

-

Object

-

返回创建的ImageData对象。

-
- -- 示例 - - ``` - imageData = ctx.createImageData(50, 100); // Create ImageData with 50px width and 100px height - newImageData = ctx.createImageData(imageData); // Create ImageData using the input imageData - ``` - - -## getImageData\(\) - -以当前canvas指定区域内的像素创建ImageData对象。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

sx

-

number

-

需要输出的区域的左上角x坐标。

-

sy

-

number

-

需要输出的区域的左上角y坐标。

-

sw

-

number

-

需要输出的区域的宽度。

-

sh

-

number

-

需要输出的区域的高度。

-
- -- 返回值 - - - - - - - - - - -

类型

-

说明

-

Object

-

返回包含指定区域像素的ImageData对象。

-
- -- 示例 - - ``` - var test = this.$element('getImageData'); - var ctx = test.getContext('2d'); - var imageData = ctx.getImageData(0, 0, 280, 300); - ``` - - -## putImageData\(\) - -使用ImageData数据填充新的矩形区域。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

imagedata

-

Object

-

包含像素值的ImageData对象。

-

dx

-

number

-

填充区域在x轴方向的偏移量。

-

dy

-

number

-

填充区域在y轴方向的偏移量。

-

dirtyX

-

number

-

源图像数据矩形裁切范围左上角距离源图像左上角的x轴偏移量。

-

dirtyY

-

number

-

源图像数据矩形裁切范围左上角距离源图像左上角的y轴偏移量。

-

dirtyWidth

-

number

-

源图像数据矩形裁切范围的宽度。

-

dirtyHeight

-

number

-

源图像数据矩形裁切范围的高度。

-
- -- 返回值 - - 无 - -- 示例 - - ``` - var test = this.$element('putImageData'); - var ctx = test.getContext('2d'); - var imgData = ctx.createImageData(100, 100); - for (var i = 0; i < imgData.data.length; i += 4) { - imgData.data[i + 0] = 255; - imgData.data[i + 1] = 0; - imgData.data[i + 2] = 0; - imgData.data[i + 3] = 255; - } - ctx.putImageData(imgData, 10, 10); - ``` - - -## setLineDash\(\) - -设置画布的虚线样式。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

segments

-

Array

-

作为数组用来描述线段如何交替和间距长度。

-
- -- 返回值 - - 无 - -- 示例 - - ``` - ctx.setLineDash([10,20]); - ``` - - -## getLineDash\(\) - -获得当前画布的虚线样式。 - -- 参数 - - 无 - -- 返回值 - - - - - - - - - - -

类型

-

说明

-

Array

-

返回数组,该数组用来描述线段如何交替和间距长度。。

-
- -- 示例 - - ``` - var info = ctx.getLineDash(); - ``` - - -## lineDashOffset - -设置画布的虚线偏移量。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

value

-

number

-

精度为float,默认为0.0。

-
- -- 返回值 - - 无 - -- 示例 - - ``` - ctx.lineDashOffset = 1.0; - ``` - - -## globalCompositeOperation - -设置合成操作的方式。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

type

-

string

-

合成操作的类型字段。可选值有source-over(默认值),source-atop,source-in,source-out,destination-over,destination-atop,destination-in,destination-out,lighter,copy,xor。

-
- - 属性值: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-

描述

-

source-over

-

在现有绘制内容上显示新绘制内容,属于默认值。

-

source-atop

-

在现有绘制内容顶部显示新绘制内容。

-

source-in

-

在现有绘制内容中显示新绘制内容。

-

source-out

-

在现有绘制内容之外显示新绘制内容。

-

destination-over

-

在新绘制内容上方显示现有绘制内容。

-

destination-atop

-

在新绘制内容顶部显示现有绘制内容。

-

destination-in

-

在新绘制内容中显示现有绘制内容。

-

destination-out

-

在新绘制内容外显示现有绘制内容。

-

lighter

-

显示新绘制内容和现有绘制内容。

-

copy

-

显示新绘制内容而忽略现有绘制内容。

-

xor

-

使用异或操作对新绘制内容与现有绘制内容进行融合。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058948959.png) - - ``` - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(20, 20, 50, 50); - ctx.globalCompositeOperation = 'source-over'; - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(50, 50, 50, 50); - // Start drawing second example - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(120, 20, 50, 50); - ctx.globalCompositeOperation = 'destination-over'; - ctx.fillStyle = 'rgb(0,0,255)'; - ctx.fillRect(150, 50, 50, 50); - ``` - - 示例中,新绘制内容是蓝色矩形,现有绘制内容是红色矩形。 - - -## shadowBlur - -设置绘制阴影时的模糊级别,默认值为0。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

blur

-

number

-

设置模糊效果的程度值,值越大越模糊,精度为float 。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059340546.png) - - ``` - ctx.shadowBlur = 30; - ctx.shadowColor = 'rgb(0,0,0)'; - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(20, 20, 100, 80); - ``` - - -## shadowColor - -设置绘制阴影时的阴影颜色。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

color

-

<color>

-

阴影的颜色值。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001059148588.png) - - ``` - ctx.shadowBlur = 30; - ctx.shadowColor = 'rgb(0,0,255)'; - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(30, 30, 100, 100); - ``` - - -## shadowOffsetX - -设置绘制阴影时和原有对象的水平偏移值。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

offsetX

-

number

-

阴影距离原有对象的x轴方向偏移值。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058670782.png) - - ``` - ctx.shadowBlur = 10; - ctx.shadowOffsetX = 20; - ctx.shadowColor = 'rgb(0,0,0)'; - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(20, 20, 100, 80); - ``` - - -## shadowOffsetY - -设置绘制阴影时和原有对象的垂直偏移值。 - -- 参数 - - - - - - - - - - - - -

参数

-

类型

-

描述

-

offsetY

-

number

-

阴影距离原有对象的y轴方向偏移值。

-
- -- 返回值 - - 无 - -- 示例 - - ![](/images/zh-cn/application-dev/js-reference/figures/zh-cn_image_0000001058670879.png) - - ``` - ctx.shadowBlur = 10; - ctx.shadowOffsetY = 20; - ctx.shadowColor = 'rgb(0,0,0)'; - ctx.fillStyle = 'rgb(255,0,0)'; - ctx.fillRect(30, 30, 100, 100); - ``` - - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/03.Image\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/03.Image\345\257\271\350\261\241.md" deleted file mode 100644 index 5ddc5eaa8e4a3c24408c6595699445910618552a..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/03.Image\345\257\271\350\261\241.md" +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Image对象 -permalink: /pages/000d010402 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# Image对象 - -- [属性](#zh-cn_topic_0000001058948927_section1968021961113) -- [示例](#zh-cn_topic_0000001058948927_section13457717134912) - -图片对象。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

默认值

-

必填

-

描述

-

src

-

string

-

-

-

-

图片资源的路径。。

-

width

-

<length>

-

0px

-

-

图片的宽度。

-

height

-

<length>

-

0px

-

-

图片的高度。

-

onload

-

Function

-

-

-

-

图片加载成功后触发该事件,无参数。

-

onerror

-

Function

-

-

-

-

图片加载失败后触发该事件,无参数。

-
- -## 示例 - -``` -var ctx = this.$element('drawImage').getContext('2d'); -var img = new Image(); -img.src = 'common/image/huawei.jpg'; -img.onload = function() { - console.log('Image load success'); - ctx.drawImage(img, 200, 200); -}; -img.onerror = function() { - console.log('Image load fail'); -}; -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/04.CanvasGradient\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/04.CanvasGradient\345\257\271\350\261\241.md" deleted file mode 100644 index 8b9a6933ad5323b9e8b8ce60cff46c6f7eb7d154..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/04.CanvasGradient\345\257\271\350\261\241.md" +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: CanvasGradient对象 -permalink: /pages/000d010403 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# CanvasGradient对象 - -- [addColorStop\(\)](#zh-cn_topic_0000001058460513_section12691015917) - -渐变对象。 - -## addColorStop\(\) - -设置渐变断点值,包括偏移和颜色。 - -- 参数 - - - - - - - - - - - - - - - - -

参数

-

类型

-

描述

-

offset

-

number

-

设置渐变点距离起点的位置占总体长度的比例,范围为0到1。

-

color

-

string

-

设置渐变的颜色。

-
- -- 返回值 - - 无 - -- 示例 - - ``` - const gradient = ctx.createLinearGradient(0,0,100,0); - gradient.addColorStop(0,'#00ffff'); - gradient.addColorStop(1,'#ffff00'); - ``` - - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/05.ImageData\345\257\271\350\261\241.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/05.ImageData\345\257\271\350\261\241.md" deleted file mode 100644 index 12e46fb1830fb66f0fbae770eba7a3f755ddab46..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/05.\347\224\273\345\270\203\347\273\204\344\273\266/05.ImageData\345\257\271\350\261\241.md" +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: ImageData对象 -permalink: /pages/000d010404 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# ImageData对象 - -- [属性](#zh-cn_topic_0000001058340509_section661391987) - -ImageData对象可以存储canvas渲染的像素数据。 - -## 属性 - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

描述

-

width

-

number

-

矩形区域实际像素宽度。

-

height

-

number

-

矩形区域实际像素高度。

-

data

-

<Uint8ClampedArray>

-

一维数组,保存了相应的颜色数据,数据值范围为0到255。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/02.grid-container.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/02.grid-container.md" deleted file mode 100644 index 7274770442cb2e55914894fedd32431c1ff7604b..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/02.grid-container.md" +++ /dev/null @@ -1,693 +0,0 @@ ---- -title: grid-container -permalink: /pages/000d010501 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# grid-container - -- [权限列表](#zh-cn_topic_0000001062133103_section11257113618419) -- [子组件](#zh-cn_topic_0000001062133103_section9288143101012) -- [属性](#zh-cn_topic_0000001062133103_section5248929161316) -- [样式](#zh-cn_topic_0000001062133103_section16690243163414) -- [事件](#zh-cn_topic_0000001062133103_section291933813509) -- [方法](#zh-cn_topic_0000001062133103_section13156101584913) - -栅格布局容器根节点,使用grid-row与gird-col进行栅格布局。 - -## 权限列表 - -无 - -## 子组件 - -仅支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

columns

-

string | number

-

auto

-

-

设置当前布局总列数,使用string类型时仅支持auto,配置为auto时按照当前的sizetype决定总列数:

-
  • xs:2列
  • sm:4列
  • md:8列
  • lg:12列
-

sizetype

-

string

-

auto

-

-

设置当前栅格使用的响应尺寸类型,支持xs, sm, md, lg类型,使用auto时按照当前容器大小自动选择xs, sm, md, lg类型。

-

gutter

-

<length>

-

24px

-

-

设置Gutter宽度

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

justify-content

-

string

-

flex-start

-

-

flex容器当前行的主轴对齐格式。可选项有:

-
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
-

align-items

-

string

-

stretch

-

-

flex容器当前行的交叉轴对齐格式,可选值为:

-
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
-

align-content

-

string

-

flex-start

-

-

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

-
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length>

-

0

-

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

margin

-

<length>

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length>

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length>

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

number

-

-

-

-

规定当前组件如何适应父组件中的可用空间。它作为一个简写属性,用来设置组件的flex-grow。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 方法 - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

getColumns

-

-

-

返回栅格容器列数

-

getColumnWidth

-

-

-

返回栅格容器column宽度

-

getGutterWidth

-

-

-

返回栅格容器gutter宽度

-

getSizeType

-

-

-

返回当前容器响应尺寸类型(xs|sm|md|lg)

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/03.grid-row.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/03.grid-row.md" deleted file mode 100644 index f4180c763e0d11ed5e92474d3a9e98e351e712d7..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/03.grid-row.md" +++ /dev/null @@ -1,483 +0,0 @@ ---- -title: grid-row -permalink: /pages/000d010502 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# grid-row - -- [权限列表](#zh-cn_topic_0000001062811276_section11257113618419) -- [子组件](#zh-cn_topic_0000001062811276_section9288143101012) -- [属性](#zh-cn_topic_0000001062811276_section631751545214) -- [样式](#zh-cn_topic_0000001062811276_section9475356165220) -- [事件](#zh-cn_topic_0000001062811276_section1417950207) - -grid-row是栅格布局容器grid-container的子容器组件,使用flex横向布局,排列每个grid-col容器,justify-content与align-items默认为flex-start,支持折行显示。 - -## 权限列表 - -无 - -## 子组件 - -仅支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

flex-wrap

-

string

-

nowrap

-

-

flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:

-
  • nowrap:不换行,单行显示。
  • wrap:换行,多行显示。
-

justify-content

-

string

-

flex-start

-

-

flex容器当前行的主轴对齐格式。可选项有:

-
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
-

align-items

-

string

-

flex-start

-

-

flex容器当前行的交叉轴对齐格式,可选值为:

-
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
-

align-content

-

string

-

flex-start

-

-

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

-
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,如果要设置color和width,需要将四个方向一起设置(border-width、border-color)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/04.grid-col.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/04.grid-col.md" deleted file mode 100644 index aaa48bebf449b8e3fe5124a08c1ff6ae27274305..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/02.\347\273\204\344\273\266/06.\346\240\205\346\240\274\347\273\204\344\273\266/04.grid-col.md" +++ /dev/null @@ -1,705 +0,0 @@ ---- -title: grid-col -permalink: /pages/000d010503 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:46 ---- -# grid-col - -- [权限列表](#zh-cn_topic_0000001063130862_section11257113618419) -- [子组件](#zh-cn_topic_0000001063130862_section9288143101012) -- [属性](#zh-cn_topic_0000001063130862_section1976213199113) -- [样式](#zh-cn_topic_0000001063130862_section1948816404128) -- [事件](#zh-cn_topic_0000001063130862_section94351031102113) -- [示例](#zh-cn_topic_0000001063130862_section2021865273710) - -grid-col是栅格布局容器grid-row的子容器组件。 - -## 权限列表 - -无 - -## 子组件 - -支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

xs

-

number|object

-

-

-

-

在分辨率为xs模式下,设置该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

-

sm

-

number|object

-

-

-

-

在分辨率为sm模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

-

md

-

number|object

-

-

-

-

在分辨率为md模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

-

lg

-

number|object

-

-

-

-

在分辨率为lg模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如{"span": 1, "offset": 0}

-

span

-

number

-

1

-

-

在未设置明确断点时,默认占用列数

-

offset

-

number

-

0

-

-

未设置具体分辨率模式下偏移时,当前元素延容器布局方向,默认偏移的列数

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-
- -## 样式 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

flex-direction

-

string

-

row

-

-

flex容器主轴方向。可选项有:

-
  • column:垂直方向从上到下
  • row:水平方向从左到右
-

flex-wrap

-

string

-

nowrap

-

-

flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:

-
  • nowrap:不换行,单行显示。
  • wrap:换行,多行显示。
-

justify-content

-

string

-

flex-start

-

-

flex容器当前行的主轴对齐格式。可选项有:

-
  • flex-start:项目位于容器的开头。
  • flex-end:项目位于容器的结尾。
  • center:项目位于容器的中心。
  • space-between:项目位于各行之间留有空白的容器内。
  • space-around:项目位于各行之前、之间、之后都留有空白的容器内。
-

align-items

-

string

-

stretch

-

-

flex容器当前行的交叉轴对齐格式,可选值为:

-
  • stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。
  • flex-start:元素向交叉轴起点对齐。
  • flex-end:元素向交叉轴终点对齐。
  • center:元素在交叉轴居中。
-

align-content

-

string

-

flex-start

-

-

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

-
  • flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
  • flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
  • center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。
  • space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。
  • space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。
-

display

-

string

-

flex

-

-

确定该元素视图框的类型,该值暂不支持动态修改。可选值为:

-
  • flex:弹性布局
  • grid:网格布局
  • none:不渲染此元素
-

grid-template-[columns|rows]

-

string

-

1行1列

-

-

用于设置当前网格布局行和列的数量,不设置时默认1行1列,仅当display为grid时生效。

-

示例:如设置grid-template-columns为:

-

(1) 50px 100px 60px:分三列,第一列50px,第二列100px,第三列60px;

-

(2) 1fr 1fr 2fr:分三列,将父组件允许的宽分为4等份,第一列占1份,第二列占一份,第三列占2份;

-

(3) 30% 20% 50%:分三列,将父组件允许的宽为基准,第一列占30%,第二列占20%,第三列占50%;

-

(4) repeat(2,100px):分两列,第一列100px,第二列100px;

-

(5) auto 1fr 1fr:分三列,第一列自适应内部子组件所需宽度,剩余空间分为两等份,第二列占一份,第三列占一份。

-

grid-[columns|rows]-gap

-

<length>

-

0

-

-

用于设置行与行的间距或者列与列的间距,也可以支持通过grid-gap设置相同的行列间距,仅当display为grid时生效。

-

grid-row-[start|end]

-

number

-

-

-

-

用于设置当前元素在网格布局中的起止行号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

-

grid-column-[start|end]

-

number

-

-

-

-

用于设置当前元素在网格布局中的起止列号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -## 示例 - -``` - -
- - - -
- 內容元素 -
-
- -
- 內容元素 -
-
-
-
-
-``` - -``` -/* index.css */ -.container { - flex-direction: column; - padding-top: 80px; -} -``` - -``` -// index.js -import prompt from '@system.prompt'; -export default { - getCol(e) { - this.$element('mygrid').getColumns(function (result) { - prompt.showToast({ - message: e.target.id + ' result = ' + result, - duration: 3000, - }); - }) - }, - getColWidth(e) { - this.$element('mygrid').getColumnWidth(function (result) { - prompt.showToast({ - message: e.target.id + ' result = ' + result, - duration: 3000, - }); - }) - } -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/01.\345\237\272\346\234\254\347\224\250\346\263\225.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/01.\345\237\272\346\234\254\347\224\250\346\263\225.md" deleted file mode 100644 index ad902c0a163bb5537c84dcf5c6d97a99c35a621f..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/03.\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/01.\345\237\272\346\234\254\347\224\250\346\263\225.md" +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: 基本用法 -permalink: /pages/000d0200 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 基本用法 - -- [对象](#zh-cn_topic_0000001058988954_section7681164881014) - -自定义组件是用户根据业务需求,将已有的组件组合,封装成的新组件,可以在工程中多次调用,提高代码的可读性。自定义组件通过element引入到宿主页面,使用方法: - -``` - -
- -
-``` - -- name属性指自定义组件名称\(非必填\),组件名称对大小写不敏感,默认使用小写。src属性指自定义组件hml文件路径\(必填\),若没有设置name属性,则默认使用hml文件名作为组件名。 -- 事件绑定:自定义组件中绑定子组件事件使用\(on|@\)child1语法,子组件中通过this.$emit\('child1', \{ params: '传递参数' \}\)触发事件并进行传值,父组件执行bindParentVmMethod方法并接收子组件传递的参数。 - - >![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** - >子组件中使用驼峰命名法命名的事件,在父组件中绑定时需要使用短横线分隔命名形式,例如:@children-event表示绑定子组件的childrenEvent事件,如 @children-event="bindParentVmMethod"。 - - -## 对象 - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

描述

-

data

-

Object/Function

-

页面的数据模型,类型是对象或者函数,如果类型是函数,返回值必须是对象。属性名不能以$或_开头,不要使用保留字for, if, show, tid。

-

data与private和public不能重合使用。

-

props

-

Array/Object

-

props用于组件之间的通信,可以通过<tag xxxx='value'>方式传递给组件;props名称必须用小写,不能以$或_开头,不要使用保留字for, if, show, tid。目前props的数据类型不支持Function。

-

computed

-

Object

-

用于在读取或设置进行预先处理,计算属性的结果会被缓存。计算属性名不能以$或_开头,不要使用保留字。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/04.\347\273\204\344\273\266\351\200\232\347\224\250\350\257\264\346\230\216/01.\351\200\232\347\224\250\344\272\213\344\273\266.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/04.\347\273\204\344\273\266\351\200\232\347\224\250\350\257\264\346\230\216/01.\351\200\232\347\224\250\344\272\213\344\273\266.md" deleted file mode 100644 index d2b81d0182dc7aad885443477a6b59be7abe205a..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/04.\347\273\204\344\273\266\351\200\232\347\224\250\350\257\264\346\230\216/01.\351\200\232\347\224\250\344\272\213\344\273\266.md" +++ /dev/null @@ -1,205 +0,0 @@ ---- -title: 通用事件 -permalink: /pages/000d0300 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 通用事件 - -相对于私有事件,大部分组件都可以绑定如下事件。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

touchstart

-

TouchEvent

-

手指刚触摸屏幕时触发该事件。

-

touchmove

-

TouchEvent

-

手指触摸屏幕后移动时触发该事件。

-

touchcancel

-

TouchEvent

-

手指触摸屏幕中动作被打断时触发该事件。

-

touchend

-

TouchEvent

-

手指触摸结束离开屏幕时触发该事件。

-

click

-

-

-

点击动作触发该事件。

-

longpress

-

-

-

长按动作触发该事件。

-

swipe5+

-

SwipeEvent

-

组件上快速滑动后触发。

-
- -**表 1** BaseEvent对象属性列表 - - - - - - - - - - - - - - - - -

属性

-

类型

-

说明

-

type

-

string

-

当前事件的类型,比如click、longpress等。

-

timestamp

-

number

-

该事件触发时的时间戳。

-
- -**表 2** TouchEvent对象属性列表\(继承BaseEvent\) - - - - - - - - - - - - - - - - -

属性

-

类型

-

说明

-

touches

-

Array<TouchInfo>

-

触摸事件时的属性集合,包含屏幕触摸点的信息数组。

-

changedTouches

-

Array<TouchInfo>

-

触摸事件时的属性集合,包括产生变化的屏幕触摸点的信息数组。数据数据格式和touches一样。该属性表示有变化的触摸点,如从无变有,位置变化,从有变无。例如用户手指刚接触屏幕时,touches数组中有数据,但changedTouches无数据。

-
- -**表 3** TouchInfo - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

属性

-

类型

-

说明

-

globalX

-

number

-

距离屏幕左上角(不包括状态栏)横向距离。屏幕的左上角为原点。

-

globalY

-

number

-

距离屏幕左上角(不包括状态栏)纵向距离。屏幕的左上角为原点。

-

localX

-

number

-

距离被触摸组件左上角横向距离。组件的左上角为原点。

-

localY

-

number

-

距离被触摸组件左上角纵向距离。组件的左上角为原点。

-

size

-

number

-

触摸接触面积。

-
- -**表 4** SwipeEvent 基础事件对象属性列表(继承BaseEvent) - - - - - - - - - - - - -

属性

-

类型

-

说明

-

direction

-

string

-

滑动方向,可能值有:

-
  1. left:向左滑动;
  2. right:向右滑动;
  3. up:向上滑动;
  4. down:向下滑动。
-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/04.\347\273\204\344\273\266\351\200\232\347\224\250\350\257\264\346\230\216/02.\351\200\232\347\224\250\345\261\236\346\200\247.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/04.\347\273\204\344\273\266\351\200\232\347\224\250\350\257\264\346\230\216/02.\351\200\232\347\224\250\345\261\236\346\200\247.md" deleted file mode 100644 index bd38118ce8fbd202db78a9454bef3555096ea635..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/04.\347\273\204\344\273\266\351\200\232\347\224\250\350\257\264\346\230\216/02.\351\200\232\347\224\250\345\261\236\346\200\247.md" +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: 通用属性 -permalink: /pages/000d0301 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 通用属性 - -- [常规属性](#zh-cn_topic_0000001058340523_section861395713012) -- [渲染属性](#zh-cn_topic_0000001058340523_section1894362211119) - -## 常规属性 - -常规属性指的是组件普遍支持的用来设置组件基本标识和外观显示特征的属性。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

id

-

string

-

-

-

-

组件的唯一标识。

-

style

-

string

-

-

-

-

组件的样式声明。

-

class

-

string

-

-

-

-

组件的样式类,用于引用样式表。

-

ref

-

string

-

-

-

-

用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上。

-

disabled

-

boolean

-

false

-

-

当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互。

-

data

-

string

-

-

-

-

给当前组件设置data属性,进行相应的数据存储和读取。

-

click-effect5+

-

string

-

-

-

-

通过这个样式可以设置组件的弹性点击效果,当前支持如下三种效果:

-
  • spring-small:建议小面积组件设置,

    缩放(90%)

    -
  • spring-medium:建议中面积组件设置,缩放(95%)
  • spring-large:建议大面积组件设置,

    缩放(95%)

    -
-
- -## 渲染属性 - -组件普遍支持的用来设置组件是否渲染的属性。 - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

描述

-

for

-

Array

-

-

-

根据设置的数据列表,展开当前元素。

-

if

-

boolean

-

-

-

根据设置的boolean值,添加或移除当前元素。

-

show

-

boolean

-

-

-

根据设置的boolean值,显示或隐藏当前元素。

-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->属性和样式不能混用,不能在属性字段中进行样式设置。 - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/04.\347\273\204\344\273\266\351\200\232\347\224\250\350\257\264\346\230\216/03.\351\200\232\347\224\250\346\240\267\345\274\217.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/04.\347\273\204\344\273\266\351\200\232\347\224\250\350\257\264\346\230\216/03.\351\200\232\347\224\250\346\240\267\345\274\217.md" deleted file mode 100644 index 1449bdaec6b08d01145d70038edf1d65e9caf2b1..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/04.\347\273\204\344\273\266\351\200\232\347\224\250\350\257\264\346\230\216/03.\351\200\232\347\224\250\346\240\267\345\274\217.md" +++ /dev/null @@ -1,1584 +0,0 @@ ---- -title: 通用样式 -permalink: /pages/000d0302 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 通用样式 - -组件普遍支持的可以在style或css中设置组件外观样式。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

width

-

<length> | <percentage>

-

-

-

-

设置组件自身的宽度。

-

缺省时使用元素自身内容需要的宽度。

-

height

-

<length> | <percentage>

-

-

-

-

设置组件自身的高度。

-

缺省时使用元素自身内容需要的高度。

-

min-width5+

-

<length>

-

0

-

-

设置元素的最小宽度。

-

min-height5+

-

<length>

-

0

-

-

设置元素的最小高度。

-

max-width5+

-

<length>

-

-

-

-

设置元素的最大宽度。默认无限制。

-

max-height5+

-

<length>

-

-

-

-

设置元素的最大高度。默认无限制。

-

padding

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的内边距属性。

-
该属性可以有1到4个值:
  • 指定一个值时,该值指定四个边的内边距。

    -
  • 指定两个值时,第一个值指定上下两边的内边距,第二个指定左右两边的内边距。

    -
  • 指定三个值时,第一个指定上边的内边距,第二个指定左右两边的内边距,第三个指定下边的内边距。

    -
  • 指定四个值时分别为上、右、下、左边的内边距(顺时针顺序)。

    -
-
-

padding-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下内边距属性。

-

padding-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端内边距属性。

-

margin

-

<length> | <percentage>5+

-

0

-

-

使用简写属性设置所有的外边距属性,该属性可以有1到4个值。

-
  • 只有一个值时,这个值会被指定给全部的四个边。

    -
  • 两个值时,第一个值被匹配给上和下,第二个值被匹配给左和右。

    -
  • 三个值时,第一个值被匹配给上, 第二个值被匹配给左和右,第三个值被匹配给下。

    -
  • 四个值时,会依次按上、右、下、左的顺序匹配 (即顺时针顺序)。

    -
-

margin-[left|top|right|bottom]

-

<length> | <percentage>5+

-

0

-

-

设置左、上、右、下外边距属性。

-

margin-[start|end]

-

<length> | <percentage>5+

-

0

-

-

设置起始和末端外边距属性。

-

border

-

-

-

0

-

-

使用简写属性设置所有的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置时,各属性值为默认值。

-

border-style

-

string

-

solid

-

-

使用简写属性设置所有边框的样式,可选值为:

-
  • dotted:显示为一系列圆点,圆点半径为border-width的一半。
  • dashed:显示为一系列短的方形虚线。
-
  • solid:显示为一条实线。
-

border-[left|top|right|bottom]-style

-

string

-

solid

-

-

分别设置左、上、右、下四个边框的样式,可选值为dotted、dashed、solid。

-

border-[left|top|right|bottom]

-

-

-

-

-

-

使用简写属性设置对应位置的边框属性,包含边框的宽度,样式,颜色属性,顺序设置为border-width、border-style、border-color,不设置的值为默认值。

-

border-width

-

<length>

-

0

-

-

使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度

-

border-[left|top|right|bottom]-width

-

<length>

-

0

-

-

分别设置左、上、右、下四个边框的宽度。

-

border-color

-

<color>

-

black

-

-

使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色

-

border-[left|top|right|bottom]-color

-

<color>

-

black

-

-

分别设置左、上、右、下四个边框的颜色。

-

border-radius

-

<length>

-

-

-

-

border-radius属性是设置元素的外边框圆角半径。设置border-radius时不能单独设置某一个方向的border-[left|top|right|bottom]-width,border-[left|top|right|bottom]-color ,border-[left|top|right|bottom]-style,如果要设置color、width和style,需要将四个方向一起设置(border-width、border-color、border-style)。

-

border-[top|bottom]-[left|right]-radius

-

<length>

-

-

-

-

分别设置左上,右上,右下和左下四个角的圆角半径。

-

background

-

<linear-gradient>

-

-

-

-

仅支持设置渐变样式,与background-color、background-image不兼容。

-

background-color

-

<color>

-

-

-

-

设置背景颜色。

-

background-image

-

string

-

-

-

-

设置背景图片。与background-color、background不兼容;支持本地图片资源地址。

-

示例:

-
  • background-image: url("/common/background.png")
-

background-size

-
  • string
  • <length> <length>
  • <percentage> <percentage>
-

auto

-

-

设置背景图片的大小。

-
  • string可选值:
    • contain:把图像扩展至最大尺寸,以使其高度和宽度完全适用内容区域。
    • cover:把背景图像扩展至足够大,以使背景图像完全覆盖背景区域;背景图像的某些部分也许无法显示在背景定位区域中。
    • auto:保持原图的比例不变。
    -
  • length值参数方式:

    设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
  • 百分比参数方式:

    以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。

    -
-

background-repeat

-

string

-

repeat

-

-

针对重复背景图像样式进行设置,背景图像默认在水平和垂直方向上重复。

-
  • repeat:在水平轴和竖直轴上同时重复绘制图片。
  • repeat-x:只在水平轴上重复绘制图片。
  • repeat-y:只在竖直轴上重复绘制图片。
  • no-repeat:不会重复绘制图片。
-

background-position

-
  • string string
  • <length> <length>
  • <percentage> <percentage>
-

0px 0px

-

-
  • 关键词方式:如果仅规定了一个关键词,那么第二个值为"center"。两个值分别定义水平方向位置和竖直方向位置。
    • left:水平方向上最左侧。
    • right:水平方向上最右侧。
    • top:竖直方向上最顶部。
    • bottom:竖直方向上最底部。
    • center:水平方向或竖直方向上中间位置。
    -
-
  • length值参数方式:第一个值是水平位置,第二个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,另外一个值将是50%。
  • 百分比参数方式:第一个值是水平位置,第二个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,另外一个值为50%。
  • 可以混合使用<percentage>和<length>
-

box-shadow5+

-

-

-

0

-

-

语法:box-shadow: h-shadow v-shadow blur spread color

-

通过这个样式可以设置当前组件的阴影样式,包括水平位置(必填)、垂直位置(必填)、模糊半径(可选,默认值为0)、阴影延展距离(可选,默认值为0)、阴影颜色(可选,默认值为黑色)。

-

示例:

-
  • box-shadow :10px 20px 5px 10px #888888
  • box-shadow :100px 100px 30px red
  • box-shadow :-100px -100px 0px 40px
-

filter5+

-

string

-

-

-

-

语法:filter: blur(px)

-

通过这个样式可以设置当前组件布局范围的内容模糊,参数用于指定模糊半径,如果没有设置值,则默认是0(不模糊),不支持百分比。

-

示例:

-
  • filter: blur(10px)
-

backdrop-filter5+

-

string

-

-

-

-

语法:backdrop-filter: blur(px)

-

通过这个样式可以设置当前组件布局范围的背景模糊,参数用于指定模糊半径,如果没有设置值,则默认是0(不模糊),不支持百分比。

-

示例:

-
  • backdrop-filter: blur(10px)
-

opacity

-

number

-

1

-

-

元素的透明度,取值范围为0到1,1表示为不透明,0表示为完全透明。

-

display

-

string

-

-

flex

-

-

确定一个元素所产生的框的类型,可选值为:

-
  • flex:弹性布局。
  • none:不渲染此元素。
-

visibility

-

string

-

-

visible

-

-

是否显示元素所产生的框。不可见的框会占用布局(将'display'属性设置为'none'来完全去除框),可选值为:

-
  • visible:元素正常显示。
  • hidden:隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
-
说明:

visibility和display样式都设置时,仅display生效

-
-

flex

-

-

-

-

-

-

规定当前组件如何适应父组件中的可用空间。

-

flex可以指定1个,2个5+或3个5+值。

-

单值语法:

-
  • 一个无单位数:用来设置组件的flex-grow
  • 一个有效的宽度值5+:用来设置组件的flex-basis
-

双值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow。第二个值是以下之一:

-
  • 一个无单位数:用来设置组件的flex-shrink
  • 一个有效的宽度值:用来设置组件的flex-basis
-

三值语法5+

-

第一个值必须是无单位数,用来设置组件的flex-grow;第二个值必须是无单位数,用来设置组件的flex-shrink;第三个值必须是一个有效的宽度值,用来设置组件的flex-basis。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-grow

-

number

-

0

-

-

设置组件的拉伸样式,指定父组件容器主轴方向上剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-shrink

-

number

-

1

-

-

设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

flex-basis

-

<length>

-

-

-

-

-

设置组件在主轴方向上的初始大小。

-
说明:

仅父容器为<div>、<list-item>、<tabs>、<refresh>、<stepper-item>5+时生效。

-
-

position

-

string

-

relative

-

-

设置元素的定位类型,不支持动态变更。

-
  • fixed:相对与整个界面进行定位。
  • absolute:相对于父元素进行定位。
  • relative:相对于其正常位置进行定位。
-
说明:

absolute属性仅在父容器为<div>、<stack>时生效。

-
-

[left|top|right|bottom]

-

<length>

-

-

-

-

left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。

-
  • left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。
  • top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
  • right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。
  • bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移。
-
- ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** ->通用样式都不是必填项。 ->目前,样式支持的颜色格式如下: ->- rgb\(255, 255, 255\) ->- rgba\(255, 255, 255, 1.0\) ->- HEX格式:\#rrggbb,\#aarrggbb ->- 枚举格式:black,white等,详见[表1](#zh-cn_topic_0000001059340528_table16879155017425)。Script脚本中不支持枚举格式。 - -**表 1** 当前支持的颜色枚举 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

枚举名称

-

对应颜色

-

颜色

-

aliceblue

-

#f0f8ff

-

-

antiquewhite

-

#faebd7

-

-

aqua

-

#00ffff

-

-

aquamarine

-

#7fffd4

-

-

azure

-

#f0ffff

-

-

beige

-

#f5f5dc

-

-

bisque

-

#ffe4c4

-

-

black

-

#000000

-

-

blanchedalmond

-

#ffebcd

-

-

blue

-

#0000ff

-

-

blueviolet

-

#8a2be2

-

-

brown

-

#a52a2a

-

-

burlywood

-

#deB887

-

-

cadetblue

-

#5f9ea0

-

-

chartreuse

-

#7fff00

-

-

chocolate

-

#d2691e

-

-

coral

-

#ff7f50

-

-

cornflowerblue

-

#6495ed

-

-

cornsilk

-

#fff8dc

-

-

crimson

-

#dc143c

-

-

cyan

-

#00ffff

-

-

darkblue

-

#00008b

-

-

darkcyan

-

#008b8b

-

-

darkgoldenrod

-

#b8860b

-

-

darkgray

-

#a9a9a9

-

-

darkgreen

-

#006400

-

-

darkgrey

-

#a9a9a9

-

-

darkkhaki

-

#bdb76b

-

-

darkmagenta

-

#8b008b

-

-

darkolivegreen

-

#556b2f

-

-

darkorange

-

#ff8c00

-

-

darkorchid

-

#9932cc

-

-

darkred

-

#8b0000

-

-

darksalmon

-

#e9967a

-

-

darkseagreen

-

#8fbc8f

-

-

darkslateblue

-

#483d8b

-

-

darkslategray

-

#2f4f4f

-

-

darkslategrey

-

#2f4f4f

-

-

darkturquoise

-

#00ced1

-

-

darkviolet

-

#9400d3

-

-

deeppink

-

#ff1493

-

-

deepskyblue

-

#00bfff

-

-

dimgray

-

#696969

-

-

dimgrey

-

#696969

-

-

dodgerblue

-

#1e90ff

-

-

firebrick

-

#b22222

-

-

floralwhite

-

#fffaf0

-

-

forestgreen

-

#228b22

-

-

fuchsia

-

#ff00ff

-

-

gainsboro

-

#dcdcdc

-

-

ghostwhite

-

#f8f8ff

-

-

gold

-

#ffd700

-

-

goldenrod

-

#daa520

-

-

gray

-

#808080

-

-

green

-

#008000

-

-

greenyellow

-

#adff2f

-

-

grey

-

#808080

-

-

honeydew

-

#f0fff0

-

-

hotpink

-

#ff69b4

-

-

indianred

-

#cd5c5c

-

-

indigo

-

#4b0082

-

-

ivory

-

#fffff0

-

-

khaki

-

#f0e68c

-

-

lavender

-

#e6e6fa

-

-

lavenderblush

-

#fff0f5

-

-

lawngreen

-

#7cfc00

-

-

lemonchiffon

-

#fffacd

-

-

lightblue

-

#add8e6

-

-

lightcoral

-

#f08080

-

-

lightcyan

-

#e0ffff

-

-

lightgoldenrodyellow

-

#fafad2

-

-

lightgray

-

#d3d3d3

-

-

lightgreen

-

#90ee90

-

-

lightpink

-

#ffb6c1

-

-

lightsalmon

-

#ffa07a

-

-

lightseagreen

-

#20b2aa

-

-

lightskyblue

-

#87cefa

-

-

lightslategray

-

#778899

-

-

lightslategrey

-

#778899

-

-

lightsteelblue

-

#b0c4de

-

-

lightyellow

-

#ffffe0

-

-

lime

-

#00ff00

-

-

limegreen

-

#32cd32

-

-

linen

-

#faf0e6

-

-

magenta

-

#ff00ff

-

-

maroon

-

#800000

-

-

mediumaquamarine

-

#66cdaa

-

-

mediumblue

-

#0000cd

-

-

mediumorchid

-

#ba55d3

-

-

mediumpurple

-

#9370db

-

-

mediumseagreen

-

#3cb371

-

-

mediumslateblue

-

#7b68ee

-

-

mediumspringgreen

-

#00fa9a

-

-

mediumturquoise

-

#48d1cc

-

-

mediumvioletred

-

#c71585

-

-

midnightblue

-

#191970

-

-

mintcream

-

#f5fffa

-

-

mistyrose

-

#ffe4e1

-

-

moccasin

-

#ffe4b5

-

-

navajowhite

-

#ffdead

-

-

navy

-

#000080

-

-

oldlace

-

#fdf5e6

-

-

olive

-

#808000

-

-

olivedrab

-

#6b8e23

-

-

orange

-

#ffa500

-

-

orangered

-

#ff4500

-

-

orchid

-

#da70d6

-

-

palegoldenrod

-

#eee8aa

-

-

palegreen

-

#98fb98

-

-

paleturquoise

-

#afeeee

-

-

palevioletred

-

#db7093

-

-

papayawhip

-

#ffefd5

-

-

peachpuff

-

#ffdab9

-

-

peru

-

#cd853f

-

-

pink

-

#ffc0cb

-

-

plum

-

#dda0dd

-

-

powderblue

-

#b0e0e6

-

-

purple

-

#800080

-

-

rebeccapurple

-

#663399

-

-

red

-

#ff0000

-

-

rosybrown

-

#bc8f8f

-

-

royalblue

-

#4169e1

-

-

saddlebrown

-

#8b4513

-

-

salmon

-

#fa8072

-

-

sandybrown

-

#f4a460

-

-

seagreen

-

#2e8b57

-

-

seashell

-

#fff5ee

-

-

sienna

-

#a0522d

-

-

silver

-

#c0c0c0

-

-

skyblue

-

#87ceeb

-

-

slateblue

-

#6a5acd

-

-

slategray

-

#708090

-

-

slategrey

-

#708090

-

-

snow

-

#fffafa

-

-

springgreen

-

#00ff7f

-

-

steelblue

-

#4682b4

-

-

tan

-

#d2b48c

-

-

teal

-

#008080

-

-

thistle

-

#d8Bfd8

-

-

tomato

-

#ff6347

-

-

turquoise

-

#40e0d0

-

-

violet

-

#ee82ee

-

-

wheat

-

#f5deb3

-

-

white

-

#ffffff

-

-

whitesmoke

-

#f5f5f5

-

-

yellow

-

#ffff00

-

-

yellowgreen

-

#9acd32

-

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/01.\346\227\245\345\277\227\346\211\223\345\215\260.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/01.\346\227\245\345\277\227\346\211\223\345\215\260.md" deleted file mode 100644 index dbf75be966c71c9085b871d76f3e98105be1e7d5..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/01.\346\227\245\345\277\227\346\211\223\345\215\260.md" +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: 日志打印 -permalink: /pages/000d0400 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 日志打印 - -- [导入模块](#zh-cn_topic_0000001058460515_s56d19203690d4782bfc74069abb6bd71) -- [权限列表](#zh-cn_topic_0000001058460515_section11257113618419) -- [日志分类](#zh-cn_topic_0000001058460515_s298a3cf59a3b470dbb0742706102ced7) - -## 导入模块 - -无需导入。 - -## 权限列表 - -无 - -## 日志分类 - -打印一段文本信息,console.debug|log|info|warn|error\(message\) - -- 参数 - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

message

-

string

-

-

表示要打印的文本信息。

-
- -- 示例 - - ``` - var versionCode = 1; - console.info('Hello World. The current version code is ' + versionCode); - ``` - - 在DevEco Studio的底部,切换到“HiLog”窗口。选择当前的设备及进程,日志级别选择Info,搜索内容设置为“Hello World”。此时窗口仅显示符合条件的日志,效果如图所示: - - ![](/images/zh-cn/application-dev/js-reference/figures/打印日志.png) - - >![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** - >console.log\(\)打印的是debug级别日志信息。 - - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/02.\345\272\224\347\224\250\346\211\223\347\202\271.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/02.\345\272\224\347\224\250\346\211\223\347\202\271.md" deleted file mode 100644 index 29e3c050dd4b237ace1d0a7db2168bba65b7ba01..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/02.\345\272\224\347\224\250\346\211\223\347\202\271.md" +++ /dev/null @@ -1,381 +0,0 @@ ---- -title: 应用打点 -permalink: /pages/000d0401 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 应用打点 - -- [导入模块](#zh-cn_topic_0000001150092213_s56d19203690d4782bfc74069abb6bd71) -- [权限](#zh-cn_topic_0000001150092213_section11257113618419) -- [方法](#zh-cn_topic_0000001150092213_section125675489541) -- [write\(string, EventType, any..., AsyncCallback\)](#zh-cn_topic_0000001150092213_section192192415554) -- [write\(string, EventType, any...\)](#zh-cn_topic_0000001150092213_section1696563334210) -- [writeJson\(string, EventType, object, AsyncCallback\)](#zh-cn_topic_0000001150092213_section570630172512) -- [writeJson\(string, EventType, object\)](#zh-cn_topic_0000001150092213_section0857164934517) -- [枚举](#zh-cn_topic_0000001150092213_section1978842154715) -- [EventType](#zh-cn_topic_0000001150092213_section099619567453) - -## 导入模块 - -``` -import hiappevent from '@ohos.hiappevent'; -``` - -## 权限 - -无 - -## 方法 - -## write\(string, EventType, any..., AsyncCallback\) - -应用事件打点,将事件信息写入到当天的事件文件中,可接收类型为不定参数的事件参数,使用callback方式作为异步方法。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

eventName

-

string

-

-

应用事件名称。

-

eventType

-

EventType

-

-

应用事件类型。

-

params

-

any...

-

-

应用事件的参数,按顺序输入事件的参数名与参数值。参数名的类型只能为string类型,参数值的类型只能为string、number、boolean、Array(数组数据类型只能为string、number、boolean)。

-

callback

-

AsyncCallback<number>

-

-

回调函数,可以在回调函数中处理接口返回值。

-
  • 返回值为0表示事件参数校验成功,事件正常异步写入事件文件;
  • 大于0表示事件存在异常参数,事件在忽略异常参数后再异步写入事件文件;
  • 小于0表示事件校验失败,不执行事件异步打点操作。
-
- -**示例:** - -``` -hiappevent.write("testEvent", hiappevent.EventType.FAULT, "intData", 100, "strData", "strValue", (err, value) => { - if (err) { - // 事件写入异常:事件存在异常参数或者事件校验失败不执行写入 - console.error(`failed to write event because ${err}`); - return; - } - - // 事件写入正常 - console.log(`success to write event: ${value}`); -}); -``` - -## write\(string, EventType, any...\) - -应用事件打点,将事件信息写入到当天的事件文件中,可接收类型为不定参数的事件参数,使用promise方式作为异步方法。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

eventName

-

string

-

-

应用事件名称。

-

eventType

-

EventType

-

-

应用事件类型。

-

params

-

any...

-

-

应用事件的参数,按顺序输入事件的参数名与参数值。参数名的类型只能为string类型,参数值的类型只能为string、number、boolean、Array(数组数据类型只能为string、number、boolean)。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise函数

-
- -**示例:** - -``` -hiappevent.write("testEvent", hiappevent.EventType.FAULT, "intData", 100, "strData", "strValue") - .then((value) => { - // 事件写入正常 - console.log(`success to write event: ${value}`); - }).catch((err) => { - // 事件写入异常:事件存在异常参数或者事件校验失败不执行写入 - console.error(`failed to write event because ${err}`); - }); -``` - -## writeJson\(string, EventType, object, AsyncCallback\) - -应用事件打点,将事件信息写入到当天的事件文件中,可接收类型为JSON对象的事件参数,使用callback方式作为异步方法。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

eventName

-

string

-

-

应用事件名称。

-

eventType

-

EventType

-

-

应用事件类型。

-

jsonParam

-

object

-

-

应用事件的参数,key类型只能为string,value类型只能为string、number、boolean、Array(数组数据类型只能为string、number、boolean)。

-

callback

-

AsyncCallback<number>

-

-

回调函数,可以在回调函数中处理接口返回值。

-
  • 返回值为0表示事件参数校验成功,事件正常异步写入事件文件;
  • 大于0表示事件存在异常参数,事件在忽略异常参数后再异步写入事件文件;
  • 小于0表示事件校验失败,不执行事件异步打点操作。
-
- -**示例:** - -``` -hiappevent.writeJson("testEvent", hiappevent.EventType.FAULT, {"intData":100, "strData":"strValue"}, (err, value) => { - if (err) { - // 事件写入异常:事件存在异常参数或者事件校验失败不执行写入 - console.error(`failed to write event because ${err}`); - return; - } - - // 事件写入正常 - console.log(`success to write event: ${value}`); -}); -``` - -## writeJson\(string, EventType, object\) - -应用事件打点,将事件信息写入到当天的事件文件中,可接收类型为JSON对象的事件参数,使用promise方式作为异步方法。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

eventName

-

string

-

-

应用事件名称。

-

eventType

-

EventType

-

-

应用事件类型。

-

jsonParam

-

object

-

-

应用事件的参数,key类型只能为string,value类型只能为string、number、boolean、Array(数组数据类型只能为string、number、boolean)。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise函数

-
- -**示例:** - -``` -hiappevent.writeJson("testEvent", hiappevent.EventType.FAULT, {"intData":100, "strData":"strValue"}) - .then((value) => { - // 事件写入正常 - console.log(`success to write event: ${value}`); - }).catch((err) => { - // 事件写入异常:事件存在异常参数或者事件校验失败不执行写入 - console.error(`failed to write event because ${err}`); - }); -``` - -## 枚举 - -## EventType - -用于表示事件类型。 - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

默认值

-

说明

-

FAULT

-

1

-

故障类型事件。

-

STATISTIC

-

2

-

统计类型事件。

-

SECURITY

-

3

-

安全类型事件。

-

BEHAVIOR

-

4

-

系统行为事件。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/03.\351\241\265\351\235\242\350\267\257\347\224\261.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/03.\351\241\265\351\235\242\350\267\257\347\224\261.md" deleted file mode 100644 index ca8ac7f1a7816cbc83b053d3cf1d1d282064ec52..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/03.\351\241\265\351\235\242\350\267\257\347\224\261.md" +++ /dev/null @@ -1,328 +0,0 @@ ---- -title: 页面路由 -permalink: /pages/000d0402 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 页面路由 - -- [导入模块](#zh-cn_topic_0000001058340511_s0e7b1e85a4274f58a8206e0b065bd80c) -- [权限列表](#zh-cn_topic_0000001058340511_section11257113618419) -- [router.push\(OBJECT\)](#zh-cn_topic_0000001058340511_s938bf8d664f9475485e83d445c0eeeae) -- [router.replace\(OBJECT\)](#zh-cn_topic_0000001058340511_s6d485e6ae3064996a4de2f407bc4287d) -- [router.back\(OBJECT\)](#zh-cn_topic_0000001058340511_s3f958a02dde141e69b7f02f22fb2e401) -- [router.clear\(\)](#zh-cn_topic_0000001058340511_sa5c3dfd1bb0d4b43906c3d770d6ab2d9) -- [router.getLength\(\)](#zh-cn_topic_0000001058340511_s3f121f4005934fda9a1830a909c92c25) -- [router.getState\(\)](#zh-cn_topic_0000001058340511_s8843a443a12048e68e33f586aee8dc34) - ->![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-notice.gif) **须知:** ->页面路由需要在页面渲染完成之后才能调用,在onInit和onReady生命周期中页面还处于渲染阶段,禁止调用页面路由方法。 - -## 导入模块 - -``` -import router from '@system.router'; -``` - -## 权限列表 - -无 - -## router.push\(OBJECT\) - -跳转到应用内的指定页面。 - -- 参数 - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

uri

-

string

-

-

表示目标页面的uri,可以用以下两种格式:

-
  • 页面绝对路径,由配置文件中pages列表提供,例如:
    • pages/index/index
    • pages/detail/detail
    -
  • 特殊值,如果uri的值是"/",则跳转到首页。
-

params

-

Object

-

-

跳转时要同时传递到目标页面的数据,跳转到目标页面后,参数可以在页面中直接使用,如this.data1(data1为跳转时params参数中的key值)。如果目标页面中已有该字段,则其值会被传入的字段值覆盖。

-
- -- 示例 - - ``` - // 在当前页面中 - export default { - pushPage() { - router.push({ - uri: 'pages/routerpage2/routerpage2', - params: { - data1: 'message', - data2: { - data3: [123, 456, 789] - }, - }, - }); - } - } - // 在routerpage2页面中 - export default { - data: { - data1: 'default', - data2: { - data3: [1, 2, 3] - } - }, - onInit() { - console.info('showData1:' + this.data1); - console.info('showData3:' + this.data2.data3); - } - } - ``` - - >![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** - >页面路由栈支持的最大Page数量为32。 - - -## router.replace\(OBJECT\) - -用应用内的某个页面替换当前页面,并销毁被替换的页面。 - -- 参数 - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

uri

-

string

-

-

目标页面的uri,可以是以下的两种格式:

-
  • 页面绝对路径,由配置文件中pages列表提供,例如:
    • pages/index/index
    • pages/detail/detail
    -
  • 特殊值,如果uri的值是"/",则跳转到首页。
-

params

-

Object

-

-

跳转时要同时传递到目标页面的数据,跳转到目标页面后,参数可以在页面中直接使用,如this.data1(data1为跳转时params参数中的key值)。如果目标页面中已有该字段,则其值会被传入的字段值覆盖。

-
- -- 示例 - - ``` - // 在当前页面中 - export default { - replacePage() { - router.replace({ - uri: 'pages/detail/detail', - params: { - data1: 'message', - }, - }); - } - } - // 在detail页面中 - export default { - data: { - data1: 'default' - }, - onInit() { - console.info('showData1:' + this.data1) - } - } - ``` - - -## router.back\(OBJECT\) - -返回上一页面或指定的页面。 - -- 参数 - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

uri

-

string

-

-

返回到指定uri的界面,如果页面栈上没有uri页面,则不响应该情况。如果uri未设置,则返回上一页。

-
- -- 示例 - - ``` - // index页面 - router.push({ - uri: 'pages/detail/detail', - }); - - // detail页面 - router.push({ - uri: 'pages/mall/mall', - }); - - // mall页面通过back,将返回detail页面 - router.back(); - // detail页面通过back,将返回index页面 - router.back(); - // 通过back,返回到detail页面 - router.back({uri:'pages/detail/detail'}); - ``` - - >![](/images/zh-cn/application-dev/js-reference/public_sys-resources/icon-note.gif) **说明:** - >示例中的uri字段是页面路由,由配置文件中的pages列表指定。 - - -## router.clear\(\) - -清空页面栈中的所有历史页面,仅保留当前页面作为栈顶页面。 - -- 参数 - - 无。 - -- 示例 - - ``` - router.clear(); - ``` - - -## router.getLength\(\) - -获取当前在页面栈内的页面数量。 - -- 返回值 - - - - - - - - - - -

类型

-

说明

-

string

-

页面数量,页面栈支持最大数值是32。

-
- -- 示例 - - ``` - var size = router.getLength(); - console.log('pages stack size = ' + size); - ``` - - -## router.getState\(\) - -获取当前页面的状态信息。 - -- 返回值 - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

说明

-

index

-

number

-

表示当前页面在页面栈中的索引。

-
说明:

从栈底到栈顶,index从1开始递增。

-
-

name

-

string

-

表示当前页面的名称,即对应文件名。

-

path

-

string

-

表示当前页面的路径。

-
- -- 示例 - - ``` - var page = router.getState(); - console.log('current index = ' + page.index); - console.log('current name = ' + page.name); - console.log('current path = ' + page.path); - ``` - - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/04.\345\274\271\347\252\227.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/04.\345\274\271\347\252\227.md" deleted file mode 100644 index 738817e0af812c33f4fcf6aa501a345a866b224e..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/04.\345\274\271\347\252\227.md" +++ /dev/null @@ -1,206 +0,0 @@ ---- -title: 弹窗 -permalink: /pages/000d0403 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 弹窗 - -- [导入模块](#zh-cn_topic_0000001059340516_s1fada83813e64efcbc67e970ced86588) -- [权限列表](#zh-cn_topic_0000001059340516_section11257113618419) -- [prompt.showToast\(OBJECT\)](#zh-cn_topic_0000001059340516_sc34d255befcf467dab069802dc9e54d8) -- [prompt.showDialog\(OBJECT\)](#zh-cn_topic_0000001059340516_sc6babedb391e4de9af1189ebc9ff5e69) - -## 导入模块 - -``` -import prompt from '@system.prompt'; -``` - -## 权限列表 - -无 - -## prompt.showToast\(OBJECT\) - -显示文本弹窗。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

message

-

string

-

-

显示的文本信息。

-

duration

-

number

-

-

默认值1500ms,建议区间:1500ms-10000ms。

-
说明:

若小于1500ms则取默认值,最大取值为10000ms。

-
-

[bottom]5+

-

<length>

-

-

设置弹窗边框距离屏幕底部的位置。

-
- -- 示例 - - ``` - prompt.showToast({ - message: 'Message Info', - duration: 2000, - }); - ``` - - -## prompt.showDialog\(OBJECT\) - -在页面内显示对话框。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

title

-

string

-

-

标题文本。

-

message

-

string

-

-

内容文本。

-

buttons

-

Array

-

-

对话框中按钮的数组,结构为:{text:'button', color: '#666666'},支持1-3个按钮。其中第一个为positiveButton;第二个为negativeButton;第三个为neutralButton。

-

success

-

Function

-

-

接口调用成功的回调函数,返回值如success返回值所示。

-

cancel

-

Function

-

-

取消调用此接口的回调函数。

-

complete

-

Function

-

-

弹框退出时的回调函数。

-
- - success返回值: - - - - - - - - - - - - -

参数名

-

类型

-

说明

-

index

-

number

-

选中按钮在buttons数组中的索引。

-
- -- 示例 - - ``` - prompt.showDialog({ - title: 'Title Info', - message: 'Message Info', - buttons: [ - { - text: 'button', - color: '#666666', - }, - ], - success: function(data) { - console.log('dialog success callback,click button : ' + data.index); - }, - cancel: function() { - console.log('dialog cancel callback'); - }, - }); - ``` - - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/05.\345\256\232\346\227\266\345\231\250.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/05.\345\256\232\346\227\266\345\231\250.md" deleted file mode 100644 index f067c75541a5f6a1a7345bdcf0cb309c477ebfc5..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/05.\345\256\232\346\227\266\345\231\250.md" +++ /dev/null @@ -1,230 +0,0 @@ ---- -title: 定时器 -permalink: /pages/000d0404 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 定时器 - -- [导入模块](#zh-cn_topic_0000001058562847_section7480141454919) -- [权限列表](#zh-cn_topic_0000001058562847_section11257113618419) -- [setTimeout\(handler\[, delay\[, ...args\]\]\)](#zh-cn_topic_0000001058562847_section691616559215) -- [clearTimeout\(timeoutID\)](#zh-cn_topic_0000001058562847_section591824471012) -- [setInterval\(handler\[, delay\[, ...args\]\]\)](#zh-cn_topic_0000001058562847_section3644185910144) -- [clearInterval\(intervalID\)](#zh-cn_topic_0000001058562847_section16451595149) - -## 导入模块 - -无需导入。 - -## 权限列表 - -无 - -## setTimeout\(handler\[, delay\[, ...args\]\]\) - -设置一个定时器,该定时器在定时器到期后执行一个函数。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

handler

-

Function

-

-

定时器到期后执行函数。

-

delay

-

number

-

-

延迟的毫秒数,函数的调用会在该延迟之后发生。如果省略该参数,delay取默认值0,意味着“马上”执行,或尽快执行。

-

...args

-

Array<any>

-

-

附加参数,一旦定时器到期,他们会作为参数传递给handler。

-
- -- 返回值 - - **timeoutID** 定时器的ID - -- 示例 - - ``` - var timeoutID = setTimeout(function() { - console.log('delay 1s'); - }, 1000); - ``` - - -## clearTimeout\(timeoutID\) - -取消了先前通过调用setTimeout\(\)建立的定时器。 - -- 参数 - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

timeoutID

-

number

-

-

要取消定时器的ID, 是由setTimeout()返回的。

-
- -- 示例 - - ``` - var timeoutID = setTimeout(function() { - console.log('do after 1s delay.'); - }, 1000); - - clearTimeout(timeoutID); - ``` - - -## setInterval\(handler\[, delay\[, ...args\]\]\) - -重复调用一个函数,在每次调用之间具有固定的时间延迟。 - -- 参数 - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

handler

-

Function

-

-

要重复调用的函数。

-

delay

-

number

-

-

延迟的毫秒数(一秒等于1000毫秒),函数的调用会在该延迟之后发生。

-

...args

-

Array<any>

-

-

附加参数,一旦定时器到期,他们会作为参数传递给handler。

-
- -- 返回值 - - **intervalID** 重复定时器ID - -- 示例 - - ``` - var intervalID = setInterval(function() { - console.log('do very 1s.'); - }, 1000); - ``` - - -## clearInterval\(intervalID\) - -可取消先前通过 setInterval\(\) 设置的重复定时任务。 - -- 参数 - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

intervalID

-

number

-

-

要取消的重复定时器的ID,是由 setInterval() 返回的。

-
- -- 示例 - - ``` - var intervalID = setInterval(function() { - console.log('do very 1s.'); - }, 1000); - - clearInterval(intervalID); - ``` - - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/06.\346\227\266\351\227\264\350\256\276\347\275\256.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/06.\346\227\266\351\227\264\350\256\276\347\275\256.md" deleted file mode 100644 index cd0b4956ef820717d4ba7c1d2bb8292a42c98590..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/06.\346\227\266\351\227\264\350\256\276\347\275\256.md" +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: 时间设置 -permalink: /pages/000d0405 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 时间设置 - -- [导入模块](#zh-cn_topic_0000001162403059_s56d19203690d4782bfc74069abb6bd71) -- [权限列表](#zh-cn_topic_0000001162403059_section11257113618419) -- [setTime\(number, AsyncCallback\)](#zh-cn_topic_0000001162403059_section1524014116262) -- [setTime\(number\) : Promise](#zh-cn_topic_0000001162403059_section1853612361618) - -## 导入模块 - -``` -import systemTime from '@ohos.systemTime'; -``` - -## 权限列表 - -无。 - -## setTime\(number, AsyncCallback\) - -设置系统时间 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

time

-

number

-

-

目标时间戳(毫秒)。

-

callback

-

AsyncCallback<boolean>

-

-

回调函数,可以在回调函数中处理接口返回值。

-
  • 返回值为true,表示设置系统时间成功;
  • 返回值为false,表示设置系统时间失败。
-
- -**示例:** - -``` -// time对应的时间为2021-01-20 02:36:25 -var time = 1611081385000; -systemTime.setTime(time, (err, value) => { - if (err) { - // 设置时间失败,err非空,value为空。 - console.error(`failed to systemTime.setTime because ${err.message}`); - return; - } - - // 设置时间成功,err为空,value非空。 - console.log(`success to systemTime.setTime: ${value}`); -}); -``` - -## setTime\(number\) : Promise - -设置系统时间 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

time

-

number

-

-

目标时间戳(毫秒)。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<boolean>

-
  • 返回值为true,表示设置系统时间成功;
  • 返回值为false,表示设置系统时间失败。
-
- -**示例:** - -``` -// time对应的时间为2021-01-20 02:36:25 -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}`); - }); -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/07.\351\237\263\351\242\221\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/07.\351\237\263\351\242\221\347\256\241\347\220\206.md" deleted file mode 100644 index a53ef454ba4b0ca6d8c65b9bb1e6befeb35000a7..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/07.\351\237\263\351\242\221\347\256\241\347\220\206.md" +++ /dev/null @@ -1,2092 +0,0 @@ ---- -title: 音频管理 -permalink: /pages/000d0406 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 音频管理 - -- [导入模块](#s56d19203690d4782bfc74069abb6bd71) -- [权限](#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) - - [属性](#section4947115405) - -- [AudioDeviceDescriptors](#section5181155710523) - -## 导入模块 - -``` -import audio from '@ohos.multimedia.audio'; -``` - -## 权限 - -无 - -## getAudioManager\(\): AudioManager - -获取音频管理器。 - -**返回值:** - - - - - - - - - - -

类型

-

说明

-

AudioManager

-

音频管理类。

-
- -**示例:** - -``` -var audioManager = audio.getAudioManager(); -``` - -## AudioVolumeType - -枚举,音频流类型。 - - - - - - - - - - - - - - - - -

名称

-

默认值

-

描述

-

RINGTONE

-

2

-

表示铃声。

-

MEDIA

-

3

-

表示媒体。

-
- -## DeviceFlag - -枚举,可获取的设备种类。 - - - - - - - - - - - - - - - - - - - - -

名称

-

默认值

-

描述

-

OUTPUT_DEVICES_FLAG

-

1

-

表示输出设备种类。

-

INPUT_DEVICES_FLAG

-

2

-

表示输入设备种类。

-

ALL_DEVICES_FLAG

-

3

-

表示所有设备种类。

-
- -## DeviceRole - -枚举,设备角色。 - - - - - - - - - - - - - - - - -

名称

-

默认值

-

描述

-

INPUT_DEVICE

-

1

-

输入设备角色。

-

OUTPUT_DEVICE

-

2

-

输出设备角色。

-
- -## 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

-

麦克风。

-
- -## AudioRingMode7+ - -枚举,铃声模式。 - - - - - - - - - - - - - - - - - - - - -

名称

-

默认值

-

描述

-

RINGER_MODE_SILENT

-

0

-

静音模式

-

RINGER_MODE_VIBRATE

-

1

-

震动模式

-

RINGER_MODE_NORMAL

-

2

-

响铃模式

-
- -## AudioManager - -管理音频音量和音频设备。 - -### setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void - -设置指定流的音量,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

volume

-

number

-

-

音量等级,可设置范围通过getMinVolume和getMaxVolume获取。

-

callback

-

AsyncCallback<void>

-

-

回调表示成功还是失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ - if (err) { - console.error('Failed to set the volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate a successful volume setting.'); -}) -``` - -### setVolume\(volumeType: AudioVolumeType, volume: number\): Promise - -设置指定流的音量,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

volume

-

number

-

-

音量等级,可设置范围通过getMinVolume和getMaxVolume获取。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise回调表示成功还是失败。

-
- -**示例:** - -``` -audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> - console.log('Promise returned to indicate a successful volume setting.'); -) -``` - -### getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void - -获取指定流的音量,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

callback

-

AsyncCallback<number>

-

-

回调返回音量大小。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the volume is obtained.'); -}) -``` - -### getVolume\(volumeType: AudioVolumeType\): Promise - -获取指定流的音量,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<number>

-

Promise回调返回音量大小。

-
- -**示例:** - -``` -audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the volume is obtained.' + value); -) -``` - -### getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void - -获取指定流的最小音量,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

callback

-

AsyncCallback<number>

-

-

回调返回最小音量。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the minimum volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the minimum volume is obtained.' + value); -}) -``` - -### getMinVolume\(volumeType: AudioVolumeType\): Promise - -获取指定流的最小音量,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<number>

-

Promise回调返回最小音量。

-
- -**示例:** - -``` -audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promised returned to indicate that the minimum volume is obtained.' + value); -) -``` - -### getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void - -获取指定流的最大音量,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

callback

-

AsyncCallback<number>

-

-

回调返回最大音量大小。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the maximum volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the maximum volume is obtained.' + value); -}) -``` - -### getMaxVolume\(volumeType: AudioVolumeType\): Promise - -获取指定流的最大音量,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<number>

-

Promise回调返回最大音量大小。

-
- -**示例:** - -``` -audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> - console.log('Promised returned to indicate that the maximum volume is obtained.'); -) -``` - -### mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void7+ - -设置指定音量流静音,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

mute

-

boolean

-

-

静音状态,true为静音,false为非静音。

-

callback

-

AsyncCallback<void>

-

-

回调表示成功还是失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { - if (err) { - console.error('Failed to mute the stream. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the stream is muted.'); -}) -``` - -### mute\(volumeType: AudioVolumeType, mute: boolean\): Promise7+ - -设置指定音量流静音,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

mute

-

boolean

-

-

静音状态,true为静音,false为非静音。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise回调表示成功还是失败。

-
- -**示例:** - -``` -audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => - console.log('Promise returned to indicate that the stream is muted.'); -) -``` - -### isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ - -获取指定音量流是否被静音,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

callback

-

AsyncCallback<boolean>

-

-

回调返回流静音状态,true为静音,false为非静音。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the mute status. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the mute status of the stream is obtained.' + value); -}) -``` - -### isMute\(volumeType: AudioVolumeType\): Promise7+ - -获取指定音量流是否被静音,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<boolean>

-

Promise回调返回流静音状态,true为静音,false为非静音。

-
- -**示例:** - -``` -audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the mute status of the stream is obtained.' + value); -) -``` - -### isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ - -获取指定音量流是否为活跃状态,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

callback

-

AsyncCallback<boolean>

-

-

回调返回流的活跃状态,true为活跃,false为不活跃。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the active status of the stream. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the active status of the stream is obtained.' + value); -}) -``` - -### isActive\(volumeType: AudioVolumeType\): Promise7+ - -获取指定音量流是否为活跃状态,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<boolean>

-

Promise回调返回流的活跃状态,true为活跃,false为不活跃。

-
- -**示例:** - -``` -audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the active status of the stream is obtained.' + value); -) -``` - -### setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void7+ - -设置铃声模式,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

mode

-

AudioRingMode

-

-

音频铃声模式。

-

callback

-

AsyncCallback<void>

-

-

回调返回设置成功或失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { - if (err) { - console.error('Failed to set the ringer mode.​ ${err.message}'); - return; - } - console.log('Callback invoked to indicate a successful setting of the ringer mode.'); -}) -``` - -### setRingerMode\(mode: AudioRingMode\): Promise7+ - -设置铃声模式,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

mode

-

AudioRingMode

-

-

音频铃声模式。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise回调返回设置成功或失败。

-
- -**示例:** - -``` -audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => - console.log('Promise returned to indicate a successful setting of the ringer mode.'); -) -``` - -### getRingerMode\(callback: AsyncCallback\): void7+ - -获取铃声模式,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

callback

-

AsyncCallback<AudioRingMode>

-

-

回调返回系统的铃声模式。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.getRingerMode((err, value) => { - if (err) { - console.error('Failed to obtain the ringer mode.​ ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the ringer mode is obtained.' + value); -}) -``` - -### getRingerMode\(\): Promise7+ - -获取铃声模式,使用promise方式返回异步结果。 - -**参数:** - -无 - -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<AudioRingerMode>

-

Promise回调返回系统的铃声模式。

-
- -**示例:** - -``` -audioManager.getRingerMode().then((value) => - console.log('Promise returned to indicate that the ringer mode is obtained.' + value); -) -``` - -### setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void7+ - -音频参数设置,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

被设置的音频参数的键。

-

value

-

string

-

-

被设置的音频参数的值。

-

callback

-

AsyncCallback<void>

-

-

回调返回设置成功或失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { - if (err) { - console.error('Failed to set the audio parameter. ${err.message}'); - return; - } - console.log('Callback invoked to indicate a successful setting of the audio parameter.'); -}) -``` - -### setAudioParameter\(key: string, value: string\): Promise7+ - -音频参数设置,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

被设置的音频参数的键。

-

value

-

string

-

-

被设置的音频参数的值。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise回调返回设置成功或失败。

-
- -**示例:** - -``` -audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => - console.log('Promise returned to indicate a successful setting of the audio parameter.'); -) -``` - -### getAudioParameter\(key: string, callback: AsyncCallback\): void7+ - -获取指定音频参数值,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待获取的音频参数的键。

-

callback

-

AsyncCallback<string>

-

-

回调返回获取的音频参数的值。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.getAudioParameter('PBits per sample', (err, value) => { - if (err) { - console.error('Failed to obtain the value of the audio parameter. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the value of the audio parameter is obtained.' + value); -}) -``` - -### getAudioParameter\(key: string\): Promise7+ - -获取指定音频参数值,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待获取的音频参数的键。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<string>

-

Promise回调返回获取的音频参数的值。

-
- -**示例:** - -``` -audioManager.getAudioParameter('PBits per sample').then((value) => - console.log('Promise returned to indicate that the value of the audio parameter is obtained.' + value); -) -``` - -### getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void - -获取音频设备列表,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceFlag

-

DeviceFlag

-

-

设备类型的flag。

-

callback

-

AsyncCallback<AudioDeviceDescriptors>

-

-

回调,返回设备列表。

-
- -**示例:** - -``` -audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ - if (err) { - console.error('Failed to obtain the device list. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the device list is obtained.'); -}) -``` - -### getDevices\(deviceFlag: DeviceFlag\): Promise - -获取音频设备列表,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceFlag

-

DeviceFlag

-

-

设备类型的flag。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<AudioDeviceDescriptors>

-

Promise回调返回设备列表。

-
- -**示例:** - -``` -audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> - console.log('Promise returned to indicate that the device list is obtained.'); -) -``` - -### setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void7+ - -设置设备激活状态,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceType

-

DeviceType

-

-

音频设备类型。

-

active

-

boolean

-

-

设备激活状态。

-

callback

-

AsyncCallback<void>

-

-

回调返回设置成功或失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { - if (err) { - console.error('Failed to set the active status of the device. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the device is set to the active status.'); -}) -``` - -### setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise7+ - -设置设备激活状态,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceType

-

DeviceType

-

-

音频设备类型。

-

active

-

boolean

-

-

设备激活状态。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise回调返回设置成功或失败。

-
- -**示例:** - -``` -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> - console.log('Promise returned to indicate that the device is set to the active status.'); -) -``` - -### isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void7+ - -获取指定设备激活状态,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceType

-

DeviceType

-

-

音频设备类型。

-

callback

-

AsyncCallback<boolean>

-

-

回调返回设备的激活状态。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { - if (err) { - console.error('Failed to obtain the active status of the device. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the active status of the device is obtained.'); -}) -``` - -### isDeviceActive\(deviceType: DeviceType\): Promise7+ - -获取指定设备激活状态,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceType

-

DeviceType

-

-

音频设备类型。

-
- -**返回值:** - - - - - - - - - - -

Type

-

Description

-

Promise<boolean>

-

Promise回调返回设备的激活状态。

-
- -**示例:** - -``` -audioManager.isDeviceActive(audio.DeviceType.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+ - -设置麦克风静音状态,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

mute

-

boolean

-

-

待设置的静音状态,true为静音,false为非静音。

-

callback

-

AsyncCallback<void>

-

-

回调返回设置成功或失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.setMicrophoneMute(true, (err) => { - if (err) { - console.error('Failed to mute the microphone. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the microphone is muted.'); -}) -``` - -### setMicrophoneMute\(mute: boolean\): Promise7+ - -设置麦克风静音状态,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

mute

-

boolean

-

-

待设置的静音状态,true为静音,false为非静音。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise回调返回设置成功或失败。

-
- -**示例:** - -``` -audioManager.setMicrophoneMute(true).then(() => - console.log('Promise returned to indicate that the microphone is muted.'); -) -``` - -### isMicrophoneMute\(callback: AsyncCallback\): void7+ - -获取麦克风静音状态,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

callback

-

AsyncCallback<boolean>

-

-

回调返回系统麦克风静音状态,true为静音,false为非静音。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.isMicrophoneMute((err, value) => { - if (err) { - console.error('Failed to obtain the mute status of the microphone. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the mute status of the microphone is obtained.' + value); -}) -``` - -### isMicrophoneMute\(\): Promise7+ - -获取麦克风静音状态,使用promise方式返回异步结果。 - -**参数:** - -无 - -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<boolean>

-

Promise回调返回系统麦克风静音状态,true为静音,false为非静音。

-
- -**示例:** - -``` -audioManager.isMicrophoneMute().then((value) => - console.log('Promise returned to indicate that the mute status of the microphone is obtained.', + value); -) -``` - -## AudioDeviceDescriptor - -描述音频设备。 - -### 属性 - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数型

-

可读

-

可写

-

说明

-

deviceRole

-

DeviceRole

-

-

-

设备角色。

-

deviceType

-

DeviceType

-

-

-

设备类型。

-
- -## AudioDeviceDescriptors - - - - - - - - - - -

名称

-

描述

-

设备属性数组

-

AudioDeviceDescriptor的数组,只读。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/08.\351\237\263\351\242\221\346\222\255\346\224\276.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/08.\351\237\263\351\242\221\346\222\255\346\224\276.md" deleted file mode 100644 index 0ea5fdddaa80593f3387e189fdf65a538783158c..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/08.\351\237\263\351\242\221\346\222\255\346\224\276.md" +++ /dev/null @@ -1,491 +0,0 @@ ---- -title: 音频播放 -permalink: /pages/000d0407 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 音频播放 - -- [导入模块](#s56d19203690d4782bfc74069abb6bd71) -- [权限](#section11257113618419) -- [方法](#section125675489541) -- [createAudioPlayer\(\)](#section582314017253) -- [附录](#section1933416317165) -- [AudioPlayer](#section5174142818365) - - [属性](#section4947115405) - - [play\(\)](#section964512672913) - - [pause\(\)](#section78173258296) - - [stop\(\)](#section122114334296) - - [seek\(number\)](#section1387113816298) - - [setVolume\(number\)](#section164235176552) - - [reset\(\)7+](#section1473283011356) - - [release\(\)](#section9224621145512) - - [事件](#section5453721192911) - - [play](#section87307411494) - - [pause](#section198217471590) - - [stop](#section437616531910) - - [dataLoad](#section982114219106) - - [timeUpdate](#section13687114181014) - - [volumeChange](#section139227715717) - - [finish](#section15181321181018) - - [error](#section5593132921016) - -- [AudioState](#section5181155710523) - -## 导入模块 - -``` -import audio from '@ohos.multimedia.media'; -``` - -## 权限 - -无 - -## 方法 - -## createAudioPlayer\(\) - -创建音频播放的实例来控制音频的播放。 - -**返回值:** - - - - - - - - - - -

类型

-

说明

-

AudioPlayer

-

返回AudioPlayer类实例,失败时返回null。

-
- -**示例:** - -``` -var audioplayer = audio.createAudioPlayer(); -``` - -## 附录 - -## AudioPlayer - -音频播放器。 - -### 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数类型

-

可读

-

可写

-

说明

-

src

-

string

-

-

-

音频媒体URI。

-

loop

-

boolean

-

-

-

音频循环播放属性。

-

currentTime

-

number

-

-

-

音频的当前播放阶段。

-

duration

-

number

-

-

-

音频播放的时长。

-

state

-

AudioState

-

-

-

音频播放的状态。

-
- -### play\(\) - -开始播放音频资源。 - -**示例:** - -``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.info('Error returned in the prepare() callback.'); - return; - } - console.info('Start to play the audio.'); - audioplayer.play(); -}; - -audioplayer.on('play', (err, action) => { - if (err) { - console.info('Error returned in the play() callback.'); - return; - } - console.info('Succeeded in playing the audio.'); -}; -audioplayer.src = 'common/mydream.mp3'; -``` - -### pause\(\) - -暂停播放音频资源。 - -**示例:** - -``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.info('Error returned in the prepare() callback.'); - return; - } - console.info('Start to play the audio.'); - audioplayer.play(); -} -audioplayer.on('play', (err, action) => { - if (err) { - console.info('Error returned in the play() callback.'); - return; - } - console.info('Start to pause audio playback.'); - audioplayer.pause(); -}; -audioplayer.on('pause', (err, action) => { - if (err) { - console.info('Error returned in the pause() callback.'); - return; - } - console.info('Succeeded in pausing audio playback.'); -}; -audioplayer.src = 'common/mydream.mp3'; -``` - -### stop\(\) - -停止播放音频资源。 - -**示例:** - -``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.info('Error returned in the prepare() callback.'); - return; - } - console.info('Start to play the audio.'); - audioplayer.play(); -}; -audioplayer.on('play', (err, action) => { - if (err) { - console.info('Error returned in the play() callback.'); - return; - } - console.info('Start to pause audio playback.'); - audioplayer.pause(); -}; -audioplayer.on('stop', (err, action) => { - if (err) { - console.info('Error returned in the stop() callback.'); - return; - } - console.info('Succeeded in stopping audio playback.'); -}; -audioplayer.src = 'common/mydream.mp3'; -``` - -### seek\(number\) - -跳转到指定播放位置。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

timeMs

-

number

-

-

想要跳转到的时间点。

-
- -**示例:** - -``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.info('Error returned in the prepare() callback.'); - return; - } - console.info('Start to play the audio.'); - audioplayer.play(); -}; -audioplayer.on('play', (err, action) => { - if (err) { - console.info('Error returned in the play() callback.'); - return; - } - console.info('Succeeded in playing the audio.') -}; -audioplayer.on('timeUpdate', (seekTime, action) => { - console.info('Seek time returned in the seek() callback: ' + seekTime); - var newTime = audioplayer.currenTime; - if(newTime == 30000) { - console.info('Seek succeeded. New time: ' + newTime); - } else { - console.info('Seek failed.'); - } -}; -audioplayer.src = 'common/mydream.mp3'; -audioplayer.seek(30000); -``` - -### setVolume\(number\) - -设置音量。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

vol

-

number

-

-

想要设置的音量值(0-1)。

-
- -**示例:** - -``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.error('Error returned in the prepare() callback.'); - return; - } - console.info('Start to play the audio.'); - audioplayer.play(); -}; -audioplayer.on('play', (err, action) => { - if (err) { - console.error('Error returned in the play() callback.'); - return; - } - console.info('Succeeded in playing the audio.') -}; -audioplayer.on('volumeChange', (err, action) => { - if (err) { - console.error('Error returned in the setVolume() callback.'); - return; - } - console.info('Playback volume changed.'); -}; -audioplayer.src = 'common/mydream.mp3'; -audioplayer.setVolume(0.5); -``` - -### reset\(\)7+ - -切换播放音频资源。 - -**示例:** - -``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.error('Error returned in the prepare() callback.'); - return; - } - console.info('Start to reset audio playback.'); - audioplayer.reset(); -}; -audioplayer.on('reset', (err, action) => { - if (err) { - console.error('Error returned in the reset() callback.'); - return; - } - console.info('Reset succeeded.'); -}; -audioplayer.src = 'common/mydream.mp3'; -``` - -### release\(\) - -释放音频资源。 - -**示例:** - -``` -audioplay.release(); -``` - -### 事件 - -### play - -在调用play方法后的回调事件。 - -### pause - -在调用pause方法后的回调事件。 - -### stop - -在调用stop方法后的回调事件。 - -### dataLoad - -在音频数据加载后的回调事件。 - -### timeUpdate - -在播放时间改变后的回调事件。 - -### volumeChange - -在播放音量改变后的回调事件。 - -### finish - -在播放完成后的回调事件。 - -### error - -在播放错误时的回调事件。 - - - - - - - - - - - - -

参数名

-

类型

-

说明

-

callback

-

ErrorCallback

-

错误事件的回调函数。

-
- -## AudioState - -音频播放的状态机。 - - - - - - - - - - - - - - - - - - - -

名称

-

描述

-

idle

-

音频播放空闲。

-

playing

-

音频正在播放。

-

paused

-

音频暂停播放

-

stopped

-

音频播放停止。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/09.\350\256\276\345\244\207\344\277\241\346\201\257.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/09.\350\256\276\345\244\207\344\277\241\346\201\257.md" deleted file mode 100644 index 7aa5b6ed34caeb5b0766d57f5d45cc86007d714e..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/09.\350\256\276\345\244\207\344\277\241\346\201\257.md" +++ /dev/null @@ -1,367 +0,0 @@ ---- -title: 设备信息 -permalink: /pages/000d0408 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 设备信息 - -- [导入模块](#zh-cn_topic_0000001139910745_section370mcpsimp) -- [权限列表](#zh-cn_topic_0000001139910745_section373mcpsimp) -- [属性](#zh-cn_topic_0000001139910745_section62871841172112) - -## 导入模块 - -``` -import deviceinfo from '@ohos.deviceinfo' -``` - -## 权限列表 - -无 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数类型

-

可读

-

可写

-

描述

-

deviceType

-

string

-

-

-

设备类型。

-

manufacture

-

string

-

-

-

设备厂家名称。

-

brand

-

string

-

-

-

设备品牌名称。

-

marketName

-

string

-

-

-

外部产品系列。

-

productSeries

-

string

-

-

-

产品系列。

-

productModel

-

string

-

-

-

认证型号。

-

softwareModel

-

string

-

-

-

内部软件子型号。

-

hardwareModel

-

string

-

-

-

硬件版本号。

-

hardwareProfile

-

string

-

-

-

硬件Profile。

-

serial

-

string

-

-

-

设备序列号。

-

bootloaderVersion

-

string

-

-

-

Bootloader版本号。

-

abiList

-

string

-

-

-

应用二进制接口(Abi)列表。

-

securityPatchTag

-

string

-

-

-

安全补丁级别。

-

displayVersion

-

string

-

-

-

产品版本。

-

incrementalVersion

-

string

-

-

-

差异版本号。

-

osReleaseType

-

string

-

-

-

系统的发布类型,取值为:

-
  • Canary:面向特定开发者发布的早期预览版本,不承诺API稳定性。
  • Beta:面向开发者公开发布的Beta版本,不承诺API稳定性。
  • Release:面向开发者公开发布的正式版本,承诺API稳定性。
-

osFullName

-

string

-

-

-

系统版本。

-

majorVersion

-

number

-

-

-

Major版本号,随主版本更新增加。

-

seniorVersion

-

number

-

-

-

Senior版本号,随局部架构、重大特性增加。

-

featureVersion

-

number

-

-

-

Feature版本号,标识规划的新特性版本。

-

buildVersion

-

number

-

-

-

Build版本号,标识编译构建的版本号。

-

sdkApiVersion

-

number

-

-

-

系统软件API版本。

-

firstApiVersion

-

number

-

-

-

首个版本系统软件API版本。

-

versionId

-

string

-

-

-

版本ID。

-

buildType

-

string

-

-

-

构建类型。

-

buildUser

-

string

-

-

-

构建用户。

-

buildHost

-

string

-

-

-

构建主机。

-

buildTime

-

string

-

-

-

构建时间。

-

buildRootHash

-

string

-

-

-

构建版本Hash。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/10.\347\263\273\347\273\237\345\261\236\346\200\247.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/10.\347\263\273\347\273\237\345\261\236\346\200\247.md" deleted file mode 100644 index c5d87e06f2020e80d6c9df6b6f2ccf30da00f1c1..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/10.\347\263\273\347\273\237\345\261\236\346\200\247.md" +++ /dev/null @@ -1,486 +0,0 @@ ---- -title: 系统属性 -permalink: /pages/000d0409 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 系统属性 - -- [导入模块](#zh-cn_topic_0000001094819718_section370mcpsimp) -- [权限列表](#zh-cn_topic_0000001094819718_section373mcpsimp) -- [方法](#zh-cn_topic_0000001094819718_section1319529172015) -- [getSync\(key: string, def?: string\)](#zh-cn_topic_0000001094819718_section3381192816421) -- [get\(key: string, callback: AsyncCallback\)](#zh-cn_topic_0000001094819718_section19655131534912) -- [get\(key: string, def: string, callback: AsyncCallback\)](#zh-cn_topic_0000001094819718_section045334733915) -- [get\(key: string, def?: string\)](#zh-cn_topic_0000001094819718_section10288162818402) -- [setSync\(key: string, value: string\)](#zh-cn_topic_0000001094819718_section63102185493) -- [set\(key: string, value: string, callback: AsyncCallback\)](#zh-cn_topic_0000001094819718_section18770184911197) -- [set\(key: string, def?: string\)](#zh-cn_topic_0000001094819718_section187724496193) - -## 导入模块 - -``` -import parameter from '@ohos.systemparameter' -``` - -## 权限列表 - -无 - -## 方法 - -## getSync\(key: string, def?: string\) - -获取系统属性Key对应的值。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待查询的系统属性Key。

-

def

-

string

-

-

默认值。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

string

-

系统属性值,若key不存在,返回默认值。若未指定默认值,返回空字符串。

-
- -**示例:** - -``` -try { - var info = parameter.getSync("test.parameter.key"); - console.log(JSON.stringify(info)); -}catch(e){ - console.log("getSync unexpected error: " + e); -} -``` - -## get\(key: string, callback: AsyncCallback\) - -获取系统属性Key对应的值。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待查询的系统属性Key。

-

callback

-

AsyncCallback<string>

-

-

回调函数。

-
- -**返回值:** - -无 - -**示例:** - -``` -try { - parameter.get("test.parameter.key", function (err, data) { - if (err == undefined) { - console.log("get test.parameter.key value success:" + data) - } else { - console.log(" get test.parameter.key value err:" + err.code) - }}); -}catch(e){ - console.log("get unexpected error: " + e); -} -``` - -## get\(key: string, def: string, callback: AsyncCallback\) - -获取系统属性Key对应的值。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待查询的系统属性Key。

-

def

-

string

-

-

默认值。

-

callback

-

AsyncCallback<string>

-

-

回调函数。

-
- -**返回值:** - -无 - -**示例:** - -``` -try { - parameter.get("test.parameter.key", "default", function (err, data) { - if (err == undefined) { - console.log("get test.parameter.key value success:" + data) - } else { - console.log(" get test.parameter.key value err:" + err.code) - } - }); -}catch(e){ - console.log("get unexpected error:" + e) -} -``` - -## get\(key: string, def?: string\) - -获取系统属性Key对应的值。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待查询的系统属性Key。

-

def

-

string

-

-

默认值。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<string>

-

Promise示例,用于异步获取结果。

-
- -**示例:** - -``` -try { - var p = parameter.get("test.parameter.key"); - p.then(function (value) { - console.log("get test.parameter.key success: " + value); - }).catch(function (err) { - console.log("get test.parameter.key error: " + err.code); - }); -}catch(e){ - console.log("get unexpected error: " + e); -} -``` - -## setSync\(key: string, value: string\) - -设置系统属性Key对应的值。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待设置的系统属性Key。

-

value

-

string

-

-

待设置的系统属性值。

-
- -**返回值:** - -无 - -**示例:** - -``` -try { - parameter.setSync("test.parameter.key", "default"); -}catch(e){ - console.log("set unexpected error: " + e); -} -``` - -## set\(key: string, value: string, callback: AsyncCallback\) - -设置系统属性Key对应的值。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待查询的系统属性Key。

-

def

-

string

-

-

默认值。

-

callback

-

AsyncCallback<void>

-

-

回调函数。

-
- -**返回值:** - -无 - -**示例:** - -``` -try { - parameter.set("test.parameter.key", "testValue", function (err, data) { - if (err == undefined) { - console.log("set test.parameter.key value success :" + data) - } else { - console.log("set test.parameter.key value err:" + err.code) - }}); -}catch(e){ - console.log("set unexpected error: " + e); -} -``` - -## set\(key: string, def?: string\) - -设置系统属性Key对应的值。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待查询的系统属性Key。

-

def

-

string

-

-

默认值。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<string>

-

Promise示例,用于异步获取结果。

-
- -**示例:** - -``` -try { - var p = para.set("test.parameter.key", "testValue"); - p.then(function (value) { - console.log("set test.parameter.key success: " + value); - }).catch(function (err) { - console.log(" set test.parameter.key error: " + err.code); - }); -}catch(e){ - console.log("set unexpected error: " + e); -} -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/11.\347\224\265\346\261\240\345\222\214\345\205\205\347\224\265\345\261\236\346\200\247.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/11.\347\224\265\346\261\240\345\222\214\345\205\205\347\224\265\345\261\236\346\200\247.md" deleted file mode 100644 index 980a29d533b6d1d8a2b26cf80e5cbaee35f39df0..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/11.\347\224\265\346\261\240\345\222\214\345\205\205\347\224\265\345\261\236\346\200\247.md" +++ /dev/null @@ -1,264 +0,0 @@ ---- -title: 电池和充电属性 -permalink: /pages/000d040a -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 电池和充电属性 - -- [导入模块](#zh-cn_topic_0000001100730486_section199443271307) -- [BatteryInfo](#zh-cn_topic_0000001100730486_section1853612361618) -- [枚举列表](#zh-cn_topic_0000001100730486_section14572171519166) -- [BatteryPluggedType](#zh-cn_topic_0000001100730486_section1861134715488) -- [BatteryChargeState](#zh-cn_topic_0000001100730486_section629045815408) -- [BatteryHealthState](#zh-cn_topic_0000001100730486_section1636311513419) - -## 导入模块 - -``` -import batteryInfo from '@ohos.batteryinfo.d.ts' -``` - -## BatteryInfo - -描述电池信息。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

读写属性

-

类型

-

描述

-

batterySOC

-

只读

-

number

-

表示当前设备剩余电池容量。

-

chargingStatus

-

只读

-

BatteryChargeState

-

表示当前设备电池的充电状态。

-

healthStatus

-

只读

-

BatteryHealthState

-

表示当前设备电池的健康状态。

-

pluggedType

-

只读

-

BatteryPluggedType

-

表示当前设备连接的充电器类型。

-

voltage

-

只读

-

number

-

表示当前设备电池的电压。

-

technology

-

只读

-

string

-

表示当前设备电池的技术型号。

-

batteryTemperature

-

只读

-

number

-

表示当前设备电池的温度。

-
- -**示例**: - -``` -import batteryInfo from '@ohos.batteryInfo'; -var batterySoc = batteryInfo.batterySOC; -``` - -## 枚举列表 - -## BatteryPluggedType - -用于表示连接的充电器类型。 - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

默认值

-

描述

-

NONE

-

0

-

表示连接充电器类型未知。

-

AC

-

1

-

表示连接的充电器类型为交流充电器。

-

USB

-

2

-

表示连接的充电器类型为USB。

-

WIRELESS

-

3

-

表示连接的充电器类型为无线充电器。

-
- -## BatteryChargeState - -用于表示电池充电状态。 - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

默认值

-

描述

-

NONE

-

0

-

表示电池充电状态未知。

-

ENABLE

-

1

-

表示电池充电状态为使能状态。

-

DISABLE

-

2

-

表示电池充电状态为停止状态。

-

FULL

-

3

-

表示电池充电状态为已充满状态。

-
- -## BatteryHealthState - -用于表示电池的健康状态。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

默认值

-

描述

-

UNKNOWN

-

0

-

表示电池健康状态未知。

-

GOOD

-

1

-

表示电池健康状态为正常。

-

OVERHEAT

-

2

-

表示电池健康状态为过热。

-

OVERVOLTAGE

-

3

-

表示电池健康状态为过压。

-

COLD

-

4

-

表示电池健康状态为低温。

-

DEAD

-

5

-

表示电池健康状态为僵死状态。

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/12.\350\256\276\347\275\256\347\263\273\347\273\237\345\261\217\345\271\225\344\272\256\345\272\246.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/12.\350\256\276\347\275\256\347\263\273\347\273\237\345\261\217\345\271\225\344\272\256\345\272\246.md" deleted file mode 100644 index 8c3238763a7f412aaf358925259c80bce3daf09b..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/12.\350\256\276\347\275\256\347\263\273\347\273\237\345\261\217\345\271\225\344\272\256\345\272\246.md" +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: 设置系统屏幕亮度 -permalink: /pages/000d040b -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 设置系统屏幕亮度 - -- [导入模块](#zh-cn_topic_0000001101127828_s56d19203690d4782bfc74069abb6bd71) -- [方法](#zh-cn_topic_0000001101127828_section1998783153219) -- [setValue\(value: number\)](#zh-cn_topic_0000001101127828_section1853612361618) - -## 导入模块 - -``` -import brightness from '@ohos.brightness.d.ts'. -``` - -## 方法 - -## setValue\(value: number\) - -设置系统的屏幕亮度。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

value

-

number

-

-

亮度的值(0~255)

-
- -**返回值:** - -无 - -**示例:** - -``` -import brightness from '@ohos.brightness.d.ts' -brightness.setValue(128); -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/13.\345\233\275\351\231\205\345\214\226.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/13.\345\233\275\351\231\205\345\214\226.md" deleted file mode 100644 index f94a5de4e4ef4cf84ca5e470a36b22ac0597bbb2..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/13.\345\233\275\351\231\205\345\214\226.md" +++ /dev/null @@ -1,235 +0,0 @@ ---- -title: 国际化 -permalink: /pages/000d040c -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 国际化 - -- [导入模块](#zh-cn_topic_0000001103315838_s56d19203690d4782bfc74069abb6bd71) -- [权限](#zh-cn_topic_0000001103315838_section11257113618419) -- [类](#zh-cn_topic_0000001103315838_section1956131218111) -- [Locale](#zh-cn_topic_0000001103315838_section189341937163212) - - [属性](#zh-cn_topic_0000001103315838_section23751576140) - - [Locale](#zh-cn_topic_0000001103315838_section1410593619146) - -- [DateTimeFormat](#zh-cn_topic_0000001103315838_section88061769522) - - [DateTimeFormat](#zh-cn_topic_0000001103315838_section28081362523) - - [format](#zh-cn_topic_0000001103315838_section917151185514) - - -## 导入模块 - -``` -import Intl from '@ohos.intl'; -``` - -## 权限 - -无 - -## 类 - -## Locale - -提供用于获取区域信息的接口。 - -### 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数类型

-

可读

-

可写

-

说明

-

language

-

string

-

-

-

区域关联的语言。

-

script

-

string

-

-

-

区域关联的文字。

-

region

-

string

-

-

-

区域关联的地区

-

baseName

-

string

-

-

-

以完整区域字符串的子字符串形式返回有关区域的基本核心信息。

-
- -### Locale - -构造方法,用于构造Locale对象 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

locale

-

string

-

-

表示区域信息的字符串,必须包含语言,可选择性包含文字与地区

-
- -**示例:** - -``` -var enLatnGB = new Intl.Locale("en-Latn-GB"); -var enGB = new Intl.Locale("en-GB"); -var en = new Intl.Locale("en"); -``` - -## DateTimeFormat - -提供用于格式化日期字符串的接口。 - -### DateTimeFormat - -构造方法,用于构造DateTimeFormat对象 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

locale

-

string

-

-

用于创建DateTimeFormat对象的表示区域信息的字符串,必须包含语言,可选择性包含文字与地区。

-
- -**示例:** - -``` -var dateFmt = new Intl.DateTimeFormat("en-Latn-GB"); -``` - -### format - -获取格式化的日期字符串。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

date

-

Date

-

-

要格式化的日期对象。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

string

-

返回根据区域格式化的日期字符串。

-
- -**示例:** - -``` -var date = new Date(1995, 11, 25, 3, 14, 0); -var datefmt = new Intl.DateTimeFormat("en-Latn-GB"); -var result = datefmt.format(date); // 返回“Dec 25, 1995” -``` - diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/14.\350\265\204\346\272\220\347\256\241\347\220\206.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/14.\350\265\204\346\272\220\347\256\241\347\220\206.md" deleted file mode 100644 index 867337abf50d4db6b6402ff0a5ec96693604f4fb..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/14.\350\265\204\346\272\220\347\256\241\347\220\206.md" +++ /dev/null @@ -1,1127 +0,0 @@ ---- -title: 资源管理 -permalink: /pages/000d040d -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 资源管理 - -- [导入模块](#zh-cn_topic_0000001150318493_s56d19203690d4782bfc74069abb6bd71) -- [权限](#zh-cn_topic_0000001150318493_section11257113618419) -- [方法](#zh-cn_topic_0000001150318493_section125675489541) -- [getResourceManager](#zh-cn_topic_0000001150318493_section192192415554) -- [getResourceManager](#zh-cn_topic_0000001150318493_section46989284018) -- [getResourceManager](#zh-cn_topic_0000001150318493_section0543541673) -- [getResourceManager](#zh-cn_topic_0000001150318493_section1816951410716) -- [枚举](#zh-cn_topic_0000001150318493_section1978842154715) -- [Direction](#zh-cn_topic_0000001150318493_section099619567453) -- [DeviceType](#zh-cn_topic_0000001150318493_section4734636131914) -- [ScreenDensity](#zh-cn_topic_0000001150318493_section7331173812197) -- [附录](#zh-cn_topic_0000001150318493_section1933416317165) -- [AsyncCallback](#zh-cn_topic_0000001150318493_section256244135613) -- [Configuration](#zh-cn_topic_0000001150318493_section12882825611) - - [属性](#zh-cn_topic_0000001150318493_section1059684317312) - -- [DeviceCapability](#zh-cn_topic_0000001150318493_section7200123494410) - - [属性](#zh-cn_topic_0000001150318493_section2201153419440) - -- [ResourceManager](#zh-cn_topic_0000001150318493_section137771134135415) - - [getString](#zh-cn_topic_0000001150318493_section9779153419548) - - [getString](#zh-cn_topic_0000001150318493_section159261924165411) - - [getStringArray](#zh-cn_topic_0000001150318493_section4490132775420) - - [getStringArray](#zh-cn_topic_0000001150318493_section1992322017541) - - [getMedia](#zh-cn_topic_0000001150318493_section6710152513409) - - [getMedia](#zh-cn_topic_0000001150318493_section6711152517409) - - [getMediaBase64](#zh-cn_topic_0000001150318493_section11402326194315) - - [getMediaBase64](#zh-cn_topic_0000001150318493_section6404726124312) - - [getConfiguration](#zh-cn_topic_0000001150318493_section8123152874015) - - [getConfiguration](#zh-cn_topic_0000001150318493_section312515284406) - - [getDeviceCapability](#zh-cn_topic_0000001150318493_section104951210135017) - - [getDeviceCapability](#zh-cn_topic_0000001150318493_section114961410115013) - - [getPluralString](#zh-cn_topic_0000001150318493_section1549163064013) - - [getPluralString](#zh-cn_topic_0000001150318493_section165183015405) - - -## 导入模块 - -``` -import resmgr from '@ohos.resmgr'; -``` - -## 权限 - -无 - -## 方法 - -## getResourceManager - -获取当前应用的资源管理对象 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

callback

-

AsyncCallback<ResourceManager>

-

-

callback方式返回ResourceManager对象

-
- -**返回值:** - -无 - -**示例:** - -``` -resmgr.getResourceManager((error, mgr) => { - // callback - mgr.getString(0x1000000, (error, value) => { - if (error != null) { - console.log(value); - } else { - console.log(value); - } - }); - - // promise - mgr.getString(0x1000000).then(value => { - console.log(value); - }).catch(error => { - console.log("getstring promise " + error); - }); -} - -``` - -## getResourceManager - -获取指定应用的资源管理对象。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

bundleName

-

string

-

-

指定应用的Bundle名称

-

callback

-

AsyncCallback<ResourceManager>

-

-

callback方式返回ResourceManager对象

-
- -**返回值:** - -无 - -**示例:** - -``` -resmgr.getResourceManager("com.example.myapplication", (error, mgr) => { -} -``` - -## getResourceManager - -获取当前应用的资源管理对象。 - -**参数:** - -无 - -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<ResourceManager>

-

Promise方式返回的资源管理对象

-
- -**示例:** - -``` -resmgr.getResourceManager().then(mgr => { - // callback - mgr.getString(0x1000000, (error, value) => { - if (error != null) { - console.log(value); - } else { - console.log(value); - } - }); - - // promise - mgr.getString(0x1000000).then(value => { - console.log(value); - }).catch(error => { - console.log("getstring promise " + error); - }); -}).catch(error => { - -}); -``` - -## getResourceManager - -获取指定应用的资源管理对象。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

bundleName

-

string

-

-

指定应用的Bundle名称

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<ResourceManager>

-

Promise方式返回的资源管理对象

-
- -**示例:** - -``` -resmgr.getResourceManager("com.example.myapplication").then(mgr => { - -}).catch(error => { - -}); -``` - -## 枚举 - -## Direction - -用于表示设备屏幕方向。 - - - - - - - - - - - - - - - - -

名称

-

默认值

-

说明

-

DIRECTION_VERTICAL

-

0

-

Indicates the vertical direction.

-

DIRECTION_HORIZONTAL

-

1

-

Indicates the horizontal direction.

-
- -## DeviceType - -用于表示当前设备类型。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

默认值

-

说明

-

DEVICE_TYPE_PHONE

-

0x00

-

Indicates a smartphone.

-

DEVICE_TYPE_TABLET

-

0x01

-

Indicates a tablet.

-

DEVICE_TYPE_CAR

-

0x02

-

Indicates a car.

-

DEVICE_TYPE_PC

-

0x03

-

Indicates a PC.

-

DEVICE_TYPE_TV

-

0x04

-

Indicates a smart TV.

-

DEVICE_TYPE_WEARABLE

-

0x06

-

Indicates a wearable device.

-
- -## ScreenDensity - -用于表示当前设备屏幕密度。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

默认值

-

说明

-

SCREEN_SDPI

-

120

-

Indicates small screen density.

-

SCREEN_MDPI

-

160

-

Indicates medium screen density.

-

SCREEN_LDPI

-

240

-

Indicates large screen density.

-

SCREEN_XLDPI

-

320

-

Indicates extra-large screen density.

-

SCREEN_XXLDPI

-

480

-

Indicates extra-extra-large screen density.

-

SCREEN_XXXLDPI

-

640

-

Indicates extra-extra-extra-large screen density.

-
- -## 附录 - -## AsyncCallback - - - - - - - - - - - - - - - - - - - -

名称

-

参数类型

-

必填

-

说明

-

error

-

Error

-

-

执行不正常时返回错误对象,正常时无值

-

data

-

T

-

-

执行正常时返回T类型的对象,不正常时无值

-
- -## Configuration - -表示当前设备的状态。 - -### 属性 - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数类型

-

可读

-

可写

-

说明

-

direction

-

Direction

-

-

-

当前设备屏幕方向

-

locale

-

string

-

-

-

当前系统语言,如zh-Hans-CN

-
- -## DeviceCapability - -表示设备支持的。 - -### 属性 - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数类型

-

可读

-

可写

-

说明

-

screenDensity

-

ScreenDensity

-

-

-

当前设备屏幕密度

-

deviceType

-

DeviceType

-

-

-

当前设备类型

-
- -## ResourceManager - -提供访问应用资源的能力。 - -### getString - -callback接口,用户获取指定资源ID对应的字符串。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

resId

-

number

-

-

资源ID值

-

callback

-

AsyncCallback<string>

-

-

异步回调,用于返回获取的字符串

-
- -**返回值:** - -无 - -### getString - -promise接口,用户获取指定资源ID对应的字符串。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

resId

-

number

-

-

资源ID值

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<string>

-

资源ID值对应的字符串

-
- -### getStringArray - -callback接口,用户获取指定资源ID对应的字符串数组。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

resId

-

number

-

-

资源ID值

-

callback

-

AsyncCallback<Array<string>>

-

-

异步回调,用于返回获取的字符串数组

-
- -**返回值:** - -无 - -### getStringArray - -Promise接口,用户获取指定资源ID对应的字符串数组。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

resId

-

number

-

-

资源ID值

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<Array<string>>

-

资源ID值对应的字符串数组

-
- -### getMedia - -callback接口,用户获取指定资源ID对应的媒体文件内容。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

resId

-

number

-

-

资源ID值

-

callback

-

AsyncCallback<Array<Uint8Array>>

-

-

异步回调,用于返回获取的媒体文件内容

-
- -**返回值:** - -无 - -### getMedia - -Promise接口,用户获取指定资源ID对应的媒体文件内容。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

resId

-

number

-

-

资源ID值

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<Array<Uint8Array>>

-

资源ID值对应的媒体文件内容

-
- -### getMediaBase64 - -callback接口,用户获取指定资源ID对应的图片资源Base64编码。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

resId

-

number

-

-

资源ID值

-

callback

-

AsyncCallback<string>

-

-

异步回调,用于返回获取的图片资源Base64编码

-
- -**返回值:** - -无 - -### getMediaBase64 - -Promise接口,用户获取指定资源ID对应的图片资源Base64编码。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

resId

-

number

-

-

资源ID值

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<string>

-

资源ID值对应的图片资源Base64编码

-
- -### getConfiguration - -callback接口,用户获取设备的Configuration。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

callback

-

AsyncCallback<Configuration>

-

-

异步回调,用于返回设备的Configuration

-
- -**返回值:** - -无 - -### getConfiguration - -Promise接口,用户获取设备的Configuration。 - -**参数:** - -无 - -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<Configuration>

-

设备的Configuration

-
- -### getDeviceCapability - -callback接口,用户获取设备的DeviceCapability。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

callback

-

AsyncCallback<DeviceCapability>

-

-

异步回调,用于返回设备的DeviceCapability

-
- -**返回值:** - -无 - -### getDeviceCapability - -Promise接口,用户获取设备的DeviceCapability。 - -**参数:** - -无 - -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<DeviceCapability>

-

设备的DeviceCapability

-
- -**返回值:** - -无 - -### getPluralString - -callback接口,根据提供的数量获取对应ID字符串表示的单复数字符串。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

resId

-

number

-

-

资源ID值

-

num:

-

number

-

-

数量值

-

callback

-

AsyncCallback<string>

-

-

异步回调,返回根据提供的数量获取对应ID字符串表示的单复数字符串

-
- -**返回值:** - -无 - -### getPluralString - -Promise接口,根据提供的数量获取对应ID字符串表示的单复数字符串。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

resId

-

number

-

-

资源ID值

-

num:

-

number

-

-

数量值

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<string>

-

根据提供的数量获取对应ID字符串表示的单复数字符串

-
- diff --git "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/15.\345\215\207\347\272\247.md" "b/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/15.\345\215\207\347\272\247.md" deleted file mode 100644 index 85780a4b3e123f5ccdbf5d540e1716fb4a3209e1..0000000000000000000000000000000000000000 --- "a/website/docs/01.\346\226\207\346\241\243/14.\345\272\224\347\224\250\345\274\200\345\217\221-JS\345\217\202\350\200\203\350\247\204\350\214\203/05.\346\216\245\345\217\243/15.\345\215\207\347\272\247.md" +++ /dev/null @@ -1,335 +0,0 @@ ---- -title: 升级 -permalink: /pages/000d040e -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2021-12-30 12:57:47 ---- -# 升级 - -- [导入模块](#zh-cn_topic_0000001149710363_section749mcpsimp) -- [权限列表](#zh-cn_topic_0000001149710363_section752mcpsimp) -- [updater.getNewVersionInfo\(\)](#zh-cn_topic_0000001149710363_section755mcpsimp) -- [updater.checkNewVersion\(\)](#zh-cn_topic_0000001149710363_section817mcpsimp) -- [updater.download\(\)](#zh-cn_topic_0000001149710363_section879mcpsimp) -- [updater.upgrade\(\)](#zh-cn_topic_0000001149710363_section894mcpsimp) -- [updater.setUpdatePolicy\(\)](#zh-cn_topic_0000001149710363_section909mcpsimp) -- [updater.getUpdatePolicy\(\)](#zh-cn_topic_0000001149710363_section985mcpsimp) - -## 导入模块 - -``` -import client from 'libupdateclient.z.so' -``` - -## 权限列表 - -无。 - -## updater.getNewVersionInfo\(\) - -获取新版本信息。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

callback

-

Function

-

-

AsyncCallback<NewVersionInfo>

-
- -**返回值:** - - - - - - - - - - - - -

参数名

-

类型

-

说明

-

info

-

NewVersionInfo

-

新版本信息

-
- -**示例:** - -``` -updater.getNewVersionInfo(info => { -console.log("getNewVersionInfo sucess " + info.status); -console.log(`info versionName = ` + info.result[0].versionName); -console.log(`info versionCode = ` + info.result[0].versionCode); -console.log(`info verifyInfo = ` + info.result[0].verifyInfo); -)}; -``` - -## updater.checkNewVersion\(\) - -检查新版本。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

callback

-

Function

-

-

AsyncCallback<NewVersionInfo>

-
- -**返回值:** - - - - - - - - - - - - -

参数名

-

类型

-

说明

-

info

-

NewVersionInfo

-

新版本信息

-
- -**示例:** - -``` -updater.checkNewVersion(info => { -console.log("checkNewVersion sucess " + info.status); -console.log(`info versionName = ` + info.result[0].versionName); -console.log(`info versionCode = ` + info.result[0].versionCode); -console.log(`info verifyInfo = ` + info.result[0].verifyInfo); -)}; -``` - -## updater.download\(\) - -下载新版本,并监听下载进程。 - -**参数:** - -无 - -**返回值:** - -无 - -**示例:** - -``` -updater.on("downloadProgress", progress => { -console.log("downloadProgress on" + progress); -console.log(`downloadProgress status: ` + progress.status); -console.log(`downloadProgress percent: ` + progress.percent); -)}; -updater.download(); -``` - -## updater.upgrade\(\) - -启动升级。 - -**参数:** - -无 - -**返回值:** - -无 - -**示例:** - -``` -updater.on("upgradeProgress", progress => { -console.log("downloadProgress on" + progress); -console.log(`downloadProgress status: ` + progress.status); -console.log(`downloadProgress percent: ` + progress.percent); -)}; -updater.upgrade(); -``` - -## updater.setUpdatePolicy\(\) - -设置升级策略。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

policy

-

UpdatePolicy

-

-

设置策略

-

callback

-

Function

-

-

AsyncCallback<number>

-
- -**返回值:** - - - - - - - - - - - - -

参数名

-

类型

-

说明

-

result

-

number

-
  
- -**示例:** - -``` -// 设置策略 -let policy = { -autoDownload: false, -autoDownloadNet: true, -mode: 2, -autoUpgradeInterval: [ 2, 3 ], -autoUpgradeCondition: 2 -} -updater.setUpdatePolicy(policy, function(result) { -console.log("setUpdatePolicy ", result) -} -); -``` - -## updater.getUpdatePolicy\(\) - -查看升级策略。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

callback

-

Function

-

-

AsyncCallback<UpdatePolicy>

-
- -**返回值:** - - - - - - - - - - - - -

参数名

-

类型

-

说明

-

policy

-

UpdatePolicy

-

策略

-
- -**示例:** - -``` -updater.getUpdatePolicy(policy => { -console.log("getUpdatePolicy sucess", policy) -}); -``` - diff --git a/website/docs/_posts/application-dev/ability/common-event.md b/website/docs/_posts/application-dev/ability/common-event.md new file mode 100644 index 0000000000000000000000000000000000000000..547095ac82e3c3b116eb90210e8a3a39c5c543b9 --- /dev/null +++ b/website/docs/_posts/application-dev/ability/common-event.md @@ -0,0 +1,538 @@ +--- +title: common-event.md +permalink: /pages/extra/d9a3ee/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:33 +--- +# CommonEvent开发指南 + +#### 基本概念 + +OpenHarmony通过CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力。 + +公共事件可分为系统公共事件和自定义公共事件。 + +- 系统公共事件:系统将收集到的事件信息,根据系统策略发送给订阅该事件的用户程序。 例如:系统关键服务发布的系统事件(例如:hap安装,更新,卸载等)。 + +- 自定义公共事件:应用自定义一些公共事件用来实现跨应用的事件通信能力。 + +每个应用都可以按需订阅公共事件,订阅成功且公共事件发布,系统会把其发送给应用。这些公共事件可能来自系统、其他应用和应用自身。 + + + +#### 接口列表 + +| API | 手机 | 平板 | 智慧屏 | 智能穿戴 | 轻量级智能穿戴 | +| ------------------------------------------------------------ | ---- | ---- | ------ | -------- | -------------- | +| CommonEvent.publish(event: string, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | +| CommonEvent.publish(event: string, options: CommonEventPublishData, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | +| CommonEvent.createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | +| CommonEvent.createSubscriber(subscribeInfo: CommonEventSubscribeInfo) | 支持 | 支持 | 支持 | 支持 | 不支持 | +| CommonEvent.subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | +| CommonEvent.unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback) | 支持 | 支持 | 支持 | 支持 | 不支持 | + + + +#### 导入模块 + +```js +import CommonEvent from '@ohos.commonevent'; +``` + + + +#### 创建公共事件订阅者 + +根据开发者设定的公共事件订阅相关信息(比如准备订阅的公共事件集等)创建公共事件订阅者对象。 + +- CommonEventSubscribeInfo类型说明 + + CommonEventSubscribeInfo封装公共事件订阅相关信息,比如准备订阅的公共事件集、发布者必须具备的权限、发布者的设备ID、发布者的用户ID、优先级等。 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------------- | -------- | ------------- | ---- | ------------------------------------------------------------ | + | events | 只读 | Array | 是 | 表示要订阅的公共事件集。 | + | publisherPermission | 只读 | string | 否 | 表示发布者的权限。 | + | publisherDeviceId | 只读 | int | 否 | 表示发布者的设备ID,该值必须是同一ohos网络上的现有设备ID。 | + | userId | 只读 | int | 否 | 表示发布者的用户ID。默认值当前用户的ID。如果指定了此参数,则该值必须是系统中现有的用户ID。 | + | priority | 只读 | int | 否 | 表示订阅者的优先级,范围为-100~1000,用于有序公共事件。 | + +- CommonEventSubscriber 类说明 + + CommonEventSubscriber封装公共事件订阅者及相关参数,主要接口如下。 + + | 名称 | 参数 | 返回值 | 描述 | + | --------------------- | --------------------------------------------------------- | --------------------------------- | ------------------------------------------------------------ | + | getCode | callback: AsyncCallback | void | 获取公共事件的结果代码(callback形式) | + | getCode | void | Promise | 获取公共事件的结果代码(Promise形式) | + | setCode | code: number, callback: AsyncCallback | void | 设置有序公共事件的结果代码(callback形式) | + | setCode | code: number | Promise | 设置有序公共事件的结果代码(Promise形式) | + | getData | callback: AsyncCallback | void | 获取公共事件的结果数据(callback形式) | + | getData | void | Promise | 获取公共事件的结果数据(Promise形式) | + | setData | data: string, callback: AsyncCallback | void | 设置有序公共事件的结果数据(callback形式) | + | setData | data: string | Promise | 设置有序公共事件的结果数据(Promise形式) | + | setCodeAndData | code: number, data: string, callback: AsyncCallback | void | 设置有序公共事件的结果代码和结果数据(callback形式) | + | setCodeAndData | code: number, data: string | Promise | 设置有序公共事件的结果代码和结果数据(Promise形式) | + | isOrderedCommonEvent | callback: AsyncCallback | void | 查询当前公共事件的是否为有序公共事件,返回true代表是有序公共事件,false代表不是有序公共事件(callback形式) | + | isOrderedCommonEvent | void | Promise | 查询当前公共事件的是否为有序公共事件,返回true代表是有序公共事件,false代表不是有序公共事件(Promise形式) | + | abortCommonEvent | callback: AsyncCallback | void | 取消当前的公共事件,仅对有序公共事件有效,取消后,公共事件不再向下一个订阅者传递(callback形式) | + | abortCommonEvent | void | Promise | 取消当前的公共事件,仅对有序公共事件有效,取消后,公共事件不再向下一个订阅者传递(Promise形式) | + | clearAbortCommonEvent | callback: AsyncCallback | void | 清除当前有序公共事件abort状态(callback形式) | + | clearAbortCommonEvent | void | Promise | 清除当前有序公共事件abort状态(Promise形式) | + | getAbortCommonEvent | callback: AsyncCallback | void | 获取当前有序公共事件是否取消的状态(callback形式) | + | getAbortCommonEvent | void | Promise | 获取当前有序公共事件是否取消的状态Promise形式) | + | getSubscribeInfo | callback: AsyncCallback | void | 获取订阅者的订阅信息(callback形式) | + | getSubscribeInfo | void | Promise | 获取订阅者的订阅信息(Promise形式) | + + + +- 创建订阅者接口(callback形式) + + CommonEvent.createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback) + + - 接口参数描述 + + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------- | -------- | ------------------------------------ | ---- | ------------------------ | + | subscribeInfo | 只读 | CommonEventSubscribeInfo | 是 | 表示公共事件订阅信息 | + | callback | 只读 | AsyncCallback | 是 | 表示创建订阅者的回调方法 | + + - 返回值 + + void + + - 示例代码 + + ```js + var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 + //订阅者信息 + var subscribeInfo = { + events: ["event"] + }; + //创建订阅者回调 + function CreateSubscriberCallBack(err, data) { + console.info("==========================>CreateSubscriberCallBack=======================>"); + subscriber = data; + } + //创建订阅者 + CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); + ``` + +- 创建订阅者接口(Promise形式) + + CommonEvent.createSubscriber(subscribeInfo: CommonEventSubscribeInfo) + + - 接口参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ------------- | -------- | ------------------------ | ---- | ------------ | + | subscribeInfo | 只读 | CommonEventSubscribeInfo | 是 | 表示订阅信息 | + + - 返回值 + + Promise + + - 示例代码 + + ```js + var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 + //订阅者信息 + var subscribeInfo = { + events: ["event"] + }; + //创建订阅者 + CommonEvent.createSubscriber(subscribeInfo).then((data) => { + ``` + + console.info("==========================>createSubscriberPromise=======================>"); + subscriber = data; + }); + ``` + + + +#### 订阅公共事件 + +订阅公共事件,并指定公共事件订阅者对象和接收公共事件的回调函数。 + +- CommonEventData类型说明 + + CommonEventData封装公共事件相关信息。用于在接收时处理数据。 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | -------------------- | ---- | ------------------------------------------------------- | + | event | 只读 | string | 是 | 表示当前接收的公共事件名称 | + | bundleName | 只读 | string | 否 | 表示包名称 | + | code | 只读 | int | 否 | 表示公共事件的结果代码,用于传递int类型的数据 | + | data | 只读 | string | 否 | 表示公共事件的自定义结果数据,用于传递string 类型的数据 | + | parameters | 只读 | {[key: string]: any} | 否 | 表示公共事件的附加信息 | + +- 订阅公共事件接口(callback形式) + + CommonEvent.subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback) + + - 接口参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | ------------------------------ | ---- | ------------------------------ | + | subscriber | 只读 | CommonEventSubscriber | 是 | 表示订阅者对象 | + | callback | 只读 | AsyncCallback | 是 | 表示接收公共事件数据的回调函数 | + + - 返回值 + + void + + - 示例代码 + + **无序事件:** + + ```js + var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 + //订阅者信息 + var subscribeInfo = { + events: ["event"] + }; + //订阅公共事件回调 + function SubscribeCallBack(err, data) { + console.info("==========================>SubscribeCallBack=======================>"); + } + //创建订阅者回调 + function CreateSubscriberCallBack(err, data) { + console.info("==========================>CreateSubscriberCallBack=======================>"); + subscriber = data; + //订阅公共事件 + CommonEvent.subscribe(subscriber, SubscribeCallBack); + } + //创建订阅者 + CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); + ``` + + **有序事件:** + + ```js + var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 + //订阅者信息 + var subscribeInfo = { + events: ["event"] + }; + + //设置有序公共事件的结果代码回调 + function SetCodeCallBack(err) { + console.info("==========================>SetCodeCallBack=======================>"); + } + //设置有序公共事件的结果数据回调 + function SetDataCallBack(err) { + console.info("==========================>SetDataCallBack=======================>"); + } + //完成本次有序公共事件处理回调 + function FinishCommonEventCallBack(err) { + console.info("==========================>FinishCommonEventCallBack=======================>"); + } + //订阅公共事件回调 + function SubscribeCallBack(err, data) { + console.info("==========================>SubscribeCallBack=======================>"); + //设置有序公共事件的结果代码 + subscriber.setCode(0, SetCodeCallBack); + //设置有序公共事件的结果数据 + subscriber.setData("publish_data_changed", SetDataCallBack); + //完成本次有序公共事件处理 + subscriber.finishCommonEvent(FinishCommonEventCallBack) + } + + //创建订阅者回调 + function CreateSubscriberCallBack(err, data) { + console.info("==========================>CreateSubscriberCallBack=======================>"); + subscriber = data; + //订阅公共事件 + CommonEvent.subscribe(subscriber, SubscribeCallBack); + } + + //创建订阅者 + CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); + ``` + + +​ + +#### 发布公共事件 + +发布指定事件名称的公共事件,并可携带事件相关数据、属性、限制等信息。 + +- CommonEventPublishData类型说明 + + CommonEventPublishData封装公共事件发布相关数据、属性及限制等信息,包括公共事件类型(有序或无序)、订阅者所需权限等。 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | --------------------- | -------- | -------------------- | ---- | ---------------------------- | + | bundleName | 只读 | string | 否 | 表示包名称 | + | code | 只读 | int | 否 | 表示公共事件的结果代码 | + | data | 只读 | string | 否 | 表示公共事件的自定义结果数据 | + | subscriberPermissions | 只读 | Array | 否 | 表示订阅者所需的权限 | + | isOrdered | 只读 | bool | 否 | 表示是否是有序事件 | + | parameters | 只读 | {[key: string]: any} | 否 | 表示公共事件的附加信息 | + +- 发布公共事件接口(callback形式) + + CommonEvent.publish(event: string, callback: AsyncCallback) + + - 接口参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ------------------- | ---- | ------------------------ | + | event | 只读 | string | 是 | 表示要发送的公共事件名称 | + | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | + + - 返回值 + + void + + - 示例代码 + + ```js + //发布公共事件回调 + function PublishCallBack(err) { + console.info("==========================>PublishCallBack=======================>"); + console.info("==========================>err:=======================>", err.code); + } + //发布公共事件 + CommonEvent.publish("publish_event", PublishCallBack); + ``` + +- 发布公共事件指定发布信息接口(callback形式) + + CommonEvent.publish(event: string, options: CommonEventPublishData, callback: AsyncCallback) + + - 接口参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------ | + | event | 只读 | string | 是 | 表示要发布的公共事件名称 | + | options | 只读 | CommonEventPublishData | 是 | 表示发布公共事件的属性 | + | callback | 只读 | AsyncCallback | 是 | 表示被指定的回调方法 | + + - 返回值 + + void + + - 示例代码 + + ```js + //公共事件相关信息 + var options = { + code: 0; //公共事件的初始代码 + data: "initial data"; //公共事件的初始数据 + isOrdered: true; //有序公共事件 + } + //发布公共事件回调 + function PublishCallBack(err) { + console.info("==========================>PublishCallBack=======================>"); + } + //发布公共事件 + CommonEvent.publish("publish_event", options, PublishCallBack); + ``` + + + + +#### 取消订阅公共事件 + +- 取消订阅公共事件接口(callback形式) + + CommonEvent.unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback) + + - 接口参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | ---------- | -------- | --------------------- | ---- | ---------------------- | + | subscriber | 只读 | CommonEventSubscriber | 是 | 表示订阅者对象 | + | callback | 只读 | AsyncCallback | 是 | 表示取消订阅的回调方法 | + + - 返回值 + + void + + - 示例代码 + + ```js + var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 + //订阅者信息 + var subscribeInfo = { + events: ["event"] + }; + //订阅公共事件回调 + function SubscribeCallBack(err, data) { + console.info("==========================>SubscribeCallBack=======================>"); + } + //创建订阅者回调 + function CreateSubscriberCallBack(err, data) { + console.info("==========================>CreateSubscriberCallBack=======================>"); + subscriber = data; + //订阅公共事件 + CommonEvent.subscribe(subscriber, SubscribeCallBack); + } + //取消订阅公共事件回调 + function UnsubscribeCallBack(err) { + console.info("==========================>UnsubscribeCallBack=======================>"); + } + //创建订阅者 + CommonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack); + //取消订阅公共事件 + CommonEvent.unsubscribe(subscriber, UnsubscribeCallBack); + ``` + + + + +#### 系统公共事件列表 + +| 系统公共事件宏 | 系统公共事件名称 | 订阅者所需权限 | +| ------------------------------------------------------------ | ----------------------------------------------------------- | ------------------------------------------------------------ | +| COMMON_EVENT_BOOT_COMPLETED | usual.event.BOOT_COMPLETED | ohos.permission.RECEIVER_STARTUP_COMPLETED | +| COMMON_EVENT_LOCKED_BOOT_COMPLETED | usual.event.LOCKED_BOOT_COMPLETED | ohos.permission.RECEIVER_STARTUP_COMPLETED | +| COMMON_EVENT_SHUTDOWN | usual.event.SHUTDOWN | 无 | +| COMMON_EVENT_BATTERY_CHANGED | usual.event.BATTERY_CHANGED | 无 | +| COMMON_EVENT_BATTERY_LOW | usual.event.BATTERY_LOW | 无 | +| COMMON_EVENT_BATTERY_OKAY | usual.event.BATTERY_OKAY | 无 | +| COMMON_EVENT_POWER_CONNECTED | usual.event.POWER_CONNECTED | 无 | +| COMMON_EVENT_POWER_DISCONNECTED | usual.event.POWER_DISCONNECTED | 无 | +| COMMON_EVENT_SCREEN_OFF | usual.event.SCREEN_OFF | 无 | +| COMMON_EVENT_SCREEN_ON | usual.event.SCREEN_ON | 无 | +| COMMON_EVENT_USER_PRESENT | usual.event.USER_PRESENT | 无 | +| COMMON_EVENT_TIME_TICK | usual.event.TIME_TICK | 无 | +| COMMON_EVENT_TIME_CHANGED | usual.event.TIME_CHANGED | 无 | +| COMMON_EVENT_DATE_CHANGED | usual.event.DATE_CHANGED | 无 | +| COMMON_EVENT_TIMEZONE_CHANGED | usual.event.TIMEZONE_CHANGED | 无 | +| COMMON_EVENT_CLOSE_SYSTEM_DIALOGS | usual.event.CLOSE_SYSTEM_DIALOGS | 无 | +| COMMON_EVENT_PACKAGE_ADDED | usual.event.PACKAGE_ADDED | 无 | +| COMMON_EVENT_PACKAGE_REPLACED | usual.event.PACKAGE_REPLACED | 无 | +| COMMON_EVENT_MY_PACKAGE_REPLACED | usual.event.MY_PACKAGE_REPLACED | 无 | +| COMMON_EVENT_PACKAGE_REMOVED | usual.event.PACKAGE_REMOVED | 无 | +| COMMON_EVENT_PACKAGE_FULLY_REMOVED | usual.event.PACKAGE_FULLY_REMOVED | 无 | +| COMMON_EVENT_PACKAGE_CHANGED | usual.event.PACKAGE_CHANGED | 无 | +| COMMON_EVENT_PACKAGE_RESTARTED | usual.event.PACKAGE_RESTARTED | 无 | +| COMMON_EVENT_PACKAGE_DATA_CLEARED | usual.event.PACKAGE_DATA_CLEARED | 无 | +| COMMON_EVENT_PACKAGES_SUSPENDED | usual.event.PACKAGES_SUSPENDED | 无 | +| COMMON_EVENT_PACKAGES_UNSUSPENDED | usual.event.PACKAGES_UNSUSPENDED | 无 | +| COMMON_EVENT_MY_PACKAGE_SUSPENDED | usual.event.MY_PACKAGE_SUSPENDED | 无 | +| COMMON_EVENT_MY_PACKAGE_UNSUSPENDED | usual.event.MY_PACKAGE_UNSUSPENDED | 无 | +| COMMON_EVENT_UID_REMOVED | usual.event.UID_REMOVED | 无 | +| COMMON_EVENT_PACKAGE_FIRST_LAUNCH | usual.event.PACKAGE_FIRST_LAUNCH | 无 | +| COMMON_EVENT_PACKAGE_NEEDS_VERIFICATION | usual.event.PACKAGE_NEEDS_VERIFICATION | 无 | +| COMMON_EVENT_PACKAGE_VERIFIED | usual.event.PACKAGE_VERIFIED | 无 | +| COMMON_EVENT_EXTERNAL_APPLICATIONS_AVAILABLE | usual.event.EXTERNAL_APPLICATIONS_AVAILABLE | 无 | +| COMMON_EVENT_EXTERNAL_APPLICATIONS_UNAVAILABLE | usual.event.EXTERNAL_APPLICATIONS_UNAVAILABLE | 无 | +| COMMON_EVENT_CONFIGURATION_CHANGED | usual.event.CONFIGURATION_CHANGED | 无 | +| COMMON_EVENT_LOCALE_CHANGED | usual.event.LOCALE_CHANGED | 无 | +| COMMON_EVENT_MANAGE_PACKAGE_STORAGE | usual.event.MANAGE_PACKAGE_STORAGE | 无 | +| COMMON_EVENT_DRIVE_MODE | common.event.DRIVE_MODE | 无 | +| COMMON_EVENT_HOME_MODE | common.event.HOME_MODE | 无 | +| COMMON_EVENT_OFFICE_MODE | common.event.OFFICE_MODE | 无 | +| COMMON_EVENT_USER_STARTED | usual.event.USER_STARTED | 无 | +| COMMON_EVENT_USER_BACKGROUND | usual.event.USER_BACKGROUND | 无 | +| COMMON_EVENT_USER_FOREGROUND | usual.event.USER_FOREGROUND | 无 | +| COMMON_EVENT_USER_SWITCHED | usual.event.USER_SWITCHED | ohos.permission.MANAGE_USERS | +| COMMON_EVENT_USER_STARTING | usual.event.USER_STARTING | ohos.permission.INTERACT_ACROSS_USERS | +| COMMON_EVENT_USER_UNLOCKED | usual.event.USER_UNLOCKED | 无 | +| COMMON_EVENT_USER_STOPPING | usual.event.USER_STOPPING | ohos.permission.INTERACT_ACROSS_USERS | +| COMMON_EVENT_USER_STOPPED | usual.event.USER_STOPPED | 无 | +| COMMON_EVENT_HWID_LOGIN | common.event.HWID_LOGIN | 无 | +| COMMON_EVENT_HWID_LOGOUT | common.event.HWID_LOGOUT | 无 | +| COMMON_EVENT_HWID_TOKEN_INVALID | common.event.HWID_TOKEN_INVALID | 无 | +| COMMON_EVENT_HWID_LOGOFF | common.event.HWID_LOGOFF | 无 | +| COMMON_EVENT_WIFI_POWER_STATE | usual.event.wifi.POWER_STATE | 无 | +| COMMON_EVENT_WIFI_SCAN_FINISHED | usual.event.wifi.SCAN_FINISHED | ohos.permission.LOCATION | +| COMMON_EVENT_WIFI_RSSI_VALUE | usual.event.wifi.RSSI_VALUE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_CONN_STATE | usual.event.wifi.CONN_STATE | 无 | +| COMMON_EVENT_WIFI_HOTSPOT_STATE | usual.event.wifi.HOTSPOT_STATE | 无 | +| COMMON_EVENT_WIFI_AP_STA_JOIN | usual.event.wifi.WIFI_HS_STA_JOIN | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_AP_STA_LEAVE | usual.event.wifi.WIFI_HS_STA_LEAVE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_MPLINK_STATE_CHANGE | usual.event.wifi.mplink.STATE_CHANGE | ohos.permission.MPLINK_CHANGE_STATE | +| COMMON_EVENT_WIFI_P2P_CONN_STATE | usual.event.wifi.p2p.CONN_STATE_CHANGE | ohos.permission.GET_WIFI_INFO and ohos.permission.LOCATION | +| COMMON_EVENT_WIFI_P2P_STATE_CHANGED | usual.event.wifi.p2p.STATE_CHANGE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_P2P_PEERS_STATE_CHANGED | usual.event.wifi.p2p.DEVICES_CHANGE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_P2P_PEERS_DISCOVERY_STATE_CHANGED | usual.event.wifi.p2p.PEER_DISCOVERY_STATE_CHANGE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_P2P_CURRENT_DEVICE_STATE_CHANGED | usual.event.wifi.p2p.CURRENT_DEVICE_CHANGE | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_WIFI_P2P_GROUP_STATE_CHANGED | usual.event.wifi.p2p.GROUP_STATE_CHANGED | ohos.permission.GET_WIFI_INFO | +| COMMON_EVENT_BLUETOOTH_HANDSFREE_AG_CONNECT_STATE_UPDATE | usual.event.bluetooth.handsfree.ag.CONNECT_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HANDSFREE_AG_CURRENT_DEVICE_UPDATE | usual.event.bluetooth.handsfree.ag.CURRENT_DEVICE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HANDSFREE_AG_AUDIO_STATE_UPDATE | usual.event.bluetooth.handsfree.ag.AUDIO_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSOURCE_CONNECT_STATE_UPDATE | usual.event.bluetooth.a2dpsource.CONNECT_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSOURCE_CURRENT_DEVICE_UPDATE | usual.event.bluetooth.a2dpsource.CURRENT_DEVICE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSOURCE_PLAYING_STATE_UPDATE | usual.event.bluetooth.a2dpsource.PLAYING_STATE_UPDATE" | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSOURCE_AVRCP_CONNECT_STATE_UPDATE | usual.event.bluetooth.a2dpsource.AVRCP_CONNECT_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSOURCE_CODEC_VALUE_UPDATE | usual.event.bluetooth.a2dpsource.CODEC_VALUE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_DISCOVERED | usual.event.bluetooth.remotedevice.DISCOVERED | ohos.permission.USE_BLUETOOTH and ohos.permission.LOCATION | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CLASS_VALUE_UPDATE | usual.event.bluetooth.remotedevice.CLASS_VALUE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_ACL_CONNECTED | usual.event.bluetooth.remotedevice.ACL_CONNECTED | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_ACL_DISCONNECTED | usual.event.bluetooth.remotedevice.ACL_DISCONNECTED | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_NAME_UPDATE | usual.event.bluetooth.remotedevice.NAME_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_PAIR_STATE | usual.event.bluetooth.remotedevice.PAIR_STATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_BATTERY_VALUE_UPDATE | usual.event.bluetooth.remotedevice.BATTERY_VALUE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_SDP_RESULT | usual.event.bluetooth.remotedevice.SDP_RESULT | 无 | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_UUID_VALUE | usual.event.bluetooth.remotedevice.UUID_VALUE | ohos.permission.DISCOVER_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_PAIRING_REQ | usual.event.bluetooth.remotedevice.PAIRING_REQ | ohos.permission.DISCOVER_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_PAIRING_CANCEL | usual.event.bluetooth.remotedevice.PAIRING_CANCEL | 无 | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CONNECT_REQ | usual.event.bluetooth.remotedevice.CONNECT_REQ | 无 | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CONNECT_REPLY | usual.event.bluetooth.remotedevice.CONNECT_REPLY | 无 | +| COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CONNECT_CANCEL | usual.event.bluetooth.remotedevice.CONNECT_CANCEL | 无 | +| COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_CONNECT_STATE_UPDATE | usual.event.bluetooth.handsfreeunit.CONNECT_STATE_UPDATE | 无 | +| COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_AUDIO_STATE_UPDATE | usual.event.bluetooth.handsfreeunit.AUDIO_STATE_UPDATE | 无 | +| COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_AG_COMMON_EVENT | usual.event.bluetooth.handsfreeunit.AG_COMMON_EVENT | 无 | +| COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_AG_CALL_STATE_UPDATE | usual.event.bluetooth.handsfreeunit.AG_CALL_STATE_UPDATE | 无 | +| COMMON_EVENT_BLUETOOTH_HOST_STATE_UPDATE | usual.event.bluetooth.host.STATE_UPDATE | 无 | +| COMMON_EVENT_BLUETOOTH_HOST_REQ_DISCOVERABLE | usual.event.bluetooth.host.REQ_DISCOVERABLE | 无 | +| COMMON_EVENT_BLUETOOTH_HOST_REQ_ENABLE | usual.event.bluetooth.host.REQ_ENABLE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HOST_REQ_DISABLE | usual.event.bluetooth.host.REQ_DISABLE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HOST_SCAN_MODE_UPDATE | usual.event.bluetooth.host.SCAN_MODE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HOST_DISCOVERY_STARTED | usual.event.bluetooth.host.DISCOVERY_STARTED | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HOST_DISCOVERY_FINISHED | usual.event.bluetooth.host.DISCOVERY_FINISHED | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_HOST_NAME_UPDATE | usual.event.bluetooth.host.NAME_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSINK_CONNECT_STATE_UPDATE | usual.event.bluetooth.a2dpsink.CONNECT_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSINK_PLAYING_STATE_UPDATE | usual.event.bluetooth.a2dpsink.PLAYING_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_BLUETOOTH_A2DPSINK_AUDIO_STATE_UPDATE | usual.event.bluetooth.a2dpsink.AUDIO_STATE_UPDATE | ohos.permission.USE_BLUETOOTH | +| COMMON_EVENT_NFC_ACTION_ADAPTER_STATE_CHANGED | usual.event.nfc.action.ADAPTER_STATE_CHANGED | 无 | +| COMMON_EVENT_NFC_ACTION_RF_FIELD_ON_DETECTED | usual.event.nfc.action.RF_FIELD_ON_DETECTED | ohos.permission.MANAGE_SECURE_SETTINGS | +| COMMON_EVENT_NFC_ACTION_RF_FIELD_OFF_DETECTED | usual.event.nfc.action.RF_FIELD_OFF_DETECTED | ohos.permission.MANAGE_SECURE_SETTINGS | +| COMMON_EVENT_DISCHARGING | usual.event.DISCHARGING | 无 | +| COMMON_EVENT_CHARGING | usual.event.CHARGING | 无 | +| COMMON_EVENT_DEVICE_IDLE_MODE_CHANGED | usual.event.DEVICE_IDLE_MODE_CHANGED | 无 | +| COMMON_EVENT_POWER_SAVE_MODE_CHANGED | usual.event.POWER_SAVE_MODE_CHANGED | 无 | +| COMMON_EVENT_USER_ADDED | usual.event.USER_ADDED | ohos.permission.MANAGE_USERS | +| COMMON_EVENT_USER_REMOVED | usual.event.USER_REMOVED | ohos.permission.MANAGE_USERS | +| COMMON_EVENT_ABILITY_ADDED | common.event.ABILITY_ADDED | ohos.permission.LISTEN_BUNDLE_CHANGE | +| COMMON_EVENT_ABILITY_REMOVED | common.event.ABILITY_REMOVED | ohos.permission.LISTEN_BUNDLE_CHANGE | +| COMMON_EVENT_ABILITY_UPDATED | common.event.ABILITY_UPDATED | ohos.permission.LISTEN_BUNDLE_CHANGE | +| COMMON_EVENT_LOCATION_MODE_STATE_CHANGED | usual.event.location.MODE_STATE_CHANGED | 无 | +| COMMON_EVENT_IVI_SLEEP | common.event.IVI_SLEEP | 无 | +| COMMON_EVENT_IVI_PAUSE | common.event.IVI_PAUSE | 无 | +| COMMON_EVENT_IVI_STANDBY | common.event.IVI_STANDBY | 无 | +| COMMON_EVENT_IVI_LASTMODE_SAVE | common.event.IVI_LASTMODE_SAVE | 无 | +| COMMON_EVENT_IVI_VOLTAGE_ABNORMAL | common.event.IVI_VOLTAGE_ABNORMAL | 无 | +| COMMON_EVENT_IVI_HIGH_TEMPERATURE | common.event.IVI_HIGH_TEMPERATURE | 无 | +| COMMON_EVENT_IVI_EXTREME_TEMPERATURE | common.event.IVI_EXTREME_TEMPERATURE | 无 | +| COMMON_EVENT_IVI_TEMPERATURE_ABNORMAL | common.event.IVI_TEMPERATURE_ABNORMAL | 无 | +| COMMON_EVENT_IVI_VOLTAGE_RECOVERY | common.event.IVI_VOLTAGE_RECOVERY | 无 | +| COMMON_EVENT_IVI_TEMPERATURE_RECOVERY | common.event.IVI_TEMPERATURE_RECOVERY | 无 | +| COMMON_EVENT_IVI_ACTIVE | common.event.IVI_ACTIVE | 无 | +| COMMON_EVENT_USB_DEVICE_ATTACHED | usual.event.hardware.usb.action.USB_DEVICE_ATTACHED | 无 | +| COMMON_EVENT_USB_DEVICE_DETACHED | usual.event.hardware.usb.action.USB_DEVICE_DETACHED | 无 | +| COMMON_EVENT_USB_ACCESSORY_ATTACHED | usual.event.hardware.usb.action.USB_ACCESSORY_ATTACHED | 无 | +| COMMON_EVENT_USB_ACCESSORY_DETACHED | usual.event.hardware.usb.action.USB_ACCESSORY_DETACHED | 无 | +| COMMON_EVENT_DISK_REMOVED | usual.event.data.DISK_REMOVED | ohos.permission.WRITE_USER_STORAGE or ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_DISK_UNMOUNTED | usual.event.data.DISK_UNMOUNTED | ohos.permission.WRITE_USER_STORAGEor ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_DISK_MOUNTED | usual.event.data.DISK_MOUNTED | ohos.permission.WRITE_USER_STORAGEor ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_DISK_BAD_REMOVAL | usual.event.data.DISK_BAD_REMOVAL | ohos.permission.WRITE_USER_STORAGEor ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_DISK_UNMOUNTABLE | usual.event.data.DISK_UNMOUNTABLE | ohos.permission.WRITE_USER_STORAGEor ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_DISK_EJECT | usual.event.data.DISK_EJECT | ohos.permission.WRITE_USER_STORAGEor ohos.permission.READ_USER_STORAGE | +| COMMON_EVENT_VISIBLE_ACCOUNTS_UPDATED | usual.event.data.VISIBLE_ACCOUNTS_UPDATED | ohos.permission.GET_APP_ACCOUNTS | +| COMMON_EVENT_ACCOUNT_DELETED | usual.event.data.ACCOUNT_DELETED | ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS | +| COMMON_EVENT_FOUNDATION_READY | common.event.FOUNDATION_READY | ohos.permission.RECEIVER_STARTUP_COMPLETED | +| COMMON_EVENT_AIRPLANE_MODE_CHANGED | usual.event.AIRPLANE_MODE | 无 | diff --git a/website/docs/_posts/application-dev/quick-start/create-openharmony-project.md b/website/docs/_posts/application-dev/quick-start/create-openharmony-project.md new file mode 100644 index 0000000000000000000000000000000000000000..e64b82af620f40b22de1cd7f9e5ae7bc5e6e889d --- /dev/null +++ b/website/docs/_posts/application-dev/quick-start/create-openharmony-project.md @@ -0,0 +1,19 @@ +--- +title: create-openharmony-project.md +permalink: /pages/extra/ea2f5f/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:38 +--- +# 创建OpenHarmony工程 + + +- **[使用工程向导创建新工程](/pages/0007050300)** + +- **[通过导入Sample方式创建新工程](/pages/0007050301)** \ No newline at end of file diff --git a/website/docs/_posts/application-dev/quick-start/deveco-studio-user-guide-for-openharmony.md b/website/docs/_posts/application-dev/quick-start/deveco-studio-user-guide-for-openharmony.md new file mode 100644 index 0000000000000000000000000000000000000000..62717174401136c80014a70886576c4868ccaf7d --- /dev/null +++ b/website/docs/_posts/application-dev/quick-start/deveco-studio-user-guide-for-openharmony.md @@ -0,0 +1,27 @@ +--- +title: deveco-studio-user-guide-for-openharmony.md +permalink: /pages/extra/00c2e5/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:38 +--- +# DevEco Studio(OpenHarmony)使用指南 + + +- **[概述](/pages/00070500)** + +- **[版本变更说明](/pages/00070501)** + +- **[配置OpenHarmony SDK](/pages/00070502)** + +- **[创建OpenHarmony工程](/pages/extra/ea2f5f/)** + +- **[配置OpenHarmony应用签名信息](/pages/00070504)** + +- **[安装运行OpenHarmony应用](/pages/00070505)** \ No newline at end of file diff --git a/website/docs/_posts/contribute/OpenHarmony-Java-secure-coding-guide.md b/website/docs/_posts/contribute/OpenHarmony-Java-secure-coding-guide.md new file mode 100644 index 0000000000000000000000000000000000000000..dea8350fdcb6cbad2bd8707e80df0a3d4c21ddcb --- /dev/null +++ b/website/docs/_posts/contribute/OpenHarmony-Java-secure-coding-guide.md @@ -0,0 +1,2111 @@ +--- +title: OpenHarmony-Java-secure-coding-guide.md +permalink: /pages/extra/6cbd43/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# OpenHarmony Java 安全编程指南 + +本文档基于Java 语言提供一些安全编程建议,用于指导开发实践。 + +# 数据类型 + +## 进行数值运算时,避免整数溢出 + +**【描述】** + +在进行数值运算过程中,确保运算结果在特定的整数类型的数据范围内,避免溢出,导致非预期的结果。 + +内置的整数运算符不会以任何方式来标识运算结果的上溢或下溢。常见的加、减、乘、除都可能会导致整数溢出。另外,Java数据类型的合法取值范围是不对称的(最小值的绝对值比最大值大1),所以对最小值取绝对值(`java.lang.Math.abs()`)时,也会导致溢出。 + +对于整数溢出问题,可以通过先决条件检测、使用Math类的安全方法、向上类型转换或者使用`BigInteger`等方法进行规避。 + +**【反例】** + +```java +public static int multNum(int num1, int num2) { + return num1 * num2; +} +``` + +上述示例中,当num1和num2的绝对值较大,两者的乘积大于`Integer.MAX_VALUE`或小于`Integer.MIN_VALUE`时,方法就无法返回正确的计算结果(产生溢出)。 + +**【正例】** + +```java +public static int multNum(int num1, int num2) { + return Math.multiplyExact(num1, num2); +} +``` + +上述示例中,当无法预判乘积结果是否会产生溢出时,使用了Java 8新增的`Math.multiplyExact()`方法,该方法在乘积运算不产生溢出时会返回运算结果,溢出时抛出`ArithmeticException`。 + +## 确保除法运算和模运算中的除数不为0 + +**【描述】** + +如果除法或模运算中的除数为零可能会导致程序终止或拒绝服务(DoS),因此需要在运算前保证除数不为0。 + +**【反例】** + +```java +long dividendNum = 0; +long divisorNum = 0; +long result1 = dividendNum / divisorNum; +long result2 = dividendNum % divisorNum; +``` + +上述示例中,没有对除数进行非零判断,会导致程序运行错误。 + +**【正例】** + +```java +long dividendNum = 0; +long divisorNum = 0; +if (divisorNum != 0) { + long result1 = dividendNum / divisorNum; + long result2 = dividendNum % divisorNum; +} +``` + +上述示例中,对除数进行非零判断,然后再进行除法或取余运算。 + +# 表达式 + +## 禁止直接使用可能为null的对象,防止出现空指针引用 + +**【描述】** + +访问一个为null的对象时,会导致空引用问题,代码中抛出`NullPointerException`。该类问题应该通过预检查的方式进行消解,而不是通过`try...catch`机制处理`NullPointerException`。 + +**【反例】** + +```java +String env = System.getenv(SOME_ENV); +if (env.length() > MAX_LENGTH) { + ... +} +``` + +上述示例中,`System.getenv()`返回值可能为null,代码中在使用变量`env`前未判空,会发生空指针引用。 + +**【正例】** + +```java +String env = System.getenv(SOME_ENV); +if (env != null && env.length() > MAX_LENGTH) { + ... +} +``` + +上述示例中,对`System.getenv()`返回值先判空再使用,消除了空指针引用问题。 + +# 并发与多线程 + +## 在异常条件下,保证释放已持有的锁 + +**【描述】** + +一个线程中没有正确释放持有的锁会导致其他线程无法获取该锁对象,导致阻塞。在发生异常时,需要确保程序正确释放当前持有的锁。在异常条件下,同步方法或者块同步中使用的对象内置锁会自动释放。但是大多数的Java锁对象并不是Closeable,无法使用try-with-resources功能自动释放,在这种情况下需要主动释放锁。 + +**【反例】**(可检查异常) + +```java +public final class Foo { + private final Lock lock = new ReentrantLock(); + + public void incorrectReleaseLock() { + try { + lock.lock(); + doSomething(); + lock.unlock(); + } catch (MyBizException ex) { + // 处理异常 + } + } + + private void doSomething() throws MyBizException { + ... + } +} +``` + +上述代码示例中,使用了`ReentrantLock`锁,当`doSomething()`方法抛出异常时,catch代码块中没有释放锁操作,导致锁没有释放。 + +**【正例】**(finally代码块) + +```java +public final class Foo { + private final Lock lock = new ReentrantLock(); + + public void correctReleaseLock() { + lock.lock(); + try { + doSomething(); + } catch (MyBizException ex) { + // 处理异常 + } finally { + lock.unlock(); + } + } + + private void doSomething() throws MyBizException { + ... + } +} +``` + +上述代码示例中,成功执行锁定操作后,将可能抛出异常的操作封装在try代码块中。锁在执行try代码块前获取,可保证在执行finally代码时正确持有锁。在finally代码块中调用`lock.unlock()`,可以保证不管是否发生异常都可以释放锁。 + +**【反例】**(未检查异常) + +```java +final class Foo { + private final Lock lock = new ReentrantLock(); + + public void incorrectReleaseLock(String value) { + lock.lock(); + ... + int index = Integer.parseInt(value); + ... + lock.unlock(); + } +} +``` + +上述代码示例中,当`incorrectReleaseLock()`方法传入的String不是数字时,后续的操作会抛出`NumberFormatException`,导致锁未被正确释放。 + +**【正例】**(finally代码块) + +```java +final class Foo { + private final Lock lock = new ReentrantLock(); + + public void correctReleaseLock(String value) { + lock.lock(); + try { + ... + int index = Integer.parseInt(value); + ... + } finally { + lock.unlock(); + } + } +} +``` + +上述代码示例中,成功执行锁定操作后,将可能抛出异常的操作封装在try代码块中。锁在执行try代码块前获取,可保证在执行finally代码时正确持有锁。在finally代码块中调用`lock.unlock()`,可以保证不管是否发生异常都可以释放锁。 + +## 禁止使用Thread.stop()来终止线程 + +**【描述】** + +线程在正常退出时,会维持类的不变性。某些线程API最初是用来帮助线程的暂停、恢复和终止,但随后因为设计上的缺陷而被废弃。例如,`Thread.stop()`方法会导致线程立即抛出一个`ThreadDeath`异常,这通常会停止线程。调用`Thread.stop()`会造成一个线程非正常释放它所获得的所有锁,可能会暴露这些锁保护的对象,使这些对象处于一个不一致的状态中。 + +**【反例】**(使用废弃的Thread.stop()) + +```java +public final class Foo implements Runnable { + private final Vector vector = new Vector(1000); + + public Vector getVector() { + return vector; + } + + @Override + public synchronized void run() { + Random number = new Random(123L); + int i = vector.capacity(); + while (i > 0) { + vector.add(number.nextInt(100)); + i--; + } + } + + public static void main(String[] args) throws InterruptedException { + Thread thread = new Thread(new Foo()); + thread.start(); + Thread.sleep(5000); + thread.stop(); + } +} +``` + +上述示例中,一个线程将伪随机数写入一个vector中,在经过指定时间后,线程被强迫终止。因为Vector是线程安全的,所以多个线程对共享实例进行的操作是不会让其处于一个不一致的状态。例如,`Vector.size()`方法总是能返回vector中的元素的正确数目。Vector实例是使用自身的隐式锁来保持同步。而`Thread.stop()`方法会导致线程停止在正在进行的操作并抛出`ThreadDeath`异常,所有获得的锁会被释放,如果线程是在加入一个新整数到vector时被停止的,就可能导致处于不一致状态的vector,如因为元素数目是在添加一个元素后增加的,可能会导致`Vector.size()`返回的是错误的元素数目。 + +**【正例】**(设置线程结束标志) + +```java +public final class Foo implements Runnable { + private final Vector vector = new Vector(1000); + + private boolean done = false; + + public Vector getVector() { + return vector; + } + + public void shutdown() { + done = true; + } + + @Override + public synchronized void run() { + Random number = new Random(123L); + int i = vector.capacity(); + while (!done && i > 0) { + vector.add(number.nextInt(100)); + i--; + } + } + + public static void main(String[] args) throws InterruptedException { + Foo foo = new Foo(); + Thread thread = new Thread(foo); + thread.start(); + Thread.sleep(5000); + foo.shutdown(); + } +} +``` + +上述示例中,使用一个标志来请求线程终止。`shutdown()`方法设置这个标志为true,线程的`run()`方法查询该标志为true时终止执行。 + +**【正例】**(可中断) + +```java +public final class Foo implements Runnable { + private final Vector vector = new Vector(1000); + + public Vector getVector() { + return vector; + } + + @Override + public synchronized void run() { + Random number = new Random(123L); + int i = vector.capacity(); + while (!Thread.interrupted() && i > 0) { + vector.add(number.nextInt(100)); + i--; + } + } + + public static void main(String[] args) throws InterruptedException { + Foo foo = new Foo(); + Thread thread = new Thread(foo); + thread.start(); + Thread.sleep(5000); + thread.interrupt(); + } +} +``` + +上述示例中,调用`Thread.interrupt()`方法来终止线程。调用`Thread.interrupt()`方法设置了一个内部的中断标志。线程可以通过`Thread.interrupted()`方法来检查该标志,该方法会在当前线程被中断时返回true,并会清除该中断标志。 + +## 线程池中的线程结束后必须清理自定义的ThreadLocal变量 + +**【描述】** + +线程池技术通过重复使用线程以减少线程创建开销。由于线程的复用,导致`ThreadLocal`变量的使用存在以下两类问题: + +- 脏数据问题:当前任务未正确初始化`ThreadLocal`变量,导致`ThreadLocal`变量是由该线程执行的其他任务设置的; +- 内存泄露问题:`ThreadLocal`变量未主动释放,导致内存无法被主动回收。 + +因此必须保证线程池中每个任务使用的`ThreadLocal`变量在任务结束后被主动清理。 + +**【正例】** + +```java +public class TestThreadLocal { + public static void main(String[] args) { + ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 100, + TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), + Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); + for (int i = 0; i < 20; i++) { + pool.execute(new TestThreadLocalTask()); + } + } +} + +class TestThreadLocalTask implements Runnable { + private static ThreadLocal localValue = new ThreadLocal<>(); + + @Override + public void run() { + localValue.set(STATE1); + try { + ... + localValue.set(STATE3); + ... + } finally { + localValue.remove(); // 需要执行remove方法清理线程局部变量,避免内存泄露 + } + } +} +``` + +# 输入输出 + +## 在多用户系统中创建文件时指定合适的访问许可 + +**【描述】** + +多用户系统中的文件通常归属于一个特定的用户,文件的属主能够指定系统中哪些用户能够访问该文件的内容。这些文件系统使用权限和许可模型来保护文件访问。当一个文件被创建时,文件访问许可规定了哪些用户可以访问或者操作这个文件。如果创建文件时没有对文件的访问许可做足够的限制,攻击者可能在修改此文件的访问权限之前对其进行读取或者修改。因此,一定要在创建文件时就为其指定访问许可,以防止未授权的文件访问。 + +**【反例】** + +```java +Writer out = new FileWriter("file"); +``` + +`FileOutputStream`与`FileWriter`的构造方法无法让程序员显式的指定文件的访问权限。在这个示例中,所创建文件的访问许可取决于具体的实现机制,可能无法防止未授权的访问。 + +**【正例】** + +```java +Path file = new File("file").toPath(); + +// 抛出异常而不是覆写已存在的文件 +Set options = new HashSet(); +options.add(StandardOpenOption.CREATE_NEW); +options.add(StandardOpenOption.APPEND); + +// 文件权限应设置为只有属主才能读取/写入文件 +Set perms = PosixFilePermissions.fromString("rw-------"); +FileAttribute> attr = + PosixFilePermissions.asFileAttribute(perms); +try (SeekableByteChannel sbc = Files.newByteChannel(file, options, attr)) { + ... // 写数据 +} +``` + +**【例外】** + +如果文件是创建在一个安全目录中,而且该目录对于非受信用户是不可读的,那么允许以默认许可创建文件。例如,如果整个文件系统是可信的或者只有可信用户可以访问,就属于这种情况。 + +## 使用外部数据构造的文件路径前必须进行校验,校验前必须对文件路径进行规范化处理 + +**【描述】** + +文件路径来自外部数据时,必须对其合法性进行校验,否则可能会产生路径遍历(Path Traversal)漏洞。 + +文件路径有多种表现形式,如绝对路径、相对路径,路径中可能会含各种链接、快捷方式、影子文件等,这些都会对文件路径的校验产生影响,所以在文件路径校验前要对文件路径进行规范化处理,使用规范化的文件路径进行校验。对文件路径的规范化处理必须使用`getCanonicalPath()`,禁止使用`getAbsolutePath()`(该方法无法保证在所有的平台上对文件路径进行正确的规范化处理)。 + +**【反例】** + +```java +public void doSomething() { + File file = new File(HOME_PATH, fileName); + String path = file.getPath(); + + if (!validatePath(path)) { + throw new IllegalArgumentException("Path Traversal vulnerabilities may exist!"); + } + ... // 对文件进行读写等操作 +} + +private boolean validatePath(String path) { + if (path.startsWith(HOME_PATH)) { + return true; + } else { + return false; + } +} +``` + +上述代码中fileName来自外部输入,直接用fileName的值与固定路径进行拼接,作为实际访问文件的路径,在访问文件之前通过`validatePath`检查了拼接的路径是否在固定目录下,但是攻击者可以通过../这样的路径方式,访问HOME_PATH之外的任意文件。 + +**【正例】**(getCanonicalPath()) + +```java +public void doSomething() { + File file = new File(HOME_PATH, fileName); + try { + String canonicalPath = file.getCanonicalPath(); + if (!validatePath(canonicalPath)) { + throw new IllegalArgumentException("Path Traversal vulnerability!"); + } + ... // 对文件进行读写等操作 + } catch (IOException ex) { + throw new IllegalArgumentException("An exception occurred ...", ex); + } +} + +private boolean validatePath(String path) { + if (path.startsWith(HOME_PATH)) { + return true; + } else { + return false; + } +} +``` + +上述代码示例中,使用外部输入的fileName构造文件路径后,先对文件路径进行规范化,然后用规范化的文件路径进行校验,满足条件后执行文件读写操作。这样可以有效避免路径遍历之类的风险。 + +## 从ZipInputStream中解压文件必须进行安全检查 + +**【描述】** + +使用`java.util.zip.ZipInputStream`解压文件时,有两个问题需要注意: + +**1. 解压出的文件在解压目标目录之外** + +解压zip文件时要校验各解压文件的名字,如果文件名包含../会导致解压文件被释放到目标目录之外的目录。因此,任何被解压文件的目标路径不在预期目录之内时,要么拒绝将其解压出来,要么将其解压到一个安全的位置。 + +**2. 解压的文件消耗过多的系统资源** + +解压zip时,不仅要对解压之后的文件数量进行限制,还要对解压之后的文件大小进行限制。zip压缩算法可能有很大的压缩比,可以把超大文件压缩成很小的zip文件。zip文件解压时,如果不对解压后的文件的实际大小进行检查,则可能会使解压后的文件占用大量系统资源,导致zip炸弹(zip bomb)攻击。因此,Zip文件解压时,若解压之后的文件大小超过一定的限制,必须拒绝将其解压。具体大小限制由平台的处理性能来决定。 + +**【反例】** + +```java +public void unzip(String fileName, String dir) throws IOException { + try (FileInputStream fis = new FileInputStream(fileName); + ZipInputStream zis = new ZipInputStream(fis)) { + ZipEntry entry; + File tempFile; + byte[] buf = new byte[10240]; + int length; + + while ((entry = zis.getNextEntry()) != null) { + tempFile = new File(dir, entry.getName()); + if (entry.isDirectory()) { + tempFile.mkdirs(); + continue; + } + + try (FileOutputStream fos = new FileOutputStream(tempFile)) { + while ((length = zis.read(buf)) != -1) { + fos.write(buf, 0, length); + } + } + } + } +} +``` + +上述示例中,未对解压的文件名做验证,直接将文件名传递给`FileOutputStream`构造器。也未检查解压文件的资源消耗情况,允许程序运行到操作完成或者本地资源被耗尽。 + +**【正例】** + +```java +private static final long MAX_FILE_COUNT = 100L; +private static final long MAX_TOTAL_FILE_SIZE = 1024L * 1024L; + +... + +public void unzip(FileInputStream zipFileInputStream, String dir) throws IOException { + long fileCount = 0; + long totalFileSize = 0; + + try (ZipInputStream zis = new ZipInputStream(zipFileInputStream)) { + ZipEntry entry; + String entryName; + String entryFilePath; + File entryFile; + byte[] buf = new byte[10240]; + int length; + + while ((entry = zis.getNextEntry()) != null) { + entryName = entry.getName(); + entryFilePath = sanitizeFileName(entryName, dir); + entryFile = new File(entryFilePath); + + if (entry.isDirectory()) { + creatDir(entryFile); + continue; + } + + fileCount++; + if (fileCount > MAX_FILE_COUNT) { + throw new IOException("The ZIP package contains too many files."); + } + + try (FileOutputStream fos = new FileOutputStream(entryFile)) { + while ((length = zis.read(buf)) != -1) { + totalFileSize += length; + zipBombCheck(totalFileSize); + fos.write(buf, 0, length); + } + } + } + } +} + +private String sanitizeFileName(String fileName, String dir) throws IOException { + File file = new File(dir, fileName); + String canonicalPath = file.getCanonicalPath(); + if (canonicalPath.startsWith(dir)) { + return canonicalPath; + } + throw new IOException("Path Traversal vulnerability: ..."); +} + +private void creatDir(File dirPath) throws IOException { + boolean result = dirPath.mkdirs(); + if (!result) { + throw new IOException("Create dir failed, path is : " + dirPath.getPath()); + } + ... +} + +private void zipBombCheck(long totalFileSize) throws IOException { + if (totalFileSize > MAX_TOTAL_FILE_SIZEG) { + throw new IOException("Zip Bomb! The size of the file extracted from the ZIP package is too large."); + } +} +``` + +上述示例中,在解压每个文件之前对其文件名进行校验,如果校验失败,整个解压过程会被终止。实际上也可以忽略跳过这个文件,继续后面的解压过程,甚至可以将这个文件解压到某个安全位置。解压缩过程中,在while循环中边读边统计实际解压出的文件总大小,如果达到指定的阈值(MAX_TOTAL_FILE_SIZE),会抛出异常终止解压操作;同时,会统计解压出来的文件的数量,如果达到指定阈值(MAX_FILE_COUNT),会抛出异常终止解压操作。 + +说明:在统计解压文件的大小时,不应该使用`entry.getSize()`来统计文件大小,`entry.getSize()`是从zip文件中的固定字段中读取单个文件压缩前的大小,文件压缩前的大小可被恶意篡改。 + +## 对于从流中读取一个字符或字节的方法,使用int类型的返回值 + +**【描述】** + +Java中`InputStream.read()`和`Reader.read()`方法用于从流中读取一个字节(byte)或字符(char)。 + +`InputStream.read()`读取一个字节,返回值的范围为0x00-0xFF(补码),8位;`Reader.read()`读取一个字符,返回值的范围为0x0000-0xFFFF(补码),16位。 + +当读取到流的末尾时,以上方法均返回int类型的-1(补码表示为0xFFFFFFFF),32位。 + +因此,如果在未判断返回值是否是流末尾标志-1(补码表示为0xFFFFFFFF)前将返回值转为byte或char,会导致无法正确判断返回值是流中的内容还是结束标识。 + +**【反例】**(字节) + +```java +FileInputStream in = getReadableStream(); + +byte data; +while ((data = (byte) in.read()) != -1) { + // 使用data + ... +} +``` + +上述代码中,将`read()`方法返回的值直接转换为byte类型,并将转换后的结果与-1进行比较,进而判断是否达到流的末尾。如果`read()`返回值为0xFF,0xFF转为有符号byte即为byte类型-1,循环结束条件判断通过,结果就是错误的以为流结束了。 + +**【反例】**(字符) + +```java +InputStreamReader in = getReader(); + +char data; +while ((data = (char) in.read()) != -1) { + // 使用data + ... +} +``` + +上述代码中,将`read()`方法返回的值直接转换为char类型,并将转换后的结果与-1进行比较,进而判断是否达到流的末尾。当读取流结束后,返回值转为char类型后也不为-1,因此即使流读取结束,while循环仍无法正确终止。 +原因是流结束标志-1(补码表示为0xFFFFFFFF)被强转为char类型时,会被转为0xFFFF,再和-1进行比较时等式不成立,导致循环结束条件永假。 + +**【正例】**(字节) + +```java +FileInputStream in = getReadableStream(); + +byte data; +int result; +while ((result = in.read()) != -1) { + data = (byte) result; + // 使用data + ... +} +``` + +**【正例】**(字符) + +```java +InputStreamReader in = getReader(); + +char data; +int result; +while ((result = in.read()) != -1) { + data = (char) result; + // 使用data + ... +} +``` + +上述代码中,使用int类型的变量来保存`read()`的返回值,并使用该返回值判断是否读取到流的末尾,流未读完时,将读取的内容转换为char或者byte类型,这样就避免了判断流末尾不准确。 + +## 防止外部进程阻塞在输入输出流上 + +**【描述】** + +Java中有两种方式启动一个外部进程并与其交互: + +1. java.lang.Runtime的exec()方法 +2. java.lang.ProcessBuilder的start()方法 + +他们都返回一个java.lang.Process对象,该对象封装了这个外部进程。 + +每个Process对象,包含输入流、输出流及错误流各一个,应该恰当地处理这些流,避免外部进程阻塞在这些流上。 + +不正确的处理会产生异常、DoS,及其他安全问题。 + +1、处理外部进程的输入流(`Process.getOutputStream()`,**从调用者角度来说,外部进程的输入流是OutputStream**): +对于需要输入流的外部进程,如果不为其提供一个有效输入,则其会从一个空的输入流中读取输入,导致其一直阻塞。 + +2、处理外部进程的输出流(`Process.getInputStream()`)和错误流(`Process.getErrorStream()`): +对于有输出流和错误流的外部进程,如果调用者不处理并且清空对应流,则该外部进程的输出可能会耗尽该进程输出流与错误流的缓冲区,导致外部进程被调用者阻塞,并影响调用者与外部进程的正常交互。 +如果使用`java.lang.ProcessBuilder`来调用外部进程,那么外部进程错误流可以通过`redirectErrorStream()`方法重定向到其输出流,调用者可以通过处理并清空输出流来同时处理错误流。 + +**【反例】**(错误处理外部进程的返回结果) + +```java +public void execExtProcess() throws IOException { + Process proc = Runtime.getRuntime().exec("ProcessMaybeStillRunning"); + int exitVal = proc.exitValue(); +} +``` + +上述示例中,程序未等到ProcessMaybeStillRunning进程结束就调用`exitValue()`方法,很可能会导致`IllegalThreadStateException`异常。 + +**【反例】**(未处理外部进程的输出流、错误流) + +```java +public void execExtProcess() throws IOException, InterruptedException { + Process proc = Runtime.getRuntime().exec("ProcessMaybeStillRunning"); + int exitVal = proc.waitFor(); +} +``` + +此示例对比上一个示例,不会产生`IllegalThreadStateException`异常。但是由于没有处理ProcessMaybeStillRunning的输出流和错误流,可能会导致描述中列出的问题。 + +**【正例】** + +```java +public class ProcessExecutor { + public void callExtProcess() throws IOException, InterruptedException { + Process proc = Runtime.getRuntime().exec("ProcessHasOutput"); + + StreamConsumer errConsumer = new StreamConsumer(proc.getErrorStream()); + StreamConsumer outputConsumer = new StreamConsumer(proc.getInputStream()); + + errConsumer.start(); + outputConsumer.start(); + + int exitVal = proc.waitFor(); + + errConsumer.join(); + outputConsumer.join(); + } + + class StreamConsumer extends Thread { + InputStream is; + + StreamConsumer(InputStream is) { + this.is = is; + } + + @Override + public void run() { + try { + byte data; + int result; + while ((result = is.read()) != -1) { + data = (byte) result; + handleData(data); + } + } catch (IOException ex) { + // 处理异常 + } + } + + private void handleData(byte data) { + ... + } + } +} +``` + +上述示例产生两个线程来分别读取进程的输出流和错误流。因此,外部进程将不会无限期地阻塞在这些流之上。 + +**【例外】** + +对于外部进程不涉及使用输入流、输出流和错误流的场景,可以不对流进行专门处理。 + +## 临时文件使用完毕必须及时删除 + +**【描述】** + +程序中很多用到临时文件的地方,比如用于进程间的数据共享,缓存内存数据,动态构造的类文件,动态连接库文件等。临时文件可能创建于操作系统的共享临时文件目录。这类目录中的文件可能会被定期清理,例如,每天晚上或者重启时。然而,如果文件未被安全地创建或者用完后还是可访问的,具备本地文件系统访问权限的攻击者便可以利用共享目录中的文件进行恶意操作。删除已经不再需要的临时文件有助于对文件名和其他资源(如二级存储)进行回收利用。每一个程序在正常运行过程中都有责任确保已使用完毕的临时文件被删除。 + +**【反例】** + +```java +public boolean uploadFile(InputStream in) throws IOException { + File tempFile = File.createTempFile("tempname", ".tmp"); + try (FileOutputStream fop = new FileOutputStream(tempFile)) { + int readSize; + do { + readSize = in.read(buffer, 0, MAX_BUFF_SIZE); + if (readSize > 0) { + fop.write(buffer, 0, readSize); + } + } while (readSize >= 0); + ... // 对tempFile进行其他操作 + } +} +``` + +上述示例代码在运行结束时未将临时文件删除。 + +**【正例】** + +```java +public boolean uploadFile(InputStream in) throws IOException { + File tempFile = File.createTempFile("tempname", ".tmp"); + try (FileOutputStream fop = new FileOutputStream(tempFile)) { + int readSize; + do { + readSize = in.read(buffer, 0, MAX_BUFF_SIZE); + if (readSize > 0) { + fop.write(buffer, 0, readSize); + } + } while (readSize >= 0); + ... // 对tempFile进行其他操作 + } finally { + if (!tempFile.delete()) { + // 忽略 + } + } +} +``` + +以上例子,在临时文件使用完毕之后,finally语句里对其进行了彻底删除。 + +# 序列化 + +#### 禁止直接将外部数据进行反序列化 + +**【描述】** + +反序列化操作是将一个二进制流或字符串反序列化为一个Java对象。当反序列化操作的数据是外部数据时,恶意用户可利用反序列化操作构造指定的对象、执行恶意代码、向应用程序中注入有害数据等。不安全反序列化操作可能导致任意代码执行、特权提升、任意文件访问、拒绝服务等攻击。 + +实际应用中,通常采用三方件实现对json、xml、yaml格式的数据序列化和反序列化操作。常用的三方件包括:fastjson、jackson、XMLDecoder、XStream、SnakeYmal等。 + +**【反例】** + +```java +public class DeserializeExample implements Serializable { + private static final long serialVersionUID = -5809782578272943999L; + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + private void readObject(java.io.ObjectInputStream ois) { + ois.defaultReadObject(); + System.out.println("Hack!"); + } +} + + // 使用外部数据执行反序列化操作 + ObjectInputStream ois2= new ObjectInputStream(fis); + PersionInfo myPerson = (PersionInfo) ois2.readObject(); +``` + +上面的示例中,当反序列化操作的对象是攻击者构造的DeserializeExample对象的序列化结果,当`PersionInfo myPerson = (PersionInfo) ois2.readObject()`该语句执行时会报错,但是DeserializeExample对象中的`readObject()`方法中的攻击代码已经被执行。 + +**【正例】**(使用白名单校验) + +```java +public final class SecureObjectInputStream extends ObjectInputStream { + public SecureObjectInputStream() throws SecurityException, IOException { + super(); + } + + public SecureObjectInputStream(InputStream in) throws IOException { + super(in); + } + + protected Class resolveClass(ObjectStreamClass desc) + throws IOException, ClassNotFoundException { + if (!desc.getName().equals("com.xxxx.PersionInfo")) { // 白名单校验 + throw new ClassNotFoundException(desc.getName() + " not find"); + } + return super.resolveClass(desc); + } +} +``` + +上述示例是对反序列化的类进行白名单检查。即在自定义ObjectInputStream中重载`resolveClass()`方法,对className进行白名单校验。如果反序列化的类不在白名单之中,直接抛出异常。 + +**【正例】**(使用安全管理器防护) + +如果产品已经使用Java的安全管理器,建议使用Java安全管理器机制进行防护。 + +(1) 设置enableSubclassImplementation + +``` +permission java.io.SerializablePermission "enableSubclassImplementation"; + +``` + +(2) 定义ObjectInputStream,重载resolveClass的方法 + +```java +public final class HWObjectInputStream extends ObjectInputStream { + public HWObjectInputStream() throws SecurityException, IOException { + super(); + } + + public HWObjectInputStream(InputStream in) throws IOException { + super(in); + } + + protected Class resolveClass(ObjectStreamClass desc) + throws IOException, ClassNotFoundException { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPermission(new SerializablePermission( + "com.xxxx." + desc.getName())); + } + return super.resolveClass(desc); + } +} +``` + +(3) 在policy文件里设置白名单 + +``` +permission java.io.SerializablePermission "com.xxxx.PersionInfo"; + +``` + +# 外部数据校验 + +## 外部数据使用前必须进行合法性校验 + +**描述】** + +外部数据的范围包括但不限于:网络、用户输入(包括命令行、界面)、命令行、文件(包括程序的配置文件) 、环境变量、进程间通信(包括管道、消息、共享内存、socket等、RPC)、跨信任域方法参数(对于API)等。 + +来自程序外部的数据通常被认为是不可信的,在使用这些数据前需要进行合法性校验,否则可能会导致不正确的计算结果、运行时异常、不一致的对象状态,甚至引起各种注入攻击,对系统造成严重影响。 + +**对外部数据的校验包括但不局限于:** + +- 校验API接口参数合法性; +- 校验数据长度; +- 校验数据范围; +- 校验数据类型和格式; +- 校验集合大小; +- 校验外部数据只包含可接受的字符(白名单校验),尤其需要注意一些特殊情况下的特殊字符。 + +对于外部数据的校验,要注意以下两点: + +- 如果需要,外部数据校验前要先进行标准化:例如“\uFE64”、“<”都可以表示“<”,在web应用中,如果外部输入不做标准化,可以通过“\uFE64”绕过对“<”限制。 +- 对外部数据的修改要在校验前完成,保证实际使用的数据与校验的数据一致。 + +出于性能和代码简洁性考虑,对于RESTful API,provider只校验请求信息,consumer只校验响应结果;对于一个调用链上的方法,最外层的对外public方法必须校验,内部public方法可不重复校验。 + +**常见校验框架:** + +接口:JSR 380(Bean Validation 2.0)、JSR 303(Bean Validation 1.0)JavaBean参数校验标准,核心接口javax.validation.Validator,定义了很多常用的校验注解。 +实现:hibernate-validator 、Spring: + +- hibernate-validator 是 JSR 380(Bean Validation 2.0)、JSR 303(Bean Validation 1.0)规范的实现,同时扩展了注解:@Email、@Length、@NotEmpty、@Range等。 +- Spring validtor 同样实现了JSR 380和JSR 303,并提供了MethodValidationPostProcessor类,用于对方法的校验。 + +产品可自主选择合适的校验框架,也可以自主开发实现外部数据校验。 + +**【反例】** + +```java +/** + * 更换公司信息 + * + * @param companies 新旧公司信息 + * @return 更换公司是否成功 + */ +@RequestMapping(value = "/updating", method = RequestMethod.POST) +public boolean updateCompany(@RequestBody Companies companies) { + return employeeService.updateCompany(companies.getSrcCompany(), + companies.getDestCompany()); +} +``` + +上面的错误代码,provider对外开放的`updateCompany()`接口未对请求体做校验,存在被恶意攻击的风险。 + +**【正例】** + +```java +/** + * 更换公司信息 + * + * @param companies 新旧公司信息 + * @return 更换公司是否成功 + */ +@RequestMapping(value = "/updating", method = RequestMethod.POST) +public boolean updateCompany(@RequestBody @Valid @NotNull Companies companies) { + return employeeService.updateCompany( + companies.getSrcCompany(), companies.getDestCompany()); +} + +@Setter +@Getter +public class Companies { + @Valid + @NotNull + private Company srcCompany; + + @Valid + @NotNull + private Company destCompany; +} + +@Setter +@Getter +@Accessors(chain = true) +public class Company { + @NotBlank + @Size(min = 10, max = 256) + private String name; + + @NotBlank + @Size(min = 10, max = 512) + private String address; + + @Valid + private SubCompany subCompany; +} +``` + +上述示例使用@Valid注解触发参数校验,校验逻辑为对象属性声明时通过注解指定的规则。对外接口内部调用的public方法`employeeService.updateCompany()`由于只有本模块使用,非对外接口,而且调用的地方已做参数校验,可以不做参数判断。 + +**【反例】** + +获取环境变量值后未校验,直接使用。 + +```java +public static String getFile(String filePath, String fileName) { + // 获取进程的classpath路径 + String path = System.getProperty(RUNTIME_BASE_DIR); + ... // 直接使用 +} +``` + +**【正例】** + +使用ClassLoader提供的`getResource()`和`getResourceAsStream()`从装载的类路径中取得资源。 + +```java +public static String getSavePath(String filePath, String fileName) { + return ClassLoader.getSystemResource(fileName).getPath(); +} +``` + +对环境变量的值先进行标准化处理,再执行校验,最后使用: + +```java +public static String getFile(String filePath, String fileName) { + // 获取进程的classpath路径 + String path = System.getProperty(RUNTIME_BASE_DIR); + + // 标准化 + // 校验,例如StringUtils.startsWith(path, "/opt/xxxx/release/"); + // 使用 +} +``` + +**【反例】** + +配置文件未校验,直接使用。 + +```java +@Configuration +@PropertySource("classpath:xxx.properties") +@Component +public class XxxConfig { + @Value("${appId}") + private String appId; + + @Value("${secret}") + private String citySecret; +} +``` + +**【正例】** + +Spring Boot框架可以使用注解@ConfigurationProperties和@Validated完成对配置文件的校验,如下所示: + +```java +@ConfigurationProperties(locations = "classpath: xxx.properties", prefix = "xxx") +@Validated +public class XxxConfig { + @Value("${appId}") + @Pattern(regexp = "[0-9_A-Z]{32}") + private String appId; + + @Value("${secret}") + @Pattern(regexp = "[0-9A-Z]{64,138}", message = "Authentication credential error!") + private String citySecret; + + // Setter和Getter方法 +} +``` + +ServiceComb框架,可以通过Java自带的validation-api,从Bean上下文取到配置文件对象后,显式调用检验。 + +## 禁止直接使用外部数据来拼接SQL语句 + +**【描述】** + +SQL注入是指使用外部数据构造的SQL语句所代表的数据库操作与预期不符,这样可能会导致信息泄露或者数据被篡改。SQL注入产生的根本原因是使用外部数据直接拼接SQL语句,防护措施主要有以下三类: + +- 使用参数化查询:最有效的防护手段,但对SQL语句中的表名、字段名等不适用; +- 对外部数据进行白名单校验:适用于拼接SQL语句中的表名、字段名; +- 对外部数据中的与SQL注入相关的特殊字符进行转义:适用于必须通过字符串拼接构造SQL语句的场景,转义仅对由引号限制的字段有效。 + +参数化查询是一种简单有效的防止SQL注入的查询方式,应该被优先考虑使用。另外,参数化查询还能提高数据库访问的性能,例如,SQL Server与Oracle数据库会为其缓存一个查询计划,以便在后续重复执行相同的查询语句时无需编译而直接使用。对于常用的ORM框架(如Hibernate、iBATIS等),同样支持参数化查询。 + +**【反例】**(Java代码动态构建SQL) + +```java +Statement stmt = null; +ResultSet rs = null; +try { + String userName = request.getParameter("name"); + String password = request.getParameter("password"); + ... + String sqlStr = "SELECT * FROM t_user_info WHERE name = '" + userName + + "' AND password = '" + password + "'"; + stmt = connection.createStatement(); + rs = stmt.executeQuery(sqlString); + ... // 结果集处理 +} catch (SQLException ex) { + // 处理异常 +} +``` + +上述示例中使用用户提交的用户名和密码构造SQL语句,验证用户名和密码信息是否匹配,通过字符串拼接的方式构造SQL语句,存在SQL注入。恶意用户在仅知道用户名时,通过`zhangsan' OR 'a' = 'a`和**任意密码**的方式就能完成上述代码中的查询。 + +**【正例】**(使用PreparedStatement进行参数化查询) + +```java +PreparedStatement stmt = null; +ResultSet rs = null; +try { + String userName = request.getParameter("name"); + String password = request.getParameter("password"); + ... // 确保userName和password的长度是合法的 + String sqlStr = "SELECT * FROM t_user_info WHERE name=? AND password =?"; + stmt = connection.prepareStatement(sqlStr); + stmt.setString(1, userName); + stmt.setString(2, password); + rs = stmt.executeQuery(); + ... // 结果集处理 +} catch (SQLException ex) { + // 处理异常 +} +``` + +参数化查询在SQL语句中使用占位符表示需在运行时确定的参数值,使得SQL查询的语义逻辑预先被定义,实际的查询参数值则在程序运行时再确定。参数化查询使得数据库能够区分SQL语句中语义逻辑和数据参数,以确保用户输入无法改变预期的SQL查询语义逻辑。如果攻击者输入userName为`zhangsan' OR 'a' = 'a`,该字符串仅会作为name字段的值来使用。 + +**【正例】**(对输入输入做转义) + +```java +public List queryBooks(List queryCondition) { + ... + try { + StringBuilder sb = new StringBuilder("select * from t_book where "); + Codec oe = new OracleCodec(); + if (queryCondition != null && !queryCondition.isEmpty()) { + for (Expression e : queryCondition) { + String exprString = e.getColumn() + e.getOperator(); + String safeValue = XXXEncoder.encodeForSQL(oe, e.getValue()); + sb.append(exprString).append("'").append(safeValue).append("' and "); + } + sb.append("1=1"); + Statement stat = connection.createStatement(); + ResultSet rs = stat.executeQuery(sb.toString()); + ... // 其他代码 + } + } + ... +} +``` + +虽然参数化查询是防止SQL注入最便捷有效的一种方式,但不是SQL语句中任何部分在执行前都能够被占位符所替代,因此,参数化查询无法应用于所有场景。当使用执行前不可被占位符替代的外部数据来动态构建SQL语句时,必须对外部数据进行校验。每种DBMS都有其特定的转义机制,通过这种机制来告诉数据库此输入应该被当作数据,而不应该是代码逻辑。因此,只要输入数据被适当转义,就不会发生SQL注入问题。 + +**注:**如果传入的是字段名或者表名,建议使用白名单的方式进行校验。 + +在存储过程中,通过拼接参数值来构建查询字符串,和在应用程序代码中拼接参数一样,同样是有SQL注入风险的。 + +**【反例】**(在存储过程中动态构建SQL) + +SQL Server存储过程: + +```sql +CREATE PROCEDURE sp_queryItem + @userName varchar(50), + @password varchar(50) +AS +BEGIN + DECLARE @sql nvarchar(500); + SET @sql = 'SELECT * FROM t_user_info + WHERE name= ''' + @userName + ''' + AND password= ''' + @password + ''''; + EXEC(@sql); +END +GO +``` + +在存储过程中,通过拼接参数值来构建查询字符串,和在应用程序代码中拼接参数一样,同样是有SQL注入风险的。 + +**【正例】**(在存储过程中进行参数化查询) + +SQL Server存储过程: + +```sql +CREATE PROCEDURE sp_queryItem + @userName varchar(50), + @password varchar(50) +AS +BEGIN + SELECT * FROM t_user_info + WHERE name = @userName + AND password = @password; +END +GO +``` + +存储过程使用参数化查询,而不包含不安全的动态SQL构建。数据库编译此存储过程时,会生成一个SELECT查询的执行计划,只允许原始的SQL语义被执行,任何参数值,即使是被注入的SQL语句也不会被执行。 + +## 禁止使用外部数据构造格式化字符串 + +**描述】** + +Java中的Format可以将对象按指定的格式转为某种格式的字符串,格式化字符串可以控制最终字符串的长度、内容、样式,当格式化字符串中指定的格式与格式对象不匹配时还可能会抛出异常。当攻击者可以直接控制格式化字符串时,可导致信息泄露、拒绝服务、系统功能异常等风险。 + +**【反例】** + +```java +public String formatInfo(String formatStr) { + String value = getData(); + return String.format(formatStr, value)); +} + +String formatStr = req.getParameter("format"); +String formattedValue = formatInfo(formatStr); +``` + +上面的示例代码中,直接使用外部指定的格式对字符串进行格式化,当外部指定的格式为非字符类型如%d,会导致格式化操作出现异常。 + +**【正例】** + +```java +public String formatInfo() { + String value = getData(); + return String.format("my format: %s", value)); +} +``` + +上述示例将用户输入排除在格式化字符串之外。 + +## 禁止向Runtime.exec()方法或java.lang.ProcessBuilder类传递外部数据 + +**【描述】** + +`Runtime.exec()`方法或`java.lang.ProcessBuilder`类被用来启动一个新的进程,在新进程中执行命令。命令执行通常会有两种方式: + +- 直接执行具体命令: 例如`Runtime.getRuntime().exec("ping 127.0.0.1")`; + +直接使用外部数据构造命令行,会存在以下风险: + +- 执行命令时,需要命令行解释器对命令字符串进行拆分,该方式可执行多条命令,存在命令注入风险; +- 直接执行具体的命令时,可以通过空格、双引号或以-/开头的字符串向命令行中注入参数,存在参数注入风险。 + +**外部数据用于构造非shell方式的命令行** + +**【反例】** + +```java +String cmd = "ping" + ip; +Runtime rt = Runtime.getRuntime(); +Process proc = rt.exec(cmd); +``` + +当ip的值为“ 127.0.0.1 -t”的时候,会向实际执行的命令中注入参数“-t”参数,导致ping进程持续执行。 + +针对命令注入或参数注入,具体的解决方案如下: + +1、**避免直接执行命令** + +对于Java的标准库或开源组件已经提供的功能,应使用标准库或开源组件的API,避免执行命令。 + +如果无法避免执行命令,则必须要对外部数据进行检查和过滤。 + +2、**对外部数据进行校验** + +**【正例】**(数据校验) + +```java +... +// str值来自用户输入 +if (!Pattern.matches("[0-9A-Za-z@]+", str)) { + // 处理错误 +} +... +``` + +外部数据用于拼接命令行时,可使用白名单方式对外部数据进行校验,保证外部数据中不含注入风险的特殊字符。 + +3、**对外部数据进行转义** + +**【正例】**(转义) + +```java +String encodeIp = XXXXEncoder.encodeForOS(new WindowsCodec(), ip); +String cmd = "cmd.exe /c ping " + encodeIp; +Runtime rt = Runtime.getRuntime(); +Process proc = rt.exec(cmd); +... +``` + +在执行命令行时,如果输入校验不能禁止有风险的特殊字符,需先外部输入进行转义处理,转义后的字段拼接命令行可有效防止命令注入的产生。 + +说明:正确的转义处理只是针对外部输入,而不是拼接后的完整命令行。转义方式只针对命令注入有效,对于参数注入无效。 + +## 禁止直接使用外部数据来拼接XML + +**【描述】** + +使用未经校验的数据来构造XML会导致XML注入漏洞。如果用户被允许输入结构化的XML片段,则用户可以在XML的数据域中注入XML标签来改写目标XML文档的结构和内容,XML解析器会对注入的标签进行识别和解释,引起注入问题。 + +**【反例】** + +```java +private void createXMLStream(BufferedOutputStream outStream, User user) + throws IOException { + String xmlString; + xmlString = "operator" + user.getUserId() + + "" + user.getDescription() + ""; + ... // 解析xml字符串 +} +``` + +恶意用户可能会使用下面的字符串作为用户ID: + +``` +"joeadministratorjoe" + +``` + +并使用如下正常的输入作为描述字段: + +``` +"I want to be an administrator" + +``` + +最终,整个XML字符串将变成如下形式: + +```xml + + operator + joe + administrator + joe + I want to be an administrator + +``` + +由于SAX解析器(org.xml.sax and javax.xml.parsers.SAXParser)在解释XML文档时会将第二个role域的值覆盖前一个role域的值,因此会导致此用户角色由操作员提升为了管理员。 + +**【反例】**(XML Schema或者DTD校验) + +```java +private void createXMLStream(BufferedOutputStream outStream, User user) + throws IOException { + String xmlString; + xmlString = "" + user.getUserId() + + "operator" + user.getDescription() + + ""; + + StreamSource xmlStream = new StreamSource(new StringReader(xmlString)); + + // 创建一个使用schema执行校验的SAX解析器 + SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + StreamSource ss = new StreamSource(new File("schema.xsd")); + try { + Schema schema = sf.newSchema(ss); + Validator validator = schema.newValidator(); + validator.validate(xmlStream); + } catch (SAXException ex) { + throw new IOException("Invalid userId", ex); + } + + // XML是有效的, 进行处理 + outStream.write(xmlString.getBytes(StandardCharsets.UTF_8)); + outStream.flush(); +} +``` + +如下是schema.xsd文件中的schema定义: + +```xml + + + + + + + + + + + +``` + +某个恶意用户可能会使用下面的字符串作为用户ID: + +``` +"joeAdministratorI want to be an administrator" + +``` + +最终,整个XML字符串将变成如下形式: + +```xml + + joe + Administrator + I want to be an administrator + +``` + +用户ID结尾处的``将会注释掉原本硬编码在XML字符串中的角色信息。虽然用户角色已经被攻击者篡改成管理员类型,但是整个XML字符串仍然可以通过schema的校验。XML schema或者DTD校验仅能确保XML的格式是有效的,而攻击者可以在不打破原有XML格式的情况下,对XML的内容进行篡改。 + +**【正例】**(白名单校验) + +```java +private void createXMLStream(BufferedOutputStream outStream, User user) + throws IOException { + // 仅当userID只包含字母、数字和下划线时写入XML字符串 + if (!Pattern.matches("[_a-bA-B0-9]+", user.getUserId())) { + // 处理错误 + } + if (!Pattern.matches("[_a-bA-B0-9]+", user.getDescription())) { + // 处理错误 + } + String xmlString = "" + user.getUserId() + + "operator" + + user.getDescription() + ""; + outStream.write(xmlString.getBytes(StandardCharsets.UTF_8)); + outStream.flush(); +} +``` + +这个方法使用白名单的方式对输入进行校验,要求输入的userId中只能包含字母、数字或者下划线。 + +**【正例】**(使用安全的XML库) + +```java +public static void buidlXML(FileWriter writer, User user) throws IOException { + Document userDoc = DocumentHelper.createDocument(); + Element userElem = userDoc.addElement("user"); + Element idElem = userElem.addElement("id"); + idElem.setText(user.getUserId()); + Element roleElem = userElem.addElement("role"); + roleElem.setText("operator"); + Element descrElem = userElem.addElement("description"); + descrElem.setText(user.getDescription()); + XMLWriter output = null; + try { + OutputFormat format = OutputFormat.createPrettyPrint(); + format.setEncoding("UTF-8"); + output = new XMLWriter(writer, format); + output.write(userDoc); + output.flush(); + } finally { + // 关闭流 + } +} +``` + +上述示例中使用Dom4j来构建XML,Dom4j是一个定义良好、开源的XML工具库。Dom4j会对文本数据域进行XML编码,从而使得XML的原始结构和格式免受破坏。 + +这个例子中,攻击者如果输入如下字符串作为用户ID: + +``` +"joeAdministratorI want to be an administrator" + +``` + +则最终会生成如下格式的XML: + +```xml + + joe</id><role>Administrator</role><!-- + operator + --><description>I want to be an administrator + +``` + +可以看到,“<”与“>”经过XML编码后分别被替换成了 “**\<”**与”**\>**”,导致攻击者未能将其角色类型从操作员提升到管理员。 + +**【正例】**(编码) + +```java +private void createXMLStream(BufferedOutputStream outStream, User user) + throws IOException { + ... + String encodeUserId = XXXXEncoder.encodeForXML(user.getUserId()); + String encodeDec = XXXXEncoder.encodeForXML(user.getDescription()); + + String xmlString = "" + encodeUserId + + "operator" + encodeDec + + ""; + outStream.write(xmlString.getBytes(StandardCharsets.UTF_8)); + outStream.flush(); +} +``` + +上述示例中,对外部数据在拼接XML字符串前进行了编码处理,然后再构造XML字符串,这样就不会导致XML字符串结构被篡改。 + +## 防止解析来自外部的XML导致的外部实体(XML External Entity)攻击 + +**【描述】** + +XML实体包括内部实体和外部实体。外部实体格式:``或者``。Java中引入外部实体的协议包括http、https、ftp、file、jar、netdoc、mailto等。XXE漏洞发生在应用程序解析来自外部的XML数据或文件时没有禁止外部实体的加载,造成任意文件读取、内网端口扫描、内网网站攻击、DoS攻击等危害。 + +1.利用外部实体的引用功能实现任意文件的读取: + +```xml + + ]> + + Joe + &file; + ... + +``` + +2.使用参数实体和避免XML解析语法错误,构造恶意的实体解析: + +XML文件:构造参数实体 % start;% goodies;% end;% dtd定义一个恶意的combine.dtd + +```xml + + + + "> + + %dtd; + ]> +&all; +``` + +恶意DTD:combine.dtd中定义实体&all; + +```xml + + +``` + +甚至可以这样构造恶意的combine.dtd,将结果发送到目标地址,最后会获得file:///etc/fstab文件。 + +```xml + +"> +%send; +``` + +**【反例】** + +该示例中对来自外部的XML文件进行解析,没有禁止解析DTDs或者禁止解析外部实体。 + +```java +private void parseXmlFile(String filePath) { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document doc = db.parse(new File(filePath)); + ... // 解析xml文件中的内容 + } catch (ParserConfigurationException ex) { + // 处理异常 + } + ... +} +``` + +上述代码示例中解析XML文件时未进行安全防护,当解析的XML文件是攻击者恶意构造的,系统会受到XXE攻击。 + +**【正例】**(禁止解析DTDs) + +```java +private void parserXmlFileDisableDtds(String filePath) { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + + dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); + dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document doc = db.parse(new File(filePath)); + ... // 解析xml文件中的内容 + } catch (ParserConfigurationException ex) { + // 处理异常 + } + ... +} +``` + +代码中设置禁止解析DTDs属性,该方式不仅可以防止XML的外部实体攻击也能防止XML内部实体攻击。 + +**【正例】**(禁止解析外部一般实体和外部参数实体) + +该代码示例能防止外部实体(XXE)攻击,不能防止XML内部实体攻击。 + +```java +private void parserXmlFileDisableExternalEntityes(String filePath) { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false); + dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); + dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document doc = db.parse(new File(filePath)); + ... // 解析xml文件中的内容 + } catch (ParserConfigurationException ex) { + // 处理异常 + } + ... +} +``` + +**【正例】**(对外部实体进行白名单校验) + +这个示例方法定义一个CustomResolver类来实现接口`org.xml.sax.EntityResolver`。在这个类中实现自定义的处理外部实体机制。自定义实体解析方法中使用一个简单的白名单,在白名单范围内的返回对应的文件内容,否则返回一个空的实体解析内容。 + +```java +private static void parserXmlFileValidateEntities(String filePath) { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.setEntityResolver(new ValidateEntityResolver()); + Document doc = db.parse(new File(filePath)); + ... // 解析xml文件中的内容 + } catch (ParserConfigurationException ex) { + // 处理异常 + } + ... +} + +class ValidateEntityResolver implements EntityResolver { + private static final String GOOD_ENTITY = "file:/Users/onlinestore/good.xml"; + + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException { + if (publicId != null && publicId.equals(GOOD_ENTITY)) { + return new InputSource(publicId); + } else if (systemId != null && systemId.equals(GOOD_ENTITY)) { + return new InputSource(systemId); + } else { + return new InputSource(); + } + } +} +``` + +当系统中涉及的XML操作中必须使用外部实体时,必须对外部实体进行白名单校验。具体的校验方式如上述代码,自定义一个`ValidateEntityResolver`类(实现接口`org.xml.sax.EntityResolver`),在`resolveEntity`方法中对XML中引入的实体进行白名单校验,拒绝解析非白名单中的外部实体。 + +备注:XML解析器非常多,不能一一列举。当程序加载来自外部的XML数据时,通过设置对该解析器生效的属性或其他方法达到禁止解析外部实体的目的,通过构建上面示例中有攻击行为的XML内容,查看程序反应来判断设置的属性是否已经生效。 + +## 防止解析来自外部的XML导致的内部实体扩展(XML Entity Expansion)攻击 + +**【描述】** + +XML内部实体是实体的内容已经在Doctype中声明。内部实体格式:``。内部实体攻击比较常见的是XML Entity Expansion攻击,它主要试图通过消耗目标程序的服务器内存资源导致DoS攻击。外部实体攻击和内部实体扩展攻击有不同的防护措施(禁止DTDs解析可以防护外部实体和内部实体攻击)。 + +解析下面恶意的XML内部实体,会占用大量服务器内存资源,导致拒绝服务攻击。 + +```xml + + + + + + + + + + + ]> +&lol9; +``` + +内部实体扩展攻击**最好的防护措施是禁止DTDs的解析**。也可以对内部实体数量进行限制,以消减内部实体扩展攻击发生的可能性。在不需要使用内部实体时,应该禁止DTDs解析,需要使用内部实体时,严格限制内部实体的数量及XML内容的大小。 + +**【正例】**(禁止解析DTDs) + +```java +public void receiveXMLStream(InputStream inStream) + throws ParserConfigurationException, SAXException, IOException { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); + dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.parse(inStream); +} +``` + +**【正例】**(限制实体解析个数) + +Java中的JAXP解析器默认限制实体解析个数是64,000个,但通常不会需要解析这么多的实体个数,可以限制更小的实体解析个数。该代码示例中通过设置DOM解析器的属性限制解析实体个数。 + +```java +public void receiveXMLStream(InputStream inStream) + throws ParserConfigurationException, SAXException, IOException { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setAttribute("http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit", + "200"); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.parse(inStream); +} +``` + +备注:属性http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit在JDK 7u45+、JDK 8版本中支持。JAXP中的SAX和StAX类型解析器不支持该属性。 + +**【正例】**(限制实体解析个数) + +该代码示例中通过设置系统属性限制解析实体个数。 + +```java +public void receiveXMLStream(InputStream inStream) + throws ParserConfigurationException, SAXException, IOException { + + // 使用系统属性限制 + System.setProperty("entityExpansionLimit", "200"); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.parse(inStream); +} +``` + +备注:系统属性entityExpansionLimit在JDK 7u45+、JDK 8版本中支持。JAXP中的SAX和StAX类型解析器同样生效。 + +有些产品使用Xerces第三方jar包提供的DOM、SAX、StAX类型解析器,该jar包中可以通过设置`setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true)`限制实体个数不能超过100,000个。 + +**【正例】**(限制解析实体个数) + +Xerces包中限制实体解析个数代码。 + +```java +private static void receiveXMLStream(InputStream inStream) + throws ParserConfigurationException, SAXException, IOException { + DocumentBuilderFactory factory = DocumentBuilderFactoryImpl.newInstance(); + factory.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true); + DocumentBuilder db = factory.newDocumentBuilder(); + org.w3c.dom.Document doc = db.parse(inStream); + doc.getChildNodes(); +} +``` + +备注:XML解析器非常多,不能一一列举。当程序加载来自外部的XML数据时,通过设置对该解析器生效的属性或其他方法达到禁止解析内部实体的目的,通过构建上面示例中有攻击行为的XML内容,查看程序反应来判断设置的属性是否已经生效。 + +## 禁止使用不安全的XSLT转换XML文件 + +**【描述】** + +XSLT是一种样式转换标记语言,可以将XML数据转换为另外的XML或其他格式,如HTML网页,纯文字。因为XSLT的功能十分强大,可以导致任意代码执行,当使用TransformerFactory转换XML格式数据的时候,需要添加安全策略禁止不安全的XSLT代码执行。 + +**【反例】** + +```java +public void XsltTrans(String src, String dst, String xslt) { + // 获取转换器工厂 + TransformerFactory tf = TransformerFactory.newInstance(); + try { + // 获取转换器对象实例 + Transformer transformer = tf.newTransformer(new StreamSource(xslt)); + + // 进行转换 + transformer.transform(new StreamSource(src), + new StreamResult(new FileOutputStream(dst))); + ... + } catch (TransformerException ex) { + // 处理异常 + } + ... +} +``` + +这里xslt没有做任何限制,直接调用,当执行类似如下XSLT代码的时候,会导致命令执行漏洞: + +```xml + + + + + + + +``` + +**【正例】** + +```java +public void xsltTrans(String src, String dst, String xslt) { + // 获取转换器工厂 + TransformerFactory tf = TransformerFactory.newInstance(); + try { + // 转换器工厂设置黑名单,禁用一些不安全的方法,类似XXE防护 + tf.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true); + + // 获取转换器对象实例 + Transformer transformer = tf.newTransformer(new StreamSource(xslt)); + + // 去掉 + transformer.setOutputProperty("omit-xml-declaration", "yes"); + + // 进行转换 + transformer.transform(new StreamSource(src), + new StreamResult(new FileOutputStream(dst))); + ... + } catch (TransformerException ex) { + // 处理异常 + } + ... +} +``` + +TransformerFactory可以添加安全策略防护,Java对xslt内置了黑名单,这里通过将[http://javax.xml.XMLConstants/feature/secure-processing属性设置为true开启防护,可以禁用一些不安全的方法。](http://javax.xml.xmlconstants/feature/secure-processing属性设置为true开启防护,可以禁用一些不安全的方法。) + +## 正则表达式应该尽量简单,防止ReDos攻击 + +**【描述】** + +ReDos攻击是正则编写不当导致的常见安全风险。Java中提供的正则匹配使用的是NFA引擎。NFA引擎的回溯机制,导致当字符串文本与正则表达式不匹配时,所花费的时间要比匹配时多。即要确定匹配失败,需要与所有可能的路径进行对比匹配,证明都不匹配时,才返回匹配失败。当使用简单的非分组正则表达式时,一般不会存在ReDos攻击。容易存在ReDos攻击的正则表达式主要有两类: + +1、 包含具有自我重复的重复性分组的正则,例如: +`^(\d+)+$` +`^(\d*)*$` +`^(\d+)*$` +`^(\d+|\s+)*$` + +2、 包含替换的重复性分组,例如: +`^(\d|\d|\d)+$` +`^(\d|\d?)+$` + +对于ReDos攻击的防护手段主要包括: + +- 进行正则匹配前,先对匹配的文本的长度进行校验; +- 在编写正则时,尽量不要使用过于复杂的正则,尽量少用分组,例如对于正则`^(([a-z])+\.)+[A-Z]([a-z])+$`(存在ReDos风险),可以将多余的分组删除:`^([a-z]+\.)+[A-Z][a-z]+$`,这样在不改变检查规则的前提下消除了ReDos风险; +- 避免动态构建正则,当使用外部数据构造正则时,要使用白名单进行严格校验。 + +**【反例】** + +```java +private static final Pattern REGEX_PATTER = Pattern.compile("a(b|c+)+d"); + +public static void main(String[] args) { + ... + Matcher matcher = REGEX_PATTER.matcher(args[0]); + if (matcher.matches()) { + ... + } else { + ... + } + ... +} +``` + +上述示例代码中,正则表达式`a(b|c+)+d`存在ReDos风险,当匹配的字符串格式为”accccccccccccccccx”时,随中间的字符”c”的增加,代码执行时间将成指数级增长。 + +**【正例】** + +```java +private static final Pattern REGEX_PATTER = Pattern.compile("a[bc]+d"); + +public static void main(String[] args) { + ... + Matcher matcher = REGEX_PATTER.matcher(args[0]); + if (matcher.matches()) { + ... + } else { + ... + } + ... +} +``` + +上述代码中,将正则表达式精简为`a[bc]+d`,可以在实现相同功能的前提下消除ReDos风险。 + +**【反例】** + +```java +String key = request.getParameter("keyword"); +... +String regex = "[a-zA-Z0-9_-]+@" + key + "\\.com"; +Pattern searchPattern = Pattern.compile(regex); +... +``` + +上面的代码示例中,使用外部指定的keyword构造正则,当外部输入中使用了重复性分组,可能会导致最终的正则存在ReDos风险。在实际开发代码过程中,应避免直接使用外部数据构造正则或直接使用外部数据作为正则使用。 + +## 禁止直接使用外部数据作为反射操作中的类名/方法名 + +**【描述】** + +反射操作中直接使用外部数据作为类名或方法名,会导致系统执行非预期的逻辑流程(Unsafe Reflection)。这可被恶意用户利用来绕过安全检查或执行任意代码。当反射操作需要使用外部数据时,必须对外部数据进行白名单校验,明确允许访问的类或方法列表;另外也可以通过让用户在指定范围内选择的方式进行防护。 + +**【反例】** + +```java +String className = request.getParameter("class"); +... +Class objClass = Class.forName(className); +BaseClass obj = (BaseClass) objClass.newInstance(); +obj.doSomething(); +``` + +上述代码示例中,直接使用外部指定的类名通过反射构造了一个对象,恶意用户可利用此处构造一个任意的`BaseClass`子类的对象,当恶意用户可控制`BaseClass`的某个子类时,则可在该子类的`doSomething()`方法中执行任意代码。另外恶意用户还可以利用此代码执行任意类的默认构造方法,即使在进行类型转换时抛出`ClassCastException`,恶意用户预期的构造方法中的代码也已经执行。 + +**【正例】** + +```java +String classIndex = request.getParameter("classIndex"); +String className = (String) reflectClassesMap.get(classIndex); +if (className != null) { + Class objClass = Class.forName(className); + BaseClass obj = (BaseClass) objClass.newInstance(); + obj.doSomething(); +} else { + throw new IllegalStateException("Invalid reflect class!"); +} +... +``` + +上述示例代码中,外部只能指定要反射的类的代号,当代号可映射为一个指定的类名时,执行反射操作,否则判断为非法参数。 + +# 日志 + +#### 禁止直接使用外部数据记录日志 + +**【描述】** + +直接将外部数据记录到日志中,可能存在以下风险: + +- 日志注入:恶意用户可利用回车、换行等字符注入一条完整的日志; +- 敏感信息泄露:当用户输入敏感信息时,直接记录到日志中可能会导致敏感信息泄露; +- 垃圾日志或日志覆盖:当用户输入的是很长的字符串,直接记录到日志中可能会导致产生大量垃圾日志;当日志被循环覆盖时,这样还可能会导致有效日志被恶意覆盖。 + +所以外部数据应尽量避免直接记录到日志中,如果必须要记录到日志中,要进行必要的校验及过滤处理,对于较长字符串可以截断。对于记录到日志中的数据含有敏感信息时,对于秘钥、口令类的敏感信息,将这些敏感信息替换为固定长度的*,对于其他类的敏感信息(如手机号、邮箱等),先进行匿名化处理。 + +**【反例】** + +```java +String jsonData = getRequestBodyData(request); +if (!validateRequestData(jsonData)) { + LOG.error("Request data validate fail! Request Data : " + jsonData); +} +``` + +上述代码中,当请求的json数据校验失败,会直接将json字符串记录到日志中,当json字符串中含有敏感信息,会导致敏感信息泄露的风险,当恶意用户向json字符串中通过回车换行符注入伪造的日志会造成日志注入问题,当json字符串比较长时,会导致日志冗余。 + +**【正例】** + +外部数据记录到日志中前,将其中的\r\n等导致换行的字符进行替换,消除注入风险。如下代码为其中一种实现方式: + +```java +public String replaceCRLF(String message) { + if (message == null) { + return ""; + } + return message.replace('\n', '_').replace('\r', '_'); +} +``` + +#### 禁止在日志中记录口令、密钥等敏感信息 + +**【描述】** + +在日志中不能记录口令、密钥等敏感信息,包括这些敏感信息的加密密文,防止产生敏感信息泄露风险。若因为特殊原因必须要记录日志,应用固定长度的星号(*)代替这些敏感信息。 + +**【反例】** + +```java +private static final Logger LOGGER = Logger.getLogger(TestCase1.class); +... +LOGGER.info("Login success, user is " + userName + ", password is " + + encrypt(pwd.getBytes(StandardCharsets.UTF_8))); +``` + +**【正例】** + +```java +private static final Logger LOGGER = Logger.getLogger(TestCase1.class); +... +LOGGER.info("Login success, user is " + userName + ", password is ********."); +``` + +# 性能和资源管理 + +#### 进行IO类操作时,必须在try-with-resource或finally里关闭资源 + +**【描述】** + +申请的资源不再使用时,需要及时释放。而在产生异常时,资源释放常被忽视。因此要求在IO、数据库操作等需要显式调用关闭方法如`close()`释放资源时,必须在try-catch-finally的finally中调用关闭方法。如果有多个IO对象需要`close()`,需要分别对每个对象的`close()`方法进行try-catch,防止一个IO对象关闭失败导致其他IO对象都未关闭,保证产生异常时释放已申请的资源。 + +Java 7有自动资源管理的特性try-with-resource,不需手动关闭。它优先于try-finally,这样得到的代码将更加简洁、清晰,产生的异常也更有价值。特别是对于多个资源或异常时,try-finally可能丢失掉前面的异常,而try-with-resource会保留第一个异常,并把后续的异常作为Suppressed exceptions,可通过`getSuppressed()`返回的数组来检验。 + +try-finally也常用于`lock()`和`unlock()`等场景。 + +**【正例】** + +```java +try (FileInputStream in = new FileInputStream(inputFileName); + FileOutputStream out = new FileOutputStream(outputFileName)) { + copy(in, out); +} +``` + +# 其他 + +#### 全场景下必须使用密码学意义上的安全随机数 + +**【描述】** + +不安全的随机数可能被部分或全部预测到,导致系统存在安全隐患,安全场景下使用的随机数必须是密码学意义上的安全随机数。密码学意义上的安全随机数分为两类: + +- 真随机数产生器产生的随机数; +- 以真随机数产生器产生的少量随机数作为种子的密码学安全的伪随机数产生器产生的大量随机数。 + +Java中的`SecureRandom`是一种密码学安全的伪随机数产生器,对于使用非真随机数产生器产生随机数时,要使用少量真随机数作为种子。 + +常见安全场景包括但不限于以下场景: + +- 用于密码算法用途,如生成IV、盐值、密钥等; +- 会话标识(sessionId)的生成; +- 挑战算法中的随机数生成; +- 验证码的随机数生成; + +**【反例】** + +```java +public byte[] generateSalt() { + byte[] salt = new byte[8]; + Random random = new Random(123456L); + random.nextBytes(salt); + return salt; +} +``` + +`Random`生成是不安全随机数,不能用做盐值。 + +**【反例】** + +```java +public byte[] generateSalt() { + byte[] salt = new byte[8]; + SecureRandom random = new SecureRandom(); + random.nextBytes(salt); + return salt; +} +``` + +#### 必须使用SSLSocket代替Socket来进行安全数据交互 + +**【描述】** + +当网络通信中涉及明文的敏感信息时,需要使用SSLSocket而不是Socket,Socket是明文通信,攻击者可以通过网络监听获取其中的敏感信息,通过中间人攻击对报文进行恶意篡改。SSLSocket是在Socket的基础上进行了一个层安全性保护,包括身份认证、数据加密和完整性保护。 + +**【反例】** + +```java +try { + Socket socket = new Socket(); + socket.connect(new InetSocketAddress(ip, port), 10000); + os = socket.getOutputStream(); + os.write(userInfo.getBytes(StandardCharsets.UTF_8)); + ... +} catch (IOException ex) { + // 处理异常 +} finally { + // 关闭流 +} +``` + +上述代码中使用socket来明文传输报文信息,报文中的敏感信息存在泄露及篡改的风险。 + +**【正例】** + +```java +try { + SSLSocketFactory sslSocketFactory = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(ip, port); + os = sslSocket.getOutputStream(); + os.write(userInfo.getBytes(StandardCharsets.UTF_8)); + ... +} catch (IOException ex) { + // 处理异常 +} finally { + // 关闭流 +} +``` + +该正确代码示例中,SSLSocket来使用SSL/TLS安全协议保护传输的报文。 + +**【例外】** + +因为SSLSocket提供的报文安全传输机制,将造成巨大的性能开销。在以下情况下,普通的套接字就可以满足需求: + +- 套接字上传输的数据不敏感。 +- 数据虽然敏感,但是已经过恰当加密。 + +#### 禁止代码中包含公网地址 + +**【级别】** 要求 + +**【描述】** + +代码或脚本中包含用户不可见,不可知的公网地址,可能会引起客户质疑。 + +对产品发布的软件(包含软件包/补丁包)中包含的公网地址(包括公网IP地址、公网URL地址/域名、邮箱地址)要求如下: +1、禁止包含用户界面不可见、或产品资料未描述的未公开的公网地址。 +2、已公开的公网地址禁止写在代码或者脚本中,可以存储在配置文件或数据库中。 + +对于开源/第三方软件自带的公网地址必须至少满足上述第1条公开性要求。 + +**【例外】** + +对于标准协议中必须指定公网地址的场景可例外,如soap协议中函数的命名空间必须指定的一个组装的公网URL、http页面中包含w3.org网址、XML解析器中的Feature名等。 \ No newline at end of file diff --git a/website/docs/_posts/contribute/OpenHarmony-JavaScript-coding-style-guide.md b/website/docs/_posts/contribute/OpenHarmony-JavaScript-coding-style-guide.md new file mode 100644 index 0000000000000000000000000000000000000000..14eb204b3ae6fe21cefd5e3a10c5fc39807630ed --- /dev/null +++ b/website/docs/_posts/contribute/OpenHarmony-JavaScript-coding-style-guide.md @@ -0,0 +1,770 @@ +--- +title: OpenHarmony-JavaScript-coding-style-guide.md +permalink: /pages/extra/b5a613/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# JavaScript语言通用编程规范 + +## 目的 +规则并不是完美的,通过禁止在特定情况下有用的特性,可能会对代码实现造成影响。但是我们制定规则的目的“为了大多数程序员可以得到更多的好处”, 如果在团队运作中认为某个规则无法遵循,希望可以共同改进该规则。 +参考该规范之前,希望您具有相应的JavaScript语言基础能力,而不是通过该文档来学习JavaScript语言。 + +## 总体原则 +代码需要在保证功能正确的前提下,满足**可读、可维护、安全、可靠、可测试、高效、可移植**的特征要求。 + +## 约定 + +**规则**:编程时必须遵守的约定 +**建议**:编程时必须加以考虑的约定 + +无论是“规则”还是“建议”,都必须理解该条目这么规定的原因,并努力遵守。 + +## 例外 + +在不违背总体原则,经过充分考虑,有充足的理由的前提下,可以适当违背规范中约定。 +例外破坏了代码的一致性,请尽量避免。“规则”的例外应该是极少的。 + +下列情况,应风格一致性原则优先: +**修改外部开源代码、第三方代码时,应该遵守开源代码、第三方代码已有规范,保持风格统一。** + +## 编程规范 + +### 命名规范 + +#### 规则1.1 须使用正确的英文拼写进行命名,禁止使用拼音拼写。 + +**反例:**`xingming`、`zhanghao` + +**正例:**`username`、`account` + +#### 规则1.2 命名尽量少用缩写,除非是常见词或者业务线的领域词汇。比如:`context`可以简写成`ctx`,`request`可简写成`req`,`response`可简写成`resp`。 + +**说明:** 完整的单词拼写可以避免不必要的阅读障碍。 + +**例外:** 循环语种中可以使用`i`、`j`循环条件变量名。 + +#### 规则1.3 类名、枚举名、命名空间名采用`UpperCamelCase`风格。 + +**正例:** + +```javascript +// 类名 +class User { + constructor(username) { + this.username = username; + } + + sayHi() { + console.log(`hi, ${this.username}`); + } +} + +// 枚举名 +const UserType = { + TEACHER: 0, + STUDENT: 1 +}; + +// 命名空间 +const Base64Utils = { + encrypt: function(text) { + // todo encrypt + }, + decrypt: function(text) { + // todo decrypt + } +}; +``` + +#### 规则1.4 变量名、方法名、参数名采用`lowerCamelCase`风格。 + +**正例:** + +```javascript +let msg = 'Hello world'; + +function sendMsg(msg) { + // todo send message +} + +function findUser(userID) { + // todo find user by user ID +} +``` + +#### 规则1.5 静态常量名、枚举值名采用全部大写,单词间使用下划线隔开。 + +**正例:** + +```javascript +const MAX_USER_SIZE = 10000; + +const UserType = { + TEACHER: 0, + STUDENT: 1 +}; +``` + +#### 建议1.6 避免使用否定的布尔变量名,布尔型的局部变量或方法须加上表达是非意义的前缀。 + +**反例:** + +```javascript +let isNoError = true; +let isNotFound = false; +function empty() {} +function next() {} +``` + +**正例:** + +```javascript +let isError = false; +let isFound = true; +function isEmpty() {} +function hasNext() {} +``` + +### 代码格式 + +#### 规则2.1 采用2个空格缩进,禁止使用`tab`字符 + +**说明:** 只允许使用空格(space)进行缩进,每次缩进为2个空格。不允许使用Tab 符进行缩进。 + +**正例:** + +```javascript +const dataSource = [ + { + id: 1, + title: 'Title 1', + content: 'Content 1' + }, + { + id: 2, + title: 'Title 2', + content: 'Content 2' + } +]; + +function render(container, dataSource) { + if (!container || !dataSource || !dataSource.length) { + return void 0; + } + + const fragment = document.createDocumentFragment(); + for (let data of dataSource) { + if (!data || !data.id || !data.title || !data.content) { + continue; + } + const element = document.createElement("div"); + const textNode = document.createTextNode(`${data.title}: ${data.content}`); + element.appendChild(textNode); + element.setAttribute("id", data.id); + fragment.appendChild(element); + } + container.appendChild(fragment); +} + +``` + +#### 规则2.2 行宽不超过`120`个字符 + +**说明:** 建议每行字符数不要超过 120 个。如果超过120个字符,请选择合理的方式进行换行。 + +**例外:** 如果一行注释包含了超过120 个字符的命令或URL,则可以保持一行,以方便复制、粘贴和通过grep查找; 预处理的 error 信息在一行便于阅读和理解,即使超过 120 个字符。 + +#### 规则3.3 大括号的使用须遵循约定: + +1. 如果大括号内为空,则允许简写成`{}`,且无需换行; +2. 左大括号前不换行,括号后换行; +3. 右大括号前换行,括号后还有`else`、`catch`等情况下不换行,其他情况都换行。 + +#### 规则3.4 条件语句和循环语句的实现必须使用大括号包裹,即使只有一条语句。 + +**反例:** + +```javascript +if (condition) + console.log('success'); + +for(let idx = 0; idx < 5; ++idx) + console.log(idx); +``` + +**正例:** + +```javascript +if (condition) { + console.log('success'); +} + +for(let idx = 0; idx < 5; ++idx) { + console.log(idx); +} +``` + +#### 规则2.5 条件语句和循环语句都不允许写在同一行。 + +**反例:** + +```javascript +if (condition) { /* todo something */ } else { /* todo other */ } + +let idx = 0; +while(idx < 10) console.log(idx); +``` + +**正例:** + +```javascript +if (condition) { + /* todo something */ +} else { + /* todo other */ +} + +let idx = 0; +while(idx < 10) { + console.log(idx); +} +``` + +#### 规则2.6 `switch`语句的`case`和`default` 须缩进一层。 + +**正例:** + +```javascript +switch(condition) { + case 0: + doSomething(); + break; + case 1: { // 可以带括号也可以不带 + doOtherthing(); + break; + } + default: + break; +} +``` + +#### 规则2.7 表达式换行须保持一致性,运算符放行末。 + +**说明:** 较长的表达式,不满足行宽要求时,需要在适当的位置进行换行。一般在较低优先级运算符或连接符后面阶段,运算符或连接符放行末。运算符、连接符放在行末,表示“未结束,后续还有”。 + +**正例:** + +```javascript +// 假设条件语句超出行宽 +if (userCount > MAX_USER_COUNT || + userCount < MIN_USER_COUNT) { + doSomething(); +} + +const sum = + number1 + + number2 + + number3 + + number4 + + number5 + + number6 + + number7 + + number8 + + number9; +``` + +#### 规则2.8 多个变量定义和赋值语句不允许写在一行。 + +**反例:** + +```javascript +let maxCount = 10, isCompleted = false; + +let pointX, pointY; +pointX = 10; pointY = 0; +``` + +**正例:** + +```javascript +let maxCount = 10; +let isCompleted = false; + +let pointX = 0; +let pointY = 0; +``` + +#### 规则2.9 空格应该突出关键字和重要信息,避免不必要的空格。 + +**说明:** 空格可以减低代码密度,增加代码的可读性。总体规则如下: + +1. `if`、`elseif`、`else`、`switch`、`while`、`for`等关键字之后加空格; +2. 小括号内部两侧不加空格; +3. 大括号内部两侧须加空格,但`{}`等简单场景例外; +4. 多重括号之间不加空格; +5. 一元操作符(`&`、`*`、`+`、`-`、`!`等)之后不加空格; +6. 二元操作符(`=`、`+`、`-`、`*`、`/`、`%`、`|`、`&`、`||`、`&&`、`<`、`>`、`<=`、`>=`、`==`、`!=`、`===`、`!==`等)左右两侧加空格; +7. 三元运算符(`?: `)的两侧添加空格; +8. 前置或后置的自增、自减(`++`、`--`)和变量之间不加空格; +9. 逗号(`,`)前面不加空格,后面加空格; +10. 单行注释`//`后加空格; +11. 行尾不加空格。 + +#### 规则2.10 表达式语句须以分号结尾。 + +**反例:** + +```javascript +let username = 'jack' +let birthday = '1997-09-01' + +console.log(`${username}'s birthday is ${birthday}`) +``` + +**正例:** + +```javascript +let username = 'jack'; +let birthday = '1997-09-01'; + +console.log(`${username}'s birthday is ${birthday}`); +``` + +#### 建议2.11 优先使用单引号包裹字符串。 + +**正例:** + +```javascript +let message = 'wolrd'; +console.log(message); +``` + +### 代码规范 + +#### 规则3.1 声明变量时须使用`var`、`let`或`const`关键字进行声明,避免变量暴露到全局作用域上。 + +**说明:** 不使用`var`、`let`或`const`关键字声明变量,会导致将变量暴露到全局作用域上,这样可能会覆盖全局作用域上的同名变量,进而引发GC无法有效回收内存的问题;另外,当变量中包含敏感信息时,暴露到全局作用域可能会导致信息泄露问题。另外,**尽量对所有的引用使用`const`,不要使用 `var`;如果你一定需要可变动的引用,使用 `let` 代替 `var`**。因为`const`和`let`的作用域更小,写代码更容易控制;const可确保无法对引用重新赋值,const引用的指针不可变,重新赋值会报错,避免了不小心的重新赋值给覆盖了。 + +**反例:** + +```javascript +function open() { + url = 'http://127.0.0.1:8080'; //url会暴露到全局作用域上 + //todo something +} +open(); +console.log(url); //url可以被访问到,输出内容:http://127.0.0.1:8080 +``` + +**正例:** + +```javascript +function open() { + let url = 'http://127.0.0.1:8080'; + // todo something +} +open(); +console.log(url); //报错:Uncaught ReferenceError: url is not defined +``` + +```javascript +function open() { + const url = 'http://127.0.0.1:8080'; + //todo something +} +open(); +console.log(url); //报错:Uncaught ReferenceError: url is not defined +``` + +#### 规则3.2 函数块内须使用函数表达式声明函数 + +**说明:** 虽然很多 JS 引擎都支持块内声明函数,但它不属于 ECMAScript规范,各个浏览器糟糕的实现相互不兼容,有些也与未来 ECMAScript草案相违背。另外,ECMAScript5不支持块作用域,对于所有的控制流都不是独立的作用域,其内部声明的变量或者函数都是在其父函数或者脚本的作用域中,导致块内函数或者变量的声明会存在覆盖现象。如果确实需要在块中定义函数,应该使用函数表达式来初始化。 + +**反例:** + +```javascript +function bar(name) { + if (name === "hotel") { + // 1、定义一个foo函数,其作用域不是if代码块,而是bar函数作用域。 + function foo() { + console.log("hotel foo A"); + } + } else { + // 2、再重复定义一次foo函数,覆盖上面if条件分支下的foo函数定义。 + function foo() { + console.log("hotel foo 2"); + } + } + foo && foo(); +} +bar("hotel"); // 输出结果总是显示"hotel foo 2" +``` + +**正例:** + +```javascript +function bar(name) { + var foo; + if (name == "hotel") { + foo = function () { + console.log("hotel foo 1"); + }; + } else { + foo = function () { + console.log("hotel foo 2"); + } + } + foo && foo(); +} +bar("hotel"); // 正确输出"hotel foo 1" +``` + +#### 规则3.3 禁止封装基本类型 + +**说明:** JavaScript中有五种基本数据类型:Undefined、Null、Boolean、Number和String。基本数据类型的值是不可更改的。JavaScript中使用基本数据类型对象只是值,不包含器封装对象的方法和属性,在不需要使用属性和方法的时候,不需要使用其封装类型。 + +**反例:** + +```javascript +var isShow = new Boolean(false); +if (isShow) { + alert('hi'); //被执行,界面弹出显示:hi +} +``` + +**正例:** + +```javascript +var isShow = false; +if (isShow) { + alert('hi'); +} +``` + +#### 规则3.4 禁止使用`with` + +**说明:** 使用 with让你的代码在语义上变得不清晰,因为with的对象,可能会与局部变量产生冲突,从而改变程序原本的用义。 + +**反例:** + +```javascript +var foo = { x: 5 }; +with(foo) { + var x = 3; + console.log(x); //输出:5 +} +``` + +#### 规则3.5 `this`仅可在对象构造函数、方法、闭包中使用 + +**说明:** 在JavaScript里面,this指针代表的是执行当前代码的对象的所有者。this具有特殊的语义: + ++ 全局对象(大多数情况下) ++ 调用者的作用域(使用eval时) ++ DOM 树中的节点(添加事件处理函数时) ++ 新创建的对象(使用一个构造器) ++ 其他对象(如果函数被 call() 或 apply()) + +```javascript +var User = function(username) { + this.username = username; +}; +var user = new User('John'); +console.log(user.username); // 输出:John + +var ClickCounter = { + value: 0, + click: function() { + ++this.value; + }, + getValue() { + return this.value; + } +}; +console.log(Counter.getValue()); //输出:0 +Counter.click(); +console.log(Counter.getValue()); //输出:1 +``` + +#### 规则3.6 禁止使用IE下的条件注释 + +**说明:** 在IE下使用`\@cc_on`语句或使用`\@if`或`\@set`语句可以激活条件编译。尽管可以通过注释来兼容IE以外的浏览器,但它妨碍自动化工具的执行,因为在运行时,它们会改变JavaScript 语法树。 + +**反例:** + +```javascript +var f = function () { + /*@cc_on @*/ + /*@if (@_jscript_version >= 4) + alert("JavaScript version 4 or better"); + @else @*/ + alert("Conditional compilation not supported by this scripting engine."); + /*@end @*/ +}; +``` + +#### 规则3.7 禁止修改内置对象的原型 + +**说明:** 内置对象作为一套公共接口,具有约定俗成的行为方式,修改其原型,可能破坏接口语义,或导致调试时的诡异现象。 + +**反例:** + +```javascript +Array.prototype.indexOf = function () { return -1 } +var arr = [1, 1, 1, 1, 1, 2, 1, 1, 1]; +console.log(aar.indexOf(2)); // 输出:-1 +``` + +#### 规则3.8 禁止直接使用`Object.prototype`的内置属性 + +**说明:** ECMAScript5.1新增了`Object.create`,它创建一个新对象,使用现有的对象来提供新创建的对象的proto。`Object.create(null)`是用于创建用作map的对象的常用模式。当该对象具有`Object.prototype`同名的属性时,可能会导致意外行为或漏洞。例如,web服务器解析来自客户端的JSON输入并且使用`hasOwnProperty`直接调用生成的对象是不安全的,因为恶意客户端可能会发送类似的JSON值`'{ "hasOwnProperty": 1 }'` 并导致服务器崩溃。 + +**反例:** + +```javascript +var hasBarProperty = foo.hasOwnProperty("bar"); +var isPrototypeOfBar = foo.isPrototypeOf(bar); +var barIsEnumerable = foo.propertyIsEnumerable("bar"); +``` + +**正例:** + +```javascript +var hasBarProperty = Object.prototype.hasOwnProperty.call(foo, "bar"); +var isPrototypeOfBar = Object.prototype.isPrototypeOf.call(foo, bar); +var barIsEnumerable = {}.propertyIsEnumerable.call(foo, "bar"); +``` + +#### 规则3.9 使用`Object.getPrototypeOf`函数而不要使用`_proto_` + +说明:ES5引入`Object.getPrototypeOf`函数作为获取对象原型的标准API,但在这之前大量的JavaScript引擎早就使用一个特殊的`proto`属性来达到相同的目的。然而,`proto`它本质上是一个内部属性,而不是一个正式的对外的API,目前浏览器必须部署这个属性,但其他运行环境不一定部署,因此,该属性并不是完全兼容的。例如,对于拥有null原型的对象,不同的环境处理的不一样。 + +```javascript +var empty = Object.create(null); +"_proto_" in empty; //有些环境返回false,有些环境返回true +``` + +所以无论从语义的角度,还是从兼容性的角度,都不要使用proto这个属性,而是使用`Object.getPrototypeOf()`来代替。无论在什么环境中,`Object.getPrototypeOf`函数都是有效的,而且也是提取对象原型更加标准、可移植的方法。 + +#### 规则3.10 不要使用函数构造器创建函数 + +说明:定义函数的方法包括3种:函数声明、Function构造函数和函数表达式。不管用哪种方法定义函数,它们都是Function对象的实例,并将继承Function对象所有默认或自定义的方法和属性。以函数构造器创建函数的方式类似于字符串`eval()`,可以接受任何字符串形式作为它的函数体,这就会有安全漏洞的风险。 + +**反例:** + +```javascript +var func = new Function('a', 'b', 'return a + b'); +var func2 = new Function('alert("Hello")'); +``` + +**正例:** + +```javascript +function func(a, b) { + return a + b; +} + +var func2 = function(a, b) { + return a + b; +} +``` + +#### 建议3.11 在使用原型`prototype`实现继承时,尽量使用现有稳定的库方法而非自行实现 + +**说明:** 多级原型结构是指JavaScript中的继承关系。当定义一个D类,且把B类作为其原型,那么就获得了一个多级原型结构。这些原型结构会变得很复杂。使用现有的稳定的库方法如`the Closure`库的`goog.inherits()`或其他类似的函数,可避免不必要的编码失误,将是更好的选择。 + +#### 建议3.12 定义类时,应在原型下定义方法,在构造方法内定义属性 + +**说明:** JavaScript中有多种方法可以给构造函数添加方法或成员,但是使用原型定义方法,可以降低内存占用,提高运行效率。 + +**反例:** + +```javascript +function Animals() { + this.walk = function() {}; // 这样会导致每个实例上都创建一个walk方法 +} +``` + +**正例:** + +```javascript +function Animals() {} + +Animals.prototype.walk = function() {}; +``` + +#### 建议3.13 使用闭包时,应避免构成循环引用,导致内存泄露 + +**说明:** JavaScript是一种垃圾收集式语言,其对象的内存是根据对象的创建分配给该对象的,并且会在没有对该对象的引用时由浏览器收回。JavaScript的垃圾收集机制本身并没有问题,但浏览器在为DOM对象分配和恢复内存的方式上有些出入。IE和Firefox均使用引用计数来为DOM对象处理内存。在引用计数系统中,每个所引用的对象都会保留一个计数,以获悉有多少对象正在引用它。如果计数为零,那么该对象就会被销毁,其占用的内存也会返回给堆。虽然这种解决方案总的来说还算有效,但是在循环引用方面却存在一些盲点。 当两个对象互相引用时,就构成了循环引用,其中对象的引用计数值都被赋为1。在纯垃圾收集系统中,循环引用问题不大:如果涉及的两个对象中有一个对象被任何其他对象引用,那么这两个对象都将被垃圾收集。而在引用计数系统中,这两个对象都不能被销毁,原因是引用计数永远不能为0。在同时使用了垃圾收集和引用计数的混合系统中,将会发生泄漏,因为系统不能正确识别循环引用。在这种情况下,DOM对象和JavaScript对象均不能被销毁。 循环引用很容易创建。在JavaScript最为方便的编程结构之一——闭包中,循环引用尤其突出。闭包会持有其外部作用域(包括局部变量、参数及方法)的引用,当闭包本身又被作用域成员(常见于DOM对象)持有时便构成循环引用,进一步导致内存泄露。 + +**反例:** + +```javascript +function setClickListener(element, a, b) { + element.onclick = function() { + // 在这里用到a和b + }; +}; +``` + +在上述代码中,即使没有使用element,闭包也保留了element、a和b的引用。由于element也保留了对闭包的引用,因此产生了循环引用,不能被GC回收。 + +**正例:** + +```javascript +function setClickListener(element, a, b) { + element.onclick = createHandler(a, b); +} + +function createHandler(a, b) { + // 通过添加另外一个函数来避免闭包本身,进而组织内存泄露 + return function() { + // 在这里用到a和b + } +} +``` + +#### 建议3.14 警惕JavaScript的浮点数 + +**说明:** JavaScript具有单一数字类型:`IEEE 754`双精度浮点数。拥有单一数字类型是JavaScript的最佳功能之一。多种数字类型可能是复杂性,混淆和错误的根源。但是,二进制浮点类型有一个最大的缺点是,它不能准确地表示小数部分,会导致让人意外的精度问题,见下面示例。 + +示例代码1: + +```javascript +console.log(0.1 + 0.2 === 0.3); // 输出:false。所以通常禁止直接使用==或===来比较浮点数。 +``` + +示例代码2: + +```javascript +var sum1 = (0.1 + 0.2) + 0.3; +console.log(sum1); // 输出:0.6000000000000001 + +var sum2 = 0.1 + (0.2 + 0.3); +console.log(sum2); // 输出:0.6。所以对于二进制浮点数,(a + b) + c 不能保证产生于a + (b + c)相同的结果。 +``` + +有效的解决方法有以下几种: + +1. 尽可能的采用整数值运算,因为整数在表示是不需要舍入; + +2. 使用JavaScript的原生方法`Number.prototype.toFixed(digits)`,`digist`参数表示小数点后数字的个数,不使用指数法,在必要时会进行四舍五入。使用该方法,在判断浮点数运算结果前对计算结果进行精度缩小。示例代码如下所示: + + ```javascript + parseFloat(0.1 + 0.2).toFixed(1); //0.3 + ``` + +3. ES6 新增了一个极小的常量`Number.EPSILON =.220446049250313e-16 `,约等于`0.00000000000000022204`。`Number.EPSILON`的出现是用来判断浮点数的计算误差,如果浮点数计算得到的误差不超过`Number.EPSILON`的值,就表示可以接受这样的误差。示例代码如下所示: + + ```javascript + function isNumberEquals(one, other) { + return Math.abs(one - other) < Number.EPSILON; + } + var one = 0.1 + 0.2; + var other = 0.3; + console.log(isNumberEquals(one, other)); // 输出:true + ``` + +4. 使用一些支持精确运算的类库方法,如`math.js` + + ```html + + + + + + + + + + + + ``` + +#### 建议3.15 不要使用可变参数的Array构造函数 + +**说明:** 通常不鼓励使用构造函数`new Array`的方法来构造新数组,因为当构造函数只有一个参数的时候,可能会导致意外情况,另外Array的全局定义也可能被重新修改,所以提倡使用数组文字表示法来创建数组,也就是`[]`表示法。 +**反例:** + +```javascript +const arr1 = new Array(x1, x2, x3); +const arr2 = new Array(x1, x2); +const arr3 = new Array(x1); +const arr4 = new Array(); +``` + +除了第三种情况之外,其他都可以正常工作,如果`x1`是个整数,那么`arr3`就是长度为`x1`,值都为`undefined`的数组。如果`x1`是其他任何数字,那么将抛出异常,如果它是其他任何东西,那么它将是单元数组。 + +**正例:** + +```javascript +const arr1 = [x1, x2, x3]; +const arr2 = [x1, x2]; +const arr3 = [x1]; +const arr4 = []; +``` + +这种写法,就会省去很多麻烦。 + +同理,对于对象,同样不要使用`new Object()`,而是使用`{}`来创建。 + +#### 规则3.16 构建字符串时,优先使用字符串模板而不是字符串链接。 + +**说明:** 模板字符串表达更简洁,更具可读性。 + +**反例:** + +```javascript +function sayHi(name) { + console.log('hi, ' + name); +} +``` + +**正例:** + +```javascript +function sayHi(name) { + console.log(`hi, ${name}`); +} +``` + +#### 规则3.17 数组遍历采用`for...of`,对象遍历采用`for...in`。 + +**反例:** + +```javascript +let numbers = [1, 2, 3, 4]; +let sum = 0; +for (let number in numbers) { + sum += number; +} +// sum === 00123; +``` + +**正例:** + +```javascript +let numbers = [1, 2, 3, 4]; +let sum = 0; +for (let number of numbers) { + sum += number; +} +// sum === 10 +``` + diff --git a/website/docs/_posts/contribute/OpenHarmony-Log-guide.md b/website/docs/_posts/contribute/OpenHarmony-Log-guide.md new file mode 100644 index 0000000000000000000000000000000000000000..d8172c704cd8ee6245e8cc90d7f2b917ca853af7 --- /dev/null +++ b/website/docs/_posts/contribute/OpenHarmony-Log-guide.md @@ -0,0 +1,250 @@ +--- +title: OpenHarmony-Log-guide.md +permalink: /pages/extra/f12b16/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# OpenHarmony日志打印规范 + +## 简介 +公共流水日志指通过系统日志打印接口(HiLog)统一输出到日志服务的日志。日志用来记录用户操作、系统运行状态等,是一个系统的重要组成部分,然而由于日志不是核心功能,所以日志质量常常不被开发人员所重视。 + +尽管日志记录是必要的,但它对性能有明显的负面影响,如果不保持合理的简洁性,则会很快失去其有用性。每个领域在打印日志的时候都应该尽可能的合理,不要将别人的日志冲掉,就像你希望别人不冲掉你的日志一样。 + +## 日志级别 + +- **【规则】根据实际情况正确的使用日志打印等级** + +**说明:** 日志级别要符合日志内容的实际级别,日志级别说明如下: + +FATAL:重大致命异常,表明程序或功能即将崩溃,故障无法恢复。 + +ERROR: 程序或功能发生了错误,该错误会影响功能的正常运行或用户的正常使用,可以恢复但恢复代价较高,如重置数据等。 + +WARN:发生了较为严重的非预期情况,但是对用户影响不大,程序可以自动恢复或通过简单的操作就可以恢复的问题。 + +INFO:用来记录业务关键流程节点,可以还原业务的主要运行过程;用来记录非正常情况信息,但这些情况都是可以预期的(如无网络信号、登录失败等)。这些日志都应该由该业务内处于支配地位的模块来记录,避免在多个被调用的模块或低级函数中重复记录。 + +DEBUG: 比INFO级别更详细的流程记录,通过该级别的日志可以更详细地分析业务流程和定位分析问题。DEBUG级别的日志在正式发布版本中默认不会被打印,只有在调试版本或打开调试开关的情况下才会打印。 + +## 日志内容 + +- **【规则】日志打印内容使用英文描述,单词拼写无误,符合语法规范,准确表述日志的含义** + +**说明:** 日志内容应该简明扼要地描述发生的事情,阅读日志的人可以通过日志直接知道表述的含义,尽量不要通过产生日志的代码才能知道;符合语法语义的日志打印也有利于后续日志分析工具对日志进行自动化解析。如: + +“1234” 除了开发人员自己没人知道什么意义; + +“Error happened” 哪里发生了什么错误,错误的原因值等都没有打印出来,不利于问题的定位分析。 + +- **【规则】日志中禁止打印隐私信息** + +**说明:** 硬件序列号、个人账号、密码、身份等隐私信息禁止在日志中打印。隐私信息的范围遵从国家和地区的政策要求。 + +- **【规则】日志中禁止打印其它与业务无关的信息** + +**说明:** 禁止打印如issue单号、需求单号、公司部门名称、开发人员自己的姓名、工号、名字缩写、当天的天气心情等任何与业务代码无关的信息。 + +- **【规则】日志中禁止打印重复信息** + +**说明:** 禁止在不同的地方打印的内容完全一样的日志,在问题定位时无法准确找到代码位置。 + +- **【规则】禁止在日志打印语句中调用业务接口函数** + +**说明:** 日志打印不应该对业务的正常流程产生任何影响,定位问题走读代码时通常会忽略日志代码对业务逻辑的影响。 + +- **【规则】禁止将开发调试过程中使用的日志打印提交到代码仓中** + +**说明:** 为了定位问题可能会在代码中的每一步增加一行日志打印,或将各种变量内容打印出来(可能含用户隐私), +这些代码在提交到代码仓之前必须删除。 + +- **【建议】日志打印长度不要过长,尽可能使日志记录显示在一行以内** + +**说明:** 一行的长度通常是指在100个字符左右,尽量不要打印超过160个字符以上的日志。 + +## 打印时机 + +- **【规则】高频代码的正常流程中禁止打印日志** + +**说明:** 如被高频调用的接口函数,大数据量处理的循环中,高频的软硬件中断处理中,协议数据流处理中,多媒体音视频流处理中,显示屏幕刷新处理中等等,这些地方基本都是只要系统不休眠就会一直运行的代码,这些代码正常处理禁止打印日志,但可在错误分支中打印日志。开发调试过程中在这里增加的日志在提交代码时必须清除掉或使用开关关闭。 + +- **【规则】可能重复发生的日志需要进行频率限制** + +**说明:** 当事实证明某些日志记录可能会发生多次时,最好实施一种频率限制机制,防止出现具有相同(或非常相似)信息的大量重复日志副本。 + +- **【规则】在基本不可能发生的点必须要打印日志** + +**说明:** 根据墨菲定律,只要有可能发生的是就一定会发生,一旦发生就是疑难杂症。 + +- **【建议】日志字符串应在日志打印时再生成** + +**说明:** 日志字符串越迟生成越好,最好是在日志打印那一刻才生成,这样当日志被关闭时也就不会生成这个字符串,从而最大程度地减少对系统的开销。 + +## 日志形式 + + +- **【规则】事件记录的日志使用who do what 主谓宾的形式打印** + +- **【规则】状态变化的日志打印使用state\_name:s1->s2, reason:msg的形式打印** + +- **【规则】参数值的日志打印使用name1=value1, name2=value2…的形式打印** + +- **【规则】代码运行成功的日志使用xxx successful的形式打印** + +- **【规则】代码运行失败的日志使用xxx failed, please xxx的形式打印,且需包含可能的解决方案** + + 如:"Connect to server failed, please check network configuration"。 + +## 常见模式日志打印要求 + +### 流程类日志 + + +- **【建议】日志中应当记录业务的关键流程节点日志,包括业务的开始点,关键条件分支节点,错误处理点,业务结束点等** + +### 数据库类日志 + +- **【建议】日志中应当记录对数据库的各种操作及其相关信息** + +**说明:** 数据库的常规操作包括: +增、删、改、查;操作的发起者、操作类型、操作成功还是失败也要在日志中记录;但操作及返回结果中的内容通常不应记录以防止泄露用户隐私;查询结果的数量可以打印。 + +- **【建议】对于性能敏感型业务的数据库操作日志中需记录操作消耗的时间** + +**说明:** 数据库操作涉及I/O读写, 对于性能敏感性业务,数据库操作通常会是性能的关键节点,记录时间可以作为性能调优的参考依据。 + +- **【建议】日志中应当记录数据库的JOB相关信息** + +**说明:** JOB的名称,执行内容,启动时间,结束时间,执行结果应当在日志中记录。 + +### 文件类日志 +- **【建议】日志中应当记录对文件的各种操作及其相关信息** + +**说明:** 文件的常规操作包括: 创建、打开、读取、写入、关闭、删除、获取属性,操作的发起者、操作类型、操作结果需要记录日志;但文件内容不可记录以防止泄露用户隐私或暴露系统安全漏洞,系统文件名可以打印,用户文件名不可以打印; 文件句柄值可以打印。 + +- **【建议】批量文件操作只打印一条日志而不是打印多条日志** + +**说明:** 如批量删除大量文件,不要每删除一个文件就打印一条日志,只要记录删除的文件数即可,如果文件所在目录是系统创建,还要打印目录名称。 + +### 关键对象/对象池日志 + +**说明:** 关键对象/对象池可能是一个类或者一个结构体,也可能是一个队列或堆栈的数据结构,也可能是一个简单的原始类型变量,它处于系统的关键地位,系统的调度控制、状态记录、信息流转等动作都依赖它。 + +- **【建议】日志中应当记录关键对象的操作过程,操作结果,状态变化** + +**说明:** 对象的操作包括:创建、加载、卸载、释放等,对关键对象的操作需记录操作主体,操作类型,操作结果;状态类的需记录状态变化的前后值。 + +### 线程日志 + +- **【建议】日志中需记录线程的各种操作及相关信息** + +**说明:** 线程的操作包括: 创建、启动、暂停、终止。日志中需记录操作线程的操作类型,操作结果、线程号,线程名称(重要线程一定要设置线程名)。 + +- **【建议】线程陷入死循环或死锁等错误时要记录日志** + +**说明:** 对于有等锁处理、异步处理、循环处理等逻辑的线程在线程发生死锁或死循环时要有检测机制,并在错误发生时打印日志。 + +- **【建议】消息处理型的线程需要打印消息处理相关的日志** + +**说明:** 包括消息名称、消息处理结果,消息处理时长;对于高频消息,只需要打印消息处理结果错误时的日志即可 + +### 并发控制日志 + +**说明:** 并发控制的对象可能是锁、临界区、信号量等。 + +- **【建议】日志中需记录并发控制对象的操作及其相关信息** + +**说明:** 并发控制的操作包括:创建、占用、释放、等待等。日志中需记录操作的类型,操作对象的名称、操作的结果、操作的位置等信息。 + +### 共享内存日志 + +**说明:** 共享内存是软件系统中常用的进程间通信方法,它常用于在模块间共享数据或传递数据。共享内存所存放的数据可以是配置数据、数据库数据等。 + +- **【建议】日志中需记录对共享内存的操作及相关信息** + +**说明:** 对共享内存的操作包括:创建、删除、数据设置、数据查询、销毁等。日志中需记录对共享内存操作的操作者,操作类型、操作结果。 + +### 接口交互日志 + + +接口包括系统的内外部接口,内部接口指系统内部子系统、子模块之间的接口。形式可能包括模块间消息发送、IPC接口、RPC接口等。 + +- **【建议】日志需记录接口交互相关的信息** + +**说明:** 接口交互相关的信息包括:接口的调用者、消息内容(不能涉及用户隐私)、处理结果、返回值(不能涉及用户隐私)。 + +### 状态机日志 + +- **【建议】日志需记录状态机的操作及状态转换信息** + +**说明:** 状态机的操作包括:创建、开始、状态转换、结束、销毁等。状态机通常受外部条件激励(如消息、资源等)变换状态,状态机的状态变化前后的状态名称、导致变化的外部激励条件等信息也应该被记录。 + +### 其它操作系统资源 +这里说的主要操作系统资源指Socket、定时器等不在前面小节已专门提及的资源(如文件、线程等) + +- **【建议】日志中需要记录socket连接建立的过程和结果、连接维持的情况、连接断开的情况及原因** + +- **【建议】日志中需要记录定时器启动、复位、销毁、超时处理过程** + +- **【建议】使用其它类似操作系统中提供的资源也应参照遵循类似上述的日志记录原则** + +## HiLog接口使用规范 + + +- **【规则】每个业务须有独立的Domain ID** + +**说明:** 系统各领域使用HiLog API打印日志须先到DFX申请标识业务的Domain ID。Domain ID用于度量和管控单个业务日志质量,支持开发人员调试使用Domain ID过滤出自身业务日志分析提高调试效率,不允许在不申请Domain ID情况下,直接使用其它领域的Domain ID。对测试代码,要求使用专门为测试配置的Domain ID 0xD000F00 打印日志。 + +系统Domain ID的范围为:**0xD000001\~0xD00FFFF** + +- **【建议】每个业务内部基于Domain ID分配机制在领域内按照层次、模块的粒度划分使用** + +**说明:** Domain ID为32位整数,以16机制形式表达,分配范围0xD0xxxyy。其中D0为domain域标识,xxx高12位为DFT分配值,yy低8位业务领域内部使用。要求Domain ID 内部分配能够定界到组织或模块,反应领域内具体组织或模块日志质量,同时DFX会基于 Domain ID对日志打印进行管控,防止因为单个模块日志打印多影响领域内其它模块的日志输出,如BT业务内按照层次模块进一步划分: + + + APP | BT-App1 BT-App2 + --------------------------------------- + Framework | BT-Service1 BT-Service2 + --------------------------------------- + HAL | BT-HAL + --------------------------------------- + Kernel | BT-Driver1 BT-Driver2 + +BT内的Domain ID可以进一步划分: +| Domain名称 | Domain ID | +|----|----| +| BT | 0xD000100 | +| BT-App1 | 0xD000101 | +| BT-App2 | 0xD000102 | +| BT-Service1 | 0xD000103 | +| BT-Service2 | 0xD000104 | +| BT-HAL | 0xD000105 | +| BT-Driver1 | 0xD000106 | +| BT-Driver2 | 0xD000107 | + +- **【规则】日志服务会对每个业务的日志量进行流量管控,修改默认的流量阈值需要经过评审** + +**说明:** 日志服务中会对每个领域的日志流量进行控制,在正式发布的版本上默认每个领域的日志流量阈值是**2048KB/秒**, 在调试版本上默认阈值是**10240KB/秒**, 如果需要修改默认阈值需经过DFX领域审查。 + +- **【规则】正确填写日志格式化隐私参数标识{public},{private}** + +**说明:** 隐私参数标识{public},{private}用来标识每个参数日志内容是否含隐私敏感信息。Hilog +API会自动对标识{public}参数内容以明文输出,对标识{private}参数内容以<private>过滤回显,禁止不分析日志打印内容随意设置隐私参数标识。如: + +源码: + + + HiLog.info(LABEL, "Device Name:%{public}s, IP:%{private}s.", DeviceName, ip); + + +日志输出: + + + 11-11 09:19:00.932 1513 1513 E 00500/Settings: MyPad001, IP: diff --git a/website/docs/_posts/contribute/OpenHarmony-c-coding-style-guide.md b/website/docs/_posts/contribute/OpenHarmony-c-coding-style-guide.md new file mode 100644 index 0000000000000000000000000000000000000000..b513cb2a6a0e405c33fbb3b8cc001bba989bfbd5 --- /dev/null +++ b/website/docs/_posts/contribute/OpenHarmony-c-coding-style-guide.md @@ -0,0 +1,2016 @@ +--- +title: OpenHarmony-c-coding-style-guide.md +permalink: /pages/extra/29cfe8/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# C语言编程规范 + +## 目的 +规则并不是完美的,通过禁止在特定情况下有用的特性,可能会对代码实现造成影响。但是我们制定规则的目的“为了大多数程序员可以得到更多的好处”, 如果在团队运作中认为某个规则无法遵循,希望可以共同改进该规则。 +参考该规范之前,希望您具有相应的C语言基础能力,而不是通过该文档来学习C语言。 +1. 了解C语言的ISO标准; +2. 熟知C语言的基本语言特性; +3. 了解C语言的标准库; + +## 总体原则 +代码需要在保证功能正确的前提下,满足**可读、可维护、安全、可靠、可测试、高效、可移植**的特征要求。 + +## 约定 + +**规则**:编程时必须遵守的约定 +**建议**:编程时必须加以考虑的约定 + +无论是“规则”还是“建议”,都必须理解该条目这么规定的原因,并努力遵守。 + +## 例外 + +在不违背总体原则,经过充分考虑,有充足的理由的前提下,可以适当违背规范中约定。 +例外破坏了代码的一致性,请尽量避免。“规则”的例外应该是极少的。 + +下列情况,应风格一致性原则优先: +**修改外部开源代码、第三方代码时,应该遵守开源代码、第三方代码已有规范,保持风格统一。** + + +# 1 命名 + +命名包括文件、函数、变量、类型、宏等命名。 + +命名被认为是软件开发过程中最困难,也是最重要的事情。 +标识符的命名要清晰、明了,有明确含义,符合阅读习惯,容易理解。 + +统一的命名风格是一致性原则最直接的体现。 + + +## 总体风格 + +**驼峰风格(CamelCase)** +大小写字母混用,单词连在一起,不同单词间通过单词首字母大写来分开。 +按连接后的首字母是否大写,又分: **大驼峰(UpperCamelCase)**和**小驼峰(lowerCamelCase)** + +**内核风格(unix_like)** +内核风格又称蛇形风格。单词小写,用下划线分割。 +如:'test_result' + +### 规则1.1 标识符命名使用驼峰风格 + +| 类型 | 命名风格 | +|-|-| +| 函数,结构体类型,枚举类型,联合体类型 | 大驼峰 | +| 变量,函数参数,宏参数,结构体中字段,联合体中成员 | 小驼峰 | +| 宏,常量,枚举值,goto 标签 | 全大写,下划线分割 | + +注意: +上表中`常量`是指,全局作用域下,const 修饰的基本数据类型、枚举、字符串类型的变量,不包括数组、结构体和联合体。 +上表中`变量`是指除常量定义以外的其他变量,均使用小驼峰风格。 +对于更亲和Linux/Unix的代码,可以使用内核风格。 +已使用内核命名风格的代码,可以选择继续使用内核风格。 +不管什么样的命名风格,都应该保证同一函数或结构体、联合体内的命名风格是一致的。 + +### 建议1.1 作用域越大,命名应越精确 + +C 与 C++ 不同,没有名字空间,没有类,所以全局作用域下的标识符命名要考虑不要冲突。 +对于全局函数、全局变量、宏、类型名、枚举名的命名,应当精确描述并全局唯一。 + +例: +```c +int GetCount(void); // Bad: 描述不精确 +int GetActiveConnectCount(void); // Good +``` + +为了命名更精确,必要时可以增加模块前缀。 +模块前缀与命名主体之间,按驼峰方式连接。 +示例: +```c +int PrefixFuncName(void); // OK: 驼峰方式,形式上无前缀,内容上有前缀 + +enum XxxMyEnum { // OK. + ... +}; +``` + +## 文件命名 + +### 建议1.2 文件命名统一采用小写字符 + +文件名命名只允许使用小写字母、数字以及下划线(\_)。 +文件名应尽量简短、准确、无二义性。 +不大小写混用的原因是,不同系统对文件名大小写处理会不同(如 MicroSoft 的 DOS, Windows 系统不区分大小写,但是 Unix / Linux, Mac 系统则默认区分)。 + +好的命名举例: +`dhcp_user_log.c` + +坏的命名举例: +`dhcp_user-log.c`: 不推荐用'\-'分隔 +`dhcpuserlog.c`: 未分割单词,可读性差 + +## 函数命名 + +函数命名统一使用大驼峰风格。 + +### 建议1.3 函数的命名遵循阅读习惯 + +动作类函数名,可以使用动宾结构。如: +```c +AddTableEntry() // OK +DeleteUser() // OK +GetUserInfo() // OK +``` +判断型函数,可以用形容词,或加 is: +```c +DataReady() // OK +IsRunning() // OK +JobDone() // OK +``` +数据型函数: +```c +TotalCount() // OK +GetTotalCount() // OK +``` + +## 变量命名 + +变量命名使用小驼峰风格,包括全局变量,局部变量,函数声明或定义中的参数,带括号宏中的参数。 + +### 规则1.2 全局变量应增加 'g_' 前缀,函数内静态变量命名不需要加特殊前缀 + +全局变量应当尽量少使用,使用时应特别注意,所以加上前缀用于视觉上的突出,促使开发人员对这些变量的使用更加小心。 +全局静态变量命名与全局变量相同,函数内的静态变量命名与普通局部变量相同。 + +```c +int g_activeConnectCount; + +void Func(void) +{ + static int pktCount = 0; + ... +} +``` + +注意: +常量本质也是全局变量,但如果命名风格是全大写,下划线连接的格式,则不适用当前规则。 + +### 建议1.4 局部变量应该简短,且能够表达相关含义 + +函数局部变量的命名,在能够表达相关含义的前提下,应该简短。 + +如下: +```c +int Func(...) +{ + enum PowerBoardStatus powerBoardStatusOfSlot; // Not good: 局部变量有点长 + powerBoardStatusOfSlot = GetPowerBoardStatus(slot); + if (powerBoardStatusOfSlot == POWER_OFF) { + ... + } + ... +} +``` +更好的写法: +```c +int Func(...) +{ + enum PowerBoardStatus status; // Good: 结合上下文,status 已经能明确表达意思 + status = GetPowerBoardStatus(slot); + if (status == POWER_OFF) { + ... + } + ... +} +``` +类似的, tmp 可以用来称呼任意类型的临时变量。 +过短的变量命名应慎用,但有时候,单字符变量也是允许的,如用于循环语句中的计数器变量: +```c +int i; +... +for (i = 0; i < COUNTER_RANGE; i++) { + ... +} +``` +或一些简单的数学计算函数中的变量: +```c +int Mul(int a, int b) +{ + return a * b; +} +``` + +## 类型命名 + +类型命名采用大驼峰命名风格。 +类型包括结构体、联合体、枚举类型名。 + +例: +```c +struct MsgHead { + enum MsgType type; + int msgLen; + char *msgBuf; +}; + +union Packet { + struct SendPacket send; + struct RecvPacket recv; +}; + +enum BaseColor { + RED, // 注意,枚举类型是大驼峰,枚举值应使用宏风格 + GREEN, + BLUE +}; + +typedef int (*NodeCmpFunc)(struct Node *a, struct Node *b); +``` + +通过 typedef 对结构体、联合体、枚举起别名时,尽量使用匿名类型。 +若需要指针自嵌套,可以增加 'tag' 前缀或下划线后缀。 +```c +typedef struct { // Good: 无须自嵌套,使用匿名结构体 + int a; + int b; +} MyType; // 结构体别名用大驼峰风格 +``` +```c +typedef struct tagNode { // Good: 使用 tag 前缀。这里也可以使用 'Node_'代替也可以。 + struct tagNode *prev; + struct tagNode *next; +} Node; // 类型主体用大驼峰风格 +``` + +## 宏、常量、枚举命名 + +宏、枚举值采用全大写,下划线连接的格式。 +常量推荐采用全大写,下划线连接风格。作为全局变量,也可以保持与普通全局变量命名风格相同。 +这里常量如前文定义,是指基本数据类型、枚举、字符串类型的全局 const 变量。 + +函数式宏,命名风格,采用全大写,下划线连接风格。 +例外情况: +1、用宏实现泛型功能的函数。如:实现list,map等功能的宏。可以与函数的命名方式相同,使用大驼峰命名风格。 +2、函数接口发生变更为兼容老版本时,使用函数同宏进行替代。可以与函数的命名方式相同,使用大驼峰命名风格。 +3、日志打印宏。可以与函数的命名方式相同,使用大驼峰命名风格。 +注:使用大驼峰命名的函数式宏,需要在接口说明中标注为宏。 + +宏举例: +```c +#define PI 3.14 +#define MAX(a, b) (((a) < (b)) ? (b) : (a)) +``` +```c +#ifdef SOME_DEFINE +void Bar(int); +#define Foo(a) Bar(a) // 特殊场景,用大驼峰风格命名函数式宏 +#else +void Foo(int); +#endif +``` + +常量举例: +```c +const int VERSION = 200; // OK. + +const enum Color DEFAULT_COLOR = BLUE; // OK. + +const char PATH_SEP = '/'; // OK. + +const char * const GREETINGS = "Hello, World!"; // OK. +``` + +非常量举例: +```c +// 结构体类型,不符合常量定义 +const struct MyType g_myData = { ... }; // OK: 用小驼峰 + +// 数组类型,不符合常量定义 +const int g_xxxBaseValue[4] = { 1, 2, 4, 8 }; // OK: 用小驼峰 + +int Foo(...) +{ + // 局部作用域,不符合常量定义 + const int bufSize = 100; // OK: 用小驼峰 + ... +} +``` + +枚举举例: +```c +// 注意,枚举类型名用大驼峰,其下面的取值是全大写,下划线相连 +enum BaseColor { + RED, + GREEN, + BLUE +}; +``` + +### 建议1.5 避免函数式宏中的临时变量命名污染外部作用域 + +首先,**定义函数式宏前,应考虑能否定义为函数。如果可以则不要定义为函数式宏。** + +当函数式宏需要定义局部变量时,为了防止跟外部函数中的局部变量有命名冲突。 + +后置下双划线,是一种解决方案。 例: +```c +#define SWAP_INT(a, b) do { \ + int tmp__ = a; \ + a = b; \ + b = tmp__; \ +} while (0) +``` + +# 2 排版格式 + +## 行宽 + +### 规则2.1 行宽不超过 120 个字符 + +代码行宽不宜过长,否则不利于阅读。 +控制行宽长度可以间接的引导开发去缩短函数、变量的命名,减少嵌套的层数,提升代码可读性。 +要求每行字符数不要超过 **120** 个;除非超过 **120** 能显著增加可读性,并且不会隐藏信息。 +虽然现代显示器分辨率已经很高,但是行宽过长,反而提高了阅读理解的难度;跟本规范提倡的“清晰”、“简洁”原则相背。 + +如下场景不宜换行,可以例外: +- 换行会导致内容截断,无法被方便查找(grep)的字符串,如命令行或 URL 等等。包含这些内容的代码或注释,可以适当例外。 +- \#include / \#error 语句可以超出行宽要求,但是也需要尽量避免。 + +例: +```c +#ifndef XXX_YYY_ZZZ +#error Header aaaa/bbbb/cccc/abc.h must only be included after xxxx/yyyy/zzzz/xyz.h +#endif +``` +## 缩进 + +### 规则2.2 使用空格进行缩进,每次缩进4个空格 + +只允许使用空格(space)进行缩进,每次缩进为 **4** 个空格。不允许使用Tab键进行缩进。 +当前几乎所有的集成开发环境(IDE)和代码编辑器都支持配置将Tab键自动扩展为**4**空格输入,请配置你的代码编辑器支持使用空格进行缩进。 + +## 大括号 + +### 规则2.3 使用 K&R 缩进风格 + +**K&R风格** +换行时,函数左大括号另起一行放行首,并独占一行;其他左大括号跟随语句放行末。 +右大括号独占一行,除非后面跟着同一语句的剩余部分,如 do 语句中的 while,或者 if 语句的 else/else if,或者逗号、分号。 + +如: +```c +struct MyType { // Good: 跟随语句放行末,前置1空格 + ... +}; // Good: 右大括号后面紧跟分号 + +int Foo(int a) +{ // Good: 函数左大括号独占一行,放行首 + if (...) { + ... + } else { // Good: 右大括号与 else 语句在同一行 + ... + } // Good: 右大括号独占一行 +} +``` + +## 函数声明和定义 + +### 规则2.4 函数声明、定义的返回类型和函数名在同一行;函数参数列表换行时应合理对齐 + +在声明和定义函数的时候,函数的返回值类型应该和函数名在同一行。 + +函数参数列表换行时,应合理对齐。 +参数列表的左圆括号总是和函数名在同一行,不要单独一行;右圆括号总是跟随最后一个参数。 + +换行举例: +```c +ReturnType FunctionName(ArgType paramName1, ArgType paramName2) // Good:全在同一行 +{ + ... +} + +ReturnType VeryVeryVeryLongFunctionName(ArgType paramName1, // 行宽不满足所有参数,进行换行 + ArgType paramName2, // Good:和上一行参数对齐 + ArgType paramName3) +{ + ... +} + +ReturnType LongFunctionName(ArgType paramName1, ArgType paramName2, // 行宽限制,进行换行 + ArgType paramName3, ArgType paramName4, ArgType paramName5) // Good: 换行后 4 空格缩进 +{ + ... +} + +ReturnType ReallyReallyReallyReallyLongFunctionName( // 行宽不满足第1个参数,直接换行 + ArgType paramName1, ArgType paramName2, ArgType paramName3) // Good: 换行后 4 空格缩进 +{ + ... +} +``` + +## 函数调用 + +### 规则2.5 函数调用参数列表换行时保持参数进行合理对齐 + +函数调用时,函数参数列表如果换行,应该进行合理的参数对齐。 +左圆括号总是跟函数名,右圆括号总是跟最后一个参数。 + +换行举例: +```c +ReturnType result = FunctionName(paramName1, paramName2); // Good:函数参数放在一行 + +ReturnType result = FunctionName(paramName1, + paramName2, // Good:保持与上方参数对齐 + paramName3); + +ReturnType result = FunctionName(paramName1, paramName2, + paramName3, paramName4, paramName5); // Good:参数换行,4 空格缩进 + +ReturnType result = VeryVeryVeryLongFunctionName( // 行宽不满足第1个参数,直接换行 + paramName1, paramName2, paramName3); // 换行后,4 空格缩进 +``` + +如果函数调用的参数存在内在关联性,按照可理解性优先于格式排版要求,对参数进行合理分组换行。 +```c +// Good:每行的参数代表一组相关性较强的数据结构,放在一行便于理解 +int result = DealWithStructureLikeParams(left.x, left.y, // 表示一组相关参数 + right.x, right.y); // 表示另外一组相关参数 +``` + +## 条件语句 + +### 规则2.6 条件语句必须要使用大括号 + +我们要求条件语句都需要使用大括号,即便只有一条语句。 +理由: +- 代码逻辑直观,易读; +- 在已有条件语句代码上增加新代码时不容易出错; +- 对于在条件语句中使用函数式宏时,没有大括号保护容易出错(如果宏定义时遗漏了大括号)。 + +```c +if (objectIsNotExist) { // Good:单行条件语句也加大括号 + return CreateNewObject(); +} +``` + +### 规则2.7 禁止 if/else/else if 写在同一行 + +条件语句中,若有多个分支,应该写在不同行。 + +如下是正确的写法: +```c +if (someConditions) { + ... +} else { // Good: else 与 if 在不同行 + ... +} +``` + +下面是不符合规范的案例: +```c +if (someConditions) { ... } else { ... } // Bad: else 与 if 在同一行 +``` + +## 循环 + +### 规则2.8 循环语句必须使用大括号 + +和条件表达式类似,我们要求for/while循环语句必须加上大括号,即便循环体是空的,或循环语句只有一条。 +```c +for (int i = 0; i < someRange; i++) { // Good: 使用了大括号 + DoSomething(); +} +``` +```c +while (condition) { } // Good:循环体是空,使用大括号 +``` +```c +while (condition) { + continue; // Good:continue 表示空逻辑,使用大括号 +} +``` + +坏的例子: +```c +for (int i = 0; i < someRange; i++) + DoSomething(); // Bad: 应该加上括号 +``` +```c +while (condition); // Bad:使用分号容易让人误解是while语句中的一部分 +``` + +## switch语句 + +### 规则2.9 switch 语句的 case/default 要缩进一层 + +switch 语句的缩进风格如下: +```c +switch (var) { + case 0: // Good: 缩进 + DoSomething1(); // Good: 缩进 + break; + case 1: { // Good: 带大括号格式 + DoSomething2(); + break; + } + default: + break; +} +``` + +```c +switch (var) { +case 0: // Bad: case 未缩进 + DoSomething(); + break; +default: // Bad: default 未缩进 + break; +} +``` + +## 表达式 + +### 建议2.1 表达式换行要保持换行的一致性,操作符放行末 + +较长的表达式,不满足行宽要求的时候,需要在适当的地方换行。一般在较低优先级操作符或连接符后面截断,操作符或连接符放在行末。 +操作符、连接符放在行末,表示“未结束,后续还有”。 + +例: +```c +// 假设下面第一行已经不满足行宽要求 +if ((currentValue > MIN) && // Good:换行后,布尔操作符放在行末 + (currentValue < MAX)) { + DoSomething(); + ... +} + +int result = reallyReallyLongVariableName1 + // Good: 加号留在行末 + reallyReallyLongVariableName2; +``` + +表达式换行后,注意保持合理对齐,或者4空格缩进。参考下面例子 +```c +int sum = longVaribleName1 + longVaribleName2 + longVaribleName3 + + longVaribleName4 + longVaribleName5 + longVaribleName6; // OK: 4空格缩进 + +int sum = longVaribleName1 + longVaribleName2 + longVaribleName3 + + longVaribleName4 + longVaribleName5 + longVaribleName6; // OK: 保持对齐 +``` + +## 变量赋值 + +### 规则2.10 多个变量定义和赋值语句不允许写在一行 + +每行最好只有一个变量初始化的语句,更容易阅读和理解。 + +```c +int maxCount = 10; +bool isCompleted = false; +``` + +下面是不符合规范的示例: +```c +int maxCount = 10; bool isCompleted = false; // Bad:多个初始化放在了同一行 +int x, y = 0; // Bad:多个变量定义需要分行,每行一个 + +int pointX; +int pointY; +... +pointX = 1; pointY = 2; // Bad:多个变量赋值语句放同一行 +``` + +例外情况: +对于多个相关性强的变量定义,且无需初始化时,可以定义在一行,减少重复信息,以便代码更加紧凑。 +```c +int i, j; // Good:多变量定义,未初始化,可以写在一行 +for (i = 0; i < row; i++) { + for (j = 0; j < col; j++) { + ... + } +} +``` + +## 初始化 + +初始化包括结构体、联合体及数组的初始化 + +### 规则2.11 初始化换行时要有缩进,或进行合理对齐 + +结构体或数组初始化时,如果换行应保持4空格缩进。 +从可读性角度出发,选择换行点和对齐位置。 +```c +// Good: 满足行宽要求时不换行 +int arr[4] = { 1, 2, 3, 4 }; + +// Good: 行宽较长时,换行让可读性更好 +const int rank[] = { + 16, 16, 16, 16, 32, 32, 32, 32, + 64, 64, 64, 64, 32, 32, 32, 32 +}; +``` + +对于复杂结构数据的初始化,尽量清晰、紧凑。 +参考如下格式: +```c +int a[][4] = { + { 1, 2, 3, 4 }, { 2, 2, 3, 4 }, // OK. + { 3, 2, 3, 4 }, { 4, 2, 3, 4 } +}; + +int b[][8] = { + { 1, 2, 3, 4, 5, 6, 7, 8 }, // OK. + { 2, 2, 3, 4, 5, 6, 7, 8 } +}; +``` +```c +int c[][8] = { + { + 1, 2, 3, 4, 5, 6, 7, 8 // OK. + }, { + 2, 2, 3, 4, 5, 6, 7, 8 + } +}; +``` + +注意: +- 左大括号放行末时,对应的右大括号需另起一行 +- 左大括号被内容跟随时,对应的右大括号也应跟随内容 + +### 规则2.12 结构体和联合体在按成员初始化时,每个成员初始化单独一行 + +C99标准支持结构体和联合体按照成员进行初始化,标准中叫"指定初始化"(designated initializer)。 如果按照这种方式进行初始化,每个成员的初始化单独一行。 +```c +struct Date { + int year; + int month; + int day; +}; + +struct Date date = { // Good:使用指定初始化方式时,每行初始化一个 + .year = 2000, + .month = 1, + .day = 1 +}; +``` + +## 指针 + +### 建议2.2 指针类型"\*"跟随变量名或者类型,不要两边都留有空格或都没有空格 + +声明或定义指针变量或者返回指针类型函数时,"\*" 靠左靠右都可以,但是不要两边都有或者都没有空格。 +```c +int *p1; // OK. +int* p2; // OK. + +int*p3; // Bad: 两边都没空格 +int * p4; // Bad: 两边都有空格 +``` + +选择一种风格,并保持一致性。 + +选择"\*"跟随类型风格时,避免一行同时声明带指针的多个变量。 +```c +int* a, b; // Bad: 很容易将 b 误理解成指针 +``` + +选择"\*"跟随变量风格时,可能会存在无法紧跟的情况。 +无法跟随时就不跟随,不要破坏风格一致性。 +```c +char * const VERSION = "V100"; // OK. +int Foo(const char * restrict p); // OK. +``` +注意,任何时候 "\*" 不要紧跟 const 或 restrict 关键字。 + +## 编译预处理 + +### 规则2.13 编译预处理的"#"默认放在行首,嵌套编译预处理语句时,"#"可以进行缩进 + +编译预处理的"#"统一放在行首;即便编译预处理的代码是嵌入在函数体中的,"#"也应该放在行首。 +注意,开发过程尽量不要使用编译预处理宏。如果需使用,则应由专人进行统一管理。 + +## 空格和空行 + +### 规则2.14 水平空格应该突出关键字和重要信息,避免不必要的留白 + +水平空格应该突出关键字和重要信息,每行代码尾部不要加空格。 总体规则如下: +- if, switch, case, do, while, for 等关键字之后加空格; +- 小括号内部的两侧,不要加空格 +- 二元操作符(= + ‐ < > * / % | & ^ <= >= == !=)左右两侧加空格 +- 一元操作符(& * + ‐ ~ !)之后不要加空格 +- 三目操作符(? :)符号两侧均需要空格 +- 结构体中表示位域的冒号,两侧均需要空格 +- 前置和后置的自增、自减(++ --)和变量之间不加空格 +- 结构体成员操作符(. ->)前后不加空格 +- 大括号内部两侧有无空格,左右必须保持一致 +- 逗号、分号、冒号(不含三目操作符和表示位域的冒号)紧跟前面内容无空格,其后需要空格 +- 函数参数列表的小括号与函数名之间无空格 +- 类型强制转换的小括号与被转换对象之间无空格 +- 数组的中括号与数组名之间无空格 +- 涉及到换行时,行末的空格可以省去 + +对于大括号内部两侧的空格,**建议**如下: +- 一般的,大括号内部两侧建议加空格 +- 对于空的,或单个标识符,或单个字面常量,空格不是必须 +如:'{}', '{0}', '{NULL}', '{"hi"}' 等 +- 连续嵌套的多重括号之间,空格不是必须 +如:'{{0}}', '{{ 1, 2 }}' 等 +错误示例:'{ 0, {1}}',不属于连续嵌套场景,而且最外侧大括号左右不一致 + +常规情况: +```c +int i = 0; // Good:变量初始化时,= 前后应该有空格,分号前面不要留空格 +int buf[BUF_SIZE] = {0}; // Good:数组初始化时,大括号内空格可选 +int arr[] = { 10, 20 }; // Good: 正常大括号内部两侧建议加空格 +``` + +函数定义和函数调用: +```c +int result = Foo(arg1,arg2); + ^ // Bad: 逗号后面应该有空格 + +int result = Foo( arg1, arg2 ); + ^ ^ // Bad: 小括号内部两侧不应该有空格 +``` + +指针和取地址 +```c +x = *p; // Good:*操作符和指针p之间不加空格 +p = &x; // Good:&操作符和变量x之间不加空格 +x = r.y; // Good:通过.访问成员变量时不加空格 +x = r->y; // Good:通过->访问成员变量时不加空格 +``` + +操作符: +```c +x = 0; // Good:赋值操作的=前后都要加空格 +x = -5; // Good:负数的符号和数值之前不要加空格 +++x; // Good:前置和后置的++/--和变量之间不要加空格 +x--; + +if (x && !y) // Good:布尔操作符前后要加上空格,!操作和变量之间不要空格 +v = w * x + y / z; // Good:二元操作符前后要加空格 +v = w * (x + z); // Good:括号内的表达式前后不需要加空格 +``` + +循环和条件语句: +```c +if (condition) { // Good:if关键字和括号之间加空格,括号内条件语句前后不加空格 + ... +} else { // Good:else关键字和大括号之间加空格 + ... +} + +while (condition) {} // Good:while关键字和括号之间加空格,括号内条件语句前后不加空格 + +for (int i = 0; i < someRange; ++i) { // Good:for关键字和括号之间加空格,分号之后加空格 + ... +} + +switch (var) { // Good: switch 关键字后面有1空格 + case 0: // Good:case语句条件和冒号之间不加空格 + ... + break; + ... + default: + ... + break; +} +``` + +注意:当前的集成开发环境(IDE)和代码编辑器都可以设置删除行尾的空格,请正确配置你的编辑器。 + +### 建议2.3 合理安排空行,保持代码紧凑 + +减少不必要的空行,可以显示更多的代码,方便代码阅读。下面有一些建议遵守的规则: +- 根据上下内容的相关程度,合理安排空行; +- 函数内部、类型定义内部、宏内部、初始化表达式内部,不使用连续空行 +- 不使用连续 **3** 个空行,或更多 +- 大括号内的代码块首行之前和末行之后不要加空行。 + +```c +ret = DoSomething(); + +if (ret != OK) { // Bad: 返回值判断应该紧跟函数调用 + return -1; +} +``` +```c +int Foo(void) +{ + ... +} + + + +int Bar(void) // Bad:最多使用连续2个空行。 +{ + ... +} +``` +```c +int Foo(void) +{ + + DoSomething(); // Bad:大括号内部首尾,不需要空行 + ... + +} +``` + +# 3 注释 + +一般的,尽量通过清晰的架构逻辑,好的符号命名来提高代码可读性;需要的时候,才辅以注释说明。 +注释是为了帮助阅读者快速读懂代码,所以要从读者的角度出发,**按需注释**。 + +注释内容要简洁、明了、无二义性,信息全面且不冗余。 + +**注释跟代码一样重要。** +写注释时要换位思考,用注释去表达此时读者真正需要的信息。在代码的功能、意图层次上进行注释,即注释解释代码难以表达的意图,不要重复代码信息。 +修改代码时,也要保证其相关注释的一致性。只改代码,不改注释是一种不文明行为,破坏了代码与注释的一致性,让阅读者迷惑、费解,甚至误解。 + +使用**英文**进行注释。 + +必须要加注释说明场合如下(包含但不限于列举的场合): +1、模块对外提供的接口头文件必须对函数进行注释。 +2、定义全局变量必须加注释。 +3、核心算法必须加注释。 +4、超过50行的函数必须加注释。 + +## 注释风格 + +在 C 代码中,使用 `/*` `*/`和 `//` 都是可以的。 +按注释的目的和位置,注释可分为不同的类型,如文件头注释、函数头注释、代码注释等等; +同一类型的注释应该保持统一的风格。 + +注意:本文示例代码中,大量使用 '//' 后置注释只是为了更精确的描述问题,并不代表这种注释风格更好。 + +## 文件头注释 + +### 规则3.1 文件头注释必须包含版权许可 + +/* + * Copyright (c) 2020 XXX + * 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. + */ + +## 函数头注释 + +### 规则3.2 禁止空有格式的函数头注释 + +并不是所有的函数都需要函数头注释; +函数原型无法表达的信息,加函数头注释辅助说明; + +函数头注释统一放在函数声明或定义上方。 +选择使用如下风格之一: +**使用'//'写函数头** +```c +// 单行函数头 +int Func1(void); + +// 多行函数头 +// 第二行 +int Func2(void); +``` + +**使用'/\*' '\*/' 写函数头** +```c +/* 单行函数头 */ +int Func1(void); + +/* + * 单行或多行函数头 + * 第二行 + */ +int Func2(void); +``` + +函数尽量通过函数名自注释,**按需**写函数头注释。 +不要写无用、信息冗余的函数头;不要写空有格式的函数头。 + +函数头注释内容**可选**,但不限于:功能说明、返回值,性能约束、用法、内存约定、算法实现、可重入的要求等等。 +模块对外头文件中的函数接口声明,其函数头注释,应当将重要、有用的信息表达清楚。 + +例: +```c +/* + * 返回实际写入的字节数,-1表示写入失败 + * 注意,内存 buf 由调用者负责释放 + */ +int WriteString(char *buf, int len); +``` + +坏的例子: +```c +/* + * 函数名:WriteString + * 功能:写入字符串 + * 参数: + * 返回值: + */ +int WriteString(char *buf, int len); +``` +上面例子中的问题: +- 参数、返回值,空有格式没内容 +- 函数名信息冗余 +- 关键的 buf 由谁释放没有说清楚 + +## 代码注释 + +### 规则3.3 代码注释放于对应代码的上方或右边 +### 规则3.4 注释符与注释内容间要有1空格;右置注释与前面代码至少1空格 + +代码上方的注释,应该保持对应代码一样的缩进。 +选择并统一使用如下风格之一: +**使用'//'** +```c +// 这是单行注释 +DoSomething(); + +// 这是多行注释 +// 第二行 +DoSomething(); +``` +**使用'/\*' '\*/'** +```c +/* 这是单行注释 */ +DoSomething(); + +/* + * 这是单/多行注释 + * 第二行 + */ +DoSomething(); +``` + +代码右边的注释,与代码之间,至少留1空格,建议不超过4空格。 +通常使用扩展后的 TAB 键即可实现 1-4 空格的缩进。 + +选择并统一使用如下风格之一: +```c +int foo = 100; // 放右边的注释 +int bar = 200; /* 放右边的注释 */ +``` + +右置格式在适当的时候,上下对齐会更美观。 +对齐后的注释,离左边代码最近的那一行,保证1-4空格的间隔。 +例: +```c +#define A_CONST 100 /* 相关的同类注释,可以考虑上下对齐 */ +#define ANOTHER_CONST 200 /* 上下对齐时,与左侧代码保持间隔 */ +``` + +当右置的注释超过行宽时,请考虑将注释置于代码上方。 + +### 规则3.5 不用的代码段直接删除,不要注释掉 + +被注释掉的代码,无法被正常维护;当企图恢复使用这段代码时,极有可能引入易被忽略的缺陷。 +正确的做法是,不需要的代码直接删除掉。若再需要时,考虑移植或重写这段代码。 + +这里说的注释掉代码,包括用 /\* \*/ 和 //,还包括 #if 0, #ifdef NEVER_DEFINED 等等。 + +### 建议3.1 case语句块结束时如果不加break/return,需要有注释说明(fall-through) + +有时候需要对多个case标签做相同的事情,case语句在结束不加break或return,直接执行下一个case标签中的语句,这在C语法中称之为"fall-through"。 +这种情况下,需要在"fall-through"的地方加上注释,清晰明确的表达出这样做的意图;或者至少显式指明是 "fall-through"。 + +例,显式指明 fall-through: +```c +switch (var) { + case 0: + DoSomething(); + /* fall-through */ + case 1: + DoSomeOtherThing(); + ... + break; + default: + DoNothing(); + break; +} +``` + +如果 case 语句是空语句,则可以不用加注释特别说明: +```c +switch (var) { + case 0: + case 1: + DoSomething(); + break; + default: + DoNothing(); + break; +} +``` + +# 4 头文件 + +**对于C语言来说,头文件的设计体现了大部分的系统设计**。 +正确使用头文件可使代码在可读性、文件大小和编译构建性能上大为改观。 + +本章从编程规范的角度总结了一些方法,可用于帮助合理规划头文件。 + +## 头文件职责 + +头文件是模块或文件的对外接口。 +头文件中适合放置接口的声明,不允许放置实现(内联函数除外)。 +头文件应当职责单一。头文件过于复杂,依赖过于复杂还是导致编译时间过长的主要原因。 + +### 建议4.1 每一个.c文件都应该有相应的.h文件,用于声明需要对外公开的接口 + +通常情况下,每个.c文件都有一个相应的.h(并不一定同名),用于放置对外提供的函数声明、宏定义、类型定义等。 +如果一个.c文件不需要对外公布任何接口,则其就不应当存在。 + +例外:程序的入口(如main函数所在的文件),单元测试代码,动态库代码。 + +示例: +foo.h 内容 +```c +#ifndef FOO_H +#define FOO_H + +int Foo(void); // Good:头文件中声明对外接口 + +#endif +``` + +foo.c 内容 +```c +static void Bar(void); // Good: 对内函数的声明放在.c文件的头部,并声明为static限制其作用域 + +void Foo(void) +{ + Bar(); +} + +static void Bar(void) +{ + // Do something; +} +``` + +内部使用的函数声明,宏、枚举、结构体等定义不应放在头文件中。 + +有些产品中,习惯一个.c文件对应两个.h文件,一个用于存放对外公开的接口,一个用于存放内部需要用到的定义、声明等,以控制.c文件的代码行数。 +不提倡这种风格,产生这种风格的根源在于.c过大,应当首先考虑拆分.c文件。 +另外,一旦把私有定义、声明放到独立的头文件中,就无法从技术上避免别人包含。 + +本规则反过来并不一定成立。比如: +有些特别简单的头文件,如命令 ID 定义头文件,不需要有对应的.c存在。 +同一套接口协议下,有多个实例,由于接口相同且稳定,所以允许出现一个.h对应多个.c文件。 + +### 建议4.2 头文件的扩展名只使用.h,不使用非习惯用法的扩展名,如.inc + +有些产品中使用了 .inc 作为头文件扩展名,这不符合C语言的习惯用法。 +在使用 .inc 作为头文件扩展名的产品,习惯上用于标识此头文件为私有头文件。 +但是从产品的实际代码来看,这一条并没有被遵守,一个 .inc 文件被多个 .c 包含。 +本规范不提倡将私有定义单独放在头文件中,具体见[建议4.1](#a4-1)。 + +## 头文件依赖 + +头文件包含是一种依赖关系,头文件应向稳定的方向包含。 +一般来说,应当让不稳定的模块依赖稳定的模块,从而当不稳定的模块发生变化时,不会影响(编译)稳定的模块。 + +依赖的方向应该是:产品依赖于平台,平台依赖于标准库。 + +除了不稳定的模块依赖于稳定的模块外,更好的方式是每个模块都依赖于接口,这样任何一个模块的内部实现更改都不需要重新编译另外一个模块。 +在这里,假设接口本身是最稳定的。 + +### 规则4.1 禁止头文件循环依赖 + +头文件循环依赖,指 a.h 包含 b.h,b.h 包含 c.h,c.h 包含 a.h, 导致任何一个头文件修改,都导致所有包含了a.h/b.h/c.h的代码全部重新编译一遍。 +而如果是单向依赖,如a.h包含b.h,b.h包含c.h,而c.h不包含任何头文件,则修改a.h不会导致包含了b.h/c.h的源代码重新编译。 + +头文件循环依赖直接体现了架构设计上的不合理,可通过架构优化来避免。 + + +### 规则4.2 头文件必须编写#define保护,防止重复包含 + +为防止头文件被多重包含,所有头文件都应当使用 #define 作为包含保护;不要使用 #pragma once + +定义包含保护符时,应该遵守如下规则: +- 保护符使用唯一名称;统一使用子系统名_部件名_文件名的定义规则。 +- 不要在受保护部分的前后放置代码或者注释,文件头注释除外。 + +假定 util 子系统 timer 部件的 timer.h,其目录为 `timer/include/timer.h`。其保护符若使用 'TIME_H' 很容易不唯一,按规则定义如: +```c +#ifndef UTIL_TIMER_TIMER_H +#define UTIL_TIMER_TIMER_H + +... + +#endif // UTIL_TIMER_TIMER_H +``` + +### 规则4.3 禁止通过声明的方式引用外部函数接口、变量 + +只能通过包含头文件的方式使用其他模块或文件提供的接口。 +通过 extern 声明的方式使用外部函数接口、变量,容易在外部接口改变时可能导致声明和定义不一致。 +同时这种隐式依赖,容易导致架构腐化。 + +不符合规范的案例: +a.c 内容 +```c +extern int Foo(void); // Bad: 通过 extern 的方式引用外部函数 + +void Bar(void) +{ + int i = Foo(); // 这里使用了外部接口 Foo + ... +} +``` + +应该改为: +a.c 内容 +```c +#include "b.h" // Good: 通过包含头文件的方式使用其他.c提供的接口 + +void Bar(void) +{ + int i = Foo(); + ... +} +``` + +b.h 内容 +```c +int Foo(void); +``` + +b.c内容 +```c +int Foo(void) +{ + // Do something +} +``` + +例外,有些场景需要引用其内部函数,但并不想侵入代码时,可以 extern 声明方式引用。 +如: +针对某一内部函数进行单元测试时,可以通过 extern 声明来引用被测函数; +当需要对某一函数进行打桩、打补丁处理时,允许 extern 声明该函数。 + +### 规则4.4 禁止在 extern "C" 中包含头文件 + +在 extern "C" 中包含头文件,有可能会导致 extern "C" 嵌套,部分编译器对 extern "C" 嵌套层次有限制,嵌套层次太多会编译错误。 + +extern "C" 通常出现在 C,C++ 混合编程的情况下,在 extern "C" 中包含头文件,可能会导致被包含头文件的原有意图遭到破坏,比如链接规范被不正确地更改。 + +示例,存在a.h和b.h两个头文件: +a.h 内容 +```c +... +#ifdef __cplusplus +void Foo(int); +#define A(value) Foo(value) +#else +void A(int) +#endif +``` + +b.h 内容 +```c +... +#ifdef __cplusplus +extern "C" { +#endif + +#include "a.h" +void B(void); + +#ifdef __cplusplus +} +#endif +``` + +使用C++预处理器展开b.h,将会得到 +```c +extern "C" { + void Foo(int); + void B(void); +} +``` + +按照 a.h 作者的本意,函数 Foo 是一个 C++ 自由函数,其链接规范为 "C++"。 +但在 b.h 中,由于 `#include "a.h"` 被放到了 `extern "C"` 的内部,函数 Foo 的链接规范被不正确地更改了。 + +例外: +如果在 C++ 编译环境中,想引用纯C的头文件,这些C头文件并没有 `extern "C"` 修饰。非侵入式的做法是,在 `extern "C"` 中去包含C头文件。 + +# 5 函数 + +函数的作用:避免重复代码、增加可重用性;分层,降低复杂度、隐藏实现细节,使程序更加模块化,从而更有利于程序的阅读,维护。 + +函数应该简洁、短小。 +一个函数只完成一件事情。 + +## 函数设计 + +函数设计的精髓:编写整洁函数,同时把代码有效组织起来。代码简单直接、不隐藏设计者的意图、用干净利落的抽象和直截了当的控制语句将函数有机组织起来。 + +### 规则5.1 避免函数过长,函数不超过50行(非空非注释) + +函数应该可以一屏显示完 (50行以内),只做一件事情,而且把它做好。 + +过长的函数往往意味着函数功能不单一,过于复杂,或过分呈现细节,未进行进一步抽象。 + +例外: +考虑代码的聚合性与功能的全面性,某些函数可能会超过50行,但前提是不影响代码的可读性与简洁。 +这些例外的函数应该是极少的,例如特定算法处理。 + +即使一个长函数现在工作的非常好, 一旦有人对其修改, 有可能出现新的问题, 甚至导致难以发现的bug。 +建议将其拆分为更加简短并易于管理的若干函数,以便于他人阅读和修改代码。 + +### 规则5.2 避免函数的代码块嵌套过深,不要超过4层 + +函数的代码块嵌套深度指的是函数中的代码控制块(例如:if、for、while、switch等)之间互相包含的深度。 +每级嵌套都会增加阅读代码时的脑力消耗,因为需要在脑子里维护一个“栈”(比如,进入条件语句、进入循环等等)。 +应该做进一步的功能分解,从而避免使代码的阅读者一次记住太多的上下文。 + +使用`卫语句`可以有效的减少 if 相关的嵌套层次。例: +原代码嵌套层数是 3: +```c +int Foo(...) +{ + if (received) { + type = GetMsgType(msg); + if (type != UNKNOWN) { + return DealMsg(...); + } + } + return -1; +} +``` + +使用`卫语句`重构,嵌套层数变成 2: +```c +int Foo(...) +{ + if (!received) { // Good: 使用'卫语句' + return -1; + } + + type = GetMsgType(msg); + if (type == UNKNOWN) { + return -1; + } + + return DealMsg(..); +} +``` +例外: +考虑代码的聚合性与功能的全面性,某些函数嵌套可能会超过4层,但前提是不影响代码的可读性与简洁。 +这些例外的函数应该是极少的。 + +### 建议5.1 对函数的错误返回码要全面处理 + +一个函数(标准库中的函数/第三方库函数/用户定义的函数)能够提供一些指示错误发生的方法。 +这可以通过使用错误标记、特殊的返回数据或者其他手段,不管什么时候函数提供了这样的机制,调用程序应该在函数返回时立刻检查错误指示。 + +示例: +```c +char fileHead[128]; +ReadFileHead(fileName, fileHead, sizeof(fileHead)); // Bad: 未检查返回值 + +DealWithFileHead(fileHead, sizeof(fileHead)); // fileHead 可能无效 +``` + +正确写法: +```c +char fileHead[128]; +ret = ReadFileHead(fileName, fileHead, sizeof(fileHead)); +if (ret != OK) { // Good: 确保 fileHead 被有效写入 + return ERROR; +} + +DealWithFileHead(fileHead, sizeof(fileHead)); // 处理文件头 +``` + + +注意,当函数返回值被大量的显式(void)忽略掉时,应当考虑函数返回值的设计是否合理。 +如果所有调用者都不关注函数返回值时,请将函数设计成`void`型。 + +## 函数参数 + +### 建议5.2 设计函数时,优先使用返回值而不是输出参数 + +使用返回值而不是输出参数,可以提高可读性,并且通常提供相同或更好的性能。 + +函数名为 GetXxx、FindXxx、IsXxx、OnXxx或直接名词作函数名的函数,直接返回对应对象,可读性更好。 +例外: +1、多值返回时,可以设计为输出参数返回。 +2、涉及内存分配时,可以设计为输出参数返回。调用者将申请的内存做为出参传入,而函数内由不再分配内存。 + +### 建议5.3 设计函数的参数时,统一按输入、输出、出入的顺序定义参数。 + +函数参数的定义统一按输入参数、输出参数、出入参的顺序进行定义。 + +### 规则5.3 设计函数的资源时,涉及内存、锁、队列等资源分配的,需要同时提供释放函数。 + +本着资源从那儿申请,向那儿释放的原则。如果函数申请了内存、锁、队列等资源,则模块需要同时提供资源的函数。 + +### 建议5.4 使用强类型参数,避免使用void\* + +尽管不同的语言对待强类型和弱类型有自己的观点,但是一般认为c/c++是强类型语言,既然我们使用的语言是强类型的,就应该保持这样的风格。 +好处是尽量让编译器在编译阶段就检查出类型不匹配的问题。 + +使用强类型便于编译器帮我们发现错误,如下代码中注意函数 `FooListAddNode` 的使用: +```c +struct FooNode { + struct List link; + int foo; +}; + +struct BarNode { + struct List link; + int bar; +} + +void FooListAddNode(void *node) // Bad: 这里用 void * 类型传递参数 +{ + FooNode *foo = (FooNode *)node; + ListAppend(&g_fooList, &foo->link); +} + +void MakeTheList(...) +{ + FooNode *foo; + BarNode *bar; + ... + + FooListAddNode(bar); // Wrong: 这里本意是想传递参数 foo,但错传了 bar,却没有报错 +} + +``` + +上述问题有可能很隐晦,不易轻易暴露,从而破坏性更大。 +如果明确 `FooListAddNode` 的参数类型,而不是 `void *`,则在编译阶段就能发现上述问题。 +```c +void FooListAddNode(FooNode *foo) +{ + ListAppend(&g_fooList, &foo->link); +} +``` + +例外:某些通用泛型接口,需要传入不同类型指针的,可以用 `void *` 入参。 + +### 建议5.5 模块内部函数参数的合法性检查,由调用者负责 + +对于模块外部传入的参数,必须进行合法性检查,保护程序免遭非法输入数据的破坏。 +模块内部函数调用,缺省由调用者负责保证参数的合法性,如果都由被调用者来检查参数合法性,可能会出现同一个参数,被检查多次,产生冗余代码,很不简洁。 + +由调用者保证入参的合法性,这种契约式编程能让代码逻辑更简洁,可读性更好。 +示例: +```c +int SomeProc(...) +{ + int data; + + bool dataOK = GetData(&data); // 获取数据 + if (!dataOK) { // 检查上一步结果,其实也就保证了数据合法 + return -1; + } + + DealWithData(data); // 调用数据处理函数 + ... +} + +void DealWithData(int data) +{ + if (data < MIN || data > MAX) { // Bad: 调用者已经保证了数据合法性 + return; + } + + ... +} +``` + +### 建议5.5 函数的指针参数如果不是用于修改所指向的对象就应该声明为指向const的指针 + +const 指针参数,将限制函数通过该指针修改所指向对象,使代码更牢固、安全。 + +示例:C99标准 7.21.4.4 中strncmp 的例子,不变参数声明为const。 +```c +int strncmp(const char *s1, const char *s2, size_t n); // Good:不变参数声明为const +``` + +注意: +指针参数要不要加 const 取决于函数设计,而不是看函数实体内有没有发生“修改对象”的动作。 + +### 建议5.6 函数的参数个数不超过5个 + +函数的参数过多,会使得该函数易于受外部(其他部分的代码)变化的影响,从而影响维护工作。函数的参数过多同时也会增大测试的工作量。 + +函数的参数个数不要超过5个,如果超过可以考虑: +- 看能否拆分函数 +- 看能否将相关参数合在一起,定义结构体 + +## 内联函数 + +内联函数是**C99**引入的一种函数优化手段。函数内联能消除函数调用的开销;并得益于内联实现跟调用点代码的合并,编译器有更大的视角,从而完成更多的代码优化。内联函数跟函数式宏比较类似,两者的分析详见[建议6.1](#a6-1)。 + +### 建议5.7 内联函数不超过10行(非空非注释) + +将函数定义成内联一般希望提升性能,但是实际并不一定能提升性能。 +如果函数体短小,则函数内联可以有效的缩减目标代码的大小,并提升函数执行效率。 +反之,函数体比较大,内联展开会导致目标代码的膨胀,特别是当调用点很多时,膨胀得更厉害,反而会降低执行效率。 +内联函数规模建议控制在 **10** 行以内。 + +不要为了提高性能而滥用内联函数。不要过早优化。一般情况,当有实际测试数据证明内联性能更高时,再将函数定义为内联。 +对于类似 setter/getter 短小而且调用频繁的函数,可以定义为内联。 + +### 规则5.3 被多个源文件调用的内联函数要放在头文件中定义 + +内联函数是在编译时内联展开,因此要求内联函数定义必须在调用此函数的每个源文件内可见。 +如下所示代码,inline.h 只有`SomeInlineFunc`函数的声明而没有定义。other.c包含inline.h,调用`SomeInlineFunc`时无法内联。 + +inline.h +```c +inline int SomeInlineFunc(void); +``` + +inline.c +```c +inline int SomeInlineFunc(void) +{ + // 实现代码 +} +``` + +other.c +```c +#include "inline.h" +int OtherFunc(void) +{ + int ret = SomeInlineFunc(); +} +``` + +由于这个限制,多个源文件如果要调用同一个内联函数,需要将内联函数的定义放在头文件中。 +**gnu89** 在内联函数实现上跟**C99**标准有差异,兼容做法是将函数声明为 **static inline**。 + +# 6 宏 + +## 函数式宏(function-like macro) + +函数式宏是指形如函数的宏(示例代码如下所示),其包含若干条语句来实现某一特定功能。 +```c +#define ASSERT(x) do { \ + if (!(x)) { \ + printk(KERN_EMERG "assertion failed %s: %d: %s\n", \ + __FILE__, __LINE__, #x); \ + BUG(); \ + } \ +} while (0) +``` + +### 建议6.1 使用函数代替函数式宏 + +定义函数式宏前,应考虑能否用函数替代。对于可替代场景,建议用函数替代宏。 +函数式宏的缺点如下: + +- 函数式宏缺乏类型检查,不如函数调用检查严格。示例代码[见下](#macro_lack_of_type_check__example)。 +- 宏展开时宏参数不求值,可能会产生非预期结果,详见[规则6.1](#r6-1)和[规则6.3](#r6-3)。 +- 宏没有独立的作用域,跟控制流语句配合时,可能会产生如[规则6.2](#r6-2)描述的非预期结果。 +- 宏的技巧性太强(参见下面的规则),例如`#`的用法和无处不在的括号,影响可读性。 +- 在特定场景下必须用特定编译器对宏的扩展,如 `gcc` 的 `statement expression`,可移植性也不好。 +- 宏在预编译阶段展开后,在其后编译、链接和调试时都不可见;而且包含多行的宏会展开为一行。函数式宏难以调试、难以打断点,不利于定位问题。 +- 对于包含大量语句的宏,在每个调用点都要展开。如果调用点很多,会造成代码空间的膨胀。 + +函数式宏缺乏类型检查的示例代码: + +```c +#define MAX(a, b) (((a) < (b)) ? (b) : (a)) + +int Max(int a, int b) +{ + return (a < b) ? b : a; +} + +int TestMacro(void) +{ + unsigned int a = 1; + int b = -1; + + (void)printf("MACRO: max of a(%u) and b(%d) is %d\n", a, b, MAX(a, b)); + (void)printf("FUNC : max of a(%u) and b(%d) is %d\n", a, b, Max(a, b)); + return 0; +} +``` + +由于宏缺乏类型检查,`MAX`中的`a`和`b`的比较提升为无符号数的比较,结果是**a < b**。输出结果是: + +``` +MACRO: max of a(1) and b(-1) is -1 +FUNC : max of a(1) and b(-1) is 1 +``` + +函数没有宏的上述缺点。但是,函数相比宏,最大的劣势是执行效率不高(增加函数调用的开销和编译器优化的难度)。 +为此,C99标准引入了内联函数(gcc在标准之前就引入了内联函数)。 + +内联函数跟宏类似,也是在调用点展开。不同之处在于内联函数是在编译时展开。 +内联函数兼具函数和宏的优点: + +- 内联函数/函数执行严格的类型检查 +- 内联函数/函数的入参求值只会进行一次 +- 内联函数就地展开,没有函数调用的开销 +- 内联函数比函数优化得更好 + +对于性能敏感的代码,可以考虑用内联函数代替函数式宏。 +函数和内联函数不能完全替代函数式宏,函数式宏在某些场景更适合。 +比如,在日志记录场景下,使用带可变参和默认参数的函数式宏更方便: + +```c +int ErrLog(const char *file, unsigned long line, const char *fmt, ...); +#define ERR_LOG(fmt, ...) ErrLog(__FILE__, __LINE__, fmt, ##__VA_ARGS__) +``` + + +### 规则6.1 定义宏时,宏参数要使用完备的括号 + +宏参数在宏展开时只是文本替换,在编译时再求值。文本替换后,宏包含的语句跟调用点代码合并。 +合并后的表达式因为操作符的优先级和结合律,可能会导致计算结果跟期望的不同,尤其是当宏参数在一个表达式中时。 + +如下所示,是一种错误的写法: +```c +#define SUM(a, b) a + b // Bad. +``` + +下面这样调用宏,执行结果跟预期不符: +`100 / SUM(2, 8)` 将扩展成 `(100 / 2) + 8`,预期结果则是`100 / (2 + 8)`。 +这个问题可以通过将整个表示式加上括号来解决,如下所示: +```c +#define SUM(a, b) (a + b) // Bad. +``` + +但是这种改法在下面这种场景又有问题: +`SUM(1 << 2, 8)`扩展成`1 << (2 + 8)`(因为`<<`优先级低于`+`),跟预期结果`(1 << 2) + 8`不符。 + +这个问题可以通过将每个宏参数都加上括号来解决,如下所示: +```c +#define SUM(a, b) (a) + (b) // Bad. +``` + +再看看第三种问题场景:`SUM(2, 8) * 10` 。扩展后的结果为 `(2) + ((8) * 10)`,跟预期结果`(2 + 8) * 10`不符。 + +综上所述,正确的写法如下: +```c +#define SUM(a, b) ((a) + (b)) // Good. +``` + +但是要避免滥用括号。如下所示,单独的数字或标识符加括号毫无意义。 +```c +#define SOME_CONST 100 // Good: 单独的数字无需括号 +#define ANOTHER_CONST (-1) // Good: 负数需要使用括号 + +#define THE_CONST SOME_CONST // Good: 单独的标识符无需括号 +``` + +下列情况需要注意: +- 宏参数参与 '#', '##' 操作时,不要加括号 +- 宏参数参与字符串拼接时,不要加括号 +- 宏参数作为独立部分,在赋值(包括+=, -=等)操作的某一边时,无需括号 +- 宏参数作为独立部分,在逗号表达式,函数或宏调用列表中,无需括号 + +举例: +```c +#define MAKE_STR(x) #x // x 不要加括号 + +#define HELLO_STR(obj) "Hello, " obj // obj 不要加括号 + +#define ADD_3(sum, a, b, c) (sum = (a) + (b) + (c)) // a, b, c 需要括号;而 sum 无需括号 + +#define FOO(a, b) Bar((a) + 1, b) // a 需要括号;而 b 无需括号 +``` + + +### 规则6.2 包含多条语句的函数式宏的实现语句必须放在 do-while(0) 中 + +宏本身没有代码块的概念。当宏在调用点展开后,宏内定义的表达式和变量融合到调用代码中,可能会出现变量名冲突和宏内语句被分割等问题。 +通过 do-while(0) 显式为宏加上边界,让宏有独立的作用域,并且跟分号能更好的结合而形成单条语句,从而规避此类问题。 + +如下所示的宏是错误的用法(为了说明问题,下面示例代码稍不符规范): + +```c +// Not Good. +#define FOO(x) \ + (void)printf("arg is %d\n", (x)); \ + DoSomething((x)); +``` + +当像下面示例代码这样调用宏,for循环只执行了宏的第一条语句,宏的后一条语句只在循环结束后执行一次。 + +```c +for (i = 1; i < 10; i++) + FOO(i); +``` + +用大括号将`FOO`定义的语句括起来可以解决上面的问题: + +```c +#define FOO(x) { \ + (void)printf("arg is %d\n", (x)); \ + DoSomething((x)); \ +} +``` + +由于大括号跟分号没有关联。大括号后紧跟的分号,是另外一个语句。 +如下示例代码,会出现'悬挂else' 编译报错: + +```c +if (condition) + FOO(10); +else + FOO(20); +``` + +正确的写法是用 do-while(0) 把执行体括起来,如下所示: + +```c +// Good. +#define FOO(x) do { \ + (void)printf("arg is %d\n", (x)); \ + DoSomething((x)); \ +} while (0) +``` + +例外: +- 包含 break, continue 语句的宏可以例外。使用此类宏务必特别小心。 +- 宏中包含不完整语句时,可以例外。比如用宏封装 for 循环的条件部分。 +- 非多条语句,或单个 if/for/while/switch 语句,可以例外。 + +### 规则6.3 不允许把带副作用的表达式作为参数传递给函数式宏 + +由于宏只是文本替换,对于内部多次使用同一个宏参数的函数式宏,将带副作用的表达式作为宏参数传入会导致非预期的结果。 +如下所示,宏`SQUARE`本身没有问题,但是使用时将带副作用的`a++`传入导致`a`的值在`SQUARE`执行后跟预期不符: + +```c +#define SQUARE(a) ((a) * (a)) + +int a = 5; +int b; +b = SQUARE(a++); // Bad: 实际 a 自增加了 2 次 +``` + +`SQUARE(a++)`展开后为`((a++) * (a++))`,变量`a`自增了两次,其值为`7`,而不是预期的`6`。 + +正确的写法如下所示: + +```c +b = SQUARE(a); +a++; // 结果:a = 6,只自增了一次。 +``` + +此外,如果参数包含函数调用,宏展开后,函数可能会被重复调用。 +如果函数执行结果相同,则存在浪费;如果函数多次调用结果不一样,执行结果可能不符合预期。 + + +### 建议6.2 函数式宏定义中慎用 return、goto、continue、break 等改变程序流程的语句 + +宏中使用 return、goto、continue、break 等改变流程的语句,虽然能简化代码,但同时也隐藏了真实流程,不易于理解,容易导致资源泄漏等问题。 + +首先,宏封装 return 容易导致过度封装和使用。 +如下代码,`status`的判断是主干流程的一部分,用宏封装起来后,变得不直观了,阅读时习惯性把`RETURN_IF`宏忽略掉了,从而导致对主干流程的理解有偏差。 + +```c +#define LOG_AND_RETURN_IF_FAIL(ret, fmt, ...) do { \ + if ((ret) != OK) { \ + (void)ErrLog(fmt, ##__VA_ARGS__); \ + return (ret); \ + } \ +} while (0) + +#define RETURN_IF(cond, ret) do { \ + if (cond) { \ + return (ret); \ + } \ +} while (0) + +ret = InitModuleA(a, b, &status); +LOG_AND_RETURN_IF_FAIL(ret, "Init module A failed!"); // OK. + +RETURN_IF(status != READY, ERR_NOT_READY); // Bad: 重要逻辑不明显 + +ret = InitModuleB(c); +LOG_AND_RETURN_IF_FAIL(ret, "Init module B failed!"); // OK. +``` + +其次,宏封装 return 也容易引发内存泄漏。再看一个例子: +```c +#define CHECK_PTR(ptr, ret) do { \ + if ((ptr) == NULL) { \ + return (ret); \ + } \ +} while (0) + +... + +mem1 = MemAlloc(...); +CHECK_PTR(mem1, ERR_CODE_XXX); + +mem2 = MemAlloc(...); +CHECK_PTR(mem2, ERR_CODE_XXX); // Wrong: 内存泄漏 +``` + +如果 `mem2` 申请内存失败了,`CHECK_PTR` 会直接返回,而没有释放 `mem1`。 +除此之外,`CHECK_PTR` 宏命名也不好,宏名只反映了检查动作,没有指明结果。只有看了宏实现才知道指针为空时返回失败。 + +综上所述: +不推荐宏定义中封装 return、goto、continue、break 等改变程序流程的语句; +对于返回值判断等异常处理场景可以例外。 + +注意: +**包含 return、goto、continue、break 等改变流程语句的宏命名,务必要体现对应关键字。** + + +### 建议6.3 函数式宏不超过10行(非空非注释) + +函数式宏本身的一大问题是比函数更难以调试和定位,特别是宏过长,调试和定位的难度更大。 +而且宏扩展会导致目标代码的膨胀。建议函数式宏不要超过10行。 + +# 7 变量 + +在C语言编码中,除了函数,最重要的就是变量。 +变量在使用时,应始终遵循“职责单一”原则。 +按作用域区分,变量可分为全局变量和局部变量。 + +## 全局变量 + +尽量不用或少用全局变量。 +在程序设计中,全局变量是在所有作用域都可访问的变量。通常,使用不必要的全局变量被认为是坏习惯。 + +使用全局变量的缺点: +- 破坏函数的独立性和可移植性,使函数对全局变量产生依赖,存在耦合; +- 降低函数的代码可读性和可维护性。当多个函数读写全局变量时,某一时刻其取值可能不是确定的,对于代码的阅读和维护不利; +- 在并发编程环境中,使用全局变量会破坏函数的可重入性,需要增加额外的同步保护处理才能确保数据安全。 + +如不可避免,对全局变量的读写应集中封装。 + +### 规则7.1 模块间,禁止使用全局变量作接口 + +全局变量是模块内部的具体实现,不推荐但允许跨文件使用,但禁止作为模块接口暴露出去。 +对全局变量的使用应该尽量集中,如果本模块的数据需要对外部模块开放,应提供对应函数接口。 + +## 局部变量 + +### 规则7.2 严禁使用未经初始化的变量 + +这里的变量,指的是局部动态变量,并且还包括内存堆上申请的内存块。 +因为他们的初始值都是不可预料的,所以禁止未经有效初始化就直接读取其值。 + +```c +void Foo(...) +{ + int data; + Bar(data); // Bad: 未初始化就使用 + ... +} +``` + +如果有不同分支,要确保所有分支都得到初始化后才能使用: +```c +void Foo(...) +{ + int data; + if (...) { + data = 100; + } + Bar(data); // Bad: 部分分支该值未初始化 + ... +} +``` + +未经初始化就使用,一般静态检查工具是可以检查出来的。 +如 PCLint 工具,针对上述两个例子分别会报错: +>Warning 530: Symbol 'data' (line ...) not initialized +>Warning 644: Variable 'data' (line ...) may not have been initialized + +### 规则7.3 禁止无效、冗余的变量初始化 + +如果没有确定的初始值,而仍然进行初始化,不仅不简洁,反而不安全,可能会引入更难发现的问题。 + +常见的冗余初始化: +```c +int cnt = 0; // Bad: 冗余初始化,将会被后面直接覆盖 +... +cnt = GetXxxCnt(); +... +``` + +对于后续有条件赋值的变量,可以在定义时初始化成默认值 +```c +char *buf = NULL; // Good: 这里用 NULL 代表默认值 +if (condition) { + buf = malloc(MEM_SIZE); +} +... +if (buf != NULL) { // 判断是否申请过内存 + free(buf); +} +``` + +针对大数组的冗余清零,更是会影响到性能。 +```c +char buf[VERY_BIG_SIZE] = {0}; +memset(buf, 0, sizeof(buf)); // Bad: 冗余清零 +``` + +无效初始化,隐藏更大问题的反例: +```c +void Foo(...) +{ + int data = 0; // Bad: 习惯性的进行初始化 + + UseData(data); // 使用数据,本应该写在获取数据后面 + data = GetData(...); // 获取数据 + ... +} +``` +上例代码,如果没有赋 0 初始化,静态检查工具可以帮助发现“未经初始化就直接使用”的问题。 +但因为无效初始化,“使用数据”与“获取数据”写颠倒的缺陷,不能被轻易发现。 + +因此,应该写简洁的代码,对变量或内存块进行正确、必要的初始化。 + +C99不再限制局部变量定义必须在语句之前,可以按需定义,即在靠近变量使用的地方定义变量。 +这种简洁的做法,不仅将变量作用域限制更小,而且更方便阅读和维护,还能解决定义变量时不知该怎么初始化的问题。 +如果编译环境支持,建议按需定义。 + +**例外:** +**遵从“安全规范”要求,指针变量、表示资源描述符的变量、BOOL变量不作要求。** + +### 规则7.4 不允许使用魔鬼数字 + +所谓魔鬼数字即看不懂、难以理解的数字。 +魔鬼数字并非一个非黑即白的概念,看不懂也有程度,需要结合代码上下文和业务相关知识来判断 + +例如数字 12,在不同的上下文中情况是不一样的: +`type = 12;` 就看不懂,但 `month = year * 12;` 就能看懂。 +数字 0 有时候也是魔鬼数字,比如 `status = 0;` 并不能表达是什么状态。 + +解决途径: +对于单点使用的数字,可以增加注释说明 +对于多处使用的数字,必须定义宏或const 变量,并通过符号命名自注释。 + +禁止出现下列情况: +没有通过符号来解释数字含义,如 `#define ZERO 0` +符号命名限制了其取值,如 `#define XX_TIMER_INTERVAL_300MS 300` + +# 8 编程实践 + +## 表达式 + +### 建议8.1 表达式的比较,应当遵循左侧倾向于变化、右侧倾向于不变的原则 + +当变量与常量比较时,如果常量放左边,如 `if (MAX == v)` 不符合阅读习惯,而 `if (MAX > v)` 更是难于理解。 +应当按人的正常阅读、表达习惯,将常量放右边。写成如下方式: +```c +if (v == MAX) ... +if (v < MAX) ... +``` + +也有特殊情况,如:`if (MIN < v && v < MAX)` 用来描述区间时,前半段是常量在左的。 + +不用担心将 '==' 误写成 '=',因为 `if (v = MAX)` 会有编译告警,其他静态检查工具也会报错。让工具去解决笔误问题,代码要符合可读性第一。 + +### 规则8.1 含有变量自增或自减运算的表达式中禁止再次引用该变量 + +含有变量自增或自减运算的表达式中,如果再引用该变量,其结果在C标准中未明确定义。各个编译器或者同一个编译器不同版本实现可能会不一致。 +为了更好的可移植性,不应该对标准未定义的运算次序做任何假设。 + +注意,运算次序的问题不能使用括号来解决,因为这不是优先级的问题。 + +示例: +```c +x = b[i] + i++; // Bad: b[i]运算跟 i++,先后顺序并不明确。 +``` +正确的写法是将自增或自减运算单独放一行: +```c +x = b[i] + i; +i++; // Good: 单独一行 +``` + +函数参数: +```c +Func(i++, i); // Bad: 传递第2个参数时,不确定自增运算有没有发生 +``` +正确的写法: +```c +i++; // Good: 单独一行 +x = Func(i, i); +``` + + +### 建议8.2 用括号明确表达式的操作顺序,避免过分依赖默认优先级 + +可以使用括号强调表达式操作顺序,防止因默认的优先级与设计思想不符而导致程序出错。 +然而过多的括号会分散代码使其降低了可读性,应适度使用。 + +当表达式包含不常用,优先级易混淆的操作符时,推荐使用括号,比如位操作符: +```c +c = (a & 0xFF) + b; /* 涉及位操作符,需要括号 */ +``` + +## 语句 + +### 规则8.2 switch语句要有default分支 + +大部分情况下,switch语句中要有default分支,保证在遗漏case标签处理时能够有一个缺省的处理行为。 + +特例: +如果switch条件变量是枚举类型,并且 case 分支覆盖了所有取值,则加上default分支处理有些多余。 +现代编译器都具备检查是否在switch语句中遗漏了某些枚举值的case分支的能力,会有相应的warning提示。 +```c +enum Color { + RED, + BLUE +}; + +// 因为switch条件变量是枚举值,这里可以不用加default处理分支 +switch (color) { + case RED: + DoRedThing(); + break; + case BLUE: + DoBlueThing(); + ... + break; +} +``` + +### 建议8.3 慎用 goto 语句 + +goto语句会破坏程序的结构性,所以除非确实需要,最好不使用goto语句。使用时,也只允许跳转到本函数goto语句之后的语句。 + +goto语句通常用来实现函数单点返回。 +同一个函数体内部存在大量相同的逻辑但又不方便封装成函数的情况下,譬如反复执行文件操作, +对文件操作失败以后的处理部分代码(譬如关闭文件句柄,释放动态申请的内存等等), +一般会放在该函数体的最后部分,在需要的地方就goto到那里,这样代码反而变得清晰简洁。 +实际也可以封装成函数或者封装成宏,但是这么做会让代码变得没那么直接明了。 + +示例: +```c +// Good: 使用 goto 实现单点返回 +int SomeInitFunc(void) +{ + void *p1; + void *p2 = NULL; + void *p3 = NULL; + + p1 = malloc(MEM_LEN); + if (p1 == NULL) { + goto EXIT; + } + + p2 = malloc(MEM_LEN); + if (p2 == NULL) { + goto EXIT; + } + + p3 = malloc(MEM_LEN); + if (p3 == NULL) { + goto EXIT; + } + + DoSomething(p1, p2, p3); + return 0; // OK. + +EXIT: + if (p3 != NULL) { + free(p3); + } + if (p2 != NULL) { + free(p2); + } + if (p1 != NULL) { + free(p1); + } + return -1; // Failed! +} +``` + +## 类型转换 + +### 建议8.4 尽量减少没有必要的数据类型默认转换与强制转换 + +当进行数据类型强制转换时,其数据的意义、转换后的取值等都有可能发生变化,而这些细节若考虑不周,就很有可能留下隐患。 + +如下赋值,多数编译器不产生告警,但值的含义还是稍有变化。 +```c +char ch; +unsigned short int exam; + +ch = -1; +exam = ch; // Bad: 编译器不产生告警,此时exam为0xFFFF。 +``` diff --git a/website/docs/_posts/contribute/OpenHarmony-c-cpp-secure-coding-guide.md b/website/docs/_posts/contribute/OpenHarmony-c-cpp-secure-coding-guide.md new file mode 100644 index 0000000000000000000000000000000000000000..a1f4aa9e3fa10768af2ce45dabe80c23d880c280 --- /dev/null +++ b/website/docs/_posts/contribute/OpenHarmony-c-cpp-secure-coding-guide.md @@ -0,0 +1,3173 @@ +--- +title: OpenHarmony-c-cpp-secure-coding-guide.md +permalink: /pages/extra/191e89/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# OpenHarmony C&C++ 安全编程指南 + +本文档基于C&C++ 语言提供一些安全编程建议,用于指导开发实践。 + +# 函数 + +## 对所有外部数据进行合法性校验 + +**【描述】** +外部数据的来源包括但不限于:网络、用户输入、命令行、文件(包括程序的配置文件)、环境变量、用户态数据(对于内核程序)、进程间通信(包括管道、消息、共享内存、socket、RPC等,特别需要注意的是设备内部不同单板间通讯也属于进程间通信)、API参数、全局变量。 + +来自程序外部的数据通常被认为是不可信的,在使用这些数据之前,需要进行合法性校验。 +如果不对这些外部数据进行校验,将可能导致不可预期的安全风险。 + +注意:不要使用断言检查外部输入数据,断言应该用于防止不正确的程序假设,而不能用在发布版本上检查程序运行过程中发生的错误。 + +对来自程序外部的数据要校验处理后才能使用。典型场景包括: + +**作为数组索引** +将不可信的数据作为数组索引,可能导致超出数组上限,从而造成非法内存访问。 +**作为内存偏移地址** +将不可信数据作为指针偏移访问内存,可能造成非法内存访问,并可以造成进一步的危害,如任意地址读/写。 +**作为内存分配的尺寸参数** +使用0长度分配内存可能造成非法内存访问;未限制分配内存大小会造成过度资源消耗。 +**作为循环条件** +将不可信数据作为循环限定条件,可能会引发缓冲区溢出、内存越界读/写、死循环等问题。 +**作为除数** +可能产生除零错误(被零除)。 +**作为命令行参数** +可能产生命令注入漏洞。 +**作为数据库查询语句的参数** +可能产生SQL注入漏洞。 +**作为输入/输出格式化字符串** +可能产生格式化字符串漏洞。 +**作为内存复制长度** +可能造成缓冲区溢出问题。 +**作为文件路径** +直接打开不可信路径,可能会导致目录遍历攻击,攻击者操作了无权操作的文件,使得系统被攻击者所控制。 + +输入校验包括但不局限于: + +- API接口参数合法性 +- 校验数据长度 +- 校验数据范围 +- 校验数据类型和格式 +- 校验输入只包含可接受的字符(“白名单”形式),尤其需要注意一些特殊情况下的特殊字符。 + +**外部数据校验原则** +**1.信任边界** +由于外部数据不可信,因此系统在运行过程中,如果数据传输与处理跨越不同的信任边界,为了防止攻击蔓延,必须对来自信任边界外的其他模块的数据进行合法性校验。 +(a)so(或者dll)之间 +so或dll作为独立的第三方模块,用于对外导出公共的api函数,供其他模块进行函数调用。so/dll无法确定上层调用者是否传递了合法参数,因此so/dll的公共函数需要检查调用者提供参数的合法性。so/dll应该设计成低耦合、高复用性,尽管有些软件的so/dll当前设计成只在本软件中使用,但仍然应该将不同的so/dll模块视为不同的信任边界。 +(b)进程与进程之间 +为防止通过高权限进程提权,进程与进程之间的IPC通信(包括单板之间的IPC通信、不同主机间的网络通信),应视为不同信任边界。 +(c)应用层进程与操作系统内核 +操作系统内核具有比应用层更高的权限,内核向应用层提供的接口,应该将来自应用层的数据作为不可信数据处理。 +(d)可信执行环境内外环境 +为防止攻击蔓延至可信执行环境,TEE、SGX等对外提供的接口,应该将来自外部的数据作为不可信数据处理。 + +**2.外部数据校验** +外部数据进入到本模块后,必须经过合法性校验才能使用。被校验后的合法数据,在本模块内,后续传递到内部其他子函数,不需要重复校验。 + +**【反例】** +函数Foo处理外部数据,由于buffer不一定是’\0’结尾, strlen 的返回值 nameLen 有可能超过 len,导致越界读取数据。 + +```cpp +void Foo(const unsigned char* buffer, size_t len) +{ + // buffer可能为空指针,不保证以'\0'结尾 + const char* s = reinterpret_cast(buffer); + size_t nameLen = strlen(s); + std::string name(s, nameLen); + Foo2(name); + ... +} +``` + +**【正例】** +对外部参数做合法性校验,本例中使用 strnlen 进行字符串长度计算,缓解读越界风险。 + +```cpp +void Foo(const unsigned char* buffer, size_t len) +{ + // 必须做参数合法性校验 + if (buffer == nullptr || len == 0 || len >= MAX_BUFFER_LEN) { + ... // 错误处理 + } + + const char* s = reinterpret_cast(buffer); + size_t nameLen = strnlen(s, len); // 使用strnlen缓解读越界风险 + if (nameLen == len) { + ... // 错误处理 + } + std::string name(s, nameLen); + ... + Foo2(name); + ... +} +``` + +```cpp +namespace ModuleA { +// Foo2 为模块内部函数,约定为由调用者保证参数的合法性 +static void Foo2(const std::string& name) +{ + ... + Bar(name.c_str()); // 调用MODULE_B中的函数 +} + +// Foo 为模块的外部接口,需要校验参数的合法性 +void Foo(const unsigned char* buffer, size_t len) +{ + // 检查空指针、参数合法范围等 + if (buffer == nullptr || len <= sizeof(int)) { + // 错误处理 + ... + } + + int nameLen = *(reinterpret_cast(buffer)); // 从报文中获取name字符串长度 + // nameLen 是不可信数据,必须检查合法性 + if (nameLen <= 0 || static_cast(nameLen) > len - sizeof(int)) { + // 错误处理 + ... + } + + std::string name(reinterpret_cast(buffer), nameLen); + Foo2(name); // 调用本模块内内部函数 + ... +} +} +``` + +以下是使用C语言编写的`MODULE_B`模块中的代码: + +```cpp +// Bar 为 MODULE_B 模块的公共函数, +// 其约定为,如果参数name不为nullptr,那么必须是一个具有’\0’结尾的合法字符串并且长度大于0 +void Bar(const char* name) +{ + // 必须做参数合法性校验 + if (name == nullptr || name[0] == '\0') { + // 错误处理 + ... + } + size_t nameLen = strlen(name); // 不需要使用strnlen + ... +} +``` + +对于模块A来说, buffer 是外部不可信输入,必须做严格的校验,从 buffer 解析出来的 name,在解析过程中进行了合法性校验,在模块A内部属于合法数据,作为参数传递给内部子函数时不需要再做合法性校验(如果要继续对 name 内容进行解析,那么仍然必须对 name 内容进行校验)。 +如果模块A中的 name 继续跨越信任面传递给其他模块(在本例中是直接调用模块B的公共函数,也可以是通过文件、管道、网络等方式),那么对于B模块来说, name 属于不可信数据,必须做合法性校验。 + +# 类 + +## 类的成员变量必须显式初始化 + +**【描述】** +如果没有对类成员变量显示初始化,会使对象处于一种不确定状态。如果类的成员变量具有默认构造函数,那么可以不需要显式初始化。 + +**【反例】** + +```cpp +class Message { +public: + void Process() + { + ... + } + +private: + uint32_t msgId; // 不符合:成员变量没有被初始化 + size_t msgLength; // 不符合:成员变量没有被初始化 + unsigned char* msgBuffer; // 不符合:成员变量没有被初始化 + std::string someIdentifier; // 默认构造函数仅会初始化该成员 +}; + +Message message; // message成员变量没有被完全初始化 +message.Process(); // 后续使用存在隐患 +``` + +**【正例】** +一种做法是在类成员变量声明时显示初始化。 + +```cpp +class Message { +public: + void Process() + { + ... + } + +private: + uint32_t msgId{0}; + size_t msgLength{0}; + unsigned char* msgBuffer{nullptr}; + std::string someIdentifier; // 具有默认构造函数,不需要显式初始化 +}; +``` + +另一种做法是使用构造函数初始化列表初始化。 + +```cpp +class Message { +public: + Message() : msgId(0), msgLength(0), msgBuffer(nullptr) {} + void Process() + { + ... + } + +private: + uint32_t msgId; + size_t msgLength; + unsigned char* msgBuffer; + std::string someIdentifier; // 具有默认构造函数,不需要显式初始化 +}; +``` + +## 明确需要实现哪些特殊成员函数 + +**【描述】** +**三之法则(Rule of three):** +若某个类需要用户定义的析构函数、用户定义的拷贝构造函或拷贝赋值操作符,则它基本三者全部都需要。 + +```cpp +class Foo { +public: + Foo(const char* buffer, size_t size) { Init(buffer, size); } + Foo(const Foo& other) { Init(other.buf, other.size); } + + Foo& operator=(const Foo& other) + { + Foo tmp(other); + Swap(tmp); + return *this; + } + + ~Foo() { delete[] buf; } + + void Swap(Foo& other) noexcept + { + using std::swap; + swap(buf, other.buf); + swap(size, other.size); + } + +private: + void Init(const char* buffer, size_t size) + { + this->buf = new char[size]; + memcpy(this->buf, buffer, size); + this->size = size; + } + + char* buf; + size_t size; +}; +``` + +如果类对某种资源进行管理,而资源句柄是非类类型的对象(裸指针、文件描述符等),则这些隐式定义的成员函数通常都不正确,其析构函数不做任何事,而拷贝构造函数/拷贝赋值操作符则进行“浅拷贝”。 + +通过可复制句柄来管理不可复制资源的类,可能必须将其拷贝赋值和拷贝构造函数声明为私有的并且不提供其定义,或将它们定义为delete的。 + +**五之法则(Rule of five):** +如果定义了析构函数、拷贝构造函数或拷贝赋值操作符,会阻止移动构造函数和移动赋值操作符的隐式定义,所以任何想要移动语义的类必须声明全部五个特殊成员函数。 + +```cpp +class Foo { +public: + Foo(const char* buffer, size_t size) { Init(buffer, size); } + Foo(const Foo& other) { Init(other.buf, other.size); } + + Foo& operator=(const Foo& other) + { + Foo tmp(other); + Swap(tmp); + return *this; + } + + Foo(Foo&& other) noexcept : buf(std::move(other.buf)), size(std::move(other.size)) + { + other.buf = nullptr; + other.size = 0; + } + + Foo& operator=(Foo&& other) noexcept + { + Foo tmp(std::move(other)); + Swap(tmp); + return *this; + } + + ~Foo() { delete[] buf; } + + void Swap(Foo& other) noexcept + { + using std::swap; + swap(buf, other.buf); + swap(size, other.size); + } + +private: + void Init(const char* buffer, size_t size) + { + this->buf = new char[size]; + memcpy(this->buf, buffer, size); + this->size = size; + } + + char* buf; + size_t size; +}; +``` + +但是如果不提供移动构造函数和移动赋值操作符通常不会发生错误,但会导致失去优化机会。 + +**零之法则(Rule of zero):** +如果类不需要专门处理资源的所有权,那么就不应该有自定义的析构函数、拷贝/移动构造函数或拷贝/移动赋值操作符。 + +```cpp +class Foo { +public: + Foo(const std::string& text) : text(text) {} + +private: + std::string text; +}; +``` + +只要声明了拷贝构造函数、拷贝赋值操作符或析构函数,编译器将不会隐式生成移动构造函数和移动赋值操作符,导致该类的移动操作都变成了代价更高的复制操作。 +只要声明了移动构造函数或移动赋值操作符,编译器会将隐式生成的拷贝构造函数或拷贝赋值操作符定义为delete的,导致改类只能被移动、不能被复制。 +因此,只要声明了其中的任何一个函数,就应当声明其他全部函数,避免出现非预期的结果。 + +类似地,如果基类需要定义public的虚析构函数,那么需要显示定义全部相关的特殊成员函数: + +```cpp +class Base { +public: + ... + Base(const Base&) = default; + Base& operator=(const Base&) = default; + Base(Base&&) = default; + Base& operator=(Base&&) = default; + virtual ~Base() = default; + ... +}; +``` + +但是,如果基类声明了拷贝构造/拷贝赋值操作符,可能会发生切片,所以经常会将基类中的拷贝构造/拷贝赋值操作符显式定义为delete, 并且同时将其他的特殊成员函数也显式定义为delete: + +```cpp +class Base { +public: + ... + Base(const Base&) = delete; + Base& operator=(const Base&) = delete; + Base(Base&&) = delete; + Base& operator=(Base&&) = delete; + virtual ~Base() = default; + ... +}; +``` + +## 基类中的拷贝构造函数、拷贝赋值操作符、移动构造函数、移动赋值操作符必须为非public函数或者为delete函数 + +**【描述】** +如果把一个派生类对象直接赋值给基类对象,会发生切片,只拷贝或者移动了基类部分,损害了多态行为。 + +**【反例】** +如下代码中,基类的拷贝构造函数和拷贝赋值操作符为default,如果派生类对象赋值给基类对象时会发生切片。 +可以将此例中的拷贝构造函数和拷贝赋值操作符声明为delete,编译器可检查出此类赋值行为。 + +```cpp +class Base { +public: + Base() = default; + Base(const Base&) = default; + Base& operator=(const Base&) = default; + ... + virtual void Fun() { std::cout << "Base" << std::endl; } +}; + +class Derived : public Base { + ... + void Fun() override { std::cout << "Derived" << std::endl; } +}; + +void Foo(const Base& base) +{ + Base other = base; // 不符合:发生切片 + other.Fun(); // 调用的是Base类的Fun函数 +} +Derived d; +Foo(d); +``` + +## 在移动构造函数和移动赋值操作符中必须将源对象的资源正确重置 + +**【描述】** +移动构造函数和移动赋值操作符将资源的所有权从一个对象移动到另外一个资源。一旦资源被移动,则应将源对象的资源正确重置。这样可以防止源对象在析构函数中释放了被移动的资源。 + +在被移动的对象中允许保留部分非资源相关数据,但必须保证被移动的对象处于可被正常析构的状态。 +因此,当一个对象被move以后,除非该对象处于明确指定的状态,否则不要依赖已move对象的值,否则可能产生非预期行为。 + +**【反例】** + +```cpp +class Foo { +public: + ... + Foo(Foo&& foo) noexcept : data(foo.data) + { + } + + Foo& operator=(Foo&& foo) + { + data = foo.data; + return *this; + } + + ~Foo() + { + delete[] data; + } + +private: + char* data = nullptr; +}; +``` + +上述Foo的移动构造函数和移动赋值操作符没有正确将源对象的资源重置,源对象析构的时候会将资源释放,导致新创建的对象中接管的资源成为无效资源。 + +**【正例】** + +```cpp +class Foo { +public: + ... + Foo(Foo&& foo) noexcept : data(foo.data) + { + foo.data = nullptr; + } + + Foo& operator=(Foo&& foo) + { + if (this == &foo) { + return *this; + } + delete[] data; + data = foo.data; + foo.data = nullptr; + return *this; + } + + ~Foo() + { + delete[] data; + } + +private: + char* data = nullptr; +}; +``` + +此外,不要依赖已经被move对象的值。 +某些标准库std::string的实现可能对短字节做优化,在实现移动语义时可能不会修改被移动字符串的内容,导致如下代码输出不一定是预期的b, 有可能输出为ab,存在兼容性问题。 + +```cpp +std::string str{"a"}; +std::string other = std::move(str); + +str.append(1, 'b'); +std::cout << str << std::endl; +``` + +## 通过基类指针释放派生类时,必须将基类中析构函数声明为虚函数 + +**【描述】** +只有基类析构函数是虚函数时,才能保证通过多态调用的时候调用到派生类的析构函数。 +如果没有将基类的析构函数声明为虚函数,当通过基类指针释放派生类时,只会调用基类的析构函数,不会调用派生类的析构函数,导致内存泄漏。 + +**【反例】** +没有将基类的析构函数声明为虚函数,导致了内存泄漏。 + +```cpp +class Base { +public: + Base() = default; + ~Base() { std::cout << "~Base" << std::endl; } + virtual std::string GetVersion() = 0; +}; +class Derived : public Base { +public: + Derived() + { + const size_t numberCount = 100; + numbers = new int[numberCount]; + } + + ~Derived() + { + delete[] numbers; + std::cout << "~Derived" << std::endl; + } + + std::string GetVersion() + { + return std::string("hello!"); + } + +private: + int* numbers; +}; +void Foo() +{ + Base* base = new Derived(); + delete base; // 调用的是 Base 的析构函数,造成资源泄漏 +} +``` + +## 对象赋值或初始化避免切片操作 + +**【描述】** + +将派生类对象按值赋值给基类对象时会发生切片,损害了多态行为。 + +如果确实需要将对象切片处理,建议定义一个显式操作完成这个功能,以避免理解错误,增加可维护性。 + +**【反例】** + +```cpp +class Base { + virtual void Fun(); +}; + +class Derived : public Base { + ... +}; +void Foo(const Base& base) +{ + Base other = base; // 不符合:发生切片 + other.Fun(); // 调用的是Base类的Fun函数 +} +Derived d; +Base b{d}; // 不符合:仅构造了Base部分 +b = d; // 不符合:仅赋值Base部分 + +Foo(d); +``` + +# 表达式与语句 + +## 确保对象在使用之前已被初始化 + +**【描述】** +本条款中的“初始化”指的是通过定义时显示初始化、默认构造初始化、赋值等方式使对象拥有期望的值。 +读取一个未初始化的值时,程序可能产生未定义行为,因此需要确保对象在使用之前已被初始化。 + +**【反例】** + +```cpp +void Bar(int data); +... +void Foo() +{ + int data; + Bar(data); // 不符合:未初始化就使用 + ... +} +``` + +如果有不同分支,要确保所有分支都得到初始化后才能使用。 + +```cpp +void Bar(int data); +... +void Foo(int condition) +{ + int data; + if (condition > 0) { + data = CUSTOMIZED_SIZE; + } + Bar(data); // 不符合:部分分支该值未初始化 + ... +} +``` + +**【正例】** + +```cpp +void Bar(int data); +... +void Foo() +{ + int data{0}; // 符合:显示初始化 + Bar(data); + ... +} +void InitData(int& data); +... +void Foo() +{ + int data; + InitData(data); // 符合:通过函数初始化 + ... +} +std::string data; // 符合:默认构造函数初始化 +... +``` + +## 避免使用reinterpret_cast + +**【描述】** +`reinterpret_cast`用于转换不相关类型。尝试用`reinterpret_cast`将一种类型强制转换另一种类型,这破坏了类型的安全性与可靠性,是一种不安全的转换。不同类型之间尽量避免转换。 + +## 避免使用const_cast + +**【描述】** +`const_cast`用于移除对象的`const`和`volatile`性质。 + +使用const_cast转换后的指针或者引用来修改const对象或volatile对象,程序会产生未定义行为。 + +**【反例】** + +```cpp +const int i = 1024; +int* p = const_cast(&i); +*p = 2048; // 未定义行为 +class Foo { +public: + void SetValue(int v) { value = v; } + +private: + int value{0}; +}; + +int main() +{ + const Foo foo; + Foo* p = const_cast(&foo); + p->SetValue(2); // 未定义行为 + return 0; +} +``` + +## 确保有符号整数运算不溢出 + +**【描述】** +在C++标准中,有符号整数溢出会使程序产生未定义行为。 +因此,不同的实现可以自由处理有符号整数溢出。例如:在将有符号整数类型定义为模数的实现中,编译器可以不检测整数溢出。 + +使用溢出后的数值可能导致程序缓冲区读写越界等风险。出于安全考虑,对外部数据中的有符号整数值在如下场景中使用时,需要确保运算不会导致溢出: + +- 指针运算的整数操作数(指针偏移值) +- 数组索引 +- 变长数组的长度(及长度运算表达式) +- 内存复制长度 +- 内存分配函数的参数 +- 循环判断条件 + +在精度低于int的整数类型上进行运算时,需要考虑整数提升。程序员还需要掌握整数转换规则,包括隐式转换规则,以便设计安全的算术运算。 + +**【反例】** +如下代码示例中,参与减法运算的整数是外部数据,在使用前未做校验,可能出现整数溢出,进而造成后续的内存复制操作出现缓冲区溢出。 + +```cpp +unsigned char* content = ... // 指向报文头的指针 +size_t contentSize = ... // 缓冲区的总长度 +int totalLen = ... // 报文总长度 +int skipLen = ... // 从消息中解析出来的需要忽略的数据长度 + +std::vector dest; + +// 用 totalLen - skipLen 计算剩余数据长度,可能出现整数溢出 +std::copy_n(&content[skipLen], totalLen - skipLen, std::back_inserter(dest)); +... +``` + +**【正例】** +如下代码示例中,重构为使用`size_t`类型的变量表示数据长度,并校验外部数据长度是否在合法范围内。 + +```cpp +unsigned char* content = ... //指向报文头的指针 +size_t contentSize = ... // 缓冲区的总长度 +size_t totalLen = ... // 报文总长度 +size_t skipLen = ... // 从消息中解析出来的需要忽略的数据长度 + +if (skipLen >= totalLen || totalLen > contentSize) { + ... // 错误处理 +} + +std::vector dest; +std::copy_n(&content[skipLen], totalLen - skipLen, std::back_inserter(dest)); +... +``` + +**【反例】** +如下代码示例中,对来自外部数据的数值范围做了校验,但是由于second是`int`类型,而校验条件中错误的使用了`std::numeric_limits::max()`进行限制,导致整数溢出。 + +```cpp +int second = ... // 来自外部数据 + + // 错误的使用了unsigned long的取值范围做上限校验 +if (second < 0 || second > (std::numeric_limits::max() / 1000)) { + return -1; +} +int millisecond = second * 1000; // 可能出现整数溢出 +... +``` + +**【正例】** +一种改进方案是将second的类型修改为`unsigned long`类型,这种方案适用于修改了变量类型更符合业务逻辑的场景。 + +```cpp +unsigned long second = ... // 将类型重构为 unsigned long 类型 + +if (second > (std::numeric_limits::max() / 1000)) { + return -1; +} +int millisecond = second * 1000; +... +``` + +另一种改进方案是将数值上限修改为`std::numeric_limits::max()`。 + +```cpp +int second = ... // 来自外部数据 + +if (second < 0 || second > (std::numeric_limits::max() / 1000)) { + return -1; +} +int millisecond = second * 1000; +``` + +**【影响】** +整数溢出可能导致程序缓冲区溢出以及执行任意代码。 + +## 确保无符号整数运算不回绕 + +**【描述】** +无符号整数的算术运算结果可能会发生整数回绕,使用回绕后的数值其可能导致程序缓冲区读写越界等风险。 +出于安全考虑,对外部数据中的无符号整数值在如下场景中使用时,需要确保运算不会导致回绕: + +- 指针偏移值(指针算术运算的整数操作数) +- 数组索引值 +- 内存拷贝的长度 +- 内存分配函数的参数 +- 循环判断条件 + +**【反例】** +如下代码示例中,校验下一个子报文的长度加上已处理报文的长度是否超过了整体报文的最大长度,在校验条件中的加法运算可能会出现整数回绕,造成绕过该校验的问题。 + +```cpp +size_t totalLen = ... // 报文的总长度 +size_t readLen = 0; // 记录已经处理报文的长度 +... +size_t pktLen = ParsePktLen(); // 从网络报文中解析出来的下一个子报文的长度 +if (readLen + pktLen > totalLen) { // 可能出现整数回绕 + ... // 错误处理 +} +... +readLen += pktLen; +... +``` + +**【正例】** +由于readLen变量记录的是已经处理报文的长度,必然会小于totalLen,因此将代码中的加法运算修改为减法运算,不会导致条件绕过。 + +```cpp +size_t totalLen = ... // 报文的总长度 +size_t readLen = 0; // 记录已经处理报文的长度 +... +size_t pktLen = ParsePktLen(); // 来自网络报文 +if (pktLen > totalLen - readLen) { + ... // 错误处理 +} +... +readLen += pktLen; +... +``` + +**【反例】** +如下代码示例中,校验len合法范围的运算可能会出现整数回绕,导致条件绕过。 + +```cpp +size_t len = ... // 来自用户态输入 + +if (SCTP_SIZE_MAX - len < sizeof(SctpAuthBytes)) { // 减法操作可能出现整数回绕 + ... // 错误处理 +} +... = kmalloc(sizeof(SctpAuthBytes) + len, gfp); // 可能出现整数回绕 +... +``` + +**【正例】** +如下代码示例中,调整减法运算的位置(需要确保在编译期间减法表达式的值不回绕),避免整数回绕问题。 + +```cpp +size_t len = ... // 来自用户态输入 + +if (len > SCTP_SIZE_MAX - sizeof(SctpAuthBytes)) { // 确保在编译期间减法表达式的值不翻转 + ... // 错误处理 +} +... = kmalloc(sizeof(SctpAuthBytes) + len, gfp); +... +``` + +**【例外】** +为正确执行程序,必要时无符号整数可能表现出模态(回绕)。建议将变量声明明确注释为支持模数行为,并且对该整数的每个操作也应明确注释为支持模数行为。 + +**【影响】** +整数回绕可能导致程序缓冲区溢出以及执行任意代码。 + +## 确保除法和余数运算不会导致除零错误(被零除) + +**【描述】** +整数的除法运算或取余运算的除数为0会导致程序产生未定义的行为。如果涉及到除法或者取余运算,必须确保除数不为0。 + +在二进制浮点数算数标准ISO/IEEE Std 754-1985中规定了浮点数被零除的行为及结果,但是仍然取决于程序所运行的软硬件环境是否遵循该标准。 +因此,在做浮点数被零除的运算前,应确保软硬件环境已遵循二进制浮点数算数标准,否则仍然存在未定义行为。 + +**【反例】** + +```c +size_t a = ReadSize(); // 来自外部数据 +size_t b = 1000 / a; // 不符合:a可能是0 +size_t c = 1000 % a; // 不符合:a可能是0 +... +``` + +**【正例】** +如下代码示例中,添加a是否为0的校验,防止除零错误。 + +```c +size_t a = ReadSize(); // 来自外部数据 +if (a == 0) { + ... // 错误处理 +} +size_t b = 1000 / a; // 符合:确保a不为0 +size_t c = 1000 % a; // 符合:确保a不为0 +... +``` + +**【影响】** +除零错误可能导致拒绝服务。 + +## 只能对无符号整数进行位运算 + +**【描述】** +对有符号整数进行位运算时可能产生未定义行为,本条款要求只能对无符号整数进行位运算,避免出现未定义行为。 +此外,对精度低于int类型的无符号整数进行位运算时,编译器会进行整数提升,再对提升后的整数进行位运算,因此要特别注意对于这类无符号整数的位运算,避免出现非预期的结果。 +本条款涉及的位操作符包括: + +- `~`(求反) +- `&`(与) +- `|`(或) +- `^`(异或) +- `>>`(右移位) +- `<<`(左移位) +- `&=` +- `^=` +- `|=` +- `>>=` +- `<<=` + +在C++20中有符号整数的移位操作具有良好的定义,可以对有符号整数进行移位运算。 + +**【反例】** +在C++20之前,如下代码中的右移操作`data >> 24`可以实现为算术(有符号)移位或逻辑(无符号)移位;在左移操作`value << data`中,如果value为负数或者左移后的结果超出其整数提升后类型的表示范围,会导致程序产生未定义行为。 + +```cpp +int32_t data = ReadByte(); +int32_t value = data >> 24; // 对有符号整数进行右移运算,其结果是实现定义的 + +... // 检查 data 的合法范围 + +int32_t mask = value << data; // 对有符号整数进行左移运算,程序可能产生未定义行为 +``` + +**【正例】** + +```cpp +uint32_t data = static_cast(ReadByte()); +uint32_t value = data >> 24; // 只对无符号整数进行位运算 + +... // 检查 data 的合法范围 + +uint32_t mask = value << data; +``` + +对于精度低于`int`的无符号整数进行位运算,由于整数提升,其结果可能是非预期的,应将操作结果立即转换为期望的类型, 避免因整数提升而导致非预期结果。 + +**【反例】** + +```cpp +uint8_t mask = 1; +uint8_t value = (~mask) >> 4; // 不符合:~运算的结果会包含高位数据,可能不符合预期 +``` + +**【正例】** + +```cpp +uint8_t mask = 1; +uint8_t value = (static_cast(~mask)) >> 4; // 符合:~运算后立即转换为期望的类型 +``` + +**【例外】** + +- 作为位标志使用的有符号整数常量或枚举值,可以作为 & 和 | 操作符的操作数。 + +```cpp +int fd = open(fileName, O_CREAT | O_EXCL, S_IRWXU | S_IRUSR); +``` + +- 一个在编译时就可以确定的有符号正整数,可以作为移位操作符的右操作数。 + +```cpp +constexpr int SHIFT_BITS = 3; +... +uint32_t id = ...; +uint32_t type = id >> SHIFT_BITS; +``` + +# 资源管理 + +## 外部数据作为数组索引或者内存操作长度时,需要校验其合法性 + +**【描述】** +外部数据作为数组索引对内存进行访问时,必须对数据的大小进行严格的校验,确保数组索引在有效范围内,否则会导致严重的错误。 +将数据复制到容量不足以容纳该数据的内存中会导致缓冲区溢出。为了防止此类错误,必须根据目标容量的大小限制被复制的数据大小,或者必须确保目标容量足够大以容纳要复制的数据。 + +**【反例】** +如下代码示例中,SetDevId()函数存在差一错误,当 index 等于 `DEV_NUM` 时,恰好越界写一个元素。 + +```cpp +struct Dev { + int id; + char name[MAX_NAME_LEN]; +}; + +static Dev devs[DEV_NUM]; + +int SetDevId(size_t index, int id) +{ + if (index > DEV_NUM) { // 存在差一错误 + ... // 错误处理 + } + + devs[index].id = id; + return 0; +} +``` + +**【正例】** +如下代码示例中,修改校验索引的条件,避免差一错误。 + +```cpp +struct Dev { + int id; + char name[MAX_NAME_LEN]; +}; + +static Dev devs[DEV_NUM]; + +int SetDevId(size_t index, int id) +{ + if (index >= DEV_NUM) { + ... // 错误处理 + } + devs[index].id = id; + return 0; +} +``` + +**【反例】** +外部输入的数据不一定会直接作为内存复制长度使用,还可能会间接参与内存复制操作。 +如下代码示例中,inputTable.count来自设备外部报文,虽然没有直接作为内存复制长度使用,而是作为for循环体的上限使用,间接参与了内存复制操作。由于没有校验其大小,可造成缓冲区溢出: + +```cpp +struct ValueTable { + size_t count; + int val[MAX_NUMBERS]; +}; + +void ValueTableDup(const ValueTable& inputTable) +{ + ValueTable outputTable = {0, {0}}; + ... + for (size_t i = 0; i < inputTable.count; i++) { + outputTable.val[i] = inputTable.val[i]; + } + ... +} +``` + +**【正例】** +如下代码示例中,对inputTable.count做了校验。 + +```cpp +struct ValueTable { + size_t count; + int val[MAX_NUMBERS]; +}; + +void ValueTableDup(const ValueTable& inputTable) +{ + ValueTable outputTable = {0, {0}}; + ... + // 根据业务场景,对来自外部报文的循环长度inputTable.count + // 与outputTable.val数组大小做校验,避免造成缓冲区溢出 + if (inputTable->count > + sizeof(outputTable.val) / sizeof(outputTable.val[0])) { + ... // 错误处理 + } + for (size_t i = 0; i < inputTable.count; i++) { + outputTable.val[i] = inputTable.val[i]; + } + ... +} +``` + +**【影响】** +如果复制数据的长度是外部可控的,则复制数据的过程中可能出现缓冲区溢出,在某些情况下可以造成任意代码执行漏洞。 + +## 内存申请前,必须对申请内存大小进行合法性校验 + +**【描述】** +当申请内存大小由程序外部输入时,内存申请前,要求对申请内存大小进行合法性校验,防止申请0长度内存,或者过多地、非法地申请内存。 +因为内存的资源是有限的,是可以被耗尽的。当申请内存的数值过大(可能一次就申请了非常大的超预期的内存;也可能循环中多次申请内存),很可能会造成非预期的资源耗尽。 +大小不正确的参数、不当的范围检查、整数溢出或者截断都可能造成实际分配的缓冲区不符合预期。如果申请内存受攻击者控制,还可能会发生缓冲区溢出等安全问题。 + +**【反例】** +如下代码示例中,将动态分配size大小的内存。但是未对size做合法性校验。 + +```c +// 这里的size在传入DoSomething()函数之前还未做过合法性校验 +int DoSomething(size_t size) +{ + ... + char* buffer = new char[size]; // 本函数内,size使用前未做校验 + ... + delete[] buffer; +} +``` + +**【正例】** +如下代码示例中,动态分配size大小的内存前,进行了符合程序需要的合法性校验。 + +```c +// 这里的size在传入DoSomething()函数之前还未做过合法性校验 +int DoSomething(size_t size) +{ + // 本函数内,对size做合法性校验,FOO_MAX_LEN被定义为符合程序设计预期的最大内存空间 + if (size == 0 || size > FOO_MAX_LEN) { + ... // 错误处理 + } + char* buffer = new char[size]; + ... + delete[] buffer; +} +``` + +**【影响】** +如果申请内存的大小是外部可控的,可能导致资源耗尽,造成拒绝服务。 + +## 在传递数组参数时,不应单独传递指针 + +**【描述】** +当函数参数类型为数组(不是数组的引用)或者指针时,若调用者传入数组,则在参数传递时数组会退化为指针,其数组长度信息会丢失,容易引发越界读写等问题。 +如果函数只接收固定长度的数组为参数,可以定义参数类型为数组引用或者`std::array`。 +如果函数接受的是不带长度的指针,那么应该把长度作为另外一个参数也传递进去。 + +**【反例】** + +```cpp +constexpr int MAX_LEN = 1024; +constexpr int SIZE = 10; + +void UseArr(int arr[]) +{ + for (int i = 0; i < MAX_LEN; i++) { + std::cout << arr[i] << std::endl; + } +} + +void Test() +{ + int arr[SIZE] = {0}; + UseArr(arr); +} +``` + +**【正例】** + +可以把指针和长度合起来做成一个类型,方便使用。例如:类似下面的简单封装: + +```cpp +template +class Slice { +public: + template + Slice(T (&arr)[N]) : data(arr), len(N) {} + + template + Slice(std::array arr) : data(arr.data()), len(N) {} + + Slice(T* arr, size_t n) : data(arr), len(n) {} + ... + +private: + T* data; + size_t len; +}; + +void UseArr(Slice arr) +{ + for (int i = 0; i < arr.size(); i++) { + std::cout << arr[i] << std::endl; + } +} + +constexpr int SIZE = 10; + +void Test() +{ + int arr[SIZE] = {0}; + Slice s{arr}; + UseArr(s); +} +``` + +如果项目允许的话,推荐使用成熟的库来做这个事情,例如C++20中的`std::span`类型。 + +在不使用这些工具类的情况下,可以把指针和长度作为两个参数传递。 + +```cpp +void UseArr(int arr[], size_t len) +{ + for (int i = 0; i < len; i++) { + std::cout << arr[i] << std::endl; + } +} + +constexpr int SIZE = 10; + +void Test() +{ + int arr[SIZE] = {0}; + UseArr(arr, sizeof(arr)); +} +``` + +## 当lambda会逃逸出函数外面时,禁止按引用捕获局部变量 + +**【描述】** +如果一个 lambda 不止在局部范围内使用,禁止按引用捕获局部变量,比如它被传递到了函数的外部,或者被传递给了其他线程的时候。lambda按引用捕获就是把局部对象的引用存储起来。如果 lambda 的生命周期会超过局部变量生命周期,则可能导致内存不安全。 + +**【反例】** + +```cpp +void Foo() +{ + int local = 0; + // 按引用捕获 local,当函数返回后,local 不再存在,因此 Process() 的行为未定义 + threadPool.QueueWork([&] { Process(local); }); +} +``` + +**【正例】** + +```cpp +void Foo() +{ + int local = 0; + // 按值捕获 local, 在Process() 调用过程中,local 总是有效的 + threadPool.QueueWork([local] { Process(local); }); +} +``` + +## 指向资源句柄或描述符的变量,在资源释放后立即赋予新值 + +**【描述】** +指向资源句柄或描述符的变量包括指针、文件描述符、socket描述符以及其他指向资源的变量。 +以指针为例,当指针成功申请了一段内存之后,在这段内存释放以后,如果其指针未立即设置为nullptr,也未分配一个新的对象,那这个指针就是一个悬空指针。 +如果再对悬空指针操作,可能会发生重复释放或访问已释放内存的问题,造成安全漏洞。 +消减该漏洞的有效方法是将释放后的指针立即设置为一个确定的新值,例如设置为nullptr。对于全局性的资源句柄或描述符,在资源释放后,应该马上设置新值,以避免使用其已释放的无效值;对于只在单个函数内使用的资源句柄或描述符,应确保资源释放后其无效值不被再次使用。 + +**【反例】** +如下代码示例中,根据消息类型处理消息,处理完后释放掉body指向的内存,但是释放后未将指针设置为nullptr。如果还有其他函数再次处理该消息结构体时,可能出现重复释放内存或访问已释放内存的问题。 + +```c +int Fun() +{ + SomeStruct *msg = nullptr; + + ... // 使用new分配msg、msg->body的内存空间并初始化msg + + if (msg->type == MESSAGE_A) { + ... + delete msg->body; // 不符合:释放内存后,未置空 + } + + ... + + // 将msg存入全局队列,后续可能使用已释放的body成员 + if (!InsertMsgToQueue(msg)) { + delete msg->body; // 可能再次释放了body的内存 + delete msg; + return -1; + } + return 0; +} +``` + +**【正例】** +如下代码示例中,立即对释放后的指针设置为nullptr,避免重复释放指针。 + +```c +int Fun() +{ + SomeStruct *msg = nullptr; + + ... // 使用new分配msg、msg->body的内存空间并初始化msg + + if (msg->type == MESSAGE_A) { + ... + delete msg->body; + msg->body = nullptr; + } + + ... + + // 将msg存入全局队列 + if (!InsertMsgToQueue(msg)) { + delete msg->body; // 马上离开作用域,不必赋值 nullptr + delete msg; // 马上离开作用域,不必赋值 nullptr + return -1; + } + return 0; +} +``` + +默认的内存释放函数针对空指针不执行任何动作。 + +**【反例】** +如下代码示例中文件描述符关闭后未赋新值。 + +```c +SOCKET s = INVALID_SOCKET; +int fd = -1; +... +closesocket(s); +... +close(fd); +... +``` + +**【正例】** +如下代码示例中,在资源释放后,对应的变量应该立即赋予新值。 + +```c +SOCKET s = INVALID_SOCKET; +int fd = -1; +... +closesocket(s); +s = INVALID_SOCKET; +... +close(fd); +fd = -1; +... +``` + +**【影响】** +再次使用已经释放的内存,或者再次释放已经释放的内存,或其他使用已释放资源的行为,可能导致拒绝服务或执行任意代码。 + +## new和delete配对使用,new[]和delete[]配对使用 + +**【描述】** +使用 new 操作符创造的对象,只能使用 delete 操作符来销毁。 +使用 new[] 创造的对象数组只能由 delete[] 操作符来销毁。 + +**【反例】** + +```cpp +class C { +public: + C(size_t len) : arr(new int[len]) {} + ~C() + { + delete arr; // 此处应该是 delete[] arr; + } + +private: + int* arr; +}; +``` + +**【正例】** + +```cpp +class C { +public: + C(size_t len) : arr(new int[len]) {} + ~C() { delete[] arr; } + +private: + int* arr; +}; +``` + +## 自定义new/delete操作符需要配对定义,且行为与被替换的操作符一致 + +**【描述】** +自定义操作符的时候,new 和 delete 要配对定义,new[] 和 delete[] 要配对定义。 +自定义 new/delete 操作符的行为要与被替换的 new/delete 的行为一致。 + +**【反例】** + +```cpp +// 如果自定义了 operator new,必须同时自定义对应的 operator delete +struct S { + static void* operator new(size_t sz) + { + ... // 自定义操作 + return ::operator new(sz); + } +}; +``` + +**【正例】** + +```cpp +struct S { + static void* operator new(size_t sz) + { + ... // 自定义操作 + return ::operator new(sz); + } + static void operator delete(void* ptr, size_t sz) + { + ... // 自定义操作 + ::operator delete(ptr); + } +}; +``` + +默认的 new 操作符在内存分配失败时,会抛出`std::bad_alloc`异常,而使用了`std::nothrow`参数的 new 操作符在内存分配失败时,会返回 nullptr。 +自定义的 new/delete 操作符要和内置的操作符行为保持一致。 + +**【反例】** + +```cpp +// 在内存管理模块头文件中声明的函数 +extern void* AllocMemory(size_t size); // 分配失败返回 nullptr +void* operator new(size_t size) +{ + return AllocMemory(size); +} +``` + +**【正例】** + +```cpp +// 在内存管理模块头文件中声明的函数 +extern void* AllocMemory(size_t size); // 分配失败返回 nullptr +void* operator new(size_t size) +{ + void* ret = AllocMemory(size); + if (ret != nullptr) { + return ret; + } + throw std::bad_alloc(); // 分配失败抛出异常 +} + +void* operator new(size_t size, const std::nothrow_t& tag) +{ + return AllocMemory(size); +} +``` + +# 错误处理 + +## 抛异常时,抛对象本身,而不是指向对象的指针 + +**【描述】** +C++中推荐的抛异常方式是抛对象本身,而不是指向对象的指针。 + +用throw语句抛出异常的时候,会构造一个临时对象,称为“异常对象(exception object)”。这个异常对象的生命周期在C++语言中很明确:异常对象在throw时被构造;在某个捕获它的catch语句以`throw`以外的方式结束(即没有重新抛出)时,或者指向这个异常的`std::exception_ptr`对象被析构时析构。 + +抛出指针,会使回收被抛出对象的责任不明确。捕获异常的地方是否有义务对该指针进行`delete`操作,取决于该对象是如何分配的(例如静态变量,或者用`new`分配),以及这个对象是否被共享了。但是指针类型本身并不能表明这个对象的生命周期以及所有权,也就无法判断是否应该`delete`。如果应该`delete`却没有做,会造成内存泄露;如果不该`delete`却做了,会造成重复释放。 + +**【反例】** + +不要抛指针。 + +```cpp +static SomeException exc1("reason 1"); + +try { + if (SomeFunction()) { + throw &exc1; // 不符合:这是静态对象的指针,不应该delete + } else { + throw new SomeException("reason 2"); // 不符合:这是动态分配的,应该delete + } +} catch (const SomeException* e) { + delete e; // 不符合:这里不能确定是否需要delete +} +``` + +**【正例】** + +永远抛异常对象本身。 + +```cpp +try { + if (SomeFunction()) { + throw SomeException("reason 1"); + } else { + throw SomeException("reason 2"); + } +} catch (const SomeException& e) { + ... // 符合:这里可以确定不需要delete +} +``` + +## 禁止从析构函数中抛出异常 + +**【描述】** + +析构函数默认自带`noexcept`属性,如果析构函数抛出异常,会直接导致`std::terminate`。自C++11起,允许析构函数被标记为`noexcept(false)`,但即便如此,如果析构函数在stack unwinding的过程中被调用(例如另一个异常抛出,导致栈上的局部变量被析构),结果也是`std::terminate`,而析构函数最大的作用就是在不论正常返回还是抛出异常的情况下都能清理局部变量。因此,让析构函数抛出异常一般都是不好的。 + +# 标准库 + +## 禁止从空指针创建std::string + +**【描述】** +将空指针传递给std::string构造函数,会解引用空指针,从而导致程序产生未定义行为。 + +**【反例】** + +```cpp +void Foo() +{ + const char* path = std::getenv("PATH"); + std::string str(path); // 错误:这里没有判断getenv的返回值是否为nullptr + std::cout << str << std::endl; +} +``` + +**【正例】** + +```cpp +void Foo() +{ + const char* path = std::getenv("PATH"); + if (path == nullptr) { + ... // 报告错误 + return; + } + std::string str(path); + ... + std::cout << str << std::endl; +} +void Foo() +{ + const char* path = std::getenv("PATH"); + std::string str(path == nullptr ? path : ""); + ... // 判断空字符串 + std::cout << str << std::endl; // 必要时判断空字符串 +} +``` + +## 不要保存std::string类型的c_str和data成员函数返回的指针 + +**【描述】** +为保证调用std::string对象的c_str()和data()成员函数返回的引用值结果的有效性,不应保存std::string类型的c_str()和data()的结果,而是在每次需要时直接调用(调用的开销会被编译器内联优化)。否则,当调用此std::string对象的修改方法修改对象后,或超出std::string对象作用域时,之前存储的指针将会失效。使用失效的指针将导致未定义行为。 + +**【反例】** + +```cpp +void Bar(const char* data) +{ + ... +} + +void Foo1() +{ + std::string name{"demo"}; + const char* text = name.c_str(); // 表达式结束以后,name的生命周期还在,指针有效 + + // 如果中间调用了std::string的非const成员函数,导致name被修改,例如operator[], begin()等, + // 可能会导致text的内容不可用,或者不是原来的字符串 + name = "test"; + name[1] = '2'; + ... + Bar(text); // 此处text已不再指向合法内存空间 +} + +void Foo2() +{ + std::string name{"demo"}; + std::string test{"test"}; + const char* text = (name + test).c_str(); // 表达式结束以后,+号产生的临时对象被销毁 + ... + Bar(text); // 此处text已不再指向合法内存空间 +} + +void Foo3(std::string& s) +{ + const char* data = s.data(); + ... + s.replace(0, 3, "***"); + ... + Bar(data); // 此处text已不再指向合法内存空间 +} +``` + +**【正例】** + +```cpp +void Foo1() +{ + std::string name{"demo"}; + + name = "test"; + name[1] = '2'; + ... + Bar(name.c_str()); +} + +void Foo2() +{ + std::string name{"demo"}; + std::string test{"test"}; + name += test; + ... + Bar(name.c_str()); +} + +void Foo3(std::string& s) +{ + ... + s.replace(0, 3, "***"); + ... + Bar(s.data()); +} +``` + +**【例外】** +在少数对性能要求非常高的代码中,为了适配已有的只接受`const char*`类型入参的函数,可以临时保存std::string对象的c_str()方法返回的指针。但是必须严格保证std::string对象的生命周期长于所保存指针的生命周期,并且保证在所保存指针的生命周期内,std::string对象不会被修改。 + +## 确保用于字符串操作的缓冲区有足够的空间容纳字符数据和结束符,并且字符串以null结束符结束 + +**【描述】** +C风格字符串是一个连续的字符序列,由字符序列中的第一个出现的null字符终止并包含该null字符。 + +复制或存储C风格字符串时,必须确保缓冲区有足够的空间容纳字符序列包括null结束符,并且字符串以null结束符结束,否则可能会导致缓冲区溢出问题: + +- 优先使用std::string表示字符串,std::string表示字符串操作更简便,更容易被正确的使用,避免由于C风格字符串使用不当而导致溢出、没有null结束符的问题。 +- 使用C/C++标准库提供的C风格字符串操作函数时,需要确保输入的字符串以null结束符结束、不能超出字符串缓冲区的范围读写字符串、确保进存储操作后的字符串以null结束符结束。 + +**【反例】** + +```cpp +char buf[BUFFER_SIZE]; +std::cin >> buf; +void Foo(std::istream& in) +{ + char buffer[BUFFER_SIZE]; + if (!in.read(buffer, sizeof(buffer))) { // 注意:in.read()不能保证'\0'结尾 + ... // 错误处理 + return; + } + + std::string str(buffer); // 不符合:字符串没有结尾的'\0' + ... +} +void Foo(std::istream& in) +{ + std::string s; + in >> s; // 不符合:没有限制待读取的长度,可能导致资源消耗或攻击 + ... +} +``` + +**【正例】** + +```cpp +char buf[BUFFER_SIZE] = {0}; +std::cin.width(sizeof(buf) - 1); // 注意需要缓冲区长度-1,以留出字符串末尾'\0'的空间 +std::cin >> buf; +void Foo(std::istream& in) +{ + char buffer[BUFFER_SIZE]; + + if (!in.read(buffer, sizeof(buffer)) { // 注意in.read()不能保证'\0'结尾 + ... // 错误处理 + return; + } + + std::string str(buffer, in.gcount()); // 让std::string构造函数,只读取指定长度的字符内容 + ... +} +void Foo(std::istream& in) +{ + std::string s; + in.width(MAX_NEED_SIZE); + in >> s; // 符合:已经限制读取的最大长度 + ... +} +``` + +**【影响】** +未对外部数据中的整数值进行限制可能导致拒绝服务,缓冲区溢出,信息泄露,或执行任意代码。 + +## 禁止使用std::string存储敏感信息 + +**【描述】** +std::string类是C++内部定义的字符串管理类,如果口令等敏感信息通过std::string进行操作,在程序运行过程中,敏感信息可能会散落到内存的各个地方,并且无法清除。 + +**【反例】** +如下代码中,Foo函数中获取密码,保存到std::string变量password中,随后传递给VerifyPassword函数,在这个过程中,password实际上在内存中出现了两份。 + +```cpp +bool VerifyPassword(std::string password) +{ + ... +} + +void Foo() +{ + std::string password = GetPassword(); + VerifyPassword(password); +} +``` + +**【影响】** +未及时清理敏感信息,可能导致信息泄露。 + +## 外部数据用于容器索引或迭代器时必须确保在有效范围内 + +**【描述】** +外部数据是不可信数据,当将外部数据用于容器或数组的索引时,应确保其值在容器或数组可被访问元素的有效范围内;当将外部数据用于迭代器偏移时,应确保偏移后的迭代器值在与迭代器关联容器(从容器对象c的begin()方法创建)的[begin(), end())之间(即大于等于c.begin(),小于等于c.end())。 + +对于具有at()方法的容器(如std::vector, std::set, std::map),对应索引越界或键值内容不存在时,方法将抛出异常;而其对应的operator[]出现索引越界时,将导致未定义行为;或者因键值内容不存在而构造对应键值的默认值不成功时,也将导致未定义行为。 + +**【反例】** + +```cpp +int main() +{ + // 得到一个来自外部输入的整数 (index) + int index; + if (!(std::cin >> index)) { + ... // 错误处理 + return -1; + } + + std::vector c{'A', 'B', 'C', 'D'}; + + // 不符合:没有正确校验index的范围,溢出读取:需要确保index在容器元素的位置范围 + std::cout << c[index] << std::endl; + + // 不符合:需要确保index在容器/数组元素的位置范围 + for (auto pos = std::cbegin(c) + index; pos < std::cend(c); ++pos) { + std::cout << *pos << std::endl; + } + return 0; +} +void Foo(size_t n) +{ + std::vector v{0, 1, 2, 3}; + + // n为外部的API传入的索引,可能导致越界访问 + for_each_n(v.cbegin(), n, [](int x) { std::cout << x; }); +} +``` + +**【正例】** + +```cpp +int main() +{ + // 得到一个来自外部输入的整数 (index) + int index; + if (!(std::cin >> index)) { + ... // 错误处理 + return -1; + } + + // 这里仅以std::vector来举例,std::cbegin(c)等代码也适用于std::string字符串、 + // 和C数组(但不适应于char*变量以及char*表示的静态字符串) + std::vector c{'A', 'B', 'C', 'D'}; + + try { + std::cout << c.at(index) << std::endl; // 符合:索引越界时,at函数将抛出异常 + } catch (const std::out_of_range& e) { + ... // 越界异常处理 + } + + // 后续代码必须使用检验合法的 index 进行容器元素索引或迭代器偏移 + // 正确校验index的范围:已确保index在容器元素的位置范围 + if (index < 0 || index >= c.size()) { + ... // 错误处理 + return -1; + } + + std::cout << c[index] << std::endl; // 符合:已检验index的范围 + + // 符合:已检验index + for (auto pos = std::cbegin(c) + index; pos < std::cend(c); ++pos) { + std::cout << *pos << std::endl; + } + return 0; +} +void Foo(size_t n) +{ + std::vector v{0, 1, 2, 3}; + + // 必须确保for_each_n的迭代范围[first, first + count)有效 + if (n > v.size()) { + ... // 错误处理 + return; + } + for_each_n(v.cbegin(), n, [](int x) { std::cout << x; }); +} +``` + +## 调用格式化输入/输出函数时,使用有效的格式字符串 + +**【描述】** +使用C风格的格式化输入/输出函数时,需要确保格式串是合法有效的,并且格式串与相应的实参类型是严格匹配的,否则会使程序产生非预期行为。 + +除C风格的格式化输入/输出函数以外,C++中类似的函数也需要确保使用有效的格式串,如C++20的std::format()函数。 + +对于自定义C风格的格式化函数,可以使用编译器支持的属性自动检查使用自定义格式化函数的正确性。 +例如:GCC支持自动检测类似printf, scanf, strftime, strfmon的自定义格式化函数,参考GCC手册的Common Function Attributes: + +```c +extern int CustomPrintf(void* obj, const char* format, ...) + __attribute__ ((format (printf, 2, 3))); +``` + +**【反例】** +如下代码示例中,格式化输入一个整数到macAddr变量中,但是macAddr为unsigned char类型,而%x对应的是int类型参数,函数执行完成后会发生写越界。 + +```c +unsigned char macAddr[6]; +... +// macStr中的数据格式为 e2:42:a4:52:1e:33 +int ret = sscanf(macStr, "%x:%x:%x:%x:%x:%x\n", + &macAddr[0], &macAddr[1], + &macAddr[2], &macAddr[3], + &macAddr[4], &macAddr[5]); +... +``` + +**【正例】** +如下代码中,使用%hhx确保格式串与相应的实参类型严格匹配。 + +```c +unsigned char macAddr[6]; +... +// macStr中的数据格式为 e2:42:a4:52:1e:33 +int ret = sscanf(macStr, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\n", + &macAddr[0], &macAddr[1], + &macAddr[2], &macAddr[3], + &macAddr[4], &macAddr[5]); +... +``` + +注:在C++中不推荐使用sscanf, sprintf等C库函数,可以替换为:std::istringstream, std::ostringstream, std::stringstream等。 + +**【影响】** +错误的格式串可能造成内存破坏或者程序异常终止。 + +## 调用格式化输入/输出函数时,禁止format参数受外部数据控制 + +**【描述】** +调用格式化函数时,如果format参数由外部数据提供,或由外部数据拼接而来,会造成字符串格式化漏洞。 +以C标准库的格式化输出函数为例,当其format参数外部可控时,攻击者可以使用%n转换符向指定地址写入一个整数值、使用%x或%d转换符查看栈或寄存器内容、使用%s转换符造成进程崩溃等。 + +常见格式化函数有: + +- 格式化输出函数: sprintf, vsprintf, snprintf, vsnprintf等等 +- 格式化输入函数: sscanf, vsscanf, fscanf, vscanf等等 +- 格式化错误消息函数: err(), verr(), errx(), verrx(), warn(), vwarn(), warnx(), vwarnx(), error(), error_at_line() +- 格式化日志函数: syslog(), vsyslog() +- C++20提供的std::format() + +调用格式化函数时,应使用常量字符串作为格式串,禁止格式串外部可控: + +```cpp +Box v{MAX_COUNT}; +std::cout << std::format("{:#x}", v); +``` + +**【反例】** +如下代码示例中,使用Log()函数直接打印外部数据,可能出现格式化字符串漏洞。 + +```c +void Foo() +{ + std::string msg = GetMsg(); + ... + syslog(priority, msg.c_str()); // 不符合:存在格式化字符串漏洞 +} +``` + +**【正例】** +下面是推荐做法,使用%s转换符打印外部数据,避免格式化字符串漏洞。 + +```c +void Foo() +{ + std::string msg = GetMsg(); + ... + syslog(priority, "%s", msg.c_str()); // 符合:这里没有格式化字符串漏洞 +} +``` + +**【影响】** +如果格式串被外部可控,攻击者可以使进程崩溃、查看栈内容、查看内存内容或者在任意内存位置写入数据,进而以被攻击进程的权限执行任意代码。 + +## 禁止外部可控数据作为进程启动函数的参数或者作为dlopen/LoadLibrary等模块加载函数的参数 + +**【描述】** +本条款中进程启动函数包括system、popen、execl、execlp、execle、execv、execvp等。 +system()、popen()等函数会创建一个新的进程,如果外部可控数据作为这些函数的参数,会导致注入漏洞。 +使用execl()等函数执行新进程时,如果使用shell启动新进程,则同样存在命令注入风险。 +使用execlp()、execvp()、execvpe()函数依赖于系统的环境变量PATH来搜索程序路径,使用它们时应充分考虑外部环境变量的风险,或避免使用这些函数。 + +因此,总是优先考虑使用C标准函数实现需要的功能。如果确实需要使用这些函数,应使用白名单机制确保这些函数的参数不受任何外来数据的影响。 + +dlopen、LoadLibrary函数会加载外部模块,如果外部可控数据作为这些函数的参数,有可能会加载攻击者事先预制的模块。如果要使用这些函数,可以采用如下措施之一: + +- 使用白名单机制,确保这些函数的参数不受任何外来数据的影响。 +- 使用数字签名机制保护要加载的模块,充分保证其完整性。 +- 在设备本地加载的动态库通过权限与访问控制措施保证了本身安全性后,通过特定目录自动被程序加载。 +- 在设备本地的配置文件通过权限与访问控制措施保证了本身安全性后,自动加载配置文件中指定的动态库。 + +**【反例】** +如下代码从外部获取数据后直接作为LoadLibrary函数的参数,有可能导致程序被植入木马。 + +```c +char* msg = GetMsgFromRemote(); +LoadLibrary(msg); +``` + +如下代码示例中,使用 system() 函数执行 cmd 命令串来自外部,攻击者可以执行任意命令: + +```c +std::string cmd = GetCmdFromRemote(); +system(cmd.c_str()); +``` + +如下代码示例中,使用 system() 函数执行 cmd 命令串的一部分来自外部,攻击者可能输入 `some dir;reboot`字符串,创造成系统重启: + +```cpp +std::string name = GetDirNameFromRemote(); +std::string cmd{"ls " + name}; +system(cmd.c_str()); +``` + +使用exec系列函数来避免命令注入时,注意exec系列函数中的path、file参数禁止使用命令解析器(如/bin/sh)。 + +```c +int execl(const char* path, const char* arg, ...); +int execlp(const char* file, const char* arg, ...); +int execle(const char* path, const char* arg, ...); +int execv(const char* path, char* const argv[]); +int execvp(const char* file, char* const argv[]); +int execvpe(const char* file, char* const argv[], char* const envp[]); +``` + +例如,禁止如下使用方式: + +```c +std::string cmd = GetDirNameFromRemote(); +execl("/bin/sh", "sh", "-c", cmd.c_str(), nullptr); +``` + +可以使用库函数,或者可以通过编写少量的代码来避免使用system函数调用命令,如`mkdir()`函数可以实现`mkdir`命令的功能。 +如下代码中,应该避免使用`cat`命令实现文件内容复制的功能。 + +```c +int WriteDataToFile(const char* dstFile, const char* srcFile) +{ + ... // 入参的合法性校验 + std::ostringstream oss; + oss << "cat " << srcFile << " > " << dstFile; + + std::string cmd{oss.str()}; + system(cmd.c_str()); + ... +} +``` + +**【正例】** + +如下代码中,通过少量的代码来实现。如下代码实现了文件复制的功能,避免了对`cat`或`cp`命令的调用。需要注意的是,为简化描述,下面代码未考虑信号中断的影响。 + +```cpp +bool WriteDataToFile(const std::string& dstFilePath, const std::string& srcFilePath) +{ + const int bufferSize = 1024; + std::vector buffer (bufferSize + 1, 0); + + std::ifstream srcFile(srcFilePath, std::ios::binary); + std::ofstream dstFile(dstFilePath, std::ios::binary); + + if (!dstFile || !dstFile) { + ... // 错误处理 + return false; + } + + while (true) { + // 从srcFile读取内容分块 + srcFile.read(buffer.data(), bufferSize); + std::streamsize size = srcFile ? bufferSize : srcFile.gcount(); + + // 写入分块内容到dstFile + if (size > 0 && !dstFile.write(buffer.data(), size)) { + ... // 错误处理 + break; + } + + if (!srcFile) { + ... // 检查错误:当不是eof()时记录错误 + break; + } + } + // srcFile 和 dstFile 在退出作用域时会自动被关闭 + return true; +} +``` + +可以通过库函数简单实现的功能(如上例),需要避免调用命令处理器来执行外部命令。 +如果确实需要调用单个命令,应使用exec*函数来实现参数化调用,并对调用的命令实施白名单管理。同时应避免使用execlp、execvp、execvpe函数,因为这几个函数依赖外部的PATH环境变量。 +此时,外部输入的fileName仅作为some_tool命令的参数,没有命令注入的风险。 + +```cpp +pid_t pid; +char* const envp[] = {nullptr}; +... +std::string fileName = GetDirNameFromRemote(); +... +pid = fork(); +if (pid < 0) { + ... +} else if (pid == 0) { + // 使用some_tool对指定文件进行加工 + execle("/bin/some_tool", "some_tool", fileName.c_str(), nullptr, envp); + _Exit(-1); +} +... +int status; +waitpid(pid, &status, 0); +std::ofstream ofs(fileName, std::ios::in); +... +``` + +在必须使用system等命令解析器执行命令时,应对输入的命令字符串基于合理的白名单检查,避免命令注入。 + +```cpp +std::string cmd = GetCmdFromRemote(); + +// 使用白名单检查命令是否合法,仅允许"some_tool_a", "some_tool_b"命令,外部无法随意控制 +if (!IsValidCmd(cmd.c_str())) { + ... // 错误处理 +} +system(cmd.c_str()); +... +``` + +**【影响】** + +- 如果传递给system()、popen()或其他命令处理函数的命令字符串是外部可控的,则攻击者可能会以被攻击进程的权限执行系统上存在的任意命令。 +- 如果动态库文件是外部可控的,则攻击者可替换该库文件,在某些情况下可以造成任意代码执行漏洞。 + +# 其他C语言编程规范 + +## 禁止通过对数组类型的函数参数变量进行sizeof来获取数组大小 + +**【描述】** + +使用sizeof操作符求其操作数的大小(以字节为单位),其操作数可以是一个表达式或者加上括号的类型名称,例如:`sizeof(int)`或`sizeof(int *)`。 +参考C11标准6.5.3.4中的脚注103: + +> 当将sizeof应用于具有数组或函数类型的参数时,sizeof操作符将得出调整后的(指针)类型的大小。 + +函数参数列表中声明为数组的参数会被调整为相应类型的指针。例如:`void Func(int inArray[LEN])`函数参数列表中的inArray虽然被声明为数组,但是实际上会被调整为指向int类型的指针,即调整为`void Func(int *inArray)`。 +在这个函数内使用`sizeof(inArray)`等同于`sizeof(int *)`,得到的结果通常与预期不相符。例如:在IA-32架构上,`sizeof(inArray)` 的值是 4,并不是inArray数组的大小。 + +**【反例】** +如下代码示例中,函数ArrayInit的功能是初始化数组元素。该函数有一个声明为`int inArray[]`的参数,被调用时传递了一个长度为256的int类型数组data。 +ArrayInit函数实现中使用`sizeof(inArray) / sizeof(inArray[0])`方法来计算入参数组中元素的数量。 +但由于inArray是函数参数,所以具有指针类型,结果,`sizeof(inArray)`等同于`sizeof(int *)`。 +无论传递给ArrayInit函数的数组实际长度如何,表达式的`sizeof(inArray) / sizeof(inArray[0])`计算结果均为1,与预期不符。 + +```c +#define DATA_LEN 256 +void ArrayInit(int inArray[]) +{ + // 不符合:这里使用sizeof(inArray)计算数组大小 + for (size_t i = 0; i < sizeof(inArray) / sizeof(inArray[0]); i++) { + ... + } +} + +void FunctionData(void) +{ + int data[DATA_LEN]; + + ... + ArrayInit(data); // 调用ArrayInit函数初始化数组data数据 + ... +} +``` + +**【正例】** +如下代码示例中,修改函数定义,添加数组长度参数,并在调用处正确传入数组长度。 + +```c +#define DATA_LEN 256 +// 函数说明:入参len是入参inArray数组的长度 +void ArrayInit(int inArray[], size_t len) +{ + for (size_t i = 0; i < len; i++) { + ... + } +} + +void FunctionData(void) +{ + int data[DATA_LEN]; + + ArrayInit(data, sizeof(data) / sizeof(data[0])); + ... +} +``` + +**【反例】** +如下代码示例中,`sizeof(inArray)`不等于`ARRAY_MAX_LEN * sizeof(int)`,因为将sizeof操作符应用于声明为具有数组类型的参数时,即使参数声明指定了长度,也会被调整为指针,`sizeof(inArray)`等同于 `sizeof(int *)`: + +```c +#define ARRAY_MAX_LEN 256 + +void ArrayInit(int inArray[ARRAY_MAX_LEN]) +{ + // 不符合:sizeof(inArray),得到的长度是指针的大小,不是数组的长度,和预期不符。 + for (size_t i = 0; i < sizeof(inArray) / sizeof(inArray[0]); i++) { + ... + } +} + +int main(void) +{ + int masterArray[ARRAY_MAX_LEN]; + + ... + ArrayInit(masterArray); + + return 0; +} +``` + +**【正例】** +如下代码示例中,使用入参len表示指定数组的长度: + +```c +#define ARRAY_MAX_LEN 256 + +// 函数说明:入参len是入参数组的长度 +void ArrayInit(int inArray[], size_t len) +{ + for (size_t i = 0; i < len; i++) { + ... + } +} + +int main(void) +{ + int masterArray[ARRAY_MAX_LEN]; + + ArrayInit(masterArray, ARRAY_MAX_LEN); + ... + + return 0; +} +``` + +## 禁止通过对指针变量进行sizeof操作来获取数组大小 + +**描述】** +将指针当做数组进行sizeof操作时,会导致实际的执行结果与预期不符。例如:变量定义 `char *p = array`,其中array的定义为`char array[LEN]`,表达式`sizeof(p)`得到的结果与 `sizeof(char *)`相同,并非array的长度。 + +**【反例】** +如下代码示例中,buffer和path分别是指针和数组,程序员想对这2个内存进行清0操作,但由于程序员的疏忽,将内存大小误写成了`sizeof(buffer)`,与预期不符。 + +```c +char path[MAX_PATH]; +char *buffer = (char *)malloc(SIZE); +... + +... +memset(path, 0, sizeof(path)); + +// sizeof与预期不符,其结果为指针本身的大小而不是缓冲区大小 +memset(buffer, 0, sizeof(buffer)); +``` + +**【正例】** +如下代码示例中,将`sizeof(buffer)`修改为申请的缓冲区大小: + +```c +char path[MAX_PATH]; +char *buffer = (char *)malloc(SIZE); +... + +... +memset(path, 0, sizeof(path)); +memset(buffer, 0, SIZE); // 使用申请的缓冲区大小 +``` + +## 禁止直接使用外部数据拼接SQL命令 + +**【描述】** +SQL注入是指SQL查询被恶意更改成一个与程序预期完全不同的查询。执行更改后的查询可能会导致信息泄露或者数据被篡改。而SQL注入的根源就是使用外部数据来拼接SQL语句。C/C++语言中常见的使用外部数据拼接SQL语句的场景有(包括但不局限于): + +- 连接MySQL时调用mysql_query(),Execute()时的入参 +- 连接SQL Server时调用db-library驱动的dbsqlexec()的入参 +- 调用ODBC驱动的SQLprepare()连接数据库时的SQL语句的参数 +- C++程序调用OTL类库中的otl_stream(),otl_column_desc()时的入参 +- C++程序连接Oracle数据库时调用ExecuteWithResSQL()的入参 + +防止SQL注入的方法主要有以下几种: + +- 参数化查询(通常也叫作预处理语句):参数化查询是一种简单有效的防止SQL注入的查询方式,应该被优先考虑使用。支持的数据库有MySQL,Oracle(OCI)。 +- 参数化查询(通过ODBC驱动):支持ODBC驱动参数化查询的数据库有Oracle、SQLServer、PostgreSQL和GaussDB。 +- 对外部数据进行校验(对于每个引入的外部数据推荐“白名单”校验)。 +- 对外部数据中的SQL特殊字符进行转义。 + +**【反例】** +下列代码拼接用户输入,没有进行输入检查,存在SQL注入风险: + +```c +char name[NAME_MAX]; +char sqlStatements[SQL_CMD_MAX]; +int ret = GetUserInput(name, NAME_MAX); +... +ret = sprintf(sqlStatements, + "SELECT childinfo FROM children WHERE name= ‘%s’", + name); +... +ret = mysql_query(&myConnection, sqlStatements); +... +``` + +**【正例】** +使用预处理语句进行参数化查询可以防御SQL注入攻击: + +```c +char name[NAME_MAX]; +... +MYSQL_STMT *stmt = mysql_stmt_init(myConnection); +char *query = "SELECT childinfo FROM children WHERE name= ?"; +if (mysql_stmt_prepare(stmt, query, strlen(query))) { + ... +} +int ret = GetUserInput(name, NAME_MAX); +... +MYSQL_BIND params[1]; +(void)memset(params, 0, sizeof(params)); +... +params[0].bufferType = MYSQL_TYPE_STRING; +params[0].buffer = (char *)name; +params[0].bufferLength = strlen(name); +params[0].isNull = 0; + +bool isCompleted = mysql_stmt_bind_param(stmt, params); +... +ret = mysql_stmt_execute(stmt); +... +``` + +**【影响】** + +如果拼接SQL语句的字符串是外部可控的,则攻击者可以通过注入特定的字符串欺骗程序执行恶意的SQL命令,造成信息泄露、权限绕过、数据被篡改等问题。 + +## 内存中的敏感信息使用完毕后立即清0 + +**【描述】** +内存中的口令、密钥等敏感信息使用完毕后立即清0,避免被攻击者获取或者无意间泄露给低权限用户。这里所说的内存包括但不限于: + +- 动态分配的内存 +- 静态分配的内存 +- 自动分配(堆栈)内存 +- 内存缓存 +- 磁盘缓存 + +**【反例】** +通常内存在释放前不需要清除内存数据,因为这样在运行时会增加额外开销,所以在这段内存被释放之后,之前的数据还是会保留在其中。如果这段内存中的数据包含敏感信息,则可能会意外泄露敏感信息。为了防止敏感信息泄露,必须先清除内存中的敏感信息,然后再释放。 +在如下代码示例中,存储在所引用的动态内存中的敏感信息secret被复制到新动态分配的缓冲区newSecret,最终通过free()释放。因为释放前未清除这块内存数据,这块内存可能被重新分配到程序的另一部分,之前存储在newSecret中的敏感信息可能会无意中被泄露。 + +```c +char *secret = NULL; +/* + * 假设 secret 指向敏感信息,敏感信息的内容是长度小于SIZE_MAX个字符, + * 并且以null终止的字节字符串 + */ + +size_t size = strlen(secret); +char *newSecret = NULL; +newSecret = (char *)malloc(size + 1); +if (newSecret == NULL) { + ... // 错误处理 +} else { + errno_t ret = strcpy(newSecret, secret); + ... // 处理 ret + + ... // 处理 newSecret... + + free(newSecret); + newSecret = NULL; +} +... +``` + +**【正例】** +如下代码示例中,为了防止信息泄露,应先清除包含敏感信息的动态内存(用’\0’字符填充空间),然后再释放它。 + +```c +char *secret = NULL; +/* + * 假设 secret 指向敏感信息,敏感信息的内容是长度小于SIZE_MAX个字符, + * 并且以null终止的字节字符串 + */ +size_t size = strlen(secret); +char *newSecret = NULL; +newSecret = (char *)malloc(size + 1); +if (newSecret == NULL) { + ... // 错误处理 +} else { + errno_t ret = strcpy(newSecret, secret); + ... // 处理 ret + + ... // 处理 newSecret... + + (void)memset(newSecret, 0, size + 1); + free(newSecret); + newSecret = NULL; +} +... +``` + +**【正例】** +下面是另外一个涉及敏感信息清理的场景,在代码获取到密码后,将密码保存到password中,进行密码验证,使用完毕后,通过`memset()`函数对password清0。 + +```c +int Foo(void) +{ + char password[MAX_PWD_LEN]; + if (!GetPassword(password, sizeof(password))) { + ... + } + if (!VerifyPassword(password)) { + ... + } + ... + (void)memset(password, 0, sizeof(password)); + ... +} +``` + +要特别**注意**:对敏感信息清理的时候要同时防止因编译器优化而使清理代码无效。 + +例如,下列代码使用了可能被编译器优化掉的语句。 + +```c +int SecureLogin(void) +{ + char pwd[PWD_SIZE]; + if (RetrievePassword(pwd, sizeof(pwd))) { + ... // 口令检查及其他处理 + } + memset(pwd, 0, sizeof(pwd)); // 编译器优化有可能会使该语句失效 + ... +} +``` + +某些编译器在优化时候不会执行它认为不会改变程序执行结果的代码,因此memset()操作会被优化掉。 + +如果编译器支持#pragma指令,那么可以使用该指令指示编译器不作优化。 + +```c +void SecureLogin(void) +{ + char pwd[PWD_SIZE]; + if (RetrievePassword(pwd, sizeof(pwd))) { + ... // 口令检查及其他处理 + } + #pragma optimize("", off) + // 清除内存 + ... + #pragma optimize("", on) + ... +} +``` + +**【影响】** + +未及时清理敏感信息,可能导致信息泄露。 + +## 创建文件时必须显式指定合适的文件访问权限 + +**【描述】** +创建文件时,如果不显式指定合适访问权限,可能会让未经授权的用户访问该文件,造成信息泄露,文件数据被篡改,文件中被注入恶意代码等风险。 + +虽然文件的访问权限也依赖于文件系统,但是当前许多文件创建函数(例如POSIX open函数)都具有设置(或影响)文件访问权限的功能,所以当使用这些函数创建文件时,必须显式指定合适的文件访问权限,以防止意外访问。 + +**【反例】** +使用POSIX open()函数创建文件但未显示指定该文件的访问权限,可能会导致文件创建时具有过高的访问权限。这可能会导致漏洞(例如CVE-2006-1174)。 + +```c +void Foo(void) +{ + int fd = -1; + char *filename = NULL; + + ... // 初始化 filename + + fd = open(filename, O_CREAT | O_WRONLY); // 没有显式指定访问权限 + if (fd == -1) { + ... // 错误处理 + } + ... +} +``` + +**【正例】** +应该在open的第三个参数中显式指定新创建文件的访问权限。可以根据文件实际的应用情况设置何种访问权限。 + +```c +void Foo(void) +{ + int fd = -1; + char *filename = NULL; + + ... // 初始化 filename 和指定其访问权限 + + // 此处根据文件实际需要,显式指定其访问权限 + int fd = open(filename, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); + if (fd == -1) { + ... // 错误处理 + } + ... +} +``` + +**【影响】** + +创建访问权限弱的文件,可能会导致对这些文件的非法访问。 + +## 使用文件路径前必须进行规范化并校验 + +**【描述】** +当文件路径来自外部数据时,必须对其做合法性校验,如果不校验,可能造成系统文件的被任意访问。但是禁止直接对其进行校验,正确做法是在校验之前必须对其进行路径规范化处理。这是因为同一个文件可以通过多种形式的路径来描述和引用,例如既可以是绝对路径,也可以是相对路径;而且路径名、目录名和文件名可能包含使校验变得困难和不准确的字符(如:“.”、“..”)。此外,文件还可以是符号链接,这进一步模糊了文件的实际位置或标识,增加了校验的难度和校验准确性。所以必须先将文件路径规范化,从而更容易校验其路径、目录或文件名,增加校验准确性。 + +因为规范化机制在不同的操作系统和文件系统之间可能有所不同,所以最好使用符合当前系统特性的规范化机制。 + +一个简单的案例说明如下: + +```c +当文件路径来自外部数据时,需要先将文件路径规范化,如果没有作规范化处理,攻击者就有机会通过恶意构造文件路径进行文件的越权访问。 +例如,攻击者可以构造“../../../etc/passwd”的方式进行任意文件访问。 +``` + +**【反例】** +在此错误的示例中,inputFilename包含一个源于受污染源的文件名,并且该文件名已打开以进行写入。在使用此文件名操作之前,应该对其进行验证,以确保它引用的是预期的有效文件。 +不幸的是,inputFilename引用的文件名可能包含特殊字符,例如目录字符,这使验证变得困难,甚至不可能。而且,inputFilename中可能包含可以指向任意文件路径的符号链接,即使该文件名通过了验证,也会导致该文件名是无效的。 +这种场景下,对文件名的直接验证即使被执行也是得不到预期的结果,对fopen()的调用可能会导致访问一个意外的文件。 + +```c +... + +if (!verify_file(inputFilename) { // 没有对inputFilename做规范化,直接做校验 + ... // 错误处理 +} + +if (fopen(inputFilename, "w") == NULL) { + ... // 错误处理 +} + +... +``` + +**【正例】** +规范化文件名是具有一定难度的,因为这需要了解底层文件系统。 +POSIX realpath()函数可以帮助将路径名转换为规范形式。参考信息技术标准-POSIX®,基本规范第7期[IEEE std 1003.1:2013]: + +- 该realpath()函数应从所指向的路径名派生一个filename的绝对路径名,两者指向同一文件,绝对路径其文件名不涉及“ .”,“ ..”或符号链接。 + 在规范化路径之后,还必须执行进一步的验证,例如确保两个连续的斜杠或特殊文件不会出现在文件名中。有关如何执行路径名解析的更多详细信息,请参见[IEEE Std 1003.1: 2013]第4.12节“路径名解析”。 + 使用realpath()函数有许多需要注意的地方。 + 在了解了以上原理之后,对上面的错误代码示例,我们采用如下解决方案: + +```c +char *realpathRes = NULL; + +... + +// 在校验之前,先对inputFilename做规范化处理 +realpathRes = realpath(inputFilename, NULL); +if (realpathRes == NULL) { + ... // 规范化的错误处理 +} + +// 规范化以后对路径进行校验 +if (!verify_file(realpathRes) { + ... // 校验的错误处理 +} + +// 使用 +if (fopen(realpathRes, "w") == NULL) { + ... // 实际操作的错误处理 +} + +... + +free(realpathRes); +realpathRes = NULL; +... +``` + +**【正例】** +根据我们的实际场景,我们还可以采用的第二套解决方案,说明如下: +如果`PATH_MAX`被定义为 limits.h 中的一个常量,那么使用非空的`resolved_path`调用realpath()也是安全的。 +在本例中realpath()函数期望`resolved_path`引用一个字符数组,该字符数组足够大,可以容纳规范化的路径。 +如果定义了PATH_MAX,则分配一个大小为`PATH_MAX`的缓冲区来保存realpath()的结果。正确代码示例如下: + +```c +char *realpathRes = NULL; +char *canonicalFilename = NULL; +size_t pathSize = 0; + +... + +pathSize = (size_t)PATH_MAX; + +if (VerifyPathSize(pathSize) == true) { + canonicalFilename = (char *)malloc(pathSize); + + if (canonicalFilename == NULL) { + ... // 错误处理 + } + + realpathRes = realpath(inputFilename, canonicalFilename); +} + +if (realpathRes == NULL) { + ... // 错误处理 +} + +if (VerifyFile(realpathRes) == false) { + ... // 错误处理 +} + +if (fopen(realpathRes, "w") == NULL ) { + ... // 错误处理 +} + +... + +free(canonicalFilename); +canonicalFilename = NULL; +... +``` + +**【反例】** +下面的代码场景是从外部获取到文件名称,拼接成文件路径后,直接对文件内容进行读取,导致攻击者可以读取到任意文件的内容: + +```c +char *filename = GetMsgFromRemote(); +... +int ret = sprintf(untrustPath, "/tmp/%s", filename); +... +char *text = ReadFileContent(untrustPath); +``` + +**【正例】** +正确的做法是,对路径进行规范化后,再判断路径是否是本程序所认为的合法的路径: + +```c +char *filename = GetMsgFromRemote(); +... +sprintf(untrustPath, "/tmp/%s", filename); +char path[PATH_MAX]; +if (realpath(untrustPath, path) == NULL) { + ... // 处理错误 +} +if (!IsValidPath(path)) { // 检查文件的位置是否正确 + ... // 处理错误 +} +char *text = ReadFileContent(path); +``` + +**【例外】** + +运行于控制台的命令行程序,通过控制台手工输入文件路径,可以作为本条款例外。 + +```c +int main(int argc, char **argv) +{ + int fd = -1; + + if (argc == 2) { + fd = open(argv[1], O_RDONLY); + ... + } + + ... + return 0; +} +``` + +**【影响】** + +未对不可信的文件路径进行规范化和校验,可能造成对任意文件的访问。 + +## 不要在共享目录中创建临时文件 + +**【描述】** +共享目录是指其它非特权用户可以访问的目录。程序的临时文件应当是程序自身独享的,任何将自身临时文件置于共享目录的做法,将导致其他共享用户获得该程序的额外信息,产生信息泄露。因此,不要在任何共享目录创建仅由程序自身使用的临时文件。 + +临时文件通常用于辅助保存不能驻留在内存中的数据或存储临时的数据,也可用作进程间通信的一种手段(通过文件系统传输数据)。例如,一个进程在共享目录中创建一个临时文件,该文件名可能使用了众所周知的名称或者一个临时的名称,然后就可以通过该文件在进程间共享信息。这种通过在共享目录中创建临时文件的方法实现进程间共享的做法很危险,因为共享目录中的这些文件很容易被攻击者劫持或操纵。这里有几种缓解策略: + +1. 使用其他低级IPC(进程间通信)机制,例如套接字或共享内存。 +2. 使用更高级别的IPC机制,例如远程过程调用。 +3. 使用仅能由程序本身访问的安全目录(多线程/进程下注意防止条件竞争)。 + +同时,下面列出了几项临时文件创建使用的方法,产品根据具体场景执行以下一项或者几项,同时产品也可以自定义合适的方法。 + +1. 文件必须具有合适的权限,只有符合权限的用户才能访问 +2. 创建的文件名是唯一的、或不可预测的 +3. 仅当文件不存在时才创建打开(原子创建打开) +4. 使用独占访问打开,避免竞争条件 +5. 在程序退出之前移除 + +同时也需要注意到,当某个目录被开放读/写权限给多个用户或者一组用户时,该共享目录潜在的安全风险远远大于访问该目录中临时文件这个功能的本身。 + +在共享目录中创建临时文件很容易受到威胁。例如,用于本地挂载的文件系统的代码在与远程挂载的文件系统一起共享使用时可能会受到攻击。安全的解决方案是不要在共享目录中创建临时文件。 + +**【反例】** +如下代码示例,程序在系统的共享目录/tmp下创建临时文件来保存临时数据,且文件名是硬编码的。 +由于文件名是硬编码的,因此是可预测的,攻击者只需用符号链接替换文件,然后链接所引用的目标文件就会被打开并写入新内容。 + +```c +void ProcData(const char *filename) +{ + FILE *fp = fopen(filename, "wb+"); + if (fp == NULL) { + ... // 错误处理 + } + + ... // 写文件 + + fclose(fp); +} + +int main(void) +{ + // 不符合:1.在系统共享目录中创建临时文件;2.临时文件名硬编码 + char *pFile = "/tmp/data"; + ... + + ProcData(pFile); + + ... + return 0; +} +``` + +**【正确案例】** + +```c +不应在该目录下创建仅由程序自身使用的临时文件。 +``` + +**【影响】** + +不安全的创建临时文件,可能导致文件非法访问,并造成本地系统上的权限提升。 + +## 不要在信号处理函数中访问共享对象 + +**【描述】** +如果在信号处理程序中访问和修改共享对象,可能会造成竞争条件,使数据处于不确定的状态。 +这条规则有两个不适用的场景(参考C11标准5.1.2.3第5段): + +- 读写不需要加锁的原子对象; +- 读写volatile sig_atomic_t类型的对象,因为具有volatile sig_atomic_t类型的对象即使在出现异步中断的时候也可以作为一个原子实体访问,是异步安全的。 + +**【反例】** +在这个信号处理过程中,程序打算将`g_msg`作为共享对象,当产生SIGINT信号时更新共享对象的内容,但是该`g_msg`变量类型不是`volatile sig_atomic_t`,所以不是异步安全的。 + +```c +#define MAX_MSG_SIZE 32 +static char g_msgBuf[MAX_MSG_SIZE] = {0}; +static char *g_msg = g_msgBuf; + +void SignalHandler(int signum) +{ + // 下面代码操作g_msg不合规,因为不是异步安全的 + (void)memset(g_msg,0, MAX_MSG_SIZE); + errno_t ret = strcpy(g_msg, "signal SIGINT received."); + ... // 处理 ret +} + +int main(void) +{ + errno_t ret = strcpy(g_msg, "No msg yet."); // 初始化消息内容 + ... // 处理 ret + + signal(SIGINT, SignalHandler); // 设置SIGINT信号对应的处理函数 + + ... // 程序主循环代码 + + return 0; +} +``` + +**【正例】** +如下代码示例中,在信号处理函数中仅将`volatile sig_atomic_t`类型作为共享对象使用。 + +```c +#define MAX_MSG_SIZE 32 +volatile sig_atomic_t g_sigFlag = 0; + +void SignalHandler(int signum) +{ + g_sigFlag = 1; // 符合 +} + +int main(void) +{ + signal(SIGINT, SignalHandler); + char msgBuf[MAX_MSG_SIZE]; + errno_t ret = strcpy(msgBuf, "No msg yet."); // 初始化消息内容 + ... // 处理 ret + + ... // 程序主循环代码 + + if (g_sigFlag == 1) { // 在退出主循环之后,根据g_sigFlag状态再刷新消息内容 + ret = strcpy(msgBuf, "signal SIGINT received."); + ... // 处理 ret + } + + return 0; +} +``` + +**【影响】** + +在信号处理程序中访问或修改共享对象,可能造成以不一致的状态访问数据。 + +## 禁用rand函数产生用于安全用途的伪随机数 + +**【描述】** +C语言标准库rand()函数生成的是伪随机数,所以不能保证其产生的随机数序列质量。根据C11标准,rand()函数产生的随机数范围是`[0, RAND_MAX(0x7FFF)]`,因为范围相对较短,所以这些数字可以被预测。 +所以禁止使用rand()函数产生的随机数用于安全用途,必须使用安全的随机数产生方式。 + +典型的安全用途场景包括(但不限于)以下几种: + +- 会话标识SessionID的生成; +- 挑战算法中的随机数生成; +- 验证码的随机数生成; +- 用于密码算法用途(例如用于生成IV、盐值、密钥等)的随机数生成。 + +**【反例】** +程序员期望生成一个唯一的不可被猜测的HTTP会话ID,但该ID是通过调用rand()函数产生的数字随机数,它的ID是可猜测的,并且随机性有限。 + +**【影响】** + +使用rand()函数可能造成可预测的随机数。 + +## 禁止在发布版本中输出对象或函数的地址 + +**【描述】** +禁止在发布版本中输出对象或函数的地址,如:将变量或函数的地址输出到客户端、日志、串口中。 + +当攻击者实施高级攻击时,通常需要先获取目标程序中的内存地址(如变量地址、函数地址等),再通过修改指定内存的内容,达到攻击目的。 +如果程序中主动输出对象或函数的地址,则为攻击者提供了便利条件,可以根据这些地址以及偏移量计算出其他对象或函数的地址,并实施攻击。 +另外,由于内存地址泄露,也会造成地址空间随机化的保护功能失效。 + +**【反例】** +如下代码中,使用%p格式将指针指向的地址记录到日志中。 + +```c +int Encode(unsigned char *in, size_t inSize, unsigned char *out, size_t maxSize) +{ + ... + Log("in=%p, in size=%zu, out=%p, max size=%zu\n", in, inSize, out, maxSize); + ... +} +``` + +备注:这里仅用%p打印指针作为示例,代码中将指针转换为整数再打印也存在同样的风险。 + +**【正例】** +如下代码中,删除打印地址的代码。 + +```c +int Encode(unsigned char *in, size_t inSize, unsigned char *out, size_t maxSize) +{ + ... + Log("in size=%zu, max size=%zu\n", inSize, maxSize); + ... +} +``` + +**【例外】** +当程序崩溃退出时,在记录崩溃的异常信息中可以输出内存地址等信息。 + +**【影响】** + +内存地址信息泄露,为攻击者实施攻击提供有利信息,可能造成地址空间随机化防护失效。 + +## 禁止代码中包含公网地址 + +**【描述】** + +代码或脚本中包含用户不可见,不可知的公网地址,可能会引起客户质疑。 + +对产品发布的软件(包含软件包/补丁包)中包含的公网地址(包括公网IP地址、公网URL地址/域名、邮箱地址)要求如下: +1、禁止包含用户界面不可见、或产品资料未描述的未公开的公网地址。 +2、已公开的公网地址禁止写在代码或者脚本中,可以存储在配置文件或数据库中。 + +对于开源/第三方软件自带的公网地址必须至少满足上述第1条公开性要求。 + +**【例外】** + +- 对于标准协议中必须指定公网地址的场景可例外,如soap协议中函数的命名空间必须指定的一个组装的公网URL、http页面中包含w3.org网址等。 + +# 内核安全编程 + +## 内核mmap接口实现中,确保对映射起始地址和大小进行合法性校验 + +**【描述】** + +**说明:**内核 mmap接口中,经常使用remap_pfn_range()函数将设备物理内存映射到用户进程空间。如果映射起始地址等参数由用户态控制并缺少合法性校验,将导致用户态可通过映射读写任意内核地址。如果攻击者精心构造传入参数,甚至可在内核中执行任意代码。 + +**【错误代码示例】** + +如下代码在使用remap_pfn_range()进行内存映射时,未对用户可控的映射起始地址和空间大小进行合法性校验,可导致内核崩溃或任意代码执行。 + +```c +static int incorrect_mmap(struct file *file, struct vm_area_struct *vma) +{ + unsigned long size; + size = vma->vm_end - vma->vm_start; + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + //错误:未对映射起始地址、空间大小做合法性校验 + if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, size, vma->vm_page_prot)) { + err_log("%s, remap_pfn_range fail", __func__); + return EFAULT; + } else { + vma->vm_flags &= ~VM_IO; + } + + return EOK; +} +``` + +**【正确代码示例】** + +增加对映射起始地址等参数的合法性校验。 + +```c +static int correct_mmap(struct file *file, struct vm_area_struct *vma) +{ + unsigned long size; + size = vma->vm_end - vma->vm_start; + //修改:添加校验函数,验证映射起始地址、空间大小是否合法 + if (!valid_mmap_phys_addr_range(vma->vm_pgoff, size)) { + return EINVAL; + } + + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, size, vma->vm_page_prot)) { + err_log( "%s, remap_pfn_range fail ", __func__); + return EFAULT; + } else { + vma->vm_flags &= ~VM_IO; + } + + return EOK; +} +``` + +## 内核程序中必须使用内核专用函数读写用户态缓冲区 + +**【描述】** + +用户态与内核态之间进行数据交换时,如果在内核中不加任何校验(如校验地址范围、空指针)而直接引用用户态传入指针,当用户态传入非法指针时,可导致内核崩溃、任意地址读写等问题。因此,应当禁止使用memcpy()、sprintf()等危险函数,而是使用内核提供的专用函数:copy_from_user()、copy_to_user()、put_user()和get_user()来读写用户态缓冲区,这些函数内部添加了入参校验功能。 + +所有禁用函数列表为:memcpy()、bcopy()、memmove()、strcpy()、strncpy()、strcat()、strncat()、sprintf()、vsprintf()、snprintf()、vsnprintf()、sscanf()、vsscanf()。 + +**【错误代码示例】** + +内核态直接使用用户态传入的buf指针作为snprintf()的参数,当buf为NULL时,可导致内核崩溃。 + +```c +ssize_t incorrect_show(struct file *file, char__user *buf, size_t size, loff_t *data) +{ + // 错误:直接引用用户态传入指针,如果buf为NULL,则空指针异常导致内核崩溃 + return snprintf(buf, size, "%ld\n", debug_level); +} +``` + +**【正确代码示例】** + +使用copy_to_user()函数代替snprintf()。 + +```c +ssize_t correct_show(struct file *file, char __user *buf, size_t size, loff_t *data) +{ + int ret = 0; + char level_str[MAX_STR_LEN] = {0}; + snprintf(level_str, MAX_STR_LEN, "%ld \n", debug_level); + if(strlen(level_str) >= size) { + return EFAULT; + } + + // 修改:使用专用函数copy_to_user()将数据写入到用户态buf,并注意防止缓冲区溢出 + ret = copy_to_user(buf, level_str, strlen(level_str)+1); + return ret; +} +``` + +**【错误代码示例】** + +内核态直接使用用户态传入的指针user_buf作为数据源进行memcpy()操作,当user_buf为NULL时,可导致内核崩溃。 + +```c +size_t incorrect_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) +{ + ... + char buf [128] = {0}; + int buf_size = 0; + buf_size = min(count, (sizeof(buf)-1)); + // 错误:直接引用用户态传入指针,如果user_buf为NULL,则可导致内核崩溃 + (void)memcpy(buf, user_buf, buf_size); + ... +} +``` + +**【正确代码示例】** + +使用copy_from_user()函数代替memcpy()。 + +```c +ssize_t correct_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) +{ + ... + char buf[128] = {0}; + int buf_size = 0; + + buf_size = min(count, (sizeof(buf)-1)); + // 修改:使用专用函数copy_from_user()将数据写入到内核态buf,并注意防止缓冲区溢出 + if (copy_from_user(buf, user_buf, buf_size)) { + return EFAULT; + } + + ... +} +``` + +## 必须对copy_from_user()拷贝长度进行校验,防止缓冲区溢出 + +**说明:**内核态从用户态拷贝数据时通常使用copy_from_user()函数,如果未对拷贝长度做校验或者校验不当,会造成内核缓冲区溢出,导致内核panic或提权。 + +**【错误代码示例】** + +未校验拷贝长度。 + +```c +static long gser_ioctl(struct file *fp, unsigned cmd, unsigned long arg) +{ + char smd_write_buf[GSERIAL_BUF_LEN]; + switch (cmd) + { + case GSERIAL_SMD_WRITE: + if (copy_from_user(&smd_write_arg, argp, sizeof(smd_write_arg))) {...} + // 错误:拷贝长度参数smd_write_arg.size由用户输入,未校验 + copy_from_user(smd_write_buf, smd_write_arg.buf, smd_write_arg.size); + ... + } +} +``` + +**【正确代码示例】** + +添加长度校验。 + +```c +static long gser_ioctl(struct file *fp, unsigned cmd, unsigned long arg) +{ + char smd_write_buf[GSERIAL_BUF_LEN]; + switch (cmd) + { + case GSERIAL_SMD_WRITE: + if (copy_from_user(&smd_write_arg, argp, sizeof(smd_write_arg))){...} + // 修改:添加校验 + if (smd_write_arg.size >= GSERIAL_BUF_LEN) {......} + copy_from_user(smd_write_buf, smd_write_arg.buf, smd_write_arg.size); + ... + } +} +``` + +## 必须对copy_to_user()拷贝的数据进行初始化,防止信息泄漏 + +**【描述】** + +**说明:**内核态使用copy_to_user()向用户态拷贝数据时,当数据未完全初始化(如结构体成员未赋值、字节对齐引起的内存空洞等),会导致栈上指针等敏感信息泄漏。攻击者可利用绕过kaslr等安全机制。 + +**【错误代码示例】** + +未完全初始化数据结构成员。 + +```c +static long rmnet_ctrl_ioctl(struct file *fp, unsigned cmd, unsigned long arg) +{ + struct ep_info info; + switch (cmd) { + case FRMNET_CTRL_EP_LOOKUP: + info.ph_ep_info.ep_type = DATA_EP_TYPE_HSUSB; + info.ipa_ep_pair.cons_pipe_num = port->ipa_cons_idx; + info.ipa_ep_pair.prod_pipe_num = port->ipa_prod_idx; + // 错误: info结构体有4个成员,未全部赋值 + ret = copy_to_user((void __user *)arg, &info, sizeof(info)); + ... + } +} +``` + +**【正确代码示例】** + +全部进行初始化。 + +```c +static long rmnet_ctrl_ioctl(struct file *fp, unsigned cmd, unsigned long arg) +{ + struct ep_info info; + // 修改:使用memset初始化缓冲区,保证不存在因字节对齐或未赋值导致的内存空洞 + (void)memset(&info, '0', sizeof(ep_info)); + switch (cmd) { + case FRMNET_CTRL_EP_LOOKUP: + info.ph_ep_info.ep_type = DATA_EP_TYPE_HSUSB; + info.ipa_ep_pair.cons_pipe_num = port->ipa_cons_idx; + info.ipa_ep_pair.prod_pipe_num = port->ipa_prod_idx; + ret = copy_to_user((void __user *)arg, &info, sizeof(info)); + ... + } +} +``` + +## 禁止在异常处理中使用BUG_ON宏,避免造成内核panic + +**【描述】** + +BUG_ON宏会调用内核的panic()函数,打印错误信息并主动崩溃系统,在正常逻辑处理中(如ioctl接口的cmd参数不识别)不应当使系统崩溃,禁止在此类异常处理场景中使用BUG_ON宏,推荐使用WARN_ON宏。 + +**【错误代码示例】** + +正常流程中使用了BUG_ON宏 + +```c +/ * 判断Q6侧设置定时器是否繁忙,1-忙,0-不忙 */ +static unsigned int is_modem_set_timer_busy(special_timer *smem_ptr) +{ + int i = 0; + if (smem_ptr == NULL) { + printk(KERN_EMERG"%s:smem_ptr NULL!\n", __FUNCTION__); + // 错误:系统BUG_ON宏打印调用栈后调用panic(),导致内核拒绝服务,不应在正常流程中使用 + BUG_ON(1); + return 1; + } + + ... +} +``` + +**【正确代码示例】** + +去掉BUG_ON宏。 + +```c +/ * 判断Q6侧设置定时器是否繁忙,1-忙,0-不忙 */ +static unsigned int is_modem_set_timer_busy(special_timer *smem_ptr) +{ + int i = 0; + if (smem_ptr == NULL) { + printk(KERN_EMERG"%s:smem_ptr NULL!\n", __FUNCTION__); + // 修改:去掉BUG_ON调用,或使用WARN_ON + return 1; + } + + ... +} +``` + +## 在中断处理程序或持有自旋锁的进程上下文代码中,禁止使用会引起进程休眠的函数 + +**【描述】** + +系统以进程为调度单位,在中断上下文中,只有更高优先级的中断才能将其打断,系统在中断处理的时候不能进行进程调度。如果中断处理程序处于休眠状态,就会导致内核无法唤醒,从而使得内核处于瘫痪。 + +自旋锁在使用时,抢占是失效的。若自旋锁在锁住以后进入睡眠,由于不能进行处理器抢占,其它进程都将因为不能获得CPU(单核CPU)而停止运行,对外表现为系统将不作任何响应,出现挂死。 + +因此,在中断处理程序或持有自旋锁的进程上下文代码中,应该禁止使用可能会引起休眠(如vmalloc()、msleep()等)、阻塞(如copy_from_user(),copy_to_user()等)或者耗费大量时间(如printk()等)的函数。 + +## 合理使用内核栈,防止内核栈溢出 + +**【描述】** + +内核栈大小是固定的(一般32位系统为8K,64位系统为16K,因此资源非常宝贵。不合理的使用内核栈,可能会导致栈溢出,造成系统挂死。因此需要做到以下几点: + +- 在栈上申请内存空间不要超过内核栈大小; +- 注意函数的嵌套使用次数; +- 不要定义过多的变量。 + +**【错误代码示例】** + +以下代码中定义的变量过大,导致栈溢出。 + +```c +... +struct result +{ + char name[4]; + unsigned int a; + unsigned int b; + unsigned int c; + unsigned int d; +}; // 结构体result的大小为20字节 + +int foo() +{ + struct result temp[512]; + // 错误: temp数组含有512个元素,总大小为10K,远超内核栈大小 + (void)memset(temp, 0, sizeof(result) * 512); + ... // use temp do something + return 0; +} + +... +``` + +代码中数组temp有512个元素,总共10K大小,远超内核的8K,明显的栈溢出。 + +**【正确代码示例】** + +使用kmalloc()代替之。 + +```c +... +struct result +{ + char name[4]; + unsigned int a; + unsigned int b; + unsigned int c; + unsigned int d; +}; // 结构体result的大小为20字节 + +int foo() +{ + struct result *temp = NULL; + temp = (result *)kmalloc(sizeof(result) * 512, GFP_KERNEL); //修改:使用kmalloc()申请内存 + ... // check temp is not NULL + (void)memset(temp, 0, sizeof(result) * 512); + ... // use temp do something + ... // free temp + return 0; +} +... +``` + +## 临时关闭地址校验机制后,在操作完成后必须及时恢复 + +**【描述】** + +SMEP安全机制是指禁止内核执行用户空间的代码(PXN是ARM版本的SMEP)。系统调用(如open(),write()等)本来是提供给用户空间程序访问的。默认情况下,这些函数会对传入的参数地址进行校验,如果入参是非用户空间地址则报错。因此,要在内核程序中使用这些系统调用,就必须使参数地址校验功能失效。set_fs()/get_fs()就用来解决该问题。详细说明见如下代码: + +```c +... +mmegment_t old_fs; +printk("Hello, I'm the module that intends to write message to file.\n"); +if (file == NULL) { + file = filp_open(MY_FILE, O_RDWR | O_APPEND | O_CREAT, 0664); +} + +if (IS_ERR(file)) { + printk("Error occured while opening file %s, exiting ...\n", MY_FILE); + return 0; +} + +sprintf(buf, "%s", "The Message."); +old_fs = get_fs(); // get_fs()的作用是获取用户空间地址上限值 + // #define get_fs() (current->addr_limit +set_fs(KERNEL_DS); // set_fs的作用是将地址空间上限扩大到KERNEL_DS,这样内核代码可以调用系统函数 +file->f_op->write(file, (char *)buf, sizeof(buf), &file->f_pos); // 内核代码可以调用write()函数 +set_fs(old_fs); // 使用完后及时恢复原来用户空间地址限制值 +... +``` + +通过上述代码,可以了解到最为关键的就是操作完成后,要及时恢复地址校验功能。否则SMEP/PXN安全机制就会失效,使得许多漏洞的利用变得很容易。 + +**【错误代码示例】** + +在程序错误处理分支,未通过set_fs()恢复地址校验功能。 + +```c +... +oldfs = get_fs(); +set_fs(KERNEL_DS); +/* 在时间戳目录下面创建done文件 */ +fd = sys_open(path, O_CREAT | O_WRONLY, FILE_LIMIT); +if (fd < 0) { + BB_PRINT_ERR("sys_mkdir[%s] error, fd is[%d]\n", path, fd); + return; // 错误:在错误处理程序分支未恢复地址校验机制 +} + +sys_close(fd); +set_fs(oldfs); +... +``` + +**【正确代码示例】** + +在错误处理程序中恢复地址校验功能。 + +```c +... +oldfs = get_fs(); +set_fs(KERNEL_DS); + +/* 在时间戳目录下面创建done文件 */ +fd = sys_open(path, O_CREAT | O_WRONLY, FILE_LIMIT); +if (fd < 0) { + BB_PRINT_ERR("sys_mkdir[%s] error, fd is[%d] \n", path, fd); + set_fs(oldfs); // 修改:在错误处理程序分支中恢复地址校验机制 + return; +} + +sys_close(fd); +set_fs(oldfs); +... +``` + diff --git a/website/docs/_posts/contribute/OpenHarmony-cpp-coding-style-guide.md b/website/docs/_posts/contribute/OpenHarmony-cpp-coding-style-guide.md new file mode 100644 index 0000000000000000000000000000000000000000..9509d8f8fd562fd0701d02ff46040a2fce657b89 --- /dev/null +++ b/website/docs/_posts/contribute/OpenHarmony-cpp-coding-style-guide.md @@ -0,0 +1,2913 @@ +--- +title: OpenHarmony-cpp-coding-style-guide.md +permalink: /pages/extra/8b4362/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# C++语言编程规范 + +## 目的 +规则并不是完美的,通过禁止在特定情况下有用的特性,可能会对代码实现造成影响。但是我们制定规则的目的“为了大多数程序员可以得到更多的好处”, 如果在团队运作中认为某个规则无法遵循,希望可以共同改进该规则。 +参考该规范之前,希望您具有相应的C++语言基础能力,而不是通过该文档来学习C++语言。 +1. 了解C++语言的ISO标准; +2. 熟知C++语言的基本语言特性,包括C++ 03/11/14/17相关特性; +3. 了解C++语言的标准库; + +## 总体原则 +代码需要在保证功能正确的前提下,满足**可读、可维护、安全、可靠、可测试、高效、可移植**的特征要求。 + +## 重点关注 +1. 约定C++语言的编程风格,比如命名,排版等。 +2. C++语言的模块化设计,如何设计头文件,类,接口和函数。 +3. C++语言相关特性的优秀实践,比如常量,类型转换,资源管理,模板等。 +4. 现代C++语言的优秀实践,包括C++11/14/17中可以提高代码可维护性,提高代码可靠性的相关约定。 +5. 本规范优先适于用C++17版本。 + +## 约定 +**规则**:编程时必须遵守的约定(must) + +**建议**:编程时应该遵守的约定(should) + +本规范适用通用C++标准, 如果没有特定的标准版本,适用所有的版本(C++03/11/14/17)。 + +## 例外 +无论是'规则'还是'建议',都必须理解该条目这么规定的原因,并努力遵守。 +但是,有些规则和建议可能会有例外。 + +在不违背总体原则,经过充分考虑,有充足的理由的前提下,可以适当违背规范中约定。 +例外破坏了代码的一致性,请尽量避免。'规则'的例外应该是极少的。 + +下列情况,应风格一致性原则优先: +**修改外部开源代码、第三方代码时,应该遵守开源代码、第三方代码已有规范,保持风格统一。** + +# 2 命名 +## 通用命名 +__驼峰风格(CamelCase)__ +大小写字母混用,单词连在一起,不同单词间通过单词首字母大写来分开。 +按连接后的首字母是否大写,又分: 大驼峰(UpperCamelCase)和小驼峰(lowerCamelCase) + + +| 类型 | 命名风格 | +| ---------------------------------------- | --------- | +| 类类型,结构体类型,枚举类型,联合体类型等类型定义, 作用域名称 | 大驼峰 | +| 函数(包括全局函数,作用域函数,成员函数) | 大驼峰 | +| 全局变量(包括全局和命名空间域下的变量,类静态变量),局部变量,函数参数,类、结构体和联合体中的成员变量 | 小驼峰 | +| 宏,常量(const),枚举值,goto 标签 | 全大写,下划线分割 | + +注意: +上表中__常量__是指全局作用域、namespace域、类的静态成员域下,以 const或constexpr 修饰的基本数据类型、枚举、字符串类型的变量,不包括数组和其他类型变量。 +上表中__变量__是指除常量定义以外的其他变量,均使用小驼峰风格。 + +## 文件命名 +### 规则2.2.1 C++文件以.cpp结尾,头文件以.h结尾 +我们推荐使用.h作为头文件的后缀,这样头文件可以直接兼容C和C++。 +我们推荐使用.cpp作为实现文件的后缀,这样可以直接区分C++代码,而不是C代码。 + +目前业界还有一些其他的后缀的表示方法: + +- 头文件: .hh, .hpp, .hxx +- cpp文件:.cc, .cxx, .c + +如果当前项目组使用了某种特定的后缀,那么可以继续使用,但是请保持风格统一。 +但是对于本文档,我们默认使用.h和.cpp作为后缀。 + + +### 规则2.2.2 C++文件名和类名保持一致 +C++的头文件和cpp文件名和类名保持一致,使用下划线小写风格。 + +如果有一个类叫DatabaseConnection,那么对应的文件名: +- database_connection.h +- database_connection.cpp + +结构体,命名空间,枚举等定义的文件名类似。 + +## 函数命名 +函数命名统一使用大驼峰风格,一般采用动词或者动宾结构。 +```cpp +class List { +public: + void AddElement(const Element& element); + Element GetElement(const unsigned int index) const; + bool IsEmpty() const; +}; + +namespace Utils { + void DeleteUser(); +} +``` + +## 类型命名 + +类型命名采用大驼峰命名风格。 +所有类型命名——类、结构体、联合体、类型定义(typedef)、枚举——使用相同约定,例如: +```cpp +// classes, structs and unions +class UrlTable { ... +class UrlTableTester { ... +struct UrlTableProperties { ... +union Packet { ... + +// typedefs +typedef std::map PropertiesMap; + +// enums +enum UrlTableErrors { ... +``` + +对于命名空间的命名,建议使用大驼峰: +```cpp +// namespace +namespace OsUtils { + +namespace FileUtils { + +} + +} +``` + + +### 建议2.4.1 避免滥用 typedef或者#define 对基本类型起别名 +除有明确的必要性,否则不要用 typedef/#define 对基本数据类型进行重定义。 +优先使用``头文件中的基本类型: + +| 有符号类型 | 无符号类型 | 描述 | +| -------- | --------- | ---------------- | +| int8_t | uint8_t | 宽度恰为8的有/无符号整数类型 | +| int16_t | uint16_t | 宽度恰为16的有/无符号整数类型 | +| int32_t | uint32_t | 宽度恰为32的有/无符号整数类型 | +| int64_t | uint64_t | 宽度恰为64的有/无符号整数类型 | +| intptr_t | uintptr_t | 足以保存指针的有/无符号整数类型 | + + +## 变量命名 +通用变量命名采用小驼峰,包括全局变量,函数形参,局部变量,成员变量。 +```cpp +std::string tableName; // Good: 推荐此风格 +std::string tablename; // Bad: 禁止此风格 +std::string path; // Good: 只有一个单词时,小驼峰为全小写 +``` + +### 规则2.5.1 全局变量应增加 'g_' 前缀,静态变量命名不需要加特殊前缀 +全局变量是应当尽量少使用的,使用时应特别注意,所以加上前缀用于视觉上的突出,促使开发人员对这些变量的使用更加小心。 +- 全局静态变量命名与全局变量相同。 +- 函数内的静态变量命名与普通局部变量相同。 +- 类的静态成员变量和普通成员变量相同。 + +```cpp +int g_activeConnectCount; + +void Func() +{ + static int packetCount = 0; + ... +} +``` + +### 规则2.5.2 类的成员变量命名以小驼峰加后下划线组成 + +```cpp +class Foo { +private: + std::string fileName_; // 添加_后缀,类似于K&R命名风格 +}; +``` +对于struct/union的成员变量,仍采用小驼峰不加后缀的命名方式,与局部变量命名风格一致。 + +## 宏、常量、枚举命名 +宏、枚举值采用全大写,下划线连接的格式。 +全局作用域内,有名和匿名namespace内的 const 常量,类的静态成员常量,全大写,下划线连接;函数局部 const 常量和类的普通const成员变量,使用小驼峰命名风格。 + +```cpp +#define MAX(a, b) (((a) < (b)) ? (b) : (a)) // 仅对宏命名举例,并不推荐用宏实现此类功能 + +enum TintColor { // 注意,枚举类型名用大驼峰,其下面的取值是全大写,下划线相连 + RED, + DARK_RED, + GREEN, + LIGHT_GREEN +}; + +int Func(...) +{ + const unsigned int bufferSize = 100; // 函数局部常量 + char *p = new char[bufferSize]; + ... +} + +namespace Utils { + const unsigned int DEFAULT_FILE_SIZE_KB = 200; // 全局常量 +} + +``` + +# 3 格式 + +## 行宽 + +### 规则3.1.1 行宽不超过 120 个字符 +建议每行字符数不要超过 120 个。如果超过120个字符,请选择合理的方式进行换行。 + +例外: +- 如果一行注释包含了超过120 个字符的命令或URL,则可以保持一行,以方便复制、粘贴和通过grep查找; +- 包含长路径的 #include 语句可以超出120 个字符,但是也需要尽量避免; +- 编译预处理中的error信息可以超出一行。 +预处理的 error 信息在一行便于阅读和理解,即使超过 120 个字符。 +```cpp +#ifndef XXX_YYY_ZZZ +#error Header aaaa/bbbb/cccc/abc.h must only be included after xxxx/yyyy/zzzz/xyz.h, because xxxxxxxxxxxxxxxxxxxxxxxxxxxxx +#endif +``` + +## 缩进 + +### 规则3.2.1 使用空格进行缩进,每次缩进4个空格 +只允许使用空格(space)进行缩进,每次缩进为 4 个空格。不允许使用Tab符进行缩进。 +当前几乎所有的集成开发环境(IDE)都支持配置将Tab符自动扩展为4空格输入;请配置你的IDE支持使用空格进行缩进。 + +## 大括号 +### 规则3.3.1 使用 K&R 缩进风格 +__K&R风格__ +换行时,函数(不包括lambda表达式)左大括号另起一行放行首,并独占一行;其他左大括号跟随语句放行末。 +右大括号独占一行,除非后面跟着同一语句的剩余部分,如 do 语句中的 while,或者 if 语句的 else/else if,或者逗号、分号。 + +如: +```cpp +struct MyType { // 跟随语句放行末,前置1空格 + ... +}; + +int Foo(int a) +{ // 函数左大括号独占一行,放行首 + if (...) { + ... + } else { + ... + } +} +``` +推荐这种风格的理由: + +- 代码更紧凑; +- 相比另起一行,放行末使代码阅读节奏感上更连续; +- 符合后来语言的习惯,符合业界主流习惯; +- 现代集成开发环境(IDE)都具有代码缩进对齐显示的辅助功能,大括号放在行尾并不会对缩进和范围产生理解上的影响。 + + +对于空函数体,可以将大括号放在同一行: +```cpp +class MyClass { +public: + MyClass() : value_(0) {} + +private: + int value_; +}; +``` + +## 函数声明和定义 + +### 规则3.4.1 函数声明和定义的返回类型和函数名在同一行;函数参数列表超出行宽时要换行并合理对齐 +在声明和定义函数的时候,函数的返回值类型应该和函数名在同一行;如果行宽度允许,函数参数也应该放在一行;否则,函数参数应该换行,并进行合理对齐。 +参数列表的左圆括号总是和函数名在同一行,不要单独一行;右圆括号总是跟随最后一个参数。 + +换行举例: +```cpp +ReturnType FunctionName(ArgType paramName1, ArgType paramName2) // Good:全在同一行 +{ + ... +} + +ReturnType VeryVeryVeryLongFunctionName(ArgType paramName1, // 行宽不满足所有参数,进行换行 + ArgType paramName2, // Good:和上一行参数对齐 + ArgType paramName3) +{ + ... +} + +ReturnType LongFunctionName(ArgType paramName1, ArgType paramName2, // 行宽限制,进行换行 + ArgType paramName3, ArgType paramName4, ArgType paramName5) // Good: 换行后 4 空格缩进 +{ + ... +} + +ReturnType ReallyReallyReallyReallyLongFunctionName( // 行宽不满足第1个参数,直接换行 + ArgType paramName1, ArgType paramName2, ArgType paramName3) // Good: 换行后 4 空格缩进 +{ + ... +} +``` + +## 函数调用 +### 规则3.5.1 函数调用入参列表应放在一行,超出行宽换行时,保持参数进行合理对齐 +函数调用时,函数参数列表放在一行。参数列表如果超过行宽,需要换行并进行合理的参数对齐。 +左圆括号总是跟函数名,右圆括号总是跟最后一个参数。 + +换行举例: +```cpp +ReturnType result = FunctionName(paramName1, paramName2); // Good:函数参数放在一行 + +ReturnType result = FunctionName(paramName1, + paramName2, // Good:保持与上方参数对齐 + paramName3); + +ReturnType result = FunctionName(paramName1, paramName2, + paramName3, paramName4, paramName5); // Good:参数换行,4 空格缩进 + +ReturnType result = VeryVeryVeryLongFunctionName( // 行宽不满足第1个参数,直接换行 + paramName1, paramName2, paramName3); // 换行后,4 空格缩进 +``` + +如果函数调用的参数存在内在关联性,按照可理解性优先于格式排版要求,对参数进行合理分组换行。 +```cpp +// Good:每行的参数代表一组相关性较强的数据结构,放在一行便于理解 +int result = DealWithStructureLikeParams(left.x, left.y, // 表示一组相关参数 + right.x, right.y); // 表示另外一组相关参数 +``` + +## if语句 + +### 规则3.6.1 if语句必须要使用大括号 +我们要求if语句都需要使用大括号,即便只有一条语句。 + +理由: +- 代码逻辑直观,易读; +- 在已有条件语句代码上增加新代码时不容易出错; +- 对于在if语句中使用函数式宏时,有大括号保护不易出错(如果宏定义时遗漏了大括号)。 + +```cpp +if (objectIsNotExist) { // Good:单行条件语句也加大括号 + return CreateNewObject(); +} +``` +### 规则3.6.2 禁止 if/else/else if 写在同一行 +条件语句中,若有多个分支,应该写在不同行。 + +如下是正确的写法: + +```cpp +if (someConditions) { + DoSomething(); + ... +} else { // Good: else 与 if 在不同行 + ... +} +``` + +下面是不符合规范的案例: + +```cpp +if (someConditions) { ... } else { ... } // Bad: else 与 if 在同一行 +``` + +## 循环语句 +### 规则3.7.1 循环语句必须使用大括号 +和条件表达式类似,我们要求for/while循环语句必须加上大括号,即便循环体是空的,或循环语句只有一条。 +```cpp +for (int i = 0; i < someRange; i++) { // Good: 使用了大括号 + DoSomething(); +} +``` +```cpp +while (condition) { } // Good:循环体是空,使用大括号 +``` +```cpp +while (condition) { + continue; // Good:continue 表示空逻辑,使用大括号 +} +``` + +坏的例子: +```cpp +for (int i = 0; i < someRange; i++) + DoSomething(); // Bad: 应该加上括号 +``` +```cpp +while (condition); // Bad:使用分号容易让人误解是while语句中的一部分 +``` + +## switch语句 +### 规则3.8.1 switch 语句的 case/default 要缩进一层 +switch 语句的缩进风格如下: +```cpp +switch (var) { + case 0: // Good: 缩进 + DoSomething1(); // Good: 缩进 + break; + case 1: { // Good: 带大括号格式 + DoSomething2(); + break; + } + default: + break; +} +``` + +```cpp +switch (var) { +case 0: // Bad: case 未缩进 + DoSomething(); + break; +default: // Bad: default 未缩进 + break; +} +``` + +## 表达式 + +### 建议3.9.1 表达式换行要保持换行的一致性,运算符放行末 +较长的表达式,不满足行宽要求的时候,需要在适当的地方换行。一般在较低优先级运算符或连接符后面截断,运算符或连接符放在行末。 +运算符、连接符放在行末,表示“未结束,后续还有”。 +例: + +// 假设下面第一行已经不满足行宽要求 +```cpp +if ((currentValue > threshold) && // Good:换行后,逻辑操作符放在行尾 + someConditionsion) { + DoSomething(); + ... +} + +int result = reallyReallyLongVariableName1 + // Good + reallyReallyLongVariableName2; +``` +表达式换行后,注意保持合理对齐,或者4空格缩进。参考下面例子 + +```cpp +int sum = longVaribleName1 + longVaribleName2 + longVaribleName3 + + longVaribleName4 + longVaribleName5 + longVaribleName6; // Good: 4空格缩进 + +int sum = longVaribleName1 + longVaribleName2 + longVaribleName3 + + longVaribleName4 + longVaribleName5 + longVaribleName6; // Good: 保持对齐 +``` +## 变量赋值 + +### 规则3.10.1 多个变量定义和赋值语句不允许写在一行 +每行只有一个变量初始化的语句,更容易阅读和理解。 + +```cpp +int maxCount = 10; +bool isCompleted = false; +``` + +下面是不符合规范的示例: + +```cpp +int maxCount = 10; bool isCompleted = false; // Bad:多个变量初始化需要分开放在多行,每行一个变量初始化 +int x, y = 0; // Bad:多个变量定义需要分行,每行一个 + +int pointX; +int pointY; +... +pointX = 1; pointY = 2; // Bad:多个变量赋值语句放同一行 +``` +例外:for 循环头、if 初始化语句(C++17)、结构化绑定语句(C++17)中可以声明和初始化多个变量。这些语句中的多个变量声明有较强关联,如果强行分成多行会带来作用域不一致,声明和初始化割裂等问题。 + +## 初始化 +初始化包括结构体、联合体、及数组的初始化 + +### 规则3.11.1 初始化换行时要有缩进,并进行合理对齐 +结构体或数组初始化时,如果换行应保持4空格缩进。 +从可读性角度出发,选择换行点和对齐位置。 + +```cpp +const int rank[] = { + 16, 16, 16, 16, 32, 32, 32, 32, + 64, 64, 64, 64, 32, 32, 32, 32 +}; +``` + +## 指针与引用 +### 建议3.12.1 指针类型"`*`"跟随变量名或者类型,不要两边都留有或者都没有空格 +指针命名: `*`靠左靠右都可以,但是不要两边都有或者都没有空格。 +```cpp +int* p = nullptr; // Good +int *p = nullptr; // Good + +int*p = nullptr; // Bad +int * p = nullptr; // Bad +``` + +例外:当变量被 const 修饰时,"`*`" 无法跟随变量,此时也不要跟随类型。 +```cpp +const char * const VERSION = "V100"; +``` + +### 建议3.12.2 引用类型"`&`"跟随变量名或者类型,不要两边都留有或者都没有空格 +引用命名:`&`靠左靠右都可以,但是不要两边都有或者都没有空格。 +```cpp +int i = 8; + +int& p = i; // Good +int &p = i; // Good +int*& rp = pi; // Good,指针的引用,*& 一起跟随类型 +int *&rp = pi; // Good,指针的引用,*& 一起跟随变量名 +int* &rp = pi; // Good,指针的引用,* 跟随类型,& 跟随变量名 + +int & p = i; // Bad +int&p = i; // Bad +``` + +## 编译预处理 +### 规则3.13.1 编译预处理的"#"统一放在行首,嵌套编译预处理语句时,"#"可以进行缩进 +编译预处理的"#"统一放在行首,即使编译预处理的代码是嵌入在函数体中的,"#"也应该放在行首。 + +### 规则3.13.2 避免使用宏 +宏会忽略作用域,类型系统以及各种规则,容易引发问题。应尽量避免使用宏定义,如果必须使用宏,要保证证宏名的唯一性。 +在C++中,有许多方式来避免使用宏: +- 用const或enum定义易于理解的常量 +- 用namespace避免名字冲突 +- 用inline函数避免函数调用的开销 +- 用template函数来处理多种类型 +在文件头保护宏、条件编译、日志记录等必要场景中可以使用宏。 + +### 规则3.13.3 禁止使用宏来表示常量 +宏是简单的文本替换,在预处理阶段完成,运行报错时直接报相应的值;跟踪调试时也是显示值,而不是宏名; 宏没有类型检查,不宏全; 宏没有作用域。 + +### 规则3.13.4 禁止使用函数式宏 +宏义函数式宏前,应考虑能否用函数替代。对于可替代场景,建议用函数替代宏。 +函数式宏的缺点如下: +- 函数式宏缺乏类型检查,不如函数调用检查严格 +- 宏展开时宏参数不求值,可能会产生非预期结果 +- 宏没有独产的作用域 +- 宏的技巧性太强,例如#的用法和无处不在的括号,影响可读性 +- 在特定场景中必须用编译器对宏的扩展语法,如GCC的statement expression,影响可移植性 +- 宏在预编译阶段展开后,在期后编译、链接和调试时都不可见;而且包含多行的宏会展开为一行。函数式宏难以调试、难以打断点,不利于定位问题 +- 对于包含大量语句的宏,在每个调用点都要展开。如果调用点很多,会造成代码空间的膨胀 + +函数没有宏的上述缺点。但是,函数相比宏,最大的劣势是执行效率不高(增加函数调用的开销和编译器优化的难度)。 +为此,可以在必要时使用内联函数。内联函数跟宏类似,也是在调用点展开。不同之处在于内联函数是在编译时展开。 + +内联函数兼具函数和宏的优点: +- 内联函数执行严格的类型检查 +- 内联函数的参数求值只会进行一次 +- 内联函数就地展开,没有函数调用的开销 +- 内联函数比函数优化得更好 +对于性能要求高的产品代码,可以考虑用内联函数代替函数。 + +例外: +在日志记录场景中,需要通过函数式宏保持调用点的文件名(__FILE__)、行号(__LINE__)等信息。 + +## 空格和空行 +### 规则3.14.1 水平空格应该突出关键字和重要信息,避免不必要的留白 +水平空格应该突出关键字和重要信息,每行代码尾部不要加空格。总体规则如下: + +- if, switch, case, do, while, for等关键字之后加空格; +- 小括号内部的两侧,不要加空格; +- 大括号内部两侧有无空格,左右必须保持一致; +- 一元操作符(& * + ‐ ~ !)之后不要加空格; +- 二元操作符(= + ‐ < > * / % | & ^ <= >= == != )左右两侧加空格 +- 三目运算符(? :)符号两侧均需要空格 +- 前置和后置的自增、自减(++ --)和变量之间不加空格 +- 结构体成员操作符(. ->)前后不加空格 +- 逗号(,)前面不加空格,后面增加空格 +- 对于模板和类型转换(<>)和类型之间不要添加空格 +- 域操作符(::)前后不要添加空格 +- 冒号(:)前后根据情况来判断是否要添加空格 + +常规情况: +```cpp +void Foo(int b) { // Good:大括号前应该留空格 + +int i = 0; // Good:变量初始化时,=前后应该有空格,分号前面不要留空格 + +int buf[BUF_SIZE] = {0}; // Good:大括号内两侧都无空格 +``` + +函数定义和函数调用: +```cpp +int result = Foo(arg1,arg2); + ^ // Bad: 逗号后面需要增加空格 + +int result = Foo( arg1, arg2 ); + ^ ^ // Bad: 函数参数列表的左括号后面不应该有空格,右括号前面不应该有空格 +``` + +指针和取地址 +```cpp +x = *p; // Good:*操作符和指针p之间不加空格 +p = &x; // Good:&操作符和变量x之间不加空格 +x = r.y; // Good:通过.访问成员变量时不加空格 +x = r->y; // Good:通过->访问成员变量时不加空格 +``` + +操作符: +```cpp +x = 0; // Good:赋值操作的=前后都要加空格 +x = -5; // Good:负数的符号和数值之前不要加空格 +++x; // Good:前置和后置的++/--和变量之间不要加空格 +x--; + +if (x && !y) // Good:布尔操作符前后要加上空格,!操作和变量之间不要空格 +v = w * x + y / z; // Good:二元操作符前后要加空格 +v = w * (x + z); // Good:括号内的表达式前后不需要加空格 + +int a = (x < y) ? x : y; // Good: 三目运算符, ?和:前后需要添加空格 +``` + +循环和条件语句: +```cpp +if (condition) { // Good:if关键字和括号之间加空格,括号内条件语句前后不加空格 + ... +} else { // Good:else关键字和大括号之间加空格 + ... +} + +while (condition) {} // Good:while关键字和括号之间加空格,括号内条件语句前后不加空格 + +for (int i = 0; i < someRange; ++i) { // Good:for关键字和括号之间加空格,分号之后加空格 + ... +} + +switch (condition) { // Good: switch 关键字后面有1空格 + case 0: // Good:case语句条件和冒号之间不加空格 + ... + break; + ... + default: + ... + break; +} +``` + +模板和转换 +```cpp +// 尖括号(< and >) 不与空格紧邻, < 前没有空格, > 和 ( 之间也没有. +vector x; +y = static_cast(x); + +// 在类型与指针操作符之间留空格也可以, 但要保持一致. +vector x; +``` + +域操作符 +```cpp +std::cout; // Good: 命名空间访问,不要留空格 + +int MyClass::GetValue() const {} // Good: 对于成员函数定义,不要留空格 +``` + +冒号 +```cpp +// 添加空格的场景 + +// Good: 类的派生需要留有空格 +class Sub : public Base { + +}; + +// 构造函数初始化列表需要留有空格 +MyClass::MyClass(int var) : someVar_(var) +{ + DoSomething(); +} + +// 位域表示也留有空格 +struct XX { + char a : 4; + char b : 5; + char c : 4; +}; +``` + +```cpp +// 不添加空格的场景 + +// Good: 对于public:, private:这种类访问权限的冒号不用添加空格 +class MyClass { +public: + MyClass(int var); +private: + int someVar_; +}; + +// 对于switch-case的case和default后面的冒号不用添加空格 +switch (value) +{ + case 1: + DoSomething(); + break; + default: + break; +} +``` + +注意:当前的集成开发环境(IDE)可以设置删除行尾的空格,请正确配置。 + +### 建议3.14.1 合理安排空行,保持代码紧凑 + +减少不必要的空行,可以显示更多的代码,方便代码阅读。下面有一些建议遵守的规则: +- 根据上下内容的相关程度,合理安排空行; +- 函数内部、类型定义内部、宏内部、初始化表达式内部,不使用连续空行 +- 不使用连续 **3** 个空行,或更多 +- 大括号内的代码块行首之前和行尾之后不要加空行,但namespace的大括号内不作要求。 + +```cpp +int Foo() +{ + ... +} + + + +int Bar() // Bad:最多使用连续2个空行。 +{ + ... +} + + +if (...) { + // Bad:大括号内的代码块行首不要加入空行 + ... + // Bad:大括号内的代码块行尾不要加入空行 +} + +int Foo(...) +{ + // Bad:函数体内行首不要加空行 + ... +} +``` + +## 类 +### 规则3.15.1 类访问控制块的声明依次序是 public:, protected:, private:,缩进和 class 关键字对齐 +```cpp +class MyClass : public BaseClass { +public: // 注意没有缩进 + MyClass(); // 标准的4空格缩进 + explicit MyClass(int var); + ~MyClass() {} + + void SomeFunction(); + void SomeFunctionThatDoesNothing() + { + } + + void SetVar(int var) { someVar_ = var; } + int GetVar() const { return someVar_; } + +private: + bool SomeInternalFunction(); + + int someVar_; + int someOtherVar_; +}; +``` + +在各个部分中,建议将类似的声明放在一起, 并且建议以如下的顺序: 类型 (包括 typedef, using 和嵌套的结构体与类), 常量, 工厂函数, 构造函数, 赋值运算符, 析构函数, 其它成员函数, 数据成员。 + + +### 规则3.15.2 构造函数初始化列表放在同一行或按四格缩进并排多行 +```cpp +// 如果所有变量能放在同一行: +MyClass::MyClass(int var) : someVar_(var) +{ + DoSomething(); +} + +// 如果不能放在同一行, +// 必须置于冒号后, 并缩进4个空格 +MyClass::MyClass(int var) + : someVar_(var), someOtherVar_(var + 1) // Good: 逗号后面留有空格 +{ + DoSomething(); +} + +// 如果初始化列表需要置于多行, 需要逐行对齐 +MyClass::MyClass(int var) + : someVar_(var), // 缩进4个空格 + someOtherVar_(var + 1) +{ + DoSomething(); +} +``` + +# 4 注释 +一般的,尽量通过清晰的架构逻辑,好的符号命名来提高代码可读性;需要的时候,才辅以注释说明。 +注释是为了帮助阅读者快速读懂代码,所以要从读者的角度出发,**按需注释**。 + +注释内容要简洁、明了、无二义性,信息全面且不冗余。 + +**注释跟代码一样重要。** +写注释时要换位思考,用注释去表达此时读者真正需要的信息。在代码的功能、意图层次上进行注释,即注释解释代码难以表达的意图,不要重复代码信息。 +修改代码时,也要保证其相关注释的一致性。只改代码,不改注释是一种不文明行为,破坏了代码与注释的一致性,让阅读者迷惑、费解,甚至误解。 + +使用英文进行注释。 + +## 注释风格 + +在 C++ 代码中,使用 `/*` `*/`和 `//` 都是可以的。 +按注释的目的和位置,注释可分为不同的类型,如文件头注释、函数头注释、代码注释等等; +同一类型的注释应该保持统一的风格。 + +注意:本文示例代码中,大量使用 '//' 后置注释只是为了更精确的描述问题,并不代表这种注释风格更好。 + +## 文件头注释 +### 规则3.1 文件头注释必须包含版权许可 + +/* + * Copyright (c) 2020 XXX + * 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. + */ + +## 函数头注释 +### 规则4.3.1 公有(public)函数必须编写函数头注释 +公有函数属于类对外提供的接口,调用者需要了解函数的功能、参数的取值范围、返回的结果、注意事项等信息才能正常使用。 +特别是参数的取值范围、返回的结果、注意事项等都无法做到自注示,需要编写函数头注释辅助说明。 + +### 规则4.3.2 禁止空有格式的函数头注释 +并不是所有的函数都需要函数头注释; +函数签名无法表达的信息,加函数头注释辅助说明; + +函数头注释统一放在函数声明或定义上方,使用如下风格之一: +使用`//`写函数头 + +```cpp +// 单行函数头 +int Func1(void); + +// 多行函数头 +// 第二行 +int Func2(void); +``` + +使用`/* */`写函数头 +```cpp +/* 单行函数头 */ +int Func1(void); + +/* + * 另一种单行函数头 + */ +int Func2(void); + +/* + * 多行函数头 + * 第二行 + */ +int Func3(void); +``` +函数尽量通过函数名自注释,按需写函数头注释。 +不要写无用、信息冗余的函数头;不要写空有格式的函数头。 + +函数头注释内容可选,但不限于:功能说明、返回值,性能约束、用法、内存约定、算法实现、可重入的要求等等。 +模块对外头文件中的函数接口声明,其函数头注释,应当将重要、有用的信息表达清楚。 + +例: + +```cpp +/* + * 返回实际写入的字节数,-1表示写入失败 + * 注意,内存 buf 由调用者负责释放 + */ +int WriteString(const char *buf, int len); +``` + +坏的例子: +```cpp +/* + * 函数名:WriteString + * 功能:写入字符串 + * 参数: + * 返回值: + */ +int WriteString(const char *buf, int len); +``` +上面例子中的问题: + +- 参数、返回值,空有格式没内容 +- 函数名信息冗余 +- 关键的 buf 由谁释放没有说清楚 + +## 代码注释 +### 规则4.4.1 代码注释放于对应代码的上方或右边 +### 规则4.4.2 注释符与注释内容间要有1空格;右置注释与前面代码至少1空格 +代码上方的注释,应该保持对应代码一样的缩进。 +选择并统一使用如下风格之一: +使用`//` +```cpp + +// 这是单行注释 +DoSomething(); + +// 这是多行注释 +// 第二行 +DoSomething(); +``` + +使用`/*' '*/` +```cpp +/* 这是单行注释 */ +DoSomething(); + +/* + * 另一种方式的多行注释 + * 第二行 + */ +DoSomething(); +``` +代码右边的注释,与代码之间,至少留1空格,建议不超过4空格。 +通常使用扩展后的 TAB 键即可实现 1-4 空格的缩进。 + +选择并统一使用如下风格之一: + +```cpp +int foo = 100; // 放右边的注释 +int bar = 200; /* 放右边的注释 */ +``` +右置格式在适当的时候,上下对齐会更美观。 +对齐后的注释,离左边代码最近的那一行,保证1-4空格的间隔。 +例: + +```cpp +const int A_CONST = 100; /* 相关的同类注释,可以考虑上下对齐 */ +const int ANOTHER_CONST = 200; /* 上下对齐时,与左侧代码保持间隔 */ +``` +当右置的注释超过行宽时,请考虑将注释置于代码上方。 + +### 规则4.4.3 不用的代码段直接删除,不要注释掉 +被注释掉的代码,无法被正常维护;当企图恢复使用这段代码时,极有可能引入易被忽略的缺陷。 +正确的做法是,不需要的代码直接删除掉。若再需要时,考虑移植或重写这段代码。 + +这里说的注释掉代码,包括用 /* */ 和 //,还包括 #if 0, #ifdef NEVER_DEFINED 等等。 + +# 5 头文件 +## 头文件职责 +头文件是模块或文件的对外接口,头文件的设计体现了大部分的系统设计。 +头文件中适合放置接口的声明,不适合放置实现(内联函数除外)。对于cpp文件中内部才需要使用的函数、宏、枚举、结构定义等不要放在头文件中。 +头文件应当职责单一。头文件过于复杂,依赖过于复杂还是导致编译时间过长的主要原因。 + +### 建议5.1.1 每一个.cpp文件应有一个对应的.h文件,用于声明需要对外公开的类与接口 +通常情况下,每个.cpp文件都有一个相应的.h,用于放置对外提供的函数声明、宏定义、类型定义等。 +如果一个.cpp文件不需要对外公布任何接口,则其就不应当存在。 +例外:__程序的入口(如main函数所在的文件),单元测试代码,动态库代码。__ + +示例: +```cpp +// Foo.h + +#ifndef FOO_H +#define FOO_H + +class Foo { +public: + Foo(); + void Fun(); + +private: + int value_; +}; + +#endif +``` + +```cpp +// Foo.cpp +#include "Foo.h" + +namespace { // Good: 对内函数的声明放在.cpp文件的头部,并声明为匿名namespace或者static限制其作用域 + void Bar() + { + } +} + +... + +void Foo::Fun() +{ + Bar(); +} +``` + +## 头文件依赖 +### 规则5.2.1 禁止头文件循环依赖 +头文件循环依赖,指 a.h 包含 b.h,b.h 包含 c.h,c.h 包含 a.h, 导致任何一个头文件修改,都导致所有包含了a.h/b.h/c.h的代码全部重新编译一遍。 +而如果是单向依赖,如a.h包含b.h,b.h包含c.h,而c.h不包含任何头文件,则修改a.h不会导致包含了b.h/c.h的源代码重新编译。 + +头文件循环依赖直接体现了架构设计上的不合理,可通过优化架构去避免。 + + +### 规则5.2.2 头文件必须编写`#define`保护,防止重复包含 +为防止头文件被重复包含,所有头文件都应当使用 #define 保护;不要使用 #pragma once + +定义包含保护符时,应该遵守如下规则: +1)保护符使用唯一名称; +2)不要在受保护部分的前后放置代码或者注释,文件头注释除外。 + +示例:假定timer模块的timer.h,其目录为timer/include/timer.h,应按如下方式保护: + +```cpp +#ifndef TIMER_INCLUDE_TIMER_H +#define TIMER_INCLUDE_TIMER_H +... +#endif +``` + +### 规则5.2.3 禁止通过声明的方式引用外部函数接口、变量 +只能通过包含头文件的方式使用其他模块或文件提供的接口。 +通过 extern 声明的方式使用外部函数接口、变量,容易在外部接口改变时可能导致声明和定义不一致。 +同时这种隐式依赖,容易导致架构腐化。 + +不符合规范的案例: + +// a.cpp内容 +```cpp +extern int Fun(); // Bad: 通过extern的方式使用外部函数 + +void Bar() +{ + int i = Fun(); + ... +} +``` + +// b.cpp内容 +```cpp +int Fun() +{ + // Do something +} +``` +应该改为: + +// a.cpp内容 +```cpp +#include "b.h" // Good: 通过包含头文件的方式使用其他.cpp提供的接口 + +void Bar() +{ + int i = Fun(); + ... +} +``` + +// b.h内容 +```cpp +int Fun(); +``` + +// b.cpp内容 +```cpp +int Fun() +{ + // Do something +} +``` +例外,有些场景需要引用其内部函数,但并不想侵入代码时,可以 extern 声明方式引用。 +如: +针对某一内部函数进行单元测试时,可以通过 extern 声明来引用被测函数; +当需要对某一函数进行打桩、打补丁处理时,允许 extern 声明该函数。 + +### 规则5.2.4 禁止在extern "C"中包含头文件 +在 extern "C" 中包含头文件,有可能会导致 extern "C" 嵌套,部分编译器对 extern "C" 嵌套层次有限制,嵌套层次太多会编译错误。 + +在C,C++混合编程的情况下,在extern "C"中包含头文件,可能会导致被包含头文件的原有意图遭到破坏,比如链接规范被不正确地更改。 + +示例,存在a.h和b.h两个头文件: + +// a.h内容 +```cpp +... +#ifdef __cplusplus +void Foo(int); +#define A(value) Foo(value) +#else +void A(int) +#endif +``` +// b.h内容 +```cpp +... +#ifdef __cplusplus +extern "C" { +#endif + +#include "a.h" +void B(); + +#ifdef __cplusplus +} +#endif +``` + +使用C++预处理器展开b.h,将会得到 +```cpp +extern "C" { + void Foo(int); + void B(); +} +``` + +按照 a.h 作者的本意,函数 Foo 是一个 C++ 自由函数,其链接规范为 "C++"。 +但在 b.h 中,由于 `#include "a.h"` 被放到了 `extern "C"` 的内部,函数 Foo 的链接规范被不正确地更改了。 + +例外: +如果在 C++ 编译环境中,想引用纯C的头文件,这些C头文件并没有` extern "C"` 修饰。非侵入式的做法是,在 `extern "C"` 中去包含C头文件。 + +### 建议5.2.1尽量避免使用前置声明,而是通过`#include`来包含头文件 +前置声明(forward declaration)通常指类、模板的纯粹声明,没伴随着其定义。 + +- 优点: + 1. 前置声明能够节省编译时间,多余的 #include 会迫使编译器展开更多的文件,处理更多的输入。 + 2. 前置声明能够节省不必要的重新编译的时间。 #include 使代码因为头文件中无关的改动而被重新编译多次。 +- 缺点: + 1. 前置声明隐藏了依赖关系,头文件改动时,用户的代码会跳过必要的重新编译过程。 + 2. 前置声明可能会被库的后续更改所破坏。前置声明模板有时会妨碍头文件开发者变动其 API. 例如扩大形参类型,加个自带默认参数的模板形参等等。 + 3. 前置声明来自命名空间` std::` 的 symbol 时,其行为未定义(在C++11标准规范中明确说明)。 + 4. 前置声明了不少来自头文件的 symbol 时,就会比单单一行的 include 冗长。 + 5. 仅仅为了能前置声明而重构代码(比如用指针成员代替对象成员)会使代码变得更慢更复杂。 + 6. 很难判断什么时候该用前置声明,什么时候该用`#include`,某些场景下面前置声明和`#include`互换以后会导致意想不到的结果。 + +所以我们尽可能避免使用前置声明,而是使用#include头文件来保证依赖关系。 + +# 6 作用域 + +## 命名空间 + +### 建议6.1.1 对于cpp文件中不需要导出的变量,常量或者函数,请使用匿名namespace封装或者用static修饰 +在C++ 2003标准规范中,使用static修饰文件作用域的变量,函数等被标记为deprecated特性,所以更推荐使用匿名namespace。 + +主要原因如下: +1. static在C++中已经赋予了太多的含义,静态函数成员变量,静态成员函数,静态全局变量,静态函数局部变量,每一种都有特殊的处理。 +2. static只能保证变量,常量和函数的文件作用域,但是namespace还可以封装类型等。 +3. 统一namespace来处理C++的作用域,而不需要同时使用static和namespace来管理。 +4. static修饰的函数不能用来实例化模板,而匿名namespace可以。 + +但是不要在 .h 中使用中使用匿名namespace或者static。 + +```cpp +// Foo.cpp + +namespace { + const int MAX_COUNT = 20; + void InternalFun() {}; +} + +void Foo::Fun() +{ + int i = MAX_COUNT; + + InternalFun(); +} + +``` + +### 规则6.1.1 不要在头文件中或者#include之前使用using导入命名空间 +说明:使用using导入命名空间会影响后续代码,易造成符号冲突,所以不要在头文件以及源文件中的#include之前使用using导入命名空间。 +示例: + +```cpp +// 头文件a.h +namespace NamespaceA { + int Fun(int); +} +``` + +```cpp +// 头文件b.h +namespace NamespaceB { + int Fun(int); +} + +using namespace NamespaceB; + +void G() +{ + Fun(1); +} +``` + +```cpp +// 源代码a.cpp +#include "a.h" +using namespace NamespaceA; +#include "b.h" + +void main() +{ + G(); // using namespace NamespaceA在#include “b.h”之前,引发歧义:NamespaceA::Fun,NamespaceB::Fun调用不明确 +} +``` + +对于在头文件中使用using导入单个符号或定义别名,允许在模块自定义名字空间中使用,但禁止在全局名字空间中使用。 +```cpp +// foo.h + +#include +using fancy::string; // Bad,禁止向全局名字空间导入符号 + +namespace Foo { + using fancy::string; // Good,可以在模块自定义名字空间中导入符号 + using MyVector = fancy::vector; // Good,C++11可在自定义名字空间中定义别名 +} +``` + + +## 全局函数和静态成员函数 + +### 建议6.2.1 优先使用命名空间来管理全局函数,如果和某个class有直接关系的,可以使用静态成员函数 +说明:非成员函数放在名字空间内可避免污染全局作用域, 也不要用类+静态成员方法来简单管理全局函数。 如果某个全局函数和某个类有紧密联系, 那么可以作为类的静态成员函数。 + +如果你需要定义一些全局函数,给某个cpp文件使用,那么请使用匿名namespace来管理。 +```cpp +namespace MyNamespace { + int Add(int a, int b); +} + +class File { +public: + static File CreateTempFile(const std::string& fileName); +}; +``` + +## 全局常量和静态成员常量 + +### 建议6.3.1 优先使用命名空间来管理全局常量,如果和某个class有直接关系的,可以使用静态成员常量 +说明:全局常量放在命名空间内可避免污染全局作用域, 也不要用类+静态成员常量来简单管理全局常量。 如果某个全局常量和某个类有紧密联系, 那么可以作为类的静态成员常量。 + +如果你需要定义一些全局常量,只给某个cpp文件使用,那么请使用匿名namespace来管理。 +```cpp +namespace MyNamespace { + const int MAX_SIZE = 100; +} + +class File { +public: + static const std::string SEPARATOR; +}; +``` + +## 全局变量 + +### 建议6.4.1 尽量避免使用全局变量,考虑使用单例模式 +说明:全局变量是可以修改和读取的,那么这样会导致业务代码和这个全局变量产生数据耦合。 +```cpp +int g_counter = 0; + +// a.cpp +g_counter++; + +// b.cpp +g_counter++; + +// c.cpp +cout << g_counter << endl; +``` + +使用单实例模式 +```cpp +class Counter { +public: + static Counter& GetInstance() + { + static Counter counter; + return counter; + } // 单实例实现简单举例 + + void Increase() + { + value_++; + } + + void Print() const + { + std::cout << value_ << std::endl; + } + +private: + Counter() : value_(0) {} + +private: + int value_; +}; + +// a.cpp +Counter::GetInstance().Increase(); + +// b.cpp +Counter::GetInstance().Increase(); + +// c.cpp +Counter::GetInstance().Print(); +``` + +实现单例模式以后,实现了全局唯一一个实例,和全局变量同样的效果,并且单实例提供了更好的封装性。 + +例外:有的时候全局变量的作用域仅仅是模块内部,这样进程空间里面就会有多个全局变量实例,每个模块持有一份,这种场景下是无法使用单例模式解决的。 + +# 7 类 + +## 构造,拷贝构造,赋值和析构函数 +构造,拷贝,移动和析构函数提供了对象的生命周期管理方法: +- 构造函数(constructor): `X()` +- 拷贝构造函数(copy constructor):`X(const X&)` +- 拷贝赋值操作符(copy assignment):`operator=(const X&)` +- 移动构造函数(move constructor):`X(X&&)` *C++11以后提供* +- 移动赋值操作符(move assignment):`operator=(X&&)` *C++11以后提供* +- 析构函数(destructor):`~X()` + +### 规则7.1.1 类的成员变量必须显式初始化 +说明:如果类有成员变量,没有定义构造函数,又没有定义默认构造函数,编译器将自动生成一个构造函数,但编译器生成的构造函数并不会对成员变量进行初始化,对象状态处于一种不确定性。 + +例外: +- 如果类的成员变量具有默认构造函数,那么可以不需要显式初始化。 + +示例:如下代码没有构造函数,私有数据成员无法初始化: +```cpp +class Message { +public: + void ProcessOutMsg() + { + //… + } + +private: + unsigned int msgID_; + unsigned int msgLength_; + unsigned char* msgBuffer_; + std::string someIdentifier_; +}; + +Message message; // message成员变量没有初始化 +message.ProcessOutMsg(); // 后续使用存在隐患 + +// 因此,有必要定义默认构造函数,如下: +class Message { +public: + Message() : msgID_(0), msgLength_(0), msgBuffer_(nullptr) + { + } + + void ProcessOutMsg() + { + // … + } + +private: + unsigned int msgID_; + unsigned int msgLength_; + unsigned char* msgBuffer_; + std::string someIdentifier_; // 具有默认构造函数,不需要显式初始化 +}; +``` + +### 建议7.1.1 成员变量优先使用声明时初始化(C++11)和构造函数初始化列表初始化 +说明:C++11的声明时初始化可以一目了然的看出成员初始值,应当优先使用。如果成员初始化值和构造函数相关,或者不支持C++11,则应当优先使用构造函数初始化列表来初始化成员。相比起在构造函数体中对成员赋值,初始化列表的代码更简洁,执行性能更好,而且可以对const成员和引用成员初始化。 + +```cpp +class Message { +public: + Message() : msgLength_(0) // Good,优先使用初始化列表 + { + msgBuffer_ = nullptr; // Bad,不推荐在构造函数中赋值 + } + +private: + unsigned int msgID_{0}; // Good,C++11中使用 + unsigned int msgLength_; + unsigned char* msgBuffer_; +}; +``` + +### 规则7.1.2 为避免隐式转换,将单参数构造函数声明为explicit +说明:单参数构造函数如果没有用explicit声明,则会成为隐式转换函数。 +示例: + +```cpp +class Foo { +public: + explicit Foo(const string& name): name_(name) + { + } +private: + string name_; +}; + + +void ProcessFoo(const Foo& foo){} + +int main(void) +{ + std::string test = "test"; + ProcessFoo(test); // 编译不通过 + return 0; +} +``` + +上面的代码编译不通过,因为`ProcessFoo`需要的参数是Foo类型,传入的string类型不匹配。 + +如果将Foo构造函数的explicit关键字移除,那么调用`ProcessFoo`传入的string就会触发隐式转换,生成一个临时的Foo对象。往往这种隐式转换是让人迷惑的,并且容易隐藏Bug,得到了一个不期望的类型转换。所以对于单参数的构造函数是要求explicit声明。 + +### 规则7.1.3 如果不需要拷贝构造函数、赋值操作符 / 移动构造函数、赋值操作符,请明确禁止 +说明:如果用户不定义,编译器默认会生成拷贝构造函数和拷贝赋值操作符, 移动构造和移动赋值操作符(移动语义的函数C++11以后才有)。 +如果我们不要使用拷贝构造函数,或者赋值操作符,请明确拒绝: + +1. 将拷贝构造函数或者赋值操作符设置为private,并且不实现: +```cpp +class Foo { +private: + Foo(const Foo&); + Foo& operator=(const Foo&); +}; +``` +2. 使用C++11提供的delete, 请参见后面现代C++的相关章节。 + + +3. 推荐继承NoCopyable、NoMovable,禁止使用DISALLOW_COPY_AND_MOVE,DISALLOW_COPY,DISALLOW_MOVE等宏。 +```cpp +class Foo : public NoCopyable, public NoMovable { +}; +``` +NoCopyable和NoMovable的实现: +```cpp +class NoCopyable { +public: + NoCopyable() = default; + NoCopyable(const NoCopyable&) = delete; + NoCopyable& operator = (NoCopyable&) = delete; +}; + +class NoMovable { +public: + NoMovable() = default; + NoMovable(NoMovable&&) noexcept = delete; + NoMovable& operator = (NoMovable&&) noexcept = delete; +}; +``` + +### 规则7.1.4 拷贝构造和拷贝赋值操作符应该是成对出现或者禁止 +拷贝构造函数和拷贝赋值操作符都是具有拷贝语义的,应该同时出现或者禁止。 + +```cpp +// 同时出现 +class Foo { +public: + ... + Foo(const Foo&); + Foo& operator=(const Foo&); + ... +}; + +// 同时default, C++11支持 +class Foo { +public: + Foo(const Foo&) = default; + Foo& operator=(const Foo&) = default; +}; + +// 同时禁止, C++11可以使用delete +class Foo { +private: + Foo(const Foo&); + Foo& operator=(const Foo&); +}; +``` + +### 规则7.1.5 移动构造和移动赋值操作符应该是成对出现或者禁止 +在C++11中增加了move操作,如果需要某个类支持移动操作,那么需要实现移动构造和移动赋值操作符。 + +移动构造函数和移动赋值操作符都是具有移动语义的,应该同时出现或者禁止。 +```cpp +// 同时出现 +class Foo { +public: + ... + Foo(Foo&&); + Foo& operator=(Foo&&); + ... +}; + +// 同时default, C++11支持 +class Foo { +public: + Foo(Foo&&) = default; + Foo& operator=(Foo&&) = default; +}; + +// 同时禁止, 使用C++11的delete +class Foo { +public: + Foo(Foo&&) = delete; + Foo& operator=(Foo&&) = delete; +}; +``` + +### 规则7.1.6 禁止在构造函数和析构函数中调用虚函数 +说明:在构造函数和析构函数中调用当前对象的虚函数,会导致未实现多态的行为。 +在C++中,一个基类一次只构造一个完整的对象。 + +示例:类Base是基类,Sub是派生类 +```cpp +class Base { +public: + Base(); + virtual void Log() = 0; // 不同的派生类调用不同的日志文件 +}; + +Base::Base() // 基类构造函数 +{ + Log(); // 调用虚函数Log +} + +class Sub : public Base { +public: + virtual void Log(); +}; +``` + +当执行如下语句: +`Sub sub;` +会先执行Sub的构造函数,但首先调用Base的构造函数,由于Base的构造函数调用虚函数Log,此时Log还是基类的版本,只有基类构造完成后,才会完成派生类的构造,从而导致未实现多态的行为。 +同样的道理也适用于析构函数。 + +### 规则7.1.7 多态基类中的拷贝构造函数、拷贝赋值操作符、移动构造函数、移动赋值操作符必须为非public函数或者为delete函数 +如果报一个派生类对象直接赋值给基类对象,会发生切片,只拷贝或者移动了基类部分,损害了多态行为。 +【反例】 +如下代码中,基类没有定义拷贝构造函数或拷贝赋值操作符,编译器会自动生成这两个特殊成员函数, +如果派生类对象赋值给基类对象时就发生切片。可以将此例中的拷贝构造函数和拷贝赋值操作符声明为delete,编译器可检查出此类赋值行为。 +```cpp +class Base { +public: + Base() = default; + virtual ~Base() = default; + ... + virtual void Fun() { std::cout << "Base" << std::endl;} +}; + +class Derived : public Base { + ... + void Fun() override { std::cout << "Derived" << std::endl; } +}; + +void Foo(const Base &base) +{ + Base other = base; // 不符合:发生切片 + other.Fun(); // 调用的时Base类的Fun函数 +} +``` +```cpp +Derived d; +Foo(d); // 传入的是派生类对象 +``` +1. 将拷贝构造函数或者赋值操作符设置为private,并且不实现: + +## 继承 + +### 规则7.2.1 基类的析构函数应该声明为virtual,不准备被继承的类需要声明为final +说明:只有基类析构函数是virtual,通过多态调用的时候才能保证派生类的析构函数被调用。 + +示例:基类的析构函数没有声明为virtual导致了内存泄漏。 +```cpp +class Base { +public: + virtual std::string getVersion() = 0; + + ~Base() + { + std::cout << "~Base" << std::endl; + } +}; +``` + +```cpp +class Sub : public Base { +public: + Sub() : numbers_(nullptr) + { + } + + ~Sub() + { + delete[] numbers_; + std::cout << "~Sub" << std::endl; + } + + int Init() + { + const size_t numberCount = 100; + numbers_ = new (std::nothrow) int[numberCount]; + if (numbers_ == nullptr) { + return -1; + } + + ... + } + + std::string getVersion() + { + return std::string("hello!"); + } +private: + int* numbers_; +}; +``` + +```cpp +int main(int argc, char* args[]) +{ + Base* b = new Sub(); + + delete b; + return 0; +} +``` +由于基类Base的析构函数没有声明为virtual,当对象被销毁时,只会调用基类的析构函数,不会调用派生类Sub的析构函数,导致内存泄漏。 +例外: +NoCopyable、NoMovable这种没有任何行为,仅仅用来做标识符的类,可以不定义虚析构也不定义final。 + +### 规则7.2.2 禁止虚函数使用缺省参数值 +说明:在C++中,虚函数是动态绑定的,但函数的缺省参数却是在编译时就静态绑定的。这意味着你最终执行的函数是一个定义在派生类,但使用了基类中的缺省参数值的虚函数。为了避免虚函数重载时,因参数声明不一致给使用者带来的困惑和由此导致的问题,规定所有虚函数均不允许声明缺省参数值。 +示例:虚函数display缺省参数值text是由编译时刻决定的,而非运行时刻,没有达到多态的目的: +```cpp +class Base { +public: + virtual void Display(const std::string& text = "Base!") + { + std::cout << text << std::endl; + } + + virtual ~Base(){} +}; + +class Sub : public Base { +public: + virtual void Display(const std::string& text = "Sub!") + { + std::cout << text << std::endl; + } + + virtual ~Sub(){} +}; + +int main() +{ + Base* base = new Sub(); + Sub* sub = new Sub(); + + ... + + base->Display(); // 程序输出结果: Base! 而期望输出:Sub! + sub->Display(); // 程序输出结果: Sub! + + delete base; + delete sub; + return 0; +}; +``` + +### 规则7.2.3 禁止重新定义继承而来的非虚函数 +说明:因为非虚函数无法实现动态绑定,只有虚函数才能实现动态绑定:只要操作基类的指针,即可获得正确的结果。 + +示例: +```cpp +class Base { +public: + void Fun(); +}; + +class Sub : public Base { +public: + void Fun(); +}; + +Sub* sub = new Sub(); +Base* base = sub; + +sub->Fun(); // 调用子类的Fun +base->Fun(); // 调用父类的Fun +//... + +``` + +## 多重继承 +在实际开发过程中使用多重继承的场景是比较少的,因为多重继承使用过程中有下面的典型问题: +1. 菱形继承所带来的数据重复,以及名字二义性。因此,C++引入了virtual继承来解决这类问题; +2. 即便不是菱形继承,多个父类之间的名字也可能存在冲突,从而导致的二义性; +3. 如果子类需要扩展或改写多个父类的方法时,造成子类的职责不明,语义混乱; +4. 相对于委托,继承是一种白盒复用,即子类可以访问父类的protected成员, 这会导致更强的耦合。而多重继承,由于耦合了多个父类,相对于单根继承,这会产生更强的耦合关系。 + +多重继承具有下面的优点: +多重继承提供了一种更简单的组合来实现多种接口或者类的组装与复用。 + +所以,对于多重继承的只有下面几种情况下面才允许使用多重继承。 + +### 建议7.3.1 使用多重继承来实现接口分离与多角色组合 +如果某个类需要实现多重接口,可以通过多重继承把多个分离的接口组合起来,类似 scala 语言的 traits 混入。 + +```cpp +class Role1 {}; +class Role2 {}; +class Role3 {}; + +class Object1 : public Role1, public Role2 { + // ... +}; + +class Object2 : public Role2, public Role3 { + // ... +}; + +``` + +在C++标准库中也有类似的实现样例: +```cpp +class basic_istream {}; +class basic_ostream {}; + +class basic_iostream : public basic_istream, public basic_ostream { + +}; +``` + +## 重载 + +重载操作符要有充分理由,而且不要改变操作符原有语义,例如不要使用 ‘+’ 操作符来做减运算。 +操作符重载令代码更加直观,但也有一些不足: +- 混淆直觉,误以为该操作和内建类型一样是高性能的,忽略了性能降低的可能; +- 问题定位时不够直观,按函数名查找比按操作符显然更方便。 +- 重载操作符如果行为定义不直观(例如将‘+’ 操作符来做减运算),会让代码产生混淆。 +- 赋值操作符的重载引入的隐式转换会隐藏很深的bug。可以定义类似Equals()、CopyFrom()等函数来替代=,==操作符。 + + + +# 8 函数 +## 函数设计 +### 规则8.1.1 避免函数过长,函数不超过50行(非空非注释) +函数应该可以一屏显示完 (50行以内),只做一件事情,而且把它做好。 + +过长的函数往往意味着函数功能不单一,过于复杂,或过分呈现细节,未进行进一步抽象。 + +例外:某些实现算法的函数,由于算法的聚合性与功能的全面性,可能会超过50行。 + +即使一个长函数现在工作的非常好, 一旦有人对其修改, 有可能出现新的问题, 甚至导致难以发现的bug。 +建议将其拆分为更加简短并易于管理的若干函数,以便于他人阅读和修改代码。 + +## 内联函数 + +### 建议8.2.1 内联函数不超过10行(非空非注释) +**说明**:内联函数具有一般函数的特性,它与一般函数不同之处只在于函数调用的处理。一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换。 + +内联函数只适合于只有 1~10 行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对来说微不足道,也没有必要用内联函数实现,一般的编译器会放弃内联方式,而采用普通的方式调用函数。 + +如果内联函数包含复杂的控制结构,如循环、分支(switch)、try-catch 等语句,一般编译器将该函数视同普通函数。 +**虚函数、递归函数不能被用来做内联函数**。 + +## 函数参数 + +### 建议8.3.1 函数参数使用引用取代指针 + +**说明**:引用比指针更安全,因为它一定非空,且一定不会再指向其他目标;引用不需要检查非法的NULL指针。 + +如果是基于老平台开发的产品,则优先顺从原有平台的处理方式。 +选择 const 避免参数被修改,让代码阅读者清晰地知道该参数不被修改,可大大增强代码可读性。 + +例外:当传入参数为编译期长度未知的数组时,可以使用指针而不是引用。 + +### 建议8.3.2 使用强类型参数,避免使用void* +尽管不同的语言对待强类型和弱类型有自己的观点,但是一般认为c/c++是强类型语言,既然我们使用的语言是强类型的,就应该保持这样的风格。 +好处是尽量让编译器在编译阶段就检查出类型不匹配的问题。 + +使用强类型便于编译器帮我们发现错误,如下代码中注意函数 FooListAddNode 的使用: +```cpp +struct FooNode { + struct List link; + int foo; +}; + +struct BarNode { + struct List link; + int bar; +} + +void FooListAddNode(void *node) // Bad: 这里用 void * 类型传递参数 +{ + FooNode *foo = (FooNode *)node; + ListAppend(&g_FooList, &foo->link); +} + +void MakeTheList() +{ + FooNode *foo = nullptr; + BarNode *bar = nullptr; + ... + + FooListAddNode(bar); // Wrong: 这里本意是想传递参数 foo,但错传了 bar,却没有报错 +} +``` + +1. 可以使用模板函数来实现参数类型的变化。 +2. 可以使用基类指针来实现多态。 + +### 建议8.3.3 函数的参数个数不超过5个 +函数的参数过多,会使得该函数易于受外部变化的影响,从而影响维护工作。函数的参数过多同时也会增大测试的工作量。 + +如果超过可以考虑: +- 看能否拆分函数 +- 看能否将相关参数合在一起,定义结构体 + +# 9 C++其他特性 + +## 常量与初始化 + +不变的值更易于理解、跟踪和分析,所以应该尽可能地使用常量代替变量,定义值的时候,应该把const作为默认的选项。 + +### 规则9.1.1 不允许使用宏来表示常量 + +**说明**:宏是简单的文本替换,在预处理阶段时完成,运行报错时直接报相应的值;跟踪调试时也是显示值,而不是宏名;宏没有类型检查,不安全;宏没有作用域。 + +```cpp +#define MAX_MSISDN_LEN 20 // 不好 + +// C++请使用const常量 +const int MAX_MSISDN_LEN = 20; // 好 + +// 对于C++11以上版本,可以使用constexpr +constexpr int MAX_MSISDN_LEN = 20; +``` + +### 建议9.1.1 一组相关的整型常量应定义为枚举 + +**说明**:枚举比`#define`或`const int`更安全。编译器会检查参数值是否位于枚举取值范围内,避免错误发生。 + +```cpp +// 好的例子: +enum Week { + SUNDAY, + MONDAY, + TUESDAY, + WEDNESDAY, + THURSDAY, + FRIDAY, + SATURDAY +}; + +enum Color { + RED, + BLACK, + BLUE +}; + +void ColorizeCalendar(Week today, Color color); + +ColorizeCalendar(BLUE, SUNDAY); // 编译报错,参数类型错误 + +// 不好的例子: +const int SUNDAY = 0; +const int MONDAY = 1; + +const int BLACK = 0; +const int BLUE = 1; + +bool ColorizeCalendar(int today, int color); +ColorizeCalendar(BLUE, SUNDAY); // 不会报错 +``` + +当枚举值需要对应到具体数值时,须在声明时显式赋值。否则不需要显式赋值,以避免重复赋值,降低维护(增加、删除成员)工作量。 + +```cpp +// 好的例子:S协议里定义的设备ID值,用于标识设备类型 +enum DeviceType { + DEV_UNKNOWN = -1, + DEV_DSMP = 0, + DEV_ISMG = 1, + DEV_WAPPORTAL = 2 +}; +``` + +程序内部使用,仅用于分类的情况,不应该进行显式的赋值。 + +```cpp +// 好的例子:程序中用来标识会话状态的枚举定义 +enum SessionState { + INIT, + CLOSED, + WAITING_FOR_RESPONSE +}; +``` + +应当尽量避免枚举值重复,如必须重复也要用已定义的枚举来修饰 + +```cpp +enum RTCPType { + RTCP_SR = 200, + RTCP_MIN_TYPE = RTCP_SR, + RTCP_RR = 201, + RTCP_SDES = 202, + RTCP_BYE = 203, + RTCP_APP = 204, + RTCP_RTPFB = 205, + RTCP_PSFB = 206, + RTCP_XR = 207, + RTCP_RSI = 208, + RTCP_PUBPORTS = 209, + RTCP_MAX_TYPE = RTCP_PUBPORTS +}; +``` + +### 规则9.1.2 不允许使用魔鬼数字 +所谓魔鬼数字即看不懂、难以理解的数字。 + +魔鬼数字并非一个非黑即白的概念,看不懂也有程度,需要自行判断。 +例如数字 12,在不同的上下文中情况是不一样的: +type = 12; 就看不懂,但 `monthsCount = yearsCount * 12`; 就能看懂。 +数字 0 有时候也是魔鬼数字,比如 `status = 0`; 并不能表达是什么状态。 + +解决途径: +对于局部使用的数字,可以增加注释说明 +对于多处使用的数字,必须定义 const 常量,并通过符号命名自注释。 + +禁止出现下列情况: +没有通过符号来解释数字含义,如` const int ZERO = 0` +符号命名限制了其取值,如 `const int XX_TIMER_INTERVAL_300MS = 300`,直接使用`XX_TIMER_INTERVAL_MS`来表示该常量是定时器的时间间隔。 + +### 规则9.1.3 常量应该保证单一职责 + +**说明**:一个常量只用来表示一个特定功能,即一个常量不能有多种用途。 + +```cpp +// 好的例子:协议A和协议B,手机号(MSISDN)的长度都是20。 +const unsigned int A_MAX_MSISDN_LEN = 20; +const unsigned int B_MAX_MSISDN_LEN = 20; + +// 或者使用不同的名字空间: +namespace Namespace1 { + const unsigned int MAX_MSISDN_LEN = 20; +} + +namespace Namespace2 { + const unsigned int MAX_MSISDN_LEN = 20; +} +``` + +### 规则9.1.4 禁止用memcpy_s、memset_s初始化非POD对象 + +**说明**:`POD`全称是`Plain Old Data`,是C++ 98标准(ISO/IEC 14882, first edition, 1998-09-01)中引入的一个概念,`POD`类型主要包括`int`, `char`, `float`,`double`,`enumeration`,`void`,指针等原始类型以及聚合类型,不能使用封装和面向对象特性(如用户定义的构造/赋值/析构函数、基类、虚函数等)。 + +由于非POD类型比如非聚合类型的class对象,可能存在虚函数,内存布局不确定,跟编译器有关,滥用内存拷贝可能会导致严重的问题。 + +即使对聚合类型的class,使用直接的内存拷贝和比较,破坏了信息隐蔽和数据保护的作用,也不提倡`memcpy_s`、`memset_s`操作。 + +对于POD类型的详细说明请参见附录。 + +### 建议9.1.2 变量使用时才声明并初始化 + +**说明**:变量在使用前未赋初值,是常见的低级编程错误。使用前才声明变量并同时初始化,非常方便地避免了此类低级错误。 + +在函数开始位置声明所有变量,后面才使用变量,作用域覆盖整个函数实现,容易导致如下问题: +* 程序难以理解和维护:变量的定义与使用分离。 +* 变量难以合理初始化:在函数开始时,经常没有足够的信息进行变量初始化,往往用某个默认的空值(比如零)来初始化,这通常是一种浪费,如果变量在被赋于有效值以前使用,还会导致错误。 + +遵循变量作用域最小化原则与就近声明原则, 使得代码更容易阅读,方便了解变量的类型和初始值。特别是,应使用初始化的方式替代声明再赋值。 + +```cpp +// 不好的例子:声明与初始化分离 +string name; // 声明时未初始化:调用缺省构造函数 +name = "zhangsan"; // 再次调用赋值操作符函数;声明与定义在不同的地方,理解相对困难 + +// 好的例子:声明与初始化一体,理解相对容易 +string name("zhangsan"); // 调用构造函数 +``` + + +## 表达式 +### 规则9.2.1 含有变量自增或自减运算的表达式中禁止再次引用该变量 +含有变量自增或自减运算的表达式中,如果再引用该变量,其结果在C++标准中未明确定义。各个编译器或者同一个编译器不同版本实现可能会不一致。 +为了更好的可移植性,不应该对标准未定义的运算次序做任何假设。 + +注意,运算次序的问题不能使用括号来解决,因为这不是优先级的问题。 + +示例: +```cpp +x = b[i] + i++; // Bad: b[i]运算跟 i++,先后顺序并不明确。 +``` +正确的写法是将自增或自减运算单独放一行: +```cpp +x = b[i] + i; +i++; // Good: 单独一行 +``` + +函数参数 +```cpp +Func(i++, i); // Bad: 传递第2个参数时,不确定自增运算有没有发生 +``` + +正确的写法 +```cpp +i++; // Good: 单独一行 +x = Func(i, i); +``` + +### 规则9.2.2 switch语句要有default分支 +大部分情况下,switch语句中要有default分支,保证在遗漏case标签处理时能够有一个缺省的处理行为。 + +特例: +如果switch条件变量是枚举类型,并且 case 分支覆盖了所有取值,则加上default分支处理有些多余。 +现代编译器都具备检查是否在switch语句中遗漏了某些枚举值的case分支的能力,会有相应的warning提示。 + +```cpp +enum Color { + RED = 0, + BLUE +}; + +// 因为switch条件变量是枚举值,这里可以不用加default处理分支 +switch (color) { + case RED: + DoRedThing(); + break; + case BLUE: + DoBlueThing(); + ... + break; +} +``` + +### 建议9.2.1 表达式的比较,应当遵循左侧倾向于变化、右侧倾向于不变的原则 +当变量与常量比较时,如果常量放左边,如 if (MAX == v) 不符合阅读习惯,而 if (MAX > v) 更是难于理解。 +应当按人的正常阅读、表达习惯,将常量放右边。写成如下方式: +```cpp +if (value == MAX) { + +} + +if (value < MAX) { + +} +``` +也有特殊情况,如:`if (MIN < value && value < MAX)` 用来描述区间时,前半段是常量在左的。 + +不用担心将 '==' 误写成 '=',因为` if (value = MAX)` 会有编译告警,其他静态检查工具也会报错。让工具去解决笔误问题,代码要符合可读性第一。 + +### 建议9.2.2 使用括号明确操作符的优先级 +使用括号明确操作符的优先级,防止因默认的优先级与设计思想不符而导致程序出错;同时使得代码更为清晰可读,然而过多的括号会分散代码使其降低了可读性。下面是如何使用括号的建议。 + +- 二元及以上操作符, 如果涉及多种操作符,则应该使用括号 +```cpp +x = a + b + c; /* 操作符相同,可以不加括号 */ +x = Foo(a + b, c); /* 逗号两边的表达式,不需要括号 */ +x = 1 << (2 + 3); /* 操作符不同,需要括号 */ +x = a + (b / 5); /* 操作符不同,需要括号 */ +x = (a == b) ? a : (a – b); /* 操作符不同,需要括号 */ +``` + + +## 类型转换 + +避免使用类型分支来定制行为:类型分支来定制行为容易出错,是企图用C++编写C代码的明显标志。这是一种很不灵活的技术,要添加新类型时,如果忘记修改所有分支,编译器也不会告知。使用模板和虚函数,让类型自己而不是调用它们的代码来决定行为。 + +建议避免类型转换,我们在代码的类型设计上应该考虑到每种数据的数据类型是什么,而不是应该过度使用类型转换来解决问题。在设计某个基本类型的时候,请考虑: +- 是无符号还是有符号的 +- 是适合float还是double +- 是使用int8,int16,int32还是int64,确定整形的长度 + +但是我们无法禁止使用类型转换,因为C++语言是一门面向机器编程的语言,涉及到指针地址,并且我们会与各种第三方或者底层API交互,他们的类型设计不一定是合理的,在这个适配的过程中很容易出现类型转换。 + +例外:在调用某个函数的时候,如果我们不想处理函数结果,首先要考虑这个是否是你的最好的选择。如果确实不想处理函数的返回值,那么可以使用(void)转换来解决。 + +### 规则9.3.1 如果确定要使用类型转换,请使用由C++提供的类型转换,而不是C风格的类型转换 + +**说明**: + +C++提供的类型转换操作比C风格更有针对性,更易读,也更加安全,C++提供的转换有: +- 类型转换: +1. `dynamic_cast`:主要用于继承体系下行转换,`dynamic_cast`具有类型检查的功能,请做好基类和派生类的设计,避免使用dynamic_cast来进行转换。 +2. `static_cast`:和C风格转换相似可做值的强制转换,或上行转换(把派生类的指针或引用转换成基类的指针或引用)。该转换经常用于消除多重继承带来的类型歧义,是相对安全的。如果是纯粹的算数转换,那么请使用后面的大括号转换方式。 +3. `reinterpret_cast`:用于转换不相关的类型。`reinterpret_cast`强制编译器将某个类型对象的内存重新解释成另一种类型,这是一种不安全的转换,建议尽可能少用`reinterpret_cast`。 +4. `const_cast`:用于移除对象的`const`属性,使对象变得可修改,这样会破坏数据的不变性,建议尽可能少用。 + +- 算数转换: (C++11开始支持) + 对于那种算数转换,并且类型信息没有丢失的,比如float到double, int32到int64的转换,推荐使用大括号的初始方式。 +```cpp + double d{ someFloat }; + int64_t i{ someInt32 }; +``` + +### 建议9.3.1 避免使用`dynamic_cast` +1. `dynamic_cast`依赖于C++的RTTI, 让程序员在运行时识别C++类对象的类型。 +2. `dynamic_cast`的出现一般说明我们的基类和派生类设计出现了问题,派生类破坏了基类的契约,不得不通过`dynamic_cast`转换到子类进行特殊处理,这个时候更希望来改善类的设计,而不是通过`dynamic_cast`来解决问题。 + +### 建议9.3.2 避免使用`reinterpret_cast` + +**说明**:`reinterpret_cast`用于转换不相关类型。尝试用`reinterpret_cast`将一种类型强制转换另一种类型,这破坏了类型的安全性与可靠性,是一种不安全的转换。不同类型之间尽量避免转换。 + +### 建议9.3.3 避免使用`const_cast` + +**说明**:`const_cast`用于移除对象的`const`和`volatile`性质。 + +使用const_cast转换后的指针或者引用来修改const对象,行为是未定义的。 + +```cpp +// 不好的例子 +const int i = 1024; +int* p = const_cast(&i); +*p = 2048; // 未定义行为 +``` + +```cpp +// 不好的例子 +class Foo { +public: + Foo() : i(3) {} + + void Fun(int v) + { + i = v; + } + +private: + int i; +}; + +int main(void) +{ + const Foo f; + Foo* p = const_cast(&f); + p->Fun(8); // 未定义行为 +} + +``` + + +## 资源分配和释放 + +### 规则9.4.1 单个对象释放使用delete,数组对象释放使用delete [] +说明:单个对象删除使用delete, 数组对象删除使用delete [],原因: + +- 调用new所包含的动作:从系统中申请一块内存,并调用此类型的构造函数。 +- 调用new[n]所包含的动作:申请可容纳n个对象的内存,并且对每一个对象调用其构造函数。 +- 调用delete所包含的动作:先调用相应的析构函数,再将内存归还系统。 +- 调用delete[]所包含的动作:对每一个对象调用析构函数,再释放所有内存 + +如果new和delete的格式不匹配,结果是未知的。对于非class类型, new和delete不会调用构造与析构函数。 + +错误写法: +```cpp +const int MAX_ARRAY_SIZE = 100; +int* numberArray = new int[MAX_ARRAY_SIZE]; +... +delete numberArray; +numberArray = nullptr; +``` + +正确写法: +```cpp +const int MAX_ARRAY_SIZE = 100; +int* numberArray = new int[MAX_ARRAY_SIZE]; +... +delete[] numberArray; +numberArray = nullptr; +``` + +### 建议9.4.1 使用 RAII 特性来帮助追踪动态分配 + +说明:RAII是“资源获取就是初始化”的缩语(Resource Acquisition Is Initialization),是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。 + +RAII 的一般做法是这样的:在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。这种做法有两大好处: +- 我们不需要显式地释放资源。 +- 对象所需的资源在其生命期内始终保持有效。这样,就不必检查资源有效性的问题,可以简化逻辑、提高效率。 + + +示例:使用RAII不需要显式地释放互斥资源。 + +```cpp +class LockGuard { +public: + LockGuard(const LockType& lockType): lock_(lockType) + { + lock_.Aquire(); + } + + ~LockGuard() + { + lock_.Relase(); + } + +private: + LockType lock_; +}; + + +bool Update() +{ + LockGuard lockGuard(mutex); + if (...) { + return false; + } else { + // 操作数据 + } + + return true; +} +``` + +## 标准库 + +STL标准模板库在不同产品使用程度不同,这里列出一些基本规则和建议,供各团队参考。 + +### 规则9.5.1 不要保存std::string的c_str()返回的指针 + +说明:在C++标准中并未规定string::c_str()指针持久有效,因此特定STL实现完全可以在调用string::c_str()时返回一个临时存储区并很快释放。所以为了保证程序的可移植性,不要保存string::c_str()的结果,而是在每次需要时直接调用。 + +示例: + +```cpp +void Fun1() +{ + std::string name = "demo"; + const char* text = name.c_str(); // 表达式结束以后,name的生命周期还在,指针有效 + + // 如果中间调用了string的非const成员函数,导致string被修改,比如operator[], begin()等 + // 可能会导致text的内容不可用,或者不是原来的字符串 + name = "test"; + name[1] = '2'; + + // 后续使用text指针,其字符串内容不再是"demo" +} + +void Fun2() +{ + std::string name = "demo"; + std::string test = "test"; + const char* text = (name + test).c_str(); // 表达式结束以后,+号产生的临时对象被销毁,指针无效 + + // 后续使用text指针,其已不再指向合法内存空间 +} +``` +例外:在少数对性能要求非常高的代码中,为了适配已有的只接受const char*类型入参的函数,可以临时保存string::c_str()返回的指针。但是必须严格保证string对象的生命周期长于所保存指针的生命周期,并且保证在所保存指针的生命周期内,string对象不会被修改。 + + +### 建议9.5.1 使用std::string代替char* + +说明:使用string代替`char*`有很多优势,比如: +1. 不用考虑结尾的’\0’; +2. 可以直接使用+, =, ==等运算符以及其它字符串操作函数; +3. 不需要考虑内存分配操作,避免了显式的new/delete,以及由此导致的错误; + +需要注意的是某些stl实现中string是基于写时复制策略的,这会带来2个问题,一是某些版本的写时复制策略没有实现线程安全,在多线程环境下会引起程序崩溃;二是当与动态链接库相互传递基于写时复制策略的string时,由于引用计数在动态链接库被卸载时无法减少可能导致悬挂指针。因此,慎重选择一个可靠的stl实现对于保证程序稳定是很重要的。 + +例外: +当调用系统或者其它第三方库的API时,针对已经定义好的接口,只能使用`char*`。但是在调用接口之前都可以使用string,在调用接口时使用string::c_str()获得字符指针。 +当在栈上分配字符数组当作缓冲区使用时,可以直接定义字符数组,不要使用string,也没有必要使用类似`vector`等容器。 + +### 规则9.5.2 禁止使用auto_ptr +说明:在stl库中的std::auto_ptr具有一个隐式的所有权转移行为,如下代码: +```cpp +auto_ptr p1(new T); +auto_ptr p2 = p1; +``` +当执行完第2行语句后,p1已经不再指向第1行中分配的对象,而是变为nullptr。正因为如此,auto_ptr不能被置于各种标准容器中。 +转移所有权的行为通常不是期望的结果。对于必须转移所有权的场景,也不应该使用隐式转移的方式。这往往需要程序员对使用auto_ptr的代码保持额外的谨慎,否则出现对空指针的访问。 +使用auto_ptr常见的有两种场景,一是作为智能指针传递到产生auto_ptr的函数外部,二是使用auto_ptr作为RAII管理类,在超出auto_ptr的生命周期时自动释放资源。 +对于第1种场景,可以使用std::shared_ptr来代替。 +对于第2种场景,可以使用C++11标准中的std::unique_ptr来代替。其中std::unique_ptr是std::auto_ptr的代替品,支持显式的所有权转移。 + +例外: +在C++11标准得到普遍使用之前,在一定需要对所有权进行转移的场景下,可以使用std::auto_ptr,但是建议对std::auto_ptr进行封装,并禁用封装类的拷贝构造函数和赋值运算符,以使该封装类无法用于标准容器。 + + +### 建议9.5.2 使用新的标准头文件 + +说明: +使用C++的标准头文件时,请使用``这样的,而不是``这种的。 + +## const的用法 +在声明的变量或参数前加上关键字 const 用于指明变量值不可被篡改 (如 `const int foo` ). 为类中的函数加上 const 限定符表明该函数不会修改类成员变量的状态 (如 `class Foo { int Bar(char c) const; };`)。 const 变量, 数据成员, 函数和参数为编译时类型检测增加了一层保障, 便于尽早发现错误。因此, 我们强烈建议在任何可能的情况下使用 const。 +有时候,使用C++11的constexpr来定义真正的常量可能更好。 + +### 规则9.6.1 对于指针和引用类型的形参,如果是不需要修改的,请使用const +不变的值更易于理解/跟踪和分析,把const作为默认选项,在编译时会对其进行检查,使代码更牢固/更安全。 +```cpp +class Foo; + +void PrintFoo(const Foo& foo); +``` + +### 规则9.6.2 对于不会修改成员变量的成员函数请使用const修饰 +尽可能将成员函数声明为 const。 访问函数应该总是 const。只要不修改数据成员的成员函数,都声明为const。 +对于虚函数,应当从设计意图上考虑继承链上的所有类是否需要在此虚函数中修改数据成员,而不是仅关注单个类的实现。 +```cpp +class Foo { +public: + + // ... + + int PrintValue() const // const修饰成员函数,不会修改成员变量 + { + std::cout << value_ << std::endl; + } + + int GetValue() const // const修饰成员函数,不会修改成员变量 + { + return value_; + } + +private: + int value_; +}; +``` + +### 建议9.6.1 初始化后不会再修改的成员变量定义为const + +```cpp +class Foo { +public: + Foo(int length) : dataLength_(length) {} +private: + const int dataLength_; +}; +``` + +## 异常 + +### 建议9.7.1 C++11中,如果函数不会抛出异常,声明为`noexcept` +**理由** +1. 如果函数不会抛出异常,声明为`noexcept`可以让编译器最大程度的优化函数,如减少执行路径,提高错误退出的效率。 +2. `vector`等STL容器,为了保证接口的健壮性,如果保存元素的`move运算符`没有声明为`noexcept`,则在容器扩张搬移元素时不会使用`move机制`,而使用`copy机制`,带来性能损失的风险。如果一个函数不能抛出异常,或者一个程序并没有截获某个函数所抛出的异常并进行处理,那么这个函数可以用新的`noexcept`关键字对其进行修饰,表示这个函数不会抛出异常或者抛出的异常不会被截获并处理。例如: + +```cpp +extern "C" double sqrt(double) noexcept; // 永远不会抛出异常 + +// 即使可能抛出异常,也可以使用 noexcept +// 这里不准备处理内存耗尽的异常,简单地将函数声明为noexcept +std::vector MyComputation(const std::vector& v) noexcept +{ + std::vector res = v; // 可能会抛出异常 + // do something + return res; +} +``` + +**示例** + +```cpp +RetType Function(Type params) noexcept; // 最大的优化 +RetType Function(Type params); // 更少的优化 + +// std::vector 的 move 操作需要声明 noexcept +class Foo1 { +public: + Foo1(Foo1&& other); // no noexcept +}; + +std::vector a1; +a1.push_back(Foo1()); +a1.push_back(Foo1()); // 触发容器扩张,搬移已有元素时调用copy constructor + +class Foo2 { +public: + Foo2(Foo2&& other) noexcept; +}; + +std::vector a2; +a2.push_back(Foo2()); +a2.push_back(Foo2()); // 触发容器扩张,搬移已有元素时调用move constructor +``` + +**注意** +默认构造函数、析构函数、`swap`函数,`move操作符`都不应该抛出异常。 + +## 模板与泛型编程 + +### 规则9.8.1 禁止在OpenHarmony项目中进行泛型编程 +泛型编程和面向对象编程的思想、理念以及技巧完全不同,OpenHarmony项目主流使用面向对象的思想。 + +C++提供了强大的泛型编程的机制,能够实现非常灵活简洁的类型安全的接口,实现类型不同但是行为相同的代码复用。 + +但是C++泛型编程存在以下缺点: + +1. 对泛型编程不很熟练的人,常常会将面向对象的逻辑写成模板、将不依赖模板参数的成员写在模板中等等导致逻辑混乱代码膨胀诸多问题。 +2. 模板编程所使用的技巧对于使用c++不是很熟练的人是比较晦涩难懂的。在复杂的地方使用模板的代码让人更不容易读懂,并且debug 和维护起来都很麻烦。 +3. 模板编程经常会导致编译出错的信息非常不友好: 在代码出错的时候, 即使这个接口非常的简单, 模板内部复杂的实现细节也会在出错信息显示. 导致这个编译出错信息看起来非常难以理解。 +4. 模板如果使用不当,会导致运行时代码过度膨胀。 +5. 模板代码难以修改和重构。模板的代码会在很多上下文里面扩展开来, 所以很难确认重构对所有的这些展开的代码有用。 + +所以,OpenHarmony大部分部件禁止模板编程,仅有 __少数部件__ 可以使用泛型编程,并且开发的模板要有详细的注释。 +例外: +1. stl适配层可以使用模板 + +## 宏 +在C++语言中,我们强烈建议尽可能少使用复杂的宏 +- 对于常量定义,请按照前面章节所述,使用const或者枚举; +- 对于宏函数,尽可能简单,并且遵循下面的原则,并且优先使用内联函数,模板函数等进行替换。 + +```cpp +// 不推荐使用宏函数 +#define SQUARE(a, b) ((a) * (b)) + +// 请使用模板函数,内联函数等来替换。 +template T Square(T a, T b) { return a * b; } +``` + +如果需要使用宏,请参考C语言规范的相关章节。 +**例外**:一些通用且成熟的应用,如:对 new, delete 的封装处理,可以保留对宏的使用。 + +# 10 现代C++特性 + +随着 ISO 在2011年发布 C++11 语言标准,以及2017年3月发布 C++17 ,现代C++(C++11/14/17等)增加了大量提高编程效率、代码质量的新语言特性和标准库。 +本章节描述了一些可以帮助团队更有效率的使用现代C++,规避语言陷阱的指导意见。 + +## 代码简洁性和安全性提升 +### 建议10.1.1 合理使用`auto` +**理由** + +* `auto`可以避免编写冗长、重复的类型名,也可以保证定义变量时初始化。 +* `auto`类型推导规则复杂,需要仔细理解。 +* 如果能够使代码更清晰,继续使用明确的类型,且只在局部变量使用`auto`。 + +**示例** + +```cpp +// 避免冗长的类型名 +std::map::iterator iter = m.find(val); +auto iter = m.find(val); + +// 避免重复类型名 +class Foo {...}; +Foo* p = new Foo; +auto p = new Foo; + +// 保证初始化 +int x; // 编译正确,没有初始化 +auto x; // 编译失败,必须初始化 +``` + +auto 的类型推导可能导致困惑: + +```cpp +auto a = 3; // int +const auto ca = a; // const int +const auto& ra = a; // const int& +auto aa = ca; // int, 忽略 const 和 reference +auto ila1 = { 10 }; // std::initializer_list +auto ila2{ 10 }; // std::initializer_list + +auto&& ura1 = x; // int& +auto&& ura2 = ca; // const int& +auto&& ura3 = 10; // int&& + +const int b[10]; +auto arr1 = b; // const int* +auto& arr2 = b; // const int(&)[10] +``` + +如果没有注意 `auto` 类型推导时忽略引用,可能引入难以发现的性能问题: + +```cpp +std::vector v; +auto s1 = v[0]; // auto 推导为 std::string,拷贝 v[0] +``` + +如果使用`auto`定义接口,如头文件中的常量,可能因为开发人员修改了值,而导致类型发生变化。 + +### 规则10.1.1 在重写虚函数时请使用`override`或`final`关键字 +**理由** +`override`和`final`关键字都能保证函数是虚函数,且重写了基类的虚函数。如果子类函数与基类函数原型不一致,则产生编译告警。`final`还保证虚函数不会再被子类重写。 + +使用`override`或`final`关键字后,如果修改了基类虚函数原型,但忘记修改子类重写的虚函数,在编译期就可以发现。也可以避免有多个子类时,重写虚函数的修改遗漏。 + +**示例** + +```cpp +class Base { +public: + virtual void Foo(); + virtual void Foo(int var); + void Bar(); +}; + +class Derived : public Base { +public: + void Foo() const override; // 编译失败: Derived::Foo 和 Base::Foo 原型不一致,不是重写 + void Foo() override; // 正确: Derived::Foo 重写 Base::Foo + void Foo(int var) final; // 正确: Derived::Foo(int) 重写 Base::Foo(int),且Derived的派生类不能再重写此函数 + void Bar() override; // 编译失败: Base::Bar 不是虚函数 +}; +``` + +**总结** +1. 基类首次定义虚函数,使用`virtual`关键字 +2. 子类重写基类虚函数(包括析构函数),使用`override`或`final`关键字(但不要两者一起使用),并且不使用`virtual`关键字 +3. 非虚函数,`virtual`、`override`和`final`都不使用 + +### 规则10.1.2 使用`delete`关键字删除函数 +**理由** +相比于将类成员函数声明为`private`但不实现,`delete`关键字更明确,且适用范围更广。 + +**示例** + +```cpp +class Foo { +private: + // 只看头文件不知道拷贝构造是否被删除 + Foo(const Foo&); +}; + +class Foo { +public: + // 明确删除拷贝赋值函数 + Foo& operator=(const Foo&) = delete; +}; +``` + +`delete`关键字还支持删除非成员函数 + +```cpp +template +void Process(T value); + +template<> +void Process(void) = delete; +``` + +### 规则10.1.3 使用`nullptr`,而不是`NULL`或`0` +**理由** +长期以来,C++没有一个代表空指针的关键字,这是一件很尴尬的事: + +```cpp +#define NULL ((void *)0) + +char* str = NULL; // 错误: void* 不能自动转换为 char* + +void(C::*pmf)() = &C::Func; +if (pmf == NULL) {} // 错误: void* 不能自动转换为指向成员函数的指针 +``` + +如果把`NULL`被定义为`0`或`0L`。可以解决上面的问题。 + +或者在需要空指针的地方直接使用`0`。但这引入另一个问题,代码不清晰,特别是使用`auto`自动推导: + +```cpp +auto result = Find(id); +if (result == 0) { // Find() 返回的是 指针 还是 整数? + // do something +} +``` + +`0`字面上是`int`类型(`0L`是`long`),所以`NULL`和`0`都不是指针类型。 +当重载指针和整数类型的函数时,传递`NULL`或`0`都调用到整数类型重载的函数: + +```cpp +void F(int); +void F(int*); + +F(0); // 调用 F(int),而非 F(int*) +F(NULL); // 调用 F(int),而非 F(int*) +``` + +另外,`sizeof(NULL) == sizeof(void*)`并不一定总是成立的,这也是一个潜在的风险。 + +总结: 直接使用`0`或`0L`,代码不清晰,且无法做到类型安全;使用`NULL`无法做到类型安全。这些都是潜在的风险。 + +`nullptr`的优势不仅仅是在字面上代表了空指针,使代码清晰,而且它不再是一个整数类型。 + +`nullptr`是`std::nullptr_t`类型,而`std::nullptr_t`可以隐式的转换为所有的原始指针类型,这使得`nullptr`可以表现成指向任意类型的空指针。 + +```cpp +void F(int); +void F(int*); +F(nullptr); // 调用 F(int*) + +auto result = Find(id); +if (result == nullptr) { // Find() 返回的是 指针 + // do something +} +``` + +### 规则10.1.4 使用`using`而非`typedef` +在`C++11`之前,可以通过`typedef`定义类型的别名。没人愿意多次重复`std::map>`这样的代码。 + +```cpp +typedef std::map> SomeType; +``` + +类型的别名实际是对类型的封装。而通过封装,可以让代码更清晰,同时在很大程度上避免类型变化带来的散弹式修改。 +在`C++11`之后,提供`using`,实现`声明别名(alias declarations)`: + +```cpp +using SomeType = std::map>; +``` + +对比两者的格式: + +```cpp +typedef Type Alias; // Type 在前,还是 Alias 在前 +using Alias = Type; // 符合'赋值'的用法,容易理解,不易出错 +``` + +如果觉得这点还不足以切换到`using`,我们接着看看`模板别名(alias template)`: + +```cpp +// 定义模板的别名,一行代码 +template +using MyAllocatorVector = std::vector>; + +MyAllocatorVector data; // 使用 using 定义的别名 + +template +class MyClass { +private: + MyAllocatorVector data_; // 模板类中使用 using 定义的别名 +}; +``` + +而`typedef`不支持带模板参数的别名,只能"曲线救国": + +```cpp +// 通过模板包装 typedef,需要实现一个模板类 +template +struct MyAllocatorVector { + typedef std::vector> type; +}; + +MyAllocatorVector::type data; // 使用 typedef 定义的别名,多写 ::type + +template +class MyClass { +private: + typename MyAllocatorVector::type data_; // 模板类中使用,除了 ::type,还需要加上 typename +}; +``` + +### 规则10.1.5 禁止使用std::move操作const对象 +从字面上看,`std::move`的意思是要移动一个对象。而const对象是不允许修改的,自然也无法移动。因此用`std::move`操作const对象会给代码阅读者带来困惑。 +在实际功能上,`std::move`会把对象转换成右值引用类型;对于const对象,会将其转换成const的右值引用。由于极少有类型会定义以const右值引用为参数的移动构造函数和移动赋值操作符,因此代码实际功能往往退化成了对象拷贝而不是对象移动,带来了性能上的损失。 + +**错误示例:** +```cpp +std::string g_string; +std::vector g_stringList; + +void func() +{ + const std::string myString = "String content"; + g_string = std::move(myString); // bad:并没有移动myString,而是进行了复制 + const std::string anotherString = "Another string content"; + g_stringList.push_back(std::move(anotherString)); // bad:并没有移动anotherString,而是进行了复制 +} +``` + +## 智能指针 +### 规则10.2.1 单例、类的成员等所有机不会被多方持有的优先使用原始指针源而不是智能指针 +**理由** +智能指针会自动释放对象资源避免资源泄露,但会带额外的资源开销。如:智能指针自动生成的类、构造和析构的开销、内存占用多等。 + +单例、类的成员等对象的所有权不会被多方持有的情况,仅在类析构中释放资源即可。不应该使用智能指针而增额外的开销。 + +**示例** + +```cpp +class Foo; +class Base { +public: + Base() {} + virtual ~Base() + { + delete foo_; + } +private: + Foo* foo_ = nullptr; +}; +``` + +**例外** +1. 返回创建的对象时,需要指针销毁函数的可以使用智能指针。 +```cpp +class User; +class Foo { +public: + std::unique_ptr CreateUniqueUser() // 可使用unique_ptr保证对象的创建和释放在同一runtime + { + sptr ipcUser = iface_cast(remoter); + return std::unique_ptr(::new User(ipcUser), [](User *user) { + user->Close(); + ::delete user; + }); + } + + std::shared_ptr CreateSharedUser() // 可使用shared_ptr保证对象的创建和释放在同一runtime中 + { + sptr ipcUser = iface_cast(remoter); + return std::shared_ptr(ipcUser.GetRefPtr(), [ipcUser](User *user) mutable { + ipcUser = nullptr; + }); + } +}; +``` +2. 返回创建的对象且对象需要被多方引用时,可以使用shared_ptr。 + +### 规则10.2.2 使用`std::make_unique`而不是`new`创建`unique_ptr` +**理由** +1. `make_unique`提供了更简洁的创建方式 +2. 保证了复杂表达式的异常安全 + +**示例** + +```cpp +// 不好:两次出现 MyClass,重复导致不一致风险 +std::unique_ptr ptr(new MyClass(0, 1)); +// 好:只出现一次 MyClass,不存在不一致的可能 +auto ptr = std::make_unique(0, 1); +``` + +重复出现类型可能导致非常严重的问题,且很难发现: + +```cpp +// 编译正确,但new和delete不配套 +std::unique_ptr ptr(new uint8_t[10]); +std::unique_ptr ptr(new uint8_t); +// 非异常安全: 编译器可能按如下顺序计算参数: +// 1. 分配 Foo 的内存, +// 2. 构造 Foo, +// 3. 调用 Bar, +// 4. 构造 unique_ptr. +// 如果 Bar 抛出异常, Foo 不会被销毁,产生内存泄露。 +F(unique_ptr(new Foo()), Bar()); + +// 异常安全: 调用函数不会被打断. +F(make_unique(), Bar()); +``` + +**例外** +`std::make_unique`不支持自定义`deleter`。 +在需要自定义`deleter`的场景,建议在自己的命名空间实现定制版本的`make_unique`。 +使用`new`创建自定义`deleter`的`unique_ptr`是最后的选择。 + +### 规则10.2.4 使用`std::make_shared`而不是`new`创建`shared_ptr` +**理由** +使用`std::make_shared`除了类似`std::make_unique`一致性等原因外,还有性能的因素。 +`std::shared_ptr`管理两个实体: +* 控制块(存储引用计数,`deleter`等) +* 管理对象 + +`std::make_shared`创建`std::shared_ptr`,会一次性在堆上分配足够容纳控制块和管理对象的内存。而使用`std::shared_ptr(new MyClass)`创建`std::shared_ptr`,除了`new MyClass`会触发一次堆分配外,`std::shard_ptr`的构造函数还会触发第二次堆分配,产生额外的开销。 + +**例外** +类似`std::make_unique`,`std::make_shared`不支持定制`deleter` + +## Lambda +### 建议10.3.1 当函数不能工作时选择使用`lambda`(捕获局部变量,或编写局部函数) +**理由** +函数无法捕获局部变量或在局部范围内声明;如果需要这些东西,尽可能选择`lambda`,而不是手写的`functor`。 +另一方面,`lambda`和`functor`不会重载;如果需要重载,则使用函数。 +如果`lambda`和函数都可以的场景,则优先使用函数;尽可能使用最简单的工具。 + +**示例** + +```cpp +// 编写一个只接受 int 或 string 的函数 +// -- 重载是自然的选择 +void F(int); +void F(const string&); + +// 需要捕获局部状态,或出现在语句或表达式范围 +// -- lambda 是自然的选择 +vector v = LotsOfWork(); +for (int taskNum = 0; taskNum < max; ++taskNum) { + pool.Run([=, &v] {...}); +} +pool.Join(); +``` + +### 规则10.3.1 非局部范围使用`lambdas`,避免使用按引用捕获 +**理由** +非局部范围使用`lambdas`包括返回值,存储在堆上,或者传递给其它线程。局部的指针和引用不应该在它们的范围外存在。`lambdas`按引用捕获就是把局部对象的引用存储起来。如果这会导致超过局部变量生命周期的引用存在,则不应该按引用捕获。 + +**示例** + +```cpp +// 不好 +void Foo() +{ + int local = 42; + // 按引用捕获 local. + // 当函数返回后,local 不再存在, + // 因此 Process() 的行为未定义! + threadPool.QueueWork([&]{ Process(local); }); +} + +// 好 +void Foo() +{ + int local = 42; + // 按值捕获 local。 + // 因为拷贝,Process() 调用过程中,local 总是有效的 + threadPool.QueueWork([=]{ Process(local); }); +} +``` + +### 建议10.3.2 如果捕获`this`,则显式捕获所有变量 +**理由** +在成员函数中的`[=]`看起来是按值捕获。但因为是隐式的按值获取了`this`指针,并能够操作所有成员变量,数据成员实际是按引用捕获的,一般情况下建议避免。如果的确需要这样做,明确写出对`this`的捕获。 + +**示例** + +```cpp +class MyClass { +public: + void Foo() + { + int i = 0; + + auto Lambda = [=]() { Use(i, data_); }; // 不好: 看起来像是拷贝/按值捕获,成员变量实际上是按引用捕获 + + data_ = 42; + Lambda(); // 调用 use(42); + data_ = 43; + Lambda(); // 调用 use(43); + + auto Lambda2 = [i, this]() { Use(i, data_); }; // 好,显式指定按值捕获,最明确,最少的混淆 + } + +private: + int data_ = 0; +}; +``` + +### 建议10.3.3 避免使用默认捕获模式 +**理由** +lambda表达式提供了两种默认捕获模式:按引用(&)和按值(=)。 +默认按引用捕获会隐式的捕获所有局部变量的引用,容易导致访问悬空引用。相比之下,显式的写出需要捕获的变量可以更容易的检查对象生命周期,减小犯错可能。 +默认按值捕获会隐式的捕获this指针,且难以看出lambda函数所依赖的变量是哪些。如果存在静态变量,还会让阅读者误以为lambda拷贝了一份静态变量。 +因此,通常应当明确写出lambda需要捕获的变量,而不是使用默认捕获模式。 + +**错误示例** +```cpp +auto func() +{ + int addend = 5; + static int baseValue = 3; + + return [=]() { // 实际上只复制了addend + ++baseValue; // 修改会影响静态变量的值 + return baseValue + addend; + }; +} +``` + +**正确示例** +```cpp +auto func() +{ + int addend = 5; + static int baseValue = 3; + + return [addend, baseValue = baseValue]() mutable { // 使用C++14的捕获初始化拷贝一份变量 + ++baseValue; // 修改自己的拷贝,不会影响静态变量的值 + return baseValue + addend; + }; +} +``` + +参考:《Effective Modern C++》:Item 31: Avoid default capture modes. + +## 接口 +### 建议10.4.1 不涉及所有权的场景,使用`T*`或`T&`作为参数,而不是智能指针 +**理由** +1. 只在需要明确所有权机制时,才通过智能指针转移或共享所有权. +2. 通过智能指针传递,限制了函数调用者必须使用智能指针(如调用者希望传递`this`)。 +3. 传递共享所有权的智能指针存在运行时的开销。 + +**示例** + +```cpp +// 接受任何 int* +void F(int*); + +// 只能接受希望转移所有权的 int +void G(unique_ptr); + +// 只能接受希望共享所有权的 int +void G(shared_ptr); + +// 不改变所有权,但需要特定所有权的调用者 +void H(const unique_ptr&); + +// 接受任何 int +void H(int&); + +// 不好 +void F(shared_ptr& w) +{ + // ... + Use(*w); // 只使用 w -- 完全不涉及生命周期管理 + // ... +}; +``` + diff --git a/website/docs/_posts/contribute/OpenHarmony-security-design-guide.md b/website/docs/_posts/contribute/OpenHarmony-security-design-guide.md new file mode 100644 index 0000000000000000000000000000000000000000..10bf20c185c084370c1b45991cdc65538fc96fa0 --- /dev/null +++ b/website/docs/_posts/contribute/OpenHarmony-security-design-guide.md @@ -0,0 +1,216 @@ +--- +title: OpenHarmony-security-design-guide.md +permalink: /pages/extra/d44702/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# OpenHarmony安全设计规范 + +本文档主要参考业界标准和最佳实践,提供OpenHarmony安全设计规范,用于指导开发者进行设计。 + +## 1.访问通道控制 + +1-1 为了防止系统和资源被非法访问,除非标准协议约定,所有能对系统进行管理的接口,应具备接入认证机制并缺省启用。 + +**说明:**为减少系统攻击面,对于可对系统进行管理(包括配置、升级、调试等)的接口必须要启用认证机制,避免未授权的访问。 + +1-2 只保留运行维护所必须的对外通信连接,关闭不需要连接、端口。 + +**说明:**关闭不必要的通信端口,可大大降低安全威胁,是系统安全防护的基础手段。 + +## 2.应用安全 + +2-1 对于每一个需要授权访问的请求都需核实请求方的会话标识是否合法、请求方是否被授权执行此操作。 + +**说明:**避免越权访问。 + +2-2 认证处理过程在客户端实现是不可靠的,可被轻易绕过,因此对用户的最终认证处理过程必须放到服务端进行。 + +## 3.加密 + +3-1 应该使用经过验证的、安全的、公开的加密算法。 + +**说明:**算法的安全性不在于算法本身的机密性。 + +**示例:**推荐使用的密码算法: +1)分组密码算法:AES(密钥长度在128位及以上) +2)流密码算法:AES(密钥长度在128位及以上)(OFB或CTR模式) +3)非对称加密算法:RSA(推荐3072位) +4)哈希算法:SHA2(256位及以上) +5)密钥交换算法:DH(推荐3072位) +6)HMAC(基于哈希的消息验证码)算法:HMAC-SHA2 +不安全的密码算法举例如下:MD5/DES/3DES(加密传输协议TLS/SSH密码协议中避免使用3DES,非密码协议场景必须保证密钥K1≠K2≠K3)/HMAC-SHA2-256-96/HMAC-SHA1-96/HMAC-MD5/HMAC-MD5-96/SSH服务所有带CBC模式的算法/匿名算法套件/DH512/DH1024/SKIPJACK/RC2/RSA(1024位及以下)/MD2/MD4/blowfish/RC4。 +3-2 除标准协议外,避免使用差错控制编码(如奇偶校验、CRC)实现完整性校验。 + +3-3 密码算法中使用到的随机数必须是密码学意义上的安全随机数。 + +**说明:**使用了不安全的随机数,容易导致密码算法的强度降低甚至算法的失效。 + +**示例:**可使用以下的安全随机数生成接口: +1) OpenSSL的RAND_bytes或RAND_priv_bytes; +2) OpenSSL FIPS模块中实现的DRBG; +3) JDK的java.security.SecureRandom; +4)类Unix平台的/dev/random文件 + +3-4 默认使用安全的密码算法,关闭或者禁用不安全的密码算法。在选择密码算法库时,应使用通过认证的或业界开源公认的或经评估认可的密码算法库。 + +**说明:**随着密码技术的发展以及计算能力的提升,一些密码算法变得不再安全,使用不安全的密码算法,有可能为用户的数据带来风险。同时非专业人员实现的密码算法,在技术上未经业界分析验证,有可能存在未知的缺陷,因此应使用通过认证的或业界开源公认的或经评估认可的密码算法库。 + +**示例:**密码算法相关示例请参考3-1。 + +3-5 使用分组密码算法时,应优先选择GCM模式。 + +3-6 使用RSA算法进行加密操作时,应优先选择OAEP填充方式。 + +**说明:**学术界和业界针对RSA的PKCS1填充方式的攻击已经比较成熟,如果不使用OAEP填充替换PKCS1填充,攻击者解密密文的难度将大大降低。 + +3-7 使用非对称运算保护数据机密性时,避免使用私钥加密敏感数据。 + +**说明:**私钥加密无法保护数据的机密性。 + +3-8 使用非对称算法时,加密和签名要使用不同的密钥对。 + +3-9 在同时需要对数据进行对称加密和数字签名时,使用先签名后加密的方式。检查程序里的密码算法函数调用次序,避免对密文的hash值进行签名(即对密文的hash值进行私钥运算)。 + +**说明:**如果对密文签名(即对密文的hash值签名),一旦攻击者可以通过网络嗅探的方式获得密文(也就可以获取密文hash值),就可以任意篡改密文消息的签名。 + +3-10 使用DH算法进行密钥协商的双方在接收到对方发送过来的“公钥”时,应判断公钥是不是0,1,p-1,p这样的特殊值并要求重新发起密钥协商。 + +**说明:**如果使用DH算法进行密钥协商的双方在接收到的对方发送的“公钥是某些特殊值“,则协商出的密钥也一定是某些已知的值。在这种情况下,攻击者可以尝试最多5个可能的密钥就可以轻易的解密密文。 + +3-11 在SSL/TLS中协议中,如使用DH/ECDH算法进行密钥协商,出于前向安全考虑,选取包含DHE或ECDHE密钥交换算法的加密套件,避免选取仅包含DH/ECDH的加密套件。 + +3-12 密码协议中不要使用截短的消息认证码。 + +**说明:**密码协议中(如TLS、SSH、IKE等),使用消息认证码(MAC)验证消息的完整性,协议标准有时支持选取截短的消息认证码。此时,消息认证码安全性也因截短而降低,如针对多种密码协议(如TLS、SSH等)的SLOTH攻击就可以利用截短哈希值构造碰撞。 + +**示例:**截短消息认证码的配置举例:SSH协议中配置HMAC-MD5-96、HMAC-SHA1-96、HMAC-SHA2-256-96 +哈希算法的标准输出长度如下,低于标准长度可视为截短: +1)SHA1/HMAC-SHA1,标准输出长度160比特 +2)SHA224/HMAC-SHA224,标准输出长度224比特 +3)SHA256/HMAC-SHA256,标准输出长度256比特 +4)SHA384/HMAC-SHA384,标准输出长度384比特 +5)SHA512/HMAC-SHA512,标准输出长度512比特 +6)SHA-512/224/HMAC-SHA-512/224,标准输出长度224比特 +7)SHA512/256/HMAC-SHA-512/256,标准输出长度256比特 + +3-13 使用HMAC保护数据完整性时,不能使用hash(key||message)或hash(message||key)的计算结果作为MAC值。 + +**说明:**攻击者可以通过在原始明文后面追加任意信息的方式篡改明文,破坏数据的完整性。 + +3-14 同一笔业务中,若既需要加密运算也需要计算MAC时,加密操作和计算MAC操作不能使用同一个对称密钥。 + +**说明:**如果加密和MAC密钥相同,一旦密钥泄露,攻击者可以有针对性的篡改机密信息。 +3-15 加密时避免使用固定的IV(如:硬编码,或固定在配置文件中)。 + +**说明:**CBC模式的随机IV值可确保相同的明文、相同的密钥加密出的密文完全不同,如果IV无法确保每次加密都不同,对于CBC模式,攻击者可以轻易的进行密文替换攻击;CBC模式之外的其他分组密码运算模式(如:OFB、CRT等),攻击者可以非常容易的解密密文。 + +3-16 密码协议中避免选择匿名认证、无加密、弱身份认证、弱密钥交换、弱对称加密算法和弱消息认证算法的加密算法套件。 + +**说明:**容易造成安全上的薄弱环节从而降低系统的安全性。 + +**示例:**匿名认证举例:TLS_DH_anon_WITH_3DES_EDE_CBC_SHA、TLS_DH_anon_WITH_AES_256_CBC_SHA +弱身份认证举例:密钥长度小于2048比特的RSA/DSA密钥 + +3-17 推荐仅选择使用ECDHE作为密钥交换算法的加密套件。 + +3-18 用于数据加解密的密钥不能硬编码在代码中,应采用根密钥等加密保护,同时根密钥也需采用适当的安全机制进行保护(如仅对部分密钥组件进行硬编码)。 + +**说明:**硬编码密钥容易被逆向分析破解。 + +3-19 功能设计中建议支持工作密钥更新方法(密钥更新方式:手动更新、自动更新等),并规定工作密钥更新规则(在线更新、离线更新、更新时间等)。 + +**说明:**密钥使用时间越长,密钥被破解的风险也越大;密钥加密的数据量越多,攻击者能够获取到密文的数据机会也越大,而对被同一个密钥加密的多个密文进行密码学分析相对比较容易,导致密钥越容易被破解;如果密钥已经泄露,那么密钥被使用的时间越久,损失越大。 + +**示例:**当密钥需要更新时,根据密钥生成的规则,重新生成新密钥,同时使用旧密钥解密已加密的数据,并使用新生成的密钥重新加密,同时销毁旧密钥;对于加密数据量很大的场景,可以考虑保留旧密钥,用于解密旧密钥加密的数据,同时使用更新后的密钥加密新数据。 + +3-20 密钥材料及密钥组件在保存时须限定其权限(如权限600或400)。 + +3-21 对于内存中的密钥,释放前应对保存密钥的内存空间填充其他值。(如:全0)。 + +## 4.敏感数据保护 + +4-1 口令等认证凭据应该加密存储并提供访问控制。 + +4-2 认证凭据不需要还原的场景,应使用PBKDF2等不可逆的算法加密,对于性能敏感且安全性要求不高的场景可使用HMAC(认证凭据,盐值)(注:认证凭据、盐值位置可以互换)。 + +**示例:**1、认证凭据使用PBKDF2算法计算口令单向哈希时,迭代次数最低1000次。 +2、盐值Salt为密码学意义上的安全随机数,由系统随机生成,盐值salt至少16字节,并按用户区分。 +3、避免使用HASH(用户名||口令)、HMAC(用户名,口令)、HASH(口令 XOR salt)。 + +4-3 敏感数据如需通过非信任网络传输,应支持安全传输通道或者将数据加密后再传输的机制。 + +4-4 对敏感数据的访问,根据风险采取适当的安全机制(如认证、授权或加密等)。包含敏感数据的文件(例如,包含敏感数据的配置文件、日志文件、个人敏感数据文件、用户口令文件、密钥文件、证书文件、驱动文件、备份文件)和其目录的权限设置应只允许文件的属主或需要访问该文件/目录的用户拥有相应的权限。 + +4-5 日志、调试信息、错误提示等中应过滤或者屏蔽认证凭据。 + +## 5.系统管理和维护安全 + +5-1 对于系统自身操作维护类的接口的登录认证场景,应综合考虑实际业务场景及风险,采取下述一种或几种保护措施,实现口令防暴力破解机制: +1)锁定帐号; +2)锁定IP; +3)登录延迟; +4)验证码; + +5-2 对于系统自身操作维护类的口令,图形界面缺省不明文显示用户键入的所有口令。 + +5-3 口令输入框不能支持口令拷出。 + +5-4 应使用合适的安全协议,不安全协议应默认关闭。 + +**示例:**安全协议举例:SSHv2/TLS1.2/TLS1.3/IPSec/SFTP/SNMPv3等协议,及其业界最新安全版本。对于流密码算法,建议使用AES的OFB和CTR模式或chacha20流加密算法替换RC4算法。 +不安全协议举例:TFTP、FTP、Telnet、SSL2.0、SSL3.0、TLS1.0、TLS1.1、SNMP v1/v2和SSHv1.x。 + +5-5 基于权限最小化原则,系统新建账号默认不授予任何权限,或者默认只指派最小权限(如:只读权限)的角色。 + +**说明:**保证当授权机制出现问题或授权机制被绕过时非法用户获得的权限也是最少的。 + +## 6.隐私保护 + +6-1 收集或使用个人数据前以及将该个人数据发送给第三方之前,应明确提示用户,并获得用户的同意。 + +**说明:**增加透明性及用户控制能力,满足GDPR等法律法规要求。 + +6-2 正常业务需要的情况下,采集、处理、存储个人数据,应根据实际安全风险提供必要的安全保护机制(如认证、权限控制、日志记录等),以防止个人数据被泄漏、丢失、破坏。 + +6-3 在说明文档中对产品涉及用户隐私的功能进行描述:该功能处理用户个人数据的目的、范围、处理方式、时限。要求使用该功能时遵从当地适用的法律法规。 + +**说明:**增加透明性,满足GDPR等法律法规要求。 + +6-4 对于所涉及的个人数据,应支持在呈现界面上(如显示界面、文件存储/导出等)进行过滤或匿名化或假名化。 + +**说明:**降低个人隐私泄露的风险。 + +6-5 为避免位置追踪,除了有明确的需求之外,不能出于故障定位等维护目的进行用户精确位置信息定位。 + +**说明:**精确位置信息非常敏感,故障定位无需精确定位。 + +6-6 收集个人数据需基于使用目的所必需,满足最小化原则。用于问题定位的日志中记录个人数据遵循最小化原则。 + +**说明:**用于问题定位的日志如果出现个人数据,会引起用户的质疑。应避免打印个人数据,如果必须打印个人数据(如调试目的),必须对个人数据进行匿名化处理。 + +6-7 涉及个人数据处理的场景,需要提供相关机制,确保数据主体能够查询、更新以及删除所有数据主体的个人数据。 + +**说明:**确保数据主体的权利。 + +## 术语说明 + +| 序号 | 术语 | 定义 | +| :--: | :----------: | ------------------------------------------------------------ | +| 1 | 认证凭据 | 认证凭据指用于证明真实性的身份而声明的私有或公共数据。常用的认证凭据有口令、预共享密钥、私钥、snmp团体字、智能卡、动态令牌卡、指纹、虹膜等。 | +| 2 | 个人数据 | 与一个身份已被识别或者身份可被识别的自然人(“数据主体”)相关的任何信息;身份可识别的自然人是指其身份可以通过诸如姓名、身份证号、位置数据等识别码或者通过一个或多个与自然人的身体、生理、精神、经济、文化或者社会身份相关的特定因素来直接或者间接地被识别。个人数据包括:自然人的email地址、电话号码、生物特征(指纹)、位置数据、IP地址、医疗信息、宗教信仰、社保号、婚姻状态等。 | +| 3 | 敏感个人数据 | 敏感个人数据是个人数据的一个重要子集,指的是涉及数据主体的最私密领域的信息或者一旦泄露可能会给数据主体造成重大不利影响的数据。包括种族、政治观点、宗教和哲学信仰、工会成员资格、基因数据、生物信息、健康和性生活状况,还包括可与自然人身份相关联的银行卡号、身份证号、护照号、口令等。敏感个人数据的处理需要更多更严格的保护措施。 | +| 4 | 敏感数据 | 敏感数据的具体范围取决于具体的应用场景,建议根据风险进行分析和判断。典型的敏感数据包括认证凭据(如口令、私钥、动态令牌卡)、加密秘钥、敏感个人数据等 | +| 5 | 数据主体 | 提供个人数据供数据控制者和处理者处理的人。数据主体能够通过个人数据识别,可以通过如姓名等直接识别也可以通过其个人数据的组合而间接识别出。 | +| 6 | 匿名化 | 是对个人数据进行不可逆改变的过程,个人数据匿名化处理后将无法直接或间接地识别数据主体或者识别需要不合理的耗费大量的时间,费用和精力。 | +| 7 | 假名化 | 为了限制通过个人数据来识别数据主体,个人数据中包含的身份信息可以被假名替代。这种替代就是假名化,假名化的两个属性是:(1)和假名相关联的其他属性不足以识别出这些属性关联的数据主体;(2)除假名分配者外,隐私相关方(例如数据控制者)在有限的努力下无法根据假名逆推出数据主体。假名化以后的数据依然属于个人数据。假名化也称作化名。 | +| 8 | 精确位置信息 | 经纬度、如GPS可以限定在几十米之内。精确位置信息的标准是能识别对应到具体的自然人的程度。 | +| 9 | 标准协议 | 本文中提及的“标准协议”指国际标准协议(如ETSI、3GPP、ITU-T等标准组织定义的标准)、区域性标准(如欧盟制定的标准)、国家行业标准(如中国工信部制定的标准)、事实行业标准(如UPnP组织定义的行业标准)。 | + diff --git a/website/docs/_posts/contribute/docs-reviewers.md b/website/docs/_posts/contribute/docs-reviewers.md new file mode 100644 index 0000000000000000000000000000000000000000..96c2e07f5d73ad78bfc8375f959b7018e4fe08a9 --- /dev/null +++ b/website/docs/_posts/contribute/docs-reviewers.md @@ -0,0 +1,48 @@ +--- +title: docs-reviewers.md +permalink: /pages/extra/fd9d91/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# 开发者文档评审人 + +## 文档规范评审人 +### 设备开发相关文档评审人 + +| Feature | Docs Reviewers | +| ------------ | ------------------------------------------------------------ | +| 快速入门 | [@duangavin123](https://gitee.com/duangavin123) | +| 获取源码 | [@duangavin123](https://gitee.com/duangavin123) | +| 内核 | [@Austin23](https://gitee.com/Austin23) | +| 驱动 | [@Qianchenya](https://gitee.com/Qianchenya) | +| 设备开发指南 | [@Austin23](https://gitee.com/Austin23) | +| 移植适配 | [@Austin23](https://gitee.com/Austin23) | +| Bundle开发 | [@Qianchenya](https://gitee.com/Qianchenya) | +| 隐私与安全 | [@Qianchenya](https://gitee.com/Qianchenya) | +| 子系统 | [@Qianchenya](https://gitee.com/Qianchenya) | +| 导读 | [@zengyawen](https://gitee.com/zengyawen) | +| 术语 | [@bj9854](https://gitee.com/bj9854) | +| 社区公共文档 | [@neeen](https://gitee.com/neeen) [@yan-tingting666](https://gitee.com/yan-tingting666) | + +### 应用开发相关文档评审人 + +| Feature | Docs Reviewers | +| ------------ | ----------------------------------------- | +| JS参考规范 | [@zengyawen](https://gitee.com/zengyawen) | +| 媒体 | [@zengyawen](https://gitee.com/zengyawen) | +| 快速入门 | [@ge-yafang](https://gitee.com/ge-yafang) | +| UI | [@ge-yafang](https://gitee.com/ge-yafang) | +| 应用开发导读 | [@zengyawen](https://gitee.com/zengyawen) | +| 网络与连接 | [@RayShih](https://gitee.com/RayShih) | + +## 技术正确性评审人---待补充 + + + diff --git a/website/docs/_posts/contribute/template/faq-template.md b/website/docs/_posts/contribute/template/faq-template.md new file mode 100644 index 0000000000000000000000000000000000000000..eacc167d54e94a93a196a100f7dccec09c6dc41c --- /dev/null +++ b/website/docs/_posts/contribute/template/faq-template.md @@ -0,0 +1,49 @@ +--- +title: faq-template.md +permalink: /pages/extra/03f82c/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# FAQ:标题(简要描述问题关键信息) + +FAQ页面介绍开发过程中遇到的各类问题及解决方法,帮助更多开发者快速消除此类开发障碍。 + +## 简单类问题写作模板 + +简要描述在完成哪些操作时,遇到的问题现象,以及解决方法。 + +## 复杂类问题写作模板 + +**现象描述** + +- 使用的系统软件、硬件版本? +- 在完成哪些操作时,遇到了什么样的问题? + +- 可能显示什么错误消息? + +- 如果可能,请提供屏幕截图。 + + +**可能原因** + +分析哪些原因导致此问题,如果有多个原因,请使用项目列表一一列举。 + +1. XXX +2. XXX + +**处理步骤** + +- 如果有多个解决方案,请按照复杂性排序,并提供什么场景下选择哪种解决方案。 +- 如果可能,请提供屏幕截图,帮助理解步骤完成标准。 +- 代码如有打印输出,请提示打印输出内容_,帮助理解步骤完成标准_。 + +1. XXX +2. XXX + diff --git a/website/docs/_posts/contribute/template/tutorial-template.md b/website/docs/_posts/contribute/template/tutorial-template.md new file mode 100644 index 0000000000000000000000000000000000000000..8ae8cc438664607a6fee412ad01416bf216aea0b --- /dev/null +++ b/website/docs/_posts/contribute/template/tutorial-template.md @@ -0,0 +1,61 @@ +--- +title: tutorial-template.md +permalink: /pages/extra/7ba326/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# 教程:标题(对应的任务名称) + +教程页面介绍如何完成一个复杂的任务开发、功能开发、APP开发。通常教程页面会将开发过程拆解为多个小节,每个小节由一系列步骤组成。同时,教程中一般需要提供代码示例并进行介绍,便于用户了解具体的功能实现。 + +对于教程中可能涉及到的基本概念,简单的概念可以直接介绍,更深度的概念和主题推荐查阅文档对应专题。 + +撰写教程页面时,在“others“目录下面创建新的MarkDown文件。 + +## 总览 + +_写作内容:介绍开发者学习本教程后将完成什么样的任务,实现什么样的功能和效果。__例如,可以是移植教程、实现一个功能开发教程等。_如果可实现多个目标,建议使用项目符号列表。 + +_如果可能,请提供图片或短视频展示实现效果。_ + +## 开发准备 + +- _完成该功能需要的软件、硬件、工具及对应版本信息。_ +- _需要获取的相关权限说明。_ + +## XXX(关键任务一) + +_将教程分解为几个顺序的关键任务或并列不同的场景任务。_ + +1. XXXX。 + + ``` + //代码示例 + ``` + +2. XXXX。 + +_所有的操作步骤,遵循如下写作要求:_ + +1. _步骤明确操作场景和目的,__步骤中执行的主体要描述清楚。_ +2. _步骤中如果涉及接口调用,需要清晰给出使用的接口及其使用说明,示例代码。_ +3. _涉及到工具界面的步骤,可以提供界面截图,帮助理解步骤完成标准。_ +4. _保证代码的逻辑和语法的正确性。_ +5. _代码中关键步骤要有注释说明。_ +6. 代码如有打印输出,请单独提示打印输出内容_,帮助理解步骤完成标准_。 + +## XXX(关键任务二) + +1. XXXX。 + +## 下一步 + +介绍本教程可能关联的后续开发任务,如果没有请删除此内容。 + diff --git "a/website/docs/_posts/contribute/\347\254\254\344\270\211\346\226\271\345\274\200\346\272\220\350\275\257\344\273\266\345\274\225\345\205\245\346\214\207\345\257\274.md" "b/website/docs/_posts/contribute/\347\254\254\344\270\211\346\226\271\345\274\200\346\272\220\350\275\257\344\273\266\345\274\225\345\205\245\346\214\207\345\257\274.md" new file mode 100644 index 0000000000000000000000000000000000000000..53f59a61d05109e9e2b210196e5a94de45c6d6bb --- /dev/null +++ "b/website/docs/_posts/contribute/\347\254\254\344\270\211\346\226\271\345\274\200\346\272\220\350\275\257\344\273\266\345\274\225\345\205\245\346\214\207\345\257\274.md" @@ -0,0 +1,232 @@ +--- +title: 第三方开源软件引入指导.md +permalink: /pages/extra/2ef3d6/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# 第三方开源软件引入指导 + +## 目的 + +OpenHarmony遵从 [Open Source Definition](https://opensource.org/docs/osd) ,满足这一定义的软件,被OpenHarmony社区认同为开源软件。 +提供易用、高质量的开源软件是OpenHarmony的重要目标,因第三方开源软件数量多,而社区开发人员同样数量多、分布广,为确保OpenHarmony项目的整体质量,特别拟定本指南,供社区贡献者参考。 + +## 范围 + +本指导适用于所有引入到OpenHarmony项目中的第三方开源软件。 + +## 本文的改进和修订说明 + +1. 本文档由OpenHarmony SIG-QA主导起草和维护。本文档的最新版本总可以在 [这里](https://gitee.com/openharmony/docs/blob/36955109ed21d73afe09fcb5a5bc7067ad6ce18b/zh-cn/contribute/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6%E5%BC%95%E5%85%A5%E6%8C%87%E5%AF%BC.md) + 找到。 +2. 任何对于本文中涉及的规则的增加,修改,删除都必须被追踪,请进入该追踪系统 。 +3. 最终规则经过社区充分的讨论后,由PMC评审定稿。 + +## 软件引入与引入原则 + +### 什么是软件引入 + +一个软件的引入指的是为满足OpenHarmony中指定SIG的业务需求,申请将其引入到OpenHarmony项目中,具体的流程请参考的[SIG管理章程](https://gitee.com/openharmony/community/tree/master/sig) 进行具体的开源软件引入,并确保整个引入的过程都必须可被追踪。 + +### 软件引入的基本要求 + +为便于第三方开源软件的维护与演进,在引入第三方开源软件时请参考如下原则: + +1. 软件必须有明确的来源,引入到OpenHarmony的软件必须有清晰定义的上游社区。 +2. 必须有明确的引入理由,若需要引入的软件在OpenHarmony项目中已存在,请重用该版本,避免多版本共存增加维护的复杂性。 +3. 软件应该以源码方式引入,原则上二进制不应该被引入,应从源码构建。如果需要引入二进制,经由PMC评审后决定。 +4. 软件应该在OpenHarmony上可以被正确构建,若该软件有尚未被引入的依赖软件,或者软件的运行或者构建依赖一个不能引入OpenHarmony的组件,需由PMC评审后决定。 +5. 引入软件到OpenHarmony项目中必须将其放置到单独的代码仓或独立的目录,命名统一为third_party_软件名称,其中软件名称和其官网保持一致。 +6. 应当完整保留引入软件的官方代码仓目录结构、许可证及Copyright信息,不要修改第三方开源软件的原始许可证与Copyright信息。 +7. 不建议引入未发布正式版本(如只发布Beta版本)的开源软件。 +8. 不能引入有高危漏洞且无解决方案的版本。 +9. 若需针对引入的开源软件进行修改,请将修改的代码放在该开源软件仓中,并确保满足该开源软件的许可证要求,修改的文件应当保持其原始许可证条款,新增的文件也建议采用相同的许可证条款。 +10. 新引入的开源软件必须在其根目录提供README.OpenSource文件,在该文件中准确描述其软件名、许可证、许可文件位置、版本、对应版本的上游社区地址、软件的维护Owner、功能描述以及引入的原因。 +11. 引入新软件到OpenHarmony时必须有对应的SIG负责管理,原则上如果没有SIG-QA以及相应SIG的确认,PMC不批准相应软件的引入。当要批量引入多个软件时,可以求助PMC主持发起SIG间的临时评审会议,提升协调效率。 如因特殊原因不能满足上述要求但又需要引入,请请联系邮箱:law@openatom.org。 + +### 软件引入流程 + +#### 软件引入前检查 + +| 检查项 | 说明 | +| :----- | :----- | +| 归一化 | 1、检查该软件在OpenHarmony中是否已存在,原则上一款软件只在OpenHarmony中引入一次。 | +| 来源可靠 | 1、应该从开源软件官网获取或官网指定的代码托管地址获取。 | +| 社区活跃 | 1、软件来自知名社区或组织,社区或组织通过发布公告、修改软件仓库状态、将仓库放到特定目录下等方式告知停止维护的,不建议引入。
2、软件来自个人、小型社区或组织,两年内未发布版本(含正式版本与测试版本),无明确版本计划,社区提交了有效的Bug或PR,但是半年以上未响应的,不建议引入。
3、社区运营状态不明确,通过Issue 或者邮件等方式询问社区是否继续维护,半年以上未响应或者答复停止维护的,不建议引入。| +| 安全漏洞 | 1、检索业界已知公开的安全漏洞,如有高危漏洞需要有应对方案。| +| 规范化软件名称 | 1、 仓库命名统一为third_party_软件名称,其中软件名称和其官网保持一致。
2、 不允许以软件的子模块作为软件名。
3、 当软件存在多个语言的开发库时,可在其官方命名前追加python-等前缀予以规范化管理。 | +| 官网信息 | 1、在申请引入请求中准确描述该软件官方网址,如无正式官网则提供主流代码托管商上面对应的项目网址,不能使用maven、mvnrepository、springsource等托管库地址。
2、必须同时提供要引入版本的官方源代码包下载地址,以达到可溯源,如需要二进制包,请提供官方的二进制包下载地址。 | +| License检查 | 1、待引入软件是否有license。
2、入库的License是否和官网对应版本的License保持一致。
3、高风险license的开源软件谨慎引入,在引入前请充分评估并在申请时附上分析结论。 | + +#### 提交申请 + +如需要引入新的软件,请参考[SIG管理章程](https://gitee.com/openharmony/community/tree/master/sig) 进行具体的开源软件引入,并在申请材料中包含如下内容: + +1、自检表 + +| 检查项 | 填写指导 | 自检结果示例 | +| :----- | :----- | :----- | +| 软件名 | 描述该软件官方名称以及引入后的仓名,仓名统一为third_party_加上官方软件名称 | third_party_softwarename | +| 软件官网地址 | 描述该软件官方网站链接地址 | https://softwaresite | +| 软件版本号 | 描述该软件要引入的版本号,版本号为其社区正式发布的版本号,不要随意修改;未正式发布的版本不建议引入 | 1.0.0 | +| 软件版本发布日期 | 描述该软件要引入的版本的社区发布日期 | 2021.01.01 | +| 软件版本地址 | 描述该版本的官方下载链接地址,注意该地址必须为能定位到该具体版本发布包的下载URL | https://gitee.com/softwarecodesite/v1.0.0.zip | +| 软件许可证 | 描述该版本的官方许可证名称及许可证文件的相对路径,如果是多许可证要完整描述,并说明各许可证的关系,如是And还是Or,或者是不同目录对应不同许可证 | Apache-2.0 | +| 软件生命周期 | 描述该软件是否有LTS版本,多长时间发布一个版本,最近一年社区代码提交及Issue解决情况,是否有告知停止维护或演进 | 无LTS版本,6个月发布一个版本,近6个月有10次代码提交 | +| 软件安全漏洞 | 描述该软件存在的业界公开的安全漏洞列表,包括漏洞号、级别、漏洞链接地址、是否已有补丁或解决方案 | 无业界公开漏洞 | +| 业务场景 | 描述该软件被哪些仓使用,解决什么业务场景的问题 | 被XX仓静态链接使用,提升YYY能力 | +| 归一化 | 描述社区是否已有此软件或类似软件,业界类似软件有哪些,为什么要新引入该软件或该版本 | 本社区还未引入此软件,业界相似软件有B、C,只有本软件许可证友好,且该软件生态较好,X、Y等公司也在使用 | +| 许可证兼容性 | 1、描述使用该软件有哪些进程,各进程的许可证是什么,与要引入软件的许可证是否兼容。
2、使用OAT工具扫描要引入软件的源代码,申请时附上OAT工具生成的扫描报告(扫描问题应当清零)、LicenseFile.txt内容 | 1、此软件在用户态X进程中,静态链接使用,该进程的许可证为Apache-2.0,与该软件许可证一致,无兼容性问题;
2、OAT工具扫描生成的Result.txt, LicenseFile.txt内容
| +| 责任人 | 描述该软件引入到本社区后的SIG名称及维护责任人的Gitee用名及邮箱 | SIG XXX,Zhangsan,Zhangsan@xyz.com | + +说明: + +- OAT工具的使用方式请参考 https://gitee.com/openharmony-sig/tools_oat ,如对工具有改进建议请直接在社区提交ISSUE,也可Fork下来完善工具并提交PR。 +- OAT报告原则上应当是清零,格式如下: + +``` +Invalid File Type Total Count: 0 +License Not Compatible Total Count: 0 +License Header Invalid Total Count: 0 +Copyright Header Invalid Total Count: 0 +No License File Total Count: 0 +No Readme.OpenSource Total Count: 0 +No Readme Total Count: 0 +``` + +- LicenseFile.txt位于OAT工具运行目录的log目录下,此文件记录扫描目录下所有疑似许可证的文件,格式如下: + +``` +third_party_abcde/ LICENSEFILE LICENSE Apache-2.0 +third_party_abcde/doc/ LICENSEFILE LICENSE Apache-2.0 +``` + +2、OAT.xml文件 + +请参考 https://gitee.com/openharmony-sig/tools_oat/blob/master/README_zh.md ,完成OAT扫描问题确认及OAT.xml文件配置,申请中附上此文件内容(如果无任何需确认问题则无需配置)。 + +3、该仓的README.OpenSource文件内容,格式如下: + +``` +[ + { + "Name": "softwarename", + "License": "Apache-2.0", + "License File": "LICENSE", + "Version Number": "1.0.0", + "Owner": "Zhangsan@xyz.com", + "Upstream URL": "https://gitee.com/softwarecodesite/v1.0.0.zip", + "Description": "...." + }, + { + ... + }//如有多个许可证,请一一列举 +] +``` + +#### PMC评审 + +参考[SIG管理章程](https://gitee.com/openharmony/community/tree/master/sig),PMC会根据收到的PR统一安排SIG申请评审以及建仓。 + +### 第三方开源软件许可证要求 + +1. 第三方开源软件许可证类型必须是[OSI](https://opensource.org/osd-annotated) 明确定义的。 +2. 第三方开源软件许可证必须与使用该开源软件的代码仓许可证兼容。 +3. 如下类型许可证可以引入到OpenHarmony项目中: + +* Apache License 2.0 +* Mulan Permissive Software License, Version 2 +* BSD 2-clause +* BSD 3-clause +* DOM4J License +* PostgreSQL License +* Eclipse Distribution License 1.0 +* MIT +* ISC +* ICU +* University of Illinois/NCSA +* W3C Software License +* zlib/libpng +* Academic Free License 3.0 +* Python Software Foundation License +* Python Imaging Library Software License +* Boost Software License Version 1.0 +* WTF Public License +* UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE +* Zope Public License 2.0 + +4. 如下类型许可证不建议引入到OpenHarmony项目中: + +* GNU GPL 1, 2, 3 +* GNU Affero GPL 3 +* GNU LGPL 2, 2.1, 3 +* QPL +* Sleepycat License +* Server Side Public License (SSPL) version 1 +* Code Project Open License (CPOL) +* BSD-4-Clause/BSD-4-Clause (University of California-Specific) +* Facebook BSD+Patents license +* NPL 1.0/NPL 1.1 +* The Solipsistic Eclipse Public License +* The "Don't Be A Dick" Public License +* JSON License +* Binary Code License (BCL) +* Intel Simplified Software License +* JSR-275 License +* Microsoft Limited Public License +* Amazon Software License (ASL) +* Java SDK for Satori RTM license +* Redis Source Available License (RSAL) +* Booz Allen Public License +* Creative Commons Non-Commercial +* Sun Community Source License 3.0 +* Common Development and Distribution Licenses: CDDL 1.0 and CDDL 1.1 +* Common Public License: CPL 1.0 +* Eclipse Public License: EPL 1.0 +* IBM Public License: IPL 1.0 +* Mozilla Public Licenses: MPL 1.0, MPL 1.1, and MPL 2.0 +* Sun Public License: SPL 1.0 +* Open Software License 3.0 +* Erlang Public License +* UnRAR License +* SIL Open Font License +* Ubuntu Font License Version 1.0 +* IPA Font License Agreement v1.0 +* Ruby License +* Eclipse Public License 2.0: EPL 2.0 + +如要引入其它类型License或上述(4)所列License,请联系邮箱:law@openatom.org。 + +## 软件退出与退出原则 + +### 什么是软件退出 + +1. 一个软件的退出指的是一个软件(项目)申请从OpenHarmony项目中删除,依照本文件描述的规则讨论,最终在OpenHarmony中移除的过程。 +2. 该软件相关的SIG负责申报议题到PMC评审,管理软件退出。 + +### 软件退出原则 + +当满足以下两个条件时,OpenHarmony中软件的退出申请可以被立即执行,对应文件将从项目中直接删除。 + +1. 软件的License变化,或者其他法律法规影响了目前正在使用的版本,导致OpenHarmony因为法务风险,不能继续集成该软件。 +2. 存在恶意代码或严重安全隐患且OpenHarmony社区无能力修复的,要求软件被立即移除。 + +除以上描述两种场景外,其它场景OpenHarmony对软件的退出实行过程化管理: + +1. 随着技术演进与发展,软件因技术陈旧或架构落后,不能满足现有的应用场景被其他更优秀的软件所取代。 +2. OpenHarmony已经集成的版本过于老旧,且软件新版本License或其他法律法规限制导致OpenHarmony不能升级新版本。 +3. 软件来自知名社区或组织,社区或组织通过发布公告、修改软件仓库状态、将仓库放到特定目录下等方式告知停止维护的。 +4. 软件来自个人、小型社区或组织,两年内未发布版本(含正式版本与测试版本),无明确版本计划,社区提交了有效的Bug或PR,社区半年以上未响应的。 +5. 社区运营状态不明确,通过Issue或者邮件等方式询问社区是否继续维护,社区半年以上未响应或者答复停止维护的。 + +如果软件符合以上任何一条退出条件,PMC与相应SIG首先分析该软件在当前OpenHarmony社区中被依赖、被使用的情况。 + +1. 如果OpenHarmony中存在依赖关系,且短时间内不能解除,我们建议SIG新建分支代码仓,并主动进行社区维护动作。 +2. 如果OpenHarmony中不存在依赖关系,或者短时间内可以解除,则责任SIG将软件从OpenHarmony正式发行中移出,并在相应的Release Notes中说明移除的原因及影响。 \ No newline at end of file diff --git "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/05.\350\264\241\347\214\256\346\226\207\346\241\243.md" "b/website/docs/_posts/contribute/\350\264\241\347\214\256\346\226\207\346\241\243.md" similarity index 68% rename from "website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/05.\350\264\241\347\214\256\346\226\207\346\241\243.md" rename to "website/docs/_posts/contribute/\350\264\241\347\214\256\346\226\207\346\241\243.md" index 6ff9ea02f883faebb9714cd58770937a9101fe6f..59bc711a1e20239a37081fc2199f9dec449d33e0 100644 --- "a/website/docs/01.\346\226\207\346\241\243/15.\350\264\241\347\214\256\346\214\207\345\215\227/05.\350\264\241\347\214\256\346\226\207\346\241\243.md" +++ "b/website/docs/_posts/contribute/\350\264\241\347\214\256\346\226\207\346\241\243.md" @@ -1,15 +1,15 @@ --- -title: 贡献文档 -permalink: /pages/000e04 +title: 贡献文档.md +permalink: /pages/extra/678153/ navbar: true -sidebar: true -prev: true -next: true -search: true -article: true +sidebar: false +prev: false +next: false +search: false +article: false comment: false editLink: false -date: 2021-12-30 12:57:47 +date: 2021-12-30 18:17:45 --- # 贡献文档 @@ -18,7 +18,7 @@ date: 2021-12-30 12:57:47 卓越贡献者将会在开发者社区文档贡献专栏表彰公示。 - [贡献方式](#section5723203852414) -- [写作规范](/pages/000e05) +- [写作规范](/pages/000c0400) ## 内容版权 @@ -32,45 +32,52 @@ date: 2021-12-30 12:57:47 ## 贡献方式 -## 简单更改 +### 反馈文档问题 + +高质量的问题反馈有助于我们不断完善文档内容和质量,您提供的信息越详尽,对我们问题改进越有帮助。 + +1. 在Gitee页面中,“Issue“页签中单击“新建Issue“,在标题栏中描述问题,在编辑框中添加详细问题描述。 +2. 单击“创建“按钮,提交Issue,耐心等待文档团队成员确认您的问题。 + +>![](/images/contribute/public_sys-resources/icon-note.gif) **说明:** +>**如何反馈一个高质量的问题?** +> +>- 提供问题的清晰描述,描述具体缺失、过时、错误的内容或者需要改进的文字。 +>- 解释该问题对用户的影响。 +>- 将给定问题的范围限定在一个具体内容、任务。如果问题牵涉的领域较大,可以将其分解为多个小一点的问题。例如:"文档需要优化" 是一个过于宽泛的问题,而 "XX开发指南缺少对XXX步骤的介绍" 就是一个足够具体的、可操作的问题。 +>- 搜索现有问题的列表,查看是否已经有相关的或者类似的问题已被记录。 +>- 如果新问题与某其他问题或 PR 有关联,可以使用其完整 URL 或带 \# 字符的 PR 编号 来引用它。 + +### 简单更改 针对现有文档进行快速更改和修复,适合少量内容修改和补充。 1. 在文档页面右上角单击“编辑“按钮即可跳转到对应的Gitee工程源文件页面。 -2. 在Gitee源文件md页面中,单击“编辑“按钮,在对应内容处完成更改、修复。 +2. 在Gitee源文件md页面中,在对应内容处完成更改、修复。 3. 修改完成后,可单击“预览“按钮,确认修改结果。 -4. 确认无误后,在“扩展信息框“中填写修改意见和补充信息、sign-off-by邮箱信息触发DCO校验,单击提交审核。 +4. 确认无误后,在“扩展信息框“中填写修改意见和补充信息、Signed-off-by邮箱信息触发DCO校验,单击提交审核。 - 例如:Signed-off-by: NEEN < XXX@XX.com > //与DCO签署邮箱保持一致 + 例如:Signed-off-by: user.name //与DCO签署邮箱保持一致 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0625/095714_92d8e459_7756659.png "屏幕截图.png") 文档团队成员将评审并合并您的修改内容,感谢您对OpenHarmony文档的支持和帮助。 -更多内容可参考[贡献流程](/pages/000e06)。 - -## 反馈文档问题 +更多内容可参考[贡献流程](/pages/000c03)。 -高质量的问题反馈有助于我们不断完善文档内容和质量,您提供的信息越详尽,对我们问题改进越有帮助。 +### 为发行版本贡献文档 -1. 在Gitee页面中,“Issue“页签中单击“新建Issue“,在标题栏中描述问题,在编辑框中添加详细问题描述。 -2. 单击“创建“按钮,提交Issue,耐心等待文档团队成员确认您的问题。 +为了帮助开发者更高效使用OpenHarmony社区的每个Release版本,社区会根据每个版本规划的需求特性提供配套文档(如指南、API参考、开发示例、Release Notes、API Changelog、FAQ等)。有的需求涉及新增功能特性和文档,有的需求的是对现有特性和文档内容更新。 ->![](/images/zh-cn/contribute/public_sys-resources/icon-note.gif) **说明:** ->**如何反馈一个高质量的问题?** ->- 提供问题的清晰描述,描述具体缺失、过时、错误的内容或者需要改进的文字。 ->- 解释该问题对用户的影响。 ->- 将给定问题的范围限定在一个具体内容、任务。如果问题牵涉的领域较大,可以将其分解为多个小一点的问题。例如:"文档需要优化" 是一个过于宽泛的问题,而 "XX开发指南缺少对XXX步骤的介绍" 就是一个足够具体的、可操作的问题。 ->- 搜索现有问题的列表,查看是否已经有相关的或者类似的问题已被记录。 ->- 如果新问题与某其他问题或 PR 有关联,可以使用其完整 URL 或带 \# 字符的 PR 编号 来引用它。 +欢迎开发者参与贡献,详细参考:[为发行版本贡献文档](/pages/000c0401) -## 创建新内容 +### 贡献经验分享内容 鼓励开发者在学习、开发过程中,总结经验并创建技术内容帮助更多开发者快速上手。推荐输出各类How to教程、常见问题FAQ等。请参考如下写作模板: -- [How to教程](/pages/extra/54a97b/) -- [FAQ](/pages/extra/95f10b/) +- [How to教程](/pages/extra/7ba326/) +- [FAQ](/pages/extra/03f82c/) 内容写作模板归档在Docs文档仓下contribute文件夹中。 diff --git a/website/docs/_posts/design/API-Review-Template.md b/website/docs/_posts/design/API-Review-Template.md new file mode 100644 index 0000000000000000000000000000000000000000..fba9ef2dc92b62854f9b277afdb248a8e27adb6c --- /dev/null +++ b/website/docs/_posts/design/API-Review-Template.md @@ -0,0 +1,150 @@ +--- +title: API-Review-Template.md +permalink: /pages/extra/5f7b0a/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# OpenHarmony xxx子系统 xxx API评审申请 + +## 背景 + +* API类型:[Public API | Test API| HDI] +* API需求来源: +* API使用场景: +* API所属子系统: +* API预计发布版本: +* Contributor: +* 本次评审涉及的API数量: + +| 类型 | 数量 | 编程语言 | +|---|---|---| +| 新增 | | | +| 行为变更 | | +| 废弃 | | | +| 删除 | | | + +## API说明 + +### 必要性说明 + +> 现状与差距分析。API的使用场景和价值是什么? + +### 总体特性说明 + +> 相关API完成了哪些功能特性。 + +## 评审结论 + +### Committer评审结论 + +### 领域SIG评审结论 + +## 自查表 + +| 自查项 | 自查结果 | +|---|---| +| 是否已完成拼写检查? | | +| 是否遵循了编码规范? | | +| 词性使用是否正确(名词,形容词,副词)? | | +| 命名是否完整表述了API所做的全部逻辑?| | +|API的参数数量是否合理?(通常少于7个)| | +|是否合理使用了缩写?(缩写是大家周知的)| | +|void类型API是否真的考虑过调用者不需要返回值?| | +|是否考虑过继承体系是合适的?父类的每一个方法都适用于子类| | +|已定义的错误状态是否完备?| | +| 命名是否正确使用了对仗词:
add/remove, create/destroy, insert/delete, start/stop, begin/end,
send/receive, up/down, show/hide, open/close, source/target,
source/destination, increase/decrease, first/last, next/previous | | +|新增API与同模块既存API表述和语义层次是否一致?| | +| 同步API是否需要提供异步版本? | | +| 是否每一个public API都真的是开发者需要的?| | + +## API接口及说明 + +> 请填写代码的提交地址。 + +* 代码地址: + +## API权限设计 + +> 使用该接口是否需要申请相应的权限。 + +## API隐私保护设计 + +> 涉及用户隐私,需要考虑隐私保护。 + +## 开发者指南 + +> 可选。 + +## API代码示例 + +> 二选一即可。 + +* 代码地址: +* 代码片段: + +## API变更说明 + +> 新增接口不需要填写此章节。 + +### 行为变更 + +> API行为变更是指API的接口没有发生变化,仅仅是行为发生变化。 +> API行为变更需要在新的API版本上进行,不允许破坏旧版本API行为(除非是缺陷修复)。 + +#### 相关接口 + +#### 变更原因 + +### 废弃接口 + +> 废弃接口的API说明中,需要添加`@deprecated`注解进行(包括:JS/TS/C/C++接口)标记。 + +#### 相关接口 + +> 需描述从哪个版本开始标记为废弃。 + +#### 废弃原因 + +#### 替代接口 + +> 如果有则提供,如果无则说明原因。 + +### 删除接口 + +> 接口不允许直接删除,需要在标记废弃之后经过5个API版本才允许删除。 + +#### 相关接口 + +#### 删除原因 + +#### 替代接口 + +> 如果有则提供,如果无则说明原因。 + +## DFX + +### 兼容性 + +### 性能 + +### 功耗 + +### 可靠性 + +### 可测试性 + +> API必须同步交付API自动化测试用例,用例100%覆盖API接口。 + +## 评审结论 + +* 评审时间: +* 与会人: +* 评审结论:[通过|不通过] +* 评审会议纪要: \ No newline at end of file diff --git a/website/docs/_posts/design/OpenHarmony-API-governance.md b/website/docs/_posts/design/OpenHarmony-API-governance.md new file mode 100644 index 0000000000000000000000000000000000000000..c6cc1b678ab9a6acfcfd742979996e4b532986ce --- /dev/null +++ b/website/docs/_posts/design/OpenHarmony-API-governance.md @@ -0,0 +1,218 @@ +--- +title: OpenHarmony-API-governance.md +permalink: /pages/extra/c065b3/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:45 +--- +# OpenHarmony API治理章程 + +## 总览 + +为了引导OpenHarmony生态健康、有序发展和演进,本章程对OpenHarmony API的新增、变更、废弃、删除等生命周期与治理流程进行约束,同时定义了基本的API设计要求。 + +本章程由[API SIG](https://www.openharmony.cn/SIG/api/)制定,经[PMC](https://www.openharmony.cn/community/pmc/)批准发布;本对章程的修订必须经由API SIG评审后,由PMC批准发布。 + +## 概述 + +### 范围与定义 + +OpenHarmony软件栈中包含了多个角色,因此API也分作多种类型。 + + + +不同的API类型其兼容性要求也不一样,具体如下表所述: + +| 类型 | 提供者 | 使用者 | 兼容性要求 | 看护手段| +|---|---|---|---|---| +| Public API | 系统与框架 | 所有应用开发者 | 5个API版本| XTS| +| Test API | 测试框架 | 所有应用开发者| 3个API版本| 待构建 | +| System API | 系统与框架 |系统应用开发者 |不承诺| 待构建 | +| HDI | HDF| 系统服务 | 4个API版本| XTS | +| Driver API | HDF | 驱动开发者 | 不承诺 | 无 | +| Inner API | 系统部件 | 系统部件 | 不承诺 | 无 | + +各类型API说明如下: + +* Public API:OpenHarmony对所有应用开发者公开的API。 +* Test API:测试专用的API,供开发者使用。 +* System API:提供给系统特权应用使用的API,普通应用无法使用。 +* HDI:描述硬件能力的接口。 +* Driver API:提供给驱动开发者使用的接口。 +* Inner API:系统服务和框架实现彼此调用的API,仅供系统内部使用,不承诺兼容性。 + +### API与编程语言 + +OpenHarmony的目标是构建面向万物互联时代的新一代操作系统,其实现涵盖但不限于以下编程语言: + +* C/C++ +* JavaScript +* TypeScript + +本章程所描述的内容与编程语言无关。即:在不违反编程语言要求的情况下,API不分编程语言都要遵守章程的要求。 + +## API治理 + +### 角色与职责 + +|**涉及角色**|**API治理中的职责**| +| - | - | +|Contributor|API的设计和交付主体,负责API相关的代码与设计文档提交。| +|Committer|API相关的代码评审,涉及API提交预审。| +|领域SIG| 新增API相关的代码提交评审,领域SIG评审通过即可合入。
变更API相关的代码提交预审。| +|API SIG|变更API相关的代码提交评审。| +|PMC|API Version计划发布、API治理章程修订评审发布等。| + +### API评审流程 +API评审流程如下: + + + +主要过程说明: + +1. API评审申请、代码提交(Owner:Contributor),所有涉及API新增或变更需同步提交相应的API评审文档,详细说明API的需求来源、场景与使用方法、权限设计、隐私保护澄清等,详见后面的API评审申请要素。为避免后续的返工,Contributor可以在正式的API评审申请、代码提交之前,先通过邮件方式将API设计文档提交Committer、领域SIG、API SIG等相关人员预审。 +1. 代码评审(Owner:Committer),代码评审和API预审,涉及API提交Code Review通过后,还需要进一步领域SIG评审。如果单次提交同时涉及多个领域的API新增或变更,相应的API评审申请和代码需要同时提交给相关领域的Committer评审,只有所有对应领域的Committer都完成CodeReview后才能进入下一评审环节。 +1. API评审(Owner:领域SIG),新增API相关的代码提交评审,领域SIG评审通过即可代码合入;变更API相关的代码提交,领域SIG评审通过后,还需要进一步提交API SIG。如果单次提交同时涉及多个领域的API新增,相应的API评审申请和代码需要同时提交给相关领域的SIG评审,只需一个领域SIG评审通过即可代码合入。如果单次提交同时涉及多个领域的API变更,相应的API评审申请和代码需要同时提交给相关领域的SIG评审,只有所有对应领域的SIG都要评审通过才能进入下一评审环节。 +1. API变更评审(Owner:API SIG),变更API相关的代码提交评审,评审通过即可代码。 +1. 评审完成。 + +### API评审申请要素 + +如果涉及API新增或变更需同步提交相应的API评审文档。API评审文档使用[《OpenHarmony API 评审模板》](/pages/extra/5f7b0a/)描述。 + +针对新增API,需要包含如下要素: +1. 需求来源与使用场景(必须)。 +1. API现状与差距分析,说明API新增或变更的必要性(必须)。 +1. API原型设计与使用方法说明(必须);必要时,可以进一步包含相应的使用样例(可选)。 +1. API权限设计(必须)。 +1. API隐私保护方案与要求满足情况澄清(必须); +1. 提交代码的同时提交相应的API参考(必须);必要时,可同步提交相应的开发者指南文档(可选)。 +1. 兼容性/性能/功耗/可靠性/测试等相关情况说明(可选,如不满足本章程 “API设计要求”,则必须包含相关说明)。 + +针对变更API,需要额外包含如下要素: +1. 针对老接口的处理方式(废弃、隐藏或彻底删除)以及对使用老SDK开发应用的兼容措施(必须); +2. 变更影响、替代接口和相应的应用适配方案(必须)。 +3. 刷新ChangeLog(必须) 和 API-diff文档(涉及JS/Native API变更,必须)。 + +## API设计要求 + + +### 一致性要求 +1. 概念一致性:基于场景的业务模型抽象,形成OpenHarmony的连贯、一致、自恰的用户程序模型和业务概念。 +1. 术语一致性:相应的业务术语必须采用统一名词,不允许使用多个语意接近的名词表示同一个业务对象;同样地,为了避免产生混淆,也不允许针对不同的业务对象使用相同的名词或语言接近的名词。 +1. 操作一致性:相同的操作动作必须采用同一动词。 +1. 参数顺序一致性:相同参数/参数序列在多个API中的位置和顺序保持一致。 +1. 机制及算法一致性:通信机制、调用模式、认证机制、加密算法等保持一致。 +1. 帮助、Demo、模板风格一致性:排版、用法等保持一致。 + +### 易用性要求 +以“能力使用者”视角,而不是“能力提供者”视角设计API: +1. 可理解:API命名和功能特性必须容易理解。 +1. 易使用:提供简单易用的API,减少API之间不必要的耦合,避免多个无之间关联关系API之间调用顺序的依赖,尽可能使调用者优雅,尽量避免使用单一功能时必须同时组合调用多个包/模块或类中的多方法才能实现。 +1. 避免误导:提供使用者期望的能力,避免误导,减少误用。 +1. 提供必要的API文档。 + +### 命名要求 +1. 能清晰的表达意图:使用完整的描述性的单词。 +1. 避免造成误导:有误导的名字比表达不清的名字还要有危害性。 +1. 词义清晰明了,避免使用info,data,object等一般意义的词。 +1. 作用域越大,命名应越精确。 +1. 不用或少用缩写,业界通用术语遵从行业习惯允许使用缩写。 +1. 包名/模块名/命名空间前缀约定: + 1. JS API 统一模块名:@ohos.\*。 + 2. Native API 统一命名空间:namespace OHOS.\*。 + 3. 引用外部开源代码的,可以保留原包名/模块名/命名空间,也可以按照上述规则对包名统一进行替换。 +1. 包名/模块名/命名空间最短不少于2段,最长不超过4段;每一段建议使用一个单词,最长不超过2个单词。 +1. 类名、方法名/函数名、成员变量、变量名最多不超过4个单词。 + +### 权限控制要求 +1. 完备性原则:一切穿透应用沙箱的行为都需考虑使用权限来管控。 +1. 最优粒度原则:一个权限只保护一类对象;一个接口仅需申请一个权限即可访问。 +1. 清晰完整原则:权限定义中必须清晰说明保护对象、开放范围、敏感级别。 +1. 最小开放原则:一个权限仅对确有正当业务需求的应用开放,开放控制可通过权限来实现。 + +### 隐私保护要求 +1. API调用的返回仅包含必要的内容, 避免携带额外信息。 +1. API调用不允许获取、手机用户个人数据, 除非通过用户权限管控、由用户授权同意。 +1. API涉及跨应用调用时,如涉及个人数据向被调用者的披露,由调用方在隐私声明中说明披露的数据类型、数据接收者和数据使用目的。 +1. API涉及到用户敏感数据(如电话、通讯录、媒体等)访问时,需要使用system picker的机制,禁止API通过申请敏感权限方式访问。 +1. API开放禁止捆绑与所开放能力不相关的功能。 + +### 文档化要求 +1. API参考采用英文方式交付。 +1. 模块/包模块的API参考必须包括简要描述和详细描述。 +1. 类、方法、“Interface”、枚举或成员变量的API参考必须包括简要描述。 +1. 类、方法、“Interface”、枚举或成员变量的API参考可选包括详细描述。 +1. 方法、“Interface”的API参考必须包括所有入参的参数描述。 +1. 如果方法或“Interface”有返回值,则API参考必须包含返回值描述。 +1. 如果执行过程中可能抛出异常,则API参数必须包含相关的异常描述。 +1. 必须包含API的起始版本号(使用@since注释标记)。 +1. 可选包括本模块或类自己的版本号(使用@version注释标记)。 +1. 涉及API变更(不兼容),必须同步交付API-Diff和ChangeLog文档。 + +### 兼容性要求 +1. 按严格程度从高到低,API兼容要求包括:契约兼容 > 二进制兼容 > 源码兼容。 + 1. 源码兼容:指版本演进后,开发者已有的源代码可正常编译通过。 + 1. 二进制兼容:指版本演进后,开发者已有程序不用重新编译可正常链接、运行。 + 1. 契约兼容:也称语义兼容,指版本演进后,开发者原有程序行为不发生变化。 +1. OpenHarmony API后向兼容必须满足二进制兼容要求,例外情况需要通过API SIG评审并经过PMC批准。常见破坏二进制兼容的API变更包括: + 1. 任何API元素删除; + 1. 降低方法的可见性,例如protected修改为了private,或者public修改为protected。 + 1. 类类型发生变化,例如抽象类变更为非抽象类,或者接口类(“Interface”)变更为非接口类。 + 1. 方法原型发生变化,例如返回值类型修改,或入参顺序或入参类型发生变化。 + 1. 成员final/static等属性发生变化,例如非final成员变成final,或者非static的成员变成static。 +1. 禁止“原型相同、功能不兼容”的API修改,可受限使用“废弃old-api、新增new-api”的方式进行修改。 +1. 根据发布类型不同,API的生命周期和兼容性要求: + +![](/images/design/figures/API-Lifecycle.png) + + 1. Canary版本:早期发布的预览版本,不承诺API稳定。 + 1. 对上一Release发布版本保持API兼容。 + 1. 相同API Version的多个Canary版本之间无API兼容性要求。 + 1. Beta版本:公开发布的Beta测试版本,不承诺API稳定。 + 1. 对上一Release发布版本保持API兼容。 + 1. 对同一API Version的早期发布的Canary版本不兼容。 + 1. 相同API Version的多个Beta版本之间无API兼容性要求。 + 1. API Stable版本发布之后API即冻结,之后再发布的Beta版不允许任何形式的API新增或变更。 + 1. Release版本:正式发布版本。 + 通过Release版本对外发布的API,需要遵守对外部开发者的“契约承诺”,原则上不允许对已经Release发布的API进行不兼容修改,受限允许对已发布的API进行废弃。已经Release发布的API废弃基本要求包括: + 1. 废弃接口标记。 + 1. 提供可替代接口。 + 1. 废弃API至少保留5个API Version版本(对废弃5个API Version的API可以彻底删除,不再支持)。 + +### 性能要求 +1. 应及时响应,避免调用者等待;如果API调用执行时间过长应设计为异步方式。 +2. 应关注API调用时机、调用频次对RAM占用的影响。 +3. 应关注API调用时机、调用频次对功耗的影响。 +4. 对使用资源的API调用需要能及时释放资源,异常场景具备容错机制,保障资源及时释放。 + +### 功耗要求 + +1. 针对API调用时机、调用频次对功耗的影响做评估,有影响进行相关设计。 +2. 版本演进过程中,功耗不劣化。 + +### 可靠性要求 + +1. API不能因为外部输入(输入参数、系统状态、外部数据等)或者内部状态、数据异常而崩溃,应该返回确定的错误码或者抛出预定义的异常。 +2. API应明确调用是同步还是异步调用,若是同步调用,应明确超时上限或者允许调用者设置超时时间,避免调用卡死导致业务无响应。 +3. API务必支持多线程重入。 +4. 满足幂等性要求,相同业务含义的请求API调用一次或多次重试总能获得相同的效果(API调用依赖外部资源的变化除外)。针对可重入的API调用实现内部应尽量避免引入时变因素,如系统tick、静态变量、没有互斥保护的全局变量等;针对同一客户端的多次重复调用,可以使用contextID、clientToken、squenceNo等作为调用入参。 +5. API内部创建对象的生命周期要闭合,避免对象资源泄漏。 +6. API要明确客户端调用失败后,能够发起重试的最大次数。 + +### 测试要求 +1. 新增API必须同步交付API自动化测试用例,用例100%覆盖API接口。 +2. 用例场景单一,单条用例覆盖接口单个功能场景,简化单条用例代码逻辑。 +3. 用例执行高效,每条用例执行时间控制在毫秒级。 +4. 用例执行全自动化:接口用例需要达成100%自动化。 +5. 用例有效性:用户要求必须存在断言,且不能仅是检查是否抛出异常,需要有功能逻辑的断言。 + +### 编程语言要求 + +API根据其编程语言类型,需要遵守相应的OpenHarmony编程语言规范。 diff --git a/website/docs/_posts/device-dev/guide/device-iotcamera-control-demo.md b/website/docs/_posts/device-dev/guide/device-iotcamera-control-demo.md new file mode 100644 index 0000000000000000000000000000000000000000..f661d01235a47bfb5363c5e2349cd3597f429e83 --- /dev/null +++ b/website/docs/_posts/device-dev/guide/device-iotcamera-control-demo.md @@ -0,0 +1,20 @@ +--- +title: device-iotcamera-control-demo.md +permalink: /pages/extra/0cc11e/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:34 +--- +# 示例开发 + +- **[拍照开发指导](/pages/00060001000100)** + +- **[录像开发指导](/pages/00060001000101)** + + diff --git a/website/docs/_posts/device-dev/guide/device-iotcamera-control.md b/website/docs/_posts/device-dev/guide/device-iotcamera-control.md new file mode 100644 index 0000000000000000000000000000000000000000..fe8aacbecc2c5252c21264e3675e784b5b39f7fa --- /dev/null +++ b/website/docs/_posts/device-dev/guide/device-iotcamera-control.md @@ -0,0 +1,22 @@ +--- +title: device-iotcamera-control.md +permalink: /pages/extra/ecd28f/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:34 +--- +# 摄像头控制 + +- **[概述](/pages/000600010000)** + +- **[示例开发](/pages/extra/0cc11e/)** + +- **[应用实例](/pages/000600010002)** + + diff --git a/website/docs/_posts/device-dev/guide/device-iotcamera.md b/website/docs/_posts/device-dev/guide/device-iotcamera.md new file mode 100644 index 0000000000000000000000000000000000000000..5786b71150d11c85d0993d219eec73661cbc16dd --- /dev/null +++ b/website/docs/_posts/device-dev/guide/device-iotcamera.md @@ -0,0 +1,18 @@ +--- +title: device-iotcamera.md +permalink: /pages/extra/77c24f/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:34 +--- +# 无屏摄像头类产品 + +- **[摄像头控制](/pages/extra/ecd28f/)** + + diff --git a/website/docs/_posts/device-dev/guide/device-wlan-led.md b/website/docs/_posts/device-dev/guide/device-wlan-led.md new file mode 100644 index 0000000000000000000000000000000000000000..dcc681c7514fb2a66d0e4cf51d413946164ec3ab --- /dev/null +++ b/website/docs/_posts/device-dev/guide/device-wlan-led.md @@ -0,0 +1,18 @@ +--- +title: device-wlan-led.md +permalink: /pages/extra/2d8771/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:34 +--- +# LED外设控制 + +- **[LED外设控制](/pages/0006000000)** + + diff --git a/website/docs/_posts/device-dev/guide/device-wlan.md b/website/docs/_posts/device-dev/guide/device-wlan.md new file mode 100644 index 0000000000000000000000000000000000000000..1eab973bae90f0a3e6312688a2f396e7e932ca77 --- /dev/null +++ b/website/docs/_posts/device-dev/guide/device-wlan.md @@ -0,0 +1,21 @@ +--- +title: device-wlan.md +permalink: /pages/extra/b17936/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:34 +--- +# WLAN连接类产品 + + +- **[LED外设控制](/pages/extra/2d8771/)** + +- **[集成三方SDK](/pages/0006000001)** + + diff --git a/website/docs/_posts/device-dev/quick-start/quickstart-lite-env-setup.md b/website/docs/_posts/device-dev/quick-start/quickstart-lite-env-setup.md new file mode 100644 index 0000000000000000000000000000000000000000..ae67b3e270c07254a5c8d975c73ff448f614da62 --- /dev/null +++ b/website/docs/_posts/device-dev/quick-start/quickstart-lite-env-setup.md @@ -0,0 +1,24 @@ +--- +title: quickstart-lite-env-setup.md +permalink: /pages/extra/aa859c/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:37 +--- +# 搭建系统环境 + +- **[概述](/pages/0001000100)** + +- **[Windows开发环境准备](/pages/0001000101)** + +- **[获取源码及Ubuntu编译环境准备](/pages/0001000102)** + +- **[常见问题](/pages/0001000103)** + + diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/02.WLAN\350\201\224\347\275\221\357\274\210\347\274\226\350\257\221\343\200\201\347\203\247\345\275\225\357\274\211.md" b/website/docs/_posts/device-dev/quick-start/quickstart-lite-steps-hi3861-connection.md similarity index 40% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/02.WLAN\350\201\224\347\275\221\357\274\210\347\274\226\350\257\221\343\200\201\347\203\247\345\275\225\357\274\211.md" rename to website/docs/_posts/device-dev/quick-start/quickstart-lite-steps-hi3861-connection.md index 7bca9a3ac603deca0d79b4a08e4ef1dc9eca2326..19d10baefc15bba20adf9b4bb1c17470e8006469 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/01.\350\275\273\351\207\217\345\222\214\345\260\217\345\236\213\347\263\273\347\273\237\345\205\245\351\227\250/04.\345\274\200\345\217\221\346\255\245\351\252\244-Hi3861\345\274\200\345\217\221\346\235\277/02.WLAN\350\201\224\347\275\221\357\274\210\347\274\226\350\257\221\343\200\201\347\203\247\345\275\225\357\274\211.md" +++ b/website/docs/_posts/device-dev/quick-start/quickstart-lite-steps-hi3861-connection.md @@ -1,20 +1,20 @@ --- -title: WLAN联网(编译、烧录) -permalink: /pages/0001000301 +title: quickstart-lite-steps-hi3861-connection.md +permalink: /pages/extra/2e61fc/ navbar: true -sidebar: true -prev: true -next: true -search: true -article: true +sidebar: false +prev: false +next: false +search: false +article: false comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:17:38 --- # WLAN联网(编译、烧录) - [编译](#section191121332125319) -- [镜像烧录](#section19458165166) +- [镜像烧录](#section3288165814218) - [WLAN模组联网](#section194671619167) 本示例将演示如何通过AT命令完成WLAN模组与网关联网。 @@ -23,42 +23,32 @@ date: 2021-12-30 12:57:41 本节描述如何在Linux服务器上进行WLAN模组版本的编译。 -如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](/pages/extra/70d134/#section107932281315)的编译操作。如果Linux编译环境通过软件包方式安装,请参考如下步骤。 +如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](/pages/000a00#section107932281315)的编译操作。如果Linux编译环境通过软件包方式安装,请参考如下步骤。 1. 打开DevEco Device Tool工具,点击“View \> Terminal”,进入终端界面。 - **图 1** IDE终端工具打开方法 - - - ![](/images/zh-cn/device-dev/quick-start/figure/1.png) + **图 1** IDE终端工具打开方法 + ![](/images/device-dev/quick-start/figures/IDE终端工具打开方法.png "IDE终端工具打开方法") 在终端界面使用ssh命令连接linux服务器,如“ssh user@ipaddr”。 - **图 2** 终端界面示意图 - - - ![](/images/zh-cn/device-dev/quick-start/figure/2.png) + **图 2** 终端界面示意图 + ![](/images/device-dev/quick-start/figures/终端界面示意图.png "终端界面示意图") 2. 进入代码根路径,并在终端窗口,执行脚本命令“hb set”、“.”,选择需要编译的版本“wifiiot\_hispark\_pegasus”。 - **图 3** 在终端界面选择目标构建版本示意图 - - - ![](/images/zh-cn/device-dev/quick-start/figure/3.png) + **图 3** 在终端界面选择目标构建版本示意图 + ![](/images/device-dev/quick-start/figures/在终端界面选择目标构建版本示意图.png "在终端界面选择目标构建版本示意图") 3. 执行“hb build”启动版本构建。 - **图 4** 在终端界面执行编译命令示意图 - - - ![](/images/zh-cn/device-dev/quick-start/figure/4.png) + **图 4** 在终端界面执行编译命令示意图 + ![](/images/device-dev/quick-start/figures/在终端界面执行编译命令示意图.png "在终端界面执行编译命令示意图") 4. 编译结束后,如果出现“wifiiot\_hispark\_pegasus build success”字样,则证明构建成功,如下图所示。 - **图 5** 编译成功示意图 - - - ![](/images/zh-cn/device-dev/quick-start/figure/5.png) + **图 5** 编译成功示意图 + ![](/images/device-dev/quick-start/figures/编译成功示意图.png "编译成功示意图") 5. 构建成功后,会在./out/wifiiot/路径中生成以下文件,使用如下命令可以查看,至此编译构建流程结束。 @@ -66,49 +56,58 @@ date: 2021-12-30 12:57:41 ls -l out/hispark_pegasus/wifiiot_hispark_pegasus/ ``` - **图 6** 编译文件存放目录示意图 - + **图 6** 编译文件存放目录示意图 + ![](/images/device-dev/quick-start/figures/编译文件存放目录示意图.png "编译文件存放目录示意图") + - ![](/images/zh-cn/device-dev/quick-start/figure/3-0.png) +## 镜像烧录 +烧录是指将编译后的程序文件下载到芯片开发板上的动作,为后续的程序调试提供基础。DevEco Device Tool提供一键烧录功能,操作简单,能快捷、高效的完成程序烧录,提升烧录的效率。 -## 镜像烧录 +**Hi3861V100开发板支持串口烧录方式,其中Windows系统串口烧录协议包括burn-serial和hiburn-serial,Linux系统串口烧录协议为hiburn-serial。** -Hi3861 WLAN模组的镜像烧录可以通过OpenHarmony IDE工具DevEco完成,工具的基本使用请参考[DevEco Device Tool使用指南](https://device.harmonyos.com/cn/docs/ide/user-guides/service_introduction-0000001050166905),烧录过程包含如下步骤。 +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>Windows下的两种烧录协议**burn-serial**和**hiburn-serial**,在操作上没有区别,**burn-serial**协议主要是为了兼容历史版本工程。 -1. 请连接好电脑和待烧录开发板,需要连接USB口,具体可参考[Hi3861开发板介绍](/pages/0001000100)。 -2. 打开电脑的设备管理器,查看并记录对应的串口号。 +Hi3861V100在Windows和Linux环境下的烧录操作完全一致,区别仅在于DevEco Device Tool环境搭建不同。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >如果对应的串口异常,请根据[Hi3861系列开发板串口驱动安装](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3861-drivers-0000001058153433)安装USB转串口的驱动程序。 +1. 请连接好电脑和待烧录开发板,需要连接USB口,具体可参考[Hi3861V100开发板介绍](https://device.harmonyos.com/cn/docs/start/introduce/oem_minitinier_des_3861-0000001105041324)。 +2. 打开电脑的设备管理器,查看并记录对应的串口号。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311118.png) + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >如果对应的串口异常,请根据[Hi3861V100开发板串口驱动安装](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3861-drivers-0000001058153433)安装USB转串口的驱动程序。 -3. 打开DevEco Device Tool,在Projects中,点击**Settings**打开工程配置界面。 + ![](/images/device-dev/quick-start/figures/hi3861-record-the-serial-port-number.png) - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128311116.png) +3. 打开DevEco Device Tool,在QUICK ACCESS \> DevEco Home \> Projects中,点击**Settings**打开工程配置界面。 + + ![](/images/device-dev/quick-start/figures/hi3861-deveco-device-tool-setting.png) + +4. 在“Partition Configuration”页签,设置待烧录文件信息,默认情况下,DevEco Device Tool已针对Hi3861V100开发板进行适配,无需单独修改。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >如果待烧录文件是直接通过拷贝的方式获取,需要手动修改待烧录文件的路径。打开待烧录文件的页签,在Partition Settings的New Opiton的下拉列表中,选择Partition\_bin,然后在Partition Opiton的Partition\_bin设置待烧录文件的路径。 -4. 在“Partition Configuration”页签,设置待烧录文件信息,默认情况下,DevEco Device Tool已针对Hi3861系列开发板进行适配,无需单独修改。 5. 在“hi3861”页签,设置烧录选项,包括upload\_port、upload\_partitions和upload\_protocol。 - - upload\_port:选择步骤[2](#zh-cn_topic_0000001056563976_li848662117291)中查询的串口号。 - - upload\_protocol:选择烧录协议,固定选择“burn-serial”。 + - upload\_port:选择步骤2中查询的串口号。 + - upload\_protocol:选择烧录协议,Windows系统可以选择“burn-serial”或“hiburn-serial”,Linux系统只能选择“hiburn-serial”。 - upload\_partitions:选择待烧录的文件,默认选择hi3861\_app。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001128470922.png) + ![](/images/device-dev/quick-start/figures/options.png) 6. 所有的配置都修改完成后,在工程配置页签的顶部,点击**Save**进行保存。 7. 打开工程文件,在DevEco Device Tool界面的“PROJECT TASKS”中,点击hi3861下的**Upload**按钮,启动烧录。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270749.png) + ![](/images/device-dev/quick-start/figures/hi3861-upload.png) 8. 启动烧录后,显示如下提示信息时,请按开发板上的RST按钮重启开发板。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270751.png) + ![](/images/device-dev/quick-start/figures/hi3861-restart-the-development-board.png) -9. 重新上电后,启动烧录,界面提示如下信息时,表示烧录成功。 +9. 重新上电后,界面提示如下信息时,表示烧录成功。 - ![](/images/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174350669.png) + ![](/images/device-dev/quick-start/figures/hi3861-burning-succeeded.png) ## WLAN模组联网 @@ -117,17 +116,13 @@ Hi3861 WLAN模组的镜像烧录可以通过OpenHarmony IDE工具DevEco完成, 1. 保持Windows工作台和WLAN模组的连接状态,在DevEco工具最下方,点击“DevEco:Serial Monitor”按钮。 - **图 7** 打开DevEco串口终端示意图 - - - ![](/images/zh-cn/device-dev/quick-start/figure/5-1.png) + **图 7** 打开DevEco串口终端示意图 + ![](/images/device-dev/quick-start/figures/打开DevEco串口终端示意图.png "打开DevEco串口终端示意图") 2. 复位WLAN模组,终端界面显示“ready to OS start”,则启动成功。 - **图 8** WLAN复位成功示意图 - - - ![](/images/zh-cn/device-dev/quick-start/figure/6.png) + **图 8** WLAN复位成功示意图 + ![](/images/device-dev/quick-start/figures/WLAN复位成功示意图.png "WLAN复位成功示意图") 3. 在DevEco的串口终端中,依次执行如下AT命令,启动STA模式,连接指定AP热点,并开启DHCP功能。 @@ -147,9 +142,7 @@ Hi3861 WLAN模组的镜像烧录可以通过OpenHarmony IDE工具DevEco完成, AT+PING=X.X.X.X # 检查模组与网关的联通性,其中X.X.X.X需替换为实际的网关地址 ``` - **图 9** WLAN模组联网成功示意图 - - - ![](/images/zh-cn/device-dev/quick-start/figure/截图.png) + **图 9** WLAN模组联网成功示意图 + ![](/images/device-dev/quick-start/figures/WLAN模组联网成功示意图.png "WLAN模组联网成功示意图") diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272Ubuntu\347\216\257\345\242\203-Docker\346\226\271\345\274\217.md" b/website/docs/_posts/device-dev/quick-start/quickstart-standard-docker-environment.md similarity index 63% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272Ubuntu\347\216\257\345\242\203-Docker\346\226\271\345\274\217.md" rename to website/docs/_posts/device-dev/quick-start/quickstart-standard-docker-environment.md index d45419566bb9e89d4357f08a1cfd9a109aa1d1ee..7065b9512be8983fde541b6899c44f72117880ca 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/03.\346\220\255\345\273\272Ubuntu\347\216\257\345\242\203-Docker\346\226\271\345\274\217.md" +++ b/website/docs/_posts/device-dev/quick-start/quickstart-standard-docker-environment.md @@ -1,15 +1,15 @@ --- -title: 搭建Ubuntu环境-Docker方式 -permalink: /pages/00010102 +title: quickstart-standard-docker-environment.md +permalink: /pages/extra/519b5e/ navbar: true -sidebar: true -prev: true -next: true -search: true -article: true +sidebar: false +prev: false +next: false +search: false +article: false comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:17:38 --- # 搭建Ubuntu环境\(获取源码及编译,Docker方式\) @@ -17,14 +17,15 @@ date: 2021-12-30 12:57:41 - [前提条件](#section102871547153314) - [操作步骤](#section429012478331) +- [执行prebuilts](#section0495320152619) - [获取Docker环境](#section181431248132513) - [编译](#section92391739152318) OpenHarmony标准系统为开发者提供的Docker环境已经将对应的编译工具链进行了封装,开发者可省略对应工具的安装。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >- 在使用Docker前需要先安装Docker,Docker安装请参考[官方指导](https://docs.docker.com/engine/install/ubuntu/)。 ->- Docker方式和安装包方式二选一即可。选择Docker方式的开发者可跳过[安装包方式](/pages/00010103)的内容。 +>- Docker方式和安装包方式二选一即可。选择Docker方式的开发者可跳过[安装包方式](/pages/extra/8bd265/)的内容。 ## 获取标准系统源码 @@ -32,7 +33,7 @@ OpenHarmony标准系统为开发者提供的Docker环境已经将对应的编译 1. 注册码云gitee账号。 2. 注册码云SSH公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191)。 -3. 安装[git客户端](http://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git)和[git-lfs](https://gitee.com/vcs-all-in-one/git-lfs?_from=gitee_search#downloading)并配置用户信息。 +3. 安装[git客户端](https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git)和[git-lfs](https://gitee.com/vcs-all-in-one/git-lfs?_from=gitee_search#downloading)并配置用户信息。 ``` git config --global user.name "yourname" @@ -51,6 +52,8 @@ OpenHarmony标准系统为开发者提供的Docker环境已经将对应的编译 ### 操作步骤 +可通过下方两种方式获取OpenHarmony主干代码,两种方式二选一即可。建议新建个文件夹,在此文件夹下执行以下命令,下载源码,此文件夹即为源码根目录。 + 方式一(推荐):通过repo + ssh 下载(需注册公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191))。 ``` @@ -67,6 +70,16 @@ repo sync -c repo forall -c 'git lfs pull' ``` +## 执行prebuilts + +在源码根目录下执行脚本,安装编译器及二进制工具。 + +``` +bash build/prebuilts_download.sh +``` + +下载的prebuilts二进制默认存放在与OpenHarmony同目录下的OpenHarmony\_2.0\_canary\_prebuilts下。 + ## 获取Docker环境 **方式一:从HuaweiCloud SWR上直接获取Docker镜像进行构建:** @@ -74,17 +87,17 @@ repo forall -c 'git lfs pull' 1. 获取Docker镜像。 ``` - docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.1 + docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.5 ``` -2. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 +2. 进入源码根目录执行如下命令,从而进入Docker构建环境。 ``` - docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.1 + docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.5 ``` -**方式二:通过Dockerfile 构建本地Docker镜像进行构建** +**方式二:通过Dockerfile 构建本地Docker镜像进行构建**: 1. 获取Dockerfile脚本文件,用来构建本地Docker镜像。 @@ -99,33 +112,27 @@ repo forall -c 'git lfs pull' ./build.sh ``` -3. 进入OpenHarmony代码根目录执行如下命令,从而进入Docker构建环境。 +3. 进入源码根目录执行如下命令,从而进入Docker构建环境。 ``` - docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.1 + docker run -it -v $(pwd):/home/openharmony openharmony-docker-standard:0.0.5 ``` ## 编译 -1. 在源码的根目录执行预处理脚本。 - - ``` - ../scripts/prepare.sh - ``` - -2. 通过如下编译脚本启动标准系统类设备(参考内存≥128MB)的编译。 +1. 通过如下编译脚本启动标准系统类设备(参考内存≥128MB)的编译。 ``` ./build.sh --product-name {product_name} ``` - \{product\_name\}为当前版本支持的平台,比如:Hi3516DV300 + \{product\_name\}为当前版本支持的平台。比如:Hi3516DV300等。 - 编译所生成的文件都归档在out/ohos-arm-release/目录下,结果镜像输出在 out/ohos-arm-release/packages/phone/images/ 目录下。 + 编译所生成的文件都归档在out/{device_name}/目录下,结果镜像输出在 out/{device_name}/packages/phone/images/ 目录下。 -3. 编译源码完成,请进行镜像烧录,具体请参见[镜像烧录](/pages/00010104)。 +2. 编译源码完成,请进行镜像烧录,具体请参见[镜像烧录](/pages/00010101)。 ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** >退出Docker执行exit命令即可。 diff --git "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/04.\346\220\255\345\273\272Ubuntu\347\216\257\345\242\203-\345\256\211\350\243\205\345\214\205\346\226\271\345\274\217.md" b/website/docs/_posts/device-dev/quick-start/quickstart-standard-package-environment.md similarity index 72% rename from "website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/04.\346\220\255\345\273\272Ubuntu\347\216\257\345\242\203-\345\256\211\350\243\205\345\214\205\346\226\271\345\274\217.md" rename to website/docs/_posts/device-dev/quick-start/quickstart-standard-package-environment.md index 95901a50a67d2644979c18b87006145647065326..f9ad627157b82e980dff63aa76f9d797390b8343 100644 --- "a/website/docs/01.\346\226\207\346\241\243/02.\350\256\276\345\244\207\345\274\200\345\217\221-\345\277\253\351\200\237\345\274\200\345\247\213/02.\346\240\207\345\207\206\347\263\273\347\273\237\345\205\245\351\227\250/04.\346\220\255\345\273\272Ubuntu\347\216\257\345\242\203-\345\256\211\350\243\205\345\214\205\346\226\271\345\274\217.md" +++ b/website/docs/_posts/device-dev/quick-start/quickstart-standard-package-environment.md @@ -1,15 +1,15 @@ --- -title: 搭建Ubuntu环境-安装包方式 -permalink: /pages/00010103 +title: quickstart-standard-package-environment.md +permalink: /pages/extra/8bd265/ navbar: true -sidebar: true -prev: true -next: true -search: true -article: true +sidebar: false +prev: false +next: false +search: false +article: false comment: false editLink: false -date: 2021-12-30 12:57:41 +date: 2021-12-30 18:17:38 --- # 搭建Ubuntu环境\(获取源码及编译,安装包方式\) @@ -26,11 +26,11 @@ date: 2021-12-30 12:57:41 安装命令如下: ``` -sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip +sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby ``` ->![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** ->以上安装命令适用于Ubuntu18.04,其他版本请根据安装包名称采用对应的安装命令。 +>![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** +>以上安装命令适用于Ubuntu18.04,其他版本请根据安装包名称采用对应的安装命令。其中Python要求安装Python 3.7及以上版本,此处以Python 3.8为例。 ## 获取标准系统源码 @@ -38,7 +38,7 @@ sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flex biso 1. 注册码云gitee账号。 2. 注册码云SSH公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191)。 -3. 安装[git客户端](http://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git)和[git-lfs](https://gitee.com/vcs-all-in-one/git-lfs?_from=gitee_search#downloading)并配置用户信息。 +3. 安装[git客户端](https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git)和[git-lfs](https://gitee.com/vcs-all-in-one/git-lfs?_from=gitee_search#downloading)并配置用户信息。 ``` git config --global user.name "yourname" @@ -57,6 +57,8 @@ sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flex biso ### 操作步骤 +可通过下方两种方式获取OpenHarmony主干代码,两种方式二选一即可。建议新建个文件夹,在此文件夹下执行以下命令,下载源码,此文件夹即为源码根目录。 + 方式一(推荐):通过repo + ssh 下载(需注册公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191))。 ``` @@ -102,10 +104,10 @@ bash build/prebuilts_download.sh =====build Hi3516DV300 successful. ``` - 编译所生成的文件都归档在out/ohos-arm-release/目录下,结果镜像输出在 out/ohos-arm-release/packages/phone/images/ 目录下。 + 编译所生成的文件都归档在out/{device_name}/目录下,结果镜像输出在out/{device_name}/packages/phone/images/ 目录下。 - >![](/images/zh-cn/device-dev/public_sys-resources/icon-note.gif) **说明:** - >其他模块化编译操作,可参见[编译构建指导](/pages/00040001)。 + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >其他模块化编译操作,可参见[编译构建指导](/pages/00040201)。 -3. 编译源码完成,请进行镜像烧录,具体请参见[镜像烧录](/pages/00010104)。 +3. 编译源码完成,请进行镜像烧录,具体请参见[镜像烧录](/pages/00010101)。 diff --git a/website/docs/_posts/device-dev/quick-start/quickstart-standard-windows-environment.md b/website/docs/_posts/device-dev/quick-start/quickstart-standard-windows-environment.md new file mode 100644 index 0000000000000000000000000000000000000000..bd57f9f0d092a2985b99346abb7e2a1073a82853 --- /dev/null +++ b/website/docs/_posts/device-dev/quick-start/quickstart-standard-windows-environment.md @@ -0,0 +1,77 @@ +--- +title: quickstart-standard-windows-environment.md +permalink: /pages/extra/887650/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:38 +--- +# Windows开发环境准备 + +- [安装DevEco Device Tool](#zh-cn_topic_0000001058091994_section10761564496) + +系统要求: + +- Windows 10 64位系统。 +- 系统的用户名不能含有中文字符。 + +## 安装DevEco Device Tool + +DevEco Device Tool以插件方式运行,基于Visual Studio Code进行扩展,同时DevEco Device Tool运行依赖Python,Node.js和hpm工具。 + +DevEco Device Tool支持一体化安装,即DevEco Device Tool安装向导会检测系统是否安装Visual Studio Code、Python、Node.js、hpm的适配版本,当安装向导未检测到这些软件时,会给出相应的提示,根据提示勾选要自动安装的软件,安装向导会自动下载相应的软件进行安装。 + +安装DevEco Device Tool,**主机的用户名不能包含中文字符**,否则在运行DevEco Device Tool时,DevEco Home界面会一直处于Loading状态,导致不能正常使用 + +1. 获取软件,请使用华为开发者帐号登录[https://device.harmonyos.com/cn/ide\#download\_beta](https://device.harmonyos.com/cn/ide#download_beta),下载DevEco Device Tool V3.0 Beta1及以上版本。如未注册华为开发者账号,请先[注册](https://developer.huawei.com/consumer/cn/doc/start/registration-and-verification-0000001053628148)。 +2. 解压DevEco Device Tool压缩包,双击安装包程序,点击Next进行安装。 +3. 设置DevEco Device Tool的安装路径,点击Next。 +4. 根据安装向导提示,勾选要自动安装的软件,点击Next。 + + ![](/images/device-dev/quick-start/figures/Snap28.png) + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >当安装向导检测到系统中已安装可兼容的Python版本,会提示用户可选择已安装的可兼容的Python版本,也可选择下载推荐的Python版本。 + +5. 在以下界面点击Next,进行软件下载和安装。 + + ![](/images/device-dev/quick-start/figures/Snap8.png) + +6. 在弹出的Python安装向导中,勾选“**Add Python 3.8 to PATH**”,然后点击**Install Now**开始安装,等待安装完成后,点击**Close**。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >当DevEco Device Tool安装向导检测系统已安装可兼容的Python版本,且用户选择了已安装的可兼容的Python版本,则Python安装向导不会弹出,用户不需要执行此步骤。 + >如果安装DevEco Device Tool 2.1 Release版本,Python版本只能为3.8.x版本,不能安装最新的Python3.9.x版本。如果安装DevEco Device Tool V3.0 Beta1及以上版本,Python版本只能为3.8.x或3.9.x版本。 + + ![](/images/device-dev/quick-start/figures/Snap34.png) + +7. 在弹出的Visual Studio Code安装向导中,根据向导提示安装Visual Studio Code,安装过程中,请勾选“添加到PATH(重启后生效)”。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >当DevEco Device Tool安装向导检测系统已安装正确的Visual Studio Code版本,则Visual Studio Code安装向导不会弹出,用户不需要执行此步骤。 + + ![](/images/device-dev/quick-start/figures/Snap33.png) + +8. 在弹出的Node.js安装向导中,全部按照默认设置点击**Next**,直至**Finish**。安装过程中,Node.js会自动在系统的path环境变量中配置node.exe的目录路径。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >当DevEco Device Tool安装向导检测系统已安装正确的Node.js版本,则Node.js安装向导不会弹出,用户不需要执行此步骤。 + +9. 等待DevEco Device Tool安装向导自动安装hpm和DevEco Device Tool插件,直至安装完成,点击**Finish**,关闭DevEco Device Tool安装向导。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >当DevEco Device Tool安装向导检测系统已安装正确的hpm版本,则不会进行hpm软件的下载和安装。 + +10. 启动Visual Studio Code,会自动安装DevEco Device Tool依赖的C/C++、CodeLLDB插件。等待安装完成后,点击Visual Studio Code左侧的![](/images/device-dev/quick-start/figures/button.png)按钮,检查INSTALLED中,是否已成功安装C/C++、CodeLLDB和DevEco Device Tool。 + + >![](/images/device-dev/public_sys-resources/icon-note.gif) **说明:** + >如果C/C++和CodeLLDB插件安装不成功,则DevEco Device Tool不能正常运行,解决方法,详细请参考:[离线安装C/C++和CodeLLDB插件](https://device.harmonyos.com/cn/docs/ide/user-guides/offline_plugin_install-0000001074376846)。 + + ![](/images/device-dev/quick-start/figures/deveco-device-tool-install-sucessful.png) + + diff --git a/website/docs/_posts/device-dev/quick-start/quickstart-standard.md b/website/docs/_posts/device-dev/quick-start/quickstart-standard.md new file mode 100644 index 0000000000000000000000000000000000000000..5ed21cf99170271be0651bf3a02f78506df1a30c --- /dev/null +++ b/website/docs/_posts/device-dev/quick-start/quickstart-standard.md @@ -0,0 +1,30 @@ +--- +title: quickstart-standard.md +permalink: /pages/extra/5a0f2a/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:38 +--- +# 标准系统入门 + +- **[入门介绍](/pages/00010100)** + +- **[Windows开发环境准备](/pages/extra/887650/)** + +- **[搭建Ubuntu环境\(获取源码及编译,Docker方式\)](/pages/extra/519b5e/)** + +- **[搭建Ubuntu环境\(获取源码及编译,安装包方式\)](/pages/extra/8bd265/)** + +- **[镜像烧录](/pages/00010101)** + +- **[镜像运行](/pages/00010102)** + +- **[常见问题](/pages/00010103)** + + diff --git a/website/docs/_posts/device-dev/subsystems/subsys-testguide-envbuild.md b/website/docs/_posts/device-dev/subsystems/subsys-testguide-envbuild.md new file mode 100644 index 0000000000000000000000000000000000000000..74e65c5fdb5fb01ca06834bc6750ffb88b7d0876 --- /dev/null +++ b/website/docs/_posts/device-dev/subsystems/subsys-testguide-envbuild.md @@ -0,0 +1,96 @@ +--- +title: subsys-testguide-envbuild.md +permalink: /pages/extra/294a0f/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:33 +--- + + +# 环境配置 +## 测试框架基础环境依赖 + +|环境依赖|操作系统|Linux系统扩展组件|python|python插件|NFS Server|HDC| +|------------|------------|------------|------------|------------|------------|------------| +|版本型号|Ubuntu18.04及以上|libreadline-dev|3.7.5版本及以上|pyserial 3.3及以上、paramiko2.7.1及以上、setuptools40.8.0及以上、rsa4.0及以上|haneWIN NFS Server 1.2.50及以上或者 NFS v4及以上| 1.1.0版本及以上 | +|详细说明|代码编译环境|命令行读取插件|测试框架语言 |pyserial:支持python的串口通信;paramiko:支持python使用SSH协议;setuptools:支持python方便创建和分发python包;rsa:支持python rsa加密 |支持设备通过串口连接| 支持设备通过HDC连接 | + +## 安装流程 +1. 安装Linux扩展组件readline,安装命令如下: + ``` + sudo apt-get install libreadline-dev + ``` + 安装成功提示如下: + ``` + Reading package lists... Done + Building dependency tree + Reading state information... Done + libreadline-dev is already the newest version (7.0-3). + 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. + ``` +2. 安装setuptools插件,安装命令如下: + ``` + pip3 install setuptools + ``` + 安装成功提示如下: + ``` + Requirement already satisfied: setuptools in d:\programs\python37\lib\site-packages (41.2.0) + ``` +3. 安装paramiko插件,安装命令如下: + ``` + pip3 install paramiko + ``` + 安装成功提示如下: + ``` + Installing collected packages: pycparser, cffi, pynacl, bcrypt, cryptography, paramiko + Successfully installed bcrypt-3.2.0 cffi-1.14.4 cryptography-3.3.1 paramiko-2.7.2 pycparser-2.20 pynacl-1.4.0 + ``` +4. 安装python的rsa插件,安装命令如下: + ``` + pip3 install rsa + ``` + 安装成功提示如下: + ``` + Installing collected packages: pyasn1, rsa + Successfully installed pyasn1-0.4.8 rsa-4.7 + ``` +5. 安装串口插件pyserial,安装命令如下: + ``` + pip3 install pyserial + ``` + 安装成功提示如下: + ``` + Requirement already satisfied: pyserial in d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg (3.4) + ``` +6. 如果设备仅支持串口输出测试结果,则需要安装NFS Server + - Windows环境下安装,例如安装haneWIN NFS Server1.2.50。 + - Linux环境下安装,安装命令如下: + ``` + sudo apt install nfs-kernel-server + ``` + 安装成功提示如下: + ``` + Reading package lists... Done + Building dependency tree + Reading state information... Done + nfs-kernel-server is already the newest version (1:1.3.4-2.1ubuntu5.3). + 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. + ``` +7. 如果设备支持HDC连接,则需要安装HDC工具,安装流程请参考如下链接 + + https://gitee.com/openharmony/developtools_hdc_standard/blob/master/README_zh.md + +## 安装环境检查 + +| 检查项 |操作 |满足环境 | +| --- | --- | --- | +| 检查python安装成功 |命令行窗口执行命令:python --version |版本不小于3.7.5即可 | +| 检查python扩展插件安装成功 |打开test/developertest目录,执行start.bat或start.sh| 可进入提示符“>>>”界面即可 | +|检查NFS Server启动状态(被测设备仅支持串口时检测) |通过串口登录开发板,执行mount命令挂载NFS |可正常挂载文件目录即可 | +|检查HDC安装成功 |命令行窗口执行命令:hdc_std -v |版本不小于1.1.0即可 | diff --git a/website/docs/_posts/release-notes/OpenHarmony-1-0.md b/website/docs/_posts/release-notes/OpenHarmony-1-0.md new file mode 100644 index 0000000000000000000000000000000000000000..8e12a1e37cb02c5ec76f2e7fc4dc816f8724c31f --- /dev/null +++ b/website/docs/_posts/release-notes/OpenHarmony-1-0.md @@ -0,0 +1,107 @@ +--- +title: OpenHarmony-1-0.md +permalink: /pages/extra/0a1ae8/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:34 +--- +# OpenHarmony 1.0(2020-09-10) + +- [版本概述](#section249611124916) +- [版本源码获取](#section127301717165113) + - [通过镜像站点获取](#section157648475298) + - [通过repo命令获取](#section49746186307) + + +## 版本概述 + +首次发布OpenHarmony 1.0。 + +## 版本源码获取 + +### 通过镜像站点获取 + +**表 1** 源码获取路径 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

版本源码

+

版本信息

+

下载站点

+

SHA256校验码

+

全量代码

+

1.0

+

站点

+

SHA256 校验码

+

Hi3861解决方案(二进制)

+

1.0

+

站点

+

SHA256 校验码

+

Hi3518解决方案(二进制)

+

1.0

+

站点

+

SHA256 校验码

+

Hi3516解决方案(二进制)

+

1.0

+

站点

+

SHA256 校验码

+

RELEASE-NOTES

+

1.0

+

站点

+

-

+
+ +### 通过repo命令获取 + +方式一(推荐):通过repo下载 + +``` +repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify +repo sync -c +``` + +方式二:通过git clone单个代码仓库 + +进入[代码仓库主页](https://gitee.com/openharmony),选择需要克隆的代码仓库,执行命令,如: + +``` +git clone https://gitee.com/openharmony/manifest.git -b master +``` + diff --git a/website/docs/_posts/release-notes/OpenHarmony-1-1-0-LTS.md b/website/docs/_posts/release-notes/OpenHarmony-1-1-0-LTS.md new file mode 100644 index 0000000000000000000000000000000000000000..a5278a5d252e382702271b729304c88137f06fd7 --- /dev/null +++ b/website/docs/_posts/release-notes/OpenHarmony-1-1-0-LTS.md @@ -0,0 +1,1185 @@ +--- +title: OpenHarmony-1-1-0-LTS.md +permalink: /pages/extra/5e1674/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:34 +--- +# OpenHarmony 1.1.0 LTS(2021-04-01) + +- [版本概述](#section1846294912228) +- [源码获取](#section84808293211) + - [通过镜像站点获取](#section8394142222113) + - [通过repo下载](#section7180193542317) + +- [更新说明](#section175225345334) +- [已修复缺陷列表](#section11935243172612) + +## 版本概述 + +首次发布LTS(long-term support)长期支持版本OpenHarmony 1.1.0,本版本在1.0版本的基础上新增了部分功能和修复了部分缺陷。 + +- OpenHarmony1.1.0扩充组件能力,新增AI子系统、电源管理子系统、泛Sensor子系统、升级子系统。 +- OpenHarmony1.1.0有了统一AI引擎框架。 +- liteos-m内核完成三方可移植性重构。 +- 驱动子系统完善了WIFI、Sensor、Input、Display的驱动模型。 +- 图形子系统针对UI能力及JS框架性能和内存得到优化。 +- 对目录结构及组件仓做了大幅优化。 + +## 源码获取 + +### 通过镜像站点获取 + +**表 1** 源码获取路径 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

版本源码

+

版本信息

+

下载站点

+

SHA256校验码

+

全量代码

+

1.1.0

+

站点

+

SHA256 校验码

+

Hi3861解决方案(二进制)

+

1.1.0

+

站点

+

SHA256 校验码

+

Hi3518解决方案(二进制)

+

1.1.0

+

站点

+

SHA256 校验码

+

Hi3516解决方案(二进制)

+

1.1.0

+

站点

+

SHA256 校验码

+

Release Notes

+

1.1.0

+

站点

+

-

+
+ +### 通过repo下载 + +下载命令如下: + +``` +repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony_release_v1.1.0 --no-repo-verify +repo sync -c +``` + +## 更新说明 + +本版本完全继承了OpenHarmony 1.0的所有特性,并在OpenHarmony 1.0版本的基础上,对各模块进行了功能扩展和优化,详情请参考下表 。 + +**表 2** 特性更新说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

类别

+

新增特性

+

修改特性

+

删除特性

+

内核

+
  • LiteOS-M支持Cortex-M7、Cortex-M33和RISC-V芯片架构,新增对应的单板target样例。
  • LiteOS-M支持MPU功能。
  • LiteOS-M支持部分POSIX接口。
  • LiteOS-M支持FatFS文件系统。
  • LiteOS-M支持异常回调函数注册机制。
  • LiteOS-M三方芯片易适配性架构调整。
  • LiteOS-M、LiteOS-A支持堆内存调测功能,包括内存泄漏、踩内存、内存统计。
  • LiteOS-M、LiteOS-A支持TLSF堆内存算法,提高内存申请和释放效率,降低碎片率。
+

LiteOS-A调度优化。

+

None

+

泛Sensor

+

新增Sensor组件,提供了Sensor列表查询、Sensor启停、Sensor订阅/去订阅、设置数据上报模式、设置采样间隔等功能。

+

None

+

None

+

全球化

+

新增79种语言的数字格式化、日期和时间格式化、单复数C/C++国际化接口。

+

None

+

None

+

JS应用开发框架

+
  • 新增JS前端opacity全局属性支持。
  • 新增prompt.showDialog API。
  • 新增二维码组件qrcode。
  • 新增事件冒泡机制
+
  • 国际化性能优化,加速页面跳转,支持数字国际化及时间日期转换。
  • 前端布局能力增强,部分样式值支持设置百分比。
  • input及switch组件尺寸自适应能力增强。
  • image组件能力增强,支持显示应用私有数据目录图片。
  • image-animator组件能力增强,支持结束帧指定。
  • canvas组件能力增强,新增部分API。
  • device.getInfo API增强,新增部分返回字段。
  • DFX能力增强,支持跟踪异常的方法栈。
+

国际化功能不再支持回溯特性。

+

测试

+
  • 新增测试工具按照用例级别筛选要执行的测试用例。
  • 新增测试demo用例。
+

None

+

None

+

图形

+
  • 新增组件级旋转缩放、组件级透明度。
  • 新增事件冒泡机制,新增旋转表冠事件。
  • 新增GIF图片解析显示,新增百分比宽高布局,新增Video和二维码控件。
+

局部渲染和SIMD性能优化。

+

None

+

公共基础

+
  • 新增dump系统属性功能。
  • 为上层各模块新增内存池管理接口。
+

None

+

None

+

驱动

+
  • 新增sensor、input、display驱动模型。
  • 新增mipi dsi以及pwm(脉冲宽度调制)。
  • 新增WIFI HDI接口以及WIFI的流控。
  • 新增驱动框架IO服务分组特性。
+

优化驱动加载流程,支持分段加载。

+

None

+

分布式通信

+
  • 新增WiFi Aware特性模块。
  • IPC新增对非对齐序列化的支持。
+

None

+

None

+

安全

+
  • 新增HUKS提供SHA256/RSA3072/RSA2048/AES128/ECC安全算法以及接口,以及提供密钥管理和存储能力。
  • HiChain提供轻量非账号的轻量级组件,用于设备群组管理和认证,支撑软总线通讯安全;提供API给系统服务与应用。
  • 权限管理新增统一的权限管理机制,满足轻量设备权限授权需求。
+

None

+

None

+

AI子系统

+
  • 新增统一的AI引擎框架,实现算法能力快速插件化集成。框架中主要包含插件管理、模块管理和通信管理等模块,对AI算法能力进行生命周期管理和按需部署
  • 为开发者提供开发指南,并提供2个基于AI引擎框架开发的AI能力插件和对应的AI应用Sample,方便开发者在AI引擎框架中快速集成AI算法能力。
+

None

+

None

+

升级服务

+

新增轻量级设备升级能力框架,框架包括升级包的效验和解析能力,以及安装的接口,统一轻设备升级能力框架。

+

None

+

None

+

XTS认证

+

增加AI、DFX、global、OTA兼容性测试用例。

+

应用程序框架、公共通信、分布式任务调度、IOT、内核等测试能力增强。

+

None

+

编译构建

+
  • 新增命令行工具hb, 采用hb set和hb build方式构建,并支持在源码目录下及任意子目录下构建。
  • 支持独立芯片厂商组件。
  • 支持使用组件名单独构建组件。
  • 支持按开发板自定义编译工具链和编译选项。
+

产品配置与build_lite仓解耦,修改为“vendor/解决方案厂商/产品/config.json”。

+

None

+

电源管理

+
  • 电量查询功能。
  • 亮屏锁管理功能及接口。
+

None

+

None

+
+ +组件仓优化如下表所示。 + +> **说明:** +>- 只读归档:组件仓归档到新的组织并设置为只读(openharmony-retired)。 +>- 三方芯片代码与OS解耦,海思芯片SDK由Vendor目录迁移到device/hisilicon。 + +**表 3** 组建仓库优化 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

OpenHarmony1.0

+

OpenHarmony1.1.0

+

优化方式

+

ace_lite_jsfwk

+

ace_engine_lite

+

仓名变更

+

ace_interfaces_innerkits_builtin

+

-

+

只读归档

+

-

+

ai_engine

+

新增组件

+

hiviewdfx_frameworks_hievent_lite

+

hiviewdfx_hievent_lite

+

仓名变更

+

hiviewdfx_frameworks_hilog_lite

+

hiviewdfx_hilog_lite

+

仓名变更

+

hiviewdfx_utils_lite

+

hiviewdfx_hiview_lite

+

仓名变更

+

hiviewdfx_frameworks_ddrdump_lite

+

-

+

只读归档

+

hiviewdfx_interfaces_innerkits_hievent_lite

+

-

+

只读归档

+

hiviewdfx_interfaces_innerkits_hilog

+

-

+

只读归档

+

hiviewdfx_interfaces_kits_hilog

+

-

+

只读归档

+

hiviewdfx_interfaces_kits_hilog_lite

+

-

+

只读归档

+

hiviewdfx_services_hilogcat_lite

+

-

+

只读归档

+

hiviewdfx_services_hiview_lite

+

-

+

只读归档

+

iothardware_hals_wifiiot_lite

+

-

+

只读归档

+

iothardware_interfaces_kits_wifiiot_lite

+

-

+

只读归档

+

iothardware_frameworks_wifiiot_lite

+

iothardware_peripheral

+

仓名变更

+

-

+

applications_camera_sample_communication

+

新增组件

+

-

+

applications_camera_screensaver_app

+

新增组件

+

-

+

sensors_miscdevice_lite

+

新增组件

+

-

+

sensors_sensor_lite

+

新增组件

+

xts_tools_lite

+

xts_tools

+

仓名变更

+

security_services_iam_lite

+

security_permission

+

仓名变更

+

security_interfaces_innerkits_iam_lite

+

-

+

只读归档

+

security_interfaces_kits_iam_lite

+

-

+

只读归档

+

security_services_secure_os

+

security_itrustee_ree_lite

+

仓名变更

+

security_interfaces_innerkits_secure_os

+

-

+

只读归档

+

security_frameworks_secure_os

+

-

+

只读归档

+

security_services_app_verify

+

security_appverify

+

仓名变更

+

security_interfaces_innerkits_app_verify

+

-

+

只读归档

+

security_services_hichainsdk_lite

+

security_deviceauth

+

仓名变更

+

security_interfaces_innerkits_hichainsdk_lite

+

-

+

只读归档

+

security_services_huks_lite

+

security_huks

+

仓名变更

+

security_interfaces_innerkits_huks_lite

+

-

+

只读归档

+

security_frameworks_crypto_lite

+

-

+

只读归档

+

security_interfaces_innerkits_crypto_lite

+

-

+

只读归档

+

-

+

signcenter_tool

+

新增组件

+

-

+

third_party_cryptsetup

+

新增组件

+

-

+

third_party_JSON-C

+

新增组件

+

-

+

third_party_libuuid

+

新增组件

+

-

+

third_party_LVM2

+

新增组件

+

-

+

third_party_popt

+

新增组件

+

communication_interfaces_kits_wifi_lite

+

-

+

只读归档

+

communication_frameworks_wifi_lite

+

-

+

只读归档

+

-

+

communication_wifi_lite

+

新增组件

+

-

+

powermgr_powermgr_lite

+

新增组件

+

distributedschedule_services_dtbschedmgr_lite

+

distributedschedule_dms_fwk_lite

+

仓名变更

+

distributedschedule_services_safwk_lite

+

distributedschedule_safwk_lite

+

仓名变更

+

distributedschedule_services_samgr_lite

+

distributedschedule_samgr_lite

+

仓名变更

+

distributedschedule_interfaces_innerkits_samgr_lite

+

-

+

只读归档

+

distributedschedule_interfaces_kits_samgr_lite

+

-

+

只读归档

+

multimedia_frameworks_audio_lite

+

multimedia_audio_lite

+

仓名变更

+

multimedia_frameworks_camera_lite

+

multimedia_camera_lite

+

仓名变更

+

multimedia_frameworks_player_lite

+

multimedia_media_lite

+

仓名变更

+

multimedia_hals_camera_lite

+

-

+

只读归档

+

multimedia_frameworks_recorder_lite

+

-

+

只读归档

+

multimedia_interfaces_kits_audio_lite

+

-

+

只读归档

+

multimedia_interfaces_kits_camera_lite

+

-

+

只读归档

+

multimedia_interfaces_kits_player_lite

+

-

+

只读归档

+

multimedia_interfaces_kits_recorder_lite

+

-

+

只读归档

+

multimedia_services_media_lite

+

-

+

只读归档

+

kernel_liteos_a_huawei_proprietary_fs_proc

+

-

+

只读归档

+

-

+

third_party_mksh

+

新增组件

+

-

+

third_party_optimized_routines

+

新增组件

+

-

+

third_party_toybox

+

新增组件

+

vendor_huawei_camera

+

-

+

只读归档

+

vendor_huawei_wifi_iot

+

-

+

只读归档

+

startup_services_bootstrap_lite

+

startup_bootstrap_lite

+

仓名变更

+

startup_frameworks_syspara_lite

+

startup_syspara_lite

+

仓名变更

+

startup_hals_syspara_lite

+

-

+

只读归档

+

startup_interfaces_kits_syspara_lite

+

-

+

只读归档

+

graphic_lite

+

graphic_surface

+

仓名变更

+

-

+

graphic_ui

+

新增组件

+

-

+

graphic_utils

+

新增组件

+

-

+

graphic_wms

+

新增组件

+

-

+

third_party_giflib

+

新增组件

+

-

+

third_party_qrcodegen

+

新增组件

+

-

+

drivers_adapter_khdf_linux

+

新增组件

+

drivers_hdf_lite

+

drivers_adapter_khdf_liteos

+

仓名变更

+

-

+

drivers_adapter_uhdf

+

新增组件

+

drivers_hdf_frameworks

+

drivers_framework

+

仓名变更

+

-

+

drivers_peripheral_audio

+

新增组件

+

-

+

drivers_peripheral_codec

+

新增组件

+

-

+

drivers_peripheral_display

+

新增组件

+

-

+

drivers_peripheral_format

+

新增组件

+

-

+

drivers_peripheral_input

+

新增组件

+

-

+

drivers_peripheral_sensor

+

新增组件

+

-

+

drivers_peripheral_wlan

+

新增组件

+

-

+

global_cust_lite

+

新增组件

+

-

+

global_i18n_lite

+

新增组件

+

global_frameworks_resmgr_lite

+

global_resmgr_lite

+

仓名变更

+
  

third_party_icu

+

新增组件

+

global_interfaces_innerkits_resmgr_lite

+

-

+

只读归档

+

communication_frameworks_ipc_lite

+

communication_ipc_lite

+

仓名变更

+

communication_interfaces_kits_ipc_lite

+

-

+

只读归档

+

communication_interfaces_kits_softbuskit_lite

+

-

+

只读归档

+

communication_hals_wifi_lite

+

-

+

只读归档

+

communication_services_softbus_lite

+

communication_softbus_lite

+

仓名变更

+

-

+

communication_wifi_aware

+

新增组件

+

-

+

update_ota_lite

+

新增组件

+

vendor_hisi_hi35xx_hi35xx_init

+

device_hisilicon_build

+

仓名变更

+

vendor_hisi_hi35xx_platform

+

device_hisilicon_drivers

+

仓名变更

+

vendor_hisi_hi35xx_hardware

+

device_hisilicon_hardware

+

仓名变更

+

vendor_hisi_hi35xx_hi3518ev300

+

device_hisilicon_hispark_aries

+

仓名变更

+

vendor_hisi_hi3861_hi3861

+

device_hisilicon_hispark_pegasus

+

仓名变更

+

vendor_hisi_hi35xx_hi3516dv300

+

device_hisilicon_hispark_taurus

+

仓名变更

+

vendor_hisi_hi35xx_middleware

+

device_hisilicon_modules

+

仓名变更

+

vendor_hisi_hi35xx_middleware_source_third_party_ffmpeg

+

device_hisilicon_third_party_ffmpeg

+

仓名变更

+

vendor_hisi_hi35xx_thirdparty_uboot_src

+

device_hisilicon_third_party_uboot

+

仓名变更

+

-

+

vendor_hisilicon

+

新增组件

+

vendor_hisi_hi35xx_hi3516dv300_uboot

+

-

+

只读归档

+

vendor_hisi_hi35xx_hi3518ev300_uboot

+

-

+

只读归档

+

aafwk_interfaces_innerkits_abilitykit_lite

+

-

+

只读归档

+

aafwk_interfaces_innerkits_intent_lite

+

aafwk_aafwk_lite

+

仓名变更

+

aafwk_interfaces_innerkits_abilitymgr_lite

+

-

+

只读归档

+

appexecfwk_kits_appkit_lite

+

appexecfwk_appexecfwk_lite

+

仓名变更

+

aafwk_frameworks_kits_ability_lite

+

-

+

只读归档

+
  

developtools_packing_tool

+

新增组件

+

aafwk_interfaces_kits_ability_lite

+

-

+

只读归档

+

appexecfwk_frameworks_bundle_lite

+

-

+

只读归档

+

aafwk_services_abilitymgr_lite

+

-

+

只读归档

+

appexecfwk_interfaces_innerkits_appexecfwk_lite

+

-

+

只读归档

+

appexecfwk_interfaces_innerkits_bundlemgr_lite

+

-

+

只读归档

+

appexecfwk_services_bundlemgr_lite

+

-

+

只读归档

+

aafwk_frameworks_kits_content_lite

+

-

+

只读归档

+
+ +## 已修复缺陷列表 + +针对OpenHarmony 1.0版本的缺陷列表,解决并修复的问题请参见下表。 + +**表 4** 修复问题列表 + + + + + + + + + + + + + + + + + + + +

ISSUE

+

问题描述

+

I3EALU

+

【多媒体】cameraActs 用例执行时,找不到相机配置文件,初始失败的问题

+

I3D71U

+

【驱动】反复reset,启动到hmac_main_init SUCCESSULLY后,高概率出现系统挂死问题

+

I3EGUX

+

【可靠性问题】反复reset,出现一次KIdle进程crash,系统挂死无法启动

+

I3DHIL

+

【系统问题】HI3518开源板剩余空间不足,导致ACTS用例大量失败

+
+ diff --git a/website/docs/_posts/release-notes/OpenHarmony-1-1-1-LTS.md b/website/docs/_posts/release-notes/OpenHarmony-1-1-1-LTS.md new file mode 100644 index 0000000000000000000000000000000000000000..d35b1956f1925c041d021fb45cfef5f3214990e4 --- /dev/null +++ b/website/docs/_posts/release-notes/OpenHarmony-1-1-1-LTS.md @@ -0,0 +1,153 @@ +--- +title: OpenHarmony-1-1-1-LTS.md +permalink: /pages/extra/a70d2c/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:34 +--- +# OpenHarmony 1.1.1 LTS(2021-06-22) + +- [版本概述](#section1846294912228) +- [源码获取](#section84808293211) + - [通过镜像站点获取](#section8394142222113) + - [通过repo下载](#section7180193542317) + +- [更新说明](#section175225345334) + +## 版本概述 + +更新发布LTS(long-term support)长期支持版本OpenHarmony 1.1.1,本版本在1.1.0版本的基础上新增了部分功能和修复了部分缺陷。 + +## 源码获取 + +### 通过镜像站点获取 + +**表 1** 源码获取路径 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

版本源码

+

版本信息

+

下载站点

+

SHA256校验码

+

全量代码

+

1.1.1

+

站点

+

SHA256校验码

+

Hi3861解决方案(二进制)

+

1.1.1

+

站点

+

SHA256校验码

+

Hi3518解决方案(二进制)

+

1.1.1

+

站点

+

SHA256校验码

+

Hi3516解决方案(二进制)

+

1.1.1

+

站点

+

SHA256校验码

+

Release Notes

+

1.1.1

+

站点

+

-

+
+ +### 通过repo下载 + +下载命令如下: + +repo init -u [https://gitee.com/openharmony/manifest.git](https://gitee.com/openharmony/manifest.git) -b refs/tags/OpenHarmony-v1.1.1-LTS --no-repo-verify + +## 更新说明 + +本版本完全继承了OpenHarmony 1.1.0的所有特性,并在OpenHarmony 1.1.0版本的基础上,对各模块进行了缺陷修复和性能优化,详情请参考下表。 + +**表 2** 版本更新说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

类别

+

更新内容

+

通信

+
  • 更新了部分STA相关功能的数据类以及新增了几个AP相关功能的innerkits接口
  • 新增了蓝牙相关功能的innerkits接口,包括BLE设备gatt相关的操作,以及BLE广播、扫描等功能
+

安全

+
  • 支持调用方仅使用绑定的能力,裁剪设备认证能力
  • 支持了huks裁剪设备认证
+

内核

+
  • 修复clang编译的系统镜像内核栈回溯功能失效
  • 解决调度中存在有符号数与无符号数比较
  • 修复setitimer中定时给进程发信号时未持有调度锁,导致踩内存等问题
  • lwip适配内核posix接口
  • 修复sigaction中sigsuspend的后执行信号顺序与预期不符,信号注册时未屏蔽用户传入信号屏蔽字段
+

驱动

+
  • liteos_m上的编译错误修复
  • 合入解决mmc crash的问题
+

AI

+
  • AI添加共享内存机制
  • AI添加linux内核适配
  • 同步算法禁用异步调用
  • 添加gitignore和Cmakelist
+

图形

+
  • 修复circle progress开启端点样式情况下,进度为0,圆形端点需要绘制问题
  • 修改旋转表冠灵敏度及方向相关问题
  • 增加 UIList 自动对齐动画时间设置功能
  • 修复当LineBreakMode为LINE_BRAK_ELLIPSIS时UILabel GetText宽度值错误
  • slider组件新增样式属性
  • UITimePicker增加设置循环接口
  • 修复定点数优化导致的NEON旋转缩放变换显示异常的BUG
  • 修复换行算法在字符串中有多个换行符时存在的换行错误
  • 修复表盘指针显示花屏问题
+

全球化

+
  • 添加日期时间模板Ed和MEd
+

ACE框架

+
  • 修复checkbox/radio点击事件异常
  • 修复list和if指令场景JS应用crash问题
  • slider样式归一处理
  • pickerview组件支持循环滑动
  • 修改align-item设置值为stretch情况下,子项居中显示的问题
+
+ diff --git a/website/docs/_posts/release-notes/OpenHarmony-v1.1.2-LTS.md b/website/docs/_posts/release-notes/OpenHarmony-v1.1.2-LTS.md new file mode 100644 index 0000000000000000000000000000000000000000..d08ff350fdab1156772a4f561878e0ee48c7ae09 --- /dev/null +++ b/website/docs/_posts/release-notes/OpenHarmony-v1.1.2-LTS.md @@ -0,0 +1,377 @@ +--- +title: OpenHarmony-v1.1.2-LTS.md +permalink: /pages/extra/4f9c6b/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +--- +# OpenHarmony v1.1.2 LTS + +- [版本概述](#section1846294912228) +- [配套关系](#section395983762117) +- [源码获取](#section84808293211) + - [通过镜像站点获取](#section8394142222113) + - [通过repo下载](#section7180193542317) + +- [更新说明](#section175225345334) +- [已修复缺陷列表](#section11935243172612) + +## 版本概述 + +更新发布LTS(long-term support)长期支持版本OpenHarmony v1.1.2 LTS,本版本在v1.1.1 LTS版本的基础上新增了一些特性和修复了部分缺陷。 + +## 配套关系 + +**表 1** 版本软件和工具配套关系 + + + + + + + + + + + + + + + + +

软件

+

版本

+

备注

+

OpenHarmony

+

1.1.2 LTS

+

NA

+

HUAWEI DevEco Device Tool(可选)

+

Deveco DeviceTool 2.2 Beta1

+

OpenHarmony智能设备集成开发环境推荐使用。

+
+ +## 源码获取 + +### 通过镜像站点获取 + +**表 2** 源码获取路径 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

版本源码

+

版本信息

+

下载站点

+

SHA256校验码

+

全量代码

+

1.1.2

+

站点

+

SHA256校验码

+

Hi3861解决方案(二进制)

+

1.1.2

+

站点

+

SHA256校验码

+

Hi3518解决方案(二进制)

+

1.1.2

+

站点

+

SHA256校验码

+

Hi3516解决方案(二进制)

+

1.1.2

+

站点

+

SHA256校验码

+

Release Notes

+

1.1.2

+

站点

+

-

+
+ +### 通过repo下载 + +方式一(推荐):通过repo + ssh 下载(需注册公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191))。 + +``` +repo init -u git@gitee.com:openharmony/manifest.git -b refs/tags/OpenHarmony-v1.1.2-LTS --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +方式二:通过repo + https 下载。 + +``` +repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v1.1.2-LTS --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +## 更新说明 + +本版本完全继承了OpenHarmony 1.1.1的所有特性,并在OpenHarmony 1.1.1版本的基础上,对部分模块进行了功能扩展和优化,详情请参考下表。 + +**表 3** 特性更新说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

子系统

+

新增特性

+

修改特性

+

删除特性

+

轻图形

+

新增滑动条修改,支持了滑块样式的设置

+

none

+

none

+

升级

+

适配升级包rsa3072长度的签名算法

+

none

+

none

+

驱动

+

新增了一些osal内部接口

+

sensor模型的优化

+

none

+

全球化

+
  • 新增数字开关、星期等相关数据功能
+
  • 新增Get12HourTimeWithoutAmpm接口
+

none

+

none

+
+ +## 已修复缺陷列表 + +在OpenHarmony 1.1.1版本的基础上,解决并修复的问题见下表。 + +**表 4** 已修复问题列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

子系统

+

PR NO.

+

问题描述

+

用户程序框架

+

aafwk_aafwk_lite/pulls/35

+

解決linux系统上小概率无法关机的问题

+

+

AI

+

ai_engine/pulls/50

+

修复测试用例client端未释放问题

+

ai_engine/pulls/46

+

修复类成员未初始化的问题

+

IOT硬件

+

applications_sample_wifi_iot/pulls/12

+

修复编译构建错误的问题

+

编译构建

+

build_lite/pulls/151

+

开发的测试用例加入到编译流程

+

+

+

芯片平台

+

+

third_party_ffmpeg/pulls/9

+

修复CVE-2020-22025安全漏洞

+

third_party_ffmpeg/pulls/6

+

修复部分环境依赖valgrind,导致编译失败问题

+

vendor_hisilicon/pulls/39

+

解决release版本编译失败的问题

+

+

分布式调度

+

distributedschedule_dms_fwk_lite/pulls/23

+

测试用例名称更换

+

distributedschedule_samgr_lite/pulls/25

+

修复CVE-2021-22478安全漏洞

+

+

全球化

+

+

global_i18n_lite/pulls/24

+

代码重构,优化全球化i18n.dat资源加载

+

third_party_jerryscript/pulls/22

+

修复mac版本上debug调试时断点概率性无法停住的问题

+

轻图形

+

graphic_ui/pulls/220

+

修复Add和Remove未配套使用问题,修改后UIViewGroup析构不清理子节点

+

graphic_ui/pulls/199

+

修复图片更新路径之后不刷新的问题

+

+

轻内核

+

+

kernel_liteos_a/pulls/385

+

修复CVE-2021-22479安全漏洞

+

kernel_liteos_a/pulls/299

+

删除PRINTK多余的维测日志

+

third_party_musl/pulls/44

+

修复设置随机数种子函数srand的实现的问题

+

启动

+

startup_syspara_lite/pulls/31

+

修改安全补丁日期

+

+

驱动

+

drivers_adapter_khdf_linux/pulls/28

+

修复CVE-2021-22441安全漏洞

+

drivers_adapter/pulls/50

+

修复CVE-2021-22480安全漏洞

+

+

+

+

测试

+

xts_acts/pulls/294

+

删除fs_posix模块的不稳定测试用例

+

xts_acts/pulls/287

+

修复acts测试失败的相关问题

+

xts_acts/pulls/283

+

修复CMSIS测试部分用例概率失败问题

+

xts_acts/pulls/270

+

修改不稳定用例:shared_memory 模块ShmTest.cpp用例ShmTest.testShmatSHM_REMAP 未按照预想逻辑运行问题。

+

xts_acts/pulls/314

+

修复net_posix模块测试卡死问题

+
+ diff --git a/website/docs/_posts/release-notes/Readme.md b/website/docs/_posts/release-notes/Readme.md new file mode 100644 index 0000000000000000000000000000000000000000..ea072d0ad827f0b7b55a3fb97c9372af711f8e42 --- /dev/null +++ b/website/docs/_posts/release-notes/Readme.md @@ -0,0 +1,28 @@ +--- +title: Readme.md +permalink: /pages/extra/34805f/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:34 +--- +# OpenHarmony Release Notes +## OpenHarmony 3.x Releases +[OpenHarmony v3.0 LTS (2021-09-30)](/pages/00000300) + +## OpenHarmony 2.x Releases + +- [OpenHarmony v2.2 beta2 (2021-08-04)](/pages/00000301) +- [OpenHarmony 2.0 Canary (2021-06-02)](/pages/00000302) +## OpenHarmony 1.x Releases +- [OpenHarmony v1.1.3 LTS (2021-09-30)](/pages/00000303) +- [OpenHarmony v1.1.2 LTS (2021-08-04)](/pages/extra/4f9c6b/) +- [OpenHarmony 1.1.1 LTS (2021-06-22)](/pages/extra/a70d2c/) +- [OpenHarmony 1.1.0 LTS (2021-04-01)](/pages/extra/5e1674/) +- [OpenHarmony 1.0 (2020-09-10)](/pages/extra/0a1ae8/) + diff --git a/website/docs/_posts/release-notes/api-change/v2.2-beta2/js-apidiff-v2.2-beta2.md b/website/docs/_posts/release-notes/api-change/v2.2-beta2/js-apidiff-v2.2-beta2.md new file mode 100644 index 0000000000000000000000000000000000000000..64d22e17c4021ad21e2744350562c52cc64d92c4 --- /dev/null +++ b/website/docs/_posts/release-notes/api-change/v2.2-beta2/js-apidiff-v2.2-beta2.md @@ -0,0 +1,247 @@ +--- +title: js-apidiff-v2.2-beta2.md +permalink: /pages/extra/b0ae7b/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:33 +--- +# JS API 差异报告 +OpenHarmony 2.2 Beta2相较于OpenHarmony 2.0 Canary版本的API变更如下: +## 标准系统接口变更 + +| 模块名称 | 接口名称 | 变更类型 | 变更说明 | +| -------- | -------- | -------- | -------- | + | 时间日期数字模块-Locale | constructor(locale: string, options?:options) | 新增 | - | + | 时间日期数字模块-Locale | toString(): string | 新增 | - | + | 时间日期数字模块-Locale | maximize(): Locale | 新增 | - | + | 时间日期数字模块-Locale | minimize(): Locale | 新增 | - | + | 时间日期数字模块-Locale | calendar | 新增 | - | + | 时间日期数字模块-Locale | caseFirst | 新增 | - | + | 时间日期数字模块-Locale | collation | 新增 | - | + | 时间日期数字模块-Locale | hourCycle | 新增 | - | + | 时间日期数字模块-Locale | numberingSystem | 新增 | - | + | 时间日期数字模块-Locale | numeric | 新增 | - | + | 时间日期数字模块-Locale | language | 新增 | - | + | 时间日期数字模块-Locale | script | 新增 | - | + | 时间日期数字模块-Locale | region | 新增 | - | + | 时间日期数字模块-Locale | baseName | 新增 | - | + | 时间日期数字模块-DateTimeFormat | constructor(locale: string, options?:options) | 新增 | - | + | 时间日期数字模块-DateTimeFormat | constructor(locale: string[], options?:options) | 新增 | - | + | 时间日期数字模块-DateTimeFormat | resolvedOptions(): DateTimeOptions | 新增 | - | + | 时间日期数字模块-DateTimeFormat | format(date: Date): string; | 新增 | - | + | 时间日期数字模块-DateTimeFormat | formatRange(fromDate: Date, toDate: Date): string; | 新增 | - | + | 时间日期数字模块-NumberFormat | constructor(locale: string, options?:options) | 新增 | - | + | 时间日期数字模块-NumberFormat | constructor(locale: string[], options?:options) | 新增 | - | + | 时间日期数字模块-NumberFormat | resolvedOptions(): NumberOptions | 新增 | - | + | 时间日期数字模块-NumberFormat | format(number: number): string; | 新增 | - | + | 时间日期数字模块-DateTimeOptions | locale | 新增 | - | + | 时间日期数字模块-DateTimeOptions | dateStyle | 新增 | - | + | 时间日期数字模块-DateTimeOptions | timeStyle | 新增 | - | + | 时间日期数字模块-DateTimeOptions | calendar | 新增 | - | + | 时间日期数字模块-DateTimeOptions | dayPeriod | 新增 | - | + | 时间日期数字模块-DateTimeOptions | numberingSystem | 新增 | - | + | 时间日期数字模块-DateTimeOptions | localeMatcher | 新增 | - | + | 时间日期数字模块-DateTimeOptions | timeZone | 新增 | - | + | 时间日期数字模块-DateTimeOptions | hour12 | 新增 | - | + | 时间日期数字模块-DateTimeOptions | hourCycle | 新增 | - | + | 时间日期数字模块-DateTimeOptions | formatMatcher | 新增 | - | + | 时间日期数字模块-DateTimeOptions | weekday | 新增 | - | + | 时间日期数字模块-DateTimeOptions | era | 新增 | - | + | 时间日期数字模块-DateTimeOptions | year | 新增 | - | + | 时间日期数字模块-DateTimeOptions | month | 新增 | - | + | 时间日期数字模块-DateTimeOptions | day | 新增 | - | + | 时间日期数字模块-DateTimeOptions | hour | 新增 | - | + | 时间日期数字模块-DateTimeOptions | minute | 新增 | - | + | 时间日期数字模块-DateTimeOptions | second | 新增 | - | + | 时间日期数字模块-DateTimeOptions | timeZoneName | 新增 | - | + | 时间日期数字模块-NumberOptions | locale | 新增 | - | + | 时间日期数字模块-NumberOptions | compactDisplay | 新增 | - | + | 时间日期数字模块-NumberOptions | currency | 新增 | - | + | 时间日期数字模块-NumberOptions | currencyDisplay | 新增 | - | + | 时间日期数字模块-NumberOptions | currencySign | 新增 | - | + | 时间日期数字模块-NumberOptions | localeMatcher | 新增 | - | + | 时间日期数字模块-NumberOptions | notation | 新增 | - | + | 时间日期数字模块-NumberOptions | numberingSystem | 新增 | - | + | 时间日期数字模块-NumberOptions | signDisplay | 新增 | - | + | 时间日期数字模块-NumberOptions | style | 新增 | - | + | 时间日期数字模块-NumberOptions | unit | 新增 | - | + | 时间日期数字模块-NumberOptions | unitDisplay | 新增 | - | + | 时间日期数字模块-NumberOptions | useGrouping | 新增 | - | + | 时间日期数字模块-NumberOptions | minimumIntegerDigits | 新增 | - | + | 时间日期数字模块-NumberOptions | minimumFractionDigits | 新增 | - | + | 时间日期数字模块-NumberOptions | maximumFractionDigits | 新增 | - | + | 时间日期数字模块-NumberOptions | minimumSignificantDigits | 新增 | - | + | 时间日期数字模块-NumberOptions | maximumSignificantDigits | 新增 | - | +|文件存储- system.file|mkdir|新增|-| +|文件存储- system.file|rmdir|新增|-| +|文件存储- system.file|get|新增|-| +|文件存储- system.file|list|新增|-| +|文件存储- system.file|copy|新增|-| +|文件存储- system.file|move|新增|-| +|文件存储- system.file|delete|新增|-| +|文件存储- system.file|access|新增|-| +|文件存储- system.file|writeText|新增|-| +|文件存储- system.file|writeArrayBuffer|新增|-| +|文件存储- system.file|readText|新增|-| +|文件存储- system.file|readArrayBuffer|新增|-| +|文件存储- fileio|Dir.readSync|新增|-| +|文件存储- fileio|Dir.closeSync|新增|-| +|文件存储- fileio|dirent.name|新增|-| +|文件存储- fileio|dirent.isBlockDevice()|新增|-| +|文件存储- fileio|dirent.isCharacterDevice()|新增|-| +|文件存储- fileio|dirent.isDirectory()|新增|-| +|文件存储- fileio|dirent.isFIFO()|新增|-| +|文件存储- fileio|dirent.isFile()|新增|-| +|文件存储- fileio|dirent.isSocket()|新增|-| +|文件存储- fileio|dirent.isSymbolicLink()|新增|-| +|文件存储- fileio|stat.dev|新增|-| +|文件存储- fileio|stat.ino|新增|-| +|文件存储- fileio|stat.mode|新增|-| +|文件存储- fileio|stat.nlink|新增|-| +|文件存储- fileio|stat.uid|新增|-| +|文件存储- fileio|stat.gid|新增|-| +|文件存储- fileio|stat.rdev|新增|-| +|文件存储- fileio|stat.size|新增|-| +|文件存储- fileio|stat.blocks|新增|-| +|文件存储- fileio|stat.atime|新增|-| +|文件存储- fileio|stat.mtime|新增|-| +|文件存储- fileio|stat.ctime|新增|-| +|文件存储- fileio|stat.isBlockDevice()|新增|-| +|文件存储- fileio|stat.isCharacterDevice()|新增|-| +|文件存储- fileio|stat.isDirectory()|新增|-| +|文件存储- fileio|stat.isFIFO()|新增|-| +|文件存储- fileio|stat.isFile()|新增|-| +|文件存储- fileio|stat.isSocket()|新增|-| +|文件存储- fileio|stat.isSymbolicLink()|新增|-| +|文件存储- fileio|Stream.flushSync()|新增|-| +|文件存储- fileio|Stream.writeSync()|新增|-| +|文件存储- fileio|Stream.readSync()|新增|-| +|文件存储- fileio|Stream.closeSync()|新增|-| +|文件存储- fileio|fileio.accessSync()|新增|-| +|文件存储- fileio|fileio.chmodSync()|新增|-| +|文件存储- fileio|fileio.chownSync()|新增|-| +|文件存储- fileio|fileio.closeSync()|新增|-| +|文件存储- fileio|fileio.copyFileSync()|新增|-| +|文件存储- fileio|fileio.createStreamSync()|新增|-| +|文件存储- fileio|fileio.fchmodSync()|新增|-| +|文件存储- fileio|fileio.fchownSync()|新增|-| +|文件存储- fileio|fileio.fdopenStreamSync()|新增|-| +|文件存储- fileio|fileio.fstatSync()|新增|-| +|文件存储- fileio|fileio.fsyncSync()|新增|-| +|文件存储- fileio|fileio.ftruncateSync()|新增|-| +|文件存储- fileio|fileio.mkdirSync()|新增|-| +|文件存储- fileio|fileio.openSync()|新增|-| +|文件存储- fileio|fileio.opendirSync()|新增|-| +|文件存储- fileio|fileio.readSync()|新增|-| +|文件存储- fileio|fileio.renameSync()|新增|-| +|文件存储- fileio|fileio.rmdirSync()|新增|-| +|文件存储- fileio|fileio.statSync()|新增|-| +|文件存储- fileio|fileio.truncateSync()|新增|-| +|文件存储- fileio|fileio.unlinkSync()|新增|-| +|文件存储- fileio|fileio.writeSync()|新增|-| +|设备管理-DeviceManager|DeviceInfo|新增|-| +|设备管理-DeviceManager|DeviceType|新增|-| +|设备管理-DeviceManager|DeviceStateChangeAction|新增|-| +|设备管理-DeviceManager|SubscribeInfo|新增|-| +|设备管理-DeviceManager|DiscoverMode|新增|-| +|设备管理-DeviceManager|ExchangeMedium|新增|-| +|设备管理-DeviceManager|ExchangeFreq|新增|-| +|设备管理-DeviceManager|SubscribeCap|新增|-| +|设备管理-DeviceManager|createDeviceManager(bundleName: string, callback: AsyncCallback): void|新增|-| +|设备管理-DeviceManager|release(): void|新增|-| +|设备管理-DeviceManager|getTrustedDeviceListSync(): Array|新增|-| +|设备管理-DeviceManager|startDeviceDiscovery(subscribeInfo: SubscribeInfo): void|新增|-| +|设备管理-DeviceManager|stopDeviceDiscovery(subscribeId: number): void|新增|-| +|设备管理-DeviceManager|authenticateDevice(deviceInfo: DeviceInfo): void|新增|-| +|设备管理-DeviceManager|on(type: 'deviceStateChange', callback: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void|新增|-| +|设备管理-DeviceManager|off(type: 'deviceStateChange', callback?: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void|新增|-| +|设备管理-DeviceManager|on(type: 'deviceFound', callback: Callback<{ subscribeId: number, device: DeviceInfo }>): void|新增|-| +|设备管理-DeviceManager|off(type: 'deviceFound', callback?: Callback<{ subscribeId: number, device: DeviceInfo }>): void|新增|-| +|设备管理-DeviceManager|on(type: 'discoverFail', callback: Callback<{ subscribeId: number, reason: number }>): void|新增|-| +|设备管理-DeviceManager|off(type: 'discoverFail', callback?: Callback<{ subscribeId: number, reason: number }>): void|新增|-| +|设备管理-DeviceManager|on(type: 'authResult', callback: Callback<{ deviceId: string, status: number, reason: number }>): void|新增|-| +|设备管理-DeviceManager|off(type: 'authResult', callback?: Callback<{ deviceId: string, status: number, reason: number }>): void|新增|-| +|设备管理-DeviceManager|on(type: 'serviceDie', callback: () => void): void|新增|-| +|设备管理-DeviceManager|off(type: 'serviceDie', callback?: () => void): void|新增|-| +|播放录制|createAudioPlayer(): AudioPlayer|新增|-| +|播放录制|AudioState|新增|-| +|播放录制|play(): void|新增|-| +|播放录制|pause(): void|新增|-| +|播放录制|stop(): void|新增|-| +|播放录制|seek(timeMs: number): void|新增|-| +|播放录制|setVolume(vol: number): void|新增|-| +|播放录制|reset(): void|新增|-| +|播放录制|release(): void|新增|-| +|播放录制|src: string|新增|-| +|播放录制|loop: boolean|新增|-| +|播放录制|readonly currentTime: number|新增|-| +|播放录制|readonly duration: number|新增|-| +|播放录制|readonly state: AudioState|新增|-| +|播放录制|on(type: 'play' / 'pause' / 'stop' / 'reset' / 'dataLoad' / 'finish' / 'volumeChange', callback: () => void): void|新增|-| +|播放录制|on(type: 'timeUpdate', callback: Callback): void|新增|-| +|播放录制|on(type: 'error', callback: ErrorCallback): void|新增|-| +|音频管理|getAudioManager(): AudioManager|新增|-| +|音频管理|AudioVolumeType|新增|-| +|音频管理|MEDIA|新增|-| +|音频管理|RINGTONE|新增|-| +|音频管理|DeviceFlag|新增|-| +|音频管理|OUTPUT_DEVICES_FLAG|新增|-| +|音频管理|INPUT_DEVICES_FLAG |新增|-| +|音频管理|ALL_DEVICES_FLAG |新增|-| +|音频管理|DeviceRole |新增|-| +|音频管理|INPUT_DEVICE |新增|-| +|音频管理|OUTPUT_DEVICE |新增|-| +|音频管理|DeviceType |新增|-| +|音频管理|INVALID |新增|-| +|音频管理|SPEAKER |新增|-| +|音频管理|WIRED_HEADSET |新增|-| +|音频管理|BLUETOOTH_SCO |新增|-| +|音频管理|BLUETOOTH_A2DP |新增|-| +|音频管理|MIC|新增|-| +|音频管理|AudioRingMode |新增|-| +|音频管理|RINGER_MODE_NORMAL |新增|-| +|音频管理|RINGER_MODE_SILENT|新增|-| +|音频管理|RINGER_MODE_VIBRATE |新增|-| +|音频管理|setVolume(audioType: AudioVolumeType, volume: number,callback: AsyncCallback): void|新增|-| +|音频管理|setVolume(audioType: AudioVolumeType, volume: number): Promise|新增|-| +|音频管理|getVolume(audioType: AudioVolumeType, callback: AsyncCallback): void|新增|-| +|音频管理|getVolume(audioType: AudioVolumeType): Promise|新增|-| +|音频管理|getMinVolume(audioType: AudioVolumeType, callback: AsyncCallback): void|新增|-| +|音频管理|getMinVolume(audioType: AudioVolumeType): Promise|新增|-| +|音频管理|getMaxVolume(audioType: AudioVolumeType, callback: AsyncCallback): void|新增|-| +|音频管理|getMaxVolume(audioType: AudioVolumeType): Promise|新增|-| +|音频管理|getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback): void|新增|-| +|音频管理|getDevices(deviceFlag: DeviceFlag): Promise|新增|-| +|音频管理|getRingerMode(callback: AsyncCallback): void|新增|-| +|音频管理|getRingerMode(): Promise|新增|-| +|音频管理|setRingerMode(mode: AudioRingMode, callback: AsyncCallback): void|新增|-| +|音频管理|setRingerMode(mode: AudioRingMode): Promise|新增|-| +|音频管理|isMute(volumeType: AudioVolumeType, callback: AsyncCallback): void|新增|-| +|音频管理|isMute(volumeType: AudioVolumeType): Promise|新增|-| +|音频管理|isActive(volumeType: AudioVolumeType, callback: AsyncCallback): void|新增|-| +|音频管理|isActive(volumeType: AudioVolumeType): Promise|新增|-| +|音频管理|isMicrophoneMute(callback: AsyncCallback): void|新增|-| +|音频管理|isMicrophoneMute(): Promise|新增|-| +|音频管理|mute(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback) : void|新增|-| +|音频管理|mute(volumeType: AudioVolumeType, mute: boolean): Promise|新增|-| +|音频管理|setMicrophoneMute(mute: boolean, callback: AsyncCallback): void|新增|-| +|音频管理|setMicrophoneMute(mute: boolean): Promise|新增|-| +|音频管理|isDeviceActive(deviceType: DeviceType, callback: AsyncCallback): void|新增|-| +|音频管理|isDeviceActive(deviceType: DeviceType): Promise|新增|-| +|音频管理|setDeviceActive(deviceType: DeviceType, active: boolean, callback: AsyncCallback): void|新增|-| +|音频管理|setDeviceActive(deviceType: DeviceType, active: boolean): Promise|新增|-| +|音频管理|getAudioParameter(key: string, callback: AsyncCallback): void|新增|-| +|音频管理|getAudioParameter(key: string): Promise|新增|-| +|音频管理|setAudioParameter(key: string, value: string, callback: AsyncCallback): void|新增|-| +|音频管理|setAudioParameter(key: string, value: string): Promise|新增|-| +|音频管理|AudioDeviceDescriptor|新增|-| +|音频管理|readonly deviceRole: DeviceRole|新增|-| +|音频管理|readonly deviceType: DeviceType|新增|-| +|音频管理|AudioDeviceDescriptors |新增|-| + diff --git a/website/docs/_posts/release-notes/api-change/v2.2-beta2/native-apidiff-v2.2-beta2.md b/website/docs/_posts/release-notes/api-change/v2.2-beta2/native-apidiff-v2.2-beta2.md new file mode 100644 index 0000000000000000000000000000000000000000..c94eed18b5f22d9de657d520dd8ba77a12e8ca23 --- /dev/null +++ b/website/docs/_posts/release-notes/api-change/v2.2-beta2/native-apidiff-v2.2-beta2.md @@ -0,0 +1,32 @@ +--- +title: native-apidiff-v2.2-beta2.md +permalink: /pages/extra/0d34cb/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:33 +--- +# Native API 差异报告 +OpenHarmony 2.2 Beta2相较于OpenHarmony 2.0 Canary版本的API变更如下: +## 轻量级系统接口变更 + +| 模块名称 | 接口名称 | 变更类型 | 变更类型 | +| -------- | -------- | -------- | -------- | +| global_i18n_lite | static LocaleInfo LocaleInfo ::ForLanguageTag(const char *languageTag, I18nStatus &status); | 新增 | 新增接口 | +| global_i18n_lite | const char LocaleInfo ::*GetExtension(const char *key); | 新增 | 新增接口 | +| global_i18n_lite | WeekInfo::WeekInfo(const LocaleInfo &localeInfo, I18nStatus &status); | 新增 | 新增接口 | +| global_i18n_lite | uint8_t WeekInfo::GetFirstDayOfWeek(); | 新增 | 新增接口 | +| global_i18n_lite | uint8_t WeekInfo::GetMinimalDaysInFirstWeek(); | 新增 | 新增接口 | +| global_i18n_lite | uint8_t WeekInfo::GetFirstDayOfWeekend(); | 新增 | 新增接口 | +| global_i18n_lite | uint8_t WeekInfo::GetLastDayOfWeekend(); | 新增 | 新增接口 | +| global_i18n_lite | int PluralFormat::GetPluralRuleIndex(double number, I18nStatus status); | 新增 | 新增接口 | +| powermgr_powermgr_lite | const RunningLock *CreateRunningLock(const char *name, RunningLockType type, RunningLockFlag flag); | 新增 | 新增接口 | +| powermgr_powermgr_lite | void DestroyRunningLock(const RunningLock *lock); | 新增 | 新增接口 | +| powermgr_powermgr_lite | BOOL AcquireRunningLock(const RunningLock *lock); | 新增 | 新增接口 | +| powermgr_powermgr_lite | BOOL ReleaseRunningLock(const RunningLock *lock); | 新增 | 新增接口 | +| powermgr_powermgr_lite | BOOL IsRunningLockHolding(const RunningLock *lock); | 新增 | 新增接口 | \ No newline at end of file diff --git a/website/docs/_posts/release-notes/api-change/v3.0-LTS/js-apidiff-v3.0-lts.md b/website/docs/_posts/release-notes/api-change/v3.0-LTS/js-apidiff-v3.0-lts.md new file mode 100644 index 0000000000000000000000000000000000000000..0dd15a7b690c3f2a6ec294efb6e20e2b1b39b454 --- /dev/null +++ b/website/docs/_posts/release-notes/api-change/v3.0-LTS/js-apidiff-v3.0-lts.md @@ -0,0 +1,638 @@ +--- +title: js-apidiff-v3.0-lts.md +permalink: /pages/extra/624df1/ +navbar: true +sidebar: false +prev: false +next: false +search: false +article: false +comment: false +editLink: false +date: 2021-12-30 18:17:33 +--- +# JS API 差异报告 +OpenHarmony 3.0 LTS相较于OpenHarmony 2.2 Beta2版本的API变更如下: +## 标准系统接口变更 + +| 模块名称 | 接口名称 | 变更类型 | 变更说明 | +| -------- | -------- | -------- | -------- | +|语言编译器运行时-worker|postMessage(obj):void|新增|宿主线程与worker通信,传递数据| +|语言编译器运行时-worker|postMessage(message: Object, options?: PostMessageOptions):void|新增|宿主线程与worker通信,转移arrayBuffer的数据控制权| +|语言编译器运行时-worker|terminate():void|新增|宿主线程主动停止worker| +|语言编译器运行时-worker|on(type: string, listener: EventListener): void|新增|向worker添加回调接口| +|语言编译器运行时-worker|once(type: string, listener: EventListener): void|新增|向worker添加回调接口,并且在回调一次会释放回调| +|语言编译器运行时-worker|off(type: string, listener?: EventListener): void|新增|删除worker已添加的回调接口| +|语言编译器运行时-worker|addEventListener(type: string, listener: EventListener): void|新增|向worker添加回调接口| +|语言编译器运行时-worker|removeEventListener(type: string, listener?: EventListener): void|新增|删除worker已添加的回调接口| +|语言编译器运行时-worker|removeAllListener(): void|新增|删除worker所有的回调接口| +|语言编译器运行时-worker|dispatchEvent(event: Event): boolean|新增|向worker发送指定事件,触发回调接口| +|语言编译器运行时-parentPort|postMessage(obj):void|新增|worker与宿主线程通信,传递数据| +|语言编译器运行时-parentPort|postMessage(message: Object, options?: PostMessageOptions):void|新增|worker与宿主线程通信,转移arrayBuffer的数据控制权| +|语言编译器运行时-parentPort|close(): void|新增|worker主动终止| +|语言编译器运行时-Util|printf(format: string, ...args: Object[]): string|新增|-| +|语言编译器运行时-Util|getErrorString(errno: number): string|新增|-| +|语言编译器运行时-Util|callbackWrapper(original: Function): (err: Object, value: Object) => void|新增|-| +|语言编译器运行时-Util|promiseWrapper(original: (err: Object, value: Object) => void): Object|新增|-| +|语言编译器运行时-Util|new TextDecoder([encoding[, options]])|新增|-| +|语言编译器运行时-Util|decode([input[, options]]):string|新增|-| +|语言编译器运行时-Util|new TextEncoder()|新增|-| +|语言编译器运行时-Util|encode(input?: string): Uint8Array;|新增|-| +|语言编译器运行时-Util|"encodeInto(input: string,dest: Uint8Array,): { read: number; written: number };"|新增|-| +|语言编译器运行时-Util|readonly encoding: string;|新增|-| +|语言编译器运行时-Util|readonly fatal: boolean;|新增|-| +|语言编译器运行时-Util|readonly ignoreBOM = false;|新增|-| +|语言编译器运行时-Util|readonly encoding = "utf-8";|新增|-| +|语言编译器运行时-URL|new URL(url: string, base?: string/URL)|新增|-| +|语言编译器运行时-URL|toString(): string;|新增|-| +|语言编译器运行时-URL|toJSON(): string;|新增|-| +|语言编译器运行时-URL|new URSearchParams()|新增|-| +|语言编译器运行时-URL|new URSearchParams(string)|新增|-| +|语言编译器运行时-URL|new URSearchParams(obj)|新增|-| +|语言编译器运行时-URL|new URSearchParams(iterable)|新增|-| +|语言编译器运行时-URL|append(name: string, value: string): void;|新增|-| +|语言编译器运行时-URL|delete(name: string): void;|新增|-| +|语言编译器运行时-URL|entries(): IterableIterator<[string, string]>;|新增|-| +|语言编译器运行时-URL|forEach(callbackfn: (value: string, key: string, parent: this) => void, thisArg?: any,): void;|新增|-| +|语言编译器运行时-URL|get(name: string): string / null;|新增|-| +|语言编译器运行时-URL|getAll(name: string): string[];|新增|-| +|语言编译器运行时-URL|has(name: string): boolean;|新增|-| +|语言编译器运行时-URL|keys(): IterableIterator;|新增|-| +|语言编译器运行时-URL|set(name: string, value: string): void;|新增|-| +|语言编译器运行时-URL|sort():void;|新增|-| +|语言编译器运行时-URL|toString():string|新增|-| +|语言编译器运行时-URL|values(): IterableIterator;|新增|-| +|语言编译器运行时-URL|URSearchParams[Symbol.iterator]()|新增|-| +|语言编译器运行时-URL|hash: string;|新增|-| +|语言编译器运行时-URL|host: string;|新增|-| +|语言编译器运行时-URL|hostname: string;|新增|-| +|语言编译器运行时-URL|href: string;|新增|-| +|语言编译器运行时-URL|readonly origin: string;|新增|-| +|语言编译器运行时-URL|password: string;|新增|-| +|语言编译器运行时-URL|pathname: string;|新增|-| +|语言编译器运行时-URL|port: string;|新增|-| +|语言编译器运行时-URL|protocol: string;|新增|-| +|语言编译器运行时-URL|search: string;|新增|-| +|语言编译器运行时-URL|readonly searchParams: URLSearchParams;|新增|-| +|语言编译器运行时-URL|username: string;|新增|-| +|语言编译器运行时-ChildProcess|readonly pid: number;|新增|-| +|语言编译器运行时-ChildProcess|readonly ppid: number;|新增|-| +|语言编译器运行时-ChildProcess|readonly exitCode: number;|新增|-| +|语言编译器运行时-ChildProcess|readonly killed: boolean;|新增|-| +|语言编译器运行时-ChildProcess|wait(): Promise;|新增|-| +|语言编译器运行时-ChildProcess|getOutput(): Promise;|新增|-| +|语言编译器运行时-ChildProcess|getErrorOutput(): Promise;|新增|-| +|语言编译器运行时-ChildProcess|close(): void;|新增|-| +|语言编译器运行时-ChildProcess|kill(signal: number): void;|新增|-| +|语言编译器运行时-process|runCmd(command: string,options?: { timeout : number, killSignal : number / string, maxBuffer : number }): ChildProcess;|新增|-| +|语言编译器运行时-process|getPid(): number;|新增|-| +|语言编译器运行时-process|getPpid(): number;|新增|-| +|语言编译器运行时-process|abort(): void;|新增|-| +|语言编译器运行时-process|on(type: string, listener: EventListener): void;|新增|-| +|语言编译器运行时-process|exit(code?:number): void;|新增|-| +|语言编译器运行时-process|cwd(): string;|新增|-| +|语言编译器运行时-process|chdir(dir: string): void;|新增|-| +|语言编译器运行时-process|getEgid(): number;|新增|-| +|语言编译器运行时-process|getEuid(): number;|新增|-| +|语言编译器运行时-process|getGid(): number|新增|-| +|语言编译器运行时-process|getUid(): number;|新增|-| +|语言编译器运行时-process|uptime(): number;|新增|-| +|语言编译器运行时-process|getGroups(): number[];|新增|-| +|语言编译器运行时-process|kill(signal?: number, pid?: number): boolean;|新增|-| +|升级服务子系统-Updater|checkNewVersion(): Promise;|新增| -| +|升级服务子系统-Updater|rebootAndCleanUserData(callback: AsyncCallback): void;|新增| -| +|升级服务子系统-Updater|rebootAndCleanCache(): Promise;|新增| -| +|升级服务子系统-Updater|function getUpdaterFromOther(device: string, updateType?: UpdateTypes): Updater;|新增| -| +|升级服务子系统-Updater|cancel(): void;|新增| -| +|升级服务子系统-Updater|upgrade(): void;|新增| -| +|升级服务子系统-Updater|off(eventType: 'downloadProgress', callback?: UpdateProgressCallback): void;|新增| -| +|升级服务子系统-Updater|getUpdatePolicy(callback: AsyncCallback): void;|新增| -| +|升级服务子系统-Updater|function getUpdaterForOther(device: string, updateType?: UpdateTypes): Updater;|新增| -| +|升级服务子系统-Updater|setUpdatePolicy(policy: UpdatePolicy, callback: AsyncCallback): void;|新增| -| +|升级服务子系统-Updater|getNewVersionInfo(): Promise;|新增| -| +|升级服务子系统-Updater|function getUpdater(updateType?: UpdateTypes): Updater;|新增| -| +|升级服务子系统-Updater|applyNewVersion(callback: AsyncCallback): void;|新增| -| +|升级服务子系统-Updater|rebootAndCleanUserData(): Promise;|新增| -| +|升级服务子系统-Updater|off(eventType: 'verifyProgress', callback?: UpdateProgressCallback): void;|新增| -| +|升级服务子系统-Updater|on(eventType: 'upgradeProgress', callback: UpdateProgressCallback): void;|新增| -| +|升级服务子系统-Updater|checkNewVersion(callback: AsyncCallback): void;|新增| -| +|升级服务子系统-Updater|on(eventType: 'downloadProgress', callback: UpdateProgressCallback): void;|新增| -| +|升级服务子系统-Updater|getUpdatePolicy(): Promise;|新增| -| +|升级服务子系统-Updater|download(): void;|新增| -| +|升级服务子系统-Updater|off(eventType: 'upgradeProgress', callback?: UpdateProgressCallback): void;|新增| -| +|升级服务子系统-Updater|getNewVersionInfo(callback: AsyncCallback): void;|新增| -| +|升级服务子系统-Updater|on(eventType: 'verifyProgress', callback: UpdateProgressCallback): void;|新增| -| +|升级服务子系统-Updater|verifyUpdatePackage(upgradeFile: string, certsFile: string): void;|新增| -| +|升级服务子系统-Updater|setUpdatePolicy(policy: UpdatePolicy): Promise;|新增| -| +|升级服务子系统-Updater|rebootAndCleanCache(callback: AsyncCallback): void;|新增| -| +|升级服务子系统-Updater|applyNewVersion(): Promise;|新增| -| +|全球化子系统-I18n|getSystemLanguages(): Array;|新增| -| +|全球化子系统-I18n|getSystemCountries(language: string): Array;|新增| -| +|全球化子系统-I18n|isSuggested(language: string, region?: string): boolean;|新增| -| +|全球化子系统-I18n|getSystemLanguage(): string;|新增| -| +|全球化子系统-I18n|setSystemLanguage(language: string);|新增| -| +|全球化子系统-I18n|getSystemRegion(): string;|新增| -| +|全球化子系统-I18n|setSystemRegion(region: string);|新增| -| +|全球化子系统-I18n|"getDisplayCountry(locale: string, displayLocale: string,sentenceCase?: boolean): string;"|新增| -| +|全球化子系统-I18n|getSystemLocale(): string;|新增| -| +|全球化子系统-I18n|setSystemLocale(locale: string);|新增| -| +|全球化子系统-I18n|"getDisplayLanguage(locale: string, displayLocale: string,sentenceCase?: boolean): string;"|新增| -| +|电话子系统-radio|getNetworkState(callback: AsyncCallback): void;getNetworkState(slotId: number, callback: AsyncCallback): void;getNetworkState(slotId?: number): Promise;|新增| -| +|电话子系统-sim|getSimAccountInfo(slotId: number, callback: AsyncCallback): void;getSimAccountInfo(slotId: number): Promise;|新增| -| +|电话子系统-sim|getDefaultVoiceSlotId(callback: AsyncCallback): void;getDefaultVoiceSlotId(): Promise;|新增| -| +|电话子系统-sim|getSimSpn(slotId: number, callback: AsyncCallback): void;getSimSpn(slotId: number): Promise;|新增| -| +|电话子系统-sim|getISOCountryCodeForSim(slotId: number, callback: AsyncCallback): void;getISOCountryCodeForSim(slotId: number): Promise;|新增| -| +|电话子系统-sim|getSimIccId(slotId: number, callback: AsyncCallback): void;getSimIccId(slotId: number): Promise;|新增| -| +|电话子系统-sim|getSimGid1(slotId: number, callback: AsyncCallback): void;getSimGid1(slotId: number): Promise;|新增| -| +|电话子系统-sim|getISOCountryCodeForSim(slotId: number, callback: AsyncCallback): void;getISOCountryCodeForSim(slotId: number): Promise;|新增| -| +|电话子系统-sim|getSimOperatorNumeric(slotId: number, callback: AsyncCallback): void;getSimOperatorNumeric(slotId: number): Promise;|新增| -| +|电话子系统-sim|getSimSpn(slotId: number, callback: AsyncCallback): void;getSimSpn(slotId: number): Promise;|新增| -| +|电话子系统-sim|getSimIccId(slotId: number, callback: AsyncCallback): void;getSimIccId(slotId: number): Promise;|新增| -| +|电话子系统-sim|getIMSI(slotId: number, callback: AsyncCallback): void;getIMSI(slotId: number): Promise;|新增| -| +|电话子系统-call|combineConference(callId: number, callback: AsyncCallback): void;combineConference(callId: number): Promise;|新增| -| +|电话子系统-call|startDTMF(callId: number, character: string, callback: AsyncCallback): void;startDTMF(callId: number, character: string): Promise;|新增| -| +|电话子系统-call|stopDTMF(callId: number, callback: AsyncCallback): void;stopDTMF(callId: number): Promise;|新增| -| +|电话子系统-sim|setDefaultVoiceSlotId(slotId: number, callback: AsyncCallback): void;setDefaultVoiceSlotId(slotId: number): Promise;|新增| -| +|电话子系统-sim|unlockPin(slotId: number, pin: string, callback: AsyncCallback): void;unlockPin(slotId: number, pin: string): Promise;|新增| -| +|电话子系统-sim|alterPin(slotId: number, newPin: string, oldPin: string, callback: AsyncCallback): void;alterPin(slotId: number, newPin: string, oldPin: string): Promise;|新增| -| +|电话子系统-sim|setLockState(slotId: number, pin: string, enable: number, callback: AsyncCallback): void;setLockState(slotId: number, pin: string, enable: number): Promise;|新增| -| +|电话子系统-sim|getSimState(slotId: number, callback: AsyncCallback): void;getSimState(slotId: number): Promise;|新增| -| +|电话子系统-sim|getSimState(slotId: number, callback: AsyncCallback): void;getSimState(slotId: number): Promise;|新增| -| +|电话子系统-sim|getSimState(slotId: number, callback: AsyncCallback): void;getSimState(slotId: number): Promise;|新增| -| +|电话子系统-sim|getSimState(slotId: number, callback: AsyncCallback): void;getSimState(slotId: number): Promise;|新增| -| +|电话子系统-call|isEmergencyPhoneNumber(phoneNumber: string, callback: AsyncCallback): void;isEmergencyPhoneNumber(phoneNumber: string, options: EmergencyNumberOptions, callback: AsyncCallback): void;isEmergencyPhoneNumber(phoneNumber: string, options?: EmergencyNumberOptions): Promise;|新增| -| +|电话子系统-sms|createMessage(pdu: Array, specification: string, callback: AsyncCallback): void;createMessage(pdu: Array, specification: string): Promise;|新增| -| +|电话子系统-call|hasCall(callback: AsyncCallback): void;hasCall(): Promise;|新增| -| +|电话子系统-sms|sendMessage(options: SendMessageOptions): void;|新增| -| +|电话子系统-call|dial(phoneNumber: string, callback: AsyncCallback): void;dial(phoneNumber: string, options: DialOptions, callback: AsyncCallback): void;dial(phoneNumber: string, options?: DialOptions): Promise;|新增| -| +|电话子系统-call|interface DialOptions {extras?: boolean; }|新增| -| +|电话子系统-sms|sendMessage(options: SendMessageOptions): void;|新增| -| +|电话子系统-sms|getDefaultSmsSlotId(callback: AsyncCallback): void;getDefaultSmsSlotId(): Promise;|新增| -| +|电话子系统-call|formatPhoneNumber(phoneNumber: string, callback: AsyncCallback): void;formatPhoneNumber(phoneNumber: string, options: NumberFormatOptions, callback: AsyncCallback): void;formatPhoneNumber(phoneNumber: string, options?: NumberFormatOptions): Promise;|新增| -| +|电话子系统-call|formatPhoneNumber(phoneNumber: string, callback: AsyncCallback): void;formatPhoneNumber(phoneNumber: string, options: NumberFormatOptions, callback: AsyncCallback): void;formatPhoneNumber(phoneNumber: string, options?: NumberFormatOptions): Promise;|新增| -| +|电话子系统-call|formatPhoneNumberToE164(phoneNumber: string, countryCode: string, callback: AsyncCallback): void;formatPhoneNumberToE164(phoneNumber: string, countryCode: string): Promise;|新增| -| +|电话子系统-sms|setDefaultSmsSlotId(slotId: number, callback: AsyncCallback): void;setDefaultSmsSlotId(slotId: number): Promise;|新增| -| +|电话子系统-call|getCallState(callback: AsyncCallback): void;getCallState(): Promise;|新增| -| +|电话子系统-sms|setSmscAddr(slotId: number, smscAddr: string, callback: AsyncCallback): void;setSmscAddr(slotId: number, smscAddr: string): Promise;|新增| -| +|电话子系统-sms|getSmscAddr(slotId: number, callback: AsyncCallback): void;getSmscAddr(slotId: number): Promise;|新增| -| +|电话子系统-sms|addSimMessage(options: SimMessageOptions, callback: AsyncCallback): void;addSimMessage(options: SimMessageOptions): Promise;|新增| -| +|电话子系统-sms|delSimMessage(slotId: number, msgIndex: number, callback: AsyncCallback): void;delSimMessage(slotId: number, msgIndex: number): Promise;|新增| -| +|电话子系统-radio|getISOCountryCodeForNetwork(slotId: number, callback: AsyncCallback): void;getISOCountryCodeForNetwork(slotId: number): Promise;|新增| -| +|电话子系统-sms|updateSimMessage(options: UpdateSimMessageOptions, callback: AsyncCallback): void;updateSimMessage(options: UpdateSimMessageOptions): Promise;|新增| -| +|电话子系统-radio|getISOCountryCodeForNetwork(slotId: number, callback: AsyncCallback): void;getISOCountryCodeForNetwork(slotId: number): Promise;|新增| -| +|电话子系统-sms|getAllSimMessages(slotId: number, callback: AsyncCallback>): void;getAllSimMessages(slotId: number): Promise>;|新增| -| +|电话子系统-call|isInEmergencyCall(callback: AsyncCallback): void;isInEmergencyCall(): Promise;|新增| -| +|电话子系统-sms|setCBConfig(options: CBConfigOptions, callback: AsyncCallback): void;setCBConfig(options: CBConfigOptions): Promise;|新增| -| +|电话子系统-call|answer(callId: number, callback: AsyncCallback): void;answer(callId: number): Promise;|新增| -| +|电话子系统-call|hangup(callId: number, callback: AsyncCallback): void;hangup(callId: number): Promise;|新增| -| +|电话子系统-call|reject(callId: number, callback: AsyncCallback): void;reject(callId: number, options: RejectMessageOptions, callback: AsyncCallback): void;reject(callId: number, options?: RejectMessageOptions): Promise;|新增| -| +|电话子系统-call|holdCall(callId: number, callback: AsyncCallback): void;holdCall(callId: number): Promise;|新增| -| +|电话子系统-call|unHoldCall(callId: number, callback: AsyncCallback): void;unHoldCall(callId: number): Promise;|新增| -| +|电话子系统-call|switchCall(callId: number, callback: AsyncCallback): void;switchCall(callId: number): Promise;|新增| -| +|电话子系统-radio|setNetworkSelectionMode(options: NetworkSelectionModeOptions, callback: AsyncCallback): void;setNetworkSelectionMode(options: NetworkSelectionModeOptions): Promise;|新增| -| +|电话子系统-radio|getNetworkSearchInformation(slotId: number, callback: AsyncCallback): void;getNetworkSearchInformation(slotId: number): Promise;|新增| -| +|电话子系统-radio|getNetworkSelectionMode(slotId: number, callback: AsyncCallback): void;getNetworkSelectionMode(slotId: number): Promise;|新增| -| +|电话子系统-radio|isRadioOn(callback: AsyncCallback): void;isRadioOn(): Promise;|新增| -| +|电话子系统-radio|turnOnRadio(callback: AsyncCallback): void;turnOnRadio(): Promise;|新增| -| +|电话子系统-radio|turnOffRadio(callback: AsyncCallback): void;turnOffRadio(): Promise;|新增| -| +|电话子系统-radio|getSignalInformation(slotId: number, callback: AsyncCallback>): void;getSignalInformation(slotId: number): Promise>;|新增| -| +|电话子系统-radio|getRadioTech(slotId: number, callback: AsyncCallback<{psRadioTech: RadioTechnology, csRadioTech: RadioTechnology}>): void;getRadioTech(slotId: number): Promise<{psRadioTech: RadioTechnology, csRadioTech: RadioTechnology}>;|新增| -| +|电话子系统-radio|getRadioTech(slotId: number, callback: AsyncCallback<{psRadioTech: RadioTechnology, csRadioTech: RadioTechnology}>): void;getRadioTech(slotId: number): Promise<{psRadioTech: RadioTechnology, csRadioTech: RadioTechnology}>;|新增| -| +|电话子系统-radio|getRadioTech(slotId: number, callback: AsyncCallback<{psRadioTech: RadioTechnology, csRadioTech: RadioTechnology}>): void;getRadioTech(slotId: number): Promise<{psRadioTech: RadioTechnology, csRadioTech: RadioTechnology}>;|新增| -| +|数据管理-distributeddata|put(key:string, value:Uint8Array / string / boolean / number, callback: AsyncCallback):void put(key:string, value:Uint8Array / string / boolean / number):Promise|新增| -| +|数据管理-distributeddata|delete(key: string, callback: AsyncCallback): void delete(key: string): Promise|新增| -| +|数据管理-distributeddata|on(event:'dataChange', subType: SubscribeType, observer: Callback): void|新增| -| +|数据管理-distributeddata|get(key:string, callback:AsyncCallback):void get(key:string):Promise|新增| -| +|数据管理-distributeddata|sync(deviceIdList:string[], mode:SyncMode, allowedDelayMs?:number):void|新增| -| +|数据管理-distributeddata|createKVManager(config: KVManagerConfig, callback: AsyncCallback): void;createKVManager(config: KVManagerConfig): Promise;|新增| -| +|数据管理-distributeddata|getKVStore(options: Options, storeId: string): Promise;getKVStore(options: Options, storeId: string, callback: AsyncCallback): void;|新增| -| +|数据管理-distributeddata|on(event:'syncComplete', syncCallback: Callback>):void|新增| -| +|数据管理-rdb|type ValueType = number / string / boolean;|新增| -| +|数据管理-rdb|type ValuesBucket = { [key: string]: ValueType / Uint8Array / null; }|新增| -| +|数据管理-rdb|name: string;|新增| -| +|数据管理-rdb|constructor(name: string)|新增| -| +|数据管理-rdb|equalTo(field: string, value: ValueType): RdbPredicates;|新增| -| +|数据管理-rdb|notEqualTo(field: string, value: ValueType): RdbPredicates;|新增| -| +|数据管理-rdb|beginWrap(): RdbPredicates;|新增| -| +|数据管理-rdb|endWrap(): RdbPredicates;|新增| -| +|数据管理-rdb|function getRdbStore(config: StoreConfig, version: number, callback: AsyncCallback): void;function getRdbStore(config: StoreConfig, version: number): Promise;|新增| -| +|数据管理-rdb|function deleteRdbStore(name: string, callback: AsyncCallback): void;function deleteRdbStore(name: string): Promise;|新增| -| +|数据管理-rdb|insert(name: string, values: ValuesBucket, callback: AsyncCallback): void;insert(name: string, values: ValuesBucket): Promise;|新增| -| +|数据管理-rdb|update(values: ValuesBucket, rdbPredicates: RdbPredicates, callback: AsyncCallback): void;update(values: ValuesBucket, rdbPredicates: RdbPredicates): Promise;|新增| -| +|数据管理-rdb|delete(rdbPredicates: RdbPredicates, callback: AsyncCallback): void;delete(rdbPredicates: RdbPredicates): Promise;|新增| -| +|数据管理-rdb|query(rdbPredicates: RdbPredicates, columns: Array, callback: AsyncCallback): void;query(rdbPredicates: RdbPredicates, columns: Array): Promise;|新增| -| +|数据管理-rdb|executeSql(sql: string, bindArgs: Array, callback: AsyncCallback): void;executeSql(sql: string, bindArgs: Array): Promise;|新增| -| +|数据管理-rdb|like(field: string, value: string): RdbPredicates;|新增| -| +|数据管理-rdb|glob(field: string, value: string): RdbPredicates;|新增| -| +|数据管理-rdb|between(field: string, low: ValueType, high: ValueType): RdbPredicates;|新增| -| +|数据管理-rdb|notBetween(field: string, low: ValueType, high: ValueType): RdbPredicates;|新增| -| +|数据管理-rdb|greaterThan(field: string, value: ValueType): RdbPredicates;|新增| -| +|数据管理-rdb|lessThan(field: string, value: ValueType): RdbPredicates;|新增| -| +|数据管理-rdb|greaterThanOrEqualTo(field: string, value: ValueType): RdbPredicates;|新增| -| +|数据管理-rdb|lessThanOrEqualTo(field: string, value: ValueType): RdbPredicates;|新增| -| +|数据管理-rdb|or(): RdbPredicates;|新增| -| +|数据管理-rdb|and(): RdbPredicates;|新增| -| +|数据管理-rdb|contains(field: string, value: string): RdbPredicates;|新增| -| +|数据管理-rdb|beginsWith(field: string, value: string): RdbPredicates;|新增| -| +|数据管理-rdb|endsWith(field: string, value: string): RdbPredicates;|新增| -| +|数据管理-rdb|isNull(field: string): RdbPredicates;|新增| -| +|数据管理-rdb|isNotNull(field: string): RdbPredicates;|新增| -| +|数据管理-rdb|isEnded: boolean;|新增| -| +|数据管理-rdb|isStarted: boolean;|新增| -| +|数据管理-rdb|isClosed: boolean;|新增| -| +|数据管理-rdb|getColumnIndex(columnName: string): number;|新增| -| +|数据管理-rdb|getColumnName(columnIndex: number): string;|新增| -| +|数据管理-rdb|goTo(offset: number): boolean;|新增| -| +|数据管理-rdb|goToRow(position: number): boolean;|新增| -| +|数据管理-rdb|goToFirstRow(): boolean;|新增| -| +|数据管理-rdb|goToLastRow(): boolean;|新增| -| +|数据管理-rdb|goToNextRow(): boolean;|新增| -| +|数据管理-rdb|goToPreviousRow(): boolean;|新增| -| +|数据管理-rdb|getBlob(columnIndex: number): Uint8Array;|新增| -| +|数据管理-rdb|getString(columnIndex: number): string;|新增| -| +|数据管理-rdb|getLong(columnIndex: number): number;|新增| -| +|数据管理-rdb|getDouble(columnIndex: number): number;|新增| -| +|数据管理-dataAbility|orderByDesc(field: string): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|distinct(): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|limitAs(value: number): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|offsetAs(rowOffset: number): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|groupBy(fields: Array): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|indexedBy(field: string): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|in(field: string, value: Array): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|notIn(field: string, value: Array): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|glob(field: string, value: string): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|between(field: string, low: ValueType, high: ValueType): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|notBetween(field: string, low: ValueType, high: ValueType): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|greaterThan(field: string, value: ValueType): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|lessThan(field: string, value: ValueType): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|greaterThanOrEqualTo(field: string, value: ValueType): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|lessThanOrEqualTo(field: string, value: ValueType): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|orderByAsc(field: string): DataAbilityPredicates;|新增| -| +|数据管理-rdb|isColumnNull(columnIndex: number): boolean;|新增| -| +|数据管理-rdb|close(): void;|新增| -| +|数据管理-dataAbility|function createRdbPredicates(name: string, dataAbilityPredicates: DataAbilityPredicates): rdb.RdbPredicates;|新增| -| +|数据管理-dataAbility|equalTo(field: string, value: ValueType): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|notEqualTo(field: string, value: ValueType): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|beginWrap():DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|endWrap(): DataAbilityPredicates;|新增| -| +|数据管理-rdb|orderByAsc(field: string): RdbPredicates;|新增| -| +|数据管理-rdb|orderByDesc(field: string): RdbPredicates;|新增| -| +|数据管理-rdb|distinct(): RdbPredicates;|新增| -| +|数据管理-rdb|limitAs(value: number): RdbPredicates;|新增| -| +|数据管理-rdb|offsetAs(rowOffset: number): RdbPredicates;|新增| -| +|数据管理-rdb|groupBy(fields: Array): RdbPredicates;|新增| -| +|数据管理-rdb|indexedBy(field: string): RdbPredicates;|新增| -| +|数据管理-dataAbility|or(): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|and(): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|contains(field: string, value: string): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|beginsWith(field: string, value: string): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|endsWith(field: string, value: string): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|isNull(field: string): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|isNotNull(field: string): DataAbilityPredicates;|新增| -| +|数据管理-dataAbility|like(field: string, value: string): DataAbilityPredicates;|新增| -| +|数据管理-rdb|in(field: string, value: Array): RdbPredicates;|新增| -| +|数据管理-rdb|notIn(field: string, value: Array): RdbPredicates;|新增| -| +|数据管理-rdb|columnNames: Array;|新增| -| +|数据管理-rdb|columnCount: number;|新增| -| +|数据管理-rdb|rowCount: number;|新增| -| +|数据管理-rdb|rowIndex: number;|新增| -| +|数据管理-rdb|isAtFirstRow: boolean;|新增| -| +|数据管理-rdb|isAtLastRow: boolean;|新增| -| +|事件通知-notification|title: string;|新增| -| +|事件通知-notification|sound?: string;|新增| -| +|事件通知-notification|text: string;|新增| -| +|事件通知-notification|vibrationValues?: Array;|新增| -| +|事件通知-wantAgent|want?: Want;|新增| -| +|事件通知-notification|vibrationEnabled?: boolean;|新增| -| +|事件通知-notification|badgeFlag?: boolean;|新增| -| +|事件通知-notification|type: notification.SlotType;|新增| -| +|事件通知-wantAgent|code: number;|新增| -| +|事件通知-notification|contentType: ContentType;|新增| -| +|事件通知-notification|picture: image.PixelMap;|新增| -| +|事件通知-notification|briefText: string;|新增| -| +|事件通知-notification|briefText: string;|新增| -| +|事件通知-notification|briefText: string;|新增| -| +|事件通知-notification|bypassDnd?: boolean;|新增| -| +|事件通知-notification|additionalText?: string;|新增| -| +|事件通知-wantagent|function cancel(info: WantAgentInfo, callback: AsyncCallback): void;|新增| -| +|事件通知-wantAgent|enum OperationType|新增| -| +|事件通知-wantAgent|enum WantAgentFlags|新增| -| +|事件通知-wantAgent|permission?: string;|新增| -| +|事件通知-notification|picture?: NotificationPictureContent;|新增| -| +|事件通知-notification|normal?: NotificationBasicContent;|新增| -| +|事件通知-notification|expandedTitle: string;|新增| -| +|事件通知-notification|expandedTitle: string;|新增| -| +|事件通知-wantAgent|function trigger(info: WantAgentInfo, triggerInfo: TriggerInfo, callback: AsyncCallback): void;|新增| -| +|事件通知-wantAgent|extraInfo?: {[key: string]: any};|新增| -| +|事件通知-notification|multiLine?: NotificationMultiLineContent;|新增| -| +|事件通知-notification|level?: notification.SlotLevel;|新增| -| +|事件通知-notification|lightColor?: number;|新增| -| +|事件通知-notification|lightEnabled?: boolean;|新增| -| +|事件通知-notification|lines: Array;|新增| -| +|事件通知-notification|lockscreenVisibility?: number;|新增| -| +|事件通知-notification|longText: string;|新增| -| +|事件通知-wantAgent|function getBundleName(info: WantAgentInfo, callback: AsyncCallback): void;|新增| -| +|事件通知-notification|longText?: NotificationLongTextContent;|新增| -| +|事件通知-notification|longTitle: string;|新增| -| +|事件通知-wantAgent|function judgeEquality(info: WantAgentInfo, info2: WantAgentInfo, callback: AsyncCallback): void;|新增| -| +|事件通知-wantAgent|function getUid(info: WantAgentInfo, callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_TEMPERATURE_ABNORMAL = common.event.IVI_TEMPERATURE_ABNORMAL,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_VOLTAGE_RECOVERY = common.event.IVI_VOLTAGE_RECOVERY,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_TEMPERATURE_RECOVERY = common.event.IVI_TEMPERATURE_RECOVERY,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_ACTIVE = common.event.IVI_ACTIVE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USB_DEVICE_ATTACHED = usual.event.hardware.usb.action.USB_DEVICE_ATTACHED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USB_DEVICE_DETACHED = usual.event.hardware.usb.action.USB_DEVICE_DETACHED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_PAUSE = common.event.IVI_PAUSE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_STANDBY = common.event.IVI_STANDBY,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_LASTMODE_SAVE = common.event.IVI_LASTMODE_SAVE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_VOLTAGE_ABNORMAL = common.event.IVI_VOLTAGE_ABNORMAL,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_HIGH_TEMPERATURE = common.event.IVI_HIGH_TEMPERATURE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_EXTREME_TEMPERATURE = common.event.IVI_EXTREME_TEMPERATURE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_DISK_UNMOUNTABLE = usual.event.data.DISK_UNMOUNTABLE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_DISK_EJECT = usual.event.data.DISK_EJECT,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_VISIBLE_ACCOUNTS_UPDATED = usual.event.data.VISIBLE_ACCOUNTS_UPDATED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_ACCOUNT_DELETED = usual.event.data.ACCOUNT_DELETED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_FOUNDATION_READY = common.event.FOUNDATION_READY,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_AIRPLANE_MODE_CHANGED = usual.event.AIRPLANE_MODE|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USB_ACCESSORY_ATTACHED = usual.event.hardware.usb.action.USB_ACCESSORY_ATTACHED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USB_ACCESSORY_DETACHED = usual.event.hardware.usb.action.USB_ACCESSORY_DETACHED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_DISK_REMOVED = usual.event.data.DISK_REMOVED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_DISK_UNMOUNTED = usual.event.data.DISK_UNMOUNTED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_DISK_MOUNTED = usual.event.data.DISK_MOUNTED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_DISK_BAD_REMOVAL = usual.event.data.DISK_BAD_REMOVAL,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_NFC_ACTION_RF_FIELD_OFF_DETECTED = usual.event.nfc.action.RF_FIELD_OFF_DETECTED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_DISCHARGING = usual.event.DISCHARGING,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_CHARGING = usual.event.CHARGING,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_DEVICE_IDLE_MODE_CHANGED = usual.event.DEVICE_IDLE_MODE_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_POWER_SAVE_MODE_CHANGED = usual.event.POWER_SAVE_MODE_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_ADDED = usual.event.USER_ADDED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_REMOVED = usual.event.USER_REMOVED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_ABILITY_ADDED = common.event.ABILITY_ADDED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_ABILITY_REMOVED = common.event.ABILITY_REMOVED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_ABILITY_UPDATED = common.event.ABILITY_UPDATED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_LOCATION_MODE_STATE_CHANGED = usual.event.location.MODE_STATE_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_IVI_SLEEP = common.event.IVI_SLEEP,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HOST_NAME_UPDATE = usual.event.bluetooth.host.NAME_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_A2DPSINK_CONNECT_STATE_UPDATE = usual.event.bluetooth.a2dpsink.CONNECT_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_A2DPSINK_PLAYING_STATE_UPDATE = usual.event.bluetooth.a2dpsink.PLAYING_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_A2DPSINK_AUDIO_STATE_UPDATE = usual.event.bluetooth.a2dpsink.AUDIO_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_NFC_ACTION_ADAPTER_STATE_CHANGED = usual.event.nfc.action.ADAPTER_STATE_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_NFC_ACTION_RF_FIELD_ON_DETECTED = usual.event.nfc.action.RF_FIELD_ON_DETECTED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HOST_REQ_ENABLE = usual.event.bluetooth.host.REQ_ENABLE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HOST_REQ_DISABLE = usual.event.bluetooth.host.REQ_DISABLE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HOST_SCAN_MODE_UPDATE = usual.event.bluetooth.host.SCAN_MODE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HOST_DISCOVERY_STARTED = usual.event.bluetooth.host.DISCOVERY_STARTED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HOST_DISCOVERY_FINISHED = usual.event.bluetooth.host.DISCOVERY_FINISHED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_P2P_CONN_STATE = usual.event.wifi.p2p.CONN_STATE_CHANGE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_P2P_STATE_CHANGED = usual.event.wifi.p2p.STATE_CHANGE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_P2P_PEERS_STATE_CHANGED = usual.event.wifi.p2p.DEVICES_CHANGE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_P2P_CURRENT_DEVICE_STATE_CHANGED = usual.event.wifi.p2p.CURRENT_DEVICE_CHANGE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_P2P_GROUP_STATE_CHANGED = usual.event.wifi.p2p.GROUP_STATE_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HANDSFREE_AG_CONNECT_STATE_UPDATE = usual.event.bluetooth.handsfree.ag.CONNECT_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HANDSFREE_AG_CURRENT_DEVICE_UPDATE = usual.event.bluetooth.handsfree.ag.CURRENT_DEVICE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HANDSFREE_AG_AUDIO_STATE_UPDATE = usual.event.bluetooth.handsfree.ag.AUDIO_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_A2DPSOURCE_CONNECT_STATE_UPDATE = usual.event.bluetooth.a2dpsource.CONNECT_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_A2DPSOURCE_CURRENT_DEVICE_UPDATE = usual.event.bluetooth.a2dpsource.CURRENT_DEVICE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_RSSI_VALUE = usual.event.wifi.RSSI_VALUE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_CONN_STATE = usual.event.wifi.CONN_STATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_HOTSPOT_STATE = usual.event.wifi.HOTSPOT_STATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_AP_STA_JOIN = usual.event.wifi.WIFI_HS_STA_JOIN,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_AP_STA_LEAVE = usual.event.wifi.WIFI_HS_STA_LEAVE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_MPLINK_STATE_CHANGE = usual.event.wifi.mplink.STATE_CHANGE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_HWID_LOGOUT = common.event.HWID_LOGOUT,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_HWID_TOKEN_INVALID = common.event.HWID_TOKEN_INVALID,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_HWID_LOGOFF = common.event.HWID_LOGOFF,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_POWER_STATE = usual.event.wifi.POWER_STATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_SCAN_FINISHED = usual.event.wifi.SCAN_FINISHED,|新增| -| +|事件通知-commonEvent|clearAbortCommonEvent(): Promise;|新增| -| +|事件通知-commonEvent|bundleName?: string;|新增| -| +|事件通知-commonEvent|code?: number;|新增| -| +|事件通知-commonEvent|data?: string;|新增| -| +|事件通知-commonEvent|subscriberPermissions?: Array;|新增| -| +|事件通知-commonEvent|isOrdered?: boolean;|新增| -| +|事件通知-commonEvent|isSticky?: boolean;|新增| -| +|事件通知-commonEvent|abortCommonEvent(callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|abortCommonEvent(): Promise;|新增| -| +|事件通知-commonEvent|function createSubscriber(subscribeInfo: CommonEventSubscribeInfo): Promise;|新增| -| +|事件通知-commonEvent|function createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|function subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|function publish(event: string, options: CommonEventPublishData, callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|isOrderedCommonEvent(callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|isOrderedCommonEvent(): Promise;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BOOT_COMPLETED = usual.event.BOOT_COMPLETED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_LOCKED_BOOT_COMPLETED = usual.event.LOCKED_BOOT_COMPLETED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_SHUTDOWN = usual.event.SHUTDOWN,|新增| -| +|事件通知-commonEvent|isStickyCommonEvent(): Promise;|新增| -| +|事件通知-commonEvent|getData(callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|getData(): Promise;|新增| -| +|事件通知-commonEvent|getSubscribeInfo(callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|getSubscribeInfo(): Promise;|新增| -| +|事件通知-commonEvent|function publish(event: string, callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|event: string|新增| -| +|事件通知-commonEvent|bundleName?: string;|新增| -| +|事件通知-commonEvent|code?: number;|新增| -| +|事件通知-commonEvent|data?: string;|新增| -| +|事件通知-commonEvent|setCode(code: number, callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_DRIVE_MODE = common.event.DRIVE_MODE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_HOME_MODE = common.event.HOME_MODE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_OFFICE_MODE = common.event.OFFICE_MODE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_STARTED = usual.event.USER_STARTED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_BACKGROUND = usual.event.USER_BACKGROUND,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_FOREGROUND = usual.event.USER_FOREGROUND,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_SWITCHED = usual.event.USER_SWITCHED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_STARTING = usual.event.USER_STARTING,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_UNLOCKED = usual.event.USER_UNLOCKED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_STOPPING = usual.event.USER_STOPPING,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_STOPPED = usual.event.USER_STOPPED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_HWID_LOGIN = common.event.HWID_LOGIN,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGE_VERIFIED = usual.event.PACKAGE_VERIFIED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_EXTERNAL_APPLICATIONS_AVAILABLE = usual.event.EXTERNAL_APPLICATIONS_AVAILABLE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_EXTERNAL_APPLICATIONS_UNAVAILABLE = usual.event.EXTERNAL_APPLICATIONS_UNAVAILABLE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_CONFIGURATION_CHANGED = usual.event.CONFIGURATION_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_LOCALE_CHANGED = usual.event.LOCALE_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_MANAGE_PACKAGE_STORAGE = usual.event.MANAGE_PACKAGE_STORAGE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGES_UNSUSPENDED = usual.event.PACKAGES_UNSUSPENDED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_MY_PACKAGE_SUSPENDED = usual.event.MY_PACKAGE_SUSPENDED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_MY_PACKAGE_UNSUSPENDED = usual.event.MY_PACKAGE_UNSUSPENDED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_UID_REMOVED = usual.event.UID_REMOVED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGE_FIRST_LAUNCH = usual.event.PACKAGE_FIRST_LAUNCH,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGE_NEEDS_VERIFICATION = usual.event.PACKAGE_NEEDS_VERIFICATION,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_SCREEN_OFF = usual.event.SCREEN_OFF,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_SCREEN_ON = usual.event.SCREEN_ON,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_USER_PRESENT = usual.event.USER_PRESENT,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_TIME_TICK = usual.event.TIME_TICK,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_TIME_CHANGED = usual.event.TIME_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_DATE_CHANGED = usual.event.DATE_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BATTERY_CHANGED = usual.event.BATTERY_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BATTERY_LOW = usual.event.BATTERY_LOW,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BATTERY_OKAY = usual.event.BATTERY_OKAY,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_POWER_CONNECTED = usual.event.POWER_CONNECTED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_POWER_DISCONNECTED = usual.event.POWER_DISCONNECTED,|新增| -| +|事件通知-commonEvent|function unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_ACL_CONNECTED = usual.event.bluetooth.remotedevice.ACL_CONNECTED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_ACL_DISCONNECTED = usual.event.bluetooth.remotedevice.ACL_DISCONNECTED,|新增| -| +|事件通知-commonEvent|getAbortCommonEvent(callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_NAME_UPDATE = usual.event.bluetooth.remotedevice.NAME_UPDATE,|新增| -| +|事件通知-commonEvent|getAbortCommonEvent(): Promise;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_CONNECT_STATE_UPDATE = usual.event.bluetooth.handsfreeunit.CONNECT_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_PAIR_STATE = usual.event.bluetooth.remotedevice.PAIR_STATE,|新增| -| +|事件通知-commonEvent|getCode(callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|setCode(code: number): Promise;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_AUDIO_STATE_UPDATE = usual.event.bluetooth.handsfreeunit.AUDIO_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_BATTERY_VALUE_UPDATE = usual.event.bluetooth.remotedevice.BATTERY_VALUE_UPDATE,|新增| -| +|事件通知-commonEvent|getCode(): Promise;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_AG_COMMON_EVENT = usual.event.bluetooth.handsfreeunit.AG_COMMON_EVENT,|新增| -| +|事件通知-commonEvent|setCodeAndData(code: number, data: string, callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_SDP_RESULT = usual.event.bluetooth.remotedevice.SDP_RESULT,|新增| -| +|事件通知-commonEvent|isStickyCommonEvent(callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HANDSFREEUNIT_AG_CALL_STATE_UPDATE = usual.event.bluetooth.handsfreeunit.AG_CALL_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|setCodeAndData(code: number, data: string): Promise;|新增| -| +|事件通知-commonEvent|events: Array;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HOST_STATE_UPDATE = usual.event.bluetooth.host.STATE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_A2DPSOURCE_PLAYING_STATE_UPDATE = usual.event.bluetooth.a2dpsource.PLAYING_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|setData(data: string, callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_A2DPSOURCE_AVRCP_CONNECT_STATE_UPDATE = usual.event.bluetooth.a2dpsource.AVRCP_CONNECT_STATE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_HOST_REQ_DISCOVERABLE = usual.event.bluetooth.host.REQ_DISCOVERABLE,|新增| -| +|事件通知-commonEvent|publisherPermission?: string;|新增| -| +|事件通知-commonEvent|setData(data: string): Promise;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_UUID_VALUE = usual.event.bluetooth.remotedevice.UUID_VALUE,|新增| -| +|事件通知-commonEvent|publisherDeviceId?: string;|新增| -| +|事件通知-commonEvent|clearAbortCommonEvent(callback: AsyncCallback): void;|新增| -| +|事件通知-commonEvent|userId?: number;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_TIMEZONE_CHANGED = usual.event.TIMEZONE_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_PAIRING_REQ = usual.event.bluetooth.remotedevice.PAIRING_REQ,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_DISCOVERED = usual.event.bluetooth.remotedevice.DISCOVERED,|新增| -| +|事件通知-commonEvent|priority?: number;|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BUNDLE_REMOVED = usual.event.BUNDLE_REMOVED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CLASS_VALUE_UPDATE = usual.event.bluetooth.remotedevice.CLASS_VALUE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_PAIRING_CANCEL = usual.event.bluetooth.remotedevice.PAIRING_CANCEL,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_CLOSE_SYSTEM_DIALOGS = usual.event.CLOSE_SYSTEM_DIALOGS,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGE_ADDED = usual.event.PACKAGE_ADDED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CONNECT_REQ = usual.event.bluetooth.remotedevice.CONNECT_REQ,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGE_FULLY_REMOVED = usual.event.PACKAGE_FULLY_REMOVED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGE_REPLACED = usual.event.PACKAGE_REPLACED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CONNECT_REPLY = usual.event.bluetooth.remotedevice.CONNECT_REPLY,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_MY_PACKAGE_REPLACED = usual.event.MY_PACKAGE_REPLACED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGE_CHANGED = usual.event.PACKAGE_CHANGED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_CONNECT_CANCEL = usual.event.bluetooth.remotedevice.CONNECT_CANCEL,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGE_REMOVED = usual.event.PACKAGE_REMOVED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGE_RESTARTED = usual.event.PACKAGE_RESTARTED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGE_DATA_CLEARED = usual.event.PACKAGE_DATA_CLEARED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_PACKAGES_SUSPENDED = usual.event.PACKAGES_SUSPENDED,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_BLUETOOTH_A2DPSOURCE_CODEC_VALUE_UPDATE = usual.event.bluetooth.a2dpsource.CODEC_VALUE_UPDATE,|新增| -| +|事件通知-commonEvent|COMMON_EVENT_WIFI_P2P_PEERS_DISCOVERY_STATE_CHANGED = usual.event.wifi.p2p.PEER_DISCOVERY_STATE_CHANGE,|新增| -| +|事件通知-notification|LEVEL_NONE = 0,|新增| -| +|事件通知-notification|LEVEL_MIN = 1,|新增| -| +|事件通知-notification|LEVEL_LOW = 2,|新增| -| +|事件通知-notification|LEVEL_DEFAULT = 3,|新增| -| +|事件通知-notification|label?: string;|新增| -| +|事件通知-notification|bundle: string;|新增| -| +|事件通知-notification|uid?: number;|新增| -| +|事件通知-notification|NOTIFICATION_CONTENT_MULTILINE,|新增| -| +|事件通知-notification|UNKNOWN_TYPE = 0,|新增| -| +|事件通知-notification|SOCIAL_COMMUNICATION = 1,|新增| -| +|事件通知-notification|LEVEL_HIGH = 4,|新增| -| +|事件通知-notification|NOTIFICATION_CONTENT_BASIC_TEXT,|新增| -| +|事件通知-notification|NOTIFICATION_CONTENT_LONG_TEXT,|新增| -| +|事件通知-notification|NOTIFICATION_CONTENT_PICTURE,|新增| -| +|事件通知-notification|isFloatingIcon?: boolean;|新增| -| +|事件通知-notification|label?: string;|新增| -| +|事件通知-notification|badgeIconStyle?: number;|新增| -| +|事件通知-notification|showDeliveryTime?: boolean;|新增| -| +|事件通知-notification|isAlertOnce?: boolean;|新增| -| +|事件通知-notification|function getActiveNotifications(callback: AsyncCallback>): void;|新增| -| +|事件通知-notification|isStopwatch?: boolean;|新增| -| +|事件通知-notification|isCountDown?: boolean;|新增| -| +|事件通知-notification|function getActiveNotifications(): Promise>;|新增| -| +|事件通知-notification|function getActiveNotificationCount(callback: AsyncCallback): void;|新增| -| +|事件通知-notification|readonly creatorUid?: number;|新增| -| +|事件通知-notification|function getActiveNotificationCount(): Promise;|新增| -| +|事件通知-notification|readonly creatorPid?: number;|新增| -| +|事件通知-notification|function cancel(id: number, label?: string): Promise;|新增| -| +|事件通知-notification|classification?: string;|新增| -| +|事件通知-notification|readonly hashCode?: string;|新增| -| +|事件通知-notification|function cancelAll(callback: AsyncCallback): void;|新增| -| +|事件通知-notification|actionButtons?: Array;|新增| -| +|事件通知-notification|function cancelAll(): Promise;|新增| -| +|事件通知-notification|smallIcon?: image.PixelMap;|新增| -| +|事件通知-notification|isUnremovable?: boolean;|新增| -| +|事件通知-notification|largeIcon?: image.PixelMap;|新增| -| +|事件通知-notification|deliveryTime?: number;|新增| -| +|事件通知-notification|readonly creatorBundleName?: string;|新增| -| +|事件通知-notification|tapDismissed?: boolean;|新增| -| +|事件通知-notification|function publish(request: NotificationRequest): Promise;|新增| -| +|事件通知-notification|autoDeletedTime?: number;|新增| -| +|事件通知-notification|function cancel(id: number, callback: AsyncCallback): void;|新增| -| +|事件通知-notification|content: NotificationContent;|新增| -| +|事件通知-notification|wantAgent?: WantAgentInfo;|新增| -| +|事件通知-notification|function cancel(id: number, label: string, callback: AsyncCallback): void;|新增| -| +|事件通知-notification|function getSlot(slotType: SlotType, callback: AsyncCallback): void;|新增| -| +|事件通知-notification|extraInfo?: {[key: string]: any};|新增| -| +|事件通知-notification|function getSlot(slotType: SlotType): Promise;|新增| -| +|事件通知-notification|SERVICE_INFORMATION = 2,|新增| -| +|事件通知-notification|color?: number;|新增| -| +|事件通知-notification|id?: number;|新增| -| +|事件通知-notification|function getSlots(callback: AsyncCallback>): void;|新增| -| +|事件通知-notification|CONTENT_INFORMATION = 3,|新增| -| +|事件通知-notification|slotType?: notification.SlotType;|新增| -| +|事件通知-notification|colorEnabled?: boolean;|新增| -| +|事件通知-notification|OTHER_TYPES = 0xFFFF,|新增| -| +|事件通知-notification|isOngoing?: boolean;|新增| -| +|事件通知-notification|function addSlot(type: SlotType, callback: AsyncCallback): void;|新增| -| +|事件通知-notification|id: number;|新增| -| +|事件通知-notification|function addSlot(type: SlotType): Promise;|新增| -| +|事件通知-notification|desc?: string;|新增| -| +|事件通知-notification|function publish(request: NotificationRequest, callback: AsyncCallback): void;|新增| -| +|事件通知-notification|function removeAllSlots(callback: AsyncCallback): void;|新增| -| +|事件通知-notification|function removeAllSlots(): Promise;|新增| -| +|事件通知-notification|function getSlots(): Promise>;|新增| -| +|事件通知-notification|function removeSlot(slotType: SlotType, callback: AsyncCallback): void;|新增| -| +|事件通知-notification|function removeSlot(slotType: SlotType): Promise;|新增| -| +|全球化-resourceManager|getString(resId: number, callback: AsyncCallback);getString(resId: number): Promise;|新增| -| +|全球化-resourceManager|getStringArray(resId: number, callback: AsyncCallback>);getStringArray(resId: number): Promise>;|新增| -| +|全球化-resourceManager|getConfiguration(callback: AsyncCallback);getConfiguration(): Promise;|新增| -| +|全球化-resourceManager|getDeviceCapability(callback: AsyncCallback);getDeviceCapability(): Promise;|新增| -| +|全球化-resourceManager|getMedia(resId: number, callback: AsyncCallback);getMedia(resId: number): Promise;getMediaBase64(resId: number, callback: AsyncCallback);getMediaBase64(resId: number): Promise;|新增| -| +|全球化-resourceManager|"getPluralString(resId: number, num: number, callback: AsyncCallback);getPluralString(resId: number, num: number): Promise;"|新增| -| +|全球化-resourceManager|DeviceCapability|新增| -| +|全球化-resourceManager|"getMediaBase64(resId: number, callback: AsyncCallback);getMediaBase64(resId: number): Promise;"|新增| -| +|全球化-resourceManager|"getResourceManager(callback: AsyncCallback);getResourceManager(bundleName: string, callback: AsyncCallback);getResourceManager(): Promise;getResourceManager(bundleName: string): Promise;"|新增| -| +|全球化-resourceManager|DeviceType|新增| -| +|全球化-resourceManager|Direction|新增| -| +|全球化-resourceManager|Configuration|新增| -| +|全球化-resourceManager|ScreenDensity|新增| -| +|全球化-resourceManager|deviceType|新增| -| +|全球化-resourceManager|locale|新增| -| +|全球化-resourceManager|direction|新增| -| +|全球化-resourceManager|screenDensity|新增| -| +|电源服务-batteryInfo|batteryInfo:const batterySOC: number;|新增| -| +|电源服务-batteryInfo|batteryInfo:const technology: string;|新增| -| +|电源服务-batteryInfo|batteryInfo:const isBatteryPresent: boolean;|新增| -| +|电源服务-batteryInfo|batteryInfo:const batteryTemperature: number;|新增| -| +|电源服务-batteryInfo|batteryInfo:const pluggedType: BatteryPluggedType;|新增| -| +|电源服务-batteryInfo|batteryInfo:const chargingStatus: BatteryChargeState;|新增| -| +|电源服务-batteryInfo|batteryInfo:const healthStatus: BatteryHealthState;|新增| -| +|电源服务-batteryInfo|batteryInfo:const voltage: number;|新增| -| +|电源服务-batteryInfo|BatteryChargeState:NONE|新增| -| +|电源服务-batteryInfo|BatteryChargeState:DISABLE|新增| -| +|电源服务-batteryInfo|BatteryChargeState:ENABLE,|新增| -| +|电源服务-batteryInfo|BatteryChargeState:FULL|新增| -| +|电源服务-batteryInfo|BatteryHealthState:COLD|新增| -| +|电源服务-batteryInfo|BatteryHealthState:OVERHEAT|新增| -| +|电源服务-batteryInfo|BatteryHealthState:OVERVOLTAGE|新增| -| +|电源服务-batteryInfo|BatteryHealthState:DEAD|新增| -| +|电源服务-batteryInfo|BatteryHealthState:UNKNOWN|新增| -| +|电源服务-batteryInfo|BatteryHealthState:GOOD|新增| -| +|电源服务-batteryInfo|BatteryPluggedType:WIRELESS|新增| -| +|电源服务-batteryInfo|BatteryPluggedType:NONE|新增| -| +|电源服务-batteryInfo|BatteryPluggedType:AC|新增| -| +|电源服务-batteryInfo|BatteryPluggedType:USB|新增| -| +|电源服务-runningLock|RunningLock:unlock()|新增| -| +|电源服务-runningLock|runningLock:isRunningLockTypeSupported(type: RunningLockType, callback: AsyncCallback): void;|新增| -| +|电源服务-runningLock|runningLock:createRunningLock(name: string, type: runningLockType): RunningLock|新增| -| +|电源服务-runningLock|RunningLock:lock(timeout: number)|新增| -| +|电源服务-runningLock|RunningLock:isUsed(): boolean|新增| -| +|电源服务-runninglock|RunningLockType:BACKGROUND|新增| -| +|电源服务-runninglock|RunningLockType:PROXIMITY_SCREEN_CONTROL|新增| -| +|电源服务-power|power:rebootDevice(reason ?: string)|新增| -| +|电源服务-power|power:isScreenOn(callback: AsyncCallback): void;|新增| -| diff --git "a/website/docs/_posts/\347\244\276\345\214\272/\345\225\206\346\240\207\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/website/docs/_posts/\347\244\276\345\214\272/\345\225\206\346\240\207\344\275\277\347\224\250\346\214\207\345\215\227.md" index 0162f4560d64779a70f50d0bfe241d769b3fc764..c626e54106aa5cdbfed985369ccd060e26c90bb1 100644 --- "a/website/docs/_posts/\347\244\276\345\214\272/\345\225\206\346\240\207\344\275\277\347\224\250\346\214\207\345\215\227.md" +++ "b/website/docs/_posts/\347\244\276\345\214\272/\345\225\206\346\240\207\344\275\277\347\224\250\346\214\207\345\215\227.md" @@ -69,4 +69,4 @@ date: 2021-06-01 17:08:58     开放原子开源基金会可能不定期更新OpenHarmony商标使用指南。您应当在实际使用OpenHarmony商标前访问OpenHarmony项目官方网站,以确认最新版本的OpenHarmony商标使用指南。 ## 附件 -[OpenHarmony品牌基础规范-V1.1.pptx](https://gitee.com/changweixu/website_v2/raw/master/website/assets/OpenHarmony%E5%93%81%E7%89%8C%E5%9F%BA%E7%A1%80%E8%A7%84%E8%8C%83-V1.1.pptx) +[OpenHarmony品牌基础规范-V1.1.pptx](https://gitee.com/openharmony-sig/website_v2/raw/master/website/assets/OpenHarmony%E5%93%81%E7%89%8C%E5%9F%BA%E7%A1%80%E8%A7%84%E8%8C%83-V1.1.pptx) diff --git a/website/theme-vdoing/components/Home.vue b/website/theme-vdoing/components/Home.vue index 5b08fe7dcee01ec657e78ed77b8b2454e04fe0be..30f073f3987b9ef3530f7b3d813c24d70f3c2fd8 100644 --- a/website/theme-vdoing/components/Home.vue +++ b/website/theme-vdoing/components/Home.vue @@ -19,7 +19,7 @@ - + @@ -40,7 +40,7 @@ - +