鴻蒙OS 5 架構設計探秘:從分層設計到多端部署

文章目錄

  • 鴻蒙OS架構設計探秘:從分層設計到多端部署
    • 一、鴻蒙的分層架構設計
    • 二、模塊化設計的精髓
    • 三、智慧分發設計:資源的動態調度
    • 四、一次開發,多端部署的實踐
    • 總結與思考

鴻蒙OS架構設計探秘:從分層設計到多端部署

最近兩年來,我一直在跟進鴻蒙系統的發展,從EMUI到HarmonyOS,見證了這個國產操作系統從無到有的成長歷程。今天想和大家分享一下我對鴻蒙系統架構的理解和實踐心得。

一、鴻蒙的分層架構設計

鴻蒙OS采用了一種獨特的"1+8+N"分層架構,這和我們熟悉的Android、iOS有很大不同。這種架構讓整個系統更加靈活,能更好地適應從智能手表到車機等不同設備。

從底層到上層,鴻蒙系統主要分為:

  1. 內核層:包括鴻蒙微內核、Linux內核和LiteOS
  2. 系統服務層:提供基礎系統能力
  3. 框架層:為應用開發提供API
  4. 應用層:用戶可見的應用程序

這種設計的最大優勢在于"硬件下沉,應用上浮"。簡單來說就是讓硬件適配更簡單,應用開發更統一。

來看一個調用系統服務的簡單代碼示例:

