鸿蒙UI框架演进史:从Java UI到ArkUI的架构变迁,解码声明式UI与跨端一致性的技术革命

鸿蒙UI框架演进史:从Java UI到ArkUI的架构变迁,解码声明式UI与跨端一致性的技术革命

鸿蒙UI框架演进史:从Java UI到ArkUI的架构变迁,解码声明式UI与跨端一致性的技术革命

第一章 :UI框架的十年之变

在移动操作系统的演进史上,UI框架的变迁始终是开发者体验与系统能力的晴雨表。从2012年EMUI 1.0诞生,到2025年HarmonyOS NEXT全面推广ArkUI,华为的UI框架走过了13年的技术迭代之路。

这期间,我们见证了从“命令式UI”到“声明式UI”的范式转移,经历了从“单设备适配”到“多端一致”的架构革命。对于开发者而言,理解这段演进史,不仅是回顾技术发展脉络,更是把握鸿蒙生态未来方向的关键。

本文将系统梳理鸿蒙UI框架的演进历程,深入剖析渲染引擎的优化技术,用量化数据证明声明式UI的性能优势,并解密跨端UI一致性的实现方案。全文约12000字,包含大量代码示例与实践建议。

第二章 鸿蒙UI框架演进史:从Java UI到ArkUI的架构变迁

2.1 EMUI时代:定制化UI的探索期(2012-2019)

要理解鸿蒙UI的今天,必须先回顾EMUI的昨天。2012年,华为发布了基于Android的EMUI 1.0,开启了定制化UI的道路。

EMUI 1.0-3.0(2012-2014):这一时期的核心任务是“去原生化”。EMUI 1.0首创了MeWidget整合功能,EMUI 2.0引入杂志锁屏,EMUI 3.0确立了点线圈的扁平化设计语言。这些探索为后续的UI框架积累了宝贵的设计经验。

EMUI 5.0-9.0(2017-2018):这一时期的技术突破在于性能优化。EMUI 5.0提出了“天生快一生快”的口号,通过智能学习算法解决安卓越用越卡的问题;EMUI 8.0开始引入AI概念;EMUI 9.0则全面推广手势导航。

但这一时期的所有UI实现都基于Android原生框架,本质上是“在别人的地基上盖房子”。

2.2 HarmonyOS 1.0-2.0:双UI框架并行期(2019-2021)

2019年,HarmonyOS 1.0发布,但最初仅搭载于智慧屏设备。真正的转折点是2021年6月HarmonyOS 2.0覆盖手机等移动终端。

在这一时期,鸿蒙采用了双UI框架并行策略

  • Java UI:兼容Android生态,保障存量应用平滑迁移
  • JS UI:基于ACE(Ability Cross-environment Platform)框架,面向鸿蒙原生应用开发

此时的JS UI框架分为两个版本:

  • ace_engine_lite:面向轻量级设备,采用类似小程序的HML+CSS+JS开发模式
  • ace_ace_engine:新一代UI框架,架构层次更清晰,技术支持更先进

JS UI(命令式UI)的代码示例

// xxx.js - 命令式UI风格exportdefault{data:{headTitle:'Capture the Beauty in This Moment',count:0},increment(){this.count++;// 需要手动触发更新?框架自动响应数据变化}}
<!-- xxx.hml - 模板文件 --><divclass="container"><textclass="title-text">{{headTitle}}</text><text>{{count}}</text><buttononclick="increment">增加</button></div>
/* xxx.css */.container{flex-direction: column;margin-top: 20px;}

这种模式虽然易上手,但存在几个痛点:

  1. 逻辑与模板分离:增加了上下文切换成本
  2. 表达能力受限:复杂UI逻辑需要大量指令式操作
  3. 跨端适配困难:需为不同设备编写多套模板

2.3 ArkUI 1.0:声明式UI的正式登场(2022-2024)

随着HarmonyOS 3.0的推出,华为正式发布了ArkUI 1.0,标志着鸿蒙UI框架进入声明式时代。

ArkUI的设计哲学:用简洁的声明式语法描述界面,由框架负责高效渲染与分发。它强调组件化、布局与状态绑定的自动化。

ArkTS语言:基于TypeScript扩展,保留了TS的静态类型特性,同时增加了声明式UI语法支持。

ArkUI 1.0核心特性

  • 声明式组件:用@Component装饰器定义UI组件
  • 响应式状态@State装饰器实现状态驱动UI更新
  • 原生渲染引擎:彻底摆脱WebView依赖

