【鸿蒙开发】——概述

简易代码实践:https://github.com/gongshijier/harmonyLab
飞书:https://bzreny5z71.feishu.cn/docx/OJ74dfqe4oHXNNxpT5Mc1Bujnjg

1. 历史前景

自主可控:鸿蒙代表了自研操作系统的崛起
分布式生态:基于鸿蒙自下而上的应用生态,多终端构造的体验和消费场景的迁移

鸿蒙HarmonyOS,开发代号 Ark):

正式名称为华为终端鸿蒙智能设备操作系统软件是华为自 2012 年以来开发的一款分布式操作系统

该系统利用“分布式”技术,将手机、电脑、平板、电视、汽车和智能穿戴等多款设备融合成一个“超级终端”,使用户便于操作和共享各种设备的资源。

发布时间线:

2019 年 8 月正式发布了 HarmonyOS。

2020 年 12 月 16 日,华为发布 HarmonyOS 2 手机开发者版本,次年 6 月 2 日,华为举行发布会正式发布鸿蒙操作系统 2.0,及公布搭载该系统的多款新产品,包括华为智能手机、平板电脑和智能手表,同时向现有用户分阶段推送系统更新。

2022 年 7 月 27 日,华为 HarmonyOS 3 正式发布。

2023 年 8 月 4 日,华为 HarmonyOS 4 正式发布。同时公开了 HarmonyOS NEXT 的开发者预览版。

鸿蒙分层架构:

[图片上传失败...(image-a2cee2-1701587571079)]

分布式生态:手机、手表、平板、汽车

[图片上传失败...(image-a820fc-1701587571079)]

2. 语法特性

鸿蒙开发最早支持 Java 开发,后续鸿蒙 3.0 版本之后中逐渐废弃 Java,而是主推两种范式:

  • 类 WebUi 的开发范式

  • 响应式声明式的开发范式:ArkTs 两种范式性能上有些差异,后者 ArkTs 声明式的 Ui 范式性能优于 webUi 的开发范式 ArkTs 是 TypeScript 的超集,语法特性在两者的基础上进行了系列拓展,可以高效的支持响应式的布局开发

[图片上传失败...(image-21fe1b-1701587571079)]

2.1 页面组件

声明式的写法,只需要关注页面的构成,无需关注 Measure layout draw,其实现在系统 native 源码中

下面是以 ArtTs 的范式来书写一个 列表页布局的代码片段,类 Jetpack 中 compose 组件声明式的 UI 范式:

@Component
export struct FeedList {
 private data: FeedDataSource = new FeedDataSource()
 private flavor: Flavor

 build() {
   Scroll() {
     List() {
       LazyForEach(this.data, (item: Cell, index: number) => {
         ListItem() {
           this.buildCard(item)
         }
         .width('95%')
         .margin({ top: 16, left: 10, bottom: 10 })
       })
     }
     .cachedCount(3)
     .lanes(this.flavor.lanes)
     .width('100%')
     .height('100%')
     .divider({ strokeWidth: 0.2, color: '#d6d6d6' })

   }.backgroundColor(Color.White)
 }

组件的布局方式中 component 的 build 方法中组织,build 方法决定了渲染组件的构成,还有一大特点是响应式的布局思想:

@Entry
@Component
struct MyComponent {
  @State isVisible: boolean = true;

  build() {
    Column() {
      Button("显隐切换")
        .onClick(() => {
          this.isVisible = !this.isVisible
        })
      if (this.isVisible) {
        Row()
          .width(300).height(300).backgroundColor(Color.Pink)
      }
    }.width('100%')
  }
}

[图片上传失败...(image-d91793-1701587571079)]

这里点击切换可见性的按钮后,会修改 @State 注解修饰的变量,值得注意的是,组件 buid() 方法中,是根据这个变量来选择性渲染 Row 组件的,布局代码这样的写法就可以实现点击按钮控制可见性了

类 databinding 的思想,这种响应式的特性中 ArkTs 中支持较好:

定义了大量的 关键字 来维护页面的状态,其中有父子组件,单向绑定的,有双向绑定的;

  • @State:@State 装饰的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源。当其数值改变时,会引起相关组件的渲染刷新。

  • @Prop:@Prop 装饰的变量可以和父组件建立单向同步关系,@Prop 装饰的变量是可变的,但修改不会同步回父组件。

  • @Link:@Link 装饰的变量和父组件构建双向同步关系的状态变量,父组件会接受来自@Link 装饰的变量的修改的同步,父组件的更新也会同步给@Link 装饰的变量。

  • @Provide/@Consume:@Provide/@Consume 装饰的变量用于跨组件层级(多层组件)同步状态变量,可以不需要通过参数命名机制传递,通过 alias(别名)或者属性名绑定。

  • @Observed:@Observed 装饰 class,需要观察多层嵌套场景的 class 需要被@Observed 装饰。单独使用@Observed 没有任何作用,需要和@ObjectLink、@Prop 连用。

  • @ObjectLink:@ObjectLink 装饰的变量接收@Observed 装饰的 class 的实例,应用于观察多层嵌套场景,和父组件的数据源构建双向同步。

[图片上传失败...(image-348b97-1701587571079)]

至于 ArkTs 语言:

[图片上传失败...(image-35bf33-1701587571079)]

2.2 语法相关

下面是几个 TypeScript 代码片段,方便更好感受语法特点:

  • 联合类型

  • 接口

联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值:

var val:string|number 
val = 12 
console.log("数字为 "val) 
val = "Runoob" 
console.log("字符串为 "val)

类:

class Car { 
   // 字段
   engine:string; 

   // 构造函数
   constructor(engine:string) { 
      this.engine = engine 
   }  