import systemParameter from '@ohos.systemparameter';// 獲取系統參數示例
export default {getSystemInfo() {try {// 獲取設備類型const deviceType = systemParameter.getSync("const.build.characteristics");console.info(`當前設備類型: ${deviceType}`);// 獲取系統版本const osVersion = systemParameter.getSync("const.product.software.version");console.info(`系統版本: ${osVersion}`);return {deviceType, osVersion};} catch(error) {console.error(`獲取系統參數失敗: ${error.message}`);return null;}}
}

記得我剛開始接觸這套架構時,還挺不習慣的,但用久了就發現,這種分層確實讓跨設備開發更加一致。

二、模塊化設計的精髓

鴻蒙系統的另一大亮點是其模塊化設計思想。系統功能被拆分成一個個相對獨立的"功能卡片",可以根據設備能力進行組合。

這讓我想起微服務架構,只不過鴻蒙把這種思想應用到了操作系統級別。對我們開發者而言,最直觀的體現就是Ability機制。

在HarmonyOS中,應用由一個或多個Ability組成,主要分為:

  • FA (Feature Ability): 帶UI的Ability
  • PA (Particle Ability): 無UI的后臺服務

看一個簡單的Ability示例:

import Ability from '@ohos.application.Ability'export default class MainAbility extends Ability {onCreate(want, launchParam) {console.log("[Demo] MainAbility onCreate")// 能力創建時的初始化工作globalThis.abilityWant = want;}onDestroy() {console.log("[Demo] MainAbility onDestroy")}onWindowStageCreate(windowStage) {console.log("[Demo] MainAbility onWindowStageCreate")// 加載UI頁面windowStage.loadContent('pages/index', (err, data) => {if (err.code) {console.error(`Failed to load content. Cause: ${JSON.stringify(err)}`)return}console.info("Succeeded in loading content.")})}// 其他生命周期方法...
}

我記得有次做一個跨設備項目時,這種模塊化設計幫了大忙。同樣的業務邏輯,只需要針對不同設備適配不同UI就行,省了不少工作量。

三、智慧分發設計:資源的動態調度

智慧分發可能是鴻蒙系統中最讓我驚艷的部分。它能根據用戶行為和設備狀態,智能地分配系統資源,確保前臺應用的流暢體驗。

舉個例子,當用戶在玩游戲時,系統會自動為游戲分配更多計算資源;當接到重要通知時,系統會確保通知能及時展示。這種設計讓整個系統感覺更"聰明"。

實現這一點的關鍵在于鴻蒙的分布式調度器。我們可以通過類似這樣的代碼來設置應用優先級:

import resourceSchedule from '@ohos.resourceschedule.resourceManager';// 申請重要前臺任務優先級
try {// 創建資源使用信息let resourceRequest = {"resourceType": resourceSchedule.ResourceType.CPU,"resourceLevel": resourceSchedule.ResourceLevel.HIGH};// 申請資源resourceSchedule.applyResourceRequest(resourceRequest).then(() => {console.info('資源申請成功,開始執行重要計算任務');performHeavyTask();}).catch((err) => {console.error(`資源申請失敗: ${err.message}`);});
} catch(error) {console.error(`操作異常: ${error}`);
}function performHeavyTask() {// 執行需要高CPU優先級的任務// ...// 任務完成后,釋放資源resourceSchedule.releaseResourceRequest().then(() => {console.info('資源已釋放');});
}

之前接觸過一個項目,我們需要在多種設備上運行復雜的圖像處理算法。通過智慧分發機制,我們實現了根據設備性能自動調整處理精度的功能,讓用戶體驗更加一致。

四、一次開發,多端部署的實踐

這可能是大多數開發者最關心的部分。鴻蒙系統承諾"一次開發,多端部署",那么實際效果如何呢?

從我這兩年的經驗來看,情況是這樣的:框架確實提供了統一的開發范式,但要做到真正的一碼多端,還需要不少額外工作。

鴻蒙使用ArkUI作為UI框架,支持聲明式開發范式。它有點像React和Flutter的結合體,學習曲線不算陡峭。

看個響應式多端適配的例子:

@Entry
@Component
struct ResponsiveLayout {@State screenType: string = 'unknown';aboutToAppear() {// 獲取設備信息并設置屏幕類型this.detectScreenType();}detectScreenType() {// 這里應該是根據設備實際尺寸判斷const windowWidth = px2vp(window.innerWidth);if (windowWidth < 600) {this.screenType = 'phone';} else if (windowWidth < 1200) {this.screenType = 'tablet';} else {this.screenType = 'desktop';}}build() {Column() {Text(`當前設備類型: ${this.screenType}`).fontSize(20).margin(20)if (this.screenType === 'phone') {this.buildPhoneLayout()} else if (this.screenType === 'tablet') {this.buildTabletLayout()} else {this.buildDesktopLayout()}}.width('100%').height('100%')}@BuilderbuildPhoneLayout() {Column() {Text("手機布局").fontSize(18)// 手機專用組件布局}.width('100%')}@BuilderbuildTabletLayout() {Row() {Text("平板布局").fontSize(18)// 平板專用布局}.width('100%')}@BuilderbuildDesktopLayout() {Column() {Text("桌面布局").fontSize(18)// 桌面專用布局}.width('100%')}
}

總結與思考

經過幾年發展,鴻蒙系統的架構設計已經變得相當成熟。分層架構提供了清晰的系統邊界,模塊化設計增強了系統靈活性,智慧分發機制優化了資源利用,而多端部署能力則大大提升了開發效率。

不過,作為一個從業多年的開發者,我也要實事求是地說,鴻蒙系統還有很長的路要走。特別是在生態建設方面,還需要吸引更多開發者參與。

最后想說,技術沒有國界,但產品有祖國。鴻蒙的發展代表了中國在操作系統領域的一次重要突破,值得我們每一個開發者去了解和支持。

有什么問題歡迎在評論區討論,我會盡量解答大家的疑問。下期我打算分享一下鴻蒙應用上架的那些坑,敬請期待!


你們覺得鴻蒙系統的哪個設計理念最吸引你?歡迎留言討論~

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

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

相關文章

idea 沒有 add framework support(添加框架支持)選項

在 IntelliJ IDEA 2023 中&#xff0c;若需通過設置手動添加 “添加框架支持” 菜單項&#xff0c;可按照以下步驟操作&#xff1a; 手動添加 “添加框架支持” 菜單項 打開設置 點擊頂部菜單欄的 File&#xff08;文件&#xff09; -> Settings&#xff08;設置&#xff09…

計算機網絡--傳輸層(2)

傳輸層核心機制深度解析 一、可靠傳輸實現機制 1. 校驗和機制 技術原理&#xff1a; 使用16位二進制反碼求和算法&#xff0c;計算范圍包括TCP偽首部&#xff08;12字節&#xff09;、TCP首部&#xff08;20字節&#xff09;和數據部分接收端重新計算校驗和&#xff0c;若與…

再探帶權并查集

典型例題 Acwing 權值 故名思義&#xff0c;在帶權并查集中&#xff0c;我們需要讓每個節點攜帶一個**“權值”**。 那么這個權值應該是什么呢&#xff1f;其實答案就在并查集當中。 由于在并查集當中我們可以在 O ( 1 ) O(1) O(1) 時間內找到一個節點的根節點&#xff0c;那…

Vala編成語言教程-構造函數和析構函數

構造函數 Vala支持兩種略有不同的構造方案&#xff1a;我們將重點討論Java/C#風格的構造方案&#xff0c;另一種是GObject風格的構造方案。 Vala不支持構造函數重載的原因與方法重載不被允許的原因相同&#xff0c;這意味著一個類不能有多個同名構造函數。但這并不構成問題&…

本地部署Stable Diffusion生成爆火的AI圖片

直接上代碼 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…

python爬蟲WASM

WASM 一.WASM簡介 1.1 WASM定義 ? WebAssembly(簡稱wasm)是一個虛擬指令集體系架構(virtual ISA),整體架構包括核心的ISA定義、二進制編碼、程序語義的定義與執行,以及面向不同的嵌入環境(如Web)的應用編程接口(WebAssembly API)。是一種運行在現代網絡瀏覽器中的…

Docker鏡像遷移方案

Docker鏡像遷移方案 文章目錄 Docker鏡像遷移方案一&#xff1a;背景二&#xff1a;操作方式三&#xff1a;異常原因參考&#xff1a; 一&#xff1a;背景 比如機器上已經有先有的容器&#xff0c;但是docker pull的時候是失敗的二&#xff1a;操作方式 1、停止正在運行的容器…

關于跨域問題(本地前端訪問服務器端接口跨域出錯)

問題來源&#xff1a; 當服務器封裝了接口但是本地電腦端前端訪問出現跨域問題。 解決方案&#xff1b; 1、使用ipconfig 查看本地電腦的ip地址 ipconfig 2、在后端接口處配置如下代碼 allow_origins["http://本地ip地址:3001", # 局域網內其他設備訪問的本地…

邊緣計算 vs. 云計算,誰才是工業物聯網的未來?

前言 在物聯網&#xff08;IoT&#xff09;飛速發展的今天&#xff0c;邊緣計算正在徹底改變數據的處理、存儲和分析方式。傳統的IoT設備數據通常需要發送到云端進行處理&#xff0c;但隨著設備數量的激增&#xff0c;這種模式在延遲、帶寬和安全性方面暴露出諸多局限。邊緣計…

dell 臺式機 電腦 紐扣電池 如何取下?

dell 臺式機 電腦 紐扣電池 如何取下&#xff1f; 戴爾-optiplex-3060-塔式機-服務手冊

NFC 智能門鎖全棧解決方案:移動端、服務器、Web 管理平臺

目錄 一、系統整體架構 二、移動端 APP 開發 2.1 開發環境與基礎準備 2.2 主要功能模塊 2.3 示例代碼&#xff08;Android/Kotlin 簡化示例&#xff09; 三、后臺服務開發 3.1 環境準備 3.2 主要功能 3.3 示例代碼&#xff08;Node.js Express 簡化示例&#xff09; …

DDR4、DDR5、固態硬盤(SSD)和機械硬盤(HDD)在連續讀/寫、隨機讀/寫性能的對比分析

以下是關于DDR4、DDR5、固態硬盤&#xff08;SSD&#xff09;和機械硬盤&#xff08;HDD&#xff09;在連續讀/寫、隨機讀/寫性能的對比分析&#xff0c;結合技術特性與應用場景的總結&#xff1a; 一、性能對比表格 存儲類型連續讀&#xff08;MB/s&#xff09;連續寫&#x…

【AI】MAC版本本地Stable Diffusion web ui安裝

文章目錄 前言環境依賴homebrewpython3下載stable-diffusion-webui webui模型準備模型網站 中文頁面設置提示詞轉漢語轉英文controlnet安裝controlnet模型下載 結尾 前言 目前&#xff0c;市面上已經出現了很多用Ai 繪圖制作的作品&#xff0c;用于自媒體或者商業等。例如表情…

Linux 云服務器開放端口

首先找到你買服務器的官網&#xff0c;我這里是阿里云 點擊這里的控制臺 這里先點手動添加&#xff0c;再看自己是UDP還是TCP協議&#xff0c;找到對應的協議&#xff0c;目的就填你想開放的端口&#xff0c;源填所有IP/4 0.0.0.0 添加備注點擊保存就開放好了。

[unity 點擊事件] 區域響應點擊事件,排除子節點區域,Raycast Target 應用

當我打開一個二級彈窗后&#xff0c;希望可以通過點擊彈窗以外的區域來關閉該彈窗。一開始我是在彈窗主節點上掛載了一個 button 組件&#xff0c;該 button 注冊的點擊事件中關閉該彈窗。在子節點&#xff08;一個背景圖&#xff09;的image組件上啟用 Raycast Target 選項&am…

表的約束及代碼練習

一.表的約束 查看表&#xff1a;mysql> select * from t_hero; 1.設置t_hero的主鍵為t_id alter table t_hero add primary key(t_id); 2.設置t_hero t_id屬性非空 alter table t_hero modify t_id int not null;3.設置name屬性為非空非重復 alter table t_hero modify…

Linux筆記---動靜態庫(使用篇)

目錄 1. 庫的概念 2. 靜態庫&#xff08;Static Libraries&#xff09; 2.1 靜態庫的制作 2.2 靜態庫的使用 2.2.1 顯式指定庫文件及頭文件路徑 2.2.2 將庫文件安裝到系統目錄 2.2.3 將頭文件安裝到系統目錄 3. 動態庫 3.1 動態庫的制作 3.2 動態庫的使用 3.2.1 顯式…

Java并發編程2(鎖-Sychronized)

目錄 認識Java對象頭 sychronized鎖原理 基本概念 工作原理 1.作用在方法上 2.作用在代碼塊上 工作機制 JVM優化鎖 Monitor鎖 wait/notify park/unpark 線程狀態轉換案例 死鎖 概念 死鎖發生的必要條件 哲學家問題 活鎖 饑餓 概念 饑餓的原因 Reentrant…

現階段高校的人工智能方案培訓如何?

人工智能在未來肯定是核心發展力&#xff0c;核心競爭力&#xff0c;也是國家重點扶持的對象&#xff0c;但我還是不看好高校的人工智能方向&#xff0c;只是怕有些同學對市場前景盲目樂觀&#xff0c;就輕易上車了。 你要是985以上的高校&#xff0c;可以考慮選擇人工智能&…

JavaScript中的繼承有哪些方式?各有什么優缺點

在 JavaScript 中&#xff0c;繼承主要通過原型鏈實現&#xff0c;常見的繼承方式有以下幾種&#xff0c;每種方式都有其優缺點&#xff1a; 1. 原型鏈繼承 1. 實現方式&#xff1a;將子類的原型對象指向父類的實例。 function Parent() {} function Child() {} Child.protot…