ArkUI声明式组件示例

// HelloCard.ets (ArkTS)@Componentexport struct HelloCard {@State name:string="Echo_Wish";build(){Column({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }){Text(`Hello, ${this.name}`).fontSize(24).margin({ bottom:16})Button('改名').onClick(()=>{this.name ="方舟·Echo";// 框架自动触发视图更新})}.padding(24).width('100%').height(200).backgroundColor('#F5F5F5')}}

这段代码的核心价值在于:开发者只需关注状态UI描述,框架自动处理diff、更新和渲染。这与React、Flutter等现代UI框架的理念完全一致。

2.4 ArkUI 2.0/ArkNext:面向全场景的进化(2025-)

2025年,随着HarmonyOS NEXT的推广,ArkUI演进到2.0版本,业界也称之为ArkNext

ArkNext的核心变革

维度ArkUI 1.0ArkNext价值
场景覆盖手机为主手机+折叠屏+平板+车机+IoT一套代码多端运行
编译链AOT编译方舟编译器深度优化运行时性能提升30%+
渲染引擎独立渲染分布式渲染引擎(DRE)跨设备渲染同步
Web融合隔离ArkWeb深度集成原生+Web无缝协作
AI能力内置LLM生成UI建议动态布局生成

技术解读

  • 更广的场景覆盖:不仅是手机,还包括折叠屏、平板、车机、IoT设备,多端统一的声明式框架需求更加强烈
  • 更强的性能与编译链:方舟编译器和运行时配合,目标是把“写得直观”与“跑得快”两件事都做好
  • 原生+Web无缝协作:ArkWeb与原生渲染的协同价值在电商、新闻类应用中日益凸显

2.5 演进脉络总结:从“界面描述”到“界面协同”

回顾这段演进史,我们可以看到一个清晰的脉络:

阶段UI范式渲染架构跨端能力代表技术
EMUI时代命令式Android原生XML布局
HarmonyOS 1-2命令式+声明式初探ACE Lite/ACE基础适配HML+CSS+JS
ArkUI 1.0声明式自研渲染引擎响应式布局ArkTS+@State
ArkNext声明式+分布式分布式渲染引擎跨端状态同步DDO+分布式UI

正如一位开发者所言:“过去我们在适配界面,现在我们在协同界面。”

第三章 渲染引擎的优化之路

UI框架的上层是开发体验,下层是渲染性能。鸿蒙渲染引擎的优化历程,是一部从"能跑就行"到"丝滑流畅"的技术进化史。

3.1 渲染流水线架构演进

3.1.1 ACE Lite架构(轻量级设备)

早期的ACE Lite面向内存128MB以下的IoT设备,渲染架构相对简单:

  • 应用层:HML+CSS+JS
  • 引擎层:JS引擎(QuickJS)+ UIKit(C++实现)
  • 渲染层:直接调用图形接口

这种架构的优势是轻量,但缺点是表达能力有限,复杂动画难以实现。

3.1.2 ACE新架构(通用设备)

新一代ACE架构层次更加清晰:

+----------------------------------+ | 应用层 | | (JS/TS声明式语法 + 组件化) | +----------------------------------+ | 框架层 | | (响应式绑定 + 组件生命周期) | +----------------------------------+ | 引擎层 | | (渲染管线 + 动画 + 事件 + 布局) | +----------------------------------+ | Porting Layer | | (平台无关的Layer数据结构) | +----------------------------------+ | Compositor/GPU | +----------------------------------+ 

核心设计理念:UI描述与渲染分离。ArkUI声明式框架生成UI Tree,渲染层维护Shadow Tree,通过Diff算法计算最小更新范围。

3.1.3 分布式渲染引擎(DRE)

在ArkNext中,分布式渲染引擎成为核心创新:

渲染通路

ArkTS UI → ArkUI渲染引擎 → DRE分布式渲染引擎 → 渲染服务(RenderService) → GPU/硬件合成 

DRE核心机制

  1. UI树差异化压缩:仅传输变化的节点,减少网络开销
  2. 远端绘制缓存:目标设备缓存UI结构,避免全量重绘
  3. 增量更新:只传输变化部分
  4. Frame-Sync协议:保证多屏同步(音视频、游戏类场景)

3.2 渲染性能优化的关键技术

3.2.1 布局层级扁平化

问题:复杂的嵌套布局会增加渲染开销。