   // 方法
   disp():void { 
      console.log("函数中显示发动机型号  :   "+this.engine) 
   } 
} 

// 创建一个对象
var obj = new Car("XXSY1")

// 访问字段
console.log("读取发动机型号 :  "+obj.engine)  

// 访问方法
obj.disp()

接口:

interface IPerson { 
    firstName:string, 
    lastName:string, 
    sayHi: ()=>string 
} 

var customer:IPerson = { 
    firstName:"Tom",
    lastName:"Hanks", 
    sayHi: ():string =>{return "Hi there"} 
} 

2.3 UI 组件

UI 组件: Text、Image、Button、List、Radio、Toggle、Tabs、Progress、Video ...

布局:Row、Column、Stack、Flex:

[图片上传失败...(image-8d6fc0-1701587571079)]

3. 业务实践

基于浏览器基本 UI 特征,熟悉 ArkTs 语法,方便快速上手鸿蒙开发

简易代码实践:https://github.com/gongshijier/harmonyLab

基本组件:

  • 频道--Tabs

  • 底 Tab--Tabs

  • 列表页--List

  • Row Column Text Image TextInput

[图片上传失败...(image-9037-1701587571079)]

[图片上传失败...(image-e242e8-1701587571079)]

4. 架构简析

鸿蒙系统源码简析,理解整体系统架构和相关概念

后续内容基于: OpenHarmony-v4.0-Release 版本源码中截取较多 markdown 文档中的内容辅助理解:

完整的系统源码目录:

[图片上传失败...(image-ca24b-1701587571079)]

其中核心模块比如: arkui graphic window 等模块中 foundation 目录下:

[图片上传失败...(image-8a14b4-1701587571079)]

整体架构:

[图片上传失败...(image-40f4b3-1701587571079)]

4.1 ArkCompiler 和 ArkRuntime

文档: https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/ARK-Runtime-Subsystem-zh.md

ArkCompiler:

[图片上传失败...(image-8fd343-1701587571079)]

ArkRuntime:

[图片上传失败...(image-785f3a-1701587571079)]

[图片上传失败...(image-788c41-1701587571079)]

4.2 启动流程

init:

[图片上传失败...(image-677e58-1701587571078)]

应用启动流程:

[图片上传失败...(image-8b0238-1701587571078)]

4.3 ArkUI

ArkTs 中只涉及:UI 树的构建,不涉及 measure layout draw 以及 invalidate requestlayout 相关

核心 UI 绘制 pipeline:在 ArkUI engine 中实现,架构导致缺乏 UI 开发的拓展能力,上限比较低

[图片上传失败...(image-a20e53-1701587571078)]

4.4 graphic

ArkTs -- JsBridge -- UINode -- MeasureLayoutRender -- Surface -- WMS

[图片上传失败...(image-67bcbb-1701587571078)]

[图片上传失败...(image-96925-1701587571078)]

4.5 window

Surface 合成和消费

[图片上传失败...(image-ce1835-1701587571078)]

window:

[图片上传失败...(image-5a367d-1701587571078)]

window manager:

[图片上传失败...(image-629b84-1701587571078)]

5. 工程架构

鸿蒙项目的目录架构解析

工程架构目录:

[图片上传失败...(image-ae49d7-1701587571078)]

  • AppScope > app.json5:应用的全局配置信息。

  • entry:HarmonyOS 工程模块,编译构建生成一个 HAP 包。

    • src > main > ets:用于存放 ArkTS 源码。

    • src > main > ets > entryability:应用/服务的入口。

    • src > main > ets > pages:应用/服务包含的页面。

    • src > main > resources:用于存放应用/服务所用到的资源文件,如图形、多媒体、字符串、布局文件等。

    • src > main > module.json5:Stage 模型模块配置文件。主要包含 HAP 包的配置信息、应用/服务在具体设备上的配置信息以及应用/服务的全局配置信息。

    • build-profile.json5:当前的模块信息、编译信息配置项,包括 buildOption、targets 配置等。其中 targets 中可配置当前运行环境,默认为 HarmonyOS。

    • hvigorfile.ts:模块级编译构建任务脚本,开发者可以自定义相关任务和代码实现。

  • oh_modules:用于存放三方库依赖信息。

  • build-profile.json5:应用级配置信息,包括签名、产品配置等。

  • hvigorfile.ts:应用级编译构建任务脚本。

6. 问题和思考

  • ArkTs 组件源码都在 Native 层 arkui 中,measure layout draw,invalidate requestLayout 等都是 arkui 封装,开发中需要对 Natvie 层实现进行学习,断点也没法定位相关源码,有比较大的维护成本 ?

[图片上传失败...(image-86cd6e-1701587571078)]

  • 同上,由于 ui 和 graphic 相关的代码均封装在 native 系统源码中,增加一个 js 组件步骤极为麻烦,且应用开发无法实现,需要修改系统源码?

官方增加一个 JS 组件的 codeReview : https://gitee.com/theretherehuh/ace_ace_engine/pulls/1/files

7. 引用

  • 开发者文档:

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-components-summary-0000001478181369-V3

  • 开源仓库:

https://gitee.com/openharmony

  • 页面状态关键字:

https://www.seaxiang.com/blog/8c467ecc0f4846b69bb47db0dba94d2a

  • 系统源码:

https://gitee.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-v4.0-release.md

  • 源码下载地址:

https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F4.0-Release%2Fcode-v4.0-Release.tar.gz

  • UI 渲染过程:

https://blog.csdn.net/qq_41406404/article/details/131590595

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,082评论 5 464
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,231评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,047评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,977评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,893评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,976评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,605评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,888评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,906评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,732评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,513评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,980评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,132评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,447评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,027评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,232评论 2 339

推荐阅读更多精彩内容