鴻蒙開發ArkUI-X基礎知識:【ArkUI代碼工程及構建介紹】

代碼工程及構建介紹

背景

ArkUI作為OpenHarmony的默認開發框架,在本項目(ArkUI-X)中需要做到一套代碼同時支持多平臺構建,所以會采取共倉開發的方式,部分倉直接指向OpenHarmony相關開源倉。

代碼結構及倉庫結構

代碼工程的目錄結構如下:

├── arkcompiler                 // 方舟編譯器
├── base                        // 基礎能力
├── build                       // 項目構建和配置腳本
├── build_plugins               // 跨平臺構建插件
├── commonlibrary               // 公共基礎庫
├── community                   // 社區相關
├── developtools                // 開發者工具
├── docs                        // 配套文檔
├── foundation
│   ├── appframework            // 應用框架兼容適配層
│   ├── arkui                   // ArkUI引擎
│   ├── communication           // 通信能力
│   ├── distributeddatamgr      // 分布式數據管理
│   ├── filemanagement          // 文件管理
│   ├── graphic                 // 圖形引擎
│   └── multimedia              // 多媒體
├── interface                   // 接口聲明
├── plugins                     // 插件管理與實現
├── prebuilts                   // 預編譯目錄
├── productdefine               // 產品形態配置
├── samples                     // 示例代碼
├── test                        // 測試框架與用例
└── third_party                 // 三方庫

搜狗高速瀏覽器截圖20240326151547.png


具體的代碼結構及指向,見下表:

目錄路徑描述代碼倉位置
build項目構建和配置腳本[OpenHarmony/build]
build_plugins跨平臺構建插件[ArkUI-X/build_plugins]
samples應用程序樣例[ArkUI-X/samples]
community社區運作管理[ArkUI-X/community]
docs說明文檔[ArkUI-X/docs]
interface/sdkArkUI-X SDK配置[ArkUI-X/interface_sdk]
pluginsAPI插件管理,OpenHarmony API插件實現[ArkUI-X/plugins]
test/xtsArkUI-X跨平臺應用測試套件[ArkUI-X/xts]
test/testfwk/arkxtestArkUI-X測試框架[ArkUI-X/arkxtest]
developtools/ace_tools跨平臺命令行工具[ArkUI-X/cli]
foundation/appframework應用框架兼容適配層[ArkUI-X/app_framework]
foundation/arkui/ace_engine/adapter/androidAndroid平臺適配代碼[ArkUI-X/arkui_for_android]
foundation/arkui/ace_engine/adapter/iosiOS平臺適配代碼[ArkUI-X/arkui_for_ios]
foundation/arkui/ace_engineArkUI 引擎核心代碼[OpenHarmony/arkui_ace_engine]
foundation/arkui/napiNative API擴展機制[OpenHarmony/arkui_napi]
foundation/communication/netmanager_base網絡管理模塊[OpenHarmony/communication_netmanager_base]
foundation/communication/netstack網絡協議棧[OpenHarmony/communication_netstack]
foundation/graphic/graphic_2d2D圖形基礎庫[OpenHarmony/graphic_graphic_2d]
foundation/filemanagement/file_api提供目錄和文件的訪問操作接口[OpenHarmony/filemanagement_file_api]
foundation/multimedia/image_framework圖片編解碼功能實現[OpenHarmony/multimedia_image_framework]
developtools/ace_ets2bundle基于ArkTS的聲明式開發范式編譯轉換工具和跨平臺應用構建工具[OpenHarmony/ace_ets2bundle]
developtools/ace_js2bundle兼容JS的類Web開發范式編譯轉換工具和跨平臺應用構建工具[OpenHarmony/ace_js2bundle]
arkcompiler/ets_frontend方舟前端工具[OpenHarmony/arkcompiler_ets_frontend]
arkcompiler/ets_runtime方舟ArkTS運行時[OpenHarmony/arkcompiler_ets_runtime]
arkcompiler/runtime_core方舟編譯器運行時[OpenHarmony/arkcompiler_runtime_core]
arkcompiler/toolchain調試調優工具[OpenHarmony/arkcompiler_toolchain]
prebuilts預編譯目錄,python,nodejs,clang和cmake等通過腳本預下載
third_party開源第三方組件(統一復用OpenHarmony代碼倉)引用開源三方庫集合
commonlibrary/c_utils通用的C++功能函數和類[OpenHarmony/commonlibrary_c_utils]
commonlibrary/ets_utils用于存放基礎類庫JSAPI,比如url、uri等[OpenHarmony/commonlibrary_ets_utils]
base/hiviewdfx/hilog系統日志功能[OpenHarmony/hiviewdfx_hilog]
base/web/webviewWebView組件的Native引擎[OpenHarmony/web_webview]
base/global/resource_management全球化資源管理[OpenHarmony/global_resource_management]