优化前

// 多层嵌套 - 性能杀手Stack(){Column(){Row(){Stack(){Text('深度嵌套')}}}}

优化后

// 扁平化布局Stack(){Text('深度嵌套').margin({ top:10, left:10})}// 或使用RelativeContainer约束布局RelativeContainer(){Text('约束布局').alignRules({ top:{ anchor:'__container__', align: VerticalAlign.Top }, center:{ anchor:'__container__', align: HorizontalAlign.Center }})}

优化效果:采用扁平化布局后,布局测量时间减少40%,渲染帧率提升15%。

3.2.2 增量渲染与按需加载

LazyForEach实现长列表优化

@Component struct OptimizedList {@State dataArray:Array<ItemData>=[];build(){List(){// LazyForEach只渲染可见区域的组件LazyForEach(this.dataArray,(item: ItemData)=>{ListItem(){ArticleCard({ item: item })}},(item: ItemData)=> item.id)}.layoutWeight(1)}}

优化效果:列表滑动帧率从45fps提升至58fps,内存占用降低35%。

3.2.3 组件复用机制

@Reusable组件复用

@Reusable// 组件复活甲!@Component struct ArticleCardView {aboutToReuse(params: Record<string, object>){// 复用旧组件,避免重新创建this.item = params.item as ItemData;}build(){Row(){// UI构建逻辑}}}

优化效果对比

优化项帧率丢帧率
原方案63fps16%
新方案117fps0%

3.2.4 动画性能优化

错误示范(手动计算动画):

// ❌ 不要这样写computeSize(){let doTimes =2000/16;// 手动计算帧数for(let i=1; i<=doTimes; i++){setTimeout(()=>{// 手动更新位置}, i*16);// 主线程自杀式轰炸}}

正确姿势(系统动画引擎):

Button('click me').width(this.widthSize).height(this.heightSize).animation({ duration:2000, curve: Curve.EaseOut,// 物理曲线稳如狗 delay:0, iterations:1})

3.2.5 GPU硬件加速

显式启用硬件加速

// 对于复杂绘图场景 Canvas canvas =newCanvas(); canvas.enableHardwareAcceleration(true);// 显式启用硬件加速// 或使用Canvas组件时开启离屏渲染Canvas(this.context).width('100%').height('100%').onReady(()=>{// 离屏渲染设置})

3.2.6 资源优化管理

图片格式优化

// 使用WebP格式减少内存占用Image('image.webp').width(200).height(200).objectFit(ImageFit.Cover)

3.3 渲染性能诊断工具链

3.3.1 AppAnalyzer性能扫描

DevEco Studio内置的AppAnalyzer可一键扫描性能问题:

  • 检测滑动流畅度
  • 识别布局嵌套过深
  • 定位冗余刷新

指标解读

  • ≤5ms/帧 → 稳如老狗
8ms/帧 → 优化红灯

3.3.2 Frame Profiler帧分析

定位流程

  1. 复现卡顿场景
  2. 开启Frame录制
  3. 定位红色/黄色故障帧
  4. 查看Statistics栏丢帧率

关键线索

  • 红色帧 = App侧超时(代码问题)
  • 黄色帧 = Render Service卡住(布局太复杂)

3.3.3 Trace分析法

三刀流解剖术

  1. 看线程状态(是否在大核运行)
  2. ArkUI泳道聚焦(抓取耗时组件)
  3. 函数调用栈审判(双击跳转源码)

第四章 声明式UI的性能优势量化分析

声明式UI不仅是开发体验的提升,更是性能优化的基石。本节通过量化数据对比,揭示声明式UI的性能优势。

4.1 响应式更新 vs 命令式操作

4.1.1 更新机制对比

命令式UI更新

// 需要手动找到节点并更新 document.getElementById('counter').innerText = newValue; document.getElementById('total').innerText = newTotal;// 需要手动管理哪些节点需要更新

声明式UI更新(ArkUI):

@State count:number=0;@State total:number=0;// 只需修改状态,框架自动计算最小更新范围increment(){this.count++;this.total =this.count *10;}

4.1.2 性能量化数据

基于华为开发者联盟的测试数据:

指标命令式UI声明式UI提升幅度
状态更新扩散范围全量更新仅更新依赖组件减少70%+
帧率稳定性48fps≥55fps提升15%
内存峰值220MB≤150MB降低32%
丢帧率18%≤8%降低55%

4.1.3 精准更新控制

ArkUI通过细粒度依赖追踪实现精准更新:

@Component struct PreciseUpdate {@State count:number=0;@State name:string='John';build(){Column(){// 仅当count变化时更新Text(`Count: ${this.count}`)// 仅当name变化时更新Text(`Name: ${this.name}`)// 点击只修改count,不影响name的渲染Button('Increment').onClick(()=>this.count++)}}}

4.2 编译时优化 vs 运行时优化

4.2.1 方舟编译器的优化能力

声明式UI的另一个性能优势在于可编译时优化。方舟编译器在编译阶段就能分析出UI与状态的依赖关系:

编译时优化效果

优化项命令式UI声明式UI+方舟编译器
依赖分析运行时确定编译时确定
代码体积较大(包含更新逻辑)较小(框架优化)
启动时间1200ms≤800ms
运行时开销

4.2.2 AOT编译 vs JIT编译

ArkUI默认采用AOT(Ahead-Of-Time)编译,将TypeScript代码预先编译为机器码,避免了JIT编译的运行时开销。

4.3 内存治理与泄漏预防

4.3.1 弱引用管理

声明式UI框架自动处理大部分内存回收,但仍需开发者注意:

aboutToDisappear(){// 注销事件监听,防止内存泄漏this.eventBus.off('some-event',this.handler);// 使用弱引用管理全局状态this.weakRef =newWeakRef(someObject);}

4.3.2 内存泄漏率对比

根据实际项目统计:

  • 传统命令式UI项目:内存泄漏率约15-20%
  • ArkUI声明式项目:内存泄漏率降至3-5%

4.4 实际应用性能提升案例

某电商类APP在重构为ArkUI后的性能数据:

性能指标重构前重构后提升幅度
冷启动耗时1.8s1.1s39%
首页帧率48fps58fps21%
内存占用280MB180MB36%
滑动丢帧率22%5%77%
包体积25MB18MB28%

第五章 跨端UI一致性方案解密

鸿蒙作为面向万物互联的操作系统,跨端UI一致性是其核心设计目标之一。

5.1 分布式UI的架构模型

5.1.1 核心能力三层架构

鸿蒙在系统层引入三个关键能力:

能力职责
分布式数据管理(DDS)同步UI状态与数据对象
分布式任务调度(DTS)将渲染或计算任务迁移到其他设备
分布式渲染引擎(DRE)跨设备绘制UI,保持帧同步与一致性

5.1.2 分布式UI的思维转变

“鸿蒙不只是’多端适配’,而是在系统级打通UI层到设备硬件层的协同渲染通路。你的应用 = 前端 + 渲染调度器 + 小型协同中间件。”

5.2 跨端UI状态同步机制

5.2.1 分布式数据对象(DDO)

鸿蒙提供了分布式数据对象,实现跨设备状态同步:

架构模型

UI层(ArkTS声明式组件) ⇅ 状态层(@State / @Link / @Observed) ⇅ 分布式对象(Distributed Data Object) ⇅ 系统分布式数据服务(SoftBus + 数据同步协议) ⇅ 远端设备(运行相同应用的实例) 

5.2.2 DDO核心机制

  • DDO绑定状态:组件状态变量可直接绑定分布式对象
  • 系统负责同步:鸿蒙底层SoftBus通道负责序列化、压缩与一致性控制
  • 冲突解决策略:默认"最后写入优先",开发者可自定义合并策略
  • 订阅模型:UI层不主动轮询,系统事件驱动数据刷新

5.2.3 实战代码:跨设备计数器

// ./distributed/CounterStore.etsimport distributedDataObject from'@ohos.data.distributedDataObject';exportclassCounterStore{private ddo: distributedDataObject.DataObject;asyncinit(){// 创建分布式数据对象this.ddo = distributedDataObject.create({ count:0},{ schema:{ count:'number'}});// 绑定到网络,等待其他设备连接awaitthis.ddo.bindToNetwork({ enable:true});// 监听数据变化this.ddo.on('change',()=>{console.log('Count changed to:',this.ddo['count']);});}increase(){this.ddo['count']++;}getcount(){returnthis.ddo['count'];}}// ./pages/CounterPage.ets@Entry@Component struct CounterPage {@State count:number=0; store =newCounterStore();aboutToAppear(){this.store.init().then(()=>{// 每300ms同步一次状态setInterval(()=>{this.count =this.store.count;},300);});}build(){Column(){Text(`共享计数器: ${this.count}`).fontSize(26).fontWeight(FontWeight.Bold).margin({ bottom:16})Button('增加').onClick(()=>this.store.increase())}.padding(24)}}

效果:在两台设备上同时打开应用,任意一端点击按钮,另一端UI自动更新。

5.3 分布式渲染性能优化

5.3.1 增量同步机制

优化点机制实践建议
增量同步仅传输变化节点避免全量重绘,拆分组件粒度
延迟合成同步后由远端GPU合成减少中间态传输
压缩传输UI Diff二进制流UI层不带多余对象引用
帧同步时钟校准+队列对齐动画统一节拍控制
渲染线程分离UI/逻辑/渲染分线程不要在UI线程做计算任务

5.3.2 跨设备画布示例(优化版)

// ./distributed/CanvasSync.etsimport distributedDataObject from'@ohos.data.distributedDataObject';import graphics from'@ohos.graphics.canvas';@Entry@Component struct SharedCanvas {@State strokes:string[]=[];// 保存绘图命令(增量格式)private ddo = distributedDataObject.create({ strokes:[]},{ schema:{ strokes:'array'}});aboutToAppear(){// 绑定到分布式网络this.ddo.bindToNetwork({ enable:true});// 监听远端变化this.ddo.on('change',()=>{this.strokes =this.ddo['strokes'];});}draw(x:number, y:number){// 记录新笔画this.strokes.push(`${x},${y}`);// 仅更新变化部分到分布式对象this.ddo['strokes']=this.strokes;}build(){Canvas({onTouchMove:(e)=>{this.draw(e.touches[0].x, e.touches[0].y);}}){this.strokes.forEach(cmd =>{const[x, y]= cmd.split(',').map(Number); graphics.drawCircle({ x, y, radius:2, color:'#007DFF'});});}.width('100%').height('100%')}}

优化要点

  1. 绘制逻辑独立于UI主线程
  2. strokes压缩为字符串数组并增量更新
  3. 分布式同步仅传输差异

5.4 响应式布局与设备自适应

5.4.1 设备类型感知

import deviceInfo from'@ohos.deviceInfo';const type = deviceInfo.deviceType;// 'phone' | 'tablet' | 'wearable' | 'tv' | 'car'// 结合条件渲染if(type ==='tv'){// 遥控器焦点布局TVRemoteLayout();}else{// 触控布局TouchLayout();}

5.4.2 响应式布局容器

ArkUI提供多种布局容器支持响应式设计:

  • Row/Column/Grid/Stack:灵活组合
  • RelativeContainer:约束布局,自动按比例缩放
  • Flex:弹性布局,容器大小与内容自适应

5.4.3 媒体查询式尺寸适配

@Entry@Component struct AdaptiveCard {build(){Column(){// 根据屏幕宽度条件渲染if(this.getScreenWidth()>800){// 平板布局:横排Row(){Image($r('media:illustration')).width(300)Text('平板布局').fontSize(28)}}else{// 手机布局:竖排Column(){Text('手机布局').fontSize(22)Image($r('media:illustration')).width(150)}}}}getScreenWidth():number{// 获取屏幕宽度逻辑return display.getDefaultDisplaySync().width;}}

5.5 跨端UI一致性设计原则

层级策略实现方式
视觉使用系统DesignToken颜色、间距、字体统一变量
交互保留平台习惯手势vs遥控焦点差异化处理
动效采用系统动效库时长与缓动曲线统一
字体动态适配DPI根据屏幕密度自动缩放
状态分布式状态驱动DDO同步而非本地临时状态

5.6 开发者自查清单

  • UI状态是否统一通过分布式对象同步?
  • 是否避免在主线程做重计算?
  • 是否启用了增量同步或差量渲染?
  • 是否按设备类型定义响应式布局?
  • 动画、动效是否遵循系统节拍?
  • DDO是否做字段级加密或敏感脱敏?

第六章 未来展望:AI+分布式UI

6.1 从ArkUI到ArkNext的演进趋势

根据华为开发者社区的讨论,ArkNext的演进方向包括:

  1. 更广的场景覆盖:不仅是手机,还是折叠屏、平板、车机、IoT,多端统一的声明式框架需求更强
  2. 更强的性能与编译链:方舟编译器和运行时配合,目标是把"写得直观"与"跑得快"两件事都做好
  3. 原生+Web无缝协作:ArkWeb与原生渲染的协同价值日益凸显
  4. AI与UI的结合:系统内置LLM、AI能生成界面建议或动态布局

6.2 AI生成UI的未来场景

学术研究已开始探索AI生成声明式UI代码。DeclarUI项目展示了MLLM在多模态UI生成中的应用,支持ArkUI框架的代码生成。

未来可能的应用场景:

  • 智能布局推荐:根据内容自动推荐最佳布局
  • 动态UI生成:运行时根据用户行为动态生成UI
  • 跨端自动适配:AI自动将手机布局转换为车机/手表布局

6.3 超级应用的演进

在OpenHarmony生态中,"应用"的定义正在被重构。它不再是手机上的一个图标,而是跨越手机、平板、车机、手表、智慧屏、IoT设备的连续体验体。

超级应用的核心特征

  • 设备无感切换
  • 能力按需调用
  • 数据实时协同
  • 统一身份体系

典型场景:用户在家用智慧屏看视频,出门上车自动续播;在办公室用平板编辑文档,回家用手表一键打印。

第七章 总结与实践建议

7.1 演进史总结

鸿蒙UI框架的演进,是一部从"能用"到"好用"再到"智能"的技术进化史:

阶段核心特征开发者体验性能表现
EMUI时代Android定制熟悉但受限依赖原生
双框架并行Java+JS双轨学习成本高中等
ArkUI 1.0声明式初探开发效率提升显著优化
ArkNext分布式+AI一次编写多端运行极致流畅

7.2 给开发者的实践建议

基于本文的分析,为鸿蒙开发者提供以下建议:

7.2.1 架构设计层面

  1. 拥抱声明式思维:无论未来框架叫什么,声明式思路都会越来越普遍
  2. 关注编译运行链:了解方舟编译器、运行时的能力,会在做性能调优与设备适配时占到先机
  3. 提前规划跨端:从设计之初就考虑多设备适配

7.2.2 性能优化层面

  1. 扁平化布局:减少嵌套层级,使用RelativeContainer
  2. 组件复用:使用@Reusable装饰器复用列表项
  3. 懒加载:LazyForEach处理长列表
  4. 精准更新:合理拆分状态粒度,避免全量更新

7.2.3 跨端开发层面

  1. 使用DDO同步状态:避免手动实现跨设备通信
  2. 设备类型感知:根据设备类型差异化布局
  3. 响应式设计:使用媒体查询和弹性布局

Read more

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

摘要:本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求,帮助开发者真正实现OpenClaw从“能用”到“放心用”的跨越。 优质专栏欢迎订阅! 【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】【数字孪生与仿真技术实战指南】 【AI工程化落地与YOLOv8/v9实战】【C#工业上位机高级应用:高并发通信+性能优化】 【Java生产级避坑指南:

By Ne0inhk
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》《STM32 HAL库专栏》 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言  一、实验基础说明 1.1、互斥体简介 1.2 本次实验设计思路 二、硬件原理分析(看过之前博客的可以忽略) 三、实验程序编写 3.1 互斥体 LED 驱动代码(mutex.c) 3.2.1、设备结构体定义(28-39

By Ne0inhk
Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 后端工程师扔给你一个 Swagger (OpenAPI) 文档地址,你会怎么做? 1. 对着文档,手写 Dart Model 类(容易写错字段类型)。 2. 手写 Retrofit/Dio 的 API 接口定义(容易拼错 URL)。 3. 当后端修改了字段名,你对着报错修半天。 这是重复劳动的地狱。 swagger_dart_code_generator 可以将 Swagger (JSON/YAML) 文件直接转换为高质量的 Dart 代码,包括: * Model 类:支持 json_serializable,带 fromJson/

By Ne0inhk
Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

文章目录 * 前言 * make/makefile * 文件的三个时间 * Linux第一个小程序-进度条 * 回车和换行 * 缓冲区 * 程序的代码展示 * git指令 * 关于gitee * Linux调试器-gdb使用 * 作业部分 前言 做 Linux 开发时,你是不是也遇到过这些 “卡脖子” 时刻?写 makefile 时,明明语法没错却报错,最后发现是依赖方法行没加 Tab;想提交代码到 gitee,记不清 git add/commit/push 的 “三板斧”,还得反复搜教程;用 gdb 调试程序,输了命令没反应,才想起编译时没加-g生成 debug 版本;甚至连写个进度条,都搞不懂\r和\n的区别,导致进度条乱跳…… 其实这些问题,

By Ne0inhk