分支同步策略

OpenHarmony相關代碼倉,指向OpenHarmony master分支的固定tag點,定期同步,默認按照OpenHarmony的Weekly分支頻率進行同步。

ArkUI引擎核心代碼倉目錄結構

ArkUI引擎核心代碼倉?ace_engine?的目錄結構以及每個目錄的內容如下:

foundation/arkui/ace_engine
├── ace_config.gni      // 全局配置文件
├── adapter             // 平臺適配層
│   ├── android         // Android平臺適配,獨立倉
│   │   ├── build
│   │   ├── capability
│   │   ├── entrance
│   │   ├── stage
│   │   └── osal
│   ├── ios             // iOS平臺適配,獨立倉
│   │   ├── build
│   │   ├── capability
│   │   ├── entrance
│   │   ├── stage
│   │   └── osal
│   ├── ohos            // OpenHarmony平臺適配
│   └── preview         // 預覽器平臺適配
├── build               // 編譯配置
│   ├── ace_gen_obj.gni
│   ├── ace_lib.gni
│   ├── BUILD.gn
│   ├── search.py
│   └── tools
├── BUILD.gn            // 全局編譯配置
├── frameworks          // 引擎框架層
│   ├── base            // base庫
│   ├── bridge          // 前端橋接
│   └── core            // 引擎核心實現
├── interfaces          // 通用對外接口
│   └── napi
│       └── kits
├── LICENSE
├── OAT.xml
├── README.md
├── README_zh.md
└── test                // 測試相關

編譯構建流程

為了支持一套代碼在OpenHarmony和其它平臺同時構建,需要根據代碼結構動態對編譯配置進行調整,因為對外依賴可能不同,并且不同環境下可能依賴的外部源碼都有差異,所以必須對編譯目標(targets)都進行動態的定義,否則無法保持一致。

  • 編譯入口:??OpenHarmony的編譯入口為bundle.json,這里定義了子系統的部件以及對外的接口,放在對應子系統根目錄下,ArkUI的其它平臺構建暫不需要,使用固定模塊名“ace_packages”作為入口。
  • 全局配置:??根目錄下的BUILD.gn以及ace_config.gni為全局的配置,其中BUILD.gn下定義了全局使用的“ace_config”、“ace_test_config”,其中ace_config.gni分別定義了以下配置:

    • 全局的變量配置,如“enable_ace_debug”,通過開關進行編譯控制。
    • 全局的路徑定義,如“ace_napi“,配置路徑的變量。
    • 工具鏈相關的配置,如“windows_buildtool”。
    • 在“ace_config”中使用的全局宏的定義,如“ace_common_defines”。
    • 生成平臺相關的配置項“ace_platforms”,這一步是動態定義目標的關鍵,見如下代碼:
    ace_platforms = []# 通過搜索adapter下的目錄,生成所有的adapter目錄名
    _ace_adapter_dir = rebase_path("$ace_root/adapter", root_build_dir)
    _adapters = exec_script("build/search.py", [ _ace_adapter_dir ], "list lines")# 導入每個adapter下的platform.gni,生成platform的定義配置,加入到ace_platforms中
    foreach(item, _adapters) {
    import_var = {}
    import_var = {import("$ace_root/adapter/$item/build/platform.gni")
    }if (defined(import_var.platforms)) {foreach(platform, import_var.platforms) {if (defined(platform.name)) {ace_platforms += [ platform ]}}
    }
    }

  • 平臺配置:??每個adapter下的build目錄存放平臺相關的配置

    ├── BUILD.gn      // 入口目標定義,如"ace_packages"
    ├── config.gni    // 平臺配置
    ├── bundle.json   // 部件配置,非OpenHarmony平臺暫不需要
    └── platform.gni  // 平臺定義

    其中,單個config.gni的配置類似如下:

    defines = [
    "OHOS_PLATFORM",
    "OHOS_STANDARD_SYSTEM",
    ]js_engines = []
    ark_engine = {
    engine_name = "ark"
    engine_path = "jsi"
    engine_defines = [ "USE_ARK_ENGINE" ]
    }
    js_engines += [ ark_engine ]disable_gpu = true
    use_external_icu = "shared"
    use_curl_download = true
    ohos_standard_fontmgr = true
    sk_use_hilog = true
    accessibility_support = false
    rich_components_support = true
    advance_components_support = false
    form_components_support = falseif (disable_gpu) {
    defines += [ "GPU_DISABLED" ]
    }cflags_cc = [
    "-Wno-thread-safety-attributes",
    "-Wno-thread-safety-analysis",
    ]platform_deps = [
    "//foundation/arkui/ace_engine/adapter/ohos/entrance:ace_ohos_standard_entrance",
    "//foundation/arkui/ace_engine/adapter/ohos/osal:ace_osal_ohos",
    ]

    這個文件定義了該平臺的所有差異化配置,如宏、cflags、平臺特有的依賴,以及一些功能性的開關。在具體的模塊定義中,宏、cflags這一類編譯配置直接從config引入,其它差異需要定義為功能性的開關,如上述的“use_curl_download”,使模塊gn及特性的定義更清晰。

  • 動態目標定義:??基于上述平臺的配置,就可以實現動態的定義目標,以base模塊為例:

    import("//build/ohos.gni")
    import("//foundation/arkui/ace_engine/ace_config.gni")template("ace_base_source_set") {forward_variables_from(invoker, "*")ohos_source_set(target_name) {# 引入平臺config中的define和cflagsdefines += invoker.definescflags_cc = []cflags_cc += invoker.cflags_ccdeps = ["$ace_root/build/third_party/cJSON:third_party_cjson","i18n:ace_base_i18n_$platform","resource:ace_resource",]configs = [ "$ace_root:ace_config" ]# add base source file heresources = ["geometry/animatable_dimension.cpp","geometry/animatable_matrix4.cpp","geometry/matrix4.cpp","geometry/quaternion.cpp","geometry/transform_util.cpp","json/json_util.cpp","log/ace_trace.cpp","log/dump_log.cpp","memory/memory_monitor.cpp","thread/background_task_executor.cpp","utils/base_id.cpp","utils/date_util.cpp","utils/resource_configuration.cpp","utils/string_utils.cpp","utils/time_util.cpp",]# 通過platform變量來進行區別配置if (platform != "windows") {# add secure c APIinclude_dirs = [ "//utils/native/base/include" ]sources += ["//utils/native/base/src/securec/memset_s.c","//utils/native/base/src/securec/securecutil.c","//utils/native/base/src/securec/secureprintoutput_a.c","//utils/native/base/src/securec/snprintf_s.c","//utils/native/base/src/securec/sprintf_s.c","//utils/native/base/src/securec/strcat_s.c","//utils/native/base/src/securec/strcpy_s.c","//utils/native/base/src/securec/vsnprintf_s.c","//utils/native/base/src/securec/vsprintf_s.c",]}# 通過平臺的config決定是否依賴和編譯curlif (defined(config.use_curl_download) && config.use_curl_download) {configs += [ "//third_party/curl:curl_config" ]sources += [ "$ace_root/frameworks/base/network/download_manager.cpp" ]deps += [ "//third_party/curl:curl" ]}}
    }# 根據ace_platforms動態定義目標:假設里面包含三個平臺"ohos"、"windows"、"mac",則會定義三個target,
    # 分別為:ace_base_ohos,ace_base_windows,ace_base_mac
    foreach(item, ace_platforms) {ace_base_source_set("ace_base_" + item.name) {# 從platform中導入變量platform = item.namedefines = []cflags_cc = []config = {}if (defined(item.config)) {config = item.config}if (defined(config.defines)) {defines = config.defines}if (defined(config.cflags_cc)) {cflags_cc = config.cflags_cc}}
    }

  • 模塊定義:??根據目錄結構,盡量分成一個個小模塊來定義,每個模塊定義明確,如果涉及平臺差異,使用上述方法定義,內部配置差異盡量使用特性來區分
  • 依賴關系:??依賴關系盡量清楚,按層次依賴,不可反向依賴
  • 開發前請熟悉鴻蒙開發指導文檔:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點擊或者復制轉到。

開發原則

  • 所有功能實現遵循分層設計
  • frameworks目錄下的所有模塊都是平臺無關的,不能依賴adapter目錄下的模塊,不能依賴除JS引擎相關的其它子系統
  • 平臺相關的代碼都必須放到adapter目錄對應的平臺下,如果需要在frameworks中引用相關,需要進行適當的接口抽象
  • 非OpenHarmony的adapter中不能依賴OpenHarmony其它子系統的模塊(例外:該子系統有跨平臺計劃并且通用)
  • frameworks/core不允許依賴frameworks/bridge下的模塊
  • 新增代碼不可直接依賴skia接口,使用graphic_2d提供的drawing接口
  • 修改OpenHarmony倉中的內容要保證各平臺都能編譯通過,功能正常

鴻蒙最值得程序員入行

為什么這么說?市場是決定人力需求的,數據說話最管用:

1、鴻蒙其全棧自研,頭部大廠商都陸續加入合作開發鴻蒙原生應用——人才需求上漲

2、鴻蒙作為新系統、新技術,而現在市面上技術人才少——高薪招聘開啟

3、鴻蒙1+8+N生態,不僅只有應用開發;還有車載、數碼、智能家居、家電等——就業范圍廣

4、純血鴻蒙,目前沒有多少人熟悉。都處于0基礎同一起跑線——無行業內卷

開發者最需要什么?崗位多、薪資高、不內卷、行業競爭低。而當下的鴻蒙恰恰符合要求。

那么這么好的鴻蒙崗位,應聘要求都很高吧?其實不然鴻蒙作為新出的獨立系統,其源頭上大家都處于同一水平線上,一開始的技術要求都不會很高,畢竟面試官也是剛起步學習。招聘要求示例:

從信息看出,幾乎應職要求是對標有開發經驗的人群。可以說鴻蒙對開發者非常友好,盡管上面沒提鴻蒙要求,但是面試都會篩選具有鴻蒙開發技能的人。我們程序員都知道學習開發技術,最先是從語言學起,鴻蒙語言有TS、ArkTS等語法,那么除了這些基礎知識之外,其核心技術點有那些呢?下面就用一張整理出的鴻蒙學習路線圖表示:

從上面的OpenHarmony技術梳理來看,鴻蒙的學習內容也是很多的。現在全網的鴻蒙學習文檔也是非常的少,下面推薦一些:完整內容可在頭像頁保存,或這qr23.cn/AKFP8k甲助力

內容包含:《鴻蒙NEXT星河版開發學習文檔》

  • ArkTS
  • 聲明式ArkUI
  • 多媒體
  • 通信問題
  • 系統移植
  • 系統裁剪
  • FW層的原理
  • 各種開發調試工具
  • 智能設備開發
  • 分布式開發等等。

這些就是對往后開發者的分享,希望大家多多點贊關注喔!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14668.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14668.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14668.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多模態模型(MLLM)論文串燒

近期看了一些多模態方向的工作,包括圖像、文本多模態,圖像、視頻、語音、文本多模態,做個總結。 Yi Qwen-VL LLaVA MobileVLM LanguageBind Video-LLaVA VAST

【機器學習300問】94、什么是多任務學習?

一、多任務學習的定義 多任務學習(Multi-Task Learning, MTL)是一種機器學習范式,它允許一個模型同時學習執行多個相關但不完全相同的任務。這種方法的核心是:通過共享表示或權重,不同的任務可以在學習過程中相互促進&…

淺談微服務的自動化部署

一、常用部署工具 jenkins,docker生態是比較常用的工具,本文也主要是聊這幾個。其他如Kubernetes (K8s),Ansible,GitLab CI/CD等工具本文只是暫時提一下,不展開討論。 二、比較jenkins和docker生態 1、jenkins 優點 jenkins功…

Rust使用rust_xlsxwriter庫把Vec數據寫入Excel

一、Rust使用rust_xlsxwriter庫把一維Vec數據寫入Excel 在Rust中,使用rust_xlsxwriter庫將一維Vec數據寫入Excel文件是一個相對簡單的過程。首先,你需要確保你的Cargo.toml文件中已經添加了rust_xlsxwriter依賴。以下是如何添加依賴的示例: …

KMP題解代碼(含講解)

目錄 注意: next數組的變化規律: 初始化: 求next數組部分: KMP部分: AC代碼: 題目鏈接:【模板】KMP - 洛谷 注意: 1、next數組是針對子串的,并未涉及母串,因此求next數組時…

Python中文件操作和異常處理

文章目錄 一、文件操作1.概念2.文件3.二進制 二、基本文件操作三、亂碼產生四、with open() as f五、代碼實現文件復制粘貼六、try ... except ...七、代碼比較 一、文件操作 1.概念 幫助我們把爬蟲抓下來的數據,進行保存。 2.文件 在計算機中,沒有p…

Linux:linux基礎

Linux 一套免費使用和自由傳播的操作系統 linux特點 免費,開源,多用戶(同時允許多用戶操作同一個Linux系統),多任務(同時允許多個任務執行) linux版本 分為內核版和發行版 內核版 由linus torvalds及其團隊進行開發和維護 免費,開源 負責控制硬件 發行版 基于linux內…

Luat學習

萬物互聯的興起 人與人之間的連接已經變得越來越緊密,至少在中國這是一個不爭的事實。 人們的忙碌程度也達到了前所未有的水平,這時候人的通訊能力反而成為了瓶頸,人與外界的信息交換方式無外乎是嘴說、耳朵聽、眼睛看、手指敲、每秒的傳輸速…

根據配置的mode環境顯示不同的index模板

引言:在項目開發中,遇到了開發環境和生產環境使用模板不同的情況,配置如下: 一、vue.config.js const path require(path) function resolve(dir){return path.join(__dirname,dir) } module.exports {chainWebpack: config &g…

力扣226. 翻轉二叉樹(DFS的兩種思路)

Problem: 226. 翻轉二叉樹 文章目錄 題目描述思路復雜度Code 題目描述 思路 涉及二叉樹的遞歸解法時往往需要考慮兩種思路: 1.在遞歸遍歷時執行題目需要的具體要求; 2.將一個大問題分解為多個小子問題 具體到本體: 思路1:遍歷 先…

【源碼分享】簡單的404 HTML頁面示例,該頁面在加載時會等待2秒鐘,然后自動重定向到首頁

展示效果 源碼 html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>404 頁面未找到</title><meta http-equiv"refresh" content"2;url/"> <!-- 設置2秒后跳轉到首…

機器學習云環境測試

等待創建完成后&#xff0c;點擊 PyTorch 打開&#xff0c;創建一個全新的 notebook 在 Cell 中輸入如下代碼&#xff0c;并點擊 Run 完成后點擊 New Cell &#xff0c;在 New Cell 中輸入如下代碼 輸入完成后點擊 Run &#xff0c;運行 New Cell 。&#xff08;每個 Cell 代…

1077: 平衡二叉樹的判定

解法&#xff1a; 平衡二叉樹是一種特殊的二叉樹&#xff0c;它滿足以下兩個條件&#xff1a; 左子樹和右子樹的高度差不超過1&#xff08;即&#xff0c;左右子樹高度差的絕對值不超過1&#xff09;。左子樹和右子樹都是平衡二叉樹。 后序遍歷過程中每次判斷左右子樹高度差…

python列表底層原理

Python 列表&#xff08;list&#xff09;是 Python 中非常常用的數據結構之一。它們的底層實現基于動態數組&#xff0c;具體來說&#xff0c;是一個可以動態調整大小的數組。這使得列表在操作和使用上非常靈活。以下是 Python 列表底層實現的主要原理&#xff1a; 動態數組 …

IT廉連看——UniApp——事件綁定

IT廉連看——UniApp——事件綁定 這是我們上節課最終的樣式&#xff1b; 一、現在我有這樣一個需求&#xff0c;當我點擊“生在國旗下&#xff0c;長在春風里”它的顏色由紅色變為藍色&#xff0c;該怎么操作&#xff1f; 這時候我們需要一個事件的綁定&#xff0c;綁定一個單…

使用 Docker 部署 Jenkins 并設置初始管理員密碼

使用 Docker 部署 Jenkins 并設置初始管理員密碼 每一次開始&#xff0c;我都特別的認真與膽怯&#xff0c;是因為我期待結局&#xff0c;也能夠不會那么粗糙&#xff0c;不會讓我失望&#xff0c;所以&#xff0c;就多了些思考&#xff0c;多了些拘束&#xff0c;所以&#xf…

【HCIP學習】STP協議

一、STP協議出現背景&#xff08;Spanning Tree Protocol&#xff0c;生成樹協議&#xff09; 二層環路帶來的問題&#xff1a;廣播風暴&#xff1b; MAC地址表的震蕩&#xff1b; 二、STP定義 stp是二層網絡中用于消除環路的協議&#xff0c;通過阻斷冗余鏈路來消除&#xff…

Flutter 中的 Hero 小部件:全面指南

Flutter 中的 Hero 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;Hero 動畫是一種流行的動畫效果&#xff0c;用于在不同路由&#xff08;頁面&#xff09;之間傳遞小部件&#xff0c;從而創建平滑的共享元素過渡效果。這種動畫可以增強用戶的視覺體驗&#xff0c;使…

加速度傳感器的沖擊振動的原始特征與解算(部分)

這里是工作中測得的一組數據&#xff0c;設備有多個加速度傳感器通道&#xff0c;我們可以看到沖擊振動發生前后&#xff0c;各個振動傳感器的的反饋以及其他的細化特征&#xff1a; 1.隨機振動&#xff08;加速度傳感器視角&#xff09; 2.沖擊振動&#xff08;加速度&#x…

Android Settings系統屬性讀寫

Settings系統屬性存儲均為xml&#xff0c;分三種&#xff1a; 1.global&#xff1a;所有的偏好設置對系統的所有用戶公開&#xff0c;第三方APP有讀沒有寫的權限&#xff1b; 源碼地址&#xff1a;frameworks/base/core/java/android/provider/Settings.java 對應xml路徑